1#ifndef RP_EINSTEIN_CRYSTAL_PERTURBATION_TPP
2#define RP_EINSTEIN_CRYSTAL_PERTURBATION_TPP
12#include "EinsteinCrystalPerturbation.h"
13#include <prdc/crystal/UnitCell.h>
24 template <
int D,
class T>
26 typename T::Simulator& simulator)
27 : PerturbationT(simulator),
29 unperturbedHamiltonian_(0.0),
30 stateEcHamiltonian_(0.0),
31 stateUnperturbedHamiltonian_(0.0),
38 template <
int D,
class T>
44 const int nMonomer = system().mixture().nMonomer();
45 epsilon_.allocate(nMonomer - 1);
46 for (
int i = 0; i < nMonomer - 1 ; ++i) {
51 int nc = nMonomer - 1;
53 epsilon_, nc).isActive();
61 template <
int D,
class T>
64 const int nMonomer = system().mixture().nMonomer();
66 = system().domain().mesh().dimensions();
69 w0_.allocate(nMonomer);
70 wc0_.allocate(nMonomer);
71 for (
int i = 0; i < nMonomer; ++i) {
72 w0_[i].allocate(meshDimensions);
73 wc0_[i].allocate(meshDimensions);
75 dw_.allocate(meshDimensions);
82 for (
int i = 0; i < nMonomer - 1 ; ++i) {
83 epsilon_[i] = -1.0 * simulator().chiEval(i);
88 for (
int i = 0; i < nMonomer - 1 ; ++i) {
93 UnitCell<D> tempUnitCell;
94 typename T::FieldIo
const & fieldIo = system().domain().fieldIo();
95 fieldIo.readFieldsRGrid(fieldFileName_, w0_, tempUnitCell);
104 template <
int D,
class T>
107 double unperturbedHamiltonian)
110 unperturbedHamiltonian_ = unperturbedHamiltonian;
113 const int nMonomer = system().mixture().nMonomer();
114 const double vMonomer = system().mixture().vMonomer();
115 typename T::Domain
const & domain = system().domain();
116 const int meshSize = domain.mesh().size();
117 const double vSystem = domain.unitCell().volume();
118 const double nMonomerSystem = vSystem / vMonomer;
122 ecHamiltonian_ = 0.0;
123 for (
int j = 0; j < nMonomer - 1; ++j) {
125 prefactor = double(nMonomer)/(2.0 * epsilon_[j]);
128 ecHamiltonian_ /= double(meshSize);
129 ecHamiltonian_ *= nMonomerSystem;
131 return (1.0 - lambda_)*(ecHamiltonian_ - unperturbedHamiltonian_);
137 template <
int D,
class T>
141 const int nMonomer = system().mixture().nMonomer();
142 const double vMonomer = system().mixture().vMonomer();
146 for (
int i = 0; i < nMonomer - 1; ++i) {
147 prefactor = double(nMonomer) / (epsilon_[i] * vMonomer);
162 template <
int D,
class T>
164 {
return unperturbedHamiltonian_ - ecHamiltonian_; }
169 template <
int D,
class T>
172 stateEcHamiltonian_ = ecHamiltonian_;
173 stateUnperturbedHamiltonian_ = unperturbedHamiltonian_;
179 template <
int D,
class T>
182 ecHamiltonian_ = stateEcHamiltonian_;
183 unperturbedHamiltonian_ = stateUnperturbedHamiltonian_;
190 template <
int D,
class T>
191 void EinsteinCrystalPerturbation<D,T>::computeWcReference()
193 const int nMonomer = system().mixture().nMonomer();
197 for (i = 0; i < nMonomer; ++i) {
203 for (j = 0; j < nMonomer; ++j) {
204 double vec = simulator().chiEvecs(i, j)/double(nMonomer);
An IntVec<D, T> is a D-component vector of elements of integer type T.
virtual void setup()
Complete any required initialization.
virtual double hamiltonian(double unperturbedHamiltonian)
Compute and return the perturbation to the Hamiltonian.
EinsteinCrystalPerturbation(typename T::Simulator &simulator)
Constructor.
virtual void saveState()
Save any required internal state variables.
virtual void restoreState()
Restore any required internal state variables.
virtual void incrementDc(DArray< typename T::RField > &dc)
Modify the generalized forces to include perturbation.
virtual double df()
Compute and return derivative of free energy w/ respect to lambda.
virtual void readParameters(std::istream &in)
Read body of parameter file block and initialize.
Dynamically allocatable contiguous array template.
DArrayParam< Type > & readOptionalDArray(std::istream &in, const char *label, DArray< Type > &array, int n)
Add and read an optional DArray < Type > parameter.
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.
File containing preprocessor macros for error handling.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
double sumSq(Array< double > const &in)
Compute sum of of squares of array elements (real).
void mulEqS(Array< double > &a, double b)
Vector-scalar in-place multiplication, a[i] *= b (real).
void subVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector-vector subtraction, a[i] = b[i] - c[i] (real)
void eqS(Array< double > &a, double b)
Vector assignment, a[i] = b (real).
void addEqVc(Array< double > &a, Array< double > const &b, const double c)
Add scaled vector in-place, a[i] += b[i]*c (real).
Class templates for real-valued periodic fields.
PSCF package top-level namespace.