self_LinearEuler2D_PML_t Module

Linear Euler 2D with a Perfectly Matched Layer (PML) absorbing region.

Formulation: Hu (2001), "A Stable, Perfectly Matched Layer for Linearized Euler Equations in Unsplit Physical Variables" (JCP 173, 455-480), in the ADE (Auxiliary Differential Equation) form for the no-mean-flow case.

In the PML region the dynamics for the acoustic state q = (rho', u, v, p) become

dq/dt + A dq/dx + B dq/dy + (sigma_x + sigma_y) q + sigma_x*sigma_y phi = 0 dphi/dt = q

where phi = (phi_rho, phi_u, phi_v, phi_P) is a 4-component auxiliary that accumulates the time integral of q. The sigma_x(x), sigma_y(y) damping coefficients vanish in the interior and rise toward the outer boundary, leaving the original linear Euler 2D dynamics unaltered where sigma = 0.

Solution layout (nvar = 9): s(1) = rho (density perturbation) s(2) = u (x-velocity) s(3) = v (y-velocity) s(4) = P (pressure perturbation) s(5) = c (sound speed, static; per-node) s(6) = phi_rho (auxiliary; time-integral of rho) s(7) = phi_u (auxiliary; time-integral of u) s(8) = phi_v (auxiliary; time-integral of v) s(9) = phi_P (auxiliary; time-integral of P)

The auxiliary variables phi_* have identically zero flux; they evolve only via the source term. Sound speed c is also static (zero flux, zero source) and is preserved from the parent LinearEuler2D model.

PML elements are identified by a material name beginning with the configurable prefix (default "pml") in the mesh's material table. Non-PML elements always carry sigma_x = sigma_y = 0 and therefore reduce to the parent linear Euler 2D dynamics (modulo the inert auxiliary variables, which remain identically zero there).


Uses

  • module~~self_lineareuler2d_pml_t~~UsesGraph module~self_lineareuler2d_pml_t self_LinearEuler2D_PML_t module~self_boundaryconditions SELF_BoundaryConditions module~self_lineareuler2d_pml_t->module~self_boundaryconditions module~self_mesh SELF_Mesh module~self_lineareuler2d_pml_t->module~self_mesh module~self_mappedscalar_2d SELF_MappedScalar_2D module~self_lineareuler2d_pml_t->module~self_mappedscalar_2d module~self_model SELF_Model module~self_lineareuler2d_pml_t->module~self_model module~self_lineareuler2d_t self_LinearEuler2D_t module~self_lineareuler2d_pml_t->module~self_lineareuler2d_t module~self_dgmodel2d~2 SELF_DGModel2D module~self_lineareuler2d_pml_t->module~self_dgmodel2d~2 module~self_metadata SELF_Metadata module~self_boundaryconditions->module~self_metadata module~self_supportroutines SELF_SupportRoutines module~self_boundaryconditions->module~self_supportroutines iso_c_binding iso_c_binding module~self_boundaryconditions->iso_c_binding module~self_mesh->iso_c_binding module~self_constants SELF_Constants module~self_mesh->module~self_constants module~self_domaindecomposition~2 SELF_DomainDecomposition module~self_mesh->module~self_domaindecomposition~2 module~self_mappedscalar_2d->iso_c_binding module~self_mappedscalar_2d_t SELF_MappedScalar_2D_t module~self_mappedscalar_2d->module~self_mappedscalar_2d_t module~self_gpuinterfaces SELF_GPUInterfaces module~self_mappedscalar_2d->module~self_gpuinterfaces module~self_gpu SELF_GPU module~self_mappedscalar_2d->module~self_gpu module~self_model->module~self_metadata module~self_model->module~self_supportroutines module~self_hdf5 SELF_HDF5 module~self_model->module~self_hdf5 HDF5 HDF5 module~self_model->HDF5 FEQParse FEQParse module~self_model->FEQParse module~self_lineareuler2d_t->module~self_boundaryconditions module~self_lineareuler2d_t->module~self_mesh module~self_lineareuler2d_t->module~self_model module~self_lineareuler2d_t->module~self_dgmodel2d~2 module~self_dgmodel2d~2->module~self_boundaryconditions module~self_dgmodel2d~2->module~self_gpuinterfaces module~self_dgmodel2d_t SELF_DGModel2D_t module~self_dgmodel2d~2->module~self_dgmodel2d_t module~self_dgmodel2d~2->module~self_gpu module~self_mesh_2d SELF_Mesh_2D module~self_dgmodel2d~2->module~self_mesh_2d module~self_geometry_2d SELF_Geometry_2D module~self_dgmodel2d~2->module~self_geometry_2d module~self_metadata->module~self_hdf5 module~self_metadata->HDF5 module~self_supportroutines->module~self_constants iso_fortran_env iso_fortran_env module~self_supportroutines->iso_fortran_env module~self_constants->iso_c_binding module~self_constants->iso_fortran_env module~self_domaindecomposition~2->iso_c_binding module~self_domaindecomposition_t SELF_DomainDecomposition_t module~self_domaindecomposition~2->module~self_domaindecomposition_t mpi mpi module~self_domaindecomposition~2->mpi module~self_mappedscalar_2d_t->iso_c_binding module~self_mappedscalar_2d_t->module~self_constants module~self_mappedscalar_2d_t->module~self_domaindecomposition~2 module~self_mappedscalar_2d_t->FEQParse module~self_mappedscalar_2d_t->module~self_mesh_2d module~self_mappedscalar_2d_t->module~self_geometry_2d module~self_scalar_2d~2 SELF_Scalar_2D module~self_mappedscalar_2d_t->module~self_scalar_2d~2 module~self_lagrange SELF_Lagrange module~self_mappedscalar_2d_t->module~self_lagrange module~self_tensor_2d SELF_Tensor_2D module~self_mappedscalar_2d_t->module~self_tensor_2d module~self_gpuinterfaces->iso_c_binding module~self_gpuinterfaces->module~self_gpu module~self_hdf5->module~self_constants module~self_hdf5->HDF5 module~self_hdf5->iso_fortran_env module~self_hdf5->mpi module~self_dgmodel2d_t->module~self_boundaryconditions module~self_dgmodel2d_t->module~self_mappedscalar_2d module~self_dgmodel2d_t->module~self_model module~self_dgmodel2d_t->module~self_metadata module~self_dgmodel2d_t->module~self_supportroutines module~self_dgmodel2d_t->module~self_hdf5 module~self_dgmodel2d_t->HDF5 module~self_dgmodel2d_t->FEQParse module~self_dgmodel2d_t->module~self_mesh_2d module~self_dgmodel2d_t->module~self_geometry_2d module~self_mappedvector_2d~2 SELF_MappedVector_2D module~self_dgmodel2d_t->module~self_mappedvector_2d~2 module~self_gpu->iso_c_binding module~self_gpu_enums SELF_GPU_enums module~self_gpu->module~self_gpu_enums module~self_mesh_2d->iso_c_binding module~self_mesh_2d->module~self_gpu module~self_mesh_2d_t SELF_Mesh_2D_t module~self_mesh_2d->module~self_mesh_2d_t module~self_geometry_2d->module~self_supportroutines module~self_geometry_2d->module~self_constants module~self_geometry_2d->module~self_mesh_2d module~self_geometry_2d->module~self_scalar_2d~2 module~self_geometry_2d->module~self_lagrange module~self_vector_2d~2 SELF_Vector_2D module~self_geometry_2d->module~self_vector_2d~2 module~self_data SELF_Data module~self_geometry_2d->module~self_data module~self_geometry_2d->module~self_tensor_2d module~self_scalar_2d~2->iso_c_binding module~self_scalar_2d~2->module~self_constants module~self_scalar_2d~2->module~self_gpuinterfaces module~self_scalar_2d~2->module~self_gpu module~self_gpublas SELF_GPUBLAS module~self_scalar_2d~2->module~self_gpublas module~self_scalar_2d_t SELF_Scalar_2D_t module~self_scalar_2d~2->module~self_scalar_2d_t module~self_lagrange->iso_c_binding module~self_lagrange->module~self_constants module~self_lagrange->module~self_gpu module~self_lagrange->iso_fortran_env module~self_lagrange_t SELF_Lagrange_t module~self_lagrange->module~self_lagrange_t module~self_mappedvector_2d~2->iso_c_binding module~self_mappedvector_2d~2->module~self_gpuinterfaces module~self_mappedvector_2d~2->module~self_gpu module~self_mappedvector_2d~2->module~self_gpublas module~self_mappedvector_2d_t SELF_MappedVector_2D_t module~self_mappedvector_2d~2->module~self_mappedvector_2d_t module~self_mesh_2d_t->module~self_mesh module~self_mesh_2d_t->module~self_supportroutines module~self_mesh_2d_t->iso_c_binding module~self_mesh_2d_t->module~self_constants module~self_mesh_2d_t->module~self_domaindecomposition~2 module~self_mesh_2d_t->module~self_hdf5 module~self_mesh_2d_t->HDF5 module~self_mesh_2d_t->module~self_lagrange module~self_quadrature SELF_Quadrature module~self_mesh_2d_t->module~self_quadrature module~self_vector_2d~2->iso_c_binding module~self_vector_2d~2->module~self_constants module~self_vector_2d~2->module~self_gpuinterfaces module~self_vector_2d~2->module~self_gpu module~self_vector_2d~2->module~self_gpublas module~self_vector_2d_t SELF_Vector_2D_t module~self_vector_2d~2->module~self_vector_2d_t module~self_data->module~self_metadata module~self_data->iso_c_binding module~self_data->module~self_constants module~self_data->module~self_hdf5 module~self_data->HDF5 module~self_data->FEQParse module~self_data->module~self_lagrange module~self_domaindecomposition_t->module~self_supportroutines module~self_domaindecomposition_t->iso_c_binding module~self_domaindecomposition_t->module~self_constants module~self_domaindecomposition_t->module~self_lagrange module~self_domaindecomposition_t->mpi module~self_tensor_2d->iso_c_binding module~self_tensor_2d->module~self_constants module~self_tensor_2d->module~self_gpu module~self_tensor_2d->iso_fortran_env module~self_tensor_2d_t SELF_Tensor_2D_t module~self_tensor_2d->module~self_tensor_2d_t module~self_tensor_2d->module~self_gpublas module~self_gpu_enums->iso_c_binding module~self_lagrange_t->module~self_supportroutines module~self_lagrange_t->iso_c_binding module~self_lagrange_t->module~self_constants module~self_lagrange_t->module~self_hdf5 module~self_lagrange_t->HDF5 module~self_lagrange_t->iso_fortran_env module~self_lagrange_t->module~self_quadrature module~self_tensor_2d_t->module~self_metadata module~self_tensor_2d_t->iso_c_binding module~self_tensor_2d_t->module~self_constants module~self_tensor_2d_t->module~self_hdf5 module~self_tensor_2d_t->HDF5 module~self_tensor_2d_t->FEQParse module~self_tensor_2d_t->module~self_lagrange module~self_tensor_2d_t->module~self_data module~self_gpublas->iso_c_binding module~self_gpublas->module~self_constants module~self_gpublas->iso_fortran_env module~self_gpublas->module~self_gpu_enums module~self_mappedvector_2d_t->iso_c_binding module~self_mappedvector_2d_t->module~self_constants module~self_mappedvector_2d_t->module~self_domaindecomposition~2 module~self_mappedvector_2d_t->FEQParse module~self_mappedvector_2d_t->module~self_mesh_2d module~self_mappedvector_2d_t->module~self_geometry_2d module~self_mappedvector_2d_t->module~self_lagrange module~self_mappedvector_2d_t->module~self_vector_2d~2 module~self_mappedvector_2d_t->module~self_tensor_2d module~self_scalar_2d_t->module~self_metadata module~self_scalar_2d_t->iso_c_binding module~self_scalar_2d_t->module~self_constants module~self_scalar_2d_t->module~self_hdf5 module~self_scalar_2d_t->HDF5 module~self_scalar_2d_t->FEQParse module~self_scalar_2d_t->module~self_lagrange module~self_scalar_2d_t->module~self_data module~self_quadrature->module~self_constants module~self_quadrature->iso_fortran_env module~self_vector_2d_t->module~self_metadata module~self_vector_2d_t->iso_c_binding module~self_vector_2d_t->module~self_constants module~self_vector_2d_t->module~self_hdf5 module~self_vector_2d_t->HDF5 module~self_vector_2d_t->FEQParse module~self_vector_2d_t->module~self_lagrange module~self_vector_2d_t->module~self_data

Used by

  • module~~self_lineareuler2d_pml_t~~UsedByGraph module~self_lineareuler2d_pml_t self_LinearEuler2D_PML_t module~self_lineareuler2d_pml self_LinearEuler2D_PML module~self_lineareuler2d_pml->module~self_lineareuler2d_pml_t module~self_lineareuler2d_pml~2 self_LinearEuler2D_PML module~self_lineareuler2d_pml~2->module~self_lineareuler2d_pml_t

Contents


Derived Types

type, public, extends(LinearEuler2D_t) :: LinearEuler2D_PML_t

Components

TypeVisibilityAttributesNameInitial
type(MappedScalar2D), public :: dSdt
real(kind=prec), public :: dt
real(kind=prec), public :: entropy
type(MappedVector2D), public :: flux
type(MappedScalar2D), public :: fluxDivergence
real(kind=prec), public :: g =0.0_prec
type(SEMQuad), public, pointer:: geometry
logical, public :: gradient_enabled =.false.
type(BoundaryConditionList), public :: hyperbolicBCs
integer, public :: ioIterate =0
type(Mesh2D), public, pointer:: mesh
integer, public :: nvar
type(BoundaryConditionList), public :: parabolicBCs
character(len=SELF_MESH_MATNAME_LENGTH), public :: pml_material_prefix ="pml"
integer, public :: pml_ramp_exponent =3
real(kind=prec), public :: pml_sigma_max =0.0_prec
real(kind=prec), public :: pml_width =1.0_prec
real(kind=prec), public :: pml_x_max =0.0_prec
real(kind=prec), public :: pml_x_min =0.0_prec
real(kind=prec), public :: pml_y_max =0.0_prec
real(kind=prec), public :: pml_y_min =0.0_prec
logical, public :: prescribed_bcs_enabled =.true.
real(kind=prec), public :: rho0 =1.0_prec
type(MappedScalar2D), public :: sigma_x
type(MappedScalar2D), public :: sigma_y
type(MappedScalar2D), public :: solution
type(MappedVector2D), public :: solutionGradient
type(MappedScalar2D), public :: source
real(kind=prec), public :: t
logical, public :: tecplot_enabled =.true.
procedure(SELF_timeIntegrator), public, pointer:: timeIntegrator=> Euler_timeIntegrator
type(MappedScalar2D), public :: workSol

Type-Bound Procedures

procedure, public :: AdditionalFree => AdditionalFree_LinearEuler2D_PML_t
procedure, public :: AdditionalInit => AdditionalInit_LinearEuler2D_PML_t
procedure, public :: AdditionalOutput => AdditionalOutput_Model
procedure, public :: BoundaryFlux => BoundaryFlux_DGModel2D
procedure, public :: CalculateEntropy => CalculateEntropy_DGModel2D
procedure, public :: CalculateSolutionGradient => CalculateSolutionGradient_DGModel2D
procedure, public :: CalculateTendency => CalculateTendency_DGModel2D
procedure, public :: Euler_timeIntegrator
procedure, public :: FluxMethod => fluxmethod_DGModel2D
procedure, public :: ForwardStep => ForwardStep_Model
procedure, public :: Free => Free_DGModel2D
procedure, public :: GetSimulationTime
procedure, public :: IncrementIOCounter
procedure, public :: Init => Init_DGModel2D
procedure, public :: LowStorageRK2_timeIntegrator
procedure, public :: LowStorageRK3_timeIntegrator
procedure, public :: LowStorageRK4_timeIntegrator
procedure, public :: MapBoundaryConditions => MapBoundaryConditions_DGModel2D_t
procedure, public :: PreTendency => PreTendency_Model
procedure, public :: PrintType => PrintType_Model
procedure, public :: ReadModel => Read_DGModel2D_t
procedure, public :: ReportEntropy => ReportEntropy_Model
procedure, public :: ReportMetrics => ReportMetrics_DGModel2D_t
procedure, public :: ReportUserMetrics => ReportUserMetrics_Model
procedure, public :: SetBoundaryCondition => setboundarycondition_DGModel2D_t
procedure, public :: SetGradientBoundaryCondition => setgradientboundarycondition_DGModel2D_t
procedure, public :: SetMetadata => SetMetadata_LinearEuler2D_PML_t
procedure, public :: SetNumberOfVariables => SetNumberOfVariables_LinearEuler2D_PML_t
procedure, public :: SetPMLProfile => SetPMLProfile_LinearEuler2D_PML_t
procedure, public :: SetSimulationTime
generic, public :: SetSolution => SetSolutionFromChar_DGModel2D_t, SetSolutionFromEqn_DGModel2D_t
generic, public :: SetTimeIntegrator => SetTimeIntegrator_withChar
procedure, public :: SphericalSoundWave => SphericalSoundWave_LinearEuler2D_t
procedure, public :: UpdateGRK2 => UpdateGRK2_DGModel2D
procedure, public :: UpdateGRK3 => UpdateGRK3_DGModel2D
procedure, public :: UpdateGRK4 => UpdateGRK4_DGModel2D
procedure, public :: UpdateSolution => UpdateSolution_DGModel2D
procedure, public :: WriteModel => Write_DGModel2D_t
procedure, public :: WriteTecplot => WriteTecplot_DGModel2D_t
procedure, public :: entropy_func => entropy_func_LinearEuler2D_t
procedure, public :: flux1D => flux1d_Model
procedure, public :: flux2d => flux2d_LinearEuler2D_PML_t
procedure, public :: flux3D => flux3d_Model
procedure, public :: riemannflux1d => riemannflux1d_Model
procedure, public :: riemannflux2d => riemannflux2d_LinearEuler2D_PML_t
procedure, public :: riemannflux3d => riemannflux3d_Model
procedure, public :: source1d => source1d_Model
procedure, public :: source2d => source2d_Model
procedure, public :: source3d => source3d_Model
procedure, public :: sourcemethod => sourcemethod_LinearEuler2D_PML_t

Functions

public pure function flux2d_LinearEuler2D_PML_t(this, s, dsdx) result(flux)

Interior flux. Variables 1-5 use the parent linear Euler 2D flux; auxiliary variables 6-9 carry zero flux in both directions and are evolved purely by the PML source term.

Arguments

TypeIntentOptionalAttributesName
class(LinearEuler2D_PML_t), intent(in) :: this
real(kind=prec), intent(in) :: s(1:this%nvar)
real(kind=prec), intent(in) :: dsdx(1:this%nvar,1:2)

Return Value real(kind=prec)(1:this%nvar,1:2)

public pure function riemannflux2d_LinearEuler2D_PML_t(this, sL, sR, dsdx, nhat) result(flux)

Impedance-matched Riemann flux for acoustic variables 1-5, with zero flux returned for the auxiliary variables 6-9. The acoustic formula is identical to the parent LinearEuler2D model; see riemannflux2d_LinearEuler2D_t for the derivation.

Arguments

TypeIntentOptionalAttributesName
class(LinearEuler2D_PML_t), intent(in) :: this
real(kind=prec), intent(in) :: sL(1:this%nvar)
real(kind=prec), intent(in) :: sR(1:this%nvar)
real(kind=prec), intent(in) :: dsdx(1:this%nvar,1:2)
real(kind=prec), intent(in) :: nhat(1:2)

Return Value real(kind=prec)(1:this%nvar)


Subroutines

public subroutine AdditionalFree_LinearEuler2D_PML_t(this)

Arguments

TypeIntentOptionalAttributesName
class(LinearEuler2D_PML_t), intent(inout) :: this

public subroutine AdditionalInit_LinearEuler2D_PML_t(this)

Arguments

TypeIntentOptionalAttributesName
class(LinearEuler2D_PML_t), intent(inout) :: this

public subroutine SetMetadata_LinearEuler2D_PML_t(this)

Arguments

TypeIntentOptionalAttributesName
class(LinearEuler2D_PML_t), intent(inout) :: this

Arguments

TypeIntentOptionalAttributesName
class(LinearEuler2D_PML_t), intent(inout) :: this

public subroutine SetPMLProfile_LinearEuler2D_PML_t(this, x_interior_min, x_interior_max, y_interior_min, y_interior_max, pml_width, sigma_max, ramp_exponent)

Populate the per-node sigma_x, sigma_y fields. Only nodes inside elements whose material name starts with this%pml_material_prefix receive non-zero damping; all other nodes are forced to zero so the interior solution remains unmodified.

Arguments

TypeIntentOptionalAttributesName
class(LinearEuler2D_PML_t), intent(inout) :: this
real(kind=prec), intent(in) :: x_interior_min
real(kind=prec), intent(in) :: x_interior_max
real(kind=prec), intent(in) :: y_interior_min
real(kind=prec), intent(in) :: y_interior_max
real(kind=prec), intent(in) :: pml_width
real(kind=prec), intent(in) :: sigma_max
integer, intent(in), optional :: ramp_exponent

public subroutine hbc2d_NoNormalFlow_LinearEuler2D_PML(bc, mymodel)

No-normal-flow BC for the PML-augmented linear Euler model. Variables 1-5 are treated identically to the parent LinearEuler2D no-normal-flow BC. Auxiliary variables 6-9 are given a zero exterior state; since they carry zero Riemann flux the exterior value is mathematically irrelevant, but zeroing it keeps the boundary state clean for diagnostics.

Arguments

TypeIntentOptionalAttributesName
class(BoundaryCondition), intent(in) :: bc
class(Model), intent(inout) :: mymodel

public subroutine hbc2d_Radiation_LinearEuler2D_PML(bc, mymodel)

Radiation BC for the PML-augmented linear Euler model: zero acoustic perturbation in the exterior state, sound speed copied from interior so the Riemann solver sees a consistent c, and auxiliary variables set to zero.

Arguments

TypeIntentOptionalAttributesName
class(BoundaryCondition), intent(in) :: bc
class(Model), intent(inout) :: mymodel

public subroutine sourcemethod_LinearEuler2D_PML_t(this)

Hu (2001) unsplit PML source term, evaluated per node. In the interior (sigma_x = sigma_y = 0) this leaves the acoustic variables untouched and the auxiliaries integrate q in time but never re-enter the dynamics (since the coupling coefficient sigma_xsigma_y is zero). Inside the PML, the (sigma_x + sigma_y) damping plus the sigma_xsigma_y*phi term produce the correct perfectly-matched behaviour for the linear Euler 2D system.

Read more…

Arguments

TypeIntentOptionalAttributesName
class(LinearEuler2D_PML_t), intent(inout) :: this