2#ifndef STORMM_PHASE_SPACE_H
3#define STORMM_PHASE_SPACE_H
9#include "Accelerator/hybrid.h"
10#include "Accelerator/hybrid_util.h"
11#include "Constants/behavior.h"
12#include "Math/matrix_ops.h"
13#include "Topology/atomgraph.h"
14#include "trajectory_enumerators.h"
15#include "write_frame.h"
20using card::default_hpc_format;
21using card::GpuDetails;
23using card::HybridFormat;
24using card::HybridTargetLevel;
25using constants::CartesianDimension;
26using stmath::computeBoxTransform;
27using topology::AtomGraph;
28using topology::UnitCellType;
34 PhaseSpaceWriter(
const int natom_in,
const UnitCellType unit_cell_in,
double* xcrd_in,
35 double* ycrd_in,
double* zcrd_in,
double* umat_in,
double* invu_in,
36 double* boxdim_in,
double* umat_alt_in,
double* invu_alt_in,
37 double* boxdim_alt_in,
double* xvel_in,
double* yvel_in,
double* zvel_in,
38 double* xfrc_in,
double* yfrc_in,
double* zfrc_in,
double* xalt_in,
39 double* yalt_in,
double* zalt_in,
double* vxalt_in,
double* vyalt_in,
40 double* vzalt_in,
double* fxalt_in,
double* fyalt_in,
double* fzalt_in);
86 PhaseSpaceReader(
const int natom_in,
const UnitCellType unit_cell_in,
const double* xcrd_in,
87 const double* ycrd_in,
const double* zcrd_in,
const double* umat_in,
88 const double* invu_in,
const double* boxdim_in,
const double* umat_alt_in,
89 const double* invu_alt_in,
const double* boxdim_alt_in,
const double* xvel_in,
90 const double* yvel_in,
const double* zvel_in,
const double* xfrc_in,
91 const double* yfrc_in,
const double* zfrc_in,
const double* xalt_in,
92 const double* yalt_in,
const double* zalt_in,
const double* vxalt_in,
93 const double* vyalt_in,
const double* vzalt_in,
const double* fxalt_in,
94 const double* fyalt_in,
const double* fzalt_in);
160 PhaseSpace(
int atom_count_in = 0, UnitCellType unit_cell_in = UnitCellType::NONE,
161 HybridFormat format_in = default_hpc_format);
164 CoordinateFileKind file_kind = CoordinateFileKind::UNKNOWN,
int frame_number = 0,
165 HybridFormat format_in = default_hpc_format);
168 CoordinateFileKind file_kind = CoordinateFileKind::UNKNOWN,
169 int frame_number = 0, HybridFormat format_in = default_hpc_format);
171 PhaseSpace(
const std::vector<PhaseSpace*> &input_crd,
const std::vector<AtomGraph*> &input_top,
172 const std::vector<int> &counts);
181 HybridFormat format_in = default_hpc_format);
184 HybridFormat format_in = default_hpc_format);
229 const CoordinateFileKind file_kind = CoordinateFileKind::UNKNOWN,
230 int frame_number = 0);
248 template <
typename T>
249 void fill(
const T* xcrd,
const T* ycrd,
const T* zcrd,
250 TrajectoryKind kind = TrajectoryKind::POSITIONS,
251 CoordinateCycle cycle_in = CoordinateCycle::WHITE,
int scale_bits = 0,
252 const double* box_dims =
nullptr);
254 template <
typename T>
255 void fill(
const std::vector<T> &xcrd,
const std::vector<T> &ycrd,
const std::vector<T> &zcrd,
256 TrajectoryKind kind = TrajectoryKind::POSITIONS,
257 CoordinateCycle cycle_in = CoordinateCycle::WHITE,
int scale_bits = 0,
258 const std::vector<double> &box_dims = {});
293 CoordinateCycle orientation,
294 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
297 CoordinateCycle orientation,
298 HybridTargetLevel tier = HybridTargetLevel::HOST);
301 TrajectoryKind kind = TrajectoryKind::POSITIONS,
302 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
305 TrajectoryKind kind = TrajectoryKind::POSITIONS,
306 HybridTargetLevel tier = HybridTargetLevel::HOST);
309 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
312 HybridTargetLevel tier = HybridTargetLevel::HOST);
330 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
334 TrajectoryKind kind = TrajectoryKind::POSITIONS,
335 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
339 TrajectoryKind kind = TrajectoryKind::POSITIONS,
340 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
344 TrajectoryKind kind = TrajectoryKind::POSITIONS,
345 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
362 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
364 HybridTargetLevel tier = HybridTargetLevel::HOST);
384 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
386 HybridTargetLevel tier = HybridTargetLevel::HOST);
404 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
406 HybridTargetLevel tier = HybridTargetLevel::HOST);
407 const double*
getBoxSizePointer(HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
423 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
424 std::vector<double>
getBoxSpaceTransform(HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
435 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
436 std::vector<double>
getInverseTransform(HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
455 CoordinateCycle orientation)
const;
458 TrajectoryKind kind = TrajectoryKind::POSITIONS)
const;
461 CoordinateCycle orientation);
464 TrajectoryKind kind = TrajectoryKind::POSITIONS);
470 const Hybrid<double>* getBoxTransformHandle(CoordinateCycle orientation)
const;
472 Hybrid<double>* getBoxTransformHandle(CoordinateCycle orientation);
479 const Hybrid<double>* getInverseTransformHandle(CoordinateCycle orientation)
const;
481 Hybrid<double>* getInverseTransformHandle(CoordinateCycle orientation);
488 const Hybrid<double>* getBoxDimensionsHandle(CoordinateCycle orientation)
const;
490 Hybrid<double>* getBoxDimensionsHandle(CoordinateCycle orientation);
513 void initializeForces(CoordinateCycle orientation);
514 void initializeForces();
540 void exportToFile(
const std::string &file_name,
double current_time = 0.0,
541 TrajectoryKind traj_kind = TrajectoryKind::POSITIONS,
542 CoordinateFileKind output_kind = CoordinateFileKind::AMBER_INPCRD,
543 PrintSituation expectation = PrintSituation::UNKNOWN)
const;
566 HybridTargetLevel tier = HybridTargetLevel::HOST)
const;
569 HybridTargetLevel tier = HybridTargetLevel::HOST);
584 const PhaseSpaceReader deviceViewToHostData(CoordinateCycle orientation)
const;
601 void uploadPositions(CoordinateCycle orientation);
602 void uploadPositions();
606 void uploadTransformations();
616 void uploadVelocities(CoordinateCycle orientation);
617 void uploadVelocities();
628 void uploadForces(CoordinateCycle orientation);
643 void downloadPositions(CoordinateCycle orientation);
644 void downloadPositions();
648 void downloadTransformations();
658 void downloadVelocities(CoordinateCycle orientation);
659 void downloadVelocities();
670 void downloadForces(CoordinateCycle orientation);
671 void downloadForces();
677 std::string file_name;
681 UnitCellType unit_cell;
682 CoordinateCycle cycle_position;
741static const size_t phasespace_type_index = std::type_index(
typeid(PhaseSpace)).hash_code();
752UnitCellType determineUnitCellTypeByShape(
const double* inverse_transform);
753UnitCellType determineUnitCellTypeByShape(
const std::vector<double> &inverse_transform);
754UnitCellType determineUnitCellTypeByShape(
const Hybrid<double> &inverse_transform);
765std::vector<double> interlaceXYZ(
const double* xptr,
const double* yptr,
const double* zptr,
766 int low_index,
int high_index);
771#include "phasespace.tpp"
776using trajectory::phasespace_type_index;
An evolution of GpuBuffer in pmemd.cuda, the Composite array has elements that are accessible from ei...
Definition hybrid.h:202
PhaseSpace(int atom_count_in=0, UnitCellType unit_cell_in=UnitCellType::NONE, HybridFormat format_in=default_hpc_format)
Construction of a phase space object, like a topology, is typically done from a file.
Definition phasespace.cpp:89
A struct to hold information relating to an Amber topology. This struct's member functions are limite...
Definition atomgraph.h:50
An object to complement a topology and hold positions, velocities, and forces of all particles in a s...
Definition phasespace.h:141
const double * getCoordinatePointer(CartesianDimension dim, TrajectoryKind kind, CoordinateCycle orientation, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get a pointer to the particle X, Y, or Z coordinates, velocities, or forces, on either the host or de...
Definition phasespace.cpp:641
const double * getBoxSizePointer(CoordinateCycle orientation, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get a pointer to the box dimensions that can track its evolution in the PhaseSpace object's Hybrid da...
Definition phasespace.cpp:1053
const Hybrid< double > * getStorageHandle() const
Get a pointer to the ARRAY-kind Hybrid object that holds the actual data. Needed by CoordinateFrame o...
Definition phasespace.cpp:1448
std::vector< double > getInverseTransform(CoordinateCycle orientation, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get the transformation matrix to take coordinates from fractional space back into real space....
Definition phasespace.cpp:1121
void exportToFile(const std::string &file_name, double current_time=0.0, TrajectoryKind traj_kind=TrajectoryKind::POSITIONS, CoordinateFileKind output_kind=CoordinateFileKind::AMBER_INPCRD, PrintSituation expectation=PrintSituation::UNKNOWN) const
Put the phase space data into a trajectory or checkpoint file.
Definition phasespace.cpp:1507
HybridFormat getFormat() const
Get the Hybrid format taken by the object, indicating on which resources its memory is present.
Definition phasespace.cpp:616
std::vector< double > getInterlacedCoordinates(TrajectoryKind kind=TrajectoryKind::POSITIONS, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get the coordinates returned in an X/Y/Z interlaced manner.
Definition phasespace.cpp:857
const Hybrid< double > * getCoordinateHandle(CartesianDimension dim, TrajectoryKind kind, CoordinateCycle orientation) const
Get a pointer to one of the coordinate arrays, a pointer to a POINTER-kind Hybrid object.
Definition phasespace.cpp:1153
PhaseSpace & operator=(const PhaseSpace &other)
Copy assignment operator likewise handles assignment of internal POINTER-kind Hybrid objects.
Definition phasespace.cpp:376
UnitCellType getUnitCellType() const
Get the unit cell type of the coordinate system.
Definition phasespace.cpp:631
const double * getBoxSpaceTransformPointer(CoordinateCycle orientation, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get a pointer to the box space transformation matrix that can track its evolution in the PhaseSpace o...
Definition phasespace.cpp:981
const double * getInverseTransformPointer(CoordinateCycle orientation, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get a pointer to the inverse (back to real space) transformation matrix that can track its evolution ...
Definition phasespace.cpp:1017
void buildFromFile(const std::string &file_name_in, const CoordinateFileKind file_kind=CoordinateFileKind::UNKNOWN, int frame_number=0)
Fill the object from information in some coordinate, restart, or trajectory file.
Definition phasespace.cpp:500
CoordinateCycle getCyclePosition() const
Get the time cycle stage indicating the arrays holding current coordinates.
Definition phasespace.cpp:636
std::string getFileName() const
Get the name of the file associated with this object.
Definition phasespace.cpp:621
const PhaseSpaceReader data(HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get the abstract for this object, containing C-style pointers for the most rapid access to any of its...
Definition phasespace.cpp:1584
void updateCyclePosition()
Update the cycle position.
Definition phasespace.cpp:1490
PhaseSpace(int atom_count_in=0, UnitCellType unit_cell_in=UnitCellType::NONE, HybridFormat format_in=default_hpc_format)
Construction of a phase space object, like a topology, is typically done from a file.
Definition phasespace.cpp:89
void fill(const T *xcrd, const T *ycrd, const T *zcrd, TrajectoryKind kind=TrajectoryKind::POSITIONS, CoordinateCycle cycle_in=CoordinateCycle::WHITE, int scale_bits=0, const double *box_dims=nullptr)
Fill the object from information in three arrays.
const PhaseSpace * getSelfPointer() const
Get a pointer to the object itself (useful when the object has been passed as a const reference and a...
Definition phasespace.cpp:1579
int getAtomCount() const
Get the number of atoms (particles, including virtual sites) in the object.
Definition phasespace.cpp:626
std::vector< double > getBoxSpaceTransform(CoordinateCycle orientation, HybridTargetLevel tier=HybridTargetLevel::HOST) const
Get the transformation matrix to take coordinates into box (fractional) space. The result should be i...
Definition phasespace.cpp:1089
PhaseSpaceReader(const int natom_in, const UnitCellType unit_cell_in, const double *xcrd_in, const double *ycrd_in, const double *zcrd_in, const double *umat_in, const double *invu_in, const double *boxdim_in, const double *umat_alt_in, const double *invu_alt_in, const double *boxdim_alt_in, const double *xvel_in, const double *yvel_in, const double *zvel_in, const double *xfrc_in, const double *yfrc_in, const double *zfrc_in, const double *xalt_in, const double *yalt_in, const double *zalt_in, const double *vxalt_in, const double *vyalt_in, const double *vzalt_in, const double *fxalt_in, const double *fyalt_in, const double *fzalt_in)
Definition phasespace.cpp:54
PhaseSpaceWriter(const int natom_in, const UnitCellType unit_cell_in, double *xcrd_in, double *ycrd_in, double *zcrd_in, double *umat_in, double *invu_in, double *boxdim_in, double *umat_alt_in, double *invu_alt_in, double *boxdim_alt_in, double *xvel_in, double *yvel_in, double *zvel_in, double *xfrc_in, double *yfrc_in, double *zfrc_in, double *xalt_in, double *yalt_in, double *zalt_in, double *vxalt_in, double *vyalt_in, double *vzalt_in, double *fxalt_in, double *fyalt_in, double *fzalt_in)
Constructor takes a large list of arguments passed in from the original PhaseSpace object.
Definition phasespace.cpp:37
Collect constants and pointers to the components of a read-only PhaseSpace object.
Definition phasespace.h:81
const double * invu_alt
Transformation matrix to take coordinates into real space.
Definition phasespace.h:117
const double * vxalt
Alternate Cartesian X velocities for all particles.
Definition phasespace.h:129
const double * boxdim_alt
Definition phasespace.h:118
const double * zvel
Cartesian Z velocities of all particles.
Definition phasespace.h:122
const double * invu
Transformation matrix to take coordinates into real space.
Definition phasespace.h:112
const double * vzalt
Alternate Cartesian Z velocities for all particles.
Definition phasespace.h:131
const double * xalt
Alternate Cartesian X positions of all particles.
Definition phasespace.h:126
const int natom
Atom count for this system (still a constant)
Definition phasespace.h:105
const double * xfrc
Cartesian X forces acting on all particles.
Definition phasespace.h:123
const double * zfrc
Cartesian Z forces acting on all particles.
Definition phasespace.h:125
const double * yvel
Cartesian Y velocities of all particles.
Definition phasespace.h:121
PhaseSpaceReader(const int natom_in, const UnitCellType unit_cell_in, const double *xcrd_in, const double *ycrd_in, const double *zcrd_in, const double *umat_in, const double *invu_in, const double *boxdim_in, const double *umat_alt_in, const double *invu_alt_in, const double *boxdim_alt_in, const double *xvel_in, const double *yvel_in, const double *zvel_in, const double *xfrc_in, const double *yfrc_in, const double *zfrc_in, const double *xalt_in, const double *yalt_in, const double *zalt_in, const double *vxalt_in, const double *vyalt_in, const double *vzalt_in, const double *fxalt_in, const double *fyalt_in, const double *fzalt_in)
Definition phasespace.cpp:54
const double * yalt
Alternate Cartesian Y positions of all particles.
Definition phasespace.h:127
const double * xcrd
Cartesian X positions of all particles.
Definition phasespace.h:107
const double * fyalt
Alternate Cartesian Y forces acting on all particles.
Definition phasespace.h:133
const double * zalt
Alternate Cartesian Z positions of all particles.
Definition phasespace.h:128
const UnitCellType unit_cell
The type of unit cell.
Definition phasespace.h:106
const double * xvel
Cartesian X velocities of all particles.
Definition phasespace.h:120
const double * umat_alt
Definition phasespace.h:115
const double * fxalt
Alternate Cartesian X forces acting on all particles.
Definition phasespace.h:132
const double * fzalt
Alternate Cartesian Z forces acting on all particles.
Definition phasespace.h:134
const double * umat
Definition phasespace.h:110
const double * boxdim
Definition phasespace.h:113
const double * vyalt
Alternate Cartesian Y velocities for all particles.
Definition phasespace.h:130
const double * zcrd
Cartesian Z positions of all particles.
Definition phasespace.h:109
const double * ycrd
Cartesian Y positions of all particles.
Definition phasespace.h:108
PhaseSpaceReader(const PhaseSpaceReader &original)=default
Copy and move constructors. The assignment operators are implicitly deleted.
const double * yfrc
Cartesian Y forces acting on all particles.
Definition phasespace.h:124
Collect constants and pointers to the components of a modifiable PhaseSpace object.
Definition phasespace.h:31
double * ycrd
Cartesian Y positions of all particles.
Definition phasespace.h:51
double * yalt
Alternate Cartesian Y positions of all particles.
Definition phasespace.h:70
double * zvel
Cartesian Z velocities of all particles.
Definition phasespace.h:65
double * umat_alt
Definition phasespace.h:58
double * zalt
Alternate Cartesian Z positions of all particles.
Definition phasespace.h:71
double * yfrc
Cartesian Y forces acting on all particles.
Definition phasespace.h:67
double * vxalt
Alternate Cartesian X velocities for all particles.
Definition phasespace.h:72
double * vzalt
Alternate Cartesian Z velocities for all particles.
Definition phasespace.h:74
double * fxalt
Alternate Cartesian X forces acting on all particles.
Definition phasespace.h:75
double * zfrc
Cartesian Z forces acting on all particles.
Definition phasespace.h:68
double * vyalt
Alternate Cartesian Y velocities for all particles.
Definition phasespace.h:73
PhaseSpaceWriter(const int natom_in, const UnitCellType unit_cell_in, double *xcrd_in, double *ycrd_in, double *zcrd_in, double *umat_in, double *invu_in, double *boxdim_in, double *umat_alt_in, double *invu_alt_in, double *boxdim_alt_in, double *xvel_in, double *yvel_in, double *zvel_in, double *xfrc_in, double *yfrc_in, double *zfrc_in, double *xalt_in, double *yalt_in, double *zalt_in, double *vxalt_in, double *vyalt_in, double *vzalt_in, double *fxalt_in, double *fyalt_in, double *fzalt_in)
Constructor takes a large list of arguments passed in from the original PhaseSpace object.
Definition phasespace.cpp:37
double * invu_alt
Transformation matrix to take coordinates into real space.
Definition phasespace.h:60
const int natom
Atom count for this system (still a constant)
Definition phasespace.h:48
double * xcrd
Cartesian X positions of all particles.
Definition phasespace.h:50
PhaseSpaceWriter(const PhaseSpaceWriter &original)=default
Copy and move constructors. The assignment operators are implicitly deleted.
double * fzalt
Alternate Cartesian Z forces acting on all particles.
Definition phasespace.h:77
const UnitCellType unit_cell
The type of unit cell.
Definition phasespace.h:49
double * yvel
Cartesian Y velocities of all particles.
Definition phasespace.h:64
double * xfrc
Cartesian X forces acting on all particles.
Definition phasespace.h:66
double * boxdim_alt
Definition phasespace.h:61
double * boxdim
Definition phasespace.h:56
double * fyalt
Alternate Cartesian Y forces acting on all particles.
Definition phasespace.h:76
double * xalt
Alternate Cartesian X positions of all particles.
Definition phasespace.h:69
double * invu
Transformation matrix to take coordinates into real space.
Definition phasespace.h:55
double * umat
Definition phasespace.h:53
double * zcrd
Cartesian Z positions of all particles.
Definition phasespace.h:52
double * xvel
Cartesian X velocities of all particles.
Definition phasespace.h:63