This function computes 2d parabola profile from coord 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:
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_canonicalND_type) | :: | me |
contains line parameters for 2d 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 |
number of return values |
return value of a function
function tem_spatial_parabol2d_for_coord( me, coord, n ) result(res)
! -------------------------------------------------------------------- !
!> contains line parameters for 2d parabola
type( tem_canonicalND_type ) :: me
!> 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, diff(3)
real(kind=rk) :: vecAsqr, center(3), halfdir(3)
! loop variable
integer :: iDir
! -------------------------------------------------------------------- !
halfdir = 0.0_rk
do iDir = 1, 3
if( me%active(iDir) ) halfdir = me%vec(:, iDir)/2.0_rk
end do
vecAsqr = dot_product(halfdir, halfdir)
center = me%origin + halfdir
!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, 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_coord