From 3be0de42d38ae1697a5275a7d6c4ea43682aa403 Mon Sep 17 00:00:00 2001
From: Chris Maffeo <cmaffeo2@illinois.edu>
Date: Mon, 4 Jan 2016 16:48:39 -0600
Subject: [PATCH] added code to scale; cleaned up grid-adding code

---
 Configuration.cpp | 32 +++++++++++++++++++++-
 Configuration.h   |  2 +-
 RigidBody.cu      |  4 +--
 RigidBodyType.cu  | 70 ++++++++++++++++++++++++++++++-----------------
 RigidBodyType.h   | 28 +++++++++++++++++--
 5 files changed, 105 insertions(+), 31 deletions(-)

diff --git a/Configuration.cpp b/Configuration.cpp
index 258ce81..c74fac5 100644
--- a/Configuration.cpp
+++ b/Configuration.cpp
@@ -777,7 +777,17 @@ int Configuration::readParameters(const char * config_file) {
 			rigidBody[currRB].addDensityGrid(value);
 		else if (param == String("potentialGrid"))
 			rigidBody[currRB].addPotentialGrid(value);
-
+		else if (param == String("densityGridScale"))
+			rigidBody[currRB].scaleDensityGrid(value);
+		else if (param == String("potentialGridScale"))
+			rigidBody[currRB].scalePotentialGrid(value);
+		else if (param == String("pmfScale"))
+			rigidBody[currRB].scalePMF(value);
+		else if (param == String("position"))
+			rigidBody[currRB].initPos = stringToVector3( value );
+		else if (param == String("orientation"))
+			rigidBody[currRB].initRot = stringToMatrix3( value );
+		
 		// COMMON
 		else if (param == String("num")) {
 			if (currPartClass == partClassPart)
@@ -817,6 +827,26 @@ Vector3 Configuration::stringToVector3(String s) {
 						 (float) strtod(token[2], NULL) );
 	return v;
 }
+Matrix3 Configuration::stringToMatrix3(String s) {
+	// tokenize and return
+	int numTokens = s.tokenCount();
+	if (numTokens != 9) {
+		printf("ERROR: could not convert input to Matrix3.\n"); // TODO improve this message
+		exit(1);
+	}
+	String* token = new String[numTokens];
+	s.tokenize(token);
+	Matrix3 m( (float) strtod(token[0], NULL),
+						 (float) strtod(token[1], NULL),
+						 (float) strtod(token[2], NULL),
+						 (float) strtod(token[3], NULL),
+						 (float) strtod(token[4], NULL),
+						 (float) strtod(token[5], NULL),
+						 (float) strtod(token[6], NULL),
+						 (float) strtod(token[7], NULL),
+						 (float) strtod(token[8], NULL) );
+	return m;
+}
 
 void Configuration::readAtoms() {
 	// Open the file
diff --git a/Configuration.h b/Configuration.h
index cb255b1..b9143b7 100644
--- a/Configuration.h
+++ b/Configuration.h
@@ -44,7 +44,7 @@ class Configuration {
 
 	void setDefaults();
 	Vector3 stringToVector3(String s);
-
+	Matrix3 stringToMatrix3(String s);
 
 	int readParameters(const char* config_file);
 	void readAngles();
diff --git a/RigidBody.cu b/RigidBody.cu
index 2a63478..0477a27 100644
--- a/RigidBody.cu
+++ b/RigidBody.cu
@@ -19,10 +19,10 @@ RigidBody::RigidBody(const Configuration& cref, RigidBodyType& tref)
 	Temp = 295;
 	// tempgrid = c->temperatureGrid;
 
-	position = Vector3();
+	position = t->initPos; // Vector3();
 
 	// Orientation matrix that brings vector from the RB frame to the lab frame
-	orientation = Matrix3(1.0f);
+	orientation = t->initRot; //Matrix3(1.0f);
 	
 	momentum = Vector3() * t->mass; // lab frame
 	/* DebugM(4, "velocity " << rbParams->velocity << "\n" << endi); */
diff --git a/RigidBodyType.cu b/RigidBodyType.cu
index bf0f416..88720bb 100644
--- a/RigidBodyType.cu
+++ b/RigidBodyType.cu
@@ -94,25 +94,29 @@ void RigidBodyType::setDampingCoeffs(float timestep) { /* MUST ONLY BE CALLED ON
 
 	transDamping = 2.3900574 * transDamping;
 	rotDamping = 2.3900574 * rotDamping;
-		
-}
 
-void RigidBodyType::addPotentialGrid(String s) {
-	// tokenize and return
-	int numTokens = s.tokenCount();
-	if (numTokens != 2) {
-		printf("ERROR: could not add Grid.\n"); // TODO improve this message
-		exit(1);
+	// Also apply scale factors
+	applyScaleFactors();
+}
+void RigidBodyType::applyScaleFactors() { /* currently this is called before raw is updated */
+	applyScaleFactor(potentialGridScaleKeys, potentialGridScale, potentialGridKeys, potentialGrids);
+	applyScaleFactor(densityGridScaleKeys, densityGridScale, densityGridKeys, densityGrids);
+	applyScaleFactor(pmfScaleKeys, pmfScale, pmfKeys, pmfs);
+}
+void RigidBodyType::applyScaleFactor(
+	const std::vector<String> &scaleKeys, const std::vector<float> &scaleFactors,
+	const std::vector<String> &gridKeys, std::vector<BaseGrid> &grids) {
+	for (int i = 0; i < scaleKeys.size(); i++) {
+		const String &k1 = scaleKeys[i];
+		for (int j = 0; j < gridKeys.size(); j++) {
+			const String &k2 = gridKeys[j];
+			if ( k1 == k2 )
+				grids[j].scale( scaleFactors[i] );
+		}
 	}
-	String* token = new String[numTokens];
-	s.tokenize(token);
-	String key = token[0];
-	BaseGrid g(token[1]);
-	
-	potentialGrids.push_back( g );
-	potentialGridKeys.push_back( key );
 }
-void RigidBodyType::addDensityGrid(String s) {
+	
+void RigidBodyType::addGrid(String s, std::vector<String> &keys, std::vector<BaseGrid> &grids) {
 	// tokenize and return
 	int numTokens = s.tokenCount();
 	if (numTokens != 2) {
@@ -123,12 +127,21 @@ void RigidBodyType::addDensityGrid(String s) {
 	s.tokenize(token);
 	String key = token[0];
 	BaseGrid g(token[1]);
-	
 
-	densityGrids.push_back( g );
-	densityGridKeys.push_back( key );
+	keys.push_back( key );
+	grids.push_back( g );
+}
+void RigidBodyType::addPotentialGrid(String s) {
+	addGrid(s, potentialGridKeys, potentialGrids);
+}
+void RigidBodyType::addDensityGrid(String s) {
+	addGrid(s, densityGridKeys, densityGrids);
 }
 void RigidBodyType::addPMF(String s) {
+	addGrid(s, pmfKeys, pmfs);
+}
+
+void RigidBodyType::addScaleFactor(String s, std::vector<String> &keys, std::vector<float> &vals) {
 	// tokenize and return
 	int numTokens = s.tokenCount();
 	if (numTokens != 2) {
@@ -138,10 +151,18 @@ void RigidBodyType::addPMF(String s) {
 	String* token = new String[numTokens];
 	s.tokenize(token);
 	String key = token[0];
-	BaseGrid g(token[1]);
-	
-	pmfs.push_back( g );
-	pmfKeys.push_back( key );
+	float v = (float) strtod(token[1], NULL);
+	keys.push_back( key );
+	vals.push_back( v );
+}
+void RigidBodyType::scalePotentialGrid(String s) {
+	addScaleFactor(s, potentialGridScaleKeys, potentialGridScale);
+}
+void RigidBodyType::scaleDensityGrid(String s) {
+	addScaleFactor(s, densityGridScaleKeys, densityGridScale);
+}
+void RigidBodyType::scalePMF(String s) {
+	addScaleFactor(s, pmfScaleKeys, pmfScale);
 }
 
 void RigidBodyType::updateRaw() {
@@ -176,7 +197,6 @@ void RigidBodyType::updateRaw() {
 		rawDensityOrigins[i]	 = densityGrids[i].getOrigin();
 	}
 	for (int i=0; i < numPmfs; i++)
-		rawPmfs[i] = pmfs[i];
-	
+		rawPmfs[i] = pmfs[i];	
 }
 
diff --git a/RigidBodyType.h b/RigidBodyType.h
index c9e3258..389d27c 100644
--- a/RigidBodyType.h
+++ b/RigidBodyType.h
@@ -18,6 +18,13 @@ private:
 	void clear();
 	// void copy(const RigidBodyType& src);
 
+	void addGrid(String s, std::vector<String> &keys, std::vector<BaseGrid> &grids);
+	void addScaleFactor(String s, std::vector<String> &keys, std::vector<float> &vals);
+	void applyScaleFactors();
+	void applyScaleFactor(
+		const std::vector<String> &scaleKeys, const std::vector<float> &scaleFactors,
+		const std::vector<String> &gridKeys, std::vector<BaseGrid> &grids);
+	
 public:
 /* RigidBodyType(const String& name = "") : */
 /* 	name(name), num(0), */
@@ -27,8 +34,9 @@ public:
 
 RigidBodyType(const String& name = "") :
 	name(name), num(0),
-		reservoir(NULL), mass(1.0f), inertia(), transDamping(),
-  	rotDamping(), numPotGrids(0), numDenGrids(0), numPmfs(0) { }
+	reservoir(NULL), mass(1.0f), inertia(), transDamping(),
+	rotDamping(), numPotGrids(0), numDenGrids(0), numPmfs(0),
+	initPos(), initRot(Matrix3(1.0f))  { }
 	
 	/* RigidBodyType(const RigidBodyType& src) { copy(src); } */
 	~RigidBodyType() { clear(); }
@@ -38,6 +46,10 @@ RigidBodyType(const String& name = "") :
   void addPotentialGrid(String s);
 	void addDensityGrid(String s);
 	void addPMF(String s);
+  void scalePotentialGrid(String s);
+	void scaleDensityGrid(String s);
+	void scalePMF(String s);
+
 	void updateRaw();
 	void setDampingCoeffs(float timestep);
 	
@@ -56,6 +68,9 @@ public:
 	Vector3 transForceCoeff;
 	Vector3 rotTorqueCoeff;
 
+	Vector3 initPos;	
+	Matrix3 initRot;
+	
 	std::vector<String> potentialGridKeys;
 	std::vector<String> densityGridKeys;
 	std::vector<String> pmfKeys;
@@ -64,6 +79,15 @@ public:
 	std::vector<BaseGrid> densityGrids;
 	std::vector<BaseGrid> pmfs;
 
+	std::vector<String> potentialGridScaleKeys;
+	std::vector<String> densityGridScaleKeys;
+	std::vector<String> pmfScaleKeys;
+
+	std::vector<float> potentialGridScale;
+	std::vector<float> densityGridScale;
+	std::vector<float> pmfScale;
+
+	
 	// RBTODO: clear std::vectors after initialization 
 	// duplicates of std::vector grids for device
 	int numPotGrids;
-- 
GitLab