STORMM Source Documentation
Loading...
Searching...
No Matches
restraint_apparatus.h
1// -*-c++-*-
2#ifndef STORMM_RESTRAINT_APPARATUS_H
3#define STORMM_RESTRAINT_APPARATUS_H
4
5#include "copyright.h"
6#include "Accelerator/hybrid.h"
7#include "Topology/atomgraph.h"
8#include "bounded_restraint.h"
9
10namespace stormm {
11namespace restraints {
12
13using card::Hybrid;
14using card::HybridTargetLevel;
15using topology::AtomGraph;
16
18enum class RestraintStage {
19 INITIAL,
21 FINAL
23};
24
27template <typename T, typename T2, typename T4>
29
31 explicit RestraintKit(int total_rst_in, int nposn_in, int nbond_in, int nangl_in,
32 int ndihe_in, bool time_dependence_in, const int* rposn_atoms_in,
33 const int* rbond_i_atoms_in, const int* rbond_j_atoms_in,
34 const int* rangl_i_atoms_in, const int* rangl_j_atoms_in,
35 const int* rangl_k_atoms_in, const int* rdihe_i_atoms_in,
36 const int* rdihe_j_atoms_in, const int* rdihe_k_atoms_in,
37 const int* rdihe_l_atoms_in, const int* rposn_init_step_in,
38 const int* rposn_finl_step_in, const int* rbond_init_step_in,
39 const int* rbond_finl_step_in, const int* rangl_init_step_in,
40 const int* rangl_finl_step_in, const int* rdihe_init_step_in,
41 const int* rdihe_finl_step_in, const T2* rposn_init_keq_in,
42 const T2* rposn_finl_keq_in, const T2* rposn_init_xy_in,
43 const T2* rposn_finl_xy_in, const T* rposn_init_z_in,
44 const T* rposn_finl_z_in, const T2* rbond_init_keq_in,
45 const T2* rbond_finl_keq_in, const T2* rangl_init_keq_in,
46 const T2* rangl_finl_keq_in, const T2* rdihe_init_keq_in,
47 const T2* rdihe_finl_keq_in, const T4* rposn_init_r_in,
48 const T4* rposn_finl_r_in, const T4* rbond_init_r_in,
49 const T4* rbond_finl_r_in, const T4* rangl_init_r_in,
50 const T4* rangl_finl_r_in, const T4* rdihe_init_r_in,
51 const T4* rdihe_finl_r_in, const AtomGraph *ag_pointer_in);
52
56 RestraintKit(const RestraintKit &original) = default;
57 RestraintKit(RestraintKit &&other) = default;
59
60 const int total_rst;
61 const int nposn;
62 const int nbond;
63 const int nangl;
64 const int ndihe;
65 const bool time_dependence;
66 const int* rposn_atoms;
67 const int* rbond_i_atoms;
68 const int* rbond_j_atoms;
69 const int* rangl_i_atoms;
70 const int* rangl_j_atoms;
71 const int* rangl_k_atoms;
72 const int* rdihe_i_atoms;
73 const int* rdihe_j_atoms;
74 const int* rdihe_k_atoms;
75 const int* rdihe_l_atoms;
76 const int* rposn_init_step;
77 const int* rposn_finl_step;
78 const int* rbond_init_step;
79 const int* rbond_finl_step;
80 const int* rangl_init_step;
81 const int* rangl_finl_step;
82 const int* rdihe_init_step;
83 const int* rdihe_finl_step;
84 const T2* rposn_init_keq;
85 const T2* rposn_finl_keq;
86 const T2* rposn_init_xy;
87 const T2* rposn_finl_xy;
88 const T* rposn_init_z;
89 const T* rposn_finl_z;
90 const T2* rbond_init_keq;
91 const T2* rbond_finl_keq;
92 const T2* rangl_init_keq;
93 const T2* rangl_finl_keq;
94 const T2* rdihe_init_keq;
95 const T2* rdihe_finl_keq;
96 const T4* rposn_init_r;
97 const T4* rposn_finl_r;
98 const T4* rbond_init_r;
99 const T4* rbond_finl_r;
100 const T4* rangl_init_r;
101 const T4* rangl_finl_r;
102 const T4* rdihe_init_r;
103 const T4* rdihe_finl_r;
105};
106
110public:
111
125 RestraintApparatus(const AtomGraph *ag_in = nullptr);
126 RestraintApparatus(const std::vector<BoundedRestraint> &rbasis,
127 const AtomGraph *ag_in = nullptr);
129
133 RestraintApparatus(const RestraintApparatus &original);
134
139
144
149
151 int getTotalRestraintCount() const;
152
154 int getPositionalRestraintCount() const;
155
157 int getDistanceRestraintCount() const;
158
160 int getAngleRestraintCount() const;
161
163 int getDihedralRestraintCount() const;
164
166 bool getTimeDependence() const;
167
169 const AtomGraph* getTopologyPointer() const;
170
175 dpData(HybridTargetLevel tier = HybridTargetLevel::HOST) const;
176
181 spData(HybridTargetLevel tier = HybridTargetLevel::HOST) const;
182
185 const int* getApplicationStepPointer(int order, RestraintStage stage,
186 HybridTargetLevel tier = HybridTargetLevel::HOST) const;
187
190 const double2*
191 getHarmonicStiffnessPointer(int order, RestraintStage stage,
192 HybridTargetLevel tier = HybridTargetLevel::HOST) const;
193
196 const double4* getDisplacementPointer(int order, RestraintStage stage,
197 HybridTargetLevel tier = HybridTargetLevel::HOST) const;
198
201 std::vector<BoundedRestraint> getRestraintList() const;
202
205 const RestraintApparatus* getSelfPointer() const;
206
215 void addRestraints(const std::vector<BoundedRestraint> &new_rest);
216 void addRestraint(const BoundedRestraint &new_rest);
218
219private:
220
221 // Overall counts and items of interest
222 int total_restraint_count;
223 int position_count;
224 int distance_count;
225 int angle_count;
226 int dihedral_count;
227 bool time_based_restraints;
231
232 // Integer data
233 Hybrid<int> rposn_atoms;
234 Hybrid<int> rbond_i_atoms;
235 Hybrid<int> rbond_j_atoms;
236 Hybrid<int> rangl_i_atoms;
237 Hybrid<int> rangl_j_atoms;
238 Hybrid<int> rangl_k_atoms;
239 Hybrid<int> rdihe_i_atoms;
240 Hybrid<int> rdihe_j_atoms;
241 Hybrid<int> rdihe_k_atoms;
242 Hybrid<int> rdihe_l_atoms;
243 Hybrid<int> rposn_init_step;
244 Hybrid<int> rposn_final_step;
245 Hybrid<int> rbond_init_step;
246 Hybrid<int> rbond_final_step;
247 Hybrid<int> rangl_init_step;
248 Hybrid<int> rangl_final_step;
249 Hybrid<int> rdihe_init_step;
250 Hybrid<int> rdihe_final_step;
251 Hybrid<int> int_data;
252
253 // Real data in double-precision format
254 Hybrid<double2> rposn_init_keq;
257 Hybrid<double2> rposn_final_keq;
259 Hybrid<double4> rposn_init_r;
262 Hybrid<double4> rposn_final_r;
264 Hybrid<double2> rposn_init_xy;
267 Hybrid<double> rposn_init_z;
270 Hybrid<double2> rposn_final_xy;
273 Hybrid<double> rposn_final_z;
276 Hybrid<double2> rbond_init_keq;
278 Hybrid<double2> rbond_final_keq;
280 Hybrid<double4> rbond_init_r;
283 Hybrid<double4> rbond_final_r;
285 Hybrid<double2> rangl_init_keq;
287 Hybrid<double2> rangl_final_keq;
289 Hybrid<double4> rangl_init_r;
291 Hybrid<double4> rangl_final_r;
293 Hybrid<double2> rdihe_init_keq;
295 Hybrid<double2> rdihe_final_keq;
297 Hybrid<double4> rdihe_init_r;
300 Hybrid<double4> rdihe_final_r;
302 Hybrid<double> double_data;
303 Hybrid<double2> double2_data;
305 Hybrid<double4> double4_data;
306
307 // Real data in single-precision format
308 Hybrid<float2> sp_rposn_init_keq;
311 Hybrid<float2> sp_rposn_final_keq;
313 Hybrid<float4> sp_rposn_init_r;
316 Hybrid<float4> sp_rposn_final_r;
318 Hybrid<float2> sp_rposn_init_xy;
321 Hybrid<float> sp_rposn_init_z;
324 Hybrid<float2> sp_rposn_final_xy;
327 Hybrid<float> sp_rposn_final_z;
330 Hybrid<float2> sp_rbond_init_keq;
333 Hybrid<float2> sp_rbond_final_keq;
335 Hybrid<float4> sp_rbond_init_r;
338 Hybrid<float4> sp_rbond_final_r;
340 Hybrid<float2> sp_rangl_init_keq;
342 Hybrid<float2> sp_rangl_final_keq;
344 Hybrid<float4> sp_rangl_init_r;
347 Hybrid<float4> sp_rangl_final_r;
349 Hybrid<float2> sp_rdihe_init_keq;
352 Hybrid<float2> sp_rdihe_final_keq;
354 Hybrid<float4> sp_rdihe_init_r;
357 Hybrid<float4> sp_rdihe_final_r;
359 Hybrid<float> float_data;
360 Hybrid<float2> float2_data;
362 Hybrid<float4> float4_data;
363
366 const AtomGraph *ag_pointer;
367
371 void checkTopologyPointers(const std::vector<BoundedRestraint> &rbasis);
372
377 void allocate();
378
385 void populateInternalArrays(const std::vector<BoundedRestraint> &rbasis);
386
403 bool assessTimeDependence(int* init_steps, int* final_steps, int nrest);
404 void assessTimeDependence();
406};
407
412std::vector<RestraintApparatus>
413createBlankRestraintApparatus(const std::vector<AtomGraph*> ags);
414
415} // namespace restraints
416} // namespace stormm
417
418#include "restraint_apparatus.tpp"
419
420#endif
An evolution of GpuBuffer in pmemd.cuda, the Composite array has elements that are accessible from ei...
Definition hybrid.h:202
RestraintApparatus(const AtomGraph *ag_in=nullptr)
The constructor takes a vector of individual restraints.
Definition restraint_apparatus.cpp:15
int getDistanceRestraintCount() const
Get the number of distance restraints.
Definition restraint_apparatus.cpp:458
RestraintKit< double, double2, double4 > dpData(HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get a double-precision abstract of this apparatus.
Definition restraint_apparatus.cpp:484
RestraintKit< float, float2, float4 > spData(HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get a single-precision abstract of this apparatus.
Definition restraint_apparatus.cpp:512
RestraintApparatus & operator=(const RestraintApparatus &other)
Copy assignment operator.
Definition restraint_apparatus.cpp:203
std::vector< BoundedRestraint > getRestraintList() const
Produce a vector of all the restraints in this apparatus, essentially the inverse of the constructor.
Definition restraint_apparatus.cpp:638
int getPositionalRestraintCount() const
Get the number of positional restraints.
Definition restraint_apparatus.cpp:453
int getAngleRestraintCount() const
Get the number of angle restraints.
Definition restraint_apparatus.cpp:463
const double4 * getDisplacementPointer(int order, RestraintStage stage, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get a double-precision pointer into one of the displacement r(1,2,3,4) parameter arrays,...
Definition restraint_apparatus.cpp:605
const RestraintApparatus * getSelfPointer() const
Get a const pointer to the object itself, in case the object has been passed by const reference.
Definition restraint_apparatus.cpp:695
const double2 * getHarmonicStiffnessPointer(int order, RestraintStage stage, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get a double-precision pointer into one of the restraint k(2,3) parameter arrays, specified by the or...
Definition restraint_apparatus.cpp:573
void addRestraints(const std::vector< BoundedRestraint > &new_rest)
Add restraints to the apparatus.
Definition restraint_apparatus.cpp:700
int getDihedralRestraintCount() const
Get the number of dihedral restraints.
Definition restraint_apparatus.cpp:468
const AtomGraph * getTopologyPointer() const
Get a pointer to the topology that this restraint collection supplements.
Definition restraint_apparatus.cpp:478
RestraintApparatus(const AtomGraph *ag_in=nullptr)
The constructor takes a vector of individual restraints.
Definition restraint_apparatus.cpp:15
bool getTimeDependence() const
Get an indication of whether this apparatus uses time-dependent restraints.
Definition restraint_apparatus.cpp:473
int getTotalRestraintCount() const
Get the total number of restraints in this apparatus.
Definition restraint_apparatus.cpp:448
const int * getApplicationStepPointer(int order, RestraintStage stage, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get an integer pointer into one of the restraint initial or final application step parameter arrays,...
Definition restraint_apparatus.cpp:539
A struct to hold information relating to an Amber topology. This struct's member functions are limite...
Definition atomgraph.h:50
Definition stormm_vector_types.h:112
Definition stormm_vector_types.h:123
RestraintKit(int total_rst_in, int nposn_in, int nbond_in, int nangl_in, int ndihe_in, bool time_dependence_in, const int *rposn_atoms_in, const int *rbond_i_atoms_in, const int *rbond_j_atoms_in, const int *rangl_i_atoms_in, const int *rangl_j_atoms_in, const int *rangl_k_atoms_in, const int *rdihe_i_atoms_in, const int *rdihe_j_atoms_in, const int *rdihe_k_atoms_in, const int *rdihe_l_atoms_in, const int *rposn_init_step_in, const int *rposn_finl_step_in, const int *rbond_init_step_in, const int *rbond_finl_step_in, const int *rangl_init_step_in, const int *rangl_finl_step_in, const int *rdihe_init_step_in, const int *rdihe_finl_step_in, const T2 *rposn_init_keq_in, const T2 *rposn_finl_keq_in, const T2 *rposn_init_xy_in, const T2 *rposn_finl_xy_in, const T *rposn_init_z_in, const T *rposn_finl_z_in, const T2 *rbond_init_keq_in, const T2 *rbond_finl_keq_in, const T2 *rangl_init_keq_in, const T2 *rangl_finl_keq_in, const T2 *rdihe_init_keq_in, const T2 *rdihe_finl_keq_in, const T4 *rposn_init_r_in, const T4 *rposn_finl_r_in, const T4 *rbond_init_r_in, const T4 *rbond_finl_r_in, const T4 *rangl_init_r_in, const T4 *rangl_finl_r_in, const T4 *rdihe_init_r_in, const T4 *rdihe_finl_r_in, const AtomGraph *ag_pointer_in)
The constructor requires a tedious list of arguments.
Double-precision reader abstract for the RestraintApparatus class. Restraints are very detailed thing...
Definition restraint_apparatus.h:28
const int * rdihe_j_atoms
Atoms which are under four-point dihedral restraints (ii)
Definition restraint_apparatus.h:73
const int * rangl_j_atoms
Atoms which are under three-point angle restraints (ii)
Definition restraint_apparatus.h:70
const int * rangl_finl_step
Final steps for applying three-point angle restraints.
Definition restraint_apparatus.h:81
const T2 * rposn_finl_xy
Final X and Y coordinates for positional restraint targets.
Definition restraint_apparatus.h:87
const bool time_dependence
Whether there is a time dependent nature to the restraints.
Definition restraint_apparatus.h:65
const T4 * rangl_init_r
Initial displacement parameters for angle restraints.
Definition restraint_apparatus.h:100
const T2 * rangl_finl_keq
Final harmonic parameters for angle restraints.
Definition restraint_apparatus.h:93
const T4 * rdihe_init_r
Initial displacement parameters for dihedral restraints.
Definition restraint_apparatus.h:102
const T2 * rdihe_finl_keq
Final harmonic parameters for dihedral restraints.
Definition restraint_apparatus.h:95
RestraintKit(const RestraintKit &original)=default
Take the default copy and move constructors. The assignment operators will get implicitly deleted as ...
const T2 * rposn_init_keq
Initial harmonic parameters for positional restraints.
Definition restraint_apparatus.h:84
const int * rangl_init_step
Initial steps for applying three-point angle restraints.
Definition restraint_apparatus.h:80
const int * rdihe_k_atoms
Atoms which are under four-point dihedral restraints (iii)
Definition restraint_apparatus.h:74
const int nangl
Number of three-point restraints.
Definition restraint_apparatus.h:63
const int * rposn_init_step
Initial steps for applying positional restraints.
Definition restraint_apparatus.h:76
const T2 * rbond_finl_keq
Final harmonic parameters for distance restraints.
Definition restraint_apparatus.h:91
const int * rdihe_finl_step
Final steps for applying dihedral restraints.
Definition restraint_apparatus.h:83
const int * rposn_finl_step
Final steps for applying positional restraints.
Definition restraint_apparatus.h:77
const T * rposn_init_z
Initial Z coordinates for positional restraint targets.
Definition restraint_apparatus.h:88
const T4 * rdihe_finl_r
Final displacement parameters for dihedral restraints.
Definition restraint_apparatus.h:103
const int nposn
Number of positional restraints.
Definition restraint_apparatus.h:61
const int * rbond_j_atoms
Atoms which are under distance restraints (ii)
Definition restraint_apparatus.h:68
const T2 * rposn_init_xy
Initial X and Y coordinates for positional restraint targets.
Definition restraint_apparatus.h:86
const int nbond
Number of distance restraints.
Definition restraint_apparatus.h:62
const AtomGraph * ag_pointer
Pointer to the topology to which this apparatus applies.
Definition restraint_apparatus.h:104
const int * rposn_atoms
Atoms which are under positional restraints.
Definition restraint_apparatus.h:66
const T2 * rdihe_init_keq
Initial harmonic parameters for dihedral restraints.
Definition restraint_apparatus.h:94
const T4 * rbond_init_r
Initial displacement parameters for distance restraints.
Definition restraint_apparatus.h:98
const int * rangl_i_atoms
Atoms which are under three-point angle restraints (i)
Definition restraint_apparatus.h:69
const int * rdihe_l_atoms
Atoms which are under four-point dihedral restraints (iv)
Definition restraint_apparatus.h:75
const T2 * rposn_finl_keq
Final harmonic parameters for positional restraints.
Definition restraint_apparatus.h:85
const int ndihe
Number of four-point dihedral restraints.
Definition restraint_apparatus.h:64
const int total_rst
Total number of restraints in the apparatus.
Definition restraint_apparatus.h:60
const int * rangl_k_atoms
Atoms which are under three-point angle restraints (iii)
Definition restraint_apparatus.h:71
const int * rdihe_init_step
Initial steps for applying dihedral restraints.
Definition restraint_apparatus.h:82
const int * rbond_init_step
Initial steps for applying distance restraints.
Definition restraint_apparatus.h:78
const T4 * rangl_finl_r
Final displacement parameters for angle restraints.
Definition restraint_apparatus.h:101
const T * rposn_finl_z
Final Z coordinates for positional restraint targets.
Definition restraint_apparatus.h:89
const T4 * rbond_finl_r
Final displacement parameters for distance restraints.
Definition restraint_apparatus.h:99
const T2 * rangl_init_keq
Initial harmonic parameters for angle restraints.
Definition restraint_apparatus.h:92
RestraintKit(int total_rst_in, int nposn_in, int nbond_in, int nangl_in, int ndihe_in, bool time_dependence_in, const int *rposn_atoms_in, const int *rbond_i_atoms_in, const int *rbond_j_atoms_in, const int *rangl_i_atoms_in, const int *rangl_j_atoms_in, const int *rangl_k_atoms_in, const int *rdihe_i_atoms_in, const int *rdihe_j_atoms_in, const int *rdihe_k_atoms_in, const int *rdihe_l_atoms_in, const int *rposn_init_step_in, const int *rposn_finl_step_in, const int *rbond_init_step_in, const int *rbond_finl_step_in, const int *rangl_init_step_in, const int *rangl_finl_step_in, const int *rdihe_init_step_in, const int *rdihe_finl_step_in, const T2 *rposn_init_keq_in, const T2 *rposn_finl_keq_in, const T2 *rposn_init_xy_in, const T2 *rposn_finl_xy_in, const T *rposn_init_z_in, const T *rposn_finl_z_in, const T2 *rbond_init_keq_in, const T2 *rbond_finl_keq_in, const T2 *rangl_init_keq_in, const T2 *rangl_finl_keq_in, const T2 *rdihe_init_keq_in, const T2 *rdihe_finl_keq_in, const T4 *rposn_init_r_in, const T4 *rposn_finl_r_in, const T4 *rbond_init_r_in, const T4 *rbond_finl_r_in, const T4 *rangl_init_r_in, const T4 *rangl_finl_r_in, const T4 *rdihe_init_r_in, const T4 *rdihe_finl_r_in, const AtomGraph *ag_pointer_in)
The constructor requires a tedious list of arguments.
const T4 * rposn_finl_r
Final displacement parameters for positional restraints.
Definition restraint_apparatus.h:97
const int * rbond_i_atoms
Atoms which are under distance restraints (i)
Definition restraint_apparatus.h:67
const int * rbond_finl_step
Final steps for applying distance restraints.
Definition restraint_apparatus.h:79
const T4 * rposn_init_r
Initial displacement parameters for positional restraints.
Definition restraint_apparatus.h:96
const int * rdihe_i_atoms
Atoms which are under four-point dihedral restraints (i)
Definition restraint_apparatus.h:72
const T2 * rbond_init_keq
Initial harmonic parameters for distance restraints.
Definition restraint_apparatus.h:90