14 #if defined(NAMD_CUDA) || defined(NAMD_HIP) 16 #define __thread __declspec(thread) 21 #if defined(NAMD_CUDA) || defined(NAMD_HIP) 24 d_lpcolinear_list(nullptr), lpcolinear_list_size(0),
25 d_lprelative_list(nullptr), lprelative_list_size(0),
26 d_lpbisector_list(nullptr), lpbisector_list_size(0) {}
30 lpcolinear_list_size = 0;
32 lprelative_list_size = 0;
34 lpbisector_list_size = 0;
38 std::vector<AtomMap*> &atomMapsList,
39 const std::vector<CudaLocalRecord> &localRecords,
40 const int* globalToLocalID,
AtomID aid,
bool errorOnNotFound) {
42 for (
int j = 0; j < atomMapsList.size(); ++j) {
43 if (atomMapsList[j] == NULL)
continue;
44 lid = atomMapsList[j]->localID(aid);
45 if (lid.pid != -1)
break;
47 if (errorOnNotFound && (lid.pid == -1)) {
48 const std::string error =
"Atom " + std::to_string(aid) +
" not found in master PE " + std::to_string(
deviceCUDA->
getMasterPe());
52 const int soaPid = globalToLocalID[lid.pid];
53 const int soaIndex = localRecords[soaPid].bufferOffset + lid.index;
58 std::vector<HomePatch*> patchList,
59 std::vector<AtomMap*> &atomMapsList,
60 const std::vector<CudaLocalRecord> &localRecords,
61 const int* h_globalToLocalID, cudaStream_t stream) {
62 std::vector<LonepairColinear> lpcolinear_list;
63 std::vector<LonepairRelative> lprelative_list;
64 std::vector<LonepairBisector> lpbisector_list;
65 for (
size_t i = 0; i < patchList.size(); ++i) {
69 for (
int j = 0; j < numAtoms; ++j) {
70 const auto mass = atomList[j].mass;
73 const AtomID aid = atomList[j].id;
76 if (lph_ptr == NULL) {
77 const std::string error =
"rebuildLonePairHostList: no Lphost exists for LP " + std::to_string(aid);
88 const double distance = lph.
distance;
91 const double dcosa = -distance * std::cos(lph.
angle);
92 const double dsina = -distance * std::sin(lph.
angle);
93 const double dsinasint = dsina * std::sin(lph.
dihedral);
94 const double dsinacost = dsina * std::cos(lph.
dihedral);
100 dcosa, dsinacost, dsinasint});
102 const double dcosa = distance * std::cos(lph.
angle);
103 const double dsina = distance * std::sin(lph.
angle);
104 const double dsinasint = dsina * std::sin(lph.
dihedral);
105 const double dsinacost = dsina * std::cos(lph.
dihedral);
111 dcosa, dsinacost, dsinasint});
117 lpcolinear_list_size = lpcolinear_list.size();
118 if (!lpcolinear_list.empty()) {
121 copy_HtoD(lpcolinear_list.data(), d_lpcolinear_list, lpcolinear_list_size, stream);
123 lprelative_list_size = lprelative_list.size();
124 if (!lprelative_list.empty()) {
127 copy_HtoD(lprelative_list.data(), d_lprelative_list, lprelative_list_size, stream);
129 lpbisector_list_size = lpbisector_list.size();
130 if (!lpbisector_list.empty()) {
133 copy_HtoD(lpbisector_list.data(), d_lpbisector_list, lpbisector_list_size, stream);
135 cudaCheck(cudaStreamSynchronize(stream));
142 cudaStream_t stream)
const {
143 if (lpcolinear_list_size > 0) {
144 repositionColinear(d_pos_x, d_pos_y, d_pos_z, d_lpcolinear_list, lpcolinear_list_size, stream);
146 if (lpbisector_list_size > 0) {
147 repositionBisector(d_pos_x, d_pos_y, d_pos_z, d_lpbisector_list, lpbisector_list_size, stream);
149 if (lprelative_list_size > 0) {
150 repositionRelative(d_pos_x, d_pos_y, d_pos_z, d_lprelative_list, lprelative_list_size, stream);
155 double* d_f_normal_x,
156 double* d_f_normal_y,
157 double* d_f_normal_z,
167 const double* d_pos_x,
168 const double* d_pos_y,
169 const double* d_pos_z,
170 const int maxForceNumber,
172 cudaStream_t stream)
const {
173 if (lpcolinear_list_size > 0) {
175 d_f_normal_x, d_f_normal_y, d_f_normal_z,
176 d_f_nbond_x, d_f_nbond_y, d_f_nbond_z,
177 d_f_slow_x, d_f_slow_y, d_f_slow_z,
178 d_virial_normal, d_virial_nbond, d_virial_slow,
179 d_pos_x, d_pos_y, d_pos_z, maxForceNumber,
180 doVirial, d_lpcolinear_list, lpcolinear_list_size,
183 if (lpbisector_list_size > 0) {
185 d_f_normal_x, d_f_normal_y, d_f_normal_z,
186 d_f_nbond_x, d_f_nbond_y, d_f_nbond_z,
187 d_f_slow_x, d_f_slow_y, d_f_slow_z,
188 d_virial_normal, d_virial_nbond, d_virial_slow,
189 d_pos_x, d_pos_y, d_pos_z, maxForceNumber,
190 doVirial, d_lpbisector_list, lpbisector_list_size,
193 if (lprelative_list_size > 0) {
195 d_f_normal_x, d_f_normal_y, d_f_normal_z,
196 d_f_nbond_x, d_f_nbond_y, d_f_nbond_z,
197 d_f_slow_x, d_f_slow_y, d_f_slow_z,
198 d_virial_normal, d_virial_nbond, d_virial_slow,
199 d_pos_x, d_pos_y, d_pos_z, maxForceNumber,
200 doVirial, d_lprelative_list, lprelative_list_size,
void redistributeForceColinear(double *d_f_normal_x, double *d_f_normal_y, double *d_f_normal_z, double *d_f_nbond_x, double *d_f_nbond_y, double *d_f_nbond_z, double *d_f_slow_x, double *d_f_slow_y, double *d_f_slow_z, cudaTensor *d_virial_normal, cudaTensor *d_virial_nbond, cudaTensor *d_virial_slow, const double *d_pos_x, const double *d_pos_y, const double *d_pos_z, const int maxForceNumber, const int doVirial, const ComputeLonepairsCUDA::LonepairColinear *d_lpcolinear_list, size_t lpcolinear_list_size, cudaStream_t stream)
int32 numhosts
Either 2 or 3 host atoms, depending on LP type.
void deallocate_device(T **pp)
int globalAtomIDToSOAID(std::vector< AtomMap *> &atomMapsList, const std::vector< CudaLocalRecord > &localRecords, const int *globalToLocalID, AtomID aid, bool errorOnNotFound)
void repositionColinear(double *d_pos_x, double *d_pos_y, double *d_pos_z, const ComputeLonepairsCUDA::LonepairColinear *d_lpcolinear_list, size_t lpcolinear_list_size, cudaStream_t stream)
void allocate_device_async(T **pp, const size_t len, cudaStream_t stream)
void repositionBisector(double *d_pos_x, double *d_pos_y, double *d_pos_z, const ComputeLonepairsCUDA::LonepairBisector *d_lpbisector_list, size_t lpbisector_list_size, cudaStream_t stream)
void reposition(double *d_pos_x, double *d_pos_y, double *d_pos_z, cudaStream_t stream) const
Determine the positions of lone pairs. Should be called before force evaluations. ...
__thread DeviceCUDA * deviceCUDA
int32 atom1
First index is to the LP.
FullAtomList & getAtomList()
void NAMD_bug(const char *err_msg)
void redistributeForceBisector(double *d_f_normal_x, double *d_f_normal_y, double *d_f_normal_z, double *d_f_nbond_x, double *d_f_nbond_y, double *d_f_nbond_z, double *d_f_slow_x, double *d_f_slow_y, double *d_f_slow_z, cudaTensor *d_virial_normal, cudaTensor *d_virial_nbond, cudaTensor *d_virial_slow, const double *d_pos_x, const double *d_pos_y, const double *d_pos_z, const int maxForceNumber, const int doVirial, const ComputeLonepairsCUDA::LonepairBisector *d_lpbisector_list, size_t lpbisector_list_size, cudaStream_t stream)
void NAMD_die(const char *err_msg)
void redistributeForceRelative(double *d_f_normal_x, double *d_f_normal_y, double *d_f_normal_z, double *d_f_nbond_x, double *d_f_nbond_y, double *d_f_nbond_z, double *d_f_slow_x, double *d_f_slow_y, double *d_f_slow_z, cudaTensor *d_virial_normal, cudaTensor *d_virial_nbond, cudaTensor *d_virial_slow, const double *d_pos_x, const double *d_pos_y, const double *d_pos_z, const int maxForceNumber, const int doVirial, const ComputeLonepairsCUDA::LonepairRelative *d_lprelative_list, size_t lprelative_list_size, cudaStream_t stream)
void repositionRelative(double *d_pos_x, double *d_pos_y, double *d_pos_z, const ComputeLonepairsCUDA::LonepairRelative *d_lprelative_list, size_t lprelative_list_size, cudaStream_t stream)
void updateAtoms(std::vector< HomePatch *> patchList, std::vector< AtomMap *> &atomMapsList, const std::vector< CudaLocalRecord > &localRecords, const int *h_globalToLocalID, cudaStream_t stream)
Prepare the device lone pair lists from lphosts in the Molecule class.
void redistributeForce(double *d_f_normal_x, double *d_f_normal_y, double *d_f_normal_z, double *d_f_nbond_x, double *d_f_nbond_y, double *d_f_nbond_z, double *d_f_slow_x, double *d_f_slow_y, double *d_f_slow_z, cudaTensor *d_virial_normal, cudaTensor *d_virial_nbond, cudaTensor *d_virial_slow, const double *d_pos_x, const double *d_pos_y, const double *d_pos_z, const int maxForceNumber, const int doVirial, cudaStream_t stream) const
Project the forces on lone pairs to host atoms. Should be called after force evaluations and before t...
void deallocate_device_async(T **pp, cudaStream_t stream)
Lphost * get_lphost(int atomid) const
void copy_HtoD(const T *h_array, T *d_array, size_t array_len, cudaStream_t stream=0)