# MultiApp System

## Overview

MOOSE was originally created to solve fully-coupled systems of partial differential equations (PDEs), but not all systems need to be or are fully coupled:

• multiscale systems are generally loosely coupled between scales;

• systems with both fast and slow physics can be decoupled in time; and

• simulations involving input from external codes might be solved somewhat decoupled.

To MOOSE these situations look like loosely-coupled systems of fully-coupled equations. A MultiApp allows you to simultaneously solve for individual physics systems.

Each sub-application (app) is considered independent. There is always a "master" app that is doing the primary solve. The "master" app can then have any number of MultiApp objects. Each MultiApp can represent many (hence Multi) "sub-applications" (sub-apps). The sub-apps can be solving for completely different physics from the main application. They can be other MOOSE applications, or might represent external applications. A sub-app can, itself, have MultiApps, leading to multi-level solves, as shown below.

Figure 1: Example multi-level MultiApp hierarchy.

## Input File Syntax

MultiApp objects are declared in the [MultiApps] block and require a "type" just like may other blocks.

The "app_type" is required and is the name of the MooseApp derived app that is going to be executed. Generally, this is the name of the application being executed, therefore if this parameter is omitted it will default as such. However this system is designed for running another applications that are compiled or linked into the current app.

A MultiApp can be executed at any point during the master solve by setting the "execute_on" parameter. The "positions" parameters is a list of 3D coordinate pairs describing the offset of the sub-application(s) into the physical space of the master application, see Positions for more information. A single fir for all the sub-apps or a file for each position may be provided.

[MultiApps]
[sub_app]
type = TransientMultiApp
app_type = MooseTestApp
input_files = 'dt_from_master_sub.i'
positions = '0   0   0
0.5 0.5 0
0.6 0.6 0
0.7 0.7 0'
[]
[]

(test/tests/multiapps/transient_multiapp/dt_from_master.i)

## Positions

The "positions" parameter is a coordinate offset from the master app domain to the sub-app domain, as illustrated by Figure 2. The parameter requires the positions to be provided as a set of coordinates for each sub-app.

The number of coordinate sets determines the actual number of sub-applications created. If there is a large number of positions a file can be provided instead using the "positions_file" parameter.

• The coordinates are a vector that is being added to the coordinates of the sub-app's domain to put that domain in a specific location within the master domain.

• If the sub-app's domain starts at it is easy to think of moving that point around using "positions".

• For sub-apps on completely different scales, positions is the point in the master domain where that app is located.

Figure 2: Example of MultiApp object position.

## Parallel Execution

The MultiApp system is designed for efficient parallel execution of hierarchical problems. The master application utilizes all processors. Within each MultiApp, all of the processors are split among the sub-apps. If there are more sub-apps than processors, each processor will solve for multiple sub-apps. All sub-apps of a given MultiApp are run simultaneously in parallel. Multiple MultiApps will be executed one after another.

If uilding with dynamic libraries (the default) other applications can be loaded without adding them to your Makefile and registering them. Simply set the proper type in your input file (e.g. AnimalApp) and MOOSE will attempt to find the other library dynamically.

• The path (relative preferred) can be set in your input file using the parameter "library_path"; this path needs to point to the lib folder within an application directory.

• The MOOSE_LIBRARY_PATH may also be set to include paths for MOOSE to search.

warning

Each application must be compiled separately since application the Makefile does not have any knowledge of the dependent application.

## Available Actions

• Moose App
• AddMultiAppActionMooseObjectAction for creating objects from sub-blocks within the MultiApps block.