STORMM Source Documentation
Loading...
Searching...
No Matches
clash_detection.h
1// -*-c++-*-
2#ifndef STORMM_CLASH_DETECTION_H
3#define STORMM_CLASH_DETECTION_H
4
5#include "copyright.h"
6#include "Constants/behavior.h"
7#include "Constants/fixed_precision.h"
8#include "Constants/scaling.h"
9#include "DataTypes/common_types.h"
10#include "DataTypes/stormm_vector_types.h"
11#include "Math/rounding.h"
12#include "Math/series_ops.h"
13#include "Namelists/nml_minimize.h"
14#include "Potential/static_exclusionmask.h"
15#include "Reporting/error_format.h"
16#include "Synthesis/condensate.h"
17#include "Topology/atomgraph.h"
18#include "Topology/atomgraph_abstracts.h"
19#include "Trajectory/coordinateframe.h"
20#include "Trajectory/coordinate_series.h"
21#include "Trajectory/phasespace.h"
22#include "structure_enumerators.h"
23
24namespace stormm {
25namespace structure {
26
27using constants::PrecisionModel;
28using data_types::getStormmScalarTypeName;
29using data_types::isFloatingPointScalarType;
30using energy::StaticExclusionMask;
31using energy::StaticExclusionMaskReader;
32using energy::supertile_length;
33using energy::tile_length;
34using energy::tile_lengths_per_supertile;
35using stmath::roundUp;
36using stmath::indexingArray;
37using namelist::default_minimize_clash_ratio;
38using namelist::default_minimize_clash_r0;
39using numerics::globalpos_scale_nonoverflow_bits;
40using synthesis::Condensate;
41using synthesis::CondensateReader;
42using synthesis::PhaseSpaceSynthesis;
43using synthesis::PsSynthesisReader;
44using topology::AtomGraph;
45using topology::NonbondedKit;
46using topology::ValenceKit;
47using trajectory::CoordinateFrame;
48using trajectory::CoordinateFrameReader;
49using trajectory::CoordinateSeries;
50using trajectory::CoordinateSeriesReader;
51using trajectory::PhaseSpace;
52using trajectory::PhaseSpaceReader;
53
55constexpr int clash_direct_calculation_size_limit = 32;
56
59public:
60
64 ClashReport(double clash_distance_in = default_minimize_clash_r0,
65 double clash_ratio_in = default_minimize_clash_ratio,
66 const AtomGraph *ag_pointer_in = nullptr);
67
68 ClashReport(const AtomGraph *ag_pointer_in);
70
78 ClashReport(const ClashReport &original) = default;
79 ClashReport(ClashReport &&original) = default;
80 ClashReport& operator=(const ClashReport &original) = default;
81 ClashReport& operator=(ClashReport &&original) = default;
83
85 int getClashCount() const;
86
88 double getMinimumDistance() const;
89
91 double getMinimumSigmaRatio() const;
92
94 const AtomGraph* getTopologyPointer() const;
95
99 int2 getClashingPair(int index) const;
100
104 double getClashDistance(int index) const;
105
109 ClashKind getClashKind(int index) const;
110
124 std::string getClashDescription(int clash_index) const;
125
126 std::string getClashDescription(int clash_index, const CoordinateFrameReader &crd_object) const;
127
128 std::string getClashDescription(int clash_index, const CoordinateFrame &crd_object) const;
129
130 std::string getClashDescription(int clash_index, const CoordinateFrame *crd_object) const;
131
132 std::string getClashDescription(int clash_index, const PhaseSpaceReader &crd_object) const;
133
134 std::string getClashDescription(int clash_index, const PhaseSpace &crd_object) const;
135
136 std::string getClashDescription(int clash_index, const PhaseSpace *crd_object) const;
137
138 template <typename T>
139 std::string getClashDescription(int clash_index, const CoordinateSeriesReader<T> &crd_object,
140 int frame) const;
141
142 template <typename T>
143 std::string getClashDescription(int clash_index, const CoordinateSeries<T> &crd_object,
144 int frame) const;
145
146 template <typename T>
147 std::string getClashDescription(int clash_index, const CoordinateSeries<T> *crd_object,
148 int frame) const;
149
150 std::string getClashDescription(int clash_index, const PsSynthesisReader &crd_object,
151 int system_index) const;
152
153 std::string getClashDescription(int clash_index, const PhaseSpaceSynthesis &crd_object,
154 int system_index) const;
155
156 std::string getClashDescription(int clash_index, const PhaseSpaceSynthesis *crd_object,
157 int system_index) const;
158
159 std::string getClashDescription(int clash_index, const CondensateReader &crd_object,
160 int system_index) const;
161
162 std::string getClashDescription(int clash_index, const Condensate &crd_object,
163 int system_index) const;
164
165 std::string getClashDescription(int clash_index, const Condensate *crd_object,
166 int system_index) const;
168
174 void addClash(int atom_i, int atom_j, double distance_in);
175
177 void clear();
178
188 void setTopologyPointer(const AtomGraph *ag_pointer_in);
189 void setTopologyPointer(const AtomGraph &ag_in);
191
196 void setMinimumDistance(double clash_distance_in);
197
202 void setMinimumSigmaRatio(double clash_ratio_in);
203
204private:
205 int clash_count;
206 double clash_distance;
207 double clash_ratio;
208 std::vector<int2> pairs;
209 std::vector<double> distances;
210 std::vector<ClashKind> kinds;
211 AtomGraph* ag_pointer;
212
217 void validateClashIndex(int index) const;
218
220 void validateSystemIndex(int system_index, int system_count) const;
221
230 std::string atomPairCoordinates(double x_i, double y_i, double z_i, double x_j, double y_j,
231 double z_j) const;
232};
233
242template <typename Tcalc>
243Tcalc maxClashingDistance(const NonbondedKit<Tcalc> &nbk, const Tcalc elec_limit,
244 const Tcalc vdw_ratio);
245
260template <typename Tcoord, typename Tcalc>
261bool trivialClashCheck(const std::vector<Tcalc> &cachi_xcrd, const std::vector<Tcalc> &cachj_xcrd,
262 const std::vector<Tcalc> &cachi_ycrd, const std::vector<Tcalc> &cachj_ycrd,
263 const std::vector<Tcalc> &cachi_zcrd, const std::vector<Tcalc> &cachj_zcrd,
264 int ni_atoms, int nj_atoms, Tcalc max_clash);
265
279template <typename Tcoord, typename Tcalc>
280bool directClashTesting(const Tcoord* xcrd, const Tcoord* ycrd, const Tcoord* zcrd,
281 const NonbondedKit<Tcalc> &nbk, const StaticExclusionMaskReader &maskr,
282 Tcalc elec_limit = default_minimize_clash_r0,
283 Tcalc vdw_ratio = default_minimize_clash_ratio, Tcalc inv_scale = 1.0,
284 ClashReport *summary = nullptr);
285
296template <typename Tcoord>
297int3 clashGridDecomposition(const Tcoord* xcrd, const Tcoord* ycrd, const Tcoord* zcrd,
298 const int natom, double3 *grid_origin, double3 *grid_lengths);
299
323template <typename Tcoord, typename Tcalc>
324bool detectClash(const Tcoord* xcrd, const Tcoord* ycrd, const Tcoord* zcrd,
325 const ValenceKit<Tcalc> &vk, const NonbondedKit<Tcalc> &nbk,
326 const StaticExclusionMask *mask, Tcalc elec_limit = default_minimize_clash_r0,
327 Tcalc vdw_ratio = default_minimize_clash_ratio, Tcalc inv_scale = 1.0,
328 ClashReport *summary = nullptr);
329
330bool detectClash(const CoordinateFrameReader &cfr, const ValenceKit<double> &vk,
331 const NonbondedKit<double> &nbk, const StaticExclusionMask *mask,
332 double elec_limit = default_minimize_clash_r0,
333 double vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
334
335bool detectClash(const CoordinateFrame &cf, const AtomGraph &ag, const StaticExclusionMask &mask,
336 double elec_limit = default_minimize_clash_r0,
337 double vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
338
339bool detectClash(const CoordinateFrame *cf, const AtomGraph *ag, const StaticExclusionMask *mask,
340 double elec_limit = default_minimize_clash_r0,
341 double vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
342
343bool detectClash(const CoordinateFrame &cf, const AtomGraph &ag, const StaticExclusionMask &mask,
344 ClashReport *summary = nullptr);
345
346bool detectClash(const CoordinateFrame *cf, const AtomGraph *ag, const StaticExclusionMask *mask,
347 ClashReport *summary = nullptr);
348
349bool detectClash(const PhaseSpaceReader &psr, const ValenceKit<double> &vk,
350 const NonbondedKit<double> &nbk, const StaticExclusionMask *mask,
351 double elec_limit = default_minimize_clash_r0,
352 double vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
353
354bool detectClash(const PhaseSpace &ps, const AtomGraph &ag, const StaticExclusionMask &mask,
355 double elec_limit = default_minimize_clash_r0,
356 double vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
357
358bool detectClash(const PhaseSpace *ps, const AtomGraph *ag, const StaticExclusionMask *mask,
359 double elec_limit = default_minimize_clash_r0,
360 double vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
361
362bool detectClash(const PhaseSpace &ps, const AtomGraph &ag, const StaticExclusionMask &mask,
363 ClashReport *summary = nullptr);
364
365bool detectClash(const PhaseSpace *ps, const AtomGraph *ag, const StaticExclusionMask *mask,
366 ClashReport *summary = nullptr);
367
368template <typename Tcoord, typename Tcalc>
369bool detectClash(const CoordinateSeriesReader<Tcoord> &csr, size_t frame,
370 const ValenceKit<Tcalc> &vk, const NonbondedKit<Tcalc> &nbk,
371 const StaticExclusionMask *mask, Tcalc elec_limit = default_minimize_clash_r0,
372 Tcalc vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
373
374template <typename Tcoord, typename Tcalc>
375bool detectClash(const CoordinateSeries<Tcoord> *cs, int frame, const AtomGraph *ag,
376 const StaticExclusionMask *mask, Tcalc elec_limit = default_minimize_clash_r0,
377 Tcalc vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
378
379template <typename Tcoord, typename Tcalc>
380bool detectClash(const CoordinateSeries<Tcoord> &cs, int frame, const AtomGraph &ag,
381 const StaticExclusionMask &mask, Tcalc elec_limit = default_minimize_clash_r0,
382 Tcalc vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
383
384template <typename Tcoord, typename Tcalc>
385bool detectClash(const CoordinateSeries<Tcoord> *cs, const int frame, const AtomGraph *ag,
386 const StaticExclusionMask *mask, ClashReport *summary = nullptr);
387
388template <typename Tcoord, typename Tcalc>
389bool detectClash(const CoordinateSeries<Tcoord> &cs, const int frame, const AtomGraph &ag,
390 const StaticExclusionMask &mask, ClashReport *summary = nullptr);
391
392template <typename Tcalc>
393bool detectClash(const PsSynthesisReader &poly_psr, const int system_index,
394 const ValenceKit<Tcalc> &vk, const NonbondedKit<Tcalc> &nbk,
395 const StaticExclusionMask *mask, const Tcalc elec_limit, const Tcalc vdw_ratio,
396 ClashReport *summary = nullptr);
397
398template <typename Tcalc>
399bool detectClash(const PhaseSpaceSynthesis *poly_ps, const int system_index,
400 const StaticExclusionMask *mask, const Tcalc elec_limit, const Tcalc vdw_ratio,
401 ClashReport *summary = nullptr);
402
403template <typename Tcalc>
404bool detectClash(const PhaseSpaceSynthesis &poly_ps, const int system_index,
405 const StaticExclusionMask *mask, const Tcalc elec_limit, const Tcalc vdw_ratio,
406 ClashReport *summary = nullptr);
407
408template <typename Tcalc>
409bool detectClash(const PhaseSpaceSynthesis *poly_ps, const int system_index,
410 const StaticExclusionMask *mask, ClashReport *summary = nullptr);
411
412template <typename Tcalc>
413bool detectClash(const PhaseSpaceSynthesis &poly_ps, const int system_index,
414 const StaticExclusionMask *mask, ClashReport *summary = nullptr);
415
416template <typename Tcalc>
417bool detectClash(const CondensateReader &cdnsr, const int system_index,
418 const ValenceKit<Tcalc> &vk, const NonbondedKit<Tcalc> &nbk,
419 const StaticExclusionMask *mask, Tcalc elec_limit = default_minimize_clash_r0,
420 Tcalc vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
421
422template <typename Tcalc>
423bool detectClash(const Condensate *cdns, const int system_index, const AtomGraph *ag,
424 const StaticExclusionMask *mask, double elec_limit = default_minimize_clash_r0,
425 double vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
426
427template <typename Tcalc>
428bool detectClash(const Condensate &cdns, const int system_index, const AtomGraph &ag,
429 const StaticExclusionMask &mask, double elec_limit = default_minimize_clash_r0,
430 double vdw_ratio = default_minimize_clash_ratio, ClashReport *summary = nullptr);
431
432template <typename Tcalc>
433bool detectClash(const Condensate *cdns, const int system_index, const AtomGraph *ag,
434 const StaticExclusionMask *mask, ClashReport *summary = nullptr);
435
436template <typename Tcalc>
437bool detectClash(const Condensate &cdns, const int system_index, const AtomGraph &ag,
438 const StaticExclusionMask &mask, ClashReport *summary = nullptr);
440
441} // namespace structure
442} // namespace stormm
443
444#include "clash_detection.tpp"
445
446#endif
A simple pair list for an all-to-all calculation with exclusion masks. The list stores masks for 16 x...
Definition static_exclusionmask.h:81
An object for listing the clashes between atoms of a system.
Definition clash_detection.h:58
int getClashCount() const
Get the number of detected clashes.
Definition clash_detection.cpp:28
int2 getClashingPair(int index) const
Get one of the clashing pairs of atoms.
Definition clash_detection.cpp:48
double getClashDistance(int index) const
Get the distance at which two particles clash.
Definition clash_detection.cpp:54
ClashKind getClashKind(int index) const
Get the type of clash made by two particles.
Definition clash_detection.cpp:60
void addClash(int atom_i, int atom_j, double distance_in)
Add notes about a clash between two particles.
Definition clash_detection.cpp:205
double getMinimumSigmaRatio() const
Get the minimum ratio of inter-particle distance to the pairwise sigma parameter.
Definition clash_detection.cpp:38
const AtomGraph * getTopologyPointer() const
Get a const pointer to the topology describing the system.
Definition clash_detection.cpp:43
ClashReport(const ClashReport &original)=default
Copy and move constructors, as well as copy and move assignment operators, can all take their default...
double getMinimumDistance() const
Get the minimum clash distance.
Definition clash_detection.cpp:33
void setMinimumSigmaRatio(double clash_ratio_in)
Set the minimum ratio of interparticle distance to the pairwise sigma value, below which a clash is d...
Definition clash_detection.cpp:249
void clear()
Clear the clashes to recompile the report.
Definition clash_detection.cpp:226
std::string getClashDescription(int clash_index) const
Produce a string describing the atoms, indices, and relevant names of one of the clashes catalogged i...
Definition clash_detection.cpp:66
ClashReport(double clash_distance_in=default_minimize_clash_r0, double clash_ratio_in=default_minimize_clash_ratio, const AtomGraph *ag_pointer_in=nullptr)
The constructor accepts optional parameters for the clash parameters, or just a pointer to the desire...
Definition clash_detection.cpp:16
void setMinimumDistance(double clash_distance_in)
Set the minimum absolute distance for two particles' separation before a clash is declared.
Definition clash_detection.cpp:244
void setTopologyPointer(const AtomGraph *ag_pointer_in)
Set the topology that the clash report shall use.
Definition clash_detection.cpp:234
Condense the data format, and possibly offer a reduced representation of coordinates,...
Definition condensate.h:146
A fixed-precision representation of coordinates, velocities, and forces to manage a set of simulation...
Definition phasespace_synthesis.h:325
A struct to hold information relating to an Amber topology. This struct's member functions are limite...
Definition atomgraph.h:50
Store the coordinates and box information for a frame, only. This abridged struct can serve when the ...
Definition coordinateframe.h:111
Store the coordinates and box information for a series of frames, in one of several levels of precisi...
Definition coordinate_series.h:137
An object to complement a topology and hold positions, velocities, and forces of all particles in a s...
Definition phasespace.h:141
Definition stormm_vector_types.h:117
Definition stormm_vector_types.h:22
Definition stormm_vector_types.h:27
The abstract for a StaticExclusionMask object, read-only due to the const-ness of the data() member f...
Definition static_exclusionmask.h:45
Read-only abstract for the Condensate class. In most cases, the read-only abstract will be preferred ...
Definition condensate.h:102
The reader for a PhaseSpaceSynthesis object, containing all of the data relevant for propagating dyna...
Definition phasespace_synthesis.h:199
Information needed for non-bonded real-space calculations. Templating is used as above,...
Definition atomgraph_abstracts.h:287
Information need for bonded calculations. Templating is used to serve either of two levels of precisi...
Definition atomgraph_abstracts.h:88
Collect C-style pointers for the elements of a read-only CoordinateFrame object.
Definition coordinateframe.h:65
Collect C-style pointers and critical constants for a read-only CoordinateSeries object.
Definition coordinate_series.h:96
Collect constants and pointers to the components of a read-only PhaseSpace object.
Definition phasespace.h:81