11#include <rpc/scft/iterator/Iterator.h>
12#include <rpc/scft/ScftThermo.h>
13#include <rpc/system/System.h>
14#include <rpc/field/WFields.h>
15#include <rpc/field/CFields.h>
16#include <prdc/environment/Environment.h>
17#include <pscf/inter/Interaction.h>
18#include <pscf/sweep/SweepTmpl.tpp>
19#include <util/misc/FileMaster.h>
20#include <util/misc/ioUtil.h>
28 # define RPC_HISTORY_CAPACITY 3
54 if (
system().hasEnvironment()) {
111 fileName +=
"sweep.log";
112 system().fileMaster().openOutputFile(fileName, logFile_);
113 logFile_ <<
" step ds free_energy pressure"
126 UTIL_THROW(
"Calling unimplemented function Sweep::setParameters");
144 bool isFlexible =
system().iterator().isFlexible();
151 int nMonomer =
system().mixture().nMonomer();
152 int nBasis =
system().domain().basis().nBasis();
156 for (i=0; i < nMonomer; ++i) {
157 newFieldPtr = &(trial_.field(i));
160 oldFieldPtr = &
state(0).field(i);
162 for (j=0; j < nBasis; ++j) {
163 (*newFieldPtr)[j] = coeff*(*oldFieldPtr)[j];
168 oldFieldPtr = &
state(k).field(i);
170 for (j=0; j < nBasis; ++j) {
171 (*newFieldPtr)[j] += coeff*(*oldFieldPtr)[j];
180 unitCellParameters_ =
system().domain().unitCell().parameters();
189 system().iterator().flexibleParams();
191 =
system().domain().unitCell().nParameter();
197 for (
int i = 0; i < nParameter; ++i) {
200 unitCellParameters_[i] = 0;
202 parameter =
state(k).unitCell().parameter(i);
203 unitCellParameters_[i] += coeff*parameter;
210 trial_.unitCell().setParameters(unitCellParameters_);
213 bool newCellParams(
true);
214 for (
int i = 0; i < oldParameters.
size(); i++) {
215 if (fabs(oldParameters[i] - unitCellParameters_[i]) < 1e-10) {
216 newCellParams =
false;
222 trial_.setSystemState(newCellParams);
235 {
return system().iterate(isContinuation); };
246 bool isFlexible =
system().iterator().isFlexible();
247 state(0).setSystemState(isFlexible);
261 state(0).getSystemState();
267 outputSummary(logFile_);
272 void Sweep<D>::outputSolution()
275 std::string outFileName;
276 std::string indexString =
toString(nAccept() - 1);
279 outFileName = baseFileName_;
280 outFileName += indexString;
281 outFileName +=
".stt";
282 system().fileMaster().openOutputFile(outFileName, out);
285 system().writeParamNoSweep(out);
287 system().scft().write(out);
295 outFileName = baseFileName_;
296 outFileName += indexString;
298 if (system().w().isSymmetric()) {
299 outFileName +=
".bf";
300 system().w().writeBasis(outFileName);
302 outFileName +=
".rf";
303 system().w().writeRGrid(outFileName);
309 outFileName = baseFileName_;
310 outFileName += indexString;
312 outFileName +=
".rf";
313 system().c().writeRGrid(outFileName);
317 if (writeCBasis_ && system().c().isSymmetric()) {
319 outFileName = baseFileName_;
320 outFileName += indexString;
322 outFileName +=
".bf";
323 system().c().writeBasis(outFileName);
327 if (writeWRGrid_ && system().c().isSymmetric()) {
328 outFileName = baseFileName_;
329 outFileName += indexString;
331 outFileName +=
".rf";
332 system().w().writeRGrid(outFileName);
338 void Sweep<D>::outputSummary(std::ostream& out)
340 int i = nAccept() - 1;
342 if (!system().scft().hasData()) system().scft().compute();
343 out <<
Int(i,5) <<
Dbl(sNew)
344 <<
Dbl(system().scft().fHelmholtz(),16)
345 <<
Dbl(system().scft().pressure(),16);
351 { 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.