diff --git a/src/RigidBodyController.cu b/src/RigidBodyController.cu index 790ce71ab956c3fc8fb54757ee787f2af59e491f..43bb3bfb0314d519b7831d2f43dddabe677cb6ed 100644 --- a/src/RigidBodyController.cu +++ b/src/RigidBodyController.cu @@ -82,7 +82,7 @@ RigidBodyController::RigidBodyController(const Configuration& c, const char* pre random = new RandomCPU(conf.seed + repID + 1); /* +1 to avoid using same seed as RandomCUDA */ - initializeForcePairs(); + initializeForcePairs(); // Must run after construct_grids() gpuErrchk(cudaDeviceSynchronize()); /* RBTODO: this should be extraneous */ //Boltzmann distribution @@ -117,7 +117,7 @@ void RigidBodyController::construct_grids() { // typedef std::tuple<String, float> GridKey; // Build dictionary to reuse grids across all types, first finding scale factors - std::vector<GridKey> all_keys; + std::vector<GridKey> all_files; std::vector<GridKey>::iterator itr; for (int t_idx = 0; t_idx < conf.numRigidTypes; ++t_idx) @@ -129,10 +129,10 @@ void RigidBodyController::construct_grids() { t.potential_grid_idx = new size_t[t.numPotGrids]; // TODO; don't allocate here t.density_grid_idx = new size_t[t.numDenGrids]; // TODO; don't allocate here t.pmf_grid_idx = new size_t[t.numPmfs]; // TODO; don't allocate here - for (int i = 0; i < t.potentialGridKeys.size(); ++i) + for (int i = 0; i < t.potentialGridFiles.size(); ++i) { - String& name = t.potentialGridKeys[i]; + String& name = t.potentialGridFiles[i]; float scale = 1.0f; for (int j = 0; j < t.potentialGridScaleKeys.size(); ++j) { @@ -143,27 +143,27 @@ void RigidBodyController::construct_grids() { GridKey key = GridKey(name, scale); int key_idx = -1; // Find key if it exists - itr = std::find(all_keys.begin(), all_keys.end(), key); - if (itr == all_keys.end()) + itr = std::find(all_files.begin(), all_files.end(), key); + if (itr == all_files.end()) { - key_idx = all_keys.size(); - all_keys.push_back( key ); + key_idx = all_files.size(); + all_files.push_back( key ); } else { - key_idx = std::distance(all_keys.begin(), itr); + key_idx = std::distance(all_files.begin(), itr); } - // Assign index into all_keys to RigidBodyType + // Assign index into all_files to RigidBodyType t.potential_grid_idx[i] = key_idx; } // Density - for (int i = 0; i < t.densityGridKeys.size(); ++i) + for (int i = 0; i < t.densityGridFiles.size(); ++i) { - String& name = t.densityGridKeys[i]; + String& name = t.densityGridFiles[i]; float scale = 1.0f; for (int j = 0; j < t.densityGridScaleKeys.size(); ++j) { @@ -174,26 +174,26 @@ void RigidBodyController::construct_grids() { GridKey key = GridKey(name, scale); int key_idx = -1; // Find key if it exists - itr = std::find(all_keys.begin(), all_keys.end(), key); - if (itr == all_keys.end()) + itr = std::find(all_files.begin(), all_files.end(), key); + if (itr == all_files.end()) { - key_idx = all_keys.size(); - all_keys.push_back( key ); + key_idx = all_files.size(); + all_files.push_back( key ); } else { - key_idx = std::distance(all_keys.begin(), itr); + key_idx = std::distance(all_files.begin(), itr); } - // Assign index into all_keys to RigidBodyType + // Assign index into all_files to RigidBodyType t.density_grid_idx[i] = key_idx; } //PMF - for (int i = 0; i < t.pmfKeys.size(); ++i) + for (int i = 0; i < t.pmfFiles.size(); ++i) { - String& name = t.pmfKeys[i]; + String& name = t.pmfFiles[i]; float scale = 1.0f; for (int j = 0; j < t.pmfScaleKeys.size(); ++j) { @@ -204,18 +204,18 @@ void RigidBodyController::construct_grids() { GridKey key = GridKey(name, scale); int key_idx = -1; // Find key if it exists - itr = std::find(all_keys.begin(), all_keys.end(), key); - if (itr == all_keys.end()) + itr = std::find(all_files.begin(), all_files.end(), key); + if (itr == all_files.end()) { - key_idx = all_keys.size(); - all_keys.push_back( key ); + key_idx = all_files.size(); + all_files.push_back( key ); } else { - key_idx = std::distance(all_keys.begin(), itr); + key_idx = std::distance(all_files.begin(), itr); } - // Assign index into all_keys to RigidBodyType + // Assign index into all_files to RigidBodyType t.pmf_grid_idx[i] = key_idx; } @@ -232,27 +232,32 @@ void RigidBodyController::construct_grids() { } // Store grids - grids = new BaseGrid[all_keys.size()]; - gpuErrchk(cudaMalloc( &grids_d, sizeof(RigidBodyGrid)*all_keys.size() )); + grids = new BaseGrid[all_files.size()]; + gpuErrchk(cudaMalloc( &grids_d, sizeof(RigidBodyGrid)*all_files.size() )); // Read and scale grids, then copy to GPU - for (size_t i = 0; i < all_keys.size(); ++i) + for (size_t i = 0; i < all_files.size(); ++i) { - GridKey& key = all_keys[i]; - BaseGrid& g = grids[i]; - g = BaseGrid(key.name); - g.scale(key.scale); - + GridKey& key = all_files[i]; + BaseGrid& g0 = grids[i]; + g0 = BaseGrid(key.name); + g0.scale(key.scale); + + RigidBodyGrid g = RigidBodyGrid(); + g.nx = g0.nx; + g.ny = g0.ny; + g.nz = g0.nz; + g.size = g0.size; + g.val = g0.val; + // Copy to GPU, starting with grid data - float* tmp1; - float* tmp2; + float* tmp; size_t sz = sizeof(float) * g.getSize(); - gpuErrchk(cudaMalloc( &tmp1, sz)); - gpuErrchk(cudaMemcpy( tmp1, g.val, sz, cudaMemcpyHostToDevice)); + gpuErrchk(cudaMalloc( &tmp, sz)); + gpuErrchk(cudaMemcpy( tmp, g.val, sz, cudaMemcpyHostToDevice)); // Set grid pointer to device - tmp2 = g.val; - g.val = tmp1; + g.val = tmp; // Copy grid sz = sizeof(RigidBodyGrid); @@ -260,9 +265,8 @@ void RigidBodyController::construct_grids() { gpuErrchk(cudaMemcpy(&grids_d[i], &g, sz, cudaMemcpyHostToDevice)); // Restore pointer - g.val = tmp2; - tmp1 = NULL; - tmp2 = NULL; // probably unnecessary + g.val = NULL; + tmp = NULL; } } @@ -372,8 +376,8 @@ void RigidBodyController::initializeForcePairs() { // keys1[k1].printInline(); printf(":"); keys2[k2].print(); if ( keys1[k1] == keys2[k2] ) { - gridKeyId1.push_back(k1); - gridKeyId2.push_back(k2); + gridKeyId1.push_back( t1.density_grid_idx[k1] ); + gridKeyId2.push_back( t2.potential_grid_idx[k2] ); paired = true; } } @@ -415,9 +419,9 @@ void RigidBodyController::initializeForcePairs() { for(int k1 = 0; k1 < keys1.size(); k1++) { for(int k2 = 0; k2 < keys2.size(); k2++) { if ( keys1[k1] == keys2[k2] ) { - gridKeyId1.push_back(k1); - gridKeyId2.push_back(k2); - paired = true; + gridKeyId1.push_back( t1.density_grid_idx[k1] ); + gridKeyId2.push_back( t1.pmf_grid_idx[k2] ); + paired = true; } } } diff --git a/src/RigidBodyType.cu b/src/RigidBodyType.cu index 6d74c46eb235177fab3ee23d95eceeb9e0664e3f..170369161feb76ffa7c95fb6a337ed9dbd673761 100644 --- a/src/RigidBodyType.cu +++ b/src/RigidBodyType.cu @@ -79,7 +79,7 @@ void RigidBodyType::setDampingCoeffs(float timestep) { /* MUST ONLY BE CALLED ON } -void RigidBodyType::addGrid(String s, std::vector<String> &keys) { +void RigidBodyType::addGrid(String s, std::vector<String> &keys, std::vector<String> &files) { // tokenize and return int numTokens = s.tokenCount(); if (numTokens != 2) { @@ -88,17 +88,18 @@ void RigidBodyType::addGrid(String s, std::vector<String> &keys) { } String* token = new String[numTokens]; s.tokenize(token); - String key = token[0]; - keys.push_back( key ); + keys.push_back( String(token[0]) ); + files.push_back( String(token[1]) ); + delete[] token; } void RigidBodyType::addPotentialGrid(String s) { - addGrid(s, potentialGridKeys); + addGrid(s, potentialGridKeys, potentialGridFiles); } void RigidBodyType::addDensityGrid(String s) { - addGrid(s, densityGridKeys); + addGrid(s, densityGridKeys, potentialGridFiles); } void RigidBodyType::addPMF(String s) { - addGrid(s, pmfKeys); + addGrid(s, pmfKeys, potentialGridFiles); } void RigidBodyType::addScaleFactor(String s, std::vector<String> &keys, std::vector<float> &vals) { @@ -114,6 +115,7 @@ void RigidBodyType::addScaleFactor(String s, std::vector<String> &keys, std::vec float v = (float) strtod(token[1], NULL); keys.push_back( key ); vals.push_back( v ); + delete[] token; } void RigidBodyType::scalePotentialGrid(String s) { addScaleFactor(s, potentialGridScaleKeys, potentialGridScale); diff --git a/src/RigidBodyType.h b/src/RigidBodyType.h index ef42d226c4a2af2e35422128177cd922a6d6076f..575a31348eb24dd305e913bbf46bf0b095bb8649 100644 --- a/src/RigidBodyType.h +++ b/src/RigidBodyType.h @@ -32,7 +32,7 @@ private: void clear(); // void copy(const RigidBodyType& src); - void addGrid(String s, std::vector<String> &keys); + void addGrid(String s, std::vector<String> &keys, std::vector<String> &files); void addScaleFactor(String s, std::vector<String> &keys, std::vector<float> &vals); public: @@ -75,6 +75,10 @@ public: std::vector<String> densityGridKeys; std::vector<String> pmfKeys; + std::vector<String> potentialGridFiles; + std::vector<String> densityGridFiles; + std::vector<String> pmfFiles; + std::vector<String> potentialGridScaleKeys; std::vector<String> densityGridScaleKeys; std::vector<String> pmfScaleKeys;