PSCF v1.4.0
fts/montecarlo/McSimulator.h
1#ifndef RP_MC_SIMULATOR_H
2#define RP_MC_SIMULATOR_H
3
4/*
5* PSCF - Polymer Self-Consistent Field
6*
7* Copyright 2015 - 2025, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11#include <util/global.h>
12#include <iostream>
13#include <string>
14
15// Forward declaration
16namespace Util { template <class T> class Factory; }
17
18namespace Pscf {
19namespace Rp {
20
21 using namespace Util;
22
44 template <int D, class T>
45 class McSimulator : public T::Simulator
46 {
47
48 public:
49
52
58 virtual void readParameters(std::istream &in);
59
63
72 void simulate(int nStep);
73
86 virtual void analyze(int min, int max,
87 std::string classname,
88 std::string filename);
89
93 virtual void outputTimers(std::ostream& out) const;
94
98 virtual void clearTimers();
99
103
107 typename T::McMoveManager const& mcMoveManager() const;
108
112 typename T::McMoveManager& mcMoveManager();
113
117 typename T::AnalyzerManager const & analyzerManager() const;
118
122 typename T::AnalyzerManager& analyzerManager();
123
128
134 bool hasMcMoves() const;
135
143 bool needsCc();
144
153 bool needsDc();
154
156
157 protected:
158
160 using SystemT = typename T::System;
161
163 using SimulatorT = typename T::Simulator;
164
166 using McSimulatorT = typename T::McSimulator;
167
174 McSimulator(SystemT& system, McSimulatorT& mcSimulator);
175
179 ~McSimulator();
180
181 // Prohibit copying and assignment.
182 McSimulator(McSimulator<D,T> const &) = delete;
183 McSimulator<D,T>& operator = (McSimulator<D,T> const &) = delete;
184
185 // Inherited protected member function (selected).
186 using SimulatorT::state;
187
188 // Inherited protected data members (selected).
189 using SimulatorT::iStep_;
190 using SimulatorT::iTotalStep_;
191
192 private:
193
195 using AnalyzerT = typename T::Analyzer;
196
200 typename T::McMoveManager* mcMoveManagerPtr_;
201
205 typename T::AnalyzerManager* analyzerManagerPtr_;
206
210 Factory<typename T::TrajectoryReader>* trajectoryReaderFactoryPtr_;
211
212 // Private member function
213
219 void setup(int nStep);
220
221 };
222
223 // Inline member function definitions
224
225 // Get the Monte-Carlo move manager (const)
226 template <int D, class T> inline
227 typename T::McMoveManager const& McSimulator<D,T>::mcMoveManager() const
228 {
229 UTIL_ASSERT(mcMoveManagerPtr_);
230 return *mcMoveManagerPtr_;
231 }
232
233 // Get the Monte-Carlo move manager (non-const).
234 template <int D, class T> inline
235 typename T::McMoveManager& McSimulator<D,T>::mcMoveManager()
236 {
237 UTIL_ASSERT(mcMoveManagerPtr_);
238 return *mcMoveManagerPtr_;
239 }
240
241 // Get the Analyzer manager (const).
242 template <int D, class T> inline
243 typename T::AnalyzerManager const& McSimulator<D,T>::analyzerManager()
244 const
245 {
246 UTIL_ASSERT(analyzerManagerPtr_);
247 return *analyzerManagerPtr_;
248 }
249
250 // Get the Analyzer manager.
251 template <int D, class T> inline
252 typename T::AnalyzerManager& McSimulator<D,T>::analyzerManager()
253 {
254 UTIL_ASSERT(analyzerManagerPtr_);
255 return *analyzerManagerPtr_;
256 }
257
258 // Get the TrajectoryReader factory.
259 template <int D, class T> inline
262 {
263 UTIL_ASSERT(trajectoryReaderFactoryPtr_);
264 return *trajectoryReaderFactoryPtr_;
265 }
266
267 // Have any MC moves been defined?
268 template <int D, class T> inline
270 { return (bool)(mcMoveManager().size() > 0); }
271
272 // Does the stored state need to include Cc fields?
273 template <int D, class T> inline
275 { return state().needsCc; }
276
277 // Does the stored state need to include Dc fields?
278 template <int D, class T> inline
280 { return state().needsDc; }
281
282}
283}
284#endif
T::AnalyzerManager const & analyzerManager() const
Get the AnalyzerManager (const).
McSimulator(SystemT &system, McSimulatorT &mcSimulator)
Constructor.
virtual void clearTimers()
Clear timers.
Factory< typename T::TrajectoryReader > & trajectoryReaderFactory()
Get the trajectory reader factory by reference.
T::McMoveManager const & mcMoveManager() const
Get the McMoveManager (const).
virtual void readParameters(std::istream &in)
Read parameter file block.
virtual void analyze(int min, int max, std::string classname, std::string filename)
Read and analyze a trajectory file.
bool hasMcMoves() const
Have any MC moves been defined?
bool needsCc()
Does the stored state need to include Cc fields?
bool needsDc()
Does the stored state need to include Dc fields?
typename T::System SystemT
Alias for System class in program-level namespace.
virtual void outputTimers(std::ostream &out) const
Output timing results.
~McSimulator()
Destructor.
typename T::Simulator SimulatorT
Alias for Simulator class in program-level namespace.
typename T::McSimulator McSimulatorT
Alias for McSimulator class in program-level namespace.
void simulate(int nStep)
Perform a field theoretic Monte-Carlo simulation.
Factory template.
Definition Factory.h:34
File containing preprocessor macros for error handling.
#define UTIL_ASSERT(condition)
Assertion macro suitable for debugging serial or parallel code.
Definition global.h:75
Class templates for real-valued periodic fields.
PSCF package top-level namespace.
Utility classes for scientific computation.