Program Listing for File switcher.h

Return to documentation for file (source/lib/include/switcher.h)

// SPDX-License-Identifier: LGPL-3.0-or-later
#pragma once

#include <cmath>

namespace deepmd {

inline double cos_switch(const double& xx,
                         const double& rmin,
                         const double& rmax) {
  if (xx < rmin) {
    return 1.;
  } else if (xx < rmax) {
    const double value = (xx - rmin) / (rmax - rmin) * M_PI;
    return 0.5 * (cos(value) + 1);
  } else {
    return 0.;
  }
}

inline void cos_switch(double& vv,
                       double& dd,
                       const double& xx,
                       const double& rmin,
                       const double& rmax) {
  if (xx < rmin) {
    dd = 0;
    vv = 1;
  } else if (xx < rmax) {
    double value = (xx - rmin) / (rmax - rmin) * M_PI;
    dd = -0.5 * sin(value) * M_PI / (rmax - rmin);
    vv = 0.5 * (cos(value) + 1);
  } else {
    dd = 0;
    vv = 0;
  }
}

inline void spline3_switch(double& vv,
                           double& dd,
                           const double& xx,
                           const double& rmin,
                           const double& rmax) {
  if (xx < rmin) {
    dd = 0;
    vv = 1;
  } else if (xx < rmax) {
    double uu = (xx - rmin) / (rmax - rmin);
    double du = 1. / (rmax - rmin);
    // s(u) = (1+2u)(1-u)^2
    // s'(u) = 2(2u+1)(u-1) + 2(u-1)^2
    vv = (1 + 2 * uu) * (1 - uu) * (1 - uu);
    dd = (2 * (2 * uu + 1) * (uu - 1) + 2 * (uu - 1) * (uu - 1)) * du;
  } else {
    dd = 0;
    vv = 0;
  }
}

template <typename FPTYPE>
inline void spline5_switch(FPTYPE& vv,
                           FPTYPE& dd,
                           const FPTYPE& xx,
                           const float& rmin,
                           const float& rmax) {
  if (xx < rmin) {
    dd = (FPTYPE)0.;
    vv = (FPTYPE)1.;
  } else if (xx < rmax) {
    FPTYPE uu = (xx - rmin) / (rmax - rmin);
    FPTYPE du = (FPTYPE)1. / (rmax - rmin);
    vv = uu * uu * uu *
             ((FPTYPE)-6. * uu * uu + (FPTYPE)15. * uu - (FPTYPE)10.) +
         (FPTYPE)1.;
    dd = ((FPTYPE)3. * uu * uu *
              ((FPTYPE)-6. * uu * uu + (FPTYPE)15. * uu - (FPTYPE)10.) +
          uu * uu * uu * ((FPTYPE)-12. * uu + (FPTYPE)15.)) *
         du;
  } else {
    dd = (FPTYPE)0.;
    vv = (FPTYPE)0.;
  }
}

}  // namespace deepmd