Theory + Abstractions

The requirement of a boundary condition is to define an exterior state \(u_{bc}\) over a region of boundary geometry. bc_state_t objects are implemented with the purpose of providing/defining the exterior state \(u_{bc}\). bc_patch_t objects exist with the purpose of defining the geometry over which the external state is defined. In this way, boundary conditions provide only an external solution state(\(u_{bc}\)), but do not actually compute a residual contribution(\(f(u_{bc})\)). Residual contributions are handled exclusively by operator_t objects that are defined and added to equation_set_t objects that compute \(f(u_{bc})\) assuming \(f(u_{bc})\) has already been defined and provided by some boundary condition state function.

Boundary conditions in ChiDG are abstracted and represented as two separate ideas: geometry and state. Boundary conditions are composed of boundary condition state objects. Regions over which a boundary condition is to be applied are composed of boundary patch objects. Separately, these compositions exist as boundary condition state groups and boundary condition patch groups. Boundary condition state groups are used to compose boundary condition state objects that are to be used on the same surface. For example, when composing an equation set of the Navier-Stokes equations, one requires a boundary condition for the five equations that exist in those operators. A single boundary condition state function might be used to impose the boundary conditions for all of those equations. Consider if one wished now to add a turbulence model to the equation set. An extra boundary condition is needed for each extra governing equation. If boundary condition state functions are defined that provide a boundary condition for these extra functions, they can be added to the same boundary condition state group.

State for boundary conditions is handled through boundary state functions(bc_state_t), which are grouped together using bc_state_group_t.

Geometry for boundary conditions is handled through boundary patches(bc_patch_t), which are grouped together using bc_patch_group_t.

data type, bc_t. The boundary condition data type itself is separated into two distinct concepts. These are geometry and state. The concepts of geometry and boundary condition state functions exist separetely from each other. Together, they form a bc_t:

type, public :: bc_t

    integer                                 :: BC_ID
    character(:),               allocatable :: bc_family
    type(bc_patch_t)                        :: bc_patch
    type(bc_state_wrapper_t),   allocatable :: bc_state(:)

contains

    ...

end type bc_t

bc_t objects are responsible for defining an external solution state over a defined geometric boundary. That is, bc_state_t objects provide an external solution state \(Q_{BC}\) over a geometry region defined by bc_patch_t. The concept is that boundary conditions provide an external solution state \(Q_{BC}\) but do not actually compute a flux contribution \(F(Q_{BC})\) to any elements. Flux contributions are left to operator_t objects that are defined and added to equation_set_t objects that compute \(F(Q_{BC})\) assuming \(Q_{BC}\) has already been defined by some boundary condition state function.

Note

Boundary conditions that do not have any allocated bc_state_t function objects are flagged as Chimera boundaries. The ChiDG infrastructure will then automatically attempt to find Chimera donors for the faces associated with the bc_patch_t geometry representation.

So, to initiate Chimera block-to-block communication, one is required only to not associate any boundary condition state functions with the block patches on the interior grid regions.

Boundary condition patch

The geometry over which a boundary condition is to be applied is represented by a boundary condition patch, bc_patch_t. This consists of sets of triple indices(Domain,Element,Face) defining particular faces associated with the boundary condition patch. The bc_patch_t contains vectors for storing these sets of integers.

type, public :: bc_patch_t

    type(ivector_t)     :: idomain_l_
    type(ivector_t)     :: ielement_l_
    type(ivector_t)     :: iface_

contains

    ...

end type bc_patch_t

Note

Boundary condition patches are currently created in the conversion process from Plot3D-formatted grid files to ChiDG-formatted grid files. In the conversion process, the block boundaries in the Plot3D grid file are taken as boundary condition patches.

Boundary condition state functions

Boundary condition state functions, bc_state_t, are responsible for defining the solution state exterior to a computational domain, \(Q_{BC}\). This can be computed as a function of the interior state and some user-specified parameters, \(Q_{BC}(Q_-,U_{input})\).

type, public, abstract :: bc_state_t

    character(:),   allocatable :: name
    character(:),   allocatable :: family

    type(bcproperty_set_t)      :: bcproperties

contains

    procedure(bc_state_init),       deferred    :: init
    procedure(bc_state_compute),    deferred    :: compute_bc_state

    ...

end type bc_state_t