Evaluate the basis with a tensorproduct for the given 1D (s, theta, zeta) values
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | n_s |
number of evaluation points |
||
| integer, | intent(in) | :: | n_t |
number of evaluation points |
||
| integer, | intent(in) | :: | n_z |
number of evaluation points |
||
| real, | intent(in) | :: | s(n_s) |
evaluation points to construct a mesh |
||
| real, | intent(in) | :: | theta(n_t) |
evaluation points to construct a mesh |
||
| real, | intent(in) | :: | zeta(n_z) |
evaluation points to construct a mesh |
||
| character(len=2) | :: | Qsel |
selection string: which variable to evaluate |
|||
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | Q |
reference space position & derivatives |
|
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_ds |
reference space position & derivatives |
|
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_dthet |
reference space position & derivatives |
|
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_dzeta |
reference space position & derivatives |
|
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_dss | ||
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_dst | ||
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_dsz | ||
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_dtt | ||
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_dtz | ||
| real, | intent(out), | DIMENSION(n_s,n_t,n_z) | :: | dQ_dzz |
SUBROUTINE evaluate_base_tens_all(n_s, n_t, n_z, s, theta, zeta, Qsel, Q, dQ_ds, dQ_dthet, dQ_dzeta, & dQ_dss, dQ_dst, dQ_dsz, dQ_dtt, dQ_dtz, dQ_dzz) ! MODULES USE MODgvec_base, ONLY: t_base ! INPUT/OUTPUT VARIABLES ------------------------------------------------------------------------------------------------------! INTEGER, INTENT(IN) :: n_s, n_t, n_z !! number of evaluation points REAL, INTENT(IN) :: s(n_s), theta(n_t), zeta(n_z) !! evaluation points to construct a mesh CHARACTER(LEN=2) :: Qsel !! selection string: which variable to evaluate REAL, INTENT(OUT), DIMENSION(n_s,n_t,n_z) :: Q, dQ_ds, dQ_dthet, dQ_dzeta !! reference space position & derivatives REAL, INTENT(OUT), DIMENSION(n_s,n_t,n_z) :: dQ_dss, dQ_dst, dQ_dsz, dQ_dtt, dQ_dtz, dQ_dzz ! LOCAL VARIABLES -------------------------------------------------------------------------------------------------------------! INTEGER :: i ! loop variables CLASS(t_base), POINTER :: base ! pointer to the base object (X1, X2, LA) REAL, POINTER :: solution_dofs(:,:) ! pointer to the solution dofs (U(0)%X1, U(0)%X2, U(0)%LA) REAL, ALLOCATABLE, DIMENSION(:) :: Q_dofs, dQ_ds_dofs, dQ_dss_dofs ! DOFs for the fourier series ! CODE ------------------------------------------------------------------------------------------------------------------------! CALL select_base_dofs(Qsel, base, solution_dofs) ALLOCATE(Q_dofs( base%f%modes), & dQ_ds_dofs( base%f%modes), & dQ_dss_dofs(base%f%modes)) !$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(SHARED) & !$OMP PRIVATE(i,Q_dofs,dQ_ds_dofs,dQ_dss_dofs) DO i=1,n_s ! evaluate spline to get the fourier dofs Q_dofs = base%s%evalDOF2D_s(s(i), base%f%modes, 0, solution_dofs(:,:)) dQ_ds_dofs = base%s%evalDOF2D_s(s(i), base%f%modes, DERIV_S, solution_dofs(:,:)) dQ_dss_dofs = base%s%evalDOF2D_s(s(i), base%f%modes, DERIV_S_S, solution_dofs(:,:)) ! use the tensorproduct for theta and zeta Q( i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, 0, Q_dofs), (/n_t, n_z/)) dQ_ds( i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, 0, dQ_ds_dofs), (/n_t, n_z/)) dQ_dthet(i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, DERIV_THET, Q_dofs), (/n_t, n_z/)) dQ_dzeta(i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, DERIV_ZETA, Q_dofs), (/n_t, n_z/)) dQ_dss( i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, 0, dQ_dss_dofs), (/n_t, n_z/)) dQ_dst( i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, DERIV_THET, dQ_ds_dofs), (/n_t, n_z/)) dQ_dsz( i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, DERIV_ZETA, dQ_ds_dofs), (/n_t, n_z/)) dQ_dtt( i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, DERIV_THET_THET, Q_dofs), (/n_t, n_z/)) dQ_dtz( i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, DERIV_THET_ZETA, Q_dofs), (/n_t, n_z/)) dQ_dzz( i,:,:) = RESHAPE(base%f%evalDOF_xn_tens(n_t, n_z, theta, zeta, DERIV_ZETA_ZETA, Q_dofs), (/n_t, n_z/)) END DO !$OMP END PARALLEL DO DEALLOCATE(Q_dofs, dQ_ds_dofs, dQ_dss_dofs) END SUBROUTINE evaluate_base_tens_all