12#include <util/param/ParamComposite.h>
14#include <pspc/solvers/Mixture.h>
15#include <pspc/field/Domain.h>
16#include <pspc/field/FieldIo.h>
17#include <pspc/field/WFieldContainer.h>
18#include <pspc/field/CFieldContainer.h>
19#include <pspc/field/Mask.h>
20#include <pspc/field/RField.h>
21#include <pspc/field/RFieldDft.h>
23#include <pscf/homogeneous/Mixture.h>
25#include <util/misc/FileMaster.h>
26#include <util/containers/DArray.h>
27#include <util/containers/FSArray.h>
36 template <
int D>
class Iterator;
37 template <
int D>
class IteratorFactory;
38 template <
int D>
class Sweep;
39 template <
int D>
class SweepFactory;
115 virtual void readParam(std::istream& in);
165 void readWBasis(
const std::string & filename);
181 void readWRGrid(
const std::string & filename);
285 void compute(
bool needStress =
false);
307 int iterate(
bool isContinuation =
false);
398 void writeWBasis(
const std::string & filename)
const;
405 void writeWRGrid(
const std::string & filename)
const;
412 void writeCBasis(
const std::string & filename)
const;
419 void writeCRGrid(
const std::string & filename)
const;
448 int polymerId,
int blockId,
449 int directionId,
int segmentId)
const;
459 void writeQTail(std::string
const & filename,
int polymerId,
460 int blockId,
int directionId)
const;
470 void writeQ(std::string
const & filename,
int polymerId,
471 int blockId,
int directionId)
const;
491 void writeQAll(std::string
const & basename);
505 void writeStars(std::string
const & filename)
const;
515 void writeWaves(std::string
const & filename)
const;
522 void writeGroup(std::string
const & filename)
const;
543 const std::string & outFileName);
560 const std::string & outFileName);
569 const std::string& outFileName);
578 const std::string & outFileName);
595 const std::string& outFileName);
604 const std::string & outFileName);
636 double epsilon = 1.0E-8);
914 bool isAllocatedRGrid_;
919 bool isAllocatedBasis_;
944 void allocateFieldsGrid();
949 void allocateFieldsBasis();
959 void readFieldHeader(std::string filename);
969 void readEcho(std::istream& in, std::string&
string)
const;
979 void readEcho(std::istream& in,
double& value)
const;
984 void initHomogeneous();
1008 {
return domain_.unitCell(); }
1013 {
return domain_.mesh(); }
1018 {
return domain_.basis(); }
1023 {
return domain_.fft(); }
1028 {
return domain_.fieldIo(); }
1033 {
return domain_.groupName(); }
1038 {
return fileMaster_; }
1043 {
return fileMaster_; }
1048 {
return homogeneous_; }
1053 {
return homogeneous_; }
1060 return *interactionPtr_;
1068 return *interactionPtr_;
1076 return *iteratorPtr_;
1084 return *iteratorPtr_;
1112 {
return (sweepPtr_ != 0); }
1117 {
return h_.hasData(); }
1122 {
return mask_.hasData(); }
1127 {
return hasCFields_; }
1148 {
return hasFreeEnergy_; }
1150 #ifndef PSPC_SYSTEM_TPP
Symmetry-adapted Fourier basis for pseudo-spectral scft.
A spatially homogeneous mixture.
Flory-Huggins excess free energy model.
Description of a regular grid of points in a periodic domain.
A list of c fields stored in both basis and r-grid format.
Spatial domain and spatial discretization for a periodic structure.
Fourier transform wrapper for real data.
File input/output operations and format conversions for fields.
Factory for subclasses of Iterator.
Base class for iterative solvers for SCF equations.
A field to which the total density is constrained.
Solver for a mixture of polymers and solvents.
Field of real double precision values on an FFT mesh.
Default Factory for subclasses of Sweep.
Solve a sequence of problems along a line in parameter space.
Main class for SCFT simulation of one system.
void setWBasis(DArray< DArray< double > > const &fields)
Set chemical potential fields, in symmetry-adapted basis format.
int iterate(bool isContinuation=false)
Iteratively solve a SCFT problem.
void setOptions(int argc, char **argv)
Process command line options.
double fHelmholtz() const
Get precomputed Helmoltz free energy per monomer / kT.
double pressure() const
Get precomputed pressure x monomer volume kT.
bool hasMask() const
Does this system have a mask (inhomogeneous density constraint)
void writeCRGrid(const std::string &filename) const
Write concentration fields in real space grid (r-grid) format.
void writeGroup(std::string const &filename) const
Output all elements of the space group.
Domain< D > const & domain() const
Get Domain by const reference.
void readParam()
Read input parameters from default param file.
bool hasFreeEnergy() const
Has the free energy been computed from the current w fields?
bool hasExternalFields() const
Does this system have external potential fields?
void kGridToBasis(const std::string &inFileName, const std::string &outFileName)
Convert fields from Fourier (k-grid) to symmetrized basis format.
Iterator< D > & iterator()
Get the iterator.
Mixture< D > & mixture()
Get the Mixture by non-const reference.
void writeWRGrid(const std::string &filename) const
Write chemical potential fields in real space grid (r-grid) format.
void setUnitCell(UnitCell< D > const &unitCell)
Set parameters of the associated unit cell.
WFieldContainer< D > & h()
Get all of the external potential fields (reference).
CFieldContainer< D > const & c() const
Get all of the monomer concentration fields (const reference).
void compare(const DArray< DArray< double > > field1, const DArray< DArray< double > > field2)
Compare two field files in symmetrized basis format.
Basis< D > const & basis() const
Get the Basis by const reference.
void writeBlockCRGrid(const std::string &filename) const
Write c-fields for all blocks and solvents in r-grid format.
void compute(bool needStress=false)
Solve the modified diffusion equation once, without iteration.
Mask< D > & mask()
Get the mask (field to which total density is constrained).
void writeParamNoSweep(std::ostream &out) const
Write parameter file to an ostream, omitting any sweep block.
void basisToRGrid(const std::string &inFileName, const std::string &outFileName)
Convert a field from symmetrized basis format to r-grid format.
virtual void readParameters(std::istream &in)
Read body of parameter block (without opening and closing lines).
void sweep()
Sweep in parameter space, solving an SCF problem at each point.
std::string groupName() const
Get the group name string.
void readWRGrid(const std::string &filename)
Read chemical potential fields in real space grid (r-grid) format.
void writeThermo(std::ostream &out)
Write thermodynamic properties to a file.
void writeCBasis(const std::string &filename) const
Write concentration fields in symmetrized basis format.
Mesh< D > const & mesh() const
Get the spatial discretization mesh by const reference.
WFieldContainer< D > const & w() const
Get all of the chemical potential fields (const reference).
void writeQTail(std::string const &filename, int polymerId, int blockId, int directionId) const
Write the final slice of a propagator in r-grid format.
bool hasSweep() const
Does this system have a Sweep object?
Interaction & interaction()
Get Interaction (excess free energy model) by reference.
void writeQAll(std::string const &basename)
Write all propagators of all blocks, each to a separate file.
UnitCell< D > const & unitCell() const
Get UnitCell (i.e., type and parameters) by const reference.
void estimateWfromC(const std::string &filename)
Construct trial w-fields from c-fields.
Homogeneous::Mixture & homogeneous()
Get homogeneous mixture (for reference calculations).
void writeStars(std::string const &filename) const
Output information about stars and symmetrized basis functions.
void kGridToRGrid(const std::string &inFileName, const std::string &outFileName)
Convert fields from Fourier (k-grid) to real-space (r-grid) format.
void writeWBasis(const std::string &filename) const
Write chemical potential fields in symmetrized basis format.
void readCommands()
Read commands from default command file.
void rGridToBasis(const std::string &inFileName, const std::string &outFileName)
Convert a field from real-space grid to symmetrized basis format.
FieldIo< D > const & fieldIo() const
Get associated FieldIo object by const reference.
void readWBasis(const std::string &filename)
Read chemical potential fields in symmetry adapted basis format.
void writeQSlice(std::string const &filename, int polymerId, int blockId, int directionId, int segmentId) const
Write slice of a propagator at fixed s in r-grid format.
bool checkRGridFieldSymmetry(const std::string &inFileName, double epsilon=1.0E-8)
Check if r-grid fields have the declared space group symmetry.
void rGridToKGrid(const std::string &inFileName, const std::string &outFileName)
Convert fields from real-space (r-grid) to Fourier (k-grid) format.
void writeWaves(std::string const &filename) const
Output information about waves.
bool hasCFields() const
Have c fields been computed from the current w fields?
void computeFreeEnergy()
Compute free energy density and pressure for current fields.
void writeQ(std::string const &filename, int polymerId, int blockId, int directionId) const
Write one propagator for one block, in r-grid format.
FileMaster & fileMaster()
Get the FileMaster.
void basisToKGrid(const std::string &inFileName, const std::string &outFileName)
Convert fields from symmetrized basis to Fourier (k-grid) format.
FFT< D > const & fft() const
Get associated FFT object by const reference.
void setWRGrid(DArray< RField< D > > const &fields)
Set new w fields, in real-space (r-grid) format.
A list of fields stored in both basis and r-grid format.
Base template for UnitCell<D> classes, D=1, 2 or 3.
Dynamically allocatable contiguous array template.
A fixed capacity (static) contiguous array with a variable logical size.
A FileMaster manages input and output files for a simulation.
An object that can read multiple parameters from file.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
#define UTIL_ASSERT(condition)
Assertion macro suitable for debugging serial or parallel code.
C++ namespace for polymer self-consistent field theory (PSCF).
Utility classes for scientific computation.