1#ifndef RP_EXPLICIT_BD_STEP_TPP
2#define RP_EXPLICIT_BD_STEP_TPP
11#include "ExplicitBdStep.h"
12#include <pscf/math/IntVec.h>
23 template <
int D,
class T>
24 ExplicitBdStep<D,T>::ExplicitBdStep(
typename T::BdSimulator& simulator)
35 template <
int D,
class T>
41 int nMonomer = system().mixture().nMonomer();
42 IntVec<D> meshDimensions = system().domain().mesh().dimensions();
43 w_.allocate(nMonomer);
44 for (
int i=0; i < nMonomer; ++i) {
45 w_[i].allocate(meshDimensions);
47 dwc_.allocate(meshDimensions);
53 template <
int D,
class T>
57 IntVec<D> meshDimensions = system().domain().mesh().dimensions();
58 int meshSize = system().domain().mesh().size();
59 int nMonomer = system().mixture().nMonomer();
61 for (
int i = 0; i < nMonomer; ++i) {
65 gaussianField_.allocate(meshDimensions);
71 template <
int D,
class T>
75 const int nMonomer = system().mixture().nMonomer();
76 const int meshSize = system().domain().mesh().size();
80 simulator().saveState();
83 for (i = 0; i < nMonomer; ++i) {
88 const double vSystem = system().domain().unitCell().volume();
89 const double a = -1.0*mobility_;
90 const double b = sqrt(2.0*mobility_*
double(meshSize)/vSystem);
93 const double stddev = 1.0;
94 const double mean = 0.0;
99 for (j = 0; j < nMonomer - 1; ++j) {
102 vecRandom().normal(gaussianField_, stddev, mean);
105 typename T::RField
const & dc = simulator().dc(j);
109 for (i = 0; i < nMonomer; ++i) {
110 typename T::RField & w = w_[i];
111 evec = simulator().chiEvecs(j,i);
118 system().w().setRGrid(w_);
119 simulator().clearData();
122 bool isConverged =
false;
123 int compress = simulator().compressor().compress();
125 simulator().restoreState();
131 simulator().clearState();
132 simulator().computeWc();
133 simulator().computeCc();
134 simulator().computeDc();
An IntVec<D, T> is a D-component vector of elements of integer type T.
void setup() override
Setup before simulation.
bool step() override
Take a single Brownian dynamics step.
void readParameters(std::istream &in) override
Read body of parameter file block.
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 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.
void addVcVc(Array< double > &a, Array< double > const &b1, const double c1, Array< double > const &b2, const double c2)
Add two scaled vectors, a[i] = b1[i]*c1 + b2[2]*c2 (real).
PSCF package top-level namespace.