MultiAppGeneralFieldTransfer

Base class for all GeneralField transfers. It holds most setup and communication routines, leaving to the derived classes the charge of computing the transferred values.

General description

A GeneralField transfer proceeds as follows:

Each process first looks to find which source application it will be talking to. This is based on geometric proximity, leveraging bounding boxes enclosing each application's domain. The bounding boxes may need to be extended using the "bbox_factor" parameter to expand the domain considered for transfers with wider stencils.

Then each process shares the list of target points, locations it needs data for, with each of the processes owning the source applications of interest. These other processes then, using the behavior defined in the derived class, compute the local value of the source variable. They also share geometric information about where this evaluation of the source variable was located, which can be used for interpolation for example.

Finally, the data received is placed in the solution vector of the target variable(s). This is performed using a local projection with the shape function of the target variable(s) in order to support higher order variables.

Features supported

All transfers derived from this base class should be able to support:

  • block restriction in both the source and target application

  • boundary restriction in both the source and target application

  • mesh division restriction in both the source and target application

  • arbitrary number of parallel processes for both the source and target application

  • support for replicated and distributed meshes in both applications involved

  • transfers between parent and child applications

  • transfers between sibling applications (child to child)

  • transfers between parent and multiple child applications in different locations

  • transfers to and from a displaced mesh

  • transfers of nodal and elemental variables

  • transfers between variables of different finite element/volume family and type

  • transfers between regular and array variables

  • transfers from multiple variables to multiple variables

  • interpolation and extrapolation transfers, as defined by the derived class

  • detection of indetermination due to source points equidistant to a target point

  • limitation of transfer source to the nearest position (see Positions) of target point

  • limitation of transfer source to the matching mesh division index between the source and target mesh divisions

  • limitation of transfer source to subapps at the same index as the target mesh division

  • limitation of transfer target to subapps at the same index as the source mesh division

  • general coordinate transformations. Coordinate system changes (RZ to XYZ, for example) are not fully supported for the "floating point precision indetermination" detection.

commentnote

Examine each derived object's respective documentation for feature support.

commentnote

Floating point equidistance detection is turned on by default and will limit the scalability of the transfer. Please set "search_value_conflicts" to false for large cases.

Features not supported

The following features cannot be supported by general field transfers, as a limitation of the MultiAppGeneralFieldTransfer base class.

  • bi-directional transfer, a single transfer that send data to an app and from that same application

  • reduction operations, sum/average/min/max, on data transferred from multiple child apps

  • transfers between vector variables

These features are currently unsupported, but could be enabled if necessary with reasonable efforts:

  • caching optimizations for when both the target and origin mesh are constant

Siblings transfer behavior

This transfer supports sending data from a MultiApp to a MultiApp with an arbitrary number of source subapps in the source MultiApp and an arbitrary, possibly non-matching, number of target subapps in the target MultiApp. It is the user's responsibility to ensure the transfer is well defined, for example by avoiding overlaps between source multiapps which cause multiple valid values for a target point.

Use of bounding boxes

Bounding boxes are used in general field transfers to perform very fast checks on whether a point could belong to an origin mesh. If the point is not inside the bounding box of an application's mesh, then it clearly cannot be inside that mesh. This allows to disqualify a majority of origin meshes very fast in situations where the transfer obtains data from multiple applications.

This process fails in several situations. When seeking to extrapolate from a source application (or interpolate between non-overlapping source applications), the target points can naturally be outside the bounding box of the source applications. In order to resolve this, the Transfer's "bbox_factor" and "fixed_bounding_box_size" may be used to inflate the bounding boxes. Note that the center of the bounding box is taken to be the center of the origin mesh's bounding box.

commentnote

"bounding_box_inflation" and "bounding_box_padding" parameters of the origin MultiApp are ignored. Only the MultiAppGeneralFieldTransfer "bbox_factor" and "fixed_bounding_box_size" parameters are taken into account.

Using the Positions system to restrict transfer sources

In addition to block and boundary restriction, the Positions system may be used to match origin and target points. When specified with the "use_nearest_position" parameter, each target point of a transfer will only be matched with sources that are closest to the same Position as the target point. The sources are simply the applications for:

and nodes or centroids for:

commentnote

Unlike block and boundary restriction which are inclusive (more origin blocks/boundaries specified means a larger source), specifying more Positions further restricts the considered source for a given target point.

commentnote

The "nearest position" criterion for the source of a transfer is obeyed strictly. If closer, an invalid value (triggering the use of the "extrapolation_constant") should and will be preferred over a valid value.

commentnote

The origin and target locations for transferred data are both considered in the reference domain (the one obtained by applying the coordinate transformation) when using the nearest positions transfer options.

Using mesh divisions in transfers

Mesh divisions may be leveraged in several ways by specifying the "from_mesh_division_usage" and the "to_mesh_division_usage" parameters.

  • Mesh divisions for spatial transfer restriction (usage = spatial_restriction)

Source and target mesh divisions, specified using the "from_mesh_division" and "to_mesh_division" parameters respectively, can be used to limit the spatial domain that will provide data for the transfer (origin spatial restriction) and the target spatial domain. The exclusion of a region is simply the region that is indexed with an invalid index in the mesh division.

commentnote

The spatial restriction effect of the mesh divisions is active for all usages! If some data lies outside the source mesh division, it will not be transferred.

  • Matching regions using a source and target mesh divisions (usage = matching_division)

The source domain for the values to be transferred and the target domain can also be matched on a one-to-one basis using the "from_mesh_division" and "to_mesh_division" parameters. Each region of a given index into a division is matched to the region of the same index into the other division.

It is advised to keep the number of mesh divisions the same in the two mesh divisions for simplicity.

  • Matching source applications and target regions using a mesh division

Set "to_mesh_division_usage" to matching_subapp_index

The application providing values to transfer to a target region can be restricted to the index of the points in the target region given by a mesh division specified by the "to_mesh_division" parameter.

It is advised to keep the number of target mesh divisions the same as the number of source subapps for simplicity.

  • Matching target applications and source regions using a mesh division

Set "from_mesh_division_usage" to matching_subapp_index

The spatial region providing values to transfer to a target application can be restricted using a mesh division specified by the "from_mesh_division" parameter. The target subapp will then only receive data that comes from the region at the same index, as the subapp, in the source mesh division.

It is advised to keep the number of source mesh divisions the same as the number of target subapps for simplicity.

Overlap and floating point precision indetermination detection

The derived classes of MultiAppGeneralFieldTransfer may keep track of indetermination in origin values. In the event of indetermination in origin values, a single value is still selected, usually the one from the process with the lowest rank. These indetermination occur when for example:

  • multiple points in the origin mesh(es) are equidistant to the target location, for nearest-node type transfers

  • multiple child apps have an equidistant point to the target location, for nearest-node type transfers

  • multiple child apps can compute a valid value for a target location because their meshes overlap

MultiAppGeneralFieldTransfer itself keeps track of indetermination by examining received values for each target point. This occurs when multiple values are received for a single target point. Some transfers examine the distance between origin and target points to select a value, but this can still lead to indetermination if the distances are the same.

Mesh, block or boundary restriction can sometimes be used to alleviate these indeterminations in the origin values. Other times, either remeshing one of the apps or using the "positions" parameter to create a very small offset can help remove the indetermination.