| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer, | public | :: | N | = | 0 | Polynomial degree of the interpolant the indicator is built for. |
|
| real(kind=prec), | public, | pointer, contiguous, dimension(:,:) | :: | Pmodal | => | null() | Nodal-to-modal transform. Pmodal(ii,p) is the (p,ii) entry of the inverse Legendre Vandermonde in the L2-normalized basis, so the 1-D modal coefficients are uhat(p) = sum_ii Pmodal(ii,p) * u(ii) (first index summed, SELF matrix convention). |
| real(kind=prec), | public | :: | coarsenThreshold | = | 0.0_prec | Elements with sigma_e below this value are flagged SELF_AMR_COARSEN. |
|
| integer, | public, | pointer, contiguous, dimension(:) | :: | flag | => | null() | Per-element refinement flag: SELF_AMR_REFINE / SELF_AMR_KEEP / SELF_AMR_COARSEN. |
| real(kind=prec), | public, | pointer, contiguous, dimension(:) | :: | indicator | => | null() | Per-element indicator value sigma_e = log10(S_e). |
| integer, | public | :: | nElem | = | 0 | Number of (rank-local) elements the indicator arrays are sized for. |
|
| real(kind=prec), | public | :: | refineThreshold | = | 0.0_prec | Elements with sigma_e above this value are flagged SELF_AMR_REFINE. |
Count the rank-local elements currently carrying the requested flag value (SELF_AMR_REFINE / SELF_AMR_KEEP / SELF_AMR_COARSEN). Provided as a convenience for drivers and tests; a global count across MPI ranks is the caller's responsibility.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(RefinementIndicator2D_t), | intent(in) | :: | this | |||
| integer, | intent(in) | :: | flagValue |
Compute the per-element modal-energy indicator sigma_e and refine/keep/coarsen flag from the nodal solution field. ivar selects the driving variable in [1,solution%nVar]; passing SELF_AMR_ALLVARS (=0) reduces the indicator over all variables by taking, per element, the largest (least smooth) smoothness ratio S_e before the log10.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(RefinementIndicator2D_t), | intent(inout) | :: | this | |||
| class(Scalar2D), | intent(in) | :: | solution | |||
| integer, | intent(in) | :: | ivar |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(RefinementIndicator2D_t), | intent(inout) | :: | this |
Allocate the indicator for an interpolant of degree interp%N and nElem elements and precompute the nodal->modal transform matrix from the interpolant control points.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(RefinementIndicator2D_t), | intent(out) | :: | this | |||
| type(Lagrange), | intent(in), | target | :: | interp | ||
| integer, | intent(in) | :: | nElem | |||
| real(kind=prec), | intent(in) | :: | refineThreshold | |||
| real(kind=prec), | intent(in) | :: | coarsenThreshold |
Update the refine/coarsen thresholds without rebuilding the transform.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(RefinementIndicator2D_t), | intent(inout) | :: | this | |||
| real(kind=prec), | intent(in) | :: | refineThreshold | |||
| real(kind=prec), | intent(in) | :: | coarsenThreshold |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(RefinementIndicator2D_t), | intent(inout) | :: | this |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(RefinementIndicator2D_t), | intent(inout) | :: | this |
type :: RefinementIndicator2D_t
integer :: N = 0
!! Polynomial degree of the interpolant the indicator is built for.
integer :: nElem = 0
!! Number of (rank-local) elements the indicator arrays are sized for.
real(prec) :: refineThreshold = 0.0_prec
!! Elements with sigma_e above this value are flagged SELF_AMR_REFINE.
real(prec) :: coarsenThreshold = 0.0_prec
!! Elements with sigma_e below this value are flagged SELF_AMR_COARSEN.
real(prec),pointer,contiguous,dimension(:,:) :: Pmodal => null()
!! Nodal-to-modal transform. Pmodal(ii,p) is the (p,ii) entry of the inverse Legendre
!! Vandermonde in the L2-normalized basis, so the 1-D modal coefficients are
!! uhat(p) = sum_ii Pmodal(ii,p) * u(ii) (first index summed, SELF matrix convention).
real(prec),pointer,contiguous,dimension(:) :: indicator => null()
!! Per-element indicator value sigma_e = log10(S_e).
integer,pointer,contiguous,dimension(:) :: flag => null()
!! Per-element refinement flag: SELF_AMR_REFINE / SELF_AMR_KEEP / SELF_AMR_COARSEN.
contains
procedure,public :: Init => Init_RefinementIndicator2D_t
procedure,public :: Free => Free_RefinementIndicator2D_t
procedure,public :: SetThresholds => SetThresholds_RefinementIndicator2D_t
procedure,public :: UpdateHost => UpdateHost_RefinementIndicator2D_t
procedure,public :: UpdateDevice => UpdateDevice_RefinementIndicator2D_t
procedure,public :: Estimate => Estimate_RefinementIndicator2D_t
procedure,public :: CountFlagged => CountFlagged_RefinementIndicator2D_t
endtype RefinementIndicator2D_t