4 #include "aux/pairmatrix.h" 12 using TPairMatrixPtr = std::shared_ptr<TPairMatrix>;
31 std::array<AtomData::index_type, 2> atom_id;
37 void from_json(
const json& j, std::vector<CustomInteractionData>& interactions);
53 {{CombinationRuleType::UNDEFINED,
"undefined"},
54 {CombinationRuleType::ARITHMETIC,
"arithmetic"},
55 {CombinationRuleType::GEOMETRIC,
"geometric"},
56 {CombinationRuleType::LORENTZ_BERTHELOT,
"lorentz_berthelot"},
57 {CombinationRuleType::LORENTZ_BERTHELOT,
"LB"}})
62 struct PairPotentialException :
public std::runtime_error
64 explicit PairPotentialException(
const std::string& msg);
89 TPairMatrixPtr createPairMatrix(
const std::vector<AtomData>&
atoms);
91 TPairMatrixPtr createPairMatrix(
const std::vector<AtomData>& atoms,
92 const std::vector<CustomInteractionData>& interactions);
94 enum class CoefficientType
101 CoefficientType coefficient = CoefficientType::ANY);
104 inline static constexpr
double combUndefined(
double = 0.0,
double = 0.0)
106 return std::numeric_limits<double>::signaling_NaN();
109 inline static double combArithmetic(
double a,
double b) {
return 0.5 * (a + b); }
111 inline static double combGeometric(
double a,
double b) {
return std::sqrt(a * b); }
113 inline static double modIdentity(
double x) {
return x; }
115 inline static double modSquared(
double x) {
return x * x; }
140 bool isotropic =
true;
141 std::function<double(const Particle&)> selfEnergy =
nullptr;
142 virtual void to_json(
json&)
const = 0;
143 virtual void from_json(
const json&) = 0;
155 const Point& b_towards_a)
const;
165 virtual double operator()(
const Particle& particle_a,
const Particle& particle_b,
166 double squared_distance,
const Point& b_towards_a)
const = 0;
169 explicit PairPotential(std::string name = std::string(), std::string cite = std::string(),
170 bool isotropic =
true);
186 pairpotential::from_json(j, pair_potential);
187 return pair_potential;
202 std::shared_ptr<std::vector<CustomInteractionData>> custom_pairs =
203 std::make_shared<std::vector<CustomInteractionData>>();
207 initPairMatrices() = 0;
208 virtual void extractorsFromJson(
212 const std::string& name = std::string(),
const std::string& cite = std::string(),
214 bool isotropic =
true);
216 void from_json(
const json& j)
override;
217 void to_json(
json& j)
const override;
226 template <RequirePairPotential T1, RequirePairPotential T2>
235 const double squared_distance,
236 const Point& b_towards_a = {0, 0, 0})
const override 238 return first(particle_a, particle_b, squared_distance, b_towards_a) +
239 second(particle_a, particle_b, squared_distance, b_towards_a);
251 const double squared_distance,
252 const Point& b_towards_a)
const override 254 return first.force(particle_a, particle_b, squared_distance, b_towards_a) +
255 second.force(particle_a, particle_b, squared_distance, b_towards_a);
258 void from_json(
const json& j)
override 262 name = first.name +
"/" + second.name;
263 if (first.selfEnergy or second.selfEnergy) {
264 selfEnergy = [u1 = first.selfEnergy, u2 = second.selfEnergy](
const Particle& p) {
266 return u1(p) + u2(p);
275 selfEnergy =
nullptr;
279 void to_json(
json& j)
const override 281 assert(j.is_object());
282 auto& _j = j[
"default"] = json::array();
284 _j.push_back(second);
T1 first
First pair potential of type T1.
Definition: potentials_base.h:229
nlohmann::json json
JSON object.
Definition: json_support.h:10
Eigen::Vector3d Point
3D vector used for positions, velocities, forces etc.
Definition: coordinates.h:7
Exception for handling pair potential initialization.
Definition: potentials_base.h:76
CombinationRuleType
Known named combination rules for parameters of pair potential interaction.
Definition: potentials_base.h:45
Statically combines two pair potentials at compile-time.
Definition: potentials_base.h:227
double T
floating point size
Definition: units.h:73
Eigen::MatrixXd TPairMatrix
type of a matrix containing pair potential coefficients
Definition: potentials_base.h:11
std::function< double(double)> TModifierFunc
type of a function modifying combinator's output
Definition: potentials_base.h:22
Data for a custom (heterogeneous) interaction between two given atom types.
Definition: potentials_base.h:29
std::function< double(const InteractionData &)> TExtractorFunc
type of a function extracting a potential coefficient from the InteractionData, e.g., sigma or eps
Definition: potentials_base.h:16
std::vector< Faunus::AtomData > atoms
Global instance of atom list.
Definition: atomdata.cpp:242
std::function< double(double, double)> TCombinatorFunc
type of a function defining a combination rule of a heterogeneous pair interaction ...
Definition: potentials_base.h:19
A common ancestor for potentials that use parameter matrices computed from atomic properties and/or c...
Definition: potentials_base.h:198
std::string name
unique name per polymorphic call; used in FunctorPotential::combinePairPotentials ...
Definition: potentials_base.h:138
Particle class for storing positions, id, and other properties.
Definition: particle.h:220
json json_extra_params
pickled extra parameters like a coefficient names mapping
Definition: potentials_base.h:204
concept RequirePairPotential
Concept matching a particle pair potential derived from Potential::PairPotentialBase ...
Definition: potentials_base.h:180
Namespace for particle pair-potentials.
Definition: analysis.h:18
double operator()(const Particle &particle_a, const Particle &particle_b, const double squared_distance, const Point &b_towards_a={0, 0, 0}) const override
Combine pair energy.
Definition: potentials_base.h:234
NLOHMANN_JSON_SERIALIZE_ENUM(SpheroCylinderData::PatchType, {{SpheroCylinderData::PatchType::Invalid, nullptr}, {SpheroCylinderData::PatchType::Full, "full"}, {SpheroCylinderData::PatchType::Capped, "capped"}, {SpheroCylinderData::PatchType::None, "none"}}) class AtomData
General properties for atoms.
Definition: atomdata.h:61
void from_json(const json &j, PairPotential &base)
Serialize any pair potential from json.
Definition: potentials.cpp:258
auto makePairPotential(const json &j)
Convenience function to generate a pair potential initialized from JSON object.
Definition: potentials_base.h:183
Point force(const Particle &particle_a, const Particle &particle_b, const double squared_distance, const Point &b_towards_a) const override
Calculates force on particle a due to another particle, b.
Definition: potentials_base.h:250
Base for all pair-potentials.
Definition: potentials_base.h:131
std::string cite
Typically a short-doi litterature reference.
Definition: potentials_base.h:139
T2 second
Second pair potential of type T2.
Definition: potentials_base.h:230
A stub to hold various parameters of interactions.
Definition: atomdata.h:16