As default values, preCICE assumes that all coupling variables are zero initially. For fluid-structure interaction, for example, this means that the structure is in its reference state. Sometimes, you want to change this behavior – for instance, you may want to restart your simulation.

For initializing coupling data, you can add the following optional method:

void initializeData();

Before jumping into the implementation, let’s try to clarify how the usual the sequence of events in a serial and in a parallel coupling as studied in Step 4 changes.

TODO: picture

In a serial coupling, only the second participant can send data inside initializeData(). In parallel coupling, both participants can initialize data.

The high-level API of preCICE makes it possible to enable this feature at runtime, irrelevant of serial or parallel coupling configuration. To support this feature, we extend our example as follows:

[...]

const std::string& cowid = precice::constants::actionWriteInitialData();

[...]

int displID = precice.getDataID("Displacements", meshID);
int forceID = precice.getDataID("Forces", meshID);
double* forces = new double[vertexSize*dim];
double* displacements = new double[vertexSize*dim];

[...]

preciceDt = precice.initialize();

if(precice.isActionRequired(cowid)){
  precice.writeBlockVectorData(forceID, vertexSize, vertexIDs, forces);
  precice.markActionFulfilled(cowid);
}

precice.initializeData();

while (precice.isCouplingOngoing()){
  [...]

Now, you can specify at runtime if you want to initialize coupling data. For example to initialize displacements:

[...]
<exchange data="Forces" mesh="StructureMesh" from="FluidSolver" to="SolidSolver" />
<exchange data="Displacements" mesh="StructureMesh" from="SolidSolver" to="FluidSolver" initialize="yes"/>
[...]