48#include "nonbonded/SwitchingFunction.hpp"
54#include "utils/simError.h"
59 SwitchingFunction::SwitchingFunction() :
60 functionType_(cubic), haveSpline_(false), isCubic_(true), np_(150) {
61 switchSpline_ = std::make_shared<CubicSpline>();
64 void SwitchingFunction::setSwitchType(SwitchingFunctionType sft) {
65 if ((sft == fifth_order_poly) || (sft == cubic)) {
67 switchSpline_ = std::make_shared<CubicSpline>();
68 setSwitch(rin_, rout_);
72 painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
73 "SwitchingFunction::setSwitchType was given unknown function type\n");
74 painCave.severity = OPENMD_ERROR;
80 void SwitchingFunction::setSwitch(RealType rinner, RealType router) {
81 if (router < rinner) {
82 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
83 "SwitchingFunction::setSwitch was given rinner (%lf) which was\n"
84 "\tlarger than router (%lf).\n",
86 painCave.severity = OPENMD_ERROR;
91 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
92 "SwitchingFunction::setSwitch was given router (%lf) which was\n"
93 "\tless than zero.\n",
95 painCave.severity = OPENMD_ERROR;
100 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
101 "SwitchingFunction::setSwitch was given rinner (%lf) which was\n"
102 "\tless than zero.\n",
104 painCave.severity = OPENMD_ERROR;
105 painCave.isFatal = 1;
112 rout2_ = rout_ * rout_;
114 if ((router - rinner) < 1.0e-8) {
120 if (functionType_ == fifth_order_poly) {
127 RealType dx, r, yval, rval, rval2, rval3, rval4, rval5;
128 RealType rvaldi, rvaldi2, rvaldi3, rvaldi4, rvaldi5;
130 dx = (rout_ - rin_) / RealType(np_ - 1);
132 for (
int i = 0; i < np_; i++) {
133 r = rin_ + RealType(i) * dx;
136 rval3 = rval2 * rval;
137 rval4 = rval2 * rval2;
138 rval5 = rval3 * rval2;
139 rvaldi = 1.0 / (rout_ - rin_);
140 rvaldi2 = rvaldi * rvaldi;
141 rvaldi3 = rvaldi2 * rvaldi;
142 rvaldi4 = rvaldi2 * rvaldi2;
143 rvaldi5 = rvaldi3 * rvaldi2;
144 yval = c0 + c3 * rval3 * rvaldi3 + c4 * rval4 * rvaldi4 +
145 c5 * rval5 * rvaldi5;
146 switchSpline_->addPoint(r, yval);
151 switchSpline_->addPoint(rin_, 1.0);
152 switchSpline_->addPoint(rout_, 0.0);
158 bool SwitchingFunction::getSwitch(
const RealType& r2, RealType& sw,
159 RealType& dswdr, RealType& r) {
163 bool in_switching_region =
false;
169 in_switching_region =
true;
171 switchSpline_->getValueAndDerivativeAt(r, sw, dswdr);
174 return in_switching_region;
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.