This function calculates the sigma for the radial viscosity spongelayer for 2D and 3D, and multiply with targetState using treeid. This function is currectly used to define viscosity sponge in musubi.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_spongeLayer_radial_type) | :: | me |
Spacetime function to evaluate |
|||
integer(kind=long_k), | intent(in) | :: | treeIds(n) |
treeIds of elements in given level |
||
type(treelmesh_type), | intent(in) | :: | tree |
global treelm mesh |
||
integer, | intent(in) | :: | nDim |
Dimension |
||
integer, | intent(in) | :: | n |
Number of arrays to return |
return value
function viscSpongelayer_radial_for_treeIDs(me, treeIDs, tree, nDim, n) & & result(res) ! -------------------------------------------------------------------------- !> Spacetime function to evaluate type(tem_spongeLayer_radial_type) :: me !> Number of arrays to return integer, intent(in) :: n !> global treelm mesh type( treelmesh_type ), intent(in) ::tree !> treeIds of elements in given level integer(kind=long_k), intent(in) :: treeIds(n) !> Dimension integer, intent(in) :: nDim !> return value real(kind=rk) :: res(n) ! -------------------------------------------------------------------------- integer :: i real(kind=rk) :: sigma, rad, origin(3), vec(3), coord(3) real(kind=rk) :: outerRadius ! -------------------------------------------------------------------------- origin(:) = me%origin outerRadius = me%radius + me%thickness vec = 0.0_rk do i = 1, n !barycentric coordinate coord = tem_BaryOfId( tree, treeIds(i) ) vec(1:nDim) = coord(1:nDim) - origin(1:nDim) rad = sqrt( vec(1)**2 + vec(2)**2 + vec(3)**2 ) if ( rad > me%radius .and. rad < outerRadius ) then sigma = 1.0_rk + (me%dampFactor-1.0_rk) & & * ( (rad-me%radius)/me%thickness )**me%dampExponent else if (rad > outerRadius) then sigma = me%dampFactor else sigma = 1.0_rk end if res(i) = sigma * me%targetState(1) enddo end function viscSpongelayer_radial_for_treeIDs