11#include <rpc/scft/iterator/Iterator.h>
12#include <rpc/scft/ScftThermo.h>
13#include <rpc/system/System.h>
14#include <rpc/solvers/Mixture.h>
15#include <rpc/field/Domain.h>
16#include <rpc/field/WFields.h>
17#include <rpc/field/CFields.h>
18#include <prdc/environment/Environment.h>
19#include <prdc/crystal/Basis.h>
20#include <prdc/crystal/UnitCell.h>
21#include <pscf/inter/Interaction.h>
22#include <pscf/sweep/SweepTmpl.tpp>
23#include <util/misc/FileMaster.h>
24#include <util/misc/ioUtil.h>
32 # define RPC_HISTORY_CAPACITY 3
58 if (
system().hasEnvironment()) {
115 fileName +=
"sweep.log";
116 system().fileMaster().openOutputFile(fileName, logFile_);
117 logFile_ <<
" step ds free_energy pressure"
130 UTIL_THROW(
"Calling unimplemented function Sweep::setParameters");
148 bool isFlexible =
system().iterator().isFlexible();
155 int nMonomer =
system().mixture().nMonomer();
156 int nBasis =
system().domain().basis().nBasis();
160 for (i=0; i < nMonomer; ++i) {
161 newFieldPtr = &(trial_.field(i));
164 oldFieldPtr = &
state(0).field(i);
166 for (j=0; j < nBasis; ++j) {
167 (*newFieldPtr)[j] = coeff*(*oldFieldPtr)[j];
172 oldFieldPtr = &
state(k).field(i);
174 for (j=0; j < nBasis; ++j) {
175 (*newFieldPtr)[j] += coeff*(*oldFieldPtr)[j];
184 unitCellParameters_ =
system().domain().unitCell().parameters();
193 system().iterator().flexibleParams();
195 =
system().domain().unitCell().nParameter();
201 for (
int i = 0; i < nParameter; ++i) {
204 unitCellParameters_[i] = 0;
206 parameter =
state(k).unitCell().parameter(i);
207 unitCellParameters_[i] += coeff*parameter;
214 trial_.unitCell().setParameters(unitCellParameters_);
217 bool newCellParams(
true);
218 for (
int i = 0; i < oldParameters.
size(); i++) {
219 if (fabs(oldParameters[i] - unitCellParameters_[i]) < 1e-10) {
220 newCellParams =
false;
226 trial_.setSystemState(newCellParams);
239 {
return system().iterate(isContinuation); };
250 bool isFlexible =
system().iterator().isFlexible();
251 state(0).setSystemState(isFlexible);
265 state(0).getSystemState();
271 outputSummary(logFile_);
276 void Sweep<D>::outputSolution()
279 std::string outFileName;
280 std::string indexString =
toString(nAccept() - 1);
283 outFileName = baseFileName_;
284 outFileName += indexString;
285 outFileName +=
".stt";
286 system().fileMaster().openOutputFile(outFileName, out);
289 system().writeParamNoSweep(out);
291 system().scft().write(out);
299 outFileName = baseFileName_;
300 outFileName += indexString;
302 if (system().w().isSymmetric()) {
303 outFileName +=
".bf";
304 system().w().writeBasis(outFileName);
306 outFileName +=
".rf";
307 system().w().writeRGrid(outFileName);
313 outFileName = baseFileName_;
314 outFileName += indexString;
316 outFileName +=
".rf";
317 system().c().writeRGrid(outFileName);
321 if (writeCBasis_ && system().c().isSymmetric()) {
323 outFileName = baseFileName_;
324 outFileName += indexString;
326 outFileName +=
".bf";
327 system().c().writeBasis(outFileName);
331 if (writeWRGrid_ && system().c().isSymmetric()) {
332 outFileName = baseFileName_;
333 outFileName += indexString;
335 outFileName +=
".rf";
336 system().w().writeRGrid(outFileName);
342 void Sweep<D>::outputSummary(std::ostream& out)
344 int i = nAccept() - 1;
346 if (!system().scft().hasData()) system().scft().compute();
347 out <<
Int(i,5) <<
Dbl(sNew)
348 <<
Dbl(system().scft().fHelmholtz(),16)
349 <<
Dbl(system().scft().pressure(),16);
355 { logFile_.close(); }
FieldState for fields in symmetry-adapted basis format.
virtual int solve(bool isContinuation)
Call current iterator to solve SCFT problem.
virtual void extrapolate(double sNew)
Create a guess for adjustable variables by continuation.
void setSystem(System< D > &system)
Set association with parent System.
Sweep()
Default Constructor.
virtual void getSolution()
Update state(0) and output data after successful convergence.
virtual void checkAllocation(BasisFieldState< D > &state)
Check allocation of fields in one state, allocate if necessary.
System< D > & system()
Return the parent system by reference.
ScalarParam< Type > & readOptional(std::istream &in, const char *label, Type &value)
Add and read a new optional ScalarParam < Type > object.
virtual void reset()
Reset system to previous solution after iterature failure.
bool writeCRGrid_
Should concentration fields be written to file in r-grid format?
virtual void cleanup()
Cleanup operation at the beginning of a sweep.
bool writeCBasis_
Should concentration fields be written to file in basis format?
virtual void readParameters(std::istream &in)
Read parameters from param file.
virtual void setParameters(double sNew)=0
Set system parameters to new values.
bool writeWRGrid_
Should converged w fields be written to file in r-grid format?
bool hasSystem()
Does an association with the parent System exist?
virtual void setup()
Setup operation at the beginning of a sweep.
Main class, representing a complete physical system.
void addParameterTypes(GArray< ParameterType > paramTypes)
BasisFieldState< D > & state(int i)
std::string baseFileName_
SweepTmpl(int historyCapacity)
void setCoefficients(double sNew)
int historyCapacity() const
Dynamically allocatable contiguous array template.
Wrapper for a double precision number, for formatted ostream output.
A fixed capacity (static) contiguous array with a variable logical size.
int size() const
Return logical size of this array (i.e., number of elements).
Wrapper for an int, for formatted ostream output.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
std::string toString(int n)
Return string representation of an integer.
Real periodic fields, SCFT and PS-FTS (CPU).
PSCF package top-level namespace.