45 |
|
namespace OpenMD{ |
46 |
|
|
47 |
|
PotentialEnergyObjectiveFunction::PotentialEnergyObjectiveFunction(SimInfo* info, ForceManager* forceMan) |
48 |
< |
: info_(info), forceMan_(forceMan), thermo(info) { |
48 |
> |
: info_(info), forceMan_(forceMan), thermo(info) { |
49 |
> |
shake_ = new Shake(info_); |
50 |
|
} |
51 |
|
|
52 |
|
|
53 |
|
|
54 |
|
RealType PotentialEnergyObjectiveFunction::value(const DynamicVector<RealType>& x) { |
55 |
|
setCoor(x); |
56 |
+ |
shake_->constraintR(); |
57 |
|
forceMan_->calcForces(); |
58 |
+ |
shake_->constraintF(); |
59 |
|
return thermo.getPotential(); |
60 |
|
} |
61 |
|
|
62 |
|
void PotentialEnergyObjectiveFunction::gradient(DynamicVector<RealType>& grad, const DynamicVector<RealType>& x) { |
63 |
|
|
64 |
< |
setCoor(x); |
65 |
< |
forceMan_->calcForces(); |
66 |
< |
getGrad(grad); |
64 |
> |
setCoor(x); |
65 |
> |
shake_->constraintR(); |
66 |
> |
forceMan_->calcForces(); |
67 |
> |
shake_->constraintF(); |
68 |
> |
getGrad(grad); |
69 |
|
} |
70 |
|
|
71 |
|
RealType PotentialEnergyObjectiveFunction::valueAndGradient(DynamicVector<RealType>& grad, |
72 |
|
const DynamicVector<RealType>& x) { |
73 |
|
|
74 |
< |
setCoor(x); |
75 |
< |
forceMan_->calcForces(); |
74 |
> |
setCoor(x); |
75 |
> |
shake_->constraintR(); |
76 |
> |
forceMan_->calcForces(); |
77 |
> |
shake_->constraintF(); |
78 |
|
getGrad(grad); |
79 |
|
return thermo.getPotential(); |
80 |
|
} |
106 |
|
eulerAngle[2] = x[index++]; |
107 |
|
|
108 |
|
integrableObject->setEuler(eulerAngle); |
109 |
< |
} |
109 |
> |
|
110 |
> |
if (integrableObject->isRigidBody()) { |
111 |
> |
RigidBody* rb = static_cast<RigidBody*>(integrableObject); |
112 |
> |
rb->updateAtoms(); |
113 |
> |
} |
114 |
> |
} |
115 |
|
} |
116 |
|
} |
117 |
|
} |