faunus
speciation.h
1 #pragma once
2 
3 #include "move.h"
4 
5 namespace Faunus::Speciation {
6 
12 {
13  private:
14  const Space& spc;
15  [[nodiscard]] bool canSwapAtoms(const ReactionData& reaction) const;
16  [[nodiscard]] bool canReduceImplicitGroups(const ReactionData& reaction) const;
17  [[nodiscard]] bool canReduceMolecularGroups(const ReactionData& reaction) const;
18  [[nodiscard]] bool canProduceMolecularGroups(const ReactionData& reaction) const;
19  [[nodiscard]] bool canReduceAtomicGroups(const ReactionData& reaction) const;
20  [[nodiscard]] bool canProduceAtomicGroups(const ReactionData& reaction) const;
21 
22  public:
23  explicit ReactionValidator(const Space& spc);
24  bool isPossible(const ReactionData& reaction) const;
25 };
26 
31 {
32  public:
33  using ChangeAndBias = std::pair<Change::GroupChange, double>;
34  using OptionalInt = std::optional<int>;
35  virtual ChangeAndBias activate(Group& group, OptionalInt num_particles = std::nullopt) = 0;
36  virtual ChangeAndBias deactivate(Group& group, OptionalInt num_particles = std::nullopt) = 0;
37  virtual ~GroupDeActivator() = default;
38 };
39 
44 {
45  private:
46  Space& spc;
47  Space& old_spc;
48  Random& random;
49 
50  public:
51  AtomicGroupDeActivator(Space& spc, Space& old_spc, Random& random);
52  ChangeAndBias activate(Group& group, OptionalInt number_to_insert) override;
53  ChangeAndBias deactivate(Group& group, OptionalInt number_to_delete) override;
54 };
55 
69 {
70  private:
71  Space& spc;
72  Random& random;
73  const bool apply_bond_bias;
74  [[nodiscard]] double getBondEnergy(const Group& group) const;
75  virtual void
76  setPositionAndOrientation(Group& group) const;
77 
78  public:
79  MolecularGroupDeActivator(Space& spc, Random& random, bool apply_bond_bias);
80  ChangeAndBias activate(Group& group, OptionalInt num_particles = std::nullopt) override;
81  ChangeAndBias deactivate(Group& group, OptionalInt num_particles = std::nullopt) override;
82 };
83 
88 {
89  private:
90  using reaction_iterator = decltype(Faunus::reactions)::iterator;
91 
92  struct AcceptanceData
93  {
94  Average<double> right;
95  Average<double> left;
96  void update(ReactionData::Direction direction, bool accept);
97  };
98 
99  std::map<reaction_iterator, AcceptanceData> acceptance;
100 
101  public:
102  AcceptanceData& operator[](reaction_iterator iter);
103  void to_json(json& j) const;
104 };
105 
106 } // end of namespace Faunus::Speciation
107 
108 namespace Faunus::move {
109 
130 class SpeciationMove : public Move
131 {
132  private:
133  using reaction_iterator = decltype(Faunus::reactions)::iterator;
134  Random random_internal;
135  reaction_iterator reaction;
136  double bias_energy = 0.0;
137  Speciation::ReactionValidator reaction_validator;
138  Speciation::ReactionDirectionRatio direction_ratio;
139  std::unique_ptr<Speciation::GroupDeActivator>
140  molecular_group_bouncer;
141  std::unique_ptr<Speciation::GroupDeActivator>
142  atomic_group_bouncer;
143 
144  std::map<MoleculeData::index_type, Average<double>>
145  average_reservoir_size;
146 
147  void _to_json(json& j) const override;
148  void _from_json(const json& j) override;
149  void _move(Change& change) override;
150  void _accept(Change& change) override;
151  void _reject(Change& change) override;
152 
153  void setRandomReactionAndDirection();
154  void atomicSwap(Change& change);
155  void deactivateReactants(Change& change);
156  void activateProducts(Change& change);
157  void deactivateAtomicGroups(Change& change);
158  void activateAtomicGroups(Change& change);
159  void deactivateMolecularGroups(Change& change);
160  void activateMolecularGroups(Change& change);
161  void
162  updateGroupMassCenters(const Change& change) const;
163  SpeciationMove(Space& spc, Space& old_spc, std::string_view name, std::string_view cite);
164 
165  public:
166  SpeciationMove(Space& spc, Space& old_spc);
167  double bias(Change& change, double old_energy, double new_energy) override;
168  static void swapParticleProperties(Particle& particle, int new_atomid);
169 };
170 
171 } // namespace Faunus::move
nlohmann::json json
JSON object.
Definition: json_support.h:10
Random random
global instance of Random
Definition: random.cpp:62
General properties of reactionsEnd of class.
Definition: molecule.h:420
Random number generator.
Definition: random.h:34
Base class for all moves (MC, Langevin, ...)
Definition: move.h:38
bool isPossible(const ReactionData &reaction) const
Enough reactants and product capacity?
Definition: speciation.cpp:59
Definition: chainmove.cpp:6
Helper class to check if a reaction is possible, i.e.
Definition: speciation.h:11
Definition: move.h:17
Particle class for storing positions, id, and other properties.
Definition: particle.h:220
Generalised Grand Canonical Monte Carlo Move.
Definition: speciation.h:130
End of Group class.
Definition: group.h:177
Specify changes made to a system.
Definition: space.h:29
std::pair< Change::GroupChange, double > ChangeAndBias
Group change and bias energy.
Definition: speciation.h:33
Helper base class for (de)activating groups in speciation move.
Definition: speciation.h:30
Helper class for contracting and expanding atomic groups.
Definition: speciation.h:43
Placeholder for atoms and molecules.
Definition: space.h:92
Helper class to (de)activate a single molecular group.
Definition: speciation.h:68
std::vector< ReactionData > reactions
List of reactions.
Definition: molecule.cpp:23
Helper class to keep track of acceptance in left or right direction.
Definition: speciation.h:87