--- trunk/src/flucq/FluctuatingChargePropagator.cpp 2013/07/19 21:25:45 1908 +++ trunk/src/flucq/FluctuatingChargePropagator.cpp 2014/04/14 18:32:51 1981 @@ -56,16 +56,13 @@ namespace OpenMD { namespace OpenMD { FluctuatingChargePropagator::FluctuatingChargePropagator(SimInfo* info) : - info_(info), hasFlucQ_(false), forceMan_(NULL) { + info_(info), hasFlucQ_(false), forceMan_(NULL), initialized_(false) { Globals* simParams = info_->getSimParams(); fqParams_ = simParams->getFluctuatingChargeParameters(); - fqConstraints_ = new FluctuatingChargeConstraints(info_); - fqConstraints_->setConstrainRegions( fqParams_->getConstrainRegions() ); } FluctuatingChargePropagator::~FluctuatingChargePropagator() { - if (fqConstraints_ != NULL) delete fqConstraints_; } void FluctuatingChargePropagator::setForceManager(ForceManager* forceMan) { @@ -73,28 +70,35 @@ namespace OpenMD { } void FluctuatingChargePropagator::initialize() { - if (info_->usesFluctuatingCharges()) { if (info_->getNFluctuatingCharges() > 0) { hasFlucQ_ = true; + fqConstraints_ = new FluctuatingChargeConstraints(info_); + fqConstraints_->setConstrainRegions(fqParams_->getConstrainRegions()); } } + + if (!hasFlucQ_) { + initialized_ = true; + return; + } - if (!hasFlucQ_) return; - SimInfo::MoleculeIterator i; Molecule::FluctuatingChargeIterator j; Molecule* mol; Atom* atom; - for (mol = info_->beginMolecule(i); mol != NULL; - mol = info_->nextMolecule(i)) { - for (atom = mol->beginFluctuatingCharge(j); atom != NULL; - atom = mol->nextFluctuatingCharge(j)) { - atom->setFlucQPos(0.0); - atom->setFlucQVel(0.0); - } - } + // For single-minima flucq, this ensures a net neutral system, but + // for multiple minima, this is no longer the right thing to do: + // + // for (mol = info_->beginMolecule(i); mol != NULL; + // mol = info_->nextMolecule(i)) { + // for (atom = mol->beginFluctuatingCharge(j); atom != NULL; + // atom = mol->nextFluctuatingCharge(j)) { + // atom->setFlucQPos(0.0); + // atom->setFlucQVel(0.0); + // } + // } FluctuatingChargeObjectiveFunction flucQobjf(info_, forceMan_, fqConstraints_); @@ -109,11 +113,13 @@ namespace OpenMD { DumpStatusFunction dsf(info_); // we want a dump file written // every iteration - minim->minimize(problem, endCriteria); + cerr << "back from minim\n"; + initialized_ = true; } void FluctuatingChargePropagator::applyConstraints() { + if (!initialized_) initialize(); if (!hasFlucQ_) return; fqConstraints_->applyConstraints(); }