1#ifndef RPC_LM_BD_STEP_TPP
2#define RPC_LM_BD_STEP_TPP
13#include <rpc/fts/brownian/BdSimulator.h>
14#include <rpc/fts/compressor/Compressor.h>
15#include <rpc/system/System.h>
16#include <rpc/solvers/Mixture.h>
17#include <rpc/field/Domain.h>
18#include <pscf/math/IntVec.h>
19#include <util/random/Random.h>
25 using namespace Prdc::Cpu;
55 read(in,
"mobility", mobility_);
57 int nMonomer =
system().mixture().nMonomer();
61 w_.allocate(nMonomer);
62 for (
int i=0; i < nMonomer; ++i) {
63 w_[i].allocate(meshDimensions);
65 etaA_.allocate(nMonomer-1);
66 etaB_.allocate(nMonomer-1);
67 for (
int i=0; i < nMonomer - 1; ++i) {
68 etaA_[i].allocate(meshDimensions);
69 etaB_[i].allocate(meshDimensions);
71 dwc_.allocate(meshDimensions);
78 void LMBdStep<D>::generateEtaNew()
80 const int nMonomer = system().mixture().nMonomer();
81 const int meshSize = system().domain().mesh().size();
84 const double vSystem = system().domain().unitCell().volume();
85 const double b = sqrt(0.5*mobility_*
double(meshSize)/vSystem);
88 for (j = 0; j < nMonomer - 1; ++j) {
90 for (k = 0; k < meshSize; ++k) {
91 eta[k] = b*random().gaussian();
100 void LMBdStep<D>::exchangeOldNew()
104 etaOldPtr_ = etaNewPtr_;
114 int nMonomer =
system().mixture().nMonomer();
115 int meshSize =
system().domain().mesh().size();
120 for (
int i=0; i < nMonomer - 1; ++i) {
141 const int nMonomer =
system().mixture().nMonomer();
142 const int meshSize =
system().domain().mesh().size();
149 for (i = 0; i < nMonomer; ++i) {
150 w_[i] =
system().w().rgrid(i);
157 const double a = -1.0*mobility_;
160 for (j = 0; j < nMonomer - 1; ++j) {
164 for (k = 0; k < meshSize; ++k) {
165 dwc_[k] = a*dc[k] + etaN[k] + etaO[k];
168 for (i = 0; i < nMonomer; ++i) {
171 for (k = 0; k < meshSize; ++k) {
172 w[k] += evec*dwc_[k];
178 system().w().setRGrid(w_);
181 bool isConverged =
false;
182 int compress =
simulator().compressor().compress();
An IntVec<D, T> is a D-component vector of elements of integer type T.
Field of real double precision values on an FFT mesh.
Brownian dynamics simulator for PS-FTS.
BdSimulator< D > & simulator()
Get parent BdSimulator object.
System< D > & system()
Get parent System object.
BdStep(BdSimulator< D > &simulator)
Constructor.
virtual bool step()
Take a single Brownian dynamics step.
virtual void readParameters(std::istream &in)
Read required parameters from file.
ScalarParam< Type > & read(std::istream &in, const char *label, Type &value)
Add and read a new required ScalarParam < Type > object.
virtual void setup()
Setup before simulation.
LMBdStep(BdSimulator< D > &simulator)
Constructor.
virtual ~LMBdStep()
Destructor.
Dynamically allocatable contiguous array template.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
Real periodic fields, SCFT and PS-FTS (CPU).
PSCF package top-level namespace.