read list of vertices
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_polygon_material_type), | intent(out) | :: | me |
Polygon data structure to fill with information provided by the user in config. |
||
type(flu_State) | :: | conf |
Handle to the Lua script containing the polygon definition |
|||
integer, | intent(in), | optional | :: | thandle |
Handle for the table containing the polygon definition. |
subroutine tem_polygon_material_load(me, conf, thandle) ! ---------------------------------------------------------------------- !> Polygon data structure to fill with information provided !! by the user in config. type(tem_polygon_material_type), intent(out) :: me !> Handle to the Lua script containing the polygon definition type(flu_state) :: conf !> Handle for the table containing the polygon definition. integer, intent(in), optional :: thandle ! ---------------------------------------------------------------------- real(kind=rk), allocatable :: defout(:) integer :: vertex_table, valtable, vertices_table integer :: iVertex integer :: iError integer, allocatable :: vError(:) integer :: iError_v(2) integer :: iPoly ! ---------------------------------------------------------------------- write(logUnit(1),*) 'Loading predefined function polygonal material:' valtable = 0 call aot_get_val( L = conf, & & thandle = thandle, & & key = 'zmin', & & val = me%zmin, & & default = 0.0_rk, & & ErrCode = iError ) if (btest(iError, aoterr_fatal)) then write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to' write(logunit(1),*) ' get a value for zmin!' write(logunit(1),*) ' This also applies if no inval is provided.' call tem_abort() end if call aot_get_val( L = conf, & & thandle = thandle, & & key = 'zmax', & & val = me%zmax, & & default = 0.0_rk, & & ErrCode = iError ) if (btest(iError, aoterr_fatal)) then write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to' write(logunit(1),*) ' get a value for zmax!' write(logunit(1),*) ' This also applies if no inval is provided.' call tem_abort() end if call aot_table_open( L = conf, & & parent = thandle, & & key = 'inval', & & thandle = valtable ) if (valtable == 0) then ! inval not provided as a table, try to read it as a scalar. allocate(me%inval(1)) call aot_get_val( L = conf, & & thandle = thandle, & & key = 'inval', & & val = me%inval(1), & & default = 1.0_rk, & & ErrCode = iError ) if (btest(iError, aoterr_Fatal)) then write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to' write(logunit(1),*) ' get value for inval!' call tem_abort() end if me%nComponents = 1 allocate(me%outval(me%nComponents)) allocate(vError(me%nComponents)) ! Outval needs to be consistent with the inval definition, if inval was ! defined as a scalar, outval also has to be a scalar! ! We do not check for tables with single entries in this case. call aot_get_val( L = conf, & & thandle = thandle, & & key = 'outval', & & val = me%outval(1), & & default = 0.0_rk, & & ErrCode = iError ) if (btest(iError, aoterr_fatal)) then write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to' write(logunit(1),*) ' get a value for outval!' write(logunit(1),*) ' Note, that outval needs be a scalar, as' write(logunit(1),*) ' inval is provided as a scalar.' write(logunit(1),*) ' This also applies if no inval is provided.' call tem_abort() end if else ! Intable is a table, close it an read it into an array. call aot_table_close(L = conf, thandle = valtable) ! Value to use inside the polygon call aot_get_val( L = conf, & & thandle = thandle, & & key = 'inval', & & val = me%inval, & & maxlength = 20, & & default = [1.0_rk], & & ErrCode = vError ) if (any(btest(vError, aoterr_Fatal))) then write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to' write(logunit(1),*) ' get values for inval!' call tem_abort() end if me%nComponents = size(me%inval) deallocate(vError) ! Definition of outval needs to be consistent with inval, it has to have ! the same number of components, and also needs to be a vector. ! However, we define a default of all zeroes, so if outval is 0 for all ! components, this definition can be omitted in the user definition. allocate(me%outval(me%nComponents)) allocate(vError(me%nComponents)) allocate(defout(me%nComponents)) defout = 0.0_rk ! Value to use outside the polygon call aot_get_val( L = conf, & & thandle = thandle, & & key = 'outval', & & val = me%outval, & & default = defout, & & ErrCode = vError ) if (any(btest(vError,aoterr_Fatal))) then write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to' write(logunit(1),*) ' get a value for outval!' write(logunit(1),*) ' Note, that outval needs to have the same' write(logunit(1),*) ' length as inval.' call tem_abort() end if deallocate(vError) deallocate(defout) end if !> read list of vertices call aot_table_open( L = conf, & & parent = thandle, & & key = 'vertices', & & thandle = vertices_table ) if (vertices_table == 0) then write(logunit(1),*) 'ERROR in tem_polygon_material_load: No vertices' write(logunit(1),*) ' defined, unable to set up a polynomial!' write(logunit(1),*) ' Please define vertices tables with lists of' write(logunit(1),*) ' 2D points.' call tem_abort() end if me%nPoly = aot_table_length( L = conf, & & thandle = vertices_table ) allocate(me%poly_list(me%npoly)) ! me%npoly = 1 do iPoly = 1, me%npoly call aot_table_open( L = conf, & & parent = vertices_table, & & pos = ipoly, & & thandle = vertex_table ) if (vertex_table == 0) then write(logunit(1),*) 'ERROR in tem_polygon_material_load:' write(logunit(1),*) ' Please define vertex tables with lists of' write(logunit(1),*) ' 2D points.' call tem_abort() end if me%poly_list(ipoly)%nVertices = & & aot_table_length( L = conf, & & thandle = vertex_table ) allocate(me%poly_list(ipoly)%vertex(me%poly_list(ipoly)%nVertices, 2)) do iVertex=1,me%poly_list(ipoly)%nVertices call aot_get_val( val = me%poly_list(ipoly)%vertex(iVertex, :), & & ErrCode = iError_v, & & L = conf, & & thandle = vertex_table, & & pos = iVertex ) if (any(iError_v /= 0)) then write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to' write(logunit(1),*) ' obtain vertex ', iVertex, '!' write(logunit(1),*) ' Vertices have to be vectors of length 2,' write(logunit(1),*) ' with real numbers as entries.' call tem_abort() end if end do call aot_table_close( L = conf, & & thandle = vertex_table ) end do call aot_table_close( L = conf, & & thandle = vertices_table ) end subroutine tem_polygon_material_load