MultiAppConservativeTransfer

It is essential to preserve a physics quantity during the transfer process for specific applications. For instance, neutron calculations' total power needs to be preserved when the power density is transferred to thermal calculations. That was implemented in the conservative transfer. The transfer is performed in the following steps:

  • Users get a solution in the source app ready and calculate to-be-preserved physics quantity based on the solution. The physics quantity is calculated using a postprocessor where users determine how they want to compute this quantity.

  • The solution is transferred to the target domain. A new physics quantity is calculated using the target solution. Again, that calculation is implemented as a postprocessor, where users should compute that according to the physics.

  • The target solution will be adjusted according to the source physics quantity and the target physics quantity.

  • The conservative quantity will be calculated again based on the adjusted target solution. The value is often printed on the screen for users' convenience.

The main picture of the conservative transfer can be explained mathematically as follows

,

where is a function used to compute a quantity of interest on the source domain and is a source physics field. is implemented as a postprocessor. and are corresponding counterparts on the target side. We emphasize that users are free to implement any postprocessor for according to the physics of interest.

Example Input File Syntax

The following examples demonstrate the use of the MultiAppConservativeTransfer for transferring solution.

Example use of MultiAppConservativeTransfer for transferring data conservatively.

[Transfers<<<{"href": "../../syntax/Transfers/index.html"}>>>]
  [to_sub]
    type = MultiAppGeneralFieldShapeEvaluationTransfer<<<{"description": "Transfers field data at the MultiApp position using the finite element shape functions from the origin application.", "href": "MultiAppGeneralFieldShapeEvaluationTransfer.html"}>>>
    source_variable<<<{"description": "The variable to transfer from."}>>> = u
    variable<<<{"description": "The auxiliary variable to store the transferred values in."}>>> = aux_u
    to_multi_app<<<{"description": "The name of the MultiApp to transfer the data to"}>>> = sub
    from_postprocessors_to_be_preserved<<<{"description": "The name of the Postprocessor in the from-app to evaluate an adjusting factor."}>>> = 'from_postprocessor'
    to_postprocessors_to_be_preserved<<<{"description": "The name of the Postprocessor in the to-app to evaluate an adjusting factor."}>>> = 'to_postprocessor'
  []
[]
(moose/test/tests/transfers/multiapp_conservative_transfer/parent_conservative_transfer.i)

From postprocessor.

[Postprocessors<<<{"href": "../../syntax/Postprocessors/index.html"}>>>]
  [from_postprocessor]
    type = ElementIntegralVariablePostprocessor<<<{"description": "Computes a volume integral of the specified variable", "href": "../postprocessors/ElementIntegralVariablePostprocessor.html"}>>>
    variable<<<{"description": "The name of the variable that this object operates on"}>>> = u
  []
[]
(moose/test/tests/transfers/multiapp_conservative_transfer/parent_conservative_transfer.i)

To postprocessor. Note that to postprocessor need to be executed on transfer.

[Postprocessors<<<{"href": "../../syntax/Postprocessors/index.html"}>>>]
  [./to_postprocessor]
    type = ElementIntegralVariablePostprocessor<<<{"description": "Computes a volume integral of the specified variable", "href": "../postprocessors/ElementIntegralVariablePostprocessor.html"}>>>
    variable<<<{"description": "The name of the variable that this object operates on"}>>> = aux_u
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'transfer'
  [../]
[]
(moose/test/tests/transfers/multiapp_conservative_transfer/sub_conservative_transfer.i)