+static int doCptPullCoordHist(XDR *xd, PullCoordinateHistory *pullCoordHist,
+ const StatePart part, FILE *list)
+{
+ int ret = 0;
+ int flags = 0;
+
+ flags |= ((1<<epullcoordh_VALUE_REF_SUM) | (1<<epullcoordh_VALUE_SUM) | (1<<epullcoordh_DR01_SUM) |
+ (1<<epullcoordh_DR23_SUM) | (1<<epullcoordh_DR45_SUM) | (1<<epullcoordh_FSCAL_SUM));
+
+ for (int i = 0; i < epullcoordh_NR && ret == 0; i++)
+ {
+ switch (i)
+ {
+ case epullcoordh_VALUE_REF_SUM: ret = do_cpte_double(xd, part, i, flags, &(pullCoordHist->valueRef), list); break;
+ case epullcoordh_VALUE_SUM: ret = do_cpte_double(xd, part, i, flags, &(pullCoordHist->value), list); break;
+ case epullcoordh_DR01_SUM:
+ for (int j = 0; j < DIM && ret == 0; j++)
+ {
+ ret = do_cpte_double(xd, part, i, flags, &(pullCoordHist->dr01[j]), list);
+ }
+ break;
+ case epullcoordh_DR23_SUM:
+ for (int j = 0; j < DIM && ret == 0; j++)
+ {
+ ret = do_cpte_double(xd, part, i, flags, &(pullCoordHist->dr23[j]), list);
+ }
+ break;
+ case epullcoordh_DR45_SUM:
+ for (int j = 0; j < DIM && ret == 0; j++)
+ {
+ ret = do_cpte_double(xd, part, i, flags, &(pullCoordHist->dr45[j]), list);
+ }
+ break;
+ case epullcoordh_FSCAL_SUM: ret = do_cpte_double(xd, part, i, flags, &(pullCoordHist->scalarForce), list); break;
+ case epullcoordh_DYNAX_SUM:
+ for (int j = 0; j < DIM && ret == 0; j++)
+ {
+ ret = do_cpte_double(xd, part, i, flags, &(pullCoordHist->dynaX[j]), list);
+ }
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static int doCptPullGroupHist(XDR *xd, PullGroupHistory *pullGroupHist,
+ const StatePart part, FILE *list)
+{
+ int ret = 0;
+ int flags = 0;
+
+ flags |= ((1<<epullgrouph_X_SUM));
+
+ for (int i = 0; i < epullgrouph_NR; i++)
+ {
+ switch (i)
+ {
+ case epullgrouph_X_SUM:
+ for (int j = 0; j < DIM && ret == 0; j++)
+ {
+ ret = do_cpte_double(xd, part, i, flags, &(pullGroupHist->x[j]), list);
+ }
+ break;
+ }
+ }
+
+ return ret;
+}
+
+
+static int doCptPullHist(XDR *xd, gmx_bool bRead,
+ int fflags, PullHistory *pullHist,
+ const StatePart part,
+ FILE *list)
+{
+ int ret = 0;
+ int pullHistoryNumCoordinates = 0;
+ int pullHistoryNumGroups = 0;
+
+ /* Retain the number of terms in the sum and the number of coordinates (used for writing
+ * average pull forces and coordinates) in the pull history, in temporary variables,
+ * in case they cannot be read from the checkpoint, in order to have backward compatibility */
+ if (bRead)
+ {
+ pullHist->numValuesInXSum = 0;
+ pullHist->numValuesInFSum = 0;
+ }
+ else if (pullHist != nullptr)
+ {
+ pullHistoryNumCoordinates = pullHist->pullCoordinateSums.size();
+ pullHistoryNumGroups = pullHist->pullGroupSums.size();
+ }
+ else
+ {
+ GMX_RELEASE_ASSERT(fflags == 0, "Without pull history, all flags should be off");
+ }
+
+ for (int i = 0; (i < epullhNR && ret == 0); i++)
+ {
+ if (fflags & (1<<i))
+ {
+ switch (i)
+ {
+ case epullhPULL_NUMCOORDINATES: ret = do_cpte_int(xd, part, i, fflags, &pullHistoryNumCoordinates, list); break;
+ case epullhPULL_NUMGROUPS: do_cpt_int_err(xd, eenh_names[i], &pullHistoryNumGroups, list); break;
+ case epullhPULL_NUMVALUESINXSUM: do_cpt_int_err(xd, eenh_names[i], &pullHist->numValuesInXSum, list); break;
+ case epullhPULL_NUMVALUESINFSUM: do_cpt_int_err(xd, eenh_names[i], &pullHist->numValuesInFSum, list); break;
+ default:
+ gmx_fatal(FARGS, "Unknown pull history entry %d\n"
+ "You are probably reading a new checkpoint file with old code", i);
+ }
+ }
+ }
+ if (bRead)
+ {
+ pullHist->pullCoordinateSums.resize(pullHistoryNumCoordinates);
+ pullHist->pullGroupSums.resize(pullHistoryNumGroups);
+ }
+ if (pullHist->numValuesInXSum > 0 || pullHist->numValuesInFSum > 0)
+ {
+ for (size_t i = 0; i < pullHist->pullCoordinateSums.size() && ret == 0; i++)
+ {
+ ret = doCptPullCoordHist(xd, &(pullHist->pullCoordinateSums[i]), part, list);
+ }
+ for (size_t i = 0; i < pullHist->pullGroupSums.size() && ret == 0; i++)
+ {
+ ret = doCptPullGroupHist(xd, &(pullHist->pullGroupSums[i]), part, list);
+ }
+ }
+
+ return ret;
+}
+