ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/brains/ForceManager.cpp
(Generate patch)

Comparing branches/development/src/brains/ForceManager.cpp (file contents):
Revision 1569 by gezelter, Thu May 26 13:55:04 2011 UTC vs.
Revision 1575 by gezelter, Fri Jun 3 21:39:49 2011 UTC

# Line 63 | Line 63 | namespace OpenMD {
63    
64    ForceManager::ForceManager(SimInfo * info) : info_(info) {
65  
66 #ifdef IS_MPI
66      fDecomp_ = new ForceMatrixDecomposition(info_);
68 #else
69    // fDecomp_ = new ForceSerialDecomposition(info);
70 #endif
67    }
68    
69    void ForceManager::calcForces() {
# Line 77 | Line 73 | namespace OpenMD {
73        interactionMan_->setSimInfo(info_);
74        interactionMan_->initialize();
75        swfun_ = interactionMan_->getSwitchingFunction();
80      fDecomp_->distributeInitialData();
76        info_->prepareTopology();
77 +      fDecomp_->distributeInitialData();
78      }
79      
80      preCalculation();  
# Line 265 | Line 261 | namespace OpenMD {
261        rc = pos;
262      }
263      
264 <    //initialize data before passing to fortran
265 <    RealType longRangePotential[N_INTERACTION_FAMILIES];
270 <    RealType lrPot = 0.0;
271 <    int isError = 0;
272 <
273 <    // dangerous to iterate over enums, but we'll live on the edge:
274 <    for (int i = NO_FAMILY; i != N_INTERACTION_FAMILIES; ++i){
275 <      longRangePotential[i]=0.0; //Initialize array
276 <    }
277 <
278 <    // new stuff starts here:
279 <
264 >    // new stuff starts here:
265 >    fDecomp_->zeroWorkArrays();
266      fDecomp_->distributeData();
267  
268      int cg1, cg2, atom1, atom2;
# Line 292 | Line 278 | namespace OpenMD {
278      InteractionData idat;
279      SelfData sdat;
280      RealType mf;
281 +    potVec pot(0.0);
282 +    potVec longRangePotential(0.0);
283 +    RealType lrPot;
284  
285      int loopStart, loopEnd;
286  
# Line 344 | Line 333 | namespace OpenMD {
333                
334                if (!fDecomp_->skipAtomPair(atom1, atom2)) {
335                  
336 +                pot *= 0.0;
337 +
338                  idat = fDecomp_->fillInteractionData(atom1, atom2);
339 +                *(idat.pot) = pot;
340  
341                  if (atomListRow.size() == 1 && atomListColumn.size() == 1) {
342                    *(idat.d) = d_grp;
# Line 361 | Line 353 | namespace OpenMD {
353                    interactionMan_->doPrePair(idat);
354                  } else {
355                    interactionMan_->doPair(idat);
356 +                  fDecomp_->unpackInteractionData(idat, atom1, atom2);
357                    vij += *(idat.vpair);
358                    fij += *(idat.f1);
359                    tau -= outProduct( *(idat.d), *(idat.f1));
# Line 427 | Line 420 | namespace OpenMD {
420        if (iLoop == PREPAIR_LOOP) {
421          if (info_->requiresPrepair()) {            
422            fDecomp_->collectIntermediateData();
423 <          atomListLocal = fDecomp_->getAtomList();
424 <          for (vector<int>::iterator ia = atomListLocal.begin();
432 <               ia != atomListLocal.end(); ++ia) {              
433 <            atom1 = (*ia);            
423 >
424 >          for (int atom1 = 0; atom1 < info_->getNAtoms(); atom1++) {
425              sdat = fDecomp_->fillSelfData(atom1);
426              interactionMan_->doPreForce(sdat);
427            }
428 +
429            fDecomp_->distributeIntermediateData();        
430          }
431        }
# Line 442 | Line 434 | namespace OpenMD {
434      
435      fDecomp_->collectData();
436      
437 <    if (info_->requiresSkipCorrection() || info_->requiresSelfCorrection()) {
438 <      atomListLocal = fDecomp_->getAtomList();
439 <      for (vector<int>::iterator ia = atomListLocal.begin();
448 <           ia != atomListLocal.end(); ++ia) {              
449 <        atom1 = (*ia);    
437 >    if ( info_->requiresSkipCorrection() ) {
438 >      
439 >      for (int atom1 = 0; atom1 < fDecomp_->getNAtomsInRow(); atom1++) {
440  
441 <        if (info_->requiresSkipCorrection()) {
442 <          vector<int> skipList = fDecomp_->getSkipsForAtom(atom1);
443 <          for (vector<int>::iterator jb = skipList.begin();
444 <               jb != skipList.end(); ++jb) {              
445 <            atom2 = (*jb);
446 <            idat = fDecomp_->fillSkipData(atom1, atom2);
447 <            interactionMan_->doSkipCorrection(idat);
448 <          }
441 >        vector<int> skipList = fDecomp_->getSkipsForRowAtom( atom1 );
442 >        
443 >        for (vector<int>::iterator jb = skipList.begin();
444 >             jb != skipList.end(); ++jb) {        
445 >    
446 >          atom2 = (*jb);
447 >          idat = fDecomp_->fillSkipData(atom1, atom2);
448 >          interactionMan_->doSkipCorrection(idat);
449 >
450          }
460          
461        if (info_->requiresSelfCorrection()) {
462          sdat = fDecomp_->fillSelfData(atom1);
463          interactionMan_->doSelfCorrection(sdat);
464        }
451        }
452      }
453 +    
454 +    if (info_->requiresSelfCorrection()) {
455  
456 <    // dangerous to iterate over enums, but we'll live on the edge:
457 <    for (int i = NO_FAMILY; i != N_INTERACTION_FAMILIES; ++i){
458 <      lrPot += longRangePotential[i]; //Quick hack
456 >      for (int atom1 = 0; atom1 < info_->getNAtoms(); atom1++) {          
457 >        sdat = fDecomp_->fillSelfData(atom1);
458 >        interactionMan_->doSelfCorrection(sdat);
459 >      }
460 >
461      }
462 <        
462 >
463 >    longRangePotential = fDecomp_->getLongRangePotential();
464 >    lrPot = longRangePotential.sum();
465 >
466      //store the tau and long range potential    
467      curSnapshot->statData[Stats::LONG_RANGE_POTENTIAL] = lrPot;
468      curSnapshot->statData[Stats::VANDERWAALS_POTENTIAL] = longRangePotential[VANDERWAALS_FAMILY];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines