Fixed incorrect enum
[alexxy/gromacs.git] / src / gromacs / mdlib / update_constrain_gpu_impl.cu
index 0f54925c90af9339ea3cf898e7cb625830fe58d5..ac92d8f36977461c41e0092f0336b3e57757b558 100644 (file)
@@ -167,6 +167,25 @@ void UpdateConstrainGpu::Impl::scaleCoordinates(const matrix scalingMatrix)
     deviceStream_.synchronize();
 }
 
+void UpdateConstrainGpu::Impl::scaleVelocities(const matrix scalingMatrix)
+{
+    ScalingMatrix mu;
+    mu.xx = scalingMatrix[XX][XX];
+    mu.yy = scalingMatrix[YY][YY];
+    mu.zz = scalingMatrix[ZZ][ZZ];
+    mu.yx = scalingMatrix[YY][XX];
+    mu.zx = scalingMatrix[ZZ][XX];
+    mu.zy = scalingMatrix[ZZ][YY];
+
+    const auto kernelArgs = prepareGpuKernelArguments(
+            scaleCoordinates_kernel, coordinateScalingKernelLaunchConfig_, &numAtoms_, &d_v_, &mu);
+    launchGpuKernel(scaleCoordinates_kernel, coordinateScalingKernelLaunchConfig_, deviceStream_,
+                    nullptr, "scaleCoordinates_kernel", kernelArgs);
+    // TODO: Although this only happens on the pressure coupling steps, this synchronization
+    //       can affect the perfornamce if nstpcouple is small.
+    deviceStream_.synchronize();
+}
+
 UpdateConstrainGpu::Impl::Impl(const t_inputrec&     ir,
                                const gmx_mtop_t&     mtop,
                                const DeviceContext&  deviceContext,
@@ -263,6 +282,11 @@ void UpdateConstrainGpu::scaleCoordinates(const matrix scalingMatrix)
     impl_->scaleCoordinates(scalingMatrix);
 }
 
+void UpdateConstrainGpu::scaleVelocities(const matrix scalingMatrix)
+{
+    impl_->scaleVelocities(scalingMatrix);
+}
+
 void UpdateConstrainGpu::set(DeviceBuffer<RVec>            d_x,
                              DeviceBuffer<RVec>            d_v,
                              const DeviceBuffer<RVec>      d_f,