47 |
|
* @version 1.0 |
48 |
|
*/ |
49 |
|
|
50 |
– |
#include <sprng.h> |
51 |
– |
|
50 |
|
#include "brains/MoleculeCreator.hpp" |
51 |
|
#include "brains/SimCreator.hpp" |
52 |
|
#include "brains/SimSnapshotManager.hpp" |
55 |
|
#include "UseTheForce/ForceFieldFactory.hpp" |
56 |
|
#include "utils/simError.h" |
57 |
|
#include "utils/StringUtils.hpp" |
58 |
+ |
#include "math/SeqRandNumGen.hpp" |
59 |
|
#ifdef IS_MPI |
60 |
|
#include "io/mpiBASS.h" |
61 |
< |
#include "math/randomSPRNG.hpp" |
61 |
> |
#include "math/ParallelRandNumGen.hpp" |
62 |
|
#endif |
63 |
|
|
64 |
|
namespace oopse { |
187 |
|
} |
188 |
|
|
189 |
|
void SimCreator::gatherParameters(SimInfo *info, const std::string& mdfile) { |
191 |
– |
|
192 |
– |
//setup seed for random number generator |
193 |
– |
int seedValue; |
194 |
– |
Globals * simParams = info->getSimParams(); |
195 |
– |
|
196 |
– |
if (simParams->haveSeed()) { |
197 |
– |
seedValue = simParams->getSeed(); |
198 |
– |
|
199 |
– |
if (seedValue < 100000000 ) { |
200 |
– |
sprintf(painCave.errMsg, |
201 |
– |
"Seed for sprng library should contain at least 9 digits\n" |
202 |
– |
"OOPSE will generate a seed for user\n"); |
203 |
– |
|
204 |
– |
painCave.isFatal = 0; |
205 |
– |
simError(); |
206 |
– |
|
207 |
– |
//using seed generated by system instead of invalid seed set by user |
208 |
– |
|
209 |
– |
#ifndef IS_MPI |
210 |
– |
|
211 |
– |
seedValue = make_sprng_seed(); |
212 |
– |
|
213 |
– |
#else |
214 |
– |
|
215 |
– |
if (worldRank == 0) { |
216 |
– |
seedValue = make_sprng_seed(); |
217 |
– |
} |
218 |
– |
|
219 |
– |
MPI_Bcast(&seedValue, 1, MPI_INT, 0, MPI_COMM_WORLD); |
220 |
– |
|
221 |
– |
#endif |
222 |
– |
|
223 |
– |
} //end if (seedValue /1000000000 == 0) |
224 |
– |
} else { |
190 |
|
|
226 |
– |
#ifndef IS_MPI |
227 |
– |
|
228 |
– |
seedValue = make_sprng_seed(); |
229 |
– |
|
230 |
– |
#else |
231 |
– |
|
232 |
– |
if (worldRank == 0) { |
233 |
– |
seedValue = make_sprng_seed(); |
234 |
– |
} |
235 |
– |
|
236 |
– |
MPI_Bcast(&seedValue, 1, MPI_INT, 0, MPI_COMM_WORLD); |
237 |
– |
|
238 |
– |
#endif |
239 |
– |
|
240 |
– |
} //end of simParams->haveSeed() |
241 |
– |
|
242 |
– |
info->setSeed(seedValue); |
243 |
– |
|
244 |
– |
|
191 |
|
//figure out the ouput file names |
192 |
|
std::string prefix; |
193 |
|
|
195 |
|
|
196 |
|
if (worldRank == 0) { |
197 |
|
#endif // is_mpi |
198 |
< |
|
198 |
> |
Globals * simParams = info->getSimParams(); |
199 |
|
if (simParams->haveFinalConfig()) { |
200 |
|
prefix = getPrefix(simParams->getFinalConfig()); |
201 |
|
} else { |
251 |
|
simError(); |
252 |
|
} |
253 |
|
|
254 |
< |
MTRand myRandom(info->getSeed(), nProcessors, worldRank); |
254 |
> |
int seedValue; |
255 |
> |
Globals * simParams = info->getSimParams(); |
256 |
> |
SeqRandNumGen* myRandom; //divide labor does not need Parallel random number generator |
257 |
> |
if (simParams->haveSeed()) { |
258 |
> |
seedValue = simParams->getSeed(); |
259 |
> |
myRandom = new SeqRandNumGen(seedValue); |
260 |
> |
}else { |
261 |
> |
myRandom = new SeqRandNumGen(); |
262 |
> |
} |
263 |
|
|
264 |
|
|
265 |
|
a = 3.0 * nGlobalMols / info->getNGlobalAtoms(); |
282 |
|
|
283 |
|
// Pick a processor at random |
284 |
|
|
285 |
< |
which_proc = (int) (myRandom.rand() * nProcessors); |
285 |
> |
which_proc = (int) (myRandom->rand() * nProcessors); |
286 |
|
|
287 |
|
//get the molecule stamp first |
288 |
|
int stampId = info->getMoleculeStampId(i); |
334 |
|
// where a = penalty / (average atoms per molecule) |
335 |
|
|
336 |
|
x = (double)(new_atoms - nTarget); |
337 |
< |
y = myRandom.getRandom(); |
337 |
> |
y = myRandom->rand(); |
338 |
|
|
339 |
|
if (y < exp(- a * x)) { |
340 |
|
molToProcMap[i] = which_proc; |
348 |
|
} |
349 |
|
} |
350 |
|
|
351 |
+ |
delete myRandom; |
352 |
+ |
|
353 |
|
// Spray out this nonsense to all other processors: |
354 |
|
|
355 |
|
MPI_Bcast(&molToProcMap[0], nGlobalMols, MPI_INT, 0, MPI_COMM_WORLD); |