24 {RegionType::WITHIN_MOLID,
"within_molid"},
25 {RegionType::WITHIN_PARTICLE,
"around_particle"},
26 {RegionType::WITHIN_ELLIPSOID,
"ellipsoid"}})
39 [[nodiscard]]
virtual bool 40 isInside(
const Point& position)
const = 0;
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);
50 inside(
const Particle& particle)
const;
51 [[nodiscard]]
bool inside(
const Group& group)
const;
54 template <
typename ParticleRange>
auto filterInside(
const ParticleRange& particles)
const 56 namespace rv = std::views;
57 return particles | rv::transform(&
Particle::pos) | rv::filter(&RegionBase::isInside);
66 void to_json(
json& j,
const RegionBase& region);
81 const MoleculeData::index_type molid;
82 const bool use_region_mass_center;
83 const double threshold_squared;
85 [[nodiscard]]
inline bool within_threshold(
const Point& position1,
const Point& position2)
const 87 return spc.
geometry.
sqdist(position1, position2) < threshold_squared;
92 bool use_region_mass_center,
bool use_group_mass_center);
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;
106 const ParticleVector::size_type
108 const double radius_squared;
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;
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;
131 const Point& reference_position_1;
132 const Point& reference_position_2;
134 [[nodiscard]] std::pair<Point, Point> getEllipsoidPositionAndDirection()
const;
138 ParticleVector::size_type particle_index2,
double parallel_radius,
139 double perpendicular_radius,
bool use_group_mass_center);
141 [[nodiscard]]
bool isInside(
const Point& position)
const override;
142 void to_json(
json& j)
const override;
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