faunus
regions.h
1 #pragma once
2 #include "core.h"
3 #include "molecule.h"
4 #include "group.h"
5 #include "space.h"
6 
7 namespace Faunus {
8 class Space;
9 
13 namespace Region {
14 
15 enum class RegionType
16 {
17  WITHIN_MOLID,
18  WITHIN_PARTICLE,
19  WITHIN_ELLIPSOID,
20  INVALID
21 };
22 
23 NLOHMANN_JSON_SERIALIZE_ENUM(RegionType, {{RegionType::INVALID, nullptr},
24  {RegionType::WITHIN_MOLID, "within_molid"},
25  {RegionType::WITHIN_PARTICLE, "around_particle"},
26  {RegionType::WITHIN_ELLIPSOID, "ellipsoid"}})
27 
36 class RegionBase
37 {
38  private:
39  [[nodiscard]] virtual bool
40  isInside(const Point& position) const = 0;
41  public:
42  const RegionType type;
43  bool use_group_mass_center = false;
44  [[nodiscard]] virtual std::optional<double> volume() const;
45  virtual void to_json(json& j) const = 0;
46  virtual ~RegionBase() = default;
47  explicit RegionBase(RegionType type);
48 
49  [[nodiscard]] bool
50  inside(const Particle& particle) const;
51  [[nodiscard]] bool inside(const Group& group) const;
52 
54  template <typename ParticleRange> auto filterInside(const ParticleRange& particles) const
55  {
56  namespace rv = std::views;
57  return particles | rv::transform(&Particle::pos) | rv::filter(&RegionBase::isInside);
58  }
59 };
60 
64 std::unique_ptr<RegionBase> createRegion(const Space& spc, const json& j);
65 
66 void to_json(json& j, const RegionBase& region);
67 
77 class WithinMoleculeType : public RegionBase
78 {
79  private:
80  const Space& spc;
81  const MoleculeData::index_type molid;
82  const bool use_region_mass_center;
83  const double threshold_squared;
84 
85  [[nodiscard]] inline bool within_threshold(const Point& position1, const Point& position2) const
86  {
87  return spc.geometry.sqdist(position1, position2) < threshold_squared;
88  }
89 
90  public:
91  WithinMoleculeType(const Space& spc, std::string_view molecule_name, double threshold,
92  bool use_region_mass_center, bool use_group_mass_center);
93  WithinMoleculeType(const Space& spc, const json& j);
94  [[nodiscard]] bool isInside(const Point& position) const override;
95  [[nodiscard]] std::optional<double> volume() const override;
96  void to_json(json& j) const override;
97 };
98 
102 class SphereAroundParticle : public RegionBase
103 {
104  private:
105  const Space& spc;
106  const ParticleVector::size_type
107  particle_index;
108  const double radius_squared;
109 
110  public:
111  SphereAroundParticle(const Space& spc, ParticleVector::size_type index, double radius);
112  SphereAroundParticle(const Space& spc, const json& j);
113  [[nodiscard]] bool isInside(const Point& position) const override;
114  [[nodiscard]] std::optional<double> volume() const override;
115  void to_json(json& j) const override;
116 };
117 
121 class MovingEllipsoid : public RegionBase
122 {
123  private:
124  const Space& spc;
125  const ParticleVector::size_type particle_index_1;
126  const ParticleVector::size_type particle_index_2;
127  const double parallel_radius;
128  const double perpendicular_radius;
129  const double parallel_radius_squared;
130 
131  const Point& reference_position_1;
132  const Point& reference_position_2;
133 
134  [[nodiscard]] std::pair<Point, Point> getEllipsoidPositionAndDirection() const;
135 
136  public:
137  MovingEllipsoid(const Space& spc, ParticleVector::size_type particle_index1,
138  ParticleVector::size_type particle_index2, double parallel_radius,
139  double perpendicular_radius, bool use_group_mass_center);
140  MovingEllipsoid(const Space& spc, const json& j);
141  [[nodiscard]] bool isInside(const Point& position) const override;
142  void to_json(json& j) const override;
143 };
144 
145 } // namespace Region
146 } // namespace Faunus
An ellipsoid defined by two (moving) particles.
Definition: regions.h:121
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
Point pos
Particle position vector.
Definition: particle.h:227
double sqdist(const Point &, const Point &) const
(Minimum) squared distance between two points
Definition: geometry.h:460
std::unique_ptr< RegionBase > createRegion(const Space &spc, const json &j)
Expects an object where KEY is an arbitrary, user-defined name and the VALUE is another object defini...
Definition: regions.cpp:47
Within a spherical cutoff distance from a molecule type.
Definition: regions.h:77
Spherical region centered on a particle.
Definition: regions.h:102
GeometryType geometry
Container geometry (boundaries, shape, volume)
Definition: space.h:122
Particle class for storing positions, id, and other properties.
Definition: particle.h:220
Cell list class templates.
Definition: actions.cpp:11
End of Group class.
Definition: group.h:177
NLOHMANN_JSON_SERIALIZE_ENUM(RegionType, {{RegionType::INVALID, nullptr}, {RegionType::WITHIN_MOLID, "within_molid"}, {RegionType::WITHIN_PARTICLE, "around_particle"}, {RegionType::WITHIN_ELLIPSOID, "ellipsoid"}}) class RegionBase
Base class for defining sub-spaces of a simulation.
Definition: regions.h:23
Placeholder for atoms and molecules.
Definition: space.h:92