Skip to content
18 changes: 16 additions & 2 deletions adapter/PreciceInterface.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ void Precice_Setup(char *configFilename, char *participantName, SimulationData *

// Initialize variables needed for the coupling
NNEW(sim->coupling_init_v, double, sim->mt * sim->nk);
NNEW(sim->coupling_init_ve, double, sim->mt * sim->nk);
NNEW(sim->coupling_init_acc, double, sim->mt * sim->nk);

// Initialize preCICE
sim->precice_dt = precicec_initialize();
Expand Down Expand Up @@ -128,7 +130,7 @@ void Precice_FulfilledWriteCheckpoint()
precicec_markActionFulfilled("write-iteration-checkpoint");
}

void Precice_ReadIterationCheckpoint(SimulationData *sim, double *v)
void Precice_ReadIterationCheckpoint(SimulationData *sim, double *v, double *ve, double *acc)
{

printf("Adapter reading checkpoint...\n");
Expand All @@ -142,9 +144,11 @@ void Precice_ReadIterationCheckpoint(SimulationData *sim, double *v)

// Reload solution vector v
memcpy(v, sim->coupling_init_v, sizeof(double) * sim->mt * sim->nk);
memcpy(ve, sim->coupling_init_ve, sizeof(double) * sim->mt * sim->nk);
memcpy(acc, sim->coupling_init_acc, sizeof(double) * sim->mt * sim->nk);
}

void Precice_WriteIterationCheckpoint(SimulationData *sim, double *v)
void Precice_WriteIterationCheckpoint(SimulationData *sim, double *v, double *ve, double *acc)
{

printf("Adapter writing checkpoint...\n");
Expand All @@ -158,6 +162,8 @@ void Precice_WriteIterationCheckpoint(SimulationData *sim, double *v)

// Save solution vector v
memcpy(sim->coupling_init_v, v, sizeof(double) * sim->mt * sim->nk);
memcpy(sim->coupling_init_ve, ve, sizeof(double) * sim->mt * sim->nk);
memcpy(sim->coupling_init_acc, acc, sizeof(double) * sim->mt * sim->nk);
}

void Precice_ReadIterationCheckpointModal(SimulationData *sim, double *dofs, double *derivatives, int nev)
Expand Down Expand Up @@ -437,6 +443,14 @@ void Precice_FreeData(SimulationData *sim)
free(sim->coupling_init_v);
}

if (sim->coupling_init_ve != NULL) {
free(sim->coupling_init_ve);
}

if (sim->coupling_init_acc != NULL) {
free(sim->coupling_init_acc);
}

for (i = 0; i < sim->numPreciceInterfaces; i++) {
PreciceInterface_FreeData(sim->preciceInterfaces[i]);
free(sim->preciceInterfaces[i]);
Expand Down
10 changes: 8 additions & 2 deletions adapter/PreciceInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ typedef struct SimulationData {

// Coupling data
double *coupling_init_v;
double *coupling_init_ve;
double *coupling_init_acc;
double coupling_init_theta;
double coupling_init_dtheta;
double precice_dt;
Expand Down Expand Up @@ -213,15 +215,19 @@ void Precice_FulfilledWriteCheckpoint();
* @brief Reads iteration checkpoint
* @param sim: Structure with CalculiX data
* @param v: CalculiX array with the temperature and displacement values
* @param ve: CalculiX array with the temperature and displacement derivatives
* @param acc: CalculiX array with the temperature and displacement acceleration
*/
void Precice_ReadIterationCheckpoint(SimulationData *sim, double *v);
void Precice_ReadIterationCheckpoint(SimulationData *sim, double *v, double *ve, double *acc);

/**
* @brief Writes iteration checkpoint
* @param sim: Structure with CalculiX data
* @param v: CalculiX array with the temperature and displacement values
* @param ve: CalculiX array with the temperature and displacement derivatives
* @param acc: CalculiX array with the temperature and displacement acceleration
*/
void Precice_WriteIterationCheckpoint(SimulationData *sim, double *v);
void Precice_WriteIterationCheckpoint(SimulationData *sim, double *v, double *ve, double *acc);

/**
* @brief Reads iteration checkpoint (in dyna_precice)
Expand Down
29 changes: 21 additions & 8 deletions nonlingeo_precice.c
Original file line number Diff line number Diff line change
Expand Up @@ -1635,6 +1635,8 @@ void nonlingeo_precice(double **cop, ITG *nk, ITG **konp, ITG **ipkonp, char **l
/* Adapter: Create the interfaces and initialize the coupling */
Precice_Setup(configFilename, preciceParticipantName, &simulationData);

ITG kode_backup;

while (Precice_IsCouplingOngoing()) {

/* Adapter: Adjust solver time step */
Expand All @@ -1646,9 +1648,6 @@ void nonlingeo_precice(double **cop, ITG *nk, ITG **konp, ITG **ipkonp, char **l

/* previous increment converged: update the initial values */

iinc++;
jprint++;

/* store number of elements (important for implicit dynamic
contact */

Expand All @@ -1659,13 +1658,22 @@ void nonlingeo_precice(double **cop, ITG *nk, ITG **konp, ITG **ipkonp, char **l
isiz = mt * *nk;
cpypardou(vini, vold, &isiz, &num_cpus);

isiz = *nboun;
cpypardou(xbounini, xbounact, &isiz, &num_cpus);

if (Precice_IsWriteCheckpointRequired()) {
Precice_WriteIterationCheckpoint(&simulationData, vini);
Precice_WriteIterationCheckpoint(&simulationData, vini, veini, accini);

iinc++;
jprint++;

kode_backup = *kode;
simulationData.stored_iinc = iinc;
simulationData.stored_jprint = jprint;

Precice_FulfilledWriteCheckpoint();
}

isiz = *nboun;
cpypardou(xbounini, xbounact, &isiz, &num_cpus);
if ((*ithermal == 1) || (*ithermal >= 3)) {
isiz = *nk;
cpypardou(t1ini, t1act, &isiz, &num_cpus);
Expand Down Expand Up @@ -3706,8 +3714,13 @@ void nonlingeo_precice(double **cop, ITG *nk, ITG **konp, ITG **ipkonp, char **l
/* Adapter: If the coupling does not converge, read the checkpoint */
if (Precice_IsReadCheckpointRequired()) {
if (*nmethod == 4) {
Precice_ReadIterationCheckpoint(&simulationData, vold);
Precice_ReadIterationCheckpoint(&simulationData, vini, veini, accini);
iinc = simulationData.stored_iinc;
jprint = simulationData.stored_jprint;

icutb++;

*kode = kode_backup;
}
Precice_FulfilledReadCheckpoint();
}
Expand Down Expand Up @@ -3905,7 +3918,7 @@ void nonlingeo_precice(double **cop, ITG *nk, ITG **konp, ITG **ipkonp, char **l

/* output */

if ((jout[0] == jprint) && (icutb == 0)) {
if ((jout[0] == jprint) && (icutb == 0) && precicec_isTimeWindowComplete()) {

jprint = 0;

Expand Down