# tem_spatial_parabol2d_for_treeIds Function

## private function tem_spatial_parabol2d_for_treeIds(me, treeIds, tree, n) result(res)

This function computes 2d parabola profile from treeIds of elements

This profile is defined by element barycentric coordinate and 2d parabola parameters. 2D parabola profile at given plane is computed in the following way:

• Project barycentric coordinate vector in a given plane via $alpha = ((baryCoord - center) \cdot vecA)/\sqrt(vecA\cdot vecA)$
• Compute spatial value using $res = (1+alpha)*(1-alpha)$ Actual parabola 2d formula: \f\$ (y-y_0) = a(x-x_0)^2 ) parabola open towards opposite x and with vertex at (1,0) is given by $y = (1-x)^2$

### Arguments

Type IntentOptional Attributes Name
type(tem_canonicalND_type) :: me

contains parameters for 2d parabola

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) :: n

number of return values

### Return Value real(kind=rk), (n)

return value of a function

## Source Code

  function tem_spatial_parabol2d_for_treeIds( me, treeIds, tree, n ) result(res)
! -------------------------------------------------------------------- !
!> contains parameters for 2d parabola
type( tem_canonicalND_type ) :: me
!> global treelm mesh
type( treelmesh_type ), intent(in) ::tree
!> number of return values
integer, intent(in) :: n
!> treeIds of elements in given level
integer(kind=long_k), intent(in) :: treeIds(n)
!> return value of a function
real(kind=rk) :: res(n)
! -------------------------------------------------------------------- !
real(kind=rk) :: coord(3), alpha, diff(3)
real(kind=rk) :: vecAsqr, center(3), halfdir(3)
!loop variables
integer :: iDir
! -------------------------------------------------------------------- !

! since this is a line only one of the three vectors in vec
! is active
halfdir = 0.0_rk
do iDir = 1, 3
if( me%active( iDir )) halfdir = me%vec( :, iDir )/2.0_rk
end do
center = me%origin + halfdir
vecAsqr = dot_product( halfdir, halfdir )
!loop over number of return values
do iDir = 1, n

!barycentric coordinate
coord = tem_BaryOfId( tree, treeIds(iDir) )

!distance between parabola center and barycentric coordinates
diff = coord - center

!projection of diff in a plane on vecA
alpha = dot_product( diff, halfdir ) / vecAsqr

res(iDir)  = ( 1.0_rk-alpha ) * ( 1.0_rk+alpha )

if ( abs(alpha) .gt. 1.0d0 ) then
res(iDir) = 0.0_rk
end if

end do

end function tem_spatial_parabol2d_for_treeIds