ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/integrators/SMIPDForceManager.cpp
(Generate patch)

Comparing trunk/OOPSE-4/src/integrators/SMIPDForceManager.cpp (file contents):
Revision 3458 by chuckv, Fri Oct 3 17:47:08 2008 UTC vs.
Revision 3481 by gezelter, Wed Nov 26 14:26:17 2008 UTC

# Line 41 | Line 41
41   #include <fstream>
42   #include <iostream>
43   #include "integrators/SMIPDForceManager.hpp"
44 #include "math/CholeskyDecomposition.hpp"
44   #include "utils/OOPSEConstant.hpp"
46 #include "hydrodynamics/Sphere.hpp"
47 #include "hydrodynamics/Ellipsoid.hpp"
48 #include "utils/ElementsTable.hpp"
45   #include "math/ConvexHull.hpp"
46   #include "math/Triangle.hpp"
47  
52
48   namespace oopse {
49 +  
50 +  SMIPDForceManager::SMIPDForceManager(SimInfo* info) : ForceManager(info) {
51  
55  SMIPDForceManager::SMIPDForceManager(SimInfo* info) : ForceManager(info), forceTolerance_(1e-6), maxIterNum_(4) {
52      simParams = info->getSimParams();
57    veloMunge = new Velocitizer(info);
53      
54      // Create Hull, Convex Hull for now, other options later.
55 +    
56      surfaceMesh_ = new ConvexHull();
57      
62    
58      /* Check that the simulation has target pressure and target
59         temperature set*/
60 <
60 >    
61      if (!simParams->haveTargetTemp()) {
62 <      sprintf(painCave.errMsg, "You can't use the SMIPDynamics integrator without a targetTemp!\n");
62 >      sprintf(painCave.errMsg,
63 >              "SMIPDynamics error: You can't use the SMIPD integrator\n"
64 >              "   without a targetTemp!\n");      
65        painCave.isFatal = 1;
66        painCave.severity = OOPSE_ERROR;
67        simError();
68      } else {
69        targetTemp_ = simParams->getTargetTemp();
70      }
71 <
71 >    
72      if (!simParams->haveTargetPressure()) {
73 <      sprintf(painCave.errMsg, "SMIPDynamics error: You can't use the SMIPD integrator\n"
74 <              "   without a targetPressure!\n");
75 <      
73 >      sprintf(painCave.errMsg,
74 >              "SMIPDynamics error: You can't use the SMIPD integrator\n"
75 >              "   without a targetPressure!\n");      
76        painCave.isFatal = 1;
77        simError();
78      } else {
79 <      targetPressure_ = simParams->getTargetPressure();
79 >      // Convert pressure from atm -> amu/(fs^2*Ang)
80 >      targetPressure_ = simParams->getTargetPressure() /
81 >        OOPSEConstant::pressureConvert;
82      }
84
83    
84      if (simParams->getUsePeriodicBoundaryConditions()) {
85 <      sprintf(painCave.errMsg, "SMIPDynamics error: You can't use the SMIPD integrator\n"
86 <              "   with periodic boundary conditions !\n");
87 <      
85 >      sprintf(painCave.errMsg,
86 >              "SMIPDynamics error: You can't use the SMIPD integrator\n"
87 >              "   with periodic boundary conditions!\n");    
88        painCave.isFatal = 1;
89        simError();
90      }
91 +    
92 +    if (!simParams->haveViscosity()) {
93 +      sprintf(painCave.errMsg,
94 +              "SMIPDynamics error: You can't use the SMIPD integrator\n"
95 +              "   without a viscosity!\n");
96 +      painCave.isFatal = 1;
97 +      painCave.severity = OOPSE_ERROR;
98 +      simError();
99 +    }else{
100 +      viscosity_ = simParams->getViscosity();
101 +    }
102 +    
103 +    dt_ = simParams->getDt();
104 +  
105 +    variance_ = 2.0 * OOPSEConstant::kb * targetTemp_ / dt_;
106  
94
95    // Build the hydroProp map:
96    std::map<std::string, HydroProp*> hydroPropMap;
97
107      Molecule* mol;
108      StuntDouble* integrableObject;
109      SimInfo::MoleculeIterator i;
110 <    Molecule::IntegrableObjectIterator  j;              
102 <    bool needHydroPropFile = false;
103 <    
104 <    for (mol = info->beginMolecule(i); mol != NULL;
105 <         mol = info->nextMolecule(i)) {
106 <      for (integrableObject = mol->beginIntegrableObject(j);
107 <           integrableObject != NULL;
108 <           integrableObject = mol->nextIntegrableObject(j)) {
109 <        
110 <        if (integrableObject->isRigidBody()) {
111 <          RigidBody* rb = static_cast<RigidBody*>(integrableObject);
112 <          if (rb->getNumAtoms() > 1) needHydroPropFile = true;
113 <        }
114 <        
115 <      }
116 <    }
117 <        
110 >    Molecule::IntegrableObjectIterator  j;              
111  
112 <    if (needHydroPropFile) {              
113 <      if (simParams->haveHydroPropFile()) {
121 <        hydroPropMap = parseFrictionFile(simParams->getHydroPropFile());
122 <      } else {              
123 <        sprintf( painCave.errMsg,
124 <                 "HydroPropFile must be set to a file name if Langevin Dynamics\n"
125 <                 "\tis specified for rigidBodies which contain more than one atom\n"
126 <                 "\tTo create a HydroPropFile, run the \"Hydro\" program.\n");
127 <        painCave.severity = OOPSE_ERROR;
128 <        painCave.isFatal = 1;
129 <        simError();  
130 <      }      
112 >    // Build a vector of integrable objects to determine if the are
113 >    // surface atoms
114  
115 <      for (mol = info->beginMolecule(i); mol != NULL;
116 <           mol = info->nextMolecule(i)) {
117 <        for (integrableObject = mol->beginIntegrableObject(j);
118 <             integrableObject != NULL;
136 <             integrableObject = mol->nextIntegrableObject(j)) {
137 <
138 <          std::map<std::string, HydroProp*>::iterator iter = hydroPropMap.find(integrableObject->getType());
139 <          if (iter != hydroPropMap.end()) {
140 <            hydroProps_.push_back(iter->second);
141 <          } else {
142 <            sprintf( painCave.errMsg,
143 <                     "Can not find resistance tensor for atom [%s]\n", integrableObject->getType().c_str());
144 <            painCave.severity = OOPSE_ERROR;
145 <            painCave.isFatal = 1;
146 <            simError();  
147 <          }        
148 <        }
149 <      }
150 <    } else {
151 <      
152 <      std::map<std::string, HydroProp*> hydroPropMap;
153 <      for (mol = info->beginMolecule(i); mol != NULL;
154 <           mol = info->nextMolecule(i)) {
155 <        for (integrableObject = mol->beginIntegrableObject(j);
156 <             integrableObject != NULL;
157 <             integrableObject = mol->nextIntegrableObject(j)) {
158 <          Shape* currShape = NULL;
159 <
160 <          if (integrableObject->isAtom()){
161 <            Atom* atom = static_cast<Atom*>(integrableObject);
162 <            AtomType* atomType = atom->getAtomType();
163 <            if (atomType->isGayBerne()) {
164 <              DirectionalAtomType* dAtomType = dynamic_cast<DirectionalAtomType*>(atomType);              
165 <              GenericData* data = dAtomType->getPropertyByName("GayBerne");
166 <              if (data != NULL) {
167 <                GayBerneParamGenericData* gayBerneData = dynamic_cast<GayBerneParamGenericData*>(data);
168 <                
169 <                if (gayBerneData != NULL) {  
170 <                  GayBerneParam gayBerneParam = gayBerneData->getData();
171 <                  currShape = new Ellipsoid(V3Zero,
172 <                                            gayBerneParam.GB_l / 2.0,
173 <                                            gayBerneParam.GB_d / 2.0,
174 <                                            Mat3x3d::identity());
175 <                } else {
176 <                  sprintf( painCave.errMsg,
177 <                           "Can not cast GenericData to GayBerneParam\n");
178 <                  painCave.severity = OOPSE_ERROR;
179 <                  painCave.isFatal = 1;
180 <                  simError();  
181 <                }
182 <              } else {
183 <                sprintf( painCave.errMsg, "Can not find Parameters for GayBerne\n");
184 <                painCave.severity = OOPSE_ERROR;
185 <                painCave.isFatal = 1;
186 <                simError();    
187 <              }
188 <            } else {
189 <              if (atomType->isLennardJones()){
190 <                GenericData* data = atomType->getPropertyByName("LennardJones");
191 <                if (data != NULL) {
192 <                  LJParamGenericData* ljData = dynamic_cast<LJParamGenericData*>(data);
193 <                  if (ljData != NULL) {
194 <                    LJParam ljParam = ljData->getData();
195 <                    currShape = new Sphere(atom->getPos(), ljParam.sigma/2.0);
196 <                  } else {
197 <                    sprintf( painCave.errMsg,
198 <                             "Can not cast GenericData to LJParam\n");
199 <                    painCave.severity = OOPSE_ERROR;
200 <                    painCave.isFatal = 1;
201 <                    simError();          
202 <                  }      
203 <                }
204 <              } else {
205 <                int aNum = etab.GetAtomicNum((atom->getType()).c_str());
206 <                if (aNum != 0) {
207 <                  currShape = new Sphere(atom->getPos(), etab.GetVdwRad(aNum));
208 <                } else {
209 <                  sprintf( painCave.errMsg,
210 <                           "Could not find atom type in default element.txt\n");
211 <                  painCave.severity = OOPSE_ERROR;
212 <                  painCave.isFatal = 1;
213 <                  simError();          
214 <                }
215 <              }
216 <            }
217 <          }
218 <          HydroProp* currHydroProp = currShape->getHydroProp(simParams->getViscosity(),simParams->getTargetTemp());
219 <          std::map<std::string, HydroProp*>::iterator iter = hydroPropMap.find(integrableObject->getType());
220 <          if (iter != hydroPropMap.end())
221 <            hydroProps_.push_back(iter->second);
222 <          else {
223 <            currHydroProp->complete();
224 <            hydroPropMap.insert(std::map<std::string, HydroProp*>::value_type(integrableObject->getType(), currHydroProp));
225 <            hydroProps_.push_back(currHydroProp);
226 <          }
227 <        }
228 <      }
229 <    }
230 <
231 <    /* Compute hull first time through to get the area of t=0*/
232 <
233 <    /* Build a vector of integrable objects to determine if the are surface atoms */
234 <    for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) {          
235 <      for (integrableObject = mol->beginIntegrableObject(j); integrableObject != NULL;
115 >    for (mol = info_->beginMolecule(i); mol != NULL;
116 >         mol = info_->nextMolecule(i)) {          
117 >      for (integrableObject = mol->beginIntegrableObject(j);
118 >           integrableObject != NULL;
119             integrableObject = mol->nextIntegrableObject(j)) {  
120          localSites_.push_back(integrableObject);
121        }
122 <    }
240 <
241 <    surfaceMesh_->computeHull(localSites_);
242 <    Area0_ = surfaceMesh_->getArea();
243 <    //variance_ = 2.0 * OOPSEConstant::kb*simParams->getTargetTemp()/simParams->getDt();
244 <    
122 >    }  
123    }  
124 <
247 <  std::map<std::string, HydroProp*> SMIPDForceManager::parseFrictionFile(const std::string& filename) {
248 <    std::map<std::string, HydroProp*> props;
249 <    std::ifstream ifs(filename.c_str());
250 <    if (ifs.is_open()) {
251 <      
252 <    }
253 <    
254 <    const unsigned int BufferSize = 65535;
255 <    char buffer[BufferSize];  
256 <    while (ifs.getline(buffer, BufferSize)) {
257 <      HydroProp* currProp = new HydroProp(buffer);
258 <      props.insert(std::map<std::string, HydroProp*>::value_type(currProp->getName(), currProp));
259 <    }
260 <
261 <    return props;
262 <  }
263 <  
124 >  
125    void SMIPDForceManager::postCalculation(bool needStress){
126      SimInfo::MoleculeIterator i;
127      Molecule::IntegrableObjectIterator  j;
128      Molecule* mol;
129      StuntDouble* integrableObject;
269    RealType mass;
270    Vector3d pos;
271    Vector3d frc;
272    Mat3x3d A;
273    Mat3x3d Atrans;
274    Vector3d Tb;
275    Vector3d ji;
276    unsigned int index = 0;
277    int fdf;
130    
131 <    fdf = 0;
280 <  
281 <    /*Compute surface Mesh*/
131 >    // Compute surface Mesh
132      surfaceMesh_->computeHull(localSites_);
283
284    /* Get area and number of surface stunt doubles and compute new variance */
285     //RealType area = surfaceMesh_->getArea();
286     //RealType nSurfaceSDs = surfaceMesh_->getNs();
287
288 //    std::cerr << "Surface Area is: " << area << " nSurfaceSDs is: " << nSurfaceSDs << std::endl;
289
290    /* Compute variance for random forces */
133      
134 < //    variance_ = sqrt(2.0*NumericConstant::PI)*(targetPressure_*area/nSurfaceSDs);
135 <    
136 < //    std::vector<Triangle*> sMesh = surfaceMesh_->getMesh();
137 < //    std::vector<RealType>  randNums = genTriangleForces(sMesh.size(),variance_);
138 <  
139 <    /* Loop over the mesh faces and apply random force to each of the faces*/
140 <    
141 <    
300 < //    std::vector<Triangle*>::iterator face;
301 < //    std::vector<StuntDouble*>::iterator vertex;
302 < /*    
303 <    for (face = sMesh.begin(); face != sMesh.end(); ++face){
304 <    
305 <      Triangle* thisTriangle = *face;
306 <      std::vector<StuntDouble*> vertexSDs = thisTriangle->getVertices();
307 <
308 <      for (vertex = vertexSDs.begin(); vertex != vertexSDs.end(); ++vertex){
309 <            std::cout << (*vertex)->getPos() << std::endl;
310 <         // mass = integrableObject->getMass();
311 <
312 <         //      integrableObject->addFrc(randomForce);          
313 <      }
134 >    // Get total area and number of surface stunt doubles
135 >    RealType area = surfaceMesh_->getArea();
136 >    int nSurfaceSDs = surfaceMesh_->getNs();        
137 >    std::vector<Triangle> sMesh = surfaceMesh_->getMesh();
138 >    int nTriangles = sMesh.size();
139 >        
140 >    // Generate all of the necessary random forces
141 >    std::vector<RealType>  randNums = genTriangleForces(nTriangles, variance_);
142  
143 +    // Loop over the mesh faces and apply random force to each of the faces
144 +    std::vector<Triangle>::iterator face;
145 +    std::vector<StuntDouble*>::iterator vertex;
146 +    int thisNumber = 0;
147 +    for (face = sMesh.begin(); face != sMesh.end(); ++face){
148 +    
149 +      Triangle thisTriangle = *face;
150 +      std::vector<StuntDouble*> vertexSDs = thisTriangle.getVertices();
151 +      RealType thisArea = thisTriangle.getArea();
152 +      Vector3d unitNormal = thisTriangle.getNormal();
153 +      unitNormal.normalize();
154  
155 <    }
156 <  */
157 <    /*
158 <    for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) {
320 <
155 >      Vector3d centroid = thisTriangle.getCentroid();
156 >      Vector3d facetVel = thisTriangle.getFacetVelocity();
157 >      RealType hydroLength = thisTriangle.getIncircleRadius() * 2.0 /
158 >        NumericConstant::PI;
159        
160 <      for (integrableObject = mol->beginIntegrableObject(j); integrableObject != NULL;
161 <           integrableObject = mol->nextIntegrableObject(j)) {
162 <          
325 <          mass = integrableObject->getMass();
326 <          if (integrableObject->isDirectional()){
160 >      // gamma is the drag coefficient normal to the face of the triangle      
161 >      RealType gamma = viscosity_ * hydroLength *
162 >        OOPSEConstant::viscoConvert;
163  
164 <            // preliminaries for directional objects:
164 >      RealType extPressure = - (targetPressure_ * thisArea) /
165 >        OOPSEConstant::energyConvert;
166  
167 <            A = integrableObject->getA();
168 <            Atrans = A.transpose();
332 <            Vector3d rcrLab = Atrans * hydroProps_[index]->getCOR();  
167 >      RealType randomForce = randNums[thisNumber++] * sqrt(gamma);
168 >      RealType dragForce = -gamma * dot(facetVel, unitNormal);
169  
170 <            //apply random force and torque at center of resistance
171 <
172 <            Vector3d randomForceBody;
173 <            Vector3d randomTorqueBody;
174 <            genRandomForceAndTorque(randomForceBody, randomTorqueBody, index, variance_);
175 <            Vector3d randomForceLab = Atrans * randomForceBody;
176 <            Vector3d randomTorqueLab = Atrans * randomTorqueBody;
177 <            integrableObject->addFrc(randomForceLab);            
178 <            integrableObject->addTrq(randomTorqueLab + cross(rcrLab, randomForceLab ));            
179 <
180 <            Mat3x3d I = integrableObject->getI();
345 <            Vector3d omegaBody;
346 <
347 <            // What remains contains velocity explicitly, but the velocity required
348 <            // is at the full step: v(t + h), while we have initially the velocity
349 <            // at the half step: v(t + h/2).  We need to iterate to converge the
350 <            // friction force and friction torque vectors.
351 <
352 <            // this is the velocity at the half-step:
353 <            
354 <            Vector3d vel =integrableObject->getVel();
355 <            Vector3d angMom = integrableObject->getJ();
356 <
357 <            //estimate velocity at full-step using everything but friction forces:          
358 <
359 <            frc = integrableObject->getFrc();
360 <            Vector3d velStep = vel + (dt2_ /mass * OOPSEConstant::energyConvert) * frc;
361 <
362 <            Tb = integrableObject->lab2Body(integrableObject->getTrq());
363 <            Vector3d angMomStep = angMom + (dt2_ * OOPSEConstant::energyConvert) * Tb;                            
364 <
365 <            Vector3d omegaLab;
366 <            Vector3d vcdLab;
367 <            Vector3d vcdBody;
368 <            Vector3d frictionForceBody;
369 <            Vector3d frictionForceLab(0.0);
370 <            Vector3d oldFFL;  // used to test for convergence
371 <            Vector3d frictionTorqueBody(0.0);
372 <            Vector3d oldFTB;  // used to test for convergence
373 <            Vector3d frictionTorqueLab;
374 <            RealType fdot;
375 <            RealType tdot;
376 <
377 <            //iteration starts here:
378 <
379 <            for (int k = 0; k < maxIterNum_; k++) {
380 <                            
381 <              if (integrableObject->isLinear()) {
382 <                int linearAxis = integrableObject->linearAxis();
383 <                int l = (linearAxis +1 )%3;
384 <                int m = (linearAxis +2 )%3;
385 <                omegaBody[l] = angMomStep[l] /I(l, l);
386 <                omegaBody[m] = angMomStep[m] /I(m, m);
387 <                
388 <              } else {
389 <                omegaBody[0] = angMomStep[0] /I(0, 0);
390 <                omegaBody[1] = angMomStep[1] /I(1, 1);
391 <                omegaBody[2] = angMomStep[2] /I(2, 2);
392 <              }
393 <              
394 <              omegaLab = Atrans * omegaBody;
395 <              
396 <              // apply friction force and torque at center of resistance
397 <              
398 <              vcdLab = velStep + cross(omegaLab, rcrLab);      
399 <              vcdBody = A * vcdLab;
400 <              frictionForceBody = -(hydroProps_[index]->getXitt() * vcdBody + hydroProps_[index]->getXirt() * omegaBody);
401 <              oldFFL = frictionForceLab;
402 <              frictionForceLab = Atrans * frictionForceBody;
403 <              oldFTB = frictionTorqueBody;
404 <              frictionTorqueBody = -(hydroProps_[index]->getXitr() * vcdBody + hydroProps_[index]->getXirr() * omegaBody);
405 <              frictionTorqueLab = Atrans * frictionTorqueBody;
406 <              
407 <              // re-estimate velocities at full-step using friction forces:
408 <              
409 <              velStep = vel + (dt2_ / mass * OOPSEConstant::energyConvert) * (frc + frictionForceLab);
410 <              angMomStep = angMom + (dt2_ * OOPSEConstant::energyConvert) * (Tb + frictionTorqueBody);
411 <
412 <              // check for convergence (if the vectors have converged, fdot and tdot will both be 1.0):
413 <              
414 <              fdot = dot(frictionForceLab, oldFFL) / frictionForceLab.lengthSquare();
415 <              tdot = dot(frictionTorqueBody, oldFTB) / frictionTorqueBody.lengthSquare();
416 <              
417 <              if (fabs(1.0 - fdot) <= forceTolerance_ && fabs(1.0 - tdot) <= forceTolerance_)
418 <                break; // iteration ends here
419 <            }
420 <
421 <            integrableObject->addFrc(frictionForceLab);
422 <            integrableObject->addTrq(frictionTorqueLab + cross(rcrLab, frictionForceLab));
423 <
424 <            
425 <          } else {
426 <            //spherical atom
427 <
428 <            Vector3d randomForce;
429 <            Vector3d randomTorque;
430 <            genRandomForceAndTorque(randomForce, randomTorque, index, variance_);
431 <            integrableObject->addFrc(randomForce);            
432 <
433 <            // What remains contains velocity explicitly, but the velocity required
434 <            // is at the full step: v(t + h), while we have initially the velocity
435 <            // at the half step: v(t + h/2).  We need to iterate to converge the
436 <            // friction force vector.
437 <
438 <            // this is the velocity at the half-step:
439 <            
440 <            Vector3d vel =integrableObject->getVel();
441 <
442 <            //estimate velocity at full-step using everything but friction forces:          
443 <
444 <            frc = integrableObject->getFrc();
445 <            Vector3d velStep = vel + (dt2_ / mass * OOPSEConstant::energyConvert) * frc;
446 <
447 <            Vector3d frictionForce(0.0);
448 <            Vector3d oldFF;  // used to test for convergence
449 <            RealType fdot;
450 <
451 <            //iteration starts here:
452 <
453 <            for (int k = 0; k < maxIterNum_; k++) {
454 <
455 <              oldFF = frictionForce;                            
456 <              frictionForce = -hydroProps_[index]->getXitt() * velStep;
457 <
458 <              // re-estimate velocities at full-step using friction forces:
459 <              
460 <              velStep = vel + (dt2_ / mass * OOPSEConstant::energyConvert) * (frc + frictionForce);
461 <
462 <              // check for convergence (if the vector has converged, fdot will be 1.0):
463 <              
464 <              fdot = dot(frictionForce, oldFF) / frictionForce.lengthSquare();
465 <              
466 <              if (fabs(1.0 - fdot) <= forceTolerance_)
467 <                break; // iteration ends here
468 <            }
469 <
470 <            integrableObject->addFrc(frictionForce);
471 <
472 <          
170 >      Vector3d langevinForce = (extPressure + randomForce + dragForce) * unitNormal;
171 >      
172 >      // Apply triangle force to stuntdouble vertices
173 >      for (vertex = vertexSDs.begin(); vertex != vertexSDs.end(); ++vertex) {
174 >        if ((*vertex) != NULL) {
175 >          Vector3d vertexForce = langevinForce / 3.0;
176 >          (*vertex)->addFrc(vertexForce);          
177 >          if ((*vertex)->isDirectional()) {
178 >            Vector3d vertexPos = (*vertex)->getPos();
179 >            Vector3d vertexCentroidVector = vertexPos - centroid;
180 >            (*vertex)->addTrq(cross(vertexCentroidVector,vertexForce));
181            }
182 <          
475 <        ++index;
476 <    
182 >        }  
183        }
184 <    }    
185 <    */
186 <    // info_->setFdf(fdf);
187 <    // veloMunge->removeComDrift();
188 <    // Remove angular drift if we are not using periodic boundary conditions.
483 <    //if(!simParams->getUsePeriodicBoundaryConditions())
484 <    //  veloMunge->removeAngularDrift();
485 <
486 <    //ForceManager::postCalculation(needStress);  
184 >    }
185 >    
186 >    Snapshot* currSnapshot = info_->getSnapshotManager()->getCurrentSnapshot();
187 >    currSnapshot->setVolume(surfaceMesh_->getVolume());    
188 >    ForceManager::postCalculation(needStress);  
189    }
190  
191 < void SMIPDForceManager::genRandomForceAndTorque(Vector3d& force, Vector3d& torque, unsigned int index, RealType variance) {
191 >  std::vector<RealType> SMIPDForceManager::genTriangleForces(int nTriangles,
192 >                                                             RealType variance) {
193  
491
492    Vector<RealType, 6> Z;
493    Vector<RealType, 6> generalForce;
494        
495    Z[0] = randNumGen_.randNorm(0, variance);
496    Z[1] = randNumGen_.randNorm(0, variance);
497    Z[2] = randNumGen_.randNorm(0, variance);
498    Z[3] = randNumGen_.randNorm(0, variance);
499    Z[4] = randNumGen_.randNorm(0, variance);
500    Z[5] = randNumGen_.randNorm(0, variance);
501    
502    generalForce = hydroProps_[index]->getS()*Z;
503    
504    force[0] = generalForce[0];
505    force[1] = generalForce[1];
506    force[2] = generalForce[2];
507    torque[0] = generalForce[3];
508    torque[1] = generalForce[4];
509    torque[2] = generalForce[5];
510    
511 }
512  std::vector<RealType> SMIPDForceManager::genTriangleForces(int nTriangles, RealType variance) {
513
194      // zero fill the random vector before starting:
195      std::vector<RealType> gaussRand;
196      gaussRand.resize(nTriangles);
197      std::fill(gaussRand.begin(), gaussRand.end(), 0.0);
198 <
519 <
198 >  
199   #ifdef IS_MPI
200      if (worldRank == 0) {
201   #endif
202        for (int i = 0; i < nTriangles; i++) {
203 <        gaussRand[i] = fabs(randNumGen_.randNorm(0.0, 1.0));    
203 >        gaussRand[i] = randNumGen_.randNorm(0.0, variance);
204        }
205   #ifdef IS_MPI
206      }
# Line 531 | Line 210 | void SMIPDForceManager::genRandomForceAndTorque(Vector
210  
211   #ifdef IS_MPI
212      if (worldRank == 0) {
213 <      MPI_Bcast(&gaussRand[0], nTriangles, MPI_REAL, 0, MPI_COMM_WORLD);
213 >      MPI_Bcast(&gaussRand[0], nTriangles, MPI_REALTYPE, 0, MPI_COMM_WORLD);
214      } else {
215 <      MPI_Bcast(&gaussRand[0], nTriangles, MPI_REAL, 0, MPI_COMM_WORLD);
215 >      MPI_Bcast(&gaussRand[0], nTriangles, MPI_REALTYPE, 0, MPI_COMM_WORLD);
216      }
217   #endif
218 <
540 <    for (int i = 0; i < nTriangles; i++) {
541 <      gaussRand[i] = gaussRand[i] * variance;
542 <    }
543 <
218 >  
219      return gaussRand;
220    }
546
221   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines