From 22c02ee016aa8655cb96fa6ac01fb63b9a2d5f9c Mon Sep 17 00:00:00 2001 From: Chris Maffeo <cmaffeo2@illinois.edu> Date: Fri, 16 Apr 2021 19:14:50 -0500 Subject: [PATCH] Add restartRBCoordinates keyword and .rigid file reader --- src/Configuration.cpp | 2 + src/Configuration.h | 1 + src/RigidBody.cu | 4 +- src/RigidBodyController.cu | 97 +++++++++++++++++++++++++++++++++----- src/RigidBodyController.h | 1 + 5 files changed, 90 insertions(+), 15 deletions(-) diff --git a/src/Configuration.cpp b/src/Configuration.cpp index ce8f153..b1a89c4 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -1137,6 +1137,8 @@ int Configuration::readParameters(const char * config_file) { rigidBody[currRB].initAngularMomentum = stringToVector3(value); else if (param == String("inputRBCoordinates")) inputRBCoordinates = value; + else if (param == String("restartRBCoordinates")) + restartRBCoordinates = value; // COMMON else if (param == String("num")) { diff --git a/src/Configuration.h b/src/Configuration.h index 9daf4fe..fc70e2a 100644 --- a/src/Configuration.h +++ b/src/Configuration.h @@ -149,6 +149,7 @@ public: String inputCoordinates; String inputMomentum; //Han-Yi Chou String inputRBCoordinates; + String restartRBCoordinates; int copyReplicaCoordinates; String restartCoordinates; String restartMomentum; //Han-Yi Chou diff --git a/src/RigidBody.cu b/src/RigidBody.cu index 94e7261..e224d3d 100644 --- a/src/RigidBody.cu +++ b/src/RigidBody.cu @@ -69,8 +69,8 @@ void RigidBody::Boltzmann(unsigned long int seed) angularMomentum.x *= sigma[1]; angularMomentum.y *= sigma[2]; angularMomentum.z *= sigma[3]; - printf("%f\n", Temp); - printf("%f\n", Temperature()); + // printf("%f\n", Temp); + // printf("%f\n", Temperature()); } RigidBody::~RigidBody() { diff --git a/src/RigidBodyController.cu b/src/RigidBodyController.cu index 5c89ba2..c5e855e 100644 --- a/src/RigidBodyController.cu +++ b/src/RigidBodyController.cu @@ -80,24 +80,16 @@ RigidBodyController::RigidBodyController(const Configuration& c, const char* pre gpuErrchk(cudaMallocHost(&(particleForces), sizeof(ForceEnergy) * 2*totalParticleForceNumBlocks)) gpuErrchk(cudaMalloc(&(particleForces_d), sizeof(ForceEnergy) * 2*totalParticleForceNumBlocks)) - if (conf.inputRBCoordinates.length() > 0) - loadRBCoordinates(conf.inputRBCoordinates.val()); + if (conf.restartRBCoordinates.length() > 0) + load_restart_coordinates(conf.restartRBCoordinates.val()); + else if (conf.inputRBCoordinates.length() > 0) + loadRBCoordinates(conf.inputRBCoordinates.val()); random = new RandomCPU(conf.seed + repID + 1); /* +1 to avoid using same seed as RandomCUDA */ + initializeForcePairs(); // Must run after construct_grids() gpuErrchk(cudaDeviceSynchronize()); /* RBTODO: this should be extraneous */ - - //Boltzmann distribution - for (int i = 0; i < rigidBodyByType.size(); i++) - { - for (int j = 0; j < rigidBodyByType[i].size(); j++) - { - RigidBody& rb = rigidBodyByType[i][j]; - // thermostat - rb.Boltzmann(seed); - } - } } RigidBodyController::~RigidBodyController() { @@ -337,6 +329,9 @@ bool RigidBodyController::loadRBCoordinates(const char* fileName) { rb.momentum = Vector3((float)strtod(tokenList[12],NULL), (float) strtod(tokenList[13],NULL), (float) strtod(tokenList[14],NULL)); rb.angularMomentum = Vector3((float)strtod(tokenList[15],NULL), (float) strtod(tokenList[16],NULL), (float) strtod(tokenList[17],NULL)); } + + if(conf.RigidBodyDynamicType == String("Langevin") && numTokens < 18) + rb.Boltzmann(conf.seed); delete[] tokenList; @@ -352,6 +347,82 @@ bool RigidBodyController::loadRBCoordinates(const char* fileName) { fclose(inp); return true; } +bool RigidBodyController::load_restart_coordinates(const char* filename) { + char line[STRLEN]; + FILE* inp = fopen(filename, "r"); + + if (inp == NULL) { + printf("ARBD: load RB coordinates: File '%s' does not exist\n", filename); + exit(-1); + } + + int imax = rigidBodyByType.size(); + int i = 0; + int jmax = rigidBodyByType[i].size(); + int j = 0; + + while (fgets(line, STRLEN, inp) != NULL) { + // Ignore comments. + int len = strlen(line); + if (line[0] == '#') continue; + if (len < 2) continue; + + String s(line); + int numTokens = s.tokenCount(); + if (numTokens < 2+3+9) { + printf("ARBD: invalid RB restart coordinate line: %s\n", line); + fclose(inp); + exit(-1); + } + if(conf.RigidBodyDynamicType == String("Langevin") && numTokens < 20) + { + std::cout << "Warning the initial momentum set by random number" << std::endl; + } + + String* tokenList = new String[numTokens]; + s.tokenize(tokenList); + if (tokenList == NULL) { + printf("ARBD: invalid RB restart coordinate line: %s\n", line); + fclose(inp); + exit(-1); + } + + RigidBody& rb = rigidBodyByType[i][j]; + printf("Assinging positions %d %d %f\n",i,j, (float) strtod(tokenList[2],NULL)); + rb.position = Vector3( + (float) strtod(tokenList[2],NULL), (float) strtod(tokenList[3],NULL), (float) strtod(tokenList[4],NULL)); + rb.orientation = Matrix3( + (float) strtod(tokenList[5],NULL), (float) strtod(tokenList[6],NULL), (float) strtod(tokenList[7],NULL), + (float) strtod(tokenList[8],NULL), (float) strtod(tokenList[9],NULL), (float) strtod(tokenList[10],NULL), + (float) strtod(tokenList[11],NULL), (float) strtod(tokenList[12],NULL), (float) strtod(tokenList[13],NULL)); + + if(conf.RigidBodyDynamicType == String("Langevin") && numTokens >= 20) + { + rb.momentum = Vector3((float)strtod(tokenList[14],NULL), (float) strtod(tokenList[15],NULL), (float) strtod(tokenList[16],NULL)); + rb.angularMomentum = Vector3((float)strtod(tokenList[17],NULL), (float) strtod(tokenList[18],NULL), (float) strtod(tokenList[19],NULL)); + } + + if(conf.RigidBodyDynamicType == String("Langevin") && numTokens < 20) + rb.Boltzmann(conf.seed); + + delete[] tokenList; + + j++; + if (j == jmax) { + i++; + if (i == imax) + break; + j=0; + jmax = rigidBodyByType[i].size(); + } + } + fclose(inp); + if (i < imax || j < jmax) { + printf("ARBD: RB restart file did not contain the correct number of lines: %s\n", filename); + exit(-1); + } + return true; +} diff --git a/src/RigidBodyController.h b/src/RigidBodyController.h index ff99091..0e2dbad 100644 --- a/src/RigidBodyController.h +++ b/src/RigidBodyController.h @@ -117,6 +117,7 @@ public: float getEnergy(float (RigidBody::*get)()); private: bool loadRBCoordinates(const char* fileName); + bool load_restart_coordinates(const char* filename); void initializeForcePairs(); //void print(int step); -- GitLab