tem_spatial_parabol3d_for_coord Function

private function tem_spatial_parabol3d_for_coord(me, coord, n) result(res)

This function computes 3d parabola profile from coord of an element.

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

  • Project barycentric coordinate vector in a given plane via
  • Compute spatial value using Example: Parabolic 3D profile at channel inlet. parabolic 3D

Todo

use projection of point on line and point on plane

Arguments

Type IntentOptional Attributes Name
type(tem_canonicalND_type) :: me

contains parameter for 3d parabola

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

the number of return values

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

return value of a function


Called by

proc~~tem_spatial_parabol3d_for_coord~~CalledByGraph proc~tem_spatial_parabol3d_for_coord tem_spatial_parabol3d_for_coord interface~tem_spatial_parabol3d_for tem_spatial_parabol3d_for interface~tem_spatial_parabol3d_for->proc~tem_spatial_parabol3d_for_coord proc~tem_spatial_for_coord tem_spatial_for_coord proc~tem_spatial_for_coord->interface~tem_spatial_parabol3d_for proc~tem_spatial_for_treeids tem_spatial_for_treeIDs proc~tem_spatial_for_treeids->interface~tem_spatial_parabol3d_for proc~tem_spatial_vector_for_coord tem_spatial_vector_for_coord proc~tem_spatial_vector_for_coord->interface~tem_spatial_parabol3d_for proc~tem_spatial_vector_for_treeids tem_spatial_vector_for_treeIDs proc~tem_spatial_vector_for_treeids->interface~tem_spatial_parabol3d_for interface~tem_spatial_for tem_spatial_for interface~tem_spatial_for->proc~tem_spatial_for_coord interface~tem_spatial_for->proc~tem_spatial_for_treeids interface~tem_spatial_for->proc~tem_spatial_vector_for_coord interface~tem_spatial_for->proc~tem_spatial_vector_for_treeids proc~tem_spatial_scalar_for_index tem_spatial_scalar_for_index interface~tem_spatial_for->proc~tem_spatial_scalar_for_index proc~tem_spatial_vector_for_index tem_spatial_vector_for_index interface~tem_spatial_for->proc~tem_spatial_vector_for_index proc~tem_spatial_scalar_for_index->proc~tem_spatial_for_coord proc~tem_spatial_vector_for_index->proc~tem_spatial_vector_for_coord proc~tem_spacetime_for_coord tem_spacetime_for_coord proc~tem_spacetime_for_coord->interface~tem_spatial_for proc~tem_spacetime_for_treeids tem_spacetime_for_treeIDs proc~tem_spacetime_for_treeids->interface~tem_spatial_for proc~tem_spacetime_scalar_for_index tem_spacetime_scalar_for_index proc~tem_spacetime_scalar_for_index->interface~tem_spatial_for proc~tem_spacetime_vector_for_coord tem_spacetime_vector_for_coord proc~tem_spacetime_vector_for_coord->interface~tem_spatial_for proc~tem_spacetime_vector_for_index tem_spacetime_vector_for_index proc~tem_spacetime_vector_for_index->interface~tem_spatial_for proc~tem_spacetime_vector_for_treeids tem_spacetime_vector_for_treeIDs proc~tem_spacetime_vector_for_treeids->interface~tem_spatial_for proc~tem_spatial_scalar_storeval tem_spatial_scalar_storeVal proc~tem_spatial_scalar_storeval->interface~tem_spatial_for proc~tem_spatial_vector_storeval tem_spatial_vector_storeVal proc~tem_spatial_vector_storeval->interface~tem_spatial_for

Source Code

  function tem_spatial_parabol3d_for_coord( me, coord, n ) result(res)
    ! -------------------------------------------------------------------- !
    !> contains parameter for 3d parabola
    type( tem_canonicalND_type ) :: me
    !> the number of return values
    integer, intent(in) :: n
    !> 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)
    ! -------------------------------------------------------------------- !
    real(kind=rk) :: alpha, beta, diff(3)
    real(kind=rk) :: vecAsqr, vecBsqr
    real(kind=rk) :: center(3), halfvec(2,3)
    integer :: iDir, jDir
    ! -------------------------------------------------------------------- !

    jDir = 0
    do iDir = 1, 3
      if( me%active( iDir )) then
        jDir = jDir + 1
        halfvec(jDir, :) = me%vec(:, iDir) / 2._rk
      end if
    end do

    center = me%origin + halfvec(1, :) + halfvec(2, :)

    vecAsqr = dot_product( halfvec(1, :), halfvec(1, :) )
    vecBsqr = dot_product( halfvec(2, :), halfvec(2, :) )

    !loop over number of return values
    do iDir = 1, n

      !distance between parabola center and barycentric coordinates
      diff = coord(iDir,:) - center
      !projection of diff in a plane on vecA
      alpha =  dot_product( diff, halfvec(1, :) ) / vecAsqr

      ! projection of diff in a plane on vecB
      beta =  dot_product( diff, halfvec(2, :) ) / vecBsqr

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

      if ( (abs(alpha) .gt. 1.d0) .or. (abs(beta) .gt. 1.d0) ) then
        res(iDir) = 0.0_rk
      end if

    end do

  end function tem_spatial_parabol3d_for_coord