5 #include <spdlog/spdlog.h> 8 using Matrix3d = Matrix<double, 3, 3>;
9 using Quaterniond = Quaternion<double>;
20 virtual void to_json(
json& j)
const = 0;
21 virtual void from_json(
const json& j) = 0;
22 void rotate(
const Eigen::Quaterniond& q,
const Eigen::Matrix3d&);
26 template <
typename... Ts>
auto to_json(
json&) ->
typename std::enable_if<
sizeof...(Ts) == 0>::type
30 template <
typename T,
typename... Ts>
34 to_json<Ts...>(j, rest...);
38 template <
typename... Ts>
39 auto from_json(
const json&) ->
typename std::enable_if<
sizeof...(Ts) == 0>::type
43 template <
typename T,
typename... Ts>
47 from_json<Ts...>(j, rest...);
53 void to_json(
json& j)
const override;
54 void from_json(
const json& j)
override;
56 template <
class Archive>
void serialize(Archive& archive) { archive(radius); }
58 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
64 void to_json(
json& j)
const override;
65 void from_json(
const json& j)
override;
67 template <
class Archive>
void serialize(Archive& archive) { archive(charge); }
69 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
79 void rotate(
const Eigen::Quaterniond& q,
const Eigen::Matrix3d&);
80 void to_json(
json& j)
const override;
81 void from_json(
const json& j)
override;
82 bool isDipolar()
const;
84 template <
class Archive>
void serialize(Archive& archive) { archive(mu, mulen); }
86 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
94 void rotate(
const Eigen::Quaterniond& q,
95 const Eigen::Matrix3d& m);
96 void to_json(
json& j)
const override;
97 void from_json(
const json& j)
override;
98 bool isPolarizable()
const;
100 template <
class Archive>
void serialize(Archive& archive) { archive(mui, muilen, alpha); }
102 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
108 void rotate(
const Eigen::Quaterniond& q,
109 const Eigen::Matrix3d& m);
110 void to_json(
json& j)
const override;
111 void from_json(
const json& j)
override;
112 bool isQuadrupolar()
const;
114 template <
class Archive>
void serialize(Archive& archive) { archive(Q); }
116 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
126 using string_t = nlohmann::basic_json<>::string_t;
129 std::array<Point, 2> patchsides;
130 double half_length = 0.0;
131 double pcanglsw = 0.0;
133 void rotate(
const Eigen::Quaterniond& quaternion,
134 const Eigen::Matrix3d& rotation_matrix);
135 void to_json(
json& j)
const override;
136 void from_json(
const json& j)
override;
139 const Point& new_patch_direction);
141 template <
class Archive>
void serialize(Archive& archive)
143 archive(scdir, patchdir, patchsides.at(0), patchsides.at(1));
146 bool isCylindrical()
const;
148 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
164 template <
typename... Ts>
165 auto _rotate(
const Eigen::Quaterniond&,
const Eigen::Matrix3d&) ->
166 typename std::enable_if<
sizeof...(Ts) == 0>::type
170 template <
typename T,
typename... Ts>
171 void _rotate(
const Eigen::Quaterniond& q,
const Eigen::Matrix3d& m,
T& a, Ts&... rest)
174 _rotate<Ts...>(q, m, rest...);
179 : Properties()... {};
184 *
this =
json(a).front();
187 void rotate(
const Eigen::Quaterniond& q,
const Eigen::Matrix3d& m)
189 _rotate<Properties...>(q, m,
dynamic_cast<Properties&
>(*this)...);
192 template <
class Archive>
void serialize(Archive& archive)
194 __serialize<Properties...>(archive,
dynamic_cast<Properties&
>(*this)...);
197 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
202 to_json<Properties...>(j, Properties(a)...);
207 from_json<Properties...>(j,
dynamic_cast<Properties&
>(a)...);
224 std::unique_ptr<ParticleExtension>
ext;
234 const AtomData& traits()
const;
235 void rotate(
const Eigen::Quaterniond& quaternion,
236 const Eigen::Matrix3d& rotation_matrix);
237 bool hasExtension()
const;
238 ParticleExtension& createExtension();
242 return ext ? *ext : createExtension();
258 std::ranges::range<T> && std::is_convertible_v<std::ranges::range_value_t<T>,
Particle>;
261 concept RequireParticleIterator = std::is_convertible_v<std::iter_value_t<T>, Particle>;
263 void from_json(
const json&, Particle&);
264 void to_json(
json&,
const Particle&);
272 template <RequireParticleIterator Iterator>
275 size_t mismatch_counter = 0;
276 std::for_each(first, last, [&](Particle& particle) {
278 if (std::fabs(topology_charge - particle.
charge) > max_difference) {
279 particle.
charge = topology_charge;
283 if (mismatch_counter > 0) {
284 faunus_logger->debug(
"{} charge(s) reset with topology values (from atomlist)",
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
Base class for particle properties.
Definition: particle.h:18
Tensor class Tensor class.
Definition: tensor.h:10
Radius property.
Definition: particle.h:50
double T
floating point size
Definition: units.h:73
void rotate(const Eigen::Quaterniond &q, const Eigen::Matrix3d &m)
Rotate all internal coordinates if needed.
Definition: particle.h:187
concept RequireParticles
Concept for a range of particles.
Definition: particle.h:257
ParticleExtension & getExt()
get/create extension
Definition: particle.h:240
Static properties for patchy sphero cylinders (PSC)
Definition: atomdata.h:36
Definition: eigensupport.h:8
virtual void to_json(json &j) const =0
Convert to JSON object.
virtual void from_json(const json &j)=0
Convert from JSON object.
std::vector< Faunus::AtomData > atoms
Global instance of atom list.
Definition: atomdata.cpp:242
Patchy sphero cylinder a.k.a.Sphero-cylinder properties.
Definition: particle.h:122
Particle template.
Definition: particle.h:160
std::unique_ptr< ParticleExtension > ext
Point to extended properties.
Definition: particle.h:224
std::vector< Particle > ParticleVector
Storage type for collections of particles.
Definition: particle.h:253
int id
Particle id/type.
Definition: particle.h:225
Charge (monopole) property.
Definition: particle.h:61
const ParticleExtension & getExt() const
Get extended particle properties;.
Definition: particle.h:245
Particle class for storing positions, id, and other properties.
Definition: particle.h:220
Definition: particle.h:105
Cell list class templates.
Definition: actions.cpp:11
double charge
Particle charge.
Definition: particle.h:226
Dipole properties.
Definition: particle.h:75
Definition: particle.h:89
void applyAtomDataCharges(Iterator first, Iterator last, const double max_difference=1e-9)
Reset all charges in particle range to those found in Faunus::atoms.
Definition: particle.h:273