From 6ff22883fa63ed0fc3667ccf98e204da8c3528ef Mon Sep 17 00:00:00 2001
From: GregorySchwing <39970712+GregorySchwing@users.noreply.github.com>
Date: Mon, 15 Mar 2021 12:26:27 -0400
Subject: [PATCH] Revert "MultiParticle Brownian like motion"
---
CMake/FileLists.cmake | 3 -
lib/BasicTypes.h | 12 -
src/BoxDimensions.h | 5 -
src/ConfigSetup.cpp | 35 +-
src/ConfigSetup.h | 4 +-
src/ConsoleOutput.cpp | 13 -
src/GOMCEventsProfileDef.h | 5 -
src/GPU/CalculateMinImageCUDAKernel.cuh | 41 --
src/GPU/ConstantDefinitionsCUDAKernel.cu | 1 -
src/GPU/TransformParticlesCUDAKernel.cu | 520 +---------------------
src/GPU/TransformParticlesCUDAKernel.cuh | 99 -----
src/GPU/VariablesCUDA.cuh | 2 -
src/MoleculeLookup.cpp | 20 +-
src/MoleculeLookup.h | 4 +-
src/MoveConst.h | 86 ++--
src/MoveSettings.cpp | 10 +-
src/PRNG.h | 26 +-
src/Random123Wrapper.cpp | 58 ---
src/Random123Wrapper.h | 46 +-
src/StaticVals.cpp | 5 +-
src/System.cpp | 9 +-
src/moves/MultiParticle.h | 32 +-
src/moves/MultiParticleBrownianMotion.h | 530 -----------------------
23 files changed, 119 insertions(+), 1447 deletions(-)
delete mode 100644 src/Random123Wrapper.cpp
delete mode 100644 src/moves/MultiParticleBrownianMotion.h
diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake
index 5e7bb14a2..6f45571c6 100644
--- a/CMake/FileLists.cmake
+++ b/CMake/FileLists.cmake
@@ -42,7 +42,6 @@ set(sources
src/PDBOutput.cpp
src/PRNGSetup.cpp
src/PSFOutput.cpp
- src/Random123Wrapper.cpp
src/Reader.cpp
src/Simulation.cpp
src/StaticVals.cpp
@@ -132,7 +131,6 @@ set(headers
src/PRNG.h
src/PRNGSetup.h
src/PSFOutput.h
- src/Random123Wrapper.h
src/Reader.h
src/SeedReader.h
src/Setup.h
@@ -176,7 +174,6 @@ set(headers
src/moves/MoleculeTransfer.h
src/moves/MoveBase.h
src/moves/MultiParticle.h
- src/moves/MultiParticleBrownianMotion.h
src/moves/Regrowth.h
src/moves/Rotation.h
src/moves/TargetedSwap.h
diff --git a/lib/BasicTypes.h b/lib/BasicTypes.h
index 1a7f594c8..a8a770cd6 100644
--- a/lib/BasicTypes.h
+++ b/lib/BasicTypes.h
@@ -123,18 +123,6 @@ struct XYZ {
return true;
return false;
}
- bool operator<(XYZ const& rhs)
- {
- if(x < rhs.x && y < rhs.y && z < rhs.z)
- return true;
- return false;
- }
- bool operator>(XYZ const& rhs)
- {
- if(x > rhs.x || y > rhs.y || z > rhs.z)
- return true;
- return false;
- }
XYZ& operator+=(XYZ const& rhs)
{
x += rhs.x;
diff --git a/src/BoxDimensions.h b/src/BoxDimensions.h
index 8dbbb854b..ecf0261c6 100644
--- a/src/BoxDimensions.h
+++ b/src/BoxDimensions.h
@@ -49,11 +49,6 @@ class BoxDimensions
{
return axis.Get(b);
}
-
- XYZ GetHalfAxis(const uint b) const
- {
- return halfAx.Get(b);
- }
double GetTotVolume(const uint b1, const uint b2) const;
diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp
index c3550ac3e..bbf099198 100644
--- a/src/ConfigSetup.cpp
+++ b/src/ConfigSetup.cpp
@@ -76,7 +76,6 @@ ConfigSetup::ConfigSetup(void)
sys.moves.intraSwap = DBL_MAX;
sys.moves.multiParticleEnabled = false;
sys.moves.multiParticle = DBL_MAX;
- sys.moves.multiParticleBrownian = DBL_MAX;
sys.moves.regrowth = DBL_MAX;
sys.moves.crankShaft = DBL_MAX;
sys.moves.intraMemc = DBL_MAX;
@@ -679,14 +678,6 @@ void ConfigSetup::Init(const char *fileName, MultiSim const*const& multisim)
printf("%-40s %-4.4f \n",
"Info: Multi-Particle move frequency",
sys.moves.multiParticle);
- } else if(CheckString(line[0], "MultiParticleBrownianFreq")) {
- sys.moves.multiParticleBrownian = stringtod(line[1]);
- if(sys.moves.multiParticleBrownian > 0.00) {
- sys.moves.multiParticleEnabled = true;
- }
- printf("%-40s %-4.4f \n",
- "Info: Multi-Particle Brownian move frequency",
- sys.moves.multiParticleBrownian);
} else if(CheckString(line[0], "IntraSwapFreq")) {
sys.moves.intraSwap = stringtod(line[1]);
printf("%-40s %-4.4f \n", "Info: Intra-Swap move frequency",
@@ -1260,13 +1251,6 @@ void ConfigSetup::fillDefaults(void)
sys.moves.multiParticle);
}
- if(sys.moves.multiParticleBrownian == DBL_MAX) {
- sys.moves.multiParticleBrownian = 0.000;
- printf("%-40s %-4.4f \n",
- "Default: Multi-Particle Brownian move frequency",
- sys.moves.multiParticleBrownian);
- }
-
if(sys.moves.intraMemc == DBL_MAX) {
sys.moves.intraMemc = 0.0;
printf("%-40s %-4.4f \n", "Default: Intra-MEMC move frequency",
@@ -1522,12 +1506,6 @@ void ConfigSetup::verifyInputs(void)
}
}
#endif
- if(abs(sys.moves.multiParticle) > 0.0000001 &&
- abs(sys.moves.multiParticleBrownian) > 0.0000001) {
- std::cout << "Error: Both multi-Particle and multi-Particle Brownian! " <<
- " cannot be used at the same time!" << std::endl;
- exit(EXIT_FAILURE);
- }
if(!sys.elect.enable && sys.elect.oneFourScale != DBL_MAX) {
printf("Warning: 1-4 Electrostatic scaling set, but will be ignored.\n");
@@ -1682,8 +1660,8 @@ void ConfigSetup::verifyInputs(void)
if(std::abs(sys.moves.displace + sys.moves.rotate + sys.moves.transfer +
sys.moves.intraSwap + sys.moves.volume + sys.moves.regrowth +
sys.moves.memc + sys.moves.intraMemc + sys.moves.crankShaft +
- sys.moves.multiParticle + sys.moves.multiParticleBrownian +
- sys.moves.cfcmc + sys.moves.targetedSwap - 1.0) > 0.001) {
+ sys.moves.multiParticle + sys.moves.cfcmc +
+ sys.moves.targetedSwap - 1.0) > 0.001) {
std::cout << "Error: Sum of move frequencies is not equal to one!\n";
exit(EXIT_FAILURE);
}
@@ -1695,8 +1673,7 @@ void ConfigSetup::verifyInputs(void)
if(std::abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap +
sys.moves.volume + sys.moves.regrowth + sys.moves.intraMemc +
- sys.moves.crankShaft + sys.moves.multiParticle +
- sys.moves.multiParticleBrownian - 1.0) > 0.001) {
+ sys.moves.crankShaft + sys.moves.multiParticle - 1.0) > 0.001) {
std::cout << "Error: Sum of move frequencies is not equal to one!\n";
exit(EXIT_FAILURE);
}
@@ -1709,15 +1686,15 @@ void ConfigSetup::verifyInputs(void)
if(std::abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap +
sys.moves.transfer + sys.moves.regrowth + sys.moves.memc +
sys.moves.intraMemc + sys.moves.crankShaft +
- sys.moves.multiParticle + sys.moves.multiParticleBrownian +
- sys.moves.cfcmc + sys.moves.targetedSwap - 1.0) > 0.001) {
+ sys.moves.multiParticle + sys.moves.cfcmc +
+ sys.moves.targetedSwap - 1.0) > 0.001) {
std::cout << "Error: Sum of move frequencies is not equal to one!!\n";
exit(EXIT_FAILURE);
}
#else
if(std::abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap +
sys.moves.regrowth + sys.moves.intraMemc + sys.moves.crankShaft +
- sys.moves.multiParticle + sys.moves.multiParticleBrownian - 1.0) > 0.001) {
+ sys.moves.multiParticle - 1.0) > 0.001) {
std::cout << "Error: Sum of move frequencies is not equal to one!!\n";
exit(EXIT_FAILURE);
}
diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h
index fd1280a53..947e33bb6 100644
--- a/src/ConfigSetup.h
+++ b/src/ConfigSetup.h
@@ -183,8 +183,8 @@ struct Step {
//Holds the percentage of each kind of move for this ensemble.
struct MovePercents {
double displace, rotate, intraSwap, intraMemc, regrowth, crankShaft,
- multiParticle, multiParticleBrownian;
- bool multiParticleEnabled; // for both multiparticle and multiparticleBrownian
+ multiParticle;
+ bool multiParticleEnabled;
#ifdef VARIABLE_VOLUME
double volume;
#endif
diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp
index 2e3d951df..d5f7899d2 100644
--- a/src/ConsoleOutput.cpp
+++ b/src/ConsoleOutput.cpp
@@ -121,13 +121,6 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const
printElement(var->GetAcceptPercent(box, sub), elementWidth);
}
- if(var->Performed(mv::MULTIPARTICLE_BM)) {
- sub = mv::MULTIPARTICLE_BM;
- printElement(var->GetTries(box, sub), elementWidth);
- printElement(var->GetAccepted(box, sub), elementWidth);
- printElement(var->GetAcceptPercent(box, sub), elementWidth);
- }
-
if(var->Performed(mv::INTRA_SWAP)) {
sub = mv::INTRA_SWAP;
printElement(var->GetTries(box, sub), elementWidth);
@@ -378,12 +371,6 @@ void ConsoleOutput::PrintMoveTitle()
printElement("MPACCEPT%", elementWidth);
}
- if(var->Performed(mv::MULTIPARTICLE_BM)) {
- printElement("MULTIPARTICLEBM", elementWidth);
- printElement("MPBMACCEPT", elementWidth);
- printElement("MPBMACCEPT%", elementWidth);
- }
-
if(var->Performed(mv::INTRA_SWAP)) {
printElement("INTRASWAP", elementWidth);
printElement("INTACCEPT", elementWidth);
diff --git a/src/GOMCEventsProfileDef.h b/src/GOMCEventsProfileDef.h
index a057c8992..f9dc81db7 100644
--- a/src/GOMCEventsProfileDef.h
+++ b/src/GOMCEventsProfileDef.h
@@ -20,7 +20,6 @@ GOMC_PROFILE_EVENT(FREE_ENERGY_OUTPUT, "free_energy_file")
GOMC_PROFILE_EVENT(DISPLACE, "translate_move")
GOMC_PROFILE_EVENT(ROTATE, "rotate_move")
GOMC_PROFILE_EVENT(MULTIPARTICLE, "multiParticle_move")
-GOMC_PROFILE_EVENT(MULTIPARTICLE_BM, "multiParticleBM_move")
GOMC_PROFILE_EVENT(INTRA_SWAP, "intraSwap_move")
GOMC_PROFILE_EVENT(INTRA_MEMC, "intraMEMC_move")
GOMC_PROFILE_EVENT(CRANKSHAFT, "crankshaft_move")
@@ -34,7 +33,6 @@ GOMC_PROFILE_EVENT(CFCMC, "CFCMC_move")
GOMC_PROFILE_EVENT(PREP_DISPLACE, "prepare_translate_move")
GOMC_PROFILE_EVENT(PREP_ROTATE, "prepare_rotate_move")
GOMC_PROFILE_EVENT(PREP_MULTIPARTICLE, "prepare_multiParticle_move")
-GOMC_PROFILE_EVENT(PREP_MULTIPARTICLE_BM, "prepare_multiParticleBM_move")
GOMC_PROFILE_EVENT(PREP_INTRA_SWAP, "prepare_intraSwap_move")
GOMC_PROFILE_EVENT(PREP_INTRA_MEMC, "prepare_intraMEMC_move")
GOMC_PROFILE_EVENT(PREP_CRANKSHAFT, "prepare_crankshaft_move")
@@ -48,7 +46,6 @@ GOMC_PROFILE_EVENT(PREP_CFCMC, "prepare_CFCMC_move")
GOMC_PROFILE_EVENT(TRANS_DISPLACE, "transform_translate_move")
GOMC_PROFILE_EVENT(TRANS_ROTATE, "transform_rotate_move")
GOMC_PROFILE_EVENT(TRANS_MULTIPARTICLE, "transform_multiParticle_move")
-GOMC_PROFILE_EVENT(TRANS_MULTIPARTICLE_BM, "transform_multiParticleBM_move")
GOMC_PROFILE_EVENT(TRANS_INTRA_SWAP, "transform_intraSwap_move")
GOMC_PROFILE_EVENT(TRANS_INTRA_MEMC, "transform_intraMEMC_move")
GOMC_PROFILE_EVENT(TRANS_CRANKSHAFT, "transform_crankshaft_move")
@@ -62,7 +59,6 @@ GOMC_PROFILE_EVENT(TRANS_CFCMC, "transform_CFCMC_move")
GOMC_PROFILE_EVENT(CALC_EN_DISPLACE, "cal_energy_translate_move")
GOMC_PROFILE_EVENT(CALC_EN_ROTATE, "cal_energy_rotate_move")
GOMC_PROFILE_EVENT(CALC_EN_MULTIPARTICLE, "cal_energy_multiParticle_move")
-GOMC_PROFILE_EVENT(CALC_EN_MULTIPARTICLE_BM, "cal_energy_multiParticleBM_move")
GOMC_PROFILE_EVENT(CALC_EN_INTRA_SWAP, "cal_energy_intraSwap_move")
GOMC_PROFILE_EVENT(CALC_EN_INTRA_MEMC, "cal_energy_intraMEMC_move")
GOMC_PROFILE_EVENT(CALC_EN_CRANKSHAFT, "cal_energy_crankshaft_move")
@@ -76,7 +72,6 @@ GOMC_PROFILE_EVENT(CALC_EN_CFCMC, "cal_energy_CFCMC_move")
GOMC_PROFILE_EVENT(ACC_DISPLACE, "accept_translate_move")
GOMC_PROFILE_EVENT(ACC_ROTATE, "accept_rotate_move")
GOMC_PROFILE_EVENT(ACC_MULTIPARTICLE, "accept_multiParticle_move")
-GOMC_PROFILE_EVENT(ACC_MULTIPARTICLE_BM, "accept_multiParticleBM_move")
GOMC_PROFILE_EVENT(ACC_INTRA_SWAP, "accept_intraSwap_move")
GOMC_PROFILE_EVENT(ACC_INTRA_MEMC, "accept_intraMEMC_move")
GOMC_PROFILE_EVENT(ACC_CRANKSHAFT, "accept_crankshaft_move")
diff --git a/src/GPU/CalculateMinImageCUDAKernel.cuh b/src/GPU/CalculateMinImageCUDAKernel.cuh
index 7ca74252a..f8e14fe93 100644
--- a/src/GPU/CalculateMinImageCUDAKernel.cuh
+++ b/src/GPU/CalculateMinImageCUDAKernel.cuh
@@ -38,47 +38,6 @@ __device__ inline void TransformUnSlantGPU(double3 & dist,
dist.z = slant.x * gpu_Invcell_z[0] + slant.y * gpu_Invcell_z[1] + slant.z * gpu_Invcell_z[2];
}
-
-__device__ inline void WrapPBC(double &v, double &ax)
-{
- if(v >= ax)
- v -= ax;
- else if(v < 0)
- v += ax;
-}
-
-__device__ inline void WrapPBC_f3(double3 &v, double3 &ax)
-{
- WrapPBC(v.x, ax.x);
- WrapPBC(v.y, ax.y);
- WrapPBC(v.z, ax.z);
-}
-
-__device__ inline void UnwrapPBC(
- double &v,
- double &ref,
- double &ax,
- double &halfax)
-{
- if(abs(ref - v) > halfax) {
- if(ref < halfax)
- v -= ax;
- else
- v += ax;
- }
-}
-
-__device__ inline void UnwrapPBC_f3(
- double3 &v,
- double3 &ref,
- double3 &ax,
- double3 &halfax)
-{
- UnwrapPBC(v.x, ref.x, ax.x, halfax.x);
- UnwrapPBC(v.y, ref.y, ax.y, halfax.y);
- UnwrapPBC(v.z, ref.z, ax.z, halfax.z);
-}
-
__device__ inline double MinImageSignedGPU(double raw, double ax, double halfAx)
{
if (raw > halfAx)
diff --git a/src/GPU/ConstantDefinitionsCUDAKernel.cu b/src/GPU/ConstantDefinitionsCUDAKernel.cu
index 0a22f4bc6..822d86deb 100644
--- a/src/GPU/ConstantDefinitionsCUDAKernel.cu
+++ b/src/GPU/ConstantDefinitionsCUDAKernel.cu
@@ -373,7 +373,6 @@ void DestroyCUDAVars(VariablesCUDA *vars)
CUFREE(vars->gpu_cellVector);
CUFREE(vars->gpu_mapParticleToCell);
CUFREE(vars->gpu_nonOrth);
- CUFREE(vars->gpu_startAtomIdx);
for(uint b = 0; b < BOX_TOTAL; b++) {
CUFREE(vars->gpu_cell_x[b]);
CUFREE(vars->gpu_cell_y[b]);
diff --git a/src/GPU/TransformParticlesCUDAKernel.cu b/src/GPU/TransformParticlesCUDAKernel.cu
index a2ccf3068..d928c5d5e 100644
--- a/src/GPU/TransformParticlesCUDAKernel.cu
+++ b/src/GPU/TransformParticlesCUDAKernel.cu
@@ -6,9 +6,7 @@ along with this program, also can be found at .
********************************************************************************/
#ifdef GOMC_CUDA
#include "TransformParticlesCUDAKernel.cuh"
-#include "CalculateMinImageCUDAKernel.cuh"
#include "CUDAMemoryManager.cuh"
-#include "Random123/boxmuller.hpp"
#define MIN_FORCE 1E-12
#define MAX_FORCE 30
@@ -25,19 +23,24 @@ __device__ inline double randomGPU(unsigned int counter, unsigned int step, unsi
return (double)r[0] / UINT_MAX;
}
-__device__ inline double randomGaussianGPU(unsigned int counter, unsigned int step,
- unsigned int seed, double mean, double stdDev)
+__device__ inline double WrapPBC(double &v, double ax)
{
- RNG::ctr_type c = {{}};
- RNG::ukey_type uk = {{}};
- uk[0] = step;
- uk[1] = seed;
- RNG::key_type k = uk;
- c[0] = counter;
- RNG::ctr_type r = philox4x32(c, k);
- float2 normalf2 = r123::boxmuller(r[0], r[1]);
- double shiftedVal = mean + (double)(normalf2.x) * stdDev;
- return shiftedVal;
+ if(v >= ax)
+ v -= ax;
+ else if(v < 0)
+ v += ax;
+ return v;
+}
+
+__device__ inline double UnwrapPBC(double &v, double ref, double ax, double halfax)
+{
+ if(abs(ref - v) > halfax) {
+ if(ref < halfax)
+ v -= ax;
+ else
+ v += ax;
+ }
+ return v;
}
__device__ inline void ApplyRotation(double &x, double &y, double &z,
@@ -50,9 +53,6 @@ __device__ inline void ApplyRotation(double &x, double &y, double &z,
double axisy = roty * (1.0 / rotLen);
double axisz = rotz * (1.0 / rotLen);
double matrix[3][3], cross[3][3], tensor[3][3];
- double halfAxx = axisx * 0.5;
- double halfAxy = axisy * 0.5;
- double halfAxz = axisz * 0.5;
// build cross
cross[0][0] = 0.0;
@@ -95,9 +95,9 @@ __device__ inline void ApplyRotation(double &x, double &y, double &z,
}
// unwrap molecule
- UnwrapPBC(x, comx, axx, halfAxx);
- UnwrapPBC(y, comy, axy, halfAxy);
- UnwrapPBC(z, comz, axz, halfAxz);
+ UnwrapPBC(x, comx, axx, axx / 2.0);
+ UnwrapPBC(y, comy, axy, axy / 2.0);
+ UnwrapPBC(z, comz, axz, axz / 2.0);
// move particle to zero
x -= comx;
@@ -461,484 +461,4 @@ __global__ void RotateParticlesKernel(unsigned int numberOfMolecules,
rotx, roty, rotz, xAxes, yAxes, zAxes);
}
-// CUDA implementation of MultiParticle Brownian transformation
-
-void BrownianMotionRotateParticlesGPU(
- VariablesCUDA *vars,
- const std::vector &moleculeInvolved,
- XYZArray &mTorque,
- XYZArray &newMolPos,
- XYZArray &newCOMs,
- XYZArray &r_k,
- const XYZ &boxAxes,
- const double BETA,
- const double r_max,
- unsigned int step,
- unsigned int seed,
- const int box,
- bool isOrthogonal)
-{
- int atomCount = newMolPos.Count();
- int molCount = newCOMs.Count();
- int molCountInBox = moleculeInvolved.size();
- int *gpu_moleculeInvolved;
- // Each block would handle one molecule
- int threadsPerBlock = 64;
- int blocksPerGrid = molCountInBox;
-
- CUMALLOC((void **) &gpu_moleculeInvolved, molCountInBox * sizeof(int));
-
- cudaMemcpy(vars->gpu_mTorquex, mTorque.x, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_mTorquey, mTorque.y, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_mTorquez, mTorque.z, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_x, newMolPos.x, atomCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_y, newMolPos.y, atomCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_z, newMolPos.z, atomCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_comx, newCOMs.x, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_comy, newCOMs.y, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_comz, newCOMs.z, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(gpu_moleculeInvolved, &moleculeInvolved[0], molCountInBox * sizeof(int), cudaMemcpyHostToDevice);
-
- double3 axis = make_double3(boxAxes.x, boxAxes.y, boxAxes.z);
- double3 halfAx = make_double3(boxAxes.x / 2.0, boxAxes.y / 2.0, boxAxes.z / 2.0);
-
- if(isOrthogonal) {
- BrownianMotionRotateKernel<<< blocksPerGrid, threadsPerBlock>>>(
- vars->gpu_startAtomIdx,
- vars->gpu_x,
- vars->gpu_y,
- vars->gpu_z,
- vars->gpu_mTorquex,
- vars->gpu_mTorquey,
- vars->gpu_mTorquez,
- vars->gpu_comx,
- vars->gpu_comy,
- vars->gpu_comz,
- vars->gpu_r_k_x,
- vars->gpu_r_k_y,
- vars->gpu_r_k_z,
- gpu_moleculeInvolved,
- vars->gpu_cell_x[box],
- vars->gpu_cell_y[box],
- vars->gpu_cell_z[box],
- vars->gpu_Invcell_x[box],
- vars->gpu_Invcell_y[box],
- vars->gpu_Invcell_z[box],
- axis,
- halfAx,
- atomCount,
- r_max,
- step,
- seed,
- BETA);
- } else {
- BrownianMotionRotateKernel<<< blocksPerGrid, threadsPerBlock>>>(
- vars->gpu_startAtomIdx,
- vars->gpu_x,
- vars->gpu_y,
- vars->gpu_z,
- vars->gpu_mTorquex,
- vars->gpu_mTorquey,
- vars->gpu_mTorquez,
- vars->gpu_comx,
- vars->gpu_comy,
- vars->gpu_comz,
- vars->gpu_r_k_x,
- vars->gpu_r_k_y,
- vars->gpu_r_k_z,
- gpu_moleculeInvolved,
- vars->gpu_cell_x[box],
- vars->gpu_cell_y[box],
- vars->gpu_cell_z[box],
- vars->gpu_Invcell_x[box],
- vars->gpu_Invcell_y[box],
- vars->gpu_Invcell_z[box],
- axis,
- halfAx,
- atomCount,
- r_max,
- step,
- seed,
- BETA);
- }
-
- cudaDeviceSynchronize();
- checkLastErrorCUDA(__FILE__, __LINE__);
-
- cudaMemcpy(newMolPos.x, vars->gpu_x, atomCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(newMolPos.y, vars->gpu_y, atomCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(newMolPos.z, vars->gpu_z, atomCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(r_k.x, vars->gpu_r_k_x, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(r_k.y, vars->gpu_r_k_y, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(r_k.z, vars->gpu_r_k_z, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- CUFREE(gpu_moleculeInvolved);
- checkLastErrorCUDA(__FILE__, __LINE__);
-}
-
-template
-__global__ void BrownianMotionRotateKernel(
- int *startAtomIdx,
- double *gpu_x,
- double *gpu_y,
- double *gpu_z,
- double *molTorquex,
- double *molTorquey,
- double *molTorquez,
- double *gpu_comx,
- double *gpu_comy,
- double *gpu_comz,
- double *gpu_r_k_x,
- double *gpu_r_k_y,
- double *gpu_r_k_z,
- int *moleculeInvolved,
- double *gpu_cell_x,
- double *gpu_cell_y,
- double *gpu_cell_z,
- double *gpu_Invcell_x,
- double *gpu_Invcell_y,
- double *gpu_Invcell_z,
- double3 axis,
- double3 halfAx,
- int atomCount,
- double r_max,
- unsigned int step,
- unsigned int seed,
- double BETA)
-{
- //Each grid take cares of one molecule
- int molIndex = moleculeInvolved[blockIdx.x];
- int startIdx = startAtomIdx[molIndex];
- int endIdx = startAtomIdx[molIndex + 1];
- int atomIdx;
-
- __shared__ double matrix[3][3];
- __shared__ double3 com;
-
- // thread 0 will setup the matrix and update the gpu_r_k
- if(threadIdx.x == 0) {
- com = make_double3(gpu_comx[molIndex], gpu_comy[molIndex], gpu_comz[molIndex]);
- // This section calculates the amount of rotation
- double stdDev = sqrt(2.0 * r_max);
- double btm_x = molTorquex[molIndex] * BETA * r_max;
- double btm_y = molTorquey[molIndex] * BETA * r_max;
- double btm_z = molTorquez[molIndex] * BETA * r_max;
-
- double rot_x = btm_x + randomGaussianGPU(molIndex * 3, step, seed, 0.0, stdDev);
- double rot_y = btm_y + randomGaussianGPU(molIndex * 3 + 1, step, seed, 0.0, stdDev);
- double rot_z = btm_z + randomGaussianGPU(molIndex * 3 + 2, step, seed, 0.0, stdDev);
- // update the trial torque
- gpu_r_k_x[molIndex] = rot_x;
- gpu_r_k_y[molIndex] = rot_y;
- gpu_r_k_z[molIndex] = rot_z;
- // build rotation matrix
- double cross[3][3], tensor[3][3];
- double rotLen = sqrt(rot_x * rot_x + rot_y * rot_y + rot_z * rot_z);
- double axisx = rot_x * (1.0 / rotLen);
- double axisy = rot_y * (1.0 / rotLen);
- double axisz = rot_z * (1.0 / rotLen);
- // build cross
- cross[0][0] = 0.0; cross[0][1] = -axisz; cross[0][2] = axisy;
- cross[1][0] = axisz; cross[1][1] = 0.0; cross[1][2] = -axisx;
- cross[2][0] = -axisy; cross[2][1] = axisx; cross[2][2] = 0.0;
- // build tensor
- int i, j;
- for(i = 0; i < 3; ++i) {
- tensor[0][i] = axisx;
- tensor[1][i] = axisy;
- tensor[2][i] = axisz;
- }
- for(i = 0; i < 3; ++i) {
- tensor[i][0] *= axisx;
- tensor[i][1] *= axisy;
- tensor[i][2] *= axisz;
- }
- // build matrix
- double s, c;
- sincos(rotLen, &s, &c);
- for(i = 0; i < 3; ++i) {
- for(j = 0; j < 3; ++j) {
- matrix[i][j] = 0.0;
- }
- matrix[i][i] = c;
- }
- for(i = 0; i < 3; ++i) {
- for(j = 0; j < 3; ++j) {
- matrix[i][j] += s * cross[i][j] + (1 - c) * tensor[i][j];
- }
- }
- }
-
- __syncthreads();
- // use strid of blockDim.x, which is 64
- // each thread handles one atom rotation
- for(atomIdx = startIdx + threadIdx.x; atomIdx < endIdx; atomIdx += blockDim.x) {
- double3 coor = make_double3(gpu_x[atomIdx], gpu_y[atomIdx], gpu_z[atomIdx]);
- // unwrap molecule
- if(isOrthogonal) {
- UnwrapPBC_f3(coor, com, axis, halfAx);
- } else {
- double3 unSlant = make_double3(0.0, 0.0, 0.0);
- TransformUnSlantGPU(unSlant, coor, gpu_Invcell_x, gpu_Invcell_y, gpu_Invcell_z);
- UnwrapPBC_f3(unSlant, com, axis, halfAx);
- TransformSlantGPU(coor, unSlant, gpu_cell_x, gpu_cell_y, gpu_cell_z);
- }
-
- // move COM of molecule to zero
- coor.x -= com.x;
- coor.y -= com.y;
- coor.z -= com.z;
- // rotate
- double newx = matrix[0][0] * coor.x + matrix[0][1] * coor.y + matrix[0][2] * coor.z;
- double newy = matrix[1][0] * coor.x + matrix[1][1] * coor.y + matrix[1][2] * coor.z;
- double newz = matrix[2][0] * coor.x + matrix[2][1] * coor.y + matrix[2][2] * coor.z;
-
- // move back to com
- coor.x = newx + com.x;
- coor.y = newy + com.y;
- coor.z = newz + com.z;
-
- // wrap again
- if(isOrthogonal) {
- WrapPBC_f3(coor, axis);
- } else {
- double3 unSlant = make_double3(0.0, 0.0, 0.0);
- TransformUnSlantGPU(unSlant, coor, gpu_Invcell_x, gpu_Invcell_y, gpu_Invcell_z);
- WrapPBC_f3(unSlant, axis);
- TransformSlantGPU(coor, unSlant, gpu_cell_x, gpu_cell_y, gpu_cell_z);
- }
- // update the new position
- gpu_x[atomIdx] = coor.x;
- gpu_y[atomIdx] = coor.y;
- gpu_z[atomIdx] = coor.z;
- }
-}
-
-void BrownianMotionTranslateParticlesGPU(
- VariablesCUDA *vars,
- const std::vector &moleculeInvolved,
- XYZArray &mForce,
- XYZArray &mForceRec,
- XYZArray &newMolPos,
- XYZArray &newCOMs,
- XYZArray &t_k,
- const XYZ &boxAxes,
- const double BETA,
- const double t_max,
- unsigned int step,
- unsigned int seed,
- const int box,
- bool isOrthogonal)
-{
- int atomCount = newMolPos.Count();
- int molCount = newCOMs.Count();
- int molCountInBox = moleculeInvolved.size();
- int *gpu_moleculeInvolved;
- // Each block would handle one molecule
- int threadsPerBlock = 64;
- int blocksPerGrid = molCountInBox;
-
- CUMALLOC((void **) &gpu_moleculeInvolved, molCountInBox * sizeof(int));
-
- cudaMemcpy(vars->gpu_mForcex, mForce.x, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_mForcey, mForce.y, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_mForcez, mForce.z, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_mForceRecx, mForceRec.x, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_mForceRecy, mForceRec.y, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_mForceRecz, mForceRec.z, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_x, newMolPos.x, atomCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_y, newMolPos.y, atomCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_z, newMolPos.z, atomCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_comx, newCOMs.x, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_comy, newCOMs.y, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(vars->gpu_comz, newCOMs.z, molCount * sizeof(double), cudaMemcpyHostToDevice);
- cudaMemcpy(gpu_moleculeInvolved, &moleculeInvolved[0], molCountInBox * sizeof(int), cudaMemcpyHostToDevice);
-
- double3 axis = make_double3(boxAxes.x, boxAxes.y, boxAxes.z);
- double3 halfAx = make_double3(boxAxes.x / 2.0, boxAxes.y / 2.0, boxAxes.z / 2.0);
-
- if(isOrthogonal) {
- BrownianMotionTranslateKernel<<< blocksPerGrid, threadsPerBlock>>>(
- vars->gpu_startAtomIdx,
- vars->gpu_x,
- vars->gpu_y,
- vars->gpu_z,
- vars->gpu_mForcex,
- vars->gpu_mForcey,
- vars->gpu_mForcez,
- vars->gpu_mForceRecx,
- vars->gpu_mForceRecy,
- vars->gpu_mForceRecz,
- vars->gpu_comx,
- vars->gpu_comy,
- vars->gpu_comz,
- vars->gpu_t_k_x,
- vars->gpu_t_k_y,
- vars->gpu_t_k_z,
- gpu_moleculeInvolved,
- vars->gpu_cell_x[box],
- vars->gpu_cell_y[box],
- vars->gpu_cell_z[box],
- vars->gpu_Invcell_x[box],
- vars->gpu_Invcell_y[box],
- vars->gpu_Invcell_z[box],
- axis,
- halfAx,
- atomCount,
- t_max,
- step,
- seed,
- BETA);
- } else {
- BrownianMotionTranslateKernel<<< blocksPerGrid, threadsPerBlock>>>(
- vars->gpu_startAtomIdx,
- vars->gpu_x,
- vars->gpu_y,
- vars->gpu_z,
- vars->gpu_mForcex,
- vars->gpu_mForcey,
- vars->gpu_mForcez,
- vars->gpu_mForceRecx,
- vars->gpu_mForceRecy,
- vars->gpu_mForceRecz,
- vars->gpu_comx,
- vars->gpu_comy,
- vars->gpu_comz,
- vars->gpu_t_k_x,
- vars->gpu_t_k_y,
- vars->gpu_t_k_z,
- gpu_moleculeInvolved,
- vars->gpu_cell_x[box],
- vars->gpu_cell_y[box],
- vars->gpu_cell_z[box],
- vars->gpu_Invcell_x[box],
- vars->gpu_Invcell_y[box],
- vars->gpu_Invcell_z[box],
- axis,
- halfAx,
- atomCount,
- t_max,
- step,
- seed,
- BETA);
- }
-
- cudaDeviceSynchronize();
- checkLastErrorCUDA(__FILE__, __LINE__);
-
- cudaMemcpy(newMolPos.x, vars->gpu_x, atomCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(newMolPos.y, vars->gpu_y, atomCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(newMolPos.z, vars->gpu_z, atomCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(newCOMs.x, vars->gpu_comx, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(newCOMs.y, vars->gpu_comy, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(newCOMs.z, vars->gpu_comz, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(t_k.x, vars->gpu_t_k_x, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(t_k.y, vars->gpu_t_k_y, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- cudaMemcpy(t_k.z, vars->gpu_t_k_z, molCount * sizeof(double), cudaMemcpyDeviceToHost);
- CUFREE(gpu_moleculeInvolved);
- checkLastErrorCUDA(__FILE__, __LINE__);
-}
-
-
-template
-__global__ void BrownianMotionTranslateKernel(
- int *startAtomIdx,
- double *gpu_x,
- double *gpu_y,
- double *gpu_z,
- double *molForcex,
- double *molForcey,
- double *molForcez,
- double *molForceRecx,
- double *molForceRecy,
- double *molForceRecz,
- double *gpu_comx,
- double *gpu_comy,
- double *gpu_comz,
- double *gpu_t_k_x,
- double *gpu_t_k_y,
- double *gpu_t_k_z,
- int *moleculeInvolved,
- double *gpu_cell_x,
- double *gpu_cell_y,
- double *gpu_cell_z,
- double *gpu_Invcell_x,
- double *gpu_Invcell_y,
- double *gpu_Invcell_z,
- double3 axis,
- double3 halfAx,
- int atomCount,
- double t_max,
- unsigned int step,
- unsigned int seed,
- double BETA)
-{
- //Each grid take cares of one molecule
- int molIndex = moleculeInvolved[blockIdx.x];
- int startIdx = startAtomIdx[molIndex];
- int endIdx = startAtomIdx[molIndex + 1];
- int atomIdx;
-
- __shared__ double3 shift;
-
- // thread 0 will calculate the shift vector and update COM and gpu_t_k
- if(threadIdx.x == 0) {
- double3 com = make_double3(gpu_comx[molIndex], gpu_comy[molIndex], gpu_comz[molIndex]);
- // This section calculates the amount of shift
- double stdDev = sqrt(2.0 * t_max);
- double bfm_x = (molForcex[molIndex] + molForceRecx[molIndex]) * BETA * t_max;
- double bfm_y = (molForcey[molIndex] + molForceRecy[molIndex]) * BETA * t_max;
- double bfm_z = (molForcez[molIndex] + molForceRecz[molIndex]) * BETA * t_max;
-
- shift.x = bfm_x + randomGaussianGPU(molIndex * 3, step, seed, 0.0, stdDev);
- shift.y = bfm_y + randomGaussianGPU(molIndex * 3 + 1, step, seed, 0.0, stdDev);
- shift.z = bfm_z + randomGaussianGPU(molIndex * 3 + 2, step, seed, 0.0, stdDev);
- // update the trial translate
- gpu_t_k_x[molIndex] = shift.x;
- gpu_t_k_y[molIndex] = shift.y;
- gpu_t_k_z[molIndex] = shift.z;
- // shift COM
- com.x += shift.x;
- com.y += shift.y;
- com.z += shift.z;
- // wrap COM
- if(isOrthogonal) {
- WrapPBC_f3(com, axis);
- } else {
- double3 unSlant = make_double3(0.0, 0.0, 0.0);
- TransformUnSlantGPU(unSlant, com, gpu_Invcell_x, gpu_Invcell_y, gpu_Invcell_z);
- WrapPBC_f3(unSlant, axis);
- TransformSlantGPU(com, unSlant, gpu_cell_x, gpu_cell_y, gpu_cell_z);
- }
- //update COM
- gpu_comx[molIndex] = com.x;
- gpu_comy[molIndex] = com.y;
- gpu_comz[molIndex] = com.z;
- }
-
- __syncthreads();
- // use strid of blockDim.x, which is 64
- // each thread handles one atom translation
- for(atomIdx = startIdx + threadIdx.x; atomIdx < endIdx; atomIdx += blockDim.x) {
- double3 coor = make_double3(gpu_x[atomIdx], gpu_y[atomIdx], gpu_z[atomIdx]);
-
- // translate the atom
- coor.x += shift.x;
- coor.y += shift.y;
- coor.z += shift.z;
- // wrap coordinate
- if(isOrthogonal) {
- WrapPBC_f3(coor, axis);
- } else {
- double3 unSlant = make_double3(0.0, 0.0, 0.0);
- TransformUnSlantGPU(unSlant, coor, gpu_Invcell_x, gpu_Invcell_y, gpu_Invcell_z);
- WrapPBC_f3(unSlant, axis);
- TransformSlantGPU(coor, unSlant, gpu_cell_x, gpu_cell_y, gpu_cell_z);
- }
- // update the new position
- gpu_x[atomIdx] = coor.x;
- gpu_y[atomIdx] = coor.y;
- gpu_z[atomIdx] = coor.z;
- }
-}
-
#endif
diff --git a/src/GPU/TransformParticlesCUDAKernel.cuh b/src/GPU/TransformParticlesCUDAKernel.cuh
index ac2e9d67d..0bba24300 100644
--- a/src/GPU/TransformParticlesCUDAKernel.cuh
+++ b/src/GPU/TransformParticlesCUDAKernel.cuh
@@ -104,103 +104,4 @@ __global__ void RotateParticlesKernel(unsigned int numberOfMolecules,
double *gpu_r_k_y,
double *gpu_r_k_z,
int8_t *gpu_isMoleculeInvolved);
-
-// Brownian Motion multiparticle
-void BrownianMotionRotateParticlesGPU(
- VariablesCUDA *vars,
- const std::vector &moleculeInvolved,
- XYZArray &mTorque,
- XYZArray &newMolPos,
- XYZArray &newCOMs,
- XYZArray &r_k,
- const XYZ &boxAxes,
- const double BETA,
- const double r_max,
- unsigned int step,
- unsigned int seed,
- const int box,
- bool isOrthogonal);
-
-
-void BrownianMotionTranslateParticlesGPU(
- VariablesCUDA *vars,
- const std::vector &moleculeInvolved,
- XYZArray &mForce,
- XYZArray &mForceRec,
- XYZArray &newMolPos,
- XYZArray &newCOMs,
- XYZArray &t_k,
- const XYZ &boxAxes,
- const double BETA,
- const double t_max,
- unsigned int step,
- unsigned int seed,
- const int box,
- bool isOrthogonal);
-
-
-template
-__global__ void BrownianMotionRotateKernel(
- int *startAtomIdx,
- double *gpu_x,
- double *gpu_y,
- double *gpu_z,
- double *molTorquex,
- double *molTorquey,
- double *molTorquez,
- double *gpu_comx,
- double *gpu_comy,
- double *gpu_comz,
- double *gpu_r_k_x,
- double *gpu_r_k_y,
- double *gpu_r_k_z,
- int *moleculeInvolved,
- double *gpu_cell_x,
- double *gpu_cell_y,
- double *gpu_cell_z,
- double *gpu_Invcell_x,
- double *gpu_Invcell_y,
- double *gpu_Invcell_z,
- double3 axis,
- double3 halfAx,
- int atomCount,
- double r_max,
- unsigned int step,
- unsigned int seed,
- double BETA);
-
-
-template
-__global__ void BrownianMotionTranslateKernel(
- int *startAtomIdx,
- double *gpu_x,
- double *gpu_y,
- double *gpu_z,
- double *molForcex,
- double *molForcey,
- double *molForcez,
- double *molForceRecx,
- double *molForceRecy,
- double *molForceRecz,
- double *gpu_comx,
- double *gpu_comy,
- double *gpu_comz,
- double *gpu_t_k_x,
- double *gpu_t_k_y,
- double *gpu_t_k_z,
- int *moleculeInvolved,
- double *gpu_cell_x,
- double *gpu_cell_y,
- double *gpu_cell_z,
- double *gpu_Invcell_x,
- double *gpu_Invcell_y,
- double *gpu_Invcell_z,
- double3 axis,
- double3 halfAx,
- int atomCount,
- double t_max,
- unsigned int step,
- unsigned int seed,
- double BETA);
-
#endif
diff --git a/src/GPU/VariablesCUDA.cuh b/src/GPU/VariablesCUDA.cuh
index 4c4568124..a601d6f65 100644
--- a/src/GPU/VariablesCUDA.cuh
+++ b/src/GPU/VariablesCUDA.cuh
@@ -72,7 +72,6 @@ public:
gpu_mForcex = NULL;
gpu_mForcey = NULL;
gpu_mForcez = NULL;
- gpu_startAtomIdx = NULL;
// setting lambda values to null
gpu_molIndex = NULL;
@@ -87,7 +86,6 @@ public:
int *gpu_VDW_Kind;
int *gpu_isMartini;
int *gpu_count;
- int *gpu_startAtomIdx; //start atom index of the molecule
double *gpu_rCut;
double *gpu_rCutCoulomb;
double *gpu_rCutLow;
diff --git a/src/MoleculeLookup.cpp b/src/MoleculeLookup.cpp
index c7764e2bf..dedcd1e6a 100644
--- a/src/MoleculeLookup.cpp
+++ b/src/MoleculeLookup.cpp
@@ -12,16 +12,9 @@ along with this program, also can be found at .
#include
#include
#include
-#ifdef GOMC_CUDA
-#include
-#include
-#include "CUDAMemoryManager.cuh"
-#include "VariablesCUDA.cuh"
-#endif
void MoleculeLookup::Init(const Molecules& mols,
- const pdb_setup::Atoms& atomData,
- Forcefield &ff)
+ const pdb_setup::Atoms& atomData)
{
numKinds = mols.GetKindsCount();
@@ -104,17 +97,6 @@ void MoleculeLookup::Init(const Molecules& mols,
}
}
boxAndKindStart[numKinds * BOX_TOTAL] = mols.count;
-
-// allocate and set gpu variables
-#ifdef GOMC_CUDA
- VariablesCUDA *cudaVars = ff.particles->getCUDAVars();
- int numMol = mols.count + 1;
- // allocate memory to store molecule start atom index
- CUMALLOC((void**) &cudaVars->gpu_startAtomIdx, numMol * sizeof(int));
- // copy start atom index
- cudaMemcpy(cudaVars->gpu_startAtomIdx, mols.start, numMol * sizeof(int), cudaMemcpyHostToDevice);
-#endif
-
}
uint MoleculeLookup::NumInBox(const uint box) const
diff --git a/src/MoleculeLookup.h b/src/MoleculeLookup.h
index f9085c61e..f98f29c7c 100644
--- a/src/MoleculeLookup.h
+++ b/src/MoleculeLookup.h
@@ -10,7 +10,6 @@ along with this program, also can be found at .
#include "EnsemblePreprocessor.h" //for BOX_TOTAL
#include "BasicTypes.h" //For uint
#include "algorithm"
-#include "Forcefield.h"
#include
class CheckpointOutput;
@@ -45,8 +44,7 @@ class MoleculeLookup
}
//Initialize this object to be consistent with Molecules mols
- void Init(Molecules const& mols, const pdb_setup::Atoms& atomData,
- Forcefield &ff);
+ void Init(Molecules const& mols, const pdb_setup::Atoms& atomData);
uint GetNumKind(void) const
{
diff --git a/src/MoveConst.h b/src/MoveConst.h
index 2dc1d56e7..d4a3d5331 100644
--- a/src/MoveConst.h
+++ b/src/MoveConst.h
@@ -29,14 +29,24 @@ const uint GEMC_NPT = 1;
const uint DISPLACE = 0;
const uint ROTATE = 1;
const uint MULTIPARTICLE = 2;
-const uint MULTIPARTICLE_BM = 3;
#if ENSEMBLE == NVT
-const uint INTRA_SWAP = 4;
-const uint REGROWTH = 5;
-const uint INTRA_MEMC = 6;
-const uint CRANKSHAFT = 7;
-const uint MOVE_KINDS_TOTAL = 8;
+const uint INTRA_SWAP = 3;
+const uint REGROWTH = 4;
+const uint INTRA_MEMC = 5;
+const uint CRANKSHAFT = 6;
+const uint MOVE_KINDS_TOTAL = 7;
#elif ENSEMBLE == GCMC
+const uint INTRA_SWAP = 3;
+const uint REGROWTH = 4;
+const uint INTRA_MEMC = 5;
+const uint CRANKSHAFT = 6;
+const uint MEMC = 7;
+const uint MOL_TRANSFER = 8;
+const uint CFCMC = 9;
+const uint TARGETED_SWAP = 10;
+const uint MOVE_KINDS_TOTAL = 11;
+#elif ENSEMBLE == GEMC
+const uint VOL_TRANSFER = 3;
const uint INTRA_SWAP = 4;
const uint REGROWTH = 5;
const uint INTRA_MEMC = 6;
@@ -46,24 +56,13 @@ const uint MOL_TRANSFER = 9;
const uint CFCMC = 10;
const uint TARGETED_SWAP = 11;
const uint MOVE_KINDS_TOTAL = 12;
-#elif ENSEMBLE == GEMC
-const uint VOL_TRANSFER = 4;
-const uint INTRA_SWAP = 5;
-const uint REGROWTH = 6;
-const uint INTRA_MEMC = 7;
-const uint CRANKSHAFT = 8;
-const uint MEMC = 9;
-const uint MOL_TRANSFER = 10;
-const uint CFCMC = 11;
-const uint TARGETED_SWAP = 12;
-const uint MOVE_KINDS_TOTAL = 13;
#elif ENSEMBLE == NPT
-const uint VOL_TRANSFER = 4;
-const uint INTRA_SWAP = 5;
-const uint REGROWTH = 6;
-const uint INTRA_MEMC = 7;
-const uint CRANKSHAFT = 8;
-const uint MOVE_KINDS_TOTAL = 9;
+const uint VOL_TRANSFER = 3;
+const uint INTRA_SWAP = 4;
+const uint REGROWTH = 5;
+const uint INTRA_MEMC = 6;
+const uint CRANKSHAFT = 7;
+const uint MOVE_KINDS_TOTAL = 8;
#endif
const uint BOX0 = 0;
@@ -71,35 +70,32 @@ const uint BOX1 = 1;
//////////////////////////////////////////////////////////
-//NVT : 1. Disp (box 0) 2. Rotate (box 0) 3. MultiParticle (box 0)
-// 4. MultiParticle_BM(box0) 5. IntraSwap (box 0) 6. Regrowth (box 0)
-// 7. IntraMEMC (box 0) 8. CrankShaft (box 0)
+//NVT : 1. Disp (box 0) 2. Rotate (box 0) 3. MultiParticle (box 0)
+// 4. IntraSwap (box 0) 5. Regrowth (box 0) 6. IntraMEMC (box 0)
+// 7. CrankShaft (box 0)
//
//GCMC: 1. Disp (box 0) 2. Rotate (box 0) 3. MultiParticle (box 0)
-// 4. MultiParticle_BM(box0)
-// 5. IntraSwap (box 0) 6. Regrowth (box 0) 7. IntraMEMC (box 0)
-// 8. CrankShaft (box 0) 9. MEMC (box 0) 10. Deletion (box 0)
-// 11. Insertion (box 0) 12. CFCMC (box 0) 13. CFCMC (box 1)
-// 14. TargetedSwap (box 0) 15. TargetedSwap (box 1)
+// 4. IntraSwap (box 0) 5. Regrowth (box 0) 6. IntraMEMC (box 0)
+// 7. CrankShaft (box 0) 8. MEMC (box 0) 9. Deletion (box 0)
+// 10. Insertion (box 0) 11. CFCMC (box 0) 12. CFCMC (box 1)
+// 13. TargetedSwap (box 0) 14. TargetedSwap (box 1)
//
//GEMC: 1. Disp (box 0) 2. Disp (box 1)
// 3. MultiParticle (box 0) 4. MultiParticle (box 1)
-// 5. MultiParticle_BM(box0) 6. MultiParticle_BM(box1)
-// 7. Rotate (box 0) 8. Rotate (box 1)
-// 9. Vol. (b0->b1) 10. Vol. (b1->b0)
-// 11. IntraSwap (box 0) 12. IntraSwap (box 1)
-// 13. Regrowth (box 0) 14. Regrowth (box 1)
-// 15. IntraMEMC (box 0) 16. IntraMEMC (box 1)
-// 17. CrankShaft (box 0) 18. CrankShaft (box 1)
-// 19. MEMC (b0->b1) 20. MEMC (b1->b0)
-// 21. Mol Trans (b0->b1) 22. Mol Trans (b1->b0)
-// 23. CFCMC (b0->b1) 24. CFCMC (b1->b0)
-// 25. TargetedSwap (b0->b1) 26. TargetedSwap (b1->b0)
+// 5. Rotate (box 0) 6. Rotate (box 1)
+// 7. Vol. (b0->b1) 8. Vol. (b1->b0)
+// 9. IntraSwap (box 0) 10. IntraSwap (box 1)
+// 11. Regrowth (box 0) 12. Regrowth (box 1)
+// 13. IntraMEMC (box 0) 14. IntraMEMC (box 1)
+// 15. CrankShaft (box 0) 16. CrankShaft (box 1)
+// 17. MEMC (b0->b1) 18. MEMC (b1->b0)
+// 19. Mol Trans (b0->b1) 20. Mol Trans (b1->b0)
+// 21. CFCMC (b0->b1) 22. CFCMC (b1->b0)
+// 23. TargetedSwap (b0->b1) 24. TargetedSwap (b1->b0)
//
//NPT : 1. Disp (box 0) 2. Rotate (box 0) 3. MultiParticle (box 0)
-// 4. MultiParticle_BM (box0)
-// 5. Vol. (box 0) 6. IntraSwap (box 0) 7. Regrowth (box 0)
-// 8. IntraMEMC (box 0) 9. CrankShaft (box 0)
+// 4. Vol. (box 0) 5. IntraSwap (box 0) 6. Regrowth (box 0)
+// 7. IntraMEMC (box 0) 8. CrankShaft (box 0)
//AUTO REJECTION OR ACCEPTANCE FLAGS
diff --git a/src/MoveSettings.cpp b/src/MoveSettings.cpp
index 58057937b..e6a4d63fa 100644
--- a/src/MoveSettings.cpp
+++ b/src/MoveSettings.cpp
@@ -93,7 +93,7 @@ void MoveSettings::Update(const uint move, const bool isAccepted,
tempAccepted[box][move][kind]++;
accepted[box][move][kind]++;
- if(move != mv::MULTIPARTICLE || move != mv::MULTIPARTICLE_BM) {
+ if(move != mv::MULTIPARTICLE) {
SetSingleMoveAccepted(box);
#if ENSEMBLE == GEMC
//GEMC has multiple boxes and this move changed both boxes, so we
@@ -109,7 +109,7 @@ void MoveSettings::Update(const uint move, const bool isAccepted,
}
}
- if(move == mv::MULTIPARTICLE || move == mv::MULTIPARTICLE_BM)
+ if(move == mv::MULTIPARTICLE)
UnsetSingleMoveAccepted(box);
acceptPercent[box][move][kind] = (double)(accepted[box][move][kind]) /
@@ -117,7 +117,7 @@ void MoveSettings::Update(const uint move, const bool isAccepted,
//for any move that we don't care about kind of molecule, it should be included
//in the if condition
- if (move == mv::INTRA_MEMC || move == mv::MULTIPARTICLE || move == mv::MULTIPARTICLE_BM
+ if (move == mv::INTRA_MEMC || move == mv::MULTIPARTICLE
#if ENSEMBLE == GEMC || ENSEMBLE == GCMC
|| move == mv::MEMC
#endif
@@ -255,7 +255,7 @@ uint MoveSettings::GetAcceptTot(const uint box, const uint move) const
sum += accepted[box][move][k];
}
- if(move == mv::INTRA_MEMC || move == mv::MULTIPARTICLE || move == mv::MULTIPARTICLE_BM
+ if(move == mv::INTRA_MEMC || move == mv::MULTIPARTICLE
#if ENSEMBLE == GEMC || ENSEMBLE == GCMC
|| move == mv::MEMC
#endif
@@ -284,7 +284,7 @@ uint MoveSettings::GetTrialTot(const uint box, const uint move) const
sum += tries[box][move][k];
}
- if(move == mv::INTRA_MEMC || move == mv::MULTIPARTICLE || move == mv::MULTIPARTICLE_BM
+ if(move == mv::INTRA_MEMC || move == mv::MULTIPARTICLE
#if ENSEMBLE == GEMC || ENSEMBLE == GCMC
|| move == mv::MEMC
#endif
diff --git a/src/PRNG.h b/src/PRNG.h
index 227cd75ed..57729f165 100644
--- a/src/PRNG.h
+++ b/src/PRNG.h
@@ -31,7 +31,7 @@ along with this program, also can be found at .
class PRNG
{
public:
- PRNG(MoleculeLookup & molLook) : molLookRef(molLook), hasSecondGaussian(false) {}
+ PRNG(MoleculeLookup & molLook) : molLookRef(molLook) {}
~PRNG(void)
{
delete gen;
@@ -517,28 +517,6 @@ class PRNG
return PickMol(m, mk, b, subDraw, boxDiv);
}
- //draw a uniform distribution with average mean
- // and standard deviation stdDev
- double Gaussian(double mean, double stdDev)
- {
- if(hasSecondGaussian) {
- hasSecondGaussian = false;
- return (mean + secondGaussian * stdDev);
- } else {
- double r, v1, v2, factor;
- do {
- v1 = Sym(1.0);
- v2 = Sym(1.0);
- r = v1*v1 + v2*v2;
- } while (r >= 1.0 || r < 1.523e-8);
-
- factor = sqrt(-2.0 * log(r) / r);
- hasSecondGaussian = true;
- secondGaussian = v1 * factor;
- return (mean + v2 * factor * stdDev);
- }
- }
-
MTRand * GetGenerator()
{
return gen;
@@ -547,8 +525,6 @@ class PRNG
private:
MTRand * gen;
MoleculeLookup & molLookRef;
- bool hasSecondGaussian;
- double secondGaussian;
};
//Saves the current state of the PRNG as ./filename
diff --git a/src/Random123Wrapper.cpp b/src/Random123Wrapper.cpp
deleted file mode 100644
index e3ffb65ce..000000000
--- a/src/Random123Wrapper.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#include "Random123Wrapper.h"
-#include "Random123/boxmuller.hpp"
-#include
-
-Random123Wrapper::Random123Wrapper()
-{
- c = {{}};
- uk = {{}};
-}
-
-void Random123Wrapper::SetStep(unsigned int step)
-{
- uk[0] = step;
-}
-void Random123Wrapper::SetRandomSeed(unsigned int seedValue)
-{
- uk[1] = seedValue;
-}
-
-double Random123Wrapper::GetRandomNumber(unsigned int counter)
-{
- c[0] = counter;
- RNG::key_type k = uk;
- RNG::ctr_type r = rng(c, k);
- double r01 = r[0];
- r01 /= UINT_MAX;
- return r01;
-}
-
-unsigned int Random123Wrapper::GetStep()
-{
- return uk[0];
-}
-
-unsigned int Random123Wrapper::GetSeedValue()
-{
- return uk[1];
-}
-
-double Random123Wrapper::operator() (unsigned int counter)
-{
- return GetRandomNumber(counter);
-}
-
-double Random123Wrapper::GetGaussian(unsigned int counter)
-{
- c[0] = counter;
- RNG::key_type k = uk;
- RNG::ctr_type r = rng(c, k);
- r123::float2 normalf2 = r123::boxmuller(r[0], r[1]);
- return double(normalf2.x);
-}
-
-double Random123Wrapper::GetGaussianNumber(unsigned int counter, double mean, double stdDev)
-{
- double gNum = this->GetGaussian(counter);
- return (mean + gNum * stdDev);
-}
diff --git a/src/Random123Wrapper.h b/src/Random123Wrapper.h
index 730a919c1..f1dc29687 100644
--- a/src/Random123Wrapper.h
+++ b/src/Random123Wrapper.h
@@ -6,19 +6,41 @@ typedef r123::Philox4x32 RNG;
class Random123Wrapper
{
public:
- Random123Wrapper();
+ Random123Wrapper()
+ {
+ c = {{}};
+ uk = {{}};
+ }
- void SetStep(unsigned int step);
- void SetRandomSeed(unsigned int seedValue);
-
- double GetRandomNumber(unsigned int counter);
-
- unsigned int GetStep();
- unsigned int GetSeedValue();
- double operator() (unsigned int counter);
-
- double GetGaussian(unsigned int counter);
- double GetGaussianNumber(unsigned int counter, double mean, double stdDev);
+ void SetStep(unsigned int step)
+ {
+ uk[0] = step;
+ }
+ void SetRandomSeed(unsigned int seedValue)
+ {
+ uk[1] = seedValue;
+ }
+ double GetRandomNumber(unsigned int counter)
+ {
+ c[0] = counter;
+ RNG::key_type k = uk;
+ RNG::ctr_type r = rng(c, k);
+ double r01 = r[0];
+ r01 /= UINT_MAX;
+ return r01;
+ }
+ unsigned int GetStep()
+ {
+ return uk[0];
+ }
+ unsigned int GetSeedValue()
+ {
+ return uk[1];
+ }
+ double operator() (unsigned int counter)
+ {
+ return GetRandomNumber(counter);
+ }
private:
RNG::ctr_type c;
diff --git a/src/StaticVals.cpp b/src/StaticVals.cpp
index 187d82a12..dd83deee6 100644
--- a/src/StaticVals.cpp
+++ b/src/StaticVals.cpp
@@ -18,7 +18,7 @@ void StaticVals::Init(Setup & set, System& sys)
forcefield.Init(set);
mol.Init(set, forcefield, sys);
#ifndef VARIABLE_PARTICLE_NUMBER
- molLookup.Init(mol, set.pdb.atoms, forcefield);
+ molLookup.Init(mol, set.pdb.atoms);
#endif
InitMovePercents(set.config.sys.moves);
#if ENSEMBLE == GEMC || ENSEMBLE == NPT
@@ -45,9 +45,6 @@ void StaticVals::InitMovePercents(config_setup::MovePercents const& perc)
case mv::MULTIPARTICLE:
movePerc[m] = perc.multiParticle;
break;
- case mv::MULTIPARTICLE_BM:
- movePerc[m] = perc.multiParticleBrownian;
- break;
case mv::ROTATE:
movePerc[m] = perc.rotate;
break;
diff --git a/src/System.cpp b/src/System.cpp
index e9b1dbc6c..747fedca5 100644
--- a/src/System.cpp
+++ b/src/System.cpp
@@ -23,7 +23,6 @@ along with this program, also can be found at .
#include "MoleculeTransfer.h"
#include "IntraSwap.h"
#include "MultiParticle.h"
-#include "MultiParticleBrownianMotion.h"
#include "Regrowth.h"
#include "MoleculeExchange1.h"
#include "MoleculeExchange2.h"
@@ -69,8 +68,6 @@ System::~System()
delete calcEwald;
delete moves[mv::DISPLACE];
delete moves[mv::ROTATE];
- delete moves[mv::MULTIPARTICLE];
- delete moves[mv::MULTIPARTICLE_BM];
delete moves[mv::INTRA_SWAP];
delete moves[mv::REGROWTH];
delete moves[mv::INTRA_MEMC];
@@ -100,7 +97,7 @@ void System::Init(Setup & set, ulong & startStep)
prngParallelTemp->Init(set.prngParallelTemp.prngMaker.prng);
#endif
#ifdef VARIABLE_PARTICLE_NUMBER
- molLookup.Init(statV.mol, set.pdb.atoms, statV.forcefield);
+ molLookup.Init(statV.mol, set.pdb.atoms);
#endif
moveSettings.Init(statV, set.pdb.remarks, molLookupRef.GetNumKind());
@@ -168,7 +165,6 @@ void System::InitMoves(Setup const& set)
{
moves[mv::DISPLACE] = new Translate(*this, statV);
moves[mv::MULTIPARTICLE] = new MultiParticle(*this, statV);
- moves[mv::MULTIPARTICLE_BM] = new MultiParticleBrownian(*this, statV);
moves[mv::ROTATE] = new Rotate(*this, statV);
moves[mv::INTRA_SWAP] = new IntraSwap(*this, statV);
moves[mv::REGROWTH] = new Regrowth(*this, statV);
@@ -262,7 +258,7 @@ void System::RecalculateTrajectory(Setup &set, uint frameNum)
set.pdb.Init(set.config.in.restart, set.config.in.files.pdb.name, frameNum);
statV.InitOver(set, *this);
#ifdef VARIABLE_PARTICLE_NUMBER
- molLookup.Init(statV.mol, set.pdb.atoms, statV.forcefield);
+ molLookup.Init(statV.mol, set.pdb.atoms);
#endif
coordinates.InitFromPDB(set.pdb.atoms);
com.CalcCOM();
@@ -354,7 +350,6 @@ void System::PrintTime()
printf("%-36s %10.4f sec.\n", "Displacement:", moveTime[mv::DISPLACE]);
printf("%-36s %10.4f sec.\n", "Rotation:", moveTime[mv::ROTATE]);
printf("%-36s %10.4f sec.\n", "MultiParticle:", moveTime[mv::MULTIPARTICLE]);
- printf("%-36s %10.4f sec.\n", "MultiParticle-Brownian:", moveTime[mv::MULTIPARTICLE_BM]);
printf("%-36s %10.4f sec.\n", "Intra-Swap:", moveTime[mv::INTRA_SWAP]);
printf("%-36s %10.4f sec.\n", "Regrowth:", moveTime[mv::REGROWTH]);
printf("%-36s %10.4f sec.\n", "Intra-MEMC:", moveTime[mv::INTRA_MEMC]);
diff --git a/src/moves/MultiParticle.h b/src/moves/MultiParticle.h
index f546a5ead..23257e597 100644
--- a/src/moves/MultiParticle.h
+++ b/src/moves/MultiParticle.h
@@ -47,7 +47,6 @@ class MultiParticle : public MoveBase
Coordinates newMolsPos;
COM newCOMs;
int moveType;
- bool allTranslate;
std::vector moleculeIndex;
const MoleculeLookup& molLookup;
#ifdef GOMC_CUDA
@@ -91,16 +90,6 @@ inline MultiParticle::MultiParticle(System &sys, StaticVals const &statV) :
initMol[b] = false;
}
- // Check to see if we have only monoatomic molecule or not
- allTranslate = false;
- int numAtomsPerKind = 0;
- for (int k = 0; k < molLookup.GetNumKind(); ++k) {
- numAtomsPerKind += molRef.NumAtoms(k);
- }
- // If we have only one atom in each kind, it means all molecule
- // in the system is monoatomic
- allTranslate = (numAtomsPerKind == molLookup.GetNumKind());
-
#ifdef GOMC_CUDA
cudaVars = sys.statV.forcefield.particles->getCUDAVars();
@@ -167,21 +156,17 @@ inline uint MultiParticle::Prep(const double subDraw, const double movPerc)
prng.PickBox(bPick, subDraw, movPerc);
#endif
- // In each step, we perform either:
- // 1- All displacement move.
- // 2- All rotation move.
- if(allTranslate) {
- moveType = mp::MPDISPLACE;
- } else {
- moveType = prng.randIntExc(mp::MPTOTALTYPES);
- }
-
+ moveType = prng.randIntExc(mp::MPTOTALTYPES);
SetMolInBox(bPick);
if (moleculeIndex.size() == 0) {
std::cout << "Warning: MultiParticle move can't move any molecules, Skipping...\n";
state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX;
return state;
}
+ uint length = molRef.GetKind(moleculeIndex[0]).NumAtoms();
+ if(length == 1) {
+ moveType = mp::MPDISPLACE;
+ }
//We don't use forces for non-MP moves, so we need to calculate them for the
//current system if any other moves, besides other MP moves, have been accepted.
@@ -532,13 +517,6 @@ inline void MultiParticle::RotateForceBiased(uint molIndex)
inline void MultiParticle::TranslateForceBiased(uint molIndex)
{
XYZ shift = t_k.Get(molIndex);
- if(shift > boxDimRef.GetHalfAxis(bPick)) {
- std::cout << "Error: Trial Displacement exceed half of the box length in Multiparticle \n"
- << " move!\n";
- std::cout << " Trial transformation vector: " << shift << std::endl;
- std::cout << " Box Dimension: " << boxDimRef.GetAxis(bPick) << std::endl << std::endl;
- exit(EXIT_FAILURE);
- }
XYZ newcom = newCOMs.Get(molIndex);
uint stop, start, len;
diff --git a/src/moves/MultiParticleBrownianMotion.h b/src/moves/MultiParticleBrownianMotion.h
deleted file mode 100644
index f766e7063..000000000
--- a/src/moves/MultiParticleBrownianMotion.h
+++ /dev/null
@@ -1,530 +0,0 @@
-/*******************************************************************************
-GPU OPTIMIZED MONTE CARLO (GOMC) 2.50
-Copyright (C) 2018 GOMC Group
-A copy of the GNU General Public License can be found in the COPYRIGHT.txt
-along with this program, also can be found at .
-********************************************************************************/
-#ifndef MULTIPARTICLEBROWNIANMOTION_H
-#define MULTIPARTICLEBROWNIANMOTION_H
-
-#include "MoveBase.h"
-#include "System.h"
-#include "StaticVals.h"
-#include
-#include "Random123Wrapper.h"
-#ifdef GOMC_CUDA
-#include "TransformParticlesCUDAKernel.cuh"
-#include "VariablesCUDA.cuh"
-#endif
-
-class MultiParticleBrownian : public MoveBase
-{
-public:
- MultiParticleBrownian(System &sys, StaticVals const& statV);
-
- virtual uint Prep(const double subDraw, const double movPerc);
- virtual void CalcEn();
- virtual uint Transform();
- virtual void Accept(const uint rejectState, const uint step);
- virtual void PrintAcceptKind();
- //used in CFCMC for initialization
- void PrepCFCMC(const uint box);
-
-private:
- uint bPick;
- bool initMol;
- SystemPotential sysPotNew;
- XYZArray molTorqueRef;
- XYZArray molTorqueNew;
- XYZArray atomForceRecNew;
- XYZArray molForceRecNew;
- XYZArray t_k;
- XYZArray r_k;
- Coordinates newMolsPos;
- COM newCOMs;
- int moveType;
- std::vector moleculeIndex;
- const MoleculeLookup& molLookup;
- Random123Wrapper &r123wrapper;
- bool allTranslate;
-#ifdef GOMC_CUDA
- VariablesCUDA *cudaVars;
- bool isOrthogonal;
-#endif
-
- double GetCoeff();
- void CalculateTrialDistRot();
- void RotateForceBiased(uint molIndex);
- void TranslateForceBiased(uint molIndex);
- void SetMolInBox(uint box);
- XYZ CalcRandomTransform(XYZ const &lb, double const max, uint molIndex);
- double CalculateWRatio(XYZ const &lb_new, XYZ const &lb_old, XYZ const &k,
- double max4);
-};
-
-inline MultiParticleBrownian::MultiParticleBrownian(System &sys, StaticVals const &statV) :
- MoveBase(sys, statV),
- newMolsPos(sys.boxDimRef, newCOMs, sys.molLookupRef, sys.prng, statV.mol),
- newCOMs(sys.boxDimRef, newMolsPos, sys.molLookupRef, statV.mol),
- molLookup(sys.molLookup), r123wrapper(sys.r123wrapper)
-{
- molTorqueNew.Init(sys.com.Count());
- molTorqueRef.Init(sys.com.Count());
- atomForceRecNew.Init(sys.coordinates.Count());
- molForceRecNew.Init(sys.com.Count());
-
- t_k.Init(sys.com.Count());
- r_k.Init(sys.com.Count());
- newMolsPos.Init(sys.coordinates.Count());
- newCOMs.Init(sys.com.Count());
-
- initMol = false;
-
- // Check to see if we have only monoatomic molecule or not
- allTranslate = false;
- int numAtomsPerKind = 0;
- for (int k = 0; k < molLookup.GetNumKind(); ++k) {
- numAtomsPerKind += molRef.NumAtoms(k);
- }
- // If we have only one atom in each kind, it means all molecule
- // in the system is monoatomic
- allTranslate = (numAtomsPerKind == molLookup.GetNumKind());
-
-#ifdef GOMC_CUDA
- cudaVars = sys.statV.forcefield.particles->getCUDAVars();
- isOrthogonal = statV.isOrthogonal;
-#endif
-}
-
-inline void MultiParticleBrownian::PrintAcceptKind()
-{
- printf("%-37s", "% Accepted MultiParticle-Brownian ");
- for(uint b = 0; b < BOX_TOTAL; b++) {
- printf("%10.5f ", 100.0 * moveSetRef.GetAccept(b, mv::MULTIPARTICLE_BM));
- }
- std::cout << std::endl;
-}
-
-
-inline void MultiParticleBrownian::SetMolInBox(uint box)
-{
- // NEED to check if atom is not fixed!
-#if ENSEMBLE == GCMC || ENSEMBLE == GEMC
- // need to be initialized for every move since number of atom is changing
- moleculeIndex.clear();
- MoleculeLookup::box_iterator thisMol = molLookup.BoxBegin(box);
- MoleculeLookup::box_iterator end = molLookup.BoxEnd(box);
- while(thisMol != end) {
- //Make sure this molecule is not fixed in its position
- if(!molLookup.IsFix(*thisMol)) {
- moleculeIndex.push_back(*thisMol);
- }
- thisMol++;
- }
-#else
- // box would be always 0 in NVT or NPT ensemble, initialize it once
- if(!initMol) {
- moleculeIndex.clear();
- MoleculeLookup::box_iterator thisMol = molLookup.BoxBegin(box);
- MoleculeLookup::box_iterator end = molLookup.BoxEnd(box);
- while(thisMol != end) {
- //Make sure this molecule is not fixed in its position
- if(!molLookup.IsFix(*thisMol)) {
- moleculeIndex.push_back(*thisMol);
- }
- thisMol++;
- }
- initMol = true;
- }
-#endif
-}
-
-inline uint MultiParticleBrownian::Prep(const double subDraw, const double movPerc)
-{
- GOMC_EVENT_START(1, GomcProfileEvent::PREP_MULTIPARTICLE_BM);
- uint state = mv::fail_state::NO_FAIL;
-#if ENSEMBLE == GCMC
- bPick = mv::BOX0;
-#else
- prng.PickBox(bPick, subDraw, movPerc);
-#endif
-
- // In each step, we perform either:
- // 1- All displacement move.
- // 2- All rotation move.
- if(allTranslate) {
- moveType = mp::MPDISPLACE;
- } else {
- moveType = prng.randIntExc(mp::MPTOTALTYPES);
- }
-
- SetMolInBox(bPick);
- if (moleculeIndex.size() == 0) {
- std::cout << "Warning: MultiParticleBrownian move can't move any molecules, Skipping...\n";
- state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX;
- return state;
- }
-
- //We don't use forces for non-MP moves, so we need to calculate them for the
- //current system if any other moves, besides other MP moves, have been accepted.
- //Or, if this is the first MP move, which is handled with the same flag.
- if(moveSetRef.GetSingleMoveAccepted(bPick)) {
- GOMC_EVENT_START(1, GomcProfileEvent::CALC_EN_MULTIPARTICLE_BM);
- //Copy ref reciprocal terms to new for calculation with old positions
- calcEwald->CopyRecip(bPick);
-
- //Calculate force for long range electrostatic using old position
- calcEwald->BoxForceReciprocal(coordCurrRef, atomForceRecRef, molForceRecRef, bPick);
-
- //calculate short range energy and force for old positions
- calcEnRef.BoxForce(sysPotRef, coordCurrRef, atomForceRef, molForceRef,
- boxDimRef, bPick);
-
- if(moveType == mp::MPROTATE) {
- //Calculate Torque for old positions
- calcEnRef.CalculateTorque(moleculeIndex, coordCurrRef, comCurrRef,
- atomForceRef, atomForceRecRef, molTorqueRef, bPick);
- }
-
- sysPotRef.Total();
- GOMC_EVENT_STOP(1, GomcProfileEvent::CALC_EN_MULTIPARTICLE_BM);
- }
- coordCurrRef.CopyRange(newMolsPos, 0, 0, coordCurrRef.Count());
- comCurrRef.CopyRange(newCOMs, 0, 0, comCurrRef.Count());
- GOMC_EVENT_STOP(1, GomcProfileEvent::PREP_MULTIPARTICLE_BM);
- return state;
-}
-
-inline void MultiParticleBrownian::PrepCFCMC(const uint box)
-{
- bPick = box;
- moveType = prng.randIntExc(mp::MPTOTALTYPES);
- SetMolInBox(bPick);
- uint length = molRef.GetKind(moleculeIndex[0]).NumAtoms();
- if(length == 1) {
- moveType = mp::MPDISPLACE;
- }
-
- //We don't use forces for non-MP moves, so we need to calculate them for the
- //current system if any other moves, besides other MP moves, have been accepted.
- //Or, if this is the first MP move, which is handled with the same flag.
- if(moveSetRef.GetSingleMoveAccepted(bPick)) {
- //Copy ref reciprocal terms to new for calculation with old positions
- calcEwald->CopyRecip(bPick);
-
- //Calculate long range electrostatic force for old positions
- calcEwald->BoxForceReciprocal(coordCurrRef, atomForceRecRef, molForceRecRef, bPick);
-
- //Calculate short range energy and force for old positions
- calcEnRef.BoxForce(sysPotRef, coordCurrRef, atomForceRef, molForceRef,
- boxDimRef, bPick);
-
- if(moveType == mp::MPROTATE) {
- //Calculate Torque for old positions
- calcEnRef.CalculateTorque(moleculeIndex, coordCurrRef, comCurrRef,
- atomForceRef, atomForceRecRef, molTorqueRef, bPick);
- }
-
- sysPotRef.Total();
- }
- coordCurrRef.CopyRange(newMolsPos, 0, 0, coordCurrRef.Count());
- comCurrRef.CopyRange(newCOMs, 0, 0, comCurrRef.Count());
-}
-
-inline uint MultiParticleBrownian::Transform()
-{
- GOMC_EVENT_START(1, GomcProfileEvent::TRANS_MULTIPARTICLE_BM);
- // Based on the reference force decided whether to displace or rotate each
- // individual particle.
- uint state = mv::fail_state::NO_FAIL;
-
-#ifdef GOMC_CUDA
- // This kernel will calculate translation/rotation amount + shifting/rotating
- if(moveType == mp::MPROTATE) {
- double r_max = moveSetRef.GetRMAX(bPick);
- BrownianMotionRotateParticlesGPU(
- cudaVars,
- moleculeIndex,
- molTorqueRef,
- newMolsPos,
- newCOMs,
- r_k,
- boxDimRef.GetAxis(bPick),
- BETA,
- r_max,
- r123wrapper.GetStep(),
- r123wrapper.GetSeedValue(),
- bPick,
- isOrthogonal);
-
- } else {
- double t_max = moveSetRef.GetTMAX(bPick);
- BrownianMotionTranslateParticlesGPU(
- cudaVars,
- moleculeIndex,
- molForceRef,
- molForceRecRef,
- newMolsPos,
- newCOMs,
- t_k,
- boxDimRef.GetAxis(bPick),
- BETA,
- t_max,
- r123wrapper.GetStep(),
- r123wrapper.GetSeedValue(),
- bPick,
- isOrthogonal);
-
- }
-#else
- // Calculate trial translate and rotate
- // move particles according to force and torque and store them in the new pos
- CalculateTrialDistRot();
-#endif
- GOMC_EVENT_STOP(1, GomcProfileEvent::TRANS_MULTIPARTICLE_BM);
- return state;
-}
-
-inline void MultiParticleBrownian::CalcEn()
-{
- GOMC_EVENT_START(1, GomcProfileEvent::CALC_EN_MULTIPARTICLE_BM);
- // Calculate the new force and energy and we will compare that to the
- // reference values in Accept() function
- cellList.GridAll(boxDimRef, newMolsPos, molLookup);
-
- //back up cached fourier term
- calcEwald->backupMolCache();
-
- //setup reciprocate vectors for new positions
- calcEwald->BoxReciprocalSetup(bPick, newMolsPos);
-
- sysPotNew = sysPotRef;
- //calculate short range energy and force
- sysPotNew = calcEnRef.BoxForce(sysPotNew, newMolsPos, atomForceNew,
- molForceNew, boxDimRef, bPick);
- //calculate long range of new electrostatic energy
- sysPotNew.boxEnergy[bPick].recip = calcEwald->BoxReciprocal(bPick, false);
- //Calculate long range of new electrostatic force
- calcEwald->BoxForceReciprocal(newMolsPos, atomForceRecNew, molForceRecNew,
- bPick);
-
- if(moveType == mp::MPROTATE) {
- //Calculate Torque for new positions
- calcEnRef.CalculateTorque(moleculeIndex, newMolsPos, newCOMs, atomForceNew,
- atomForceRecNew, molTorqueNew, bPick);
- }
- sysPotNew.Total();
- GOMC_EVENT_STOP(1, GomcProfileEvent::CALC_EN_MULTIPARTICLE);
-}
-
-inline double MultiParticleBrownian::CalculateWRatio(XYZ const &lb_new, XYZ const &lb_old,
- XYZ const &k, double max4)
-{
- double w_ratio = 0.0;
- XYZ old_var = lb_old - k;
- XYZ new_var = lb_new + k;
-
- //Note: we could factor max4 and multiply at the end, but
- // for the move, where we translate and rotate all molecules,
- // this method would not work. Hence, I did not factor it.
- // its actually is w_ratio += -1.0* but we simplify it
- w_ratio -= (new_var.LengthSq() / max4);
- // its actually is w_ratio -= -1.0* but we simplify it
- w_ratio += (old_var.LengthSq() / max4);
-
- return w_ratio;
-}
-
-inline double MultiParticleBrownian::GetCoeff()
-{
- // calculate (w_new->old/w_old->new) and return it.
- double w_ratio = 0.0;
- double r_max = moveSetRef.GetRMAX(bPick);
- double t_max = moveSetRef.GetTMAX(bPick);
- double r_max4 = 4.0 * r_max;
- double t_max4 = 4.0 * t_max;
-
- if(moveType == mp::MPROTATE) {// rotate,
-#ifdef _OPENMP
- #pragma omp parallel for default(none) shared(moleculeIndex, r_max, t_max, r_max4, t_max4) reduction(+:w_ratio)
-#endif
- for(int m = 0; m < moleculeIndex.size(); m++) {
- uint molNumber = moleculeIndex[m];
- // rotate, bt_ = BETA * force * maxForce
- XYZ bt_old = molTorqueRef.Get(molNumber) * BETA * r_max;
- XYZ bt_new = molTorqueNew.Get(molNumber) * BETA * r_max;
- w_ratio += CalculateWRatio(bt_new, bt_old, r_k.Get(molNumber), r_max4);
- }
- } else {// displace
-#ifdef _OPENMP
- #pragma omp parallel for default(none) shared(moleculeIndex, r_max, t_max, r_max4, t_max4) reduction(+:w_ratio)
-#endif
- for(int m = 0; m < moleculeIndex.size(); m++) {
- uint molNumber = moleculeIndex[m];
- // bf_ = BETA * torque * maxTorque
- XYZ bf_old = (molForceRef.Get(molNumber) + molForceRecRef.Get(molNumber)) *
- BETA * t_max;
- XYZ bf_new = (molForceNew.Get(molNumber) + molForceRecNew.Get(molNumber)) *
- BETA * t_max;
- w_ratio += CalculateWRatio(bf_new, bf_old, t_k.Get(molNumber), t_max4);
- }
- }
-
- return w_ratio;
-}
-
-inline void MultiParticleBrownian::Accept(const uint rejectState, const uint step)
-{
- GOMC_EVENT_START(1, GomcProfileEvent::ACC_MULTIPARTICLE_BM);
- // Here we compare the values of reference and trial and decide whether to
- // accept or reject the move
- double MPCoeff = GetCoeff();
- double accept = exp(-BETA * (sysPotNew.Total() - sysPotRef.Total()) + MPCoeff);
- bool result = (rejectState == mv::fail_state::NO_FAIL) && prng() < accept;
- if(result) {
- sysPotRef = sysPotNew;
- swap(coordCurrRef, newMolsPos);
- swap(comCurrRef, newCOMs);
- swap(molForceRef, molForceNew);
- swap(atomForceRef, atomForceNew);
- swap(molForceRecRef, molForceRecNew);
- swap(atomForceRecRef, atomForceRecNew);
- swap(molTorqueRef, molTorqueNew);
- //update reciprocate value
- calcEwald->UpdateRecip(bPick);
- } else {
- cellList.GridAll(boxDimRef, coordCurrRef, molLookup);
- calcEwald->exgMolCache();
- }
-
- moveSetRef.UpdateMoveSettingMultiParticle(bPick, result, moveType);
- moveSetRef.Update(mv::MULTIPARTICLE_BM, result, bPick);
- GOMC_EVENT_STOP(1, GomcProfileEvent::ACC_MULTIPARTICLE_BM);
-}
-
-inline XYZ MultiParticleBrownian::CalcRandomTransform(XYZ const &lb, double const max, uint molIndex)
-{
- XYZ lbmax = lb * max;
- XYZ num;
- //variance is 2A according to the paper, so stdDev is sqrt(variance)
- double stdDev = sqrt(2.0 * max);
-
- num.x = lbmax.x + r123wrapper.GetGaussianNumber(molIndex * 3 + 0, 0.0, stdDev);
- num.y = lbmax.y + r123wrapper.GetGaussianNumber(molIndex * 3 + 1, 0.0, stdDev);
- num.z = lbmax.z + r123wrapper.GetGaussianNumber(molIndex * 3 + 2, 0.0, stdDev);
-
-
- if(num.Length() >= boxDimRef.axis.Min(bPick)) {
- std::cout << "Trial Displacement exceeds half of the box length in Brownian Motion MultiParticle move.\n";
- std::cout << "Trial transform: " << num;
- exit(EXIT_FAILURE);
- } else if (!std::isfinite(num.Length())) {
- std::cout << "Error: Trial transform is not a finite number in Brownian Motion Multiparticle move.\n";
- std::cout << " Trial transform: " << num;
- exit(EXIT_FAILURE);
- }
- // We can possible bound them
- return num;
-}
-
-inline void MultiParticleBrownian::CalculateTrialDistRot()
-{
- uint molIndex;
- double r_max = moveSetRef.GetRMAX(bPick);
- double t_max = moveSetRef.GetTMAX(bPick);
- if(moveType == mp::MPROTATE) { // rotate
- double *x = r_k.x;
- double *y = r_k.y;
- double *z = r_k.z;
-#ifdef _OPENMP
- #pragma omp parallel for default(none) shared(moleculeIndex, r_max, x, y, z)
-#endif
- for(int m = 0; m < moleculeIndex.size(); m++) {
- uint molIndex = moleculeIndex[m];
- XYZ bt = molTorqueRef.Get(molIndex) * BETA;
- XYZ val = CalcRandomTransform(bt, r_max, molIndex);
- x[molIndex] = val.x;
- y[molIndex] = val.y;
- z[molIndex] = val.z;
- RotateForceBiased(molIndex);
- }
- } else { // displace
- double *x = t_k.x;
- double *y = t_k.y;
- double *z = t_k.z;
-#ifdef _OPENMP
- #pragma omp parallel for default(none) shared(moleculeIndex, t_max, x, y, z)
-#endif
- for(int m = 0; m < moleculeIndex.size(); m++) {
- uint molIndex = moleculeIndex[m];
- XYZ bf = (molForceRef.Get(molIndex) + molForceRecRef.Get(molIndex)) * BETA;
- XYZ val = CalcRandomTransform(bf, t_max, molIndex);
- x[molIndex] = val.x;
- y[molIndex] = val.y;
- z[molIndex] = val.z;
- TranslateForceBiased(molIndex);
- }
- }
-}
-
-inline void MultiParticleBrownian::RotateForceBiased(uint molIndex)
-{
- XYZ rot = r_k.Get(molIndex);
- double rotLen = rot.Length();
- RotationMatrix matrix;
-
- matrix = RotationMatrix::FromAxisAngle(rotLen, rot.Normalize());
-
- XYZ center = newCOMs.Get(molIndex);
- uint start, stop, len;
- molRef.GetRange(start, stop, len, molIndex);
-
- // Copy the range into temporary array
- XYZArray temp(len);
- newMolsPos.CopyRange(temp, start, 0, len);
- boxDimRef.UnwrapPBC(temp, bPick, center);
-
- // Do Rotation
- for(uint p = 0; p < len; p++) {
- temp.Add(p, -center);
- temp.Set(p, matrix.Apply(temp[p]));
- temp.Add(p, center);
- }
- boxDimRef.WrapPBC(temp, bPick);
- // Copy back the result
- temp.CopyRange(newMolsPos, 0, start, len);
-}
-
-inline void MultiParticleBrownian::TranslateForceBiased(uint molIndex)
-{
- XYZ shift = t_k.Get(molIndex);
- if(shift > boxDimRef.GetHalfAxis(bPick)) {
- std::cout << "Error: Trial Displacement exceed half of the box length in Multiparticle \n"
- << " Brownian Motion move!\n";
- std::cout << " Trial transformation vector: " << shift << std::endl;
- std::cout << " Box Dimension: " << boxDimRef.GetAxis(bPick) << std::endl << std::endl;
- std::cout << "This might be due to bad initial configuration, where atom of the molecules \n"
- << "are too close to each other or overlaps. Please equilibrate your system using \n"
- << "rigid body translation or rotation MC moves, before using the Multiparticle \n"
- << "Brownian Motion move. \n\n";
- exit(EXIT_FAILURE);
- }
-
- XYZ newcom = newCOMs.Get(molIndex);
- uint stop, start, len;
- molRef.GetRange(start, stop, len, molIndex);
- // Copy the range into temporary array
- XYZArray temp(len);
- newMolsPos.CopyRange(temp, start, 0, len);
- //Shift the coordinate and COM
- temp.AddAll(shift);
- newcom += shift;
- //rewrapping
- boxDimRef.WrapPBC(temp, bPick);
- newcom = boxDimRef.WrapPBC(newcom, bPick);
- //set the new coordinate
- temp.CopyRange(newMolsPos, 0, start, len);
- newCOMs.Set(molIndex, newcom);
-}
-
-#endif