From: Mark Abraham Date: Wed, 4 Dec 2019 16:07:59 +0000 (+0100) Subject: Provide more feedback when listed forces tests fail X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=93b5f239f5ab1e46e65a9d1e84d8d65d1f0602f3;p=alexxy%2Fgromacs.git Provide more feedback when listed forces tests fail Refs #3205 Change-Id: Ic012aeaf8b35af88b78e109acabb6048d593cab3 --- diff --git a/src/gromacs/listed_forces/tests/bonded.cpp b/src/gromacs/listed_forces/tests/bonded.cpp index 54515941f8..4447cced8c 100644 --- a/src/gromacs/listed_forces/tests/bonded.cpp +++ b/src/gromacs/listed_forces/tests/bonded.cpp @@ -59,6 +59,8 @@ #include "gromacs/pbcutil/pbc.h" #include "gromacs/topology/idef.h" #include "gromacs/utility/strconvert.h" +#include "gromacs/utility/stringstream.h" +#include "gromacs/utility/textwriter.h" #include "testutils/refdata.h" #include "testutils/testasserts.h" @@ -116,6 +118,8 @@ public: //! Interaction parameters t_iparams iparams = { { 0 } }; + friend std::ostream& operator<<(std::ostream& out, const iListInput& input); + //! Constructor iListInput() {} @@ -470,6 +474,26 @@ public: } }; +//! Prints the interaction and parameters to a stream +std::ostream& operator<<(std::ostream& out, const iListInput& input) +{ + using std::endl; + out << "Function type " << input.ftype << " called " << interaction_function[input.ftype].name + << " ie. labelled '" << interaction_function[input.ftype].longname << "' in an energy file" + << endl; + + // Organize to print the legacy C union t_iparams, whose + // relevant contents vary with ftype. + StringOutputStream stream; + { + TextWriter writer(&stream); + printInteractionParameters(&writer, input.ftype, input.iparams); + } + out << "Function parameters " << stream.toString(); + out << "Parameters trigger FEP? " << (input.fep ? "true" : "false") << endl; + return out; +} + /*! \brief Utility to fill iatoms struct * * \param[in] ftype Function type @@ -530,7 +554,7 @@ protected: BondedKernelFlavor::ForcesAndVirialAndEnergy); // Internal consistency test of both test input // and bonded functions. - EXPECT_TRUE((input_.fep || (output.dvdlambda == 0.0))); + EXPECT_TRUE((input_.fep || (output.dvdlambda == 0.0))) << "dvdlambda was " << output.dvdlambda; checkOutput(checker, output); } void testIfunc() diff --git a/src/gromacs/topology/forcefieldparameters.cpp b/src/gromacs/topology/forcefieldparameters.cpp index 0ed646e2e4..da58aa3b2e 100644 --- a/src/gromacs/topology/forcefieldparameters.cpp +++ b/src/gromacs/topology/forcefieldparameters.cpp @@ -99,7 +99,7 @@ void pr_ffparams(FILE* fp, int indent, const char* title, const gmx_ffparams_t* pr_indent(fp, indent + INDENT); fprintf(fp, "functype[%d]=%s, ", bShowNumbers ? i : -1, interaction_function[ffparams->functype[i]].name); - pr_iparams(fp, ffparams->functype[i], &ffparams->iparams[i]); + pr_iparams(fp, ffparams->functype[i], ffparams->iparams[i]); } pr_double(fp, indent, "reppow", ffparams->reppow); pr_real(fp, indent, "fudgeQQ", ffparams->fudgeQQ); diff --git a/src/gromacs/topology/idef.cpp b/src/gromacs/topology/idef.cpp index 8f394c8375..ef3f17e837 100644 --- a/src/gromacs/topology/idef.cpp +++ b/src/gromacs/topology/idef.cpp @@ -43,169 +43,201 @@ #include "gromacs/topology/ifunc.h" #include "gromacs/utility/fatalerror.h" #include "gromacs/utility/smalloc.h" +#include "gromacs/utility/stringstream.h" +#include "gromacs/utility/textwriter.h" #include "gromacs/utility/txtdump.h" -static void pr_harm(FILE* fp, const t_iparams* iparams, const char* r, const char* kr) +static void printHarmonicInteraction(gmx::TextWriter* writer, + const t_iparams& iparams, + const char* r, + const char* kr) { - fprintf(fp, "%sA=%12.5e, %sA=%12.5e, %sB=%12.5e, %sB=%12.5e\n", r, iparams->harmonic.rA, kr, - iparams->harmonic.krA, r, iparams->harmonic.rB, kr, iparams->harmonic.krB); + writer->writeLineFormatted("%sA=%12.5e, %sA=%12.5e, %sB=%12.5e, %sB=%12.5e", r, + iparams.harmonic.rA, kr, iparams.harmonic.krA, r, + iparams.harmonic.rB, kr, iparams.harmonic.krB); } -void pr_iparams(FILE* fp, t_functype ftype, const t_iparams* iparams) +void pr_iparams(FILE* fp, t_functype ftype, const t_iparams& iparams) +{ + gmx::StringOutputStream stream; + { + gmx::TextWriter writer(&stream); + printInteractionParameters(&writer, ftype, iparams); + } + fputs(stream.toString().c_str(), fp); +} + +void printInteractionParameters(gmx::TextWriter* writer, t_functype ftype, const t_iparams& iparams) { switch (ftype) { case F_ANGLES: - case F_G96ANGLES: pr_harm(fp, iparams, "th", "ct"); break; + case F_G96ANGLES: printHarmonicInteraction(writer, iparams, "th", "ct"); break; case F_CROSS_BOND_BONDS: - fprintf(fp, "r1e=%15.8e, r2e=%15.8e, krr=%15.8e\n", iparams->cross_bb.r1e, - iparams->cross_bb.r2e, iparams->cross_bb.krr); + writer->writeLineFormatted("r1e=%15.8e, r2e=%15.8e, krr=%15.8e", iparams.cross_bb.r1e, + iparams.cross_bb.r2e, iparams.cross_bb.krr); break; case F_CROSS_BOND_ANGLES: - fprintf(fp, "r1e=%15.8e, r1e=%15.8e, r3e=%15.8e, krt=%15.8e\n", iparams->cross_ba.r1e, - iparams->cross_ba.r2e, iparams->cross_ba.r3e, iparams->cross_ba.krt); + writer->writeLineFormatted("r1e=%15.8e, r1e=%15.8e, r3e=%15.8e, krt=%15.8e", + iparams.cross_ba.r1e, iparams.cross_ba.r2e, + iparams.cross_ba.r3e, iparams.cross_ba.krt); break; case F_LINEAR_ANGLES: - fprintf(fp, "klinA=%15.8e, aA=%15.8e, klinB=%15.8e, aB=%15.8e\n", iparams->linangle.klinA, - iparams->linangle.aA, iparams->linangle.klinB, iparams->linangle.aB); + writer->writeLineFormatted("klinA=%15.8e, aA=%15.8e, klinB=%15.8e, aB=%15.8e", + iparams.linangle.klinA, iparams.linangle.aA, + iparams.linangle.klinB, iparams.linangle.aB); break; case F_UREY_BRADLEY: - fprintf(fp, + writer->writeLineFormatted( "thetaA=%15.8e, kthetaA=%15.8e, r13A=%15.8e, kUBA=%15.8e, thetaB=%15.8e, " - "kthetaB=%15.8e, r13B=%15.8e, kUBB=%15.8e\n", - iparams->u_b.thetaA, iparams->u_b.kthetaA, iparams->u_b.r13A, iparams->u_b.kUBA, - iparams->u_b.thetaB, iparams->u_b.kthetaB, iparams->u_b.r13B, iparams->u_b.kUBB); + "kthetaB=%15.8e, r13B=%15.8e, kUBB=%15.8e", + iparams.u_b.thetaA, iparams.u_b.kthetaA, iparams.u_b.r13A, iparams.u_b.kUBA, + iparams.u_b.thetaB, iparams.u_b.kthetaB, iparams.u_b.r13B, iparams.u_b.kUBB); break; case F_QUARTIC_ANGLES: - fprintf(fp, "theta=%15.8e", iparams->qangle.theta); + writer->writeStringFormatted("theta=%15.8e", iparams.qangle.theta); for (int i = 0; i < 5; i++) { - fprintf(fp, ", c%c=%15.8e", '0' + i, iparams->qangle.c[i]); + writer->writeStringFormatted(", c%c=%15.8e", '0' + i, iparams.qangle.c[i]); } - fprintf(fp, "\n"); + writer->ensureLineBreak(); break; case F_BHAM: - fprintf(fp, "a=%15.8e, b=%15.8e, c=%15.8e\n", iparams->bham.a, iparams->bham.b, - iparams->bham.c); + writer->writeLineFormatted("a=%15.8e, b=%15.8e, c=%15.8e", iparams.bham.a, + iparams.bham.b, iparams.bham.c); break; case F_BONDS: case F_G96BONDS: - case F_HARMONIC: pr_harm(fp, iparams, "b0", "cb"); break; - case F_IDIHS: pr_harm(fp, iparams, "xi", "cx"); break; + case F_HARMONIC: printHarmonicInteraction(writer, iparams, "b0", "cb"); break; + case F_IDIHS: printHarmonicInteraction(writer, iparams, "xi", "cx"); break; case F_MORSE: - fprintf(fp, - "b0A=%15.8e, cbA=%15.8e, betaA=%15.8e, b0B=%15.8e, cbB=%15.8e, betaB=%15.8e\n", - iparams->morse.b0A, iparams->morse.cbA, iparams->morse.betaA, - iparams->morse.b0B, iparams->morse.cbB, iparams->morse.betaB); + writer->writeLineFormatted( + "b0A=%15.8e, cbA=%15.8e, betaA=%15.8e, b0B=%15.8e, cbB=%15.8e, betaB=%15.8e", + iparams.morse.b0A, iparams.morse.cbA, iparams.morse.betaA, iparams.morse.b0B, + iparams.morse.cbB, iparams.morse.betaB); break; case F_CUBICBONDS: - fprintf(fp, "b0=%15.8e, kb=%15.8e, kcub=%15.8e\n", iparams->cubic.b0, iparams->cubic.kb, - iparams->cubic.kcub); + writer->writeLineFormatted("b0=%15.8e, kb=%15.8e, kcub=%15.8e", iparams.cubic.b0, + iparams.cubic.kb, iparams.cubic.kcub); break; - case F_CONNBONDS: fprintf(fp, "\n"); break; + case F_CONNBONDS: writer->ensureEmptyLine(); break; case F_FENEBONDS: - fprintf(fp, "bm=%15.8e, kb=%15.8e\n", iparams->fene.bm, iparams->fene.kb); + writer->writeLineFormatted("bm=%15.8e, kb=%15.8e", iparams.fene.bm, iparams.fene.kb); break; case F_RESTRBONDS: - fprintf(fp, + writer->writeLineFormatted( "lowA=%15.8e, up1A=%15.8e, up2A=%15.8e, kA=%15.8e, lowB=%15.8e, up1B=%15.8e, " - "up2B=%15.8e, kB=%15.8e,\n", - iparams->restraint.lowA, iparams->restraint.up1A, iparams->restraint.up2A, - iparams->restraint.kA, iparams->restraint.lowB, iparams->restraint.up1B, - iparams->restraint.up2B, iparams->restraint.kB); + "up2B=%15.8e, kB=%15.8e,", + iparams.restraint.lowA, iparams.restraint.up1A, iparams.restraint.up2A, + iparams.restraint.kA, iparams.restraint.lowB, iparams.restraint.up1B, + iparams.restraint.up2B, iparams.restraint.kB); break; case F_TABBONDS: case F_TABBONDSNC: case F_TABANGLES: case F_TABDIHS: - fprintf(fp, "tab=%d, kA=%15.8e, kB=%15.8e\n", iparams->tab.table, iparams->tab.kA, - iparams->tab.kB); + writer->writeLineFormatted("tab=%d, kA=%15.8e, kB=%15.8e", iparams.tab.table, + iparams.tab.kA, iparams.tab.kB); + break; + case F_POLARIZATION: + writer->writeLineFormatted("alpha=%15.8e", iparams.polarize.alpha); break; - case F_POLARIZATION: fprintf(fp, "alpha=%15.8e\n", iparams->polarize.alpha); break; case F_ANHARM_POL: - fprintf(fp, "alpha=%15.8e drcut=%15.8e khyp=%15.8e\n", iparams->anharm_polarize.alpha, - iparams->anharm_polarize.drcut, iparams->anharm_polarize.khyp); + writer->writeLineFormatted("alpha=%15.8e drcut=%15.8e khyp=%15.8e", + iparams.anharm_polarize.alpha, iparams.anharm_polarize.drcut, + iparams.anharm_polarize.khyp); break; case F_THOLE_POL: - fprintf(fp, "a=%15.8e, alpha1=%15.8e, alpha2=%15.8e, rfac=%15.8e\n", iparams->thole.a, - iparams->thole.alpha1, iparams->thole.alpha2, iparams->thole.rfac); + writer->writeLineFormatted("a=%15.8e, alpha1=%15.8e, alpha2=%15.8e, rfac=%15.8e", + iparams.thole.a, iparams.thole.alpha1, iparams.thole.alpha2, + iparams.thole.rfac); break; case F_WATER_POL: - fprintf(fp, "al_x=%15.8e, al_y=%15.8e, al_z=%15.8e, rOH=%9.6f, rHH=%9.6f, rOD=%9.6f\n", - iparams->wpol.al_x, iparams->wpol.al_y, iparams->wpol.al_z, iparams->wpol.rOH, - iparams->wpol.rHH, iparams->wpol.rOD); + writer->writeLineFormatted( + "al_x=%15.8e, al_y=%15.8e, al_z=%15.8e, rOH=%9.6f, rHH=%9.6f, rOD=%9.6f", + iparams.wpol.al_x, iparams.wpol.al_y, iparams.wpol.al_z, iparams.wpol.rOH, + iparams.wpol.rHH, iparams.wpol.rOD); + break; + case F_LJ: + writer->writeLineFormatted("c6=%15.8e, c12=%15.8e", iparams.lj.c6, iparams.lj.c12); break; - case F_LJ: fprintf(fp, "c6=%15.8e, c12=%15.8e\n", iparams->lj.c6, iparams->lj.c12); break; case F_LJ14: - fprintf(fp, "c6A=%15.8e, c12A=%15.8e, c6B=%15.8e, c12B=%15.8e\n", iparams->lj14.c6A, - iparams->lj14.c12A, iparams->lj14.c6B, iparams->lj14.c12B); + writer->writeLineFormatted("c6A=%15.8e, c12A=%15.8e, c6B=%15.8e, c12B=%15.8e", + iparams.lj14.c6A, iparams.lj14.c12A, iparams.lj14.c6B, + iparams.lj14.c12B); break; case F_LJC14_Q: - fprintf(fp, "fqq=%15.8e, qi=%15.8e, qj=%15.8e, c6=%15.8e, c12=%15.8e\n", iparams->ljc14.fqq, - iparams->ljc14.qi, iparams->ljc14.qj, iparams->ljc14.c6, iparams->ljc14.c12); + writer->writeLineFormatted("fqq=%15.8e, qi=%15.8e, qj=%15.8e, c6=%15.8e, c12=%15.8e", + iparams.ljc14.fqq, iparams.ljc14.qi, iparams.ljc14.qj, + iparams.ljc14.c6, iparams.ljc14.c12); break; case F_LJC_PAIRS_NB: - fprintf(fp, "qi=%15.8e, qj=%15.8e, c6=%15.8e, c12=%15.8e\n", iparams->ljcnb.qi, - iparams->ljcnb.qj, iparams->ljcnb.c6, iparams->ljcnb.c12); + writer->writeLineFormatted("qi=%15.8e, qj=%15.8e, c6=%15.8e, c12=%15.8e", iparams.ljcnb.qi, + iparams.ljcnb.qj, iparams.ljcnb.c6, iparams.ljcnb.c12); break; case F_PDIHS: case F_PIDIHS: case F_ANGRES: case F_ANGRESZ: - fprintf(fp, "phiA=%15.8e, cpA=%15.8e, phiB=%15.8e, cpB=%15.8e, mult=%d\n", - iparams->pdihs.phiA, iparams->pdihs.cpA, iparams->pdihs.phiB, - iparams->pdihs.cpB, iparams->pdihs.mult); + writer->writeLineFormatted("phiA=%15.8e, cpA=%15.8e, phiB=%15.8e, cpB=%15.8e, mult=%d", + iparams.pdihs.phiA, iparams.pdihs.cpA, iparams.pdihs.phiB, + iparams.pdihs.cpB, iparams.pdihs.mult); break; case F_DISRES: - fprintf(fp, "label=%4d, type=%1d, low=%15.8e, up1=%15.8e, up2=%15.8e, fac=%15.8e)\n", - iparams->disres.label, iparams->disres.type, iparams->disres.low, - iparams->disres.up1, iparams->disres.up2, iparams->disres.kfac); + writer->writeLineFormatted( + "label=%4d, type=%1d, low=%15.8e, up1=%15.8e, up2=%15.8e, fac=%15.8e)", + iparams.disres.label, iparams.disres.type, iparams.disres.low, + iparams.disres.up1, iparams.disres.up2, iparams.disres.kfac); break; case F_ORIRES: - fprintf(fp, "ex=%4d, label=%d, power=%4d, c=%15.8e, obs=%15.8e, kfac=%15.8e)\n", - iparams->orires.ex, iparams->orires.label, iparams->orires.power, - iparams->orires.c, iparams->orires.obs, iparams->orires.kfac); + writer->writeLineFormatted( + "ex=%4d, label=%d, power=%4d, c=%15.8e, obs=%15.8e, kfac=%15.8e)", + iparams.orires.ex, iparams.orires.label, iparams.orires.power, iparams.orires.c, + iparams.orires.obs, iparams.orires.kfac); break; case F_DIHRES: - fprintf(fp, + writer->writeLineFormatted( "phiA=%15.8e, dphiA=%15.8e, kfacA=%15.8e, phiB=%15.8e, dphiB=%15.8e, " - "kfacB=%15.8e\n", - iparams->dihres.phiA, iparams->dihres.dphiA, iparams->dihres.kfacA, - iparams->dihres.phiB, iparams->dihres.dphiB, iparams->dihres.kfacB); + "kfacB=%15.8e", + iparams.dihres.phiA, iparams.dihres.dphiA, iparams.dihres.kfacA, + iparams.dihres.phiB, iparams.dihres.dphiB, iparams.dihres.kfacB); break; case F_POSRES: - fprintf(fp, + writer->writeLineFormatted( "pos0A=(%15.8e,%15.8e,%15.8e), fcA=(%15.8e,%15.8e,%15.8e), " - "pos0B=(%15.8e,%15.8e,%15.8e), fcB=(%15.8e,%15.8e,%15.8e)\n", - iparams->posres.pos0A[XX], iparams->posres.pos0A[YY], iparams->posres.pos0A[ZZ], - iparams->posres.fcA[XX], iparams->posres.fcA[YY], iparams->posres.fcA[ZZ], - iparams->posres.pos0B[XX], iparams->posres.pos0B[YY], iparams->posres.pos0B[ZZ], - iparams->posres.fcB[XX], iparams->posres.fcB[YY], iparams->posres.fcB[ZZ]); + "pos0B=(%15.8e,%15.8e,%15.8e), fcB=(%15.8e,%15.8e,%15.8e)", + iparams.posres.pos0A[XX], iparams.posres.pos0A[YY], iparams.posres.pos0A[ZZ], + iparams.posres.fcA[XX], iparams.posres.fcA[YY], iparams.posres.fcA[ZZ], + iparams.posres.pos0B[XX], iparams.posres.pos0B[YY], iparams.posres.pos0B[ZZ], + iparams.posres.fcB[XX], iparams.posres.fcB[YY], iparams.posres.fcB[ZZ]); break; case F_FBPOSRES: - fprintf(fp, "pos0=(%15.8e,%15.8e,%15.8e), geometry=%d, r=%15.8e, k=%15.8e\n", - iparams->fbposres.pos0[XX], iparams->fbposres.pos0[YY], iparams->fbposres.pos0[ZZ], - iparams->fbposres.geom, iparams->fbposres.r, iparams->fbposres.k); + writer->writeLineFormatted( + "pos0=(%15.8e,%15.8e,%15.8e), geometry=%d, r=%15.8e, k=%15.8e", + iparams.fbposres.pos0[XX], iparams.fbposres.pos0[YY], iparams.fbposres.pos0[ZZ], + iparams.fbposres.geom, iparams.fbposres.r, iparams.fbposres.k); break; case F_RBDIHS: for (int i = 0; i < NR_RBDIHS; i++) { - fprintf(fp, "%srbcA[%d]=%15.8e", i == 0 ? "" : ", ", i, iparams->rbdihs.rbcA[i]); + writer->writeStringFormatted("%srbcA[%d]=%15.8e", i == 0 ? "" : ", ", i, + iparams.rbdihs.rbcA[i]); } - fprintf(fp, "\n"); + writer->ensureLineBreak(); for (int i = 0; i < NR_RBDIHS; i++) { - fprintf(fp, "%srbcB[%d]=%15.8e", i == 0 ? "" : ", ", i, iparams->rbdihs.rbcB[i]); + writer->writeStringFormatted("%srbcB[%d]=%15.8e", i == 0 ? "" : ", ", i, + iparams.rbdihs.rbcB[i]); } - fprintf(fp, "\n"); + writer->ensureLineBreak(); break; case F_FOURDIHS: { /* Use the OPLS -> Ryckaert-Bellemans formula backwards to get * the OPLS potential constants back. */ - const real* rbcA = iparams->rbdihs.rbcA; - const real* rbcB = iparams->rbdihs.rbcB; + const real* rbcA = iparams.rbdihs.rbcA; + const real* rbcB = iparams.rbdihs.rbcB; real VA[4], VB[4]; VA[3] = -0.25 * rbcA[4]; @@ -220,38 +252,38 @@ void pr_iparams(FILE* fp, t_functype ftype, const t_iparams* iparams) for (int i = 0; i < NR_FOURDIHS; i++) { - fprintf(fp, "%sFourA[%d]=%15.8e", i == 0 ? "" : ", ", i, VA[i]); + writer->writeStringFormatted("%sFourA[%d]=%15.8e", i == 0 ? "" : ", ", i, VA[i]); } - fprintf(fp, "\n"); + writer->ensureLineBreak(); for (int i = 0; i < NR_FOURDIHS; i++) { - fprintf(fp, "%sFourB[%d]=%15.8e", i == 0 ? "" : ", ", i, VB[i]); + writer->writeStringFormatted("%sFourB[%d]=%15.8e", i == 0 ? "" : ", ", i, VB[i]); } - fprintf(fp, "\n"); + writer->ensureLineBreak(); break; } case F_CONSTR: case F_CONSTRNC: - fprintf(fp, "dA=%15.8e, dB=%15.8e\n", iparams->constr.dA, iparams->constr.dB); + writer->writeLineFormatted("dA=%15.8e, dB=%15.8e", iparams.constr.dA, iparams.constr.dB); break; case F_SETTLE: - fprintf(fp, "doh=%15.8e, dhh=%15.8e\n", iparams->settle.doh, iparams->settle.dhh); + writer->writeLineFormatted("doh=%15.8e, dhh=%15.8e", iparams.settle.doh, iparams.settle.dhh); break; - case F_VSITE2: fprintf(fp, "a=%15.8e\n", iparams->vsite.a); break; + case F_VSITE2: writer->writeLineFormatted("a=%15.8e", iparams.vsite.a); break; case F_VSITE3: case F_VSITE3FD: case F_VSITE3FAD: - fprintf(fp, "a=%15.8e, b=%15.8e\n", iparams->vsite.a, iparams->vsite.b); + writer->writeLineFormatted("a=%15.8e, b=%15.8e", iparams.vsite.a, iparams.vsite.b); break; case F_VSITE3OUT: case F_VSITE4FD: case F_VSITE4FDN: - fprintf(fp, "a=%15.8e, b=%15.8e, c=%15.8e\n", iparams->vsite.a, iparams->vsite.b, - iparams->vsite.c); + writer->writeLineFormatted("a=%15.8e, b=%15.8e, c=%15.8e", iparams.vsite.a, + iparams.vsite.b, iparams.vsite.c); break; case F_VSITEN: - fprintf(fp, "n=%2d, a=%15.8e\n", iparams->vsiten.n, iparams->vsiten.a); + writer->writeLineFormatted("n=%2d, a=%15.8e", iparams.vsiten.n, iparams.vsiten.a); break; case F_GB12_NOLONGERUSED: case F_GB13_NOLONGERUSED: @@ -263,19 +295,19 @@ void pr_iparams(FILE* fp, t_functype ftype, const t_iparams* iparams) // nothing to print. break; case F_CMAP: - fprintf(fp, "cmapA=%1d, cmapB=%1d\n", iparams->cmap.cmapA, iparams->cmap.cmapB); + writer->writeLineFormatted("cmapA=%1d, cmapB=%1d", iparams.cmap.cmapA, iparams.cmap.cmapB); break; - case F_RESTRANGLES: pr_harm(fp, iparams, "ktheta", "costheta0"); break; + case F_RESTRANGLES: printHarmonicInteraction(writer, iparams, "ktheta", "costheta0"); break; case F_RESTRDIHS: - fprintf(fp, "phiA=%15.8e, cpA=%15.8e", iparams->pdihs.phiA, iparams->pdihs.cpA); + writer->writeLineFormatted("phiA=%15.8e, cpA=%15.8e", iparams.pdihs.phiA, iparams.pdihs.cpA); break; case F_CBTDIHS: - fprintf(fp, "kphi=%15.8e", iparams->cbtdihs.cbtcA[0]); + writer->writeLineFormatted("kphi=%15.8e", iparams.cbtdihs.cbtcA[0]); for (int i = 1; i < NR_CBTDIHS; i++) { - fprintf(fp, ", cbtcA[%d]=%15.8e", i - 1, iparams->cbtdihs.cbtcA[i]); + writer->writeStringFormatted(", cbtcA[%d]=%15.8e", i - 1, iparams.cbtdihs.cbtcA[i]); } - fprintf(fp, "\n"); + writer->ensureLineBreak(); break; default: gmx_fatal(FARGS, "unknown function type %d (%s) in %s line %d", ftype, @@ -320,7 +352,7 @@ static void printIlist(FILE* fp, if (bShowParameters) { fprintf(fp, " "); - pr_iparams(fp, ftype, &iparams[type]); + pr_iparams(fp, ftype, iparams[type]); } fprintf(fp, "\n"); i += 1 + interaction_function[ftype].nratoms; @@ -356,7 +388,7 @@ void pr_idef(FILE* fp, int indent, const char* title, const t_idef* idef, gmx_bo pr_indent(fp, indent + INDENT); fprintf(fp, "functype[%d]=%s, ", bShowNumbers ? i : -1, interaction_function[idef->functype[i]].name); - pr_iparams(fp, idef->functype[i], &idef->iparams[i]); + pr_iparams(fp, idef->functype[i], idef->iparams[i]); } pr_real(fp, indent, "fudgeQQ", idef->fudgeQQ); diff --git a/src/gromacs/topology/idef.h b/src/gromacs/topology/idef.h index a7a817fc96..15c010e286 100644 --- a/src/gromacs/topology/idef.h +++ b/src/gromacs/topology/idef.h @@ -382,7 +382,13 @@ typedef struct t_idef * The state of the sorting of il, values are provided above. */ -void pr_iparams(FILE* fp, t_functype ftype, const t_iparams* iparams); +namespace gmx +{ +class TextWriter; +} // namespace gmx + +void printInteractionParameters(gmx::TextWriter* writer, t_functype ftype, const t_iparams& iparams); +void pr_iparams(FILE* fp, t_functype ftype, const t_iparams& iparams); void pr_ilist(FILE* fp, int indent, const char* title, diff --git a/src/gromacs/topology/topology.cpp b/src/gromacs/topology/topology.cpp index 3640148744..e01993300b 100644 --- a/src/gromacs/topology/topology.cpp +++ b/src/gromacs/topology/topology.cpp @@ -389,9 +389,9 @@ static void cmp_iparm(FILE* fp, if (bDiff) { fprintf(fp, "%s1: ", s); - pr_iparams(fp, ft, &ip1); + pr_iparams(fp, ft, ip1); fprintf(fp, "%s2: ", s); - pr_iparams(fp, ft, &ip2); + pr_iparams(fp, ft, ip2); } } @@ -423,7 +423,7 @@ static void cmp_iparm_AB(FILE* fp, const char* s, t_functype ft, const t_iparams if (bDiff) { fprintf(fp, "%s: ", s); - pr_iparams(fp, ft, &ip1); + pr_iparams(fp, ft, ip1); } }