1#ifndef RP_LR_AM_COMPRESSOR_TPP
2#define RP_LR_AM_COMPRESSOR_TPP
11#include "LrAmCompressor.h"
12#include <pscf/math/IntVec.h>
25 template <
int D,
class T,
class V>
28 isIntraCalculated_(false),
31 CompressorT::setSystem(system);
38 template <
int D,
class T,
class V>
54 template <
int D,
class T,
class V>
61 const int nMonomer = system().mixture().nMonomer();
62 IntVec<D> const & dimensions = system().domain().mesh().dimensions();
63 FFTT::computeKMesh(dimensions, kMeshDimensions_, kSize_);
67 w0_.allocate(nMonomer);
68 wFieldTmp_.allocate(nMonomer);
69 resid_.allocate(dimensions);
70 residK_.allocate(dimensions);
71 intraCorrelationK_.allocate(kMeshDimensions_);
72 for (
int i = 0; i < nMonomer; ++i) {
73 w0_[i].allocate(dimensions);
74 wFieldTmp_[i].allocate(dimensions);
80 if (!isIntraCalculated_){
81 intra_.computeOmegaTotal(intraCorrelationK_);
82 isIntraCalculated_ =
true;
86 for (
int i = 0; i < nMonomer; ++i) {
95 template <
int D,
class T,
class V>
105 template <
int D,
class T,
class V>
109 out <<
"LrAmCompressor time contributions:\n";
116 template <
int D,
class T,
class V>
120 CompressorT::mdeCounter_ = 0;
128 template <
int D,
class T,
class V>
129 int LrAmCompressor<D,T,V>::nElements()
130 {
return system().domain().mesh().size(); }
135 template <
int D,
class T,
class V>
136 bool LrAmCompressor<D,T,V>::hasInitialGuess()
137 {
return system().w().hasData(); }
145 template <
int D,
class T,
class V>
146 void LrAmCompressor<D,T,V>::getCurrent(VectorT& curr)
160 template <
int D,
class T,
class V>
161 void LrAmCompressor<D,T,V>::evaluate()
164 ++(CompressorT::mdeCounter_);
170 template <
int D,
class T,
class V>
171 void LrAmCompressor<D,T,V>::getResidual(VectorT& resid)
177 const int nMonomer = system().mixture().nMonomer();
178 for (
int i = 0; i < nMonomer; ++i) {
189 template <
int D,
class T,
class V>
191 LrAmCompressor<D,T,V>::addCorrection(VectorT& fieldTrial,
192 VectorT
const & resTrial)
199 system().domain().fft().forwardTransform(resid_, residK_);
202 const double vMonomer = system().mixture().vMonomer();
206 system().domain().fft().inverseTransformUnsafe(residK_, resid_);
215 template <
int D,
class T,
class V>
216 void LrAmCompressor<D,T,V>::update(VectorT& newGuess)
219 const int nMonomer = system().mixture().nMonomer();
220 for (
int i = 0; i < nMonomer; ++i) {
225 system().w().setRGrid(wFieldTmp_);
231 template <
int D,
class T,
class V>
232 void LrAmCompressor<D,T,V>::outputToLog()
virtual void setup(bool isContinuation)
void outputTimers(std::ostream &out) const
void readErrorType(std::istream &in)
virtual void readParameters(std::istream &in)
int solve(bool isContinuation=false)
Iterate to a solution.
An IntVec<D, T> is a D-component vector of elements of integer type T.
void setup(bool isContinuation) override
Initialize just before entry to iterative loop.
int compress() override
Compress to obtain partial saddle point field.
void outputTimers(std::ostream &out) const override
Return compressor time contributions.
LrAmCompressor(typename T::System &system)
Constructor.
void clearTimers() override
Clear all timers and MDE solution counter.
void readParameters(std::istream &in) override
Read body of parameter file block and initialize.
void setClassName(const char *className)
Set class name string.
File containing preprocessor macros for error handling.
void addEqV(Array< double > &a, Array< double > const &b)
Vector-vector in-place addition, a[i] += b[i] (real).
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 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 addVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector-vector addition, a[i] = b[i] + c[i] (real)
void divEqVc(Array< fftw_complex > &a, Array< double > const &b, double c)
Vector division in-place w/ coeff., a[i] /= (b[i] * c).
Class templates for real-valued periodic fields.
PSCF package top-level namespace.