12#include <rpg/system/System.h>
13#include <rpg/scft/iterator/Iterator.h>
14#include <rpg/scft/ScftThermo.h>
15#include <prdc/environment/Environment.h>
16#include <rpg/solvers/Mixture.h>
17#include <rpg/field/Domain.h>
18#include <prdc/crystal/Basis.h>
19#include <prdc/crystal/UnitCell.h>
20#include <pscf/inter/Interaction.h>
21#include <pscf/sweep/SweepTmpl.tpp>
22#include <util/misc/FileMaster.h>
23#include <util/misc/ioUtil.h>
31 #define RPG_HISTORY_CAPACITY 3
57 if (
system().hasEnvironment()) {
114 fileName +=
"sweep.log";
115 system().fileMaster().openOutputFile(fileName, logFile_);
127 UTIL_THROW(
"Calling unimplemented function Sweep::setParameters");
145 bool isFlexible =
system().iterator().isFlexible();
152 int nMonomer =
system().mixture().nMonomer();
153 int nBasis =
system().domain().basis().nBasis();
157 for (i=0; i < nMonomer; ++i) {
158 newFieldPtr = &(trial_.field(i));
161 oldFieldPtr = &
state(0).field(i);
163 for (j=0; j < nBasis; ++j) {
164 (*newFieldPtr)[j] = coeff*(*oldFieldPtr)[j];
169 oldFieldPtr = &
state(k).field(i);
171 for (j=0; j < nBasis; ++j) {
172 (*newFieldPtr)[j] += coeff*(*oldFieldPtr)[j];
181 unitCellParameters_ =
system().domain().unitCell().parameters();
191 const int nParameter = indices.
size();
196 for (
int i = 0; i < nParameter; ++i) {
198 unitCellParameters_[indices[i]] = 0;
200 parameter =
state(k).unitCell().parameter(indices[i]);
201 unitCellParameters_[indices[i]] += coeff*parameter;
207 const int nParameter = unitCellParameters_.size();
210 for (
int i = 0; i < nParameter; ++i) {
212 unitCellParameters_[i] = 0.0;
214 parameter =
state(k).unitCell().parameter(i);
215 unitCellParameters_[i] += coeff*parameter;
222 trial_.unitCell().setParameters(unitCellParameters_);
225 bool newCellParams(
true);
226 for (
int i = 0; i < oldParameters.
size(); i++) {
227 if (fabs(oldParameters[i] - unitCellParameters_[i]) < 1e-10) {
228 newCellParams =
false;
234 trial_.setSystemState(newCellParams);
246 {
return system().iterate(isContinuation); };
257 bool isFlexible =
system().iterator().isFlexible();
258 state(0).setSystemState(isFlexible);
272 state(0).getSystemState();
278 outputSummary(logFile_);
283 void Sweep<D>::outputSolution()
286 std::string outFileName;
287 std::string indexString =
toString(nAccept() - 1);
290 outFileName = baseFileName_;
291 outFileName += indexString;
292 outFileName +=
".stt";
293 system().fileMaster().openOutputFile(outFileName, out);
296 system().writeParamNoSweep(out);
298 system().scft().write(out);
302 outFileName = baseFileName_;
303 outFileName += indexString;
305 if (system().w().isSymmetric()) {
306 outFileName +=
".bf";
307 system().w().writeBasis(outFileName);
309 outFileName +=
".rf";
310 system().w().writeRGrid(outFileName);
315 outFileName = baseFileName_;
316 outFileName += indexString;
318 outFileName +=
".rf";
319 system().c().writeRGrid(outFileName);
323 if (writeCBasis_ && system().c().isSymmetric()) {
324 outFileName = baseFileName_;
325 outFileName += indexString;
327 outFileName +=
".bf";
328 system().c().writeBasis(outFileName);
332 if (writeWRGrid_ && system().w().isSymmetric()) {
333 outFileName = baseFileName_;
334 outFileName += indexString;
336 outFileName +=
".rf";
337 system().w().writeRGrid(outFileName);
343 void Sweep<D>::outputSummary(std::ostream& out)
345 int i = nAccept() - 1;
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 void getSolution()
Update state(0) and output data after successful convergence.
bool writeCBasis_
Whether to write concentration field files in basis format.
virtual int solve(bool isContinuation)
Call current iterator to solve SCFT problem.
virtual void readParameters(std::istream &in)
Read parameters from param file.
virtual void checkAllocation(BasisFieldState< D > &state)
Check allocation state of fields in one state, allocate if necessary.
virtual void extrapolate(double sNew)
Create a guess for adjustable variables by continuation.
ScalarParam< Type > & readOptional(std::istream &in, const char *label, Type &value)
Add and read a new optional ScalarParam < Type > object.
virtual void setup()
Setup operation at the beginning of a sweep.
bool writeWRGrid_
Whether to write real space potential field files.
bool writeCRGrid_
Whether to write real space concentration field files.
bool hasSystem()
Has an association with the parent System been set?
virtual void reset()
Reset system to previous solution after iterature failure.
virtual void setParameters(double sNew)=0
Set non-adjustable system parameters to new values.
Sweep()
Default Constructor.
System< D > & system()
Return the parent system by reference.
void setSystem(System< D > &system)
Set association with parent System.
virtual void cleanup()
Cleanup 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.
SCFT and PS-FTS with real periodic fields (GPU)
PSCF package top-level namespace.