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
  • Compute spatial value using 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

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