diff --git a/namd/cudaglobalmaster/colvarproxy_cudaglobalmaster.C b/namd/cudaglobalmaster/colvarproxy_cudaglobalmaster.C index e305fbb0e..f7f4dced6 100644 --- a/namd/cudaglobalmaster/colvarproxy_cudaglobalmaster.C +++ b/namd/cudaglobalmaster/colvarproxy_cudaglobalmaster.C @@ -765,6 +765,13 @@ void colvarproxy_impl::calculate() { cudaCheck(cudaSetDevice(m_device_id)); // The following memcpy operations are supposed to be overlapped with the NB kernel if (numAtoms > 0) { + if (mClient->requestUpdateAtomTotalForces()) { + if (mClient->isStartupStep()) { + set_total_forces_invalid(); + } else { + set_total_forces_valid(); + } + } if (!has_gpu_support()) { // Transform the arrays for Colvars auto &colvars_pos = *(modify_atom_positions()); @@ -1078,8 +1085,8 @@ bool CudaGlobalMasterColvars::requestUpdateCharges() { return mImpl->atomsChanged(); } -void CudaGlobalMasterColvars::setStep(int64_t step) { - CudaGlobalMasterClient::setStep(step); +void CudaGlobalMasterColvars::setStep(int64_t step, int startup, int doMigration) { + CudaGlobalMasterClient::setStep(step, startup, doMigration); if (mImpl->atomsChanged()) { mImpl->reallocate(); } diff --git a/namd/cudaglobalmaster/colvarproxy_cudaglobalmaster.h b/namd/cudaglobalmaster/colvarproxy_cudaglobalmaster.h index aa2042438..7000afa2c 100644 --- a/namd/cudaglobalmaster/colvarproxy_cudaglobalmaster.h +++ b/namd/cudaglobalmaster/colvarproxy_cudaglobalmaster.h @@ -34,7 +34,7 @@ class CudaGlobalMasterColvars: public CudaGlobalMasterClient { int updateFromTCLCommand(const std::vector& arguments) override; void onBuffersUpdated() override; void calculate() override; - void setStep(int64_t step) override; + void setStep(int64_t step, int startup, int doMigration) override; cudaStream_t getStream() override; bool requestedAtomsChanged() override; bool requestedForcedAtomsChanged() override { return requestedAtomsChanged(); } @@ -76,6 +76,7 @@ class CudaGlobalMasterColvars: public CudaGlobalMasterClient { return CudaGlobalMasterClient::replica_comm_send(msg_data, msg_len, dest_rep); } int64_t getStep() const {return m_step;} + int isStartupStep() const {return m_is_startup_step;} std::string getTCLUpdateResult() override {return mTCLResult;} private: std::unique_ptr mImpl; diff --git a/src/colvar_gpu_calc.cpp b/src/colvar_gpu_calc.cpp index c0a9bd82c..93328317a 100644 --- a/src/colvar_gpu_calc.cpp +++ b/src/colvar_gpu_calc.cpp @@ -708,9 +708,7 @@ int colvarmodule_gpu_calc::calc_cvs(const std::vector& colvars, colvarm // Update flags checkColvarsError(cv_update_flags(colvars)); // Calculate total force - if (colvar_module->step_relative() > 0) { - checkColvarsError(cvc_calc_total_force(colvars, calc_total_force_compute, colvar_module, false)); - } + checkColvarsError(cvc_calc_total_force(colvars, calc_total_force_compute, colvar_module, false)); // Read data to atom groups checkColvarsError(atom_group_read_data_gpu( colvars, read_data_compute, colvar_module));