GMX_THROW(InvalidInputError(
"Pull geometry 'direction-periodic' is not supported by AWH"));
}
- double conversionFactor = pull_coordinate_is_angletype(&pullCoord) ? gmx::c_deg2Rad : 1;
+ double conversionFactor = pull_conversion_factor_userinput2internal(pullCoord);
pullCoordIndex.push_back(awhDimParam.coordinateIndex());
dimParams.emplace_back(DimParams::pullDimParams(
conversionFactor, awhDimParam.forceConstant(), beta));
/* The initial coordinate value, converted to external user units. */
double initialCoordinate = get_pull_coord_value(pull_work, dimParams->coordinateIndex(), &pbc);
- initialCoordinate *= pull_conversion_factor_internal2userinput(&pullCoordParams);
+ initialCoordinate *= pull_conversion_factor_internal2userinput(pullCoordParams);
dimParams->setInitialCoordinate(initialCoordinate);
}
* so we need to multiply with the internal units (radians for angle)
* to user units (degrees for an angle) with the same power.
*/
- header->pcrd[i].k =
- ir->pull->coord[i].k
- / gmx::square(pull_conversion_factor_internal2userinput(&ir->pull->coord[i]));
+ header->pcrd[i].k = ir->pull->coord[i].k
+ / gmx::square(pull_conversion_factor_internal2userinput(ir->pull->coord[i]));
header->pcrd[i].init_dist = ir->pull->coord[i].init;
copy_ivec(ir->pull->coord[i].dim, header->pcrd[i].dim);
header->pcrd[i].ndim =
header->pcrd[i].dim[XX] + header->pcrd[i].dim[YY] + header->pcrd[i].dim[ZZ];
- std::strcpy(header->pcrd[i].coord_unit, pull_coordinate_units(&ir->pull->coord[i]));
+ std::strcpy(header->pcrd[i].coord_unit, pull_coordinate_units(ir->pull->coord[i]));
if (ir->efep != FreeEnergyPerturbationType::No && ir->pull->coord[i].k != ir->pull->coord[i].kB)
{
value = get_pull_coord_value(pull_work, c, &pbc);
- value *= pull_conversion_factor_internal2userinput(pcrd);
- fprintf(stderr, " %10.3f %s", value, pull_coordinate_units(pcrd));
+ value *= pull_conversion_factor_internal2userinput(*pcrd);
+ fprintf(stderr, " %10.3f %s", value, pull_coordinate_units(*pcrd));
if (pcrd->bStart)
{
}
- fprintf(stderr, " %10.3f %s\n", pcrd->init, pull_coordinate_units(pcrd));
+ fprintf(stderr, " %10.3f %s\n", pcrd->init, pull_coordinate_units(*pcrd));
}
return pull_work;
double referenceValue,
const int numValuesInSum)
{
- const double unit_factor = pull_conversion_factor_internal2userinput(&coordParams);
+ const double unit_factor = pull_conversion_factor_internal2userinput(coordParams);
fprintf(out, "\t%g", pcrdData.value * unit_factor / numValuesInSum);
#include "gromacs/topology/topology.h"
#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/cstringutil.h"
+#include "gromacs/utility/enumerationhelpers.h"
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/futil.h"
using gmx::ArrayRef;
using gmx::RVec;
+/*! \brief Tells whether the pull geometry is an angle type */
+constexpr gmx::EnumerationArray<PullGroupGeometry, bool> sc_isAngleType = {
+ { false, false, false, false, false, true, true, true }
+};
+
static int groupPbcFromParams(const t_pull_group& params, bool setPbcRefToPrevStepCOM)
{
if (params.ind.size() <= 1)
clear_dvec(xp);
};
-bool pull_coordinate_is_angletype(const t_pull_coord* pcrd)
-{
- return (pcrd->eGeom == PullGroupGeometry::Angle || pcrd->eGeom == PullGroupGeometry::Dihedral
- || pcrd->eGeom == PullGroupGeometry::AngleAxis);
-}
-
static bool pull_coordinate_is_directional(const t_pull_coord* pcrd)
{
return (pcrd->eGeom == PullGroupGeometry::Direction || pcrd->eGeom == PullGroupGeometry::DirectionPBC
|| pcrd->eGeom == PullGroupGeometry::Cylinder);
}
-const char* pull_coordinate_units(const t_pull_coord* pcrd)
+const char* pull_coordinate_units(const t_pull_coord& pcrd)
{
- return pull_coordinate_is_angletype(pcrd) ? "deg" : "nm";
+ return sc_isAngleType[pcrd.eGeom] ? "deg" : "nm";
}
-double pull_conversion_factor_userinput2internal(const t_pull_coord* pcrd)
+double pull_conversion_factor_userinput2internal(const t_pull_coord& pcrd)
{
- if (pull_coordinate_is_angletype(pcrd))
+ if (sc_isAngleType[pcrd.eGeom])
{
return gmx::c_deg2Rad;
}
}
}
-double pull_conversion_factor_internal2userinput(const t_pull_coord* pcrd)
+double pull_conversion_factor_internal2userinput(const t_pull_coord& pcrd)
{
- if (pull_coordinate_is_angletype(pcrd))
+ if (sc_isAngleType[pcrd.eGeom])
{
return gmx::c_rad2Deg;
}
"Pull reference angle for coordinate %d (%f) needs to be in the allowed "
"interval [0,180] deg",
pcrdParams.coordIndex + 1,
- value_ref * pull_conversion_factor_internal2userinput(&pcrdParams));
+ value_ref * pull_conversion_factor_internal2userinput(pcrdParams));
}
}
else if (pcrdParams.eGeom == PullGroupGeometry::Dihedral)
if (pcrdParams.rate != 0)
{
const double inputValue = (pcrdParams.init + pcrdParams.rate * t)
- * pull_conversion_factor_userinput2internal(&pcrdParams);
+ * pull_conversion_factor_userinput2internal(pcrdParams);
*referenceValue = sanitizePullCoordReferenceValue(pcrdParams, inputValue);
}
}
{
pcrd->value_ref = sanitizePullCoordReferenceValue(
pcrd->params,
- pcrd->params.init * pull_conversion_factor_userinput2internal(&pcrd->params));
+ pcrd->params.init * pull_conversion_factor_userinput2internal(pcrd->params));
}
else
{
class LocalAtomSetManager;
} // namespace gmx
-/*! \brief Returns if the pull coordinate is an angle
- *
- * \param[in] pcrd The pull coordinate to query the type for.
- * \returns a boolean telling if the coordinate is of angle type.
- */
-bool pull_coordinate_is_angletype(const t_pull_coord* pcrd);
-
/*! \brief Returns the units of the pull coordinate.
*
* \param[in] pcrd The pull coordinate to query the units for.
* \returns a string with the units of the coordinate.
*/
-const char* pull_coordinate_units(const t_pull_coord* pcrd);
+const char* pull_coordinate_units(const t_pull_coord& pcrd);
/*! \brief Returns the conversion factor from the pull coord init/rate unit to internal value unit.
*
* \param[in] pcrd The pull coordinate to get the conversion factor for.
* \returns the conversion factor.
*/
-double pull_conversion_factor_userinput2internal(const t_pull_coord* pcrd);
+double pull_conversion_factor_userinput2internal(const t_pull_coord& pcrd);
/*! \brief Returns the conversion factor from the pull coord internal value unit to the init/rate unit.
*
* \param[in] pcrd The pull coordinate to get the conversion factor for.
* \returns the conversion factor.
*/
-double pull_conversion_factor_internal2userinput(const t_pull_coord* pcrd);
+double pull_conversion_factor_internal2userinput(const t_pull_coord& pcrd);
/*! \brief Get the value for pull coord coord_ind.
*