ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/flucq/FluctuatingChargeConstraints.cpp
(Generate patch)

Comparing trunk/src/flucq/FluctuatingChargeConstraints.cpp (file contents):
Revision 1908 by gezelter, Fri Jul 19 21:25:45 2013 UTC vs.
Revision 1920 by jmichalk, Wed Jul 31 19:30:46 2013 UTC

# Line 50 | Line 50 | namespace OpenMD {
50   namespace OpenMD {
51  
52    FluctuatingChargeConstraints::FluctuatingChargeConstraints(SimInfo* info) :
53 <    info_(info), constrainRegions_(false), hasFlucQ_(false) {
54 <    
55 <    if (info_->usesFluctuatingCharges()) {
56 <      if (info_->getNFluctuatingCharges() > 0) {
57 <        hasFlucQ_ = true;
53 >    info_(info), constrainRegions_(false), hasFlucQ_(false), initialized_(false) {
54 >  }
55 >
56 >  void FluctuatingChargeConstraints::initialize(){
57 >    if(info_->usesFluctuatingCharges()){
58 >      if(info_->getNFluctuatingCharges() > 0){
59 >        hasFlucQ_ = true;
60        }
61      }
62 +    initialized_ = true;
63    }
64  
65 +
66    void FluctuatingChargeConstraints::setConstrainRegions(bool cr) {
67      constrainRegions_ = cr;
68 +
69 +    if (!initialized_) initialize();
70 +
71      regionKeys_.clear();
72      regionForce_.clear();
73      regionCharges_.clear();
# Line 75 | Line 82 | namespace OpenMD {
82             mol = info_->nextMolecule(i)) {
83          reg = mol->getRegion();
84          if (reg >= 0) regions.insert(reg);
78        
85        }
86 +      // resize the keys vector to the largest found value for regions.
87 +      regionKeys_.resize( *(regions.end()) );
88 +      int which = 0;
89        for (std::set<int>::iterator r=regions.begin(); r!=regions.end(); ++r) {
90 <        regionKeys_.push_back( (*r) );
90 >        regionKeys_[ (*r) ] = which;
91 >        which++;
92        }
93        regionForce_.resize( regionKeys_.size() );
94        regionCharges_.resize( regionKeys_.size() );
# Line 87 | Line 97 | namespace OpenMD {
97  
98  
99    void FluctuatingChargeConstraints::applyConstraints() {
100 +    if (!initialized_) initialize();
101      if (!hasFlucQ_) return;
102 <    
102 >
103      SimInfo::MoleculeIterator i;
104      Molecule::FluctuatingChargeIterator  j;
105      Molecule* mol;
106      Atom* atom;
107      
108      RealType totalFrc, totalMolFrc, regionFrc, constrainedFrc;
98    
109      // accumulate the total system fluctuating charge forces
110      totalFrc = 0.0;
111      if (constrainRegions_) {
# Line 114 | Line 124 | namespace OpenMD {
124          RealType frc = atom->getFlucQFrc();
125          totalFrc += frc;
126          if (constrainRegions_) {
127 <          regionForce_[regionKeys_[region]] += frc;
128 <          regionCharges_[regionKeys_[region]] += 1;
127 >          if (region >= 0) {        
128 >            regionForce_[regionKeys_[region]] += frc;
129 >            regionCharges_[regionKeys_[region]] += 1;
130 >          }
131          }
132        }
133      }
# Line 150 | Line 162 | namespace OpenMD {
162        
163        if (constrainRegions_) {
164          int region = mol->getRegion();
165 <        regionFrc = regionForce_[regionKeys_[region]];
165 >        if (region >= 0)
166 >          regionFrc = regionForce_[regionKeys_[region]];
167 >        else
168 >          regionFrc = 0.0;
169        } else {
170          regionFrc = 0.0;
171        }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines