This function invokes different spatial boundary kinds like constant, lua function or predefined Fortran function for given coord
If a spatial block is not defined and a temporal block is defined in the lua file, the return value = ref_value. If both spatial and temporal block are not defined in the lua file, the return value = 1.0_rk. based spatial_kind(kind).
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_spatial_type) | :: | me |
spatial type for given boundary state |
|||
real(kind=rk), | intent(in) | :: | coord(n,3) |
barycentric Ids of an elements. 1st index goes over number of elements and 2nd index goes over x,y,z coordinates |
||
integer, | intent(in) | :: | n |
number of return values |
||
integer, | intent(in) | :: | ncomp |
number of components per returned value |
return value of a function
function tem_spatial_vector_for_coord( me, coord, n, ncomp ) result( res ) ! -------------------------------------------------------------------- ! !> spatial type for given boundary state type(tem_spatial_type) :: me !> number of return values integer, intent(in) :: n !> number of components per returned value integer, intent(in) :: ncomp !> barycentric Ids of an elements. !! 1st index goes over number of elements and !! 2nd index goes over x,y,z coordinates real(kind=rk), intent(in) :: coord(n,3) !> return value of a function real( kind=rk ) :: res(n,ncomp) ! -------------------------------------------------------------------- ! integer :: i ! -------------------------------------------------------------------- ! select case( trim(adjustl(me%kind)) ) case( 'none', 'const' ) do i = 1, nComp res(:,i) = me%const(i) end do case( 'lua_fun' ) res = tem_spatial_lua_for(me%lua_fun_ref, me%conf, coord, n, ncomp) case( 'spongelayer_plane', 'spongelayer_plane_2d', 'spongelayer_plane_1d' ) res = tem_spongeLayer_plane_for(me%spongePlane, nComp, coord, n) case( 'spongeLayer_box' ) res = tem_spongeLayer_box_for(me%spongeBox, nComp, coord, n) case( 'spongeLayer_box_2d' ) res = tem_spongeLayer_box2d_for(me%spongeBox, nComp, coord, n) case( 'spongelayer_radial_2d' ) res = tem_spongeLayer_radial_for( & & me = me%spongeRadial, & & nComp = nComp, & & coord = coord, & & n = n, & & nDim = 2 ) case( 'spongelayer_radial' ) res = tem_spongeLayer_radial_for( & & me = me%spongeRadial, & & nComp = nComp, & & coord = coord, & & n = n, & & nDim = 3 ) case( 'radial_spongelayer_2d' ) res = tem_spongelayer_radial_for( & & me = me%spongeRadial, & & nComp = nComp, & & coord = coord, & & nDim = 2, & & n = n ) case( 'radial_spongelayer' ) res = tem_spongelayer_radial_for( & & me = me%spongeRadial, & & nComp = nComp, & & coord = coord, & & nDim = 3, & & n = n ) case( 'pml' ) res = tem_evaluate_pml(me%pml, nComp, coord, n) case( 'polygon_material' ) res = tem_eval_polygon_material( me = me%polygon_material, & & coord = coord, & & n = n ) case( 'polygon_material_3d' ) res = tem_eval_polygon_material_3d( me = me%polygon_material, & & coord = coord, & & n = n ) case( 'parabol' ) select case( trim(adjustl(me%parabol%geometry%canoND(1)%kind)) ) case( 'line' ) res(:,1) = tem_spatial_parabol2d_for( & & me = me%parabol%geometry%canoND(1), & & coord = coord, & & n = n ) case( 'plane' ) res(:,1) = tem_spatial_parabol3d_for( & & me = me%parabol%geometry%canoND(1), & & coord = coord, & & n = n ) end select do i = 2, nComp res(:,i) = res(:,1)*me%parabol%amplitude(i) end do res(:,1) = res(:,1)*me%parabol%amplitude(1) case('rectangular', 'gate') do i = 1, n if( (abs(coord(i,2)) < me%rect_ly) & & .and. (abs(coord(i,3)) < me%rect_lz) ) then res(i,1) = 1.0_rk else res(i,1) = 0.0_rk end if end do res(:, 2:nComp) = 0.0_rk case default write(logUnit(1),*)'ERROR: No vectorial routine for spatial functions of' write(logUnit(1),*)' kind "' // trim(adjustl(me%kind)) // '"' write(logUnit(1),*)' available! Have a look in the ' & & // 'tem_spatial_module' write(logUnit(1),*)' for implemented vectorial functions.' call tem_abort() end select end function tem_spatial_vector_for_coord