67 class SPFForceManager :
public ForceManager {
72 void setSelectedMolecule(
Molecule* selectedMolecule);
73 void setDeltaLambda(RealType spfTarget);
74 RealType getScaledDeltaU();
76 bool getHasSelectedMolecule()
const {
return hasSelectedMolecule_; }
78 void setHasSelectedMolecule(
bool hasSelectedMolecule) {
79 hasSelectedMolecule_ = hasSelectedMolecule;
82 Molecule* getSelectedMolecule() {
return selectedMolecule_; }
83 Snapshot getTemporarySourceSnapshot() {
return *temporarySourceSnapshot_; }
84 Snapshot getTemporarySinkSnapshot() {
return *temporarySinkSnapshot_; }
86 void updateSPFState() {
87 combineForcesAndTorques();
95 void calcForces()
override;
97 void combineForcesAndTorques();
98 void updatePotentials();
99 void updateLongRangePotentials();
100 void updateShortRangePotentials();
101 void updateSelfPotentials();
102 void updateExcludedPotentials();
103 void updateRestraintPotentials();
104 void updateSelectionPotentials();
105 void updateVirialTensor();
107 RealType f_lambda(RealType lambda)
const {
108 RealType result = std::pow(lambda, k_);
110 return std::clamp(result, 0.0, 1.0);
114 T linearCombination(T quantityA, T quantityB) {
115 RealType result = f_lambda(currentSnapshot_->getSPFData()->lambda);
117 return T {(1.0 - result) * quantityA + result * quantityB};
120 std::unique_ptr<Thermo> thermo_ {
nullptr};
122 Snapshot* currentSnapshot_ {
nullptr};
123 Snapshot* temporarySourceSnapshot_ {
nullptr};
124 Snapshot* temporarySinkSnapshot_ {
nullptr};
127 std::vector<int> sourceNeighborList_;
128 std::vector<int> sourcePoint_;
129 std::vector<Vector3d> sourceSavedPositions_;
131 std::vector<int> sinkNeighborList_;
132 std::vector<int> sinkPoint_;
133 std::vector<Vector3d> sinkSavedPositions_;
135 bool hasSelectedMolecule_ {};
137 Molecule* selectedMolecule_ {
nullptr};
140 RealType deltaLambda_ {};
142 RealType potentialSource_ {};
143 RealType potentialSink_ {};