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 1579 by gezelter, Thu Jun 9 20:26:29 2011 UTC vs.
Revision 1583 by gezelter, Thu Jun 16 22:00:08 2011 UTC

# Line 59 | Line 59
59   #include "nonbonded/NonBondedInteraction.hpp"
60   #include "parallel/ForceMatrixDecomposition.hpp"
61  
62 + #include <cstdio>
63 + #include <iostream>
64 + #include <iomanip>
65 +
66   using namespace std;
67   namespace OpenMD {
68    
# Line 123 | Line 127 | namespace OpenMD {
127          painCave.severity = OPENMD_INFO;
128          simError();
129        }
126      fDecomp_->setUserCutoff(rCut_);
130      }
131  
132 +    fDecomp_->setUserCutoff(rCut_);
133 +
134      map<string, CutoffMethod> stringToCutoffMethod;
135      stringToCutoffMethod["HARD"] = HARD;
136      stringToCutoffMethod["SWITCHED"] = SWITCHED;
# Line 475 | Line 480 | namespace OpenMD {
480    }
481    
482    void ForceManager::longRangeInteractions() {
483 <    // some of this initial stuff will go away:
483 >
484      Snapshot* curSnapshot = info_->getSnapshotManager()->getCurrentSnapshot();
485      DataStorage* config = &(curSnapshot->atomData);
486      DataStorage* cgConfig = &(curSnapshot->cgData);
482    RealType* frc = config->getArrayPointer(DataStorage::dslForce);
483    RealType* pos = config->getArrayPointer(DataStorage::dslPosition);
484    RealType* trq = config->getArrayPointer(DataStorage::dslTorque);
485    RealType* A = config->getArrayPointer(DataStorage::dslAmat);
486    RealType* electroFrame = config->getArrayPointer(DataStorage::dslElectroFrame);
487    RealType* particlePot = config->getArrayPointer(DataStorage::dslParticlePot);
487  
488 <    // new stuff starts here:
489 <    
488 >    //calculate the center of mass of cutoff group
489 >
490 >    SimInfo::MoleculeIterator mi;
491 >    Molecule* mol;
492 >    Molecule::CutoffGroupIterator ci;
493 >    CutoffGroup* cg;
494 >
495 >    if(info_->getNCutoffGroups() > 0){      
496 >      for (mol = info_->beginMolecule(mi); mol != NULL;
497 >           mol = info_->nextMolecule(mi)) {
498 >        for(cg = mol->beginCutoffGroup(ci); cg != NULL;
499 >            cg = mol->nextCutoffGroup(ci)) {
500 >          cg->updateCOM();
501 >        }
502 >      }      
503 >    } else {
504 >      // center of mass of the group is the same as position of the atom  
505 >      // if cutoff group does not exist
506 >      cgConfig->position = config->position;
507 >    }
508 >
509      fDecomp_->zeroWorkArrays();
510      fDecomp_->distributeData();
511      
# Line 496 | Line 514 | namespace OpenMD {
514      RealType rgrpsq, rgrp, r2, r;
515      RealType electroMult, vdwMult;
516      RealType vij;
517 <    Vector3d fij, fg;
517 >    Vector3d fij, fg, f1;
518      tuple3<RealType, RealType, RealType> cuts;
519      RealType rCutSq;
520      bool in_switching_region;
# Line 505 | Line 523 | namespace OpenMD {
523      InteractionData idat;
524      SelfData sdat;
525      RealType mf;
508    potVec pot(0.0);
509    potVec longRangePotential(0.0);
526      RealType lrPot;
527      RealType vpair;
528 +    potVec longRangePotential(0.0);
529 +    potVec workPot(0.0);
530  
531      int loopStart, loopEnd;
532  
533 +    idat.vdwMult = &vdwMult;
534 +    idat.electroMult = &electroMult;
535 +    idat.pot = &workPot;
536 +    sdat.pot = fDecomp_->getEmbeddingPotential();
537 +    idat.vpair = &vpair;
538 +    idat.f1 = &f1;
539 +    idat.sw = &sw;
540 +    idat.shiftedPot = (cutoffMethod_ == SHIFTED_POTENTIAL) ? true : false;
541 +    idat.shiftedForce = (cutoffMethod_ == SHIFTED_FORCE) ? true : false;
542 +    
543      loopEnd = PAIR_LOOP;
544      if (info_->requiresPrepair() ) {
545        loopStart = PREPAIR_LOOP;
546      } else {
547        loopStart = PAIR_LOOP;
548      }
549 <    
522 <
549 >  
550      for (int iLoop = loopStart; iLoop <= loopEnd; iLoop++) {
551      
552        if (iLoop == loopStart) {
# Line 551 | Line 578 | namespace OpenMD {
578            
579            in_switching_region = switcher_->getSwitch(rgrpsq, sw, dswdr,
580                                                       rgrp);
554
555          idat.sw = &sw;
581                
582            atomListRow = fDecomp_->getAtomsInGroupRow(cg1);
583            atomListColumn = fDecomp_->getAtomsInGroupColumn(cg2);
# Line 564 | Line 589 | namespace OpenMD {
589              for (vector<int>::iterator jb = atomListColumn.begin();
590                   jb != atomListColumn.end(); ++jb) {              
591                atom2 = (*jb);
592 <              
568 <              cerr << "doing atoms " << atom1 << " " << atom2 << "\n";
592 >            
593                if (!fDecomp_->skipAtomPair(atom1, atom2)) {
570                
594                  vpair = 0.0;
595 +                workPot = 0.0;
596 +                f1 = V3Zero;
597  
598 <                cerr << "filling idat atoms " << atom1 << " " << atom2 << "\n";
574 <                idat = fDecomp_->fillInteractionData(atom1, atom2);
575 <                cerr << "done with idat\n";
598 >                fDecomp_->fillInteractionData(idat, atom1, atom2);
599                  
600                  topoDist = fDecomp_->getTopologicalDistance(atom1, atom2);
601                  vdwMult = vdwScale_[topoDist];
602                  electroMult = electrostaticScale_[topoDist];
603  
581                idat.vdwMult = &vdwMult;
582                idat.electroMult = &electroMult;
583                idat.pot = &pot;
584                idat.vpair = &vpair;
585
604                  if (atomListRow.size() == 1 && atomListColumn.size() == 1) {
605                    idat.d = &d_grp;
606                    idat.r2 = &rgrpsq;
# Line 594 | Line 612 | namespace OpenMD {
612                    idat.r2 = &r2;
613                  }
614                  
615 <                cerr << "d = " << d << "\n";
598 <                cerr << "r2 = " << r2 << "\n";
599 <                r = sqrt( r2 );
615 >                r = sqrt( *(idat.r2) );
616                  idat.rij = &r;
617                
618                  if (iLoop == PREPAIR_LOOP) {
619                    interactionMan_->doPrePair(idat);
620                  } else {
605                  cerr << "doing doPair " << atom1 << " " << atom2 << " " << r << "\n";
621                    interactionMan_->doPair(idat);
622                    fDecomp_->unpackInteractionData(idat, atom1, atom2);
623 <                  vij += *(idat.vpair);
624 <                  fij += *(idat.f1);
625 <                  tau -= outProduct( *(idat.d), *(idat.f1));
623 >                  vij += vpair;
624 >                  fij += f1;
625 >                  tau -= outProduct( *(idat.d), f1);
626                  }
627                }
628              }
# Line 673 | Line 688 | namespace OpenMD {
688            fDecomp_->collectIntermediateData();
689  
690            for (int atom1 = 0; atom1 < info_->getNAtoms(); atom1++) {
691 <            sdat = fDecomp_->fillSelfData(atom1);
691 >            fDecomp_->fillSelfData(sdat, atom1);
692              interactionMan_->doPreForce(sdat);
693            }
694 <
694 >          
695 >          
696            fDecomp_->distributeIntermediateData();        
697          }
698        }
# Line 695 | Line 711 | namespace OpenMD {
711               jb != skipList.end(); ++jb) {        
712      
713            atom2 = (*jb);
714 <          idat = fDecomp_->fillSkipData(atom1, atom2);
714 >          fDecomp_->fillSkipData(idat, atom1, atom2);
715            interactionMan_->doSkipCorrection(idat);
716 +          fDecomp_->unpackSkipData(idat, atom1, atom2);
717  
718          }
719        }
# Line 705 | Line 722 | namespace OpenMD {
722      if (info_->requiresSelfCorrection()) {
723  
724        for (int atom1 = 0; atom1 < info_->getNAtoms(); atom1++) {          
725 <        sdat = fDecomp_->fillSelfData(atom1);
725 >        fDecomp_->fillSelfData(sdat, atom1);
726          interactionMan_->doSelfCorrection(sdat);
727        }
728  
729      }
730  
731 <    longRangePotential = fDecomp_->getLongRangePotential();
731 >    longRangePotential = *(fDecomp_->getEmbeddingPotential()) +
732 >      *(fDecomp_->getPairwisePotential());
733 >
734      lrPot = longRangePotential.sum();
735  
736      //store the tau and long range potential    

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines