13#include <pscf/math/IntVec.h>
24 template <
int D,
class T>
39 template <
int D,
class T>
42 McMoveT::readProbability(in);
47 int nMonomer = system().mixture().nMonomer();
48 IntVec<D> meshDimensions = system().domain().mesh().dimensions();
49 w_.allocate(nMonomer);
50 for (
int i=0; i < nMonomer; ++i) {
51 w_[i].allocate(meshDimensions);
53 etaA_.allocate(nMonomer-1);
54 etaB_.allocate(nMonomer-1);
55 for (
int i=0; i < nMonomer - 1; ++i) {
56 etaA_[i].allocate(meshDimensions);
57 etaB_[i].allocate(meshDimensions);
59 dwc_.allocate(meshDimensions);
62 template <
int D,
class T>
66 McMoveT::totalTimer_.start();
75 McMoveT::attemptMoveTimer_.start();
76 McMoveT::incrementNAttempt();
79 for (
int i=0; i < nStep_; ++i) {
82 McMoveT::attemptMoveTimer_.stop();
87 simulator().computeHamiltonian();
89 simulator().clearState();
90 McMoveT::incrementNAccept();
91 McMoveT::totalTimer_.stop();
99 template <
int D,
class T>
105 if (!simulator().hasWc()) {
106 simulator().computeWc();
108 if (!simulator().hasCc()) {
109 if (!system().c().hasData()){
112 simulator().computeCc();
114 if (!simulator().hasDc()) {
115 if (!system().c().hasData()){
118 simulator().computeDc();
122 int nMonomer = system().mixture().nMonomer();
123 int meshSize = system().domain().mesh().size();
126 for (
int i=0; i < nMonomer - 1; ++i) {
143 template <
int D,
class T>
154 simulator().saveState();
157 const int nMonomer = system().mixture().nMonomer();
158 for (
int i = 0; i < nMonomer; ++i) {
166 const double a = -1.0*mobility_;
169 for (
int j = 0; j < nMonomer - 1; ++j) {
170 RFieldT
const & etaN = etaNew(j);
171 RFieldT
const & etaO = etaOld(j);
172 RFieldT
const & dc = simulator().dc(j);
176 for (
int i = 0; i < nMonomer; ++i) {
177 evec = simulator().chiEvecs(j,i);
183 system().w().setRGrid(w_);
186 bool isConverged =
false;
187 int compress = simulator().compressor().compress();
189 simulator().restoreState();
195 simulator().clearState();
196 simulator().clearData();
197 simulator().computeWc();
198 simulator().computeCc();
199 simulator().computeDc();
202 simulator().computeHamiltonian();
214 template <
int D,
class T>
215 void BdMove<D,T>::generateEtaNew()
218 const int nMonomer = system().mixture().nMonomer();
219 const int meshSize = system().domain().mesh().size();
220 const double vSystem = system().domain().unitCell().volume();
221 const double stddev = sqrt(0.5*mobility_*
double(meshSize)/vSystem);
222 const double mean = 0.0;
224 for (
int j = 0; j < nMonomer - 1; ++j) {
225 vecRandom().normal(etaNew(j), stddev, mean);
232 template <
int D,
class T>
233 void BdMove<D,T>::exchangeOldNew()
237 etaOldPtr_ = etaNewPtr_;
An IntVec<D, T> is a D-component vector of elements of integer type T.
void readParameters(std::istream &in) override
Read body of parameter file block.
BdMove(typename T::McSimulator &simulator)
Constructor.
bool move() override
Generate a short BD simulation.
ScalarParam< Type > & read(std::istream &in, const char *label, Type &value)
Add and read a new required ScalarParam < Type > object.
void setClassName(const char *className)
Set class name string.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
void eqV(Array< double > &a, Array< double > const &b, const int beginIdA, const int beginIdB, const int n)
Vector assignment, a[i] = b[i] (real, slice).
void addVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector-vector addition, a[i] = b[i] + c[i] (real)
void addEqVc(Array< double > &a, Array< double > const &b, const double c)
Add scaled vector in-place, a[i] += b[i]*c (real).
Periodic fields and crystallography.
Class templates for real-valued periodic fields.
PSCF package top-level namespace.