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