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