diff --git a/adapter/PreciceInterface.c b/adapter/PreciceInterface.c index 09c82fc2..a578fd56 100644 --- a/adapter/PreciceInterface.c +++ b/adapter/PreciceInterface.c @@ -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(); @@ -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"); @@ -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"); @@ -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) @@ -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]); diff --git a/adapter/PreciceInterface.h b/adapter/PreciceInterface.h index 171fa8bd..4ac9e4e6 100644 --- a/adapter/PreciceInterface.h +++ b/adapter/PreciceInterface.h @@ -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; @@ -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) diff --git a/nonlingeo_precice.c b/nonlingeo_precice.c index a8bd8bab..f6aedee3 100644 --- a/nonlingeo_precice.c +++ b/nonlingeo_precice.c @@ -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 */ @@ -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 */ @@ -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); @@ -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(); } @@ -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;