PSCF v1.1
pspg/System.h
1#ifndef PSPG_SYSTEM_H
2#define PSPG_SYSTEM_H
3
4/*
5* PSCF - Polymer Self-Consistent Field Theory
6*
7* Copyright 2016 - 2022, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11#include <util/param/ParamComposite.h> // base class
12
13#include <pspg/solvers/Mixture.h> // member
14#include <pspg/field/Domain.h> // member
15#include <pspg/field/FieldIo.h> // member
16#include <pspg/field/WFieldContainer.h> // member
17#include <pspg/field/CFieldContainer.h> // member
18#include <pspg/field/RDField.h> // member
19#include <pspg/field/RDFieldDft.h> // member
20
21#include <pscf/homogeneous/Mixture.h> // member
22
23#include <util/misc/FileMaster.h> // member
24#include <util/containers/DArray.h> // member template
25#include <util/containers/FSArray.h> // member template
26
27namespace Pscf {
28
29 class Interaction;
30
31namespace Pspg
32{
33
34 template <int D> class Iterator;
35 template <int D> class IteratorFactory;
36 template <int D> class Sweep;
37 template <int D> class SweepFactory;
38
39 using namespace Util;
40
69 template <int D>
70 class System : public ParamComposite
71 {
72
73 public:
74
77
81 System();
82
86 ~System();
87
91
103 void setOptions(int argc, char **argv);
104
110 virtual void readParam(std::istream& in);
111
118 void readParam();
119
125 virtual void readParameters(std::istream& in);
126
132 void readCommands(std::istream& in);
133
140 void readCommands();
141
145
160 void readWBasis(const std::string & filename);
161
176 void readWRGrid(const std::string & filename);
177
188 void setWBasis(DArray< DArray<double> > const & fields);
189
200 void setWRGrid(DArray< RDField<D> > const & fields);
201
214 void setWRGrid(DField<cudaReal> & fields);
215
222 void symmetrizeWFields();
223
237 void estimateWfromC(const std::string& filename);
238
242
251 void setUnitCell(UnitCell<D> const & unitCell);
252
263 void setUnitCell(typename UnitCell<D>::LatticeSystem lattice,
264 FSArray<double, 6> const & parameters);
265
274 void setUnitCell(FSArray<double, 6> const & parameters);
275
279
304 void compute(bool needStress = false);
305
327 int iterate(bool isContinuation = false);
328
341 void sweep();
342
346
357 void computeFreeEnergy();
358
365 double fHelmholtz() const;
366
373 double pressure() const;
374
378
387 void writeParamNoSweep(std::ostream& out) const;
388
405 void writeThermo(std::ostream& out);
406
410
416 void writeWBasis(const std::string & filename);
417
423 void writeWRGrid(const std::string & filename) const;
424
430 void writeCBasis(const std::string & filename);
431
437 void writeCRGrid(const std::string & filename) const;
438
449 void writeBlockCRGrid(const std::string & filename) const;
450
454
464 void writeQSlice(std::string const & filename,
465 int polymerId, int blockId,
466 int directionId, int segmentId) const;
467
476 void writeQTail(std::string const & filename, int polymerId,
477 int blockId, int directionId) const;
478
487 void writeQ(std::string const & filename, int polymerId,
488 int blockId, int directionId) const;
489
508 void writeQAll(std::string const & basename);
509
513
522 void writeStars(const std::string & filename) const;
523
532 void writeWaves(const std::string & filename) const;
533
539 void writeGroup(std::string const & filename) const;
540
544
555 void basisToRGrid(const std::string & inFileName,
556 const std::string & outFileName);
557
571 void rGridToBasis(const std::string & inFileName,
572 const std::string & outFileName);
573
580 void kGridToRGrid(const std::string& inFileName,
581 const std::string& outFileName);
582
589 void rGridToKGrid(const std::string & inFileName,
590 const std::string & outFileName);
591
605 void kGridToBasis(const std::string& inFileName,
606 const std::string& outFileName);
607
614 void basisToKGrid(const std::string & inFileName,
615 const std::string & outFileName);
616
620
624 WFieldContainer<D> const & w() const;
625
629 CFieldContainer<D> const & c() const;
630
635
640
644 Interaction const & interaction() const;
645
649 Domain<D> const & domain() const;
650
655
659 UnitCell<D> const & unitCell() const;
660
664 Mesh<D> const & mesh() const;
665
669 Basis<D> const & basis() const;
670
674 FieldIo<D> const & fieldIo() const;
675
679 FFT<D> const & fft() const ;
680
685
690
694
702 bool hasCFields() const;
703
707 bool hasSweep() const;
708
710
711 private:
712
716 Mixture<D> mixture_;
717
721 Domain<D> domain_;
722
726 FileMaster fileMaster_;
727
731 Homogeneous::Mixture homogeneous_;
732
736 Interaction* interactionPtr_;
737
741 Iterator<D>* iteratorPtr_;
742
746 IteratorFactory<D>* iteratorFactoryPtr_;
747
751 Sweep<D>* sweepPtr_;
752
756 SweepFactory<D>* sweepFactoryPtr_;
757
762
767
773 mutable DArray< DArray<double> > tmpFieldsBasis_;
774
780 mutable DArray< RDField<D> > tmpFieldsRGrid_;
781
787 mutable DArray<RDFieldDft<D> > tmpFieldsKGrid_;
788
792 mutable DArray<double> f_;
793
797 double fHelmholtz_;
798
806 double fIdeal_;
807
811 double fInter_;
812
813
817 double pressure_;
818
822 bool hasMixture_;
823
827 bool isAllocatedGrid_;
828
832 bool isAllocatedBasis_;
833
837 bool hasCFields_;
838
842 IntVec<D> kMeshDimensions_;
843
847 RDField<D> workArray_;
848
849 // Private member functions
850
856 void allocateFieldsGrid();
857
863 void allocateFieldsBasis();
864
870 void readFieldHeader(std::string filename);
871
880 void readEcho(std::istream& in, std::string& string) const;
881
890 void readEcho(std::istream& in, double& value) const;
891
895 void initHomogeneous();
896
897 };
898
899 // Inline member functions
900
901 // Get the associated Mixture<D> object.
902 template <int D>
904 { return mixture_; }
905
906 // Get the Interaction (excess free energy model).
907 template <int D>
909 {
910 UTIL_ASSERT(interactionPtr_);
911 return *interactionPtr_;
912 }
913
914 // Get the Interaction (excess free energy model).
915 template <int D>
916 inline Interaction const & System<D>::interaction() const
917 {
918 UTIL_ASSERT(interactionPtr_);
919 return *interactionPtr_;
920 }
921
922 template <int D>
923 inline Domain<D> const & System<D>::domain() const
924 { return domain_; }
925
926 template <int D>
927 inline UnitCell<D> const & System<D>::unitCell() const
928 { return domain_.unitCell(); }
929
930 // get the const Mesh<D> object.
931 template <int D>
932 inline Mesh<D> const & System<D>::mesh() const
933 { return domain_.mesh(); }
934
935 // Get the Basis<D> object.
936 template <int D>
937 inline Basis<D> const & System<D>::basis() const
938 { return domain_.basis(); }
939
940 // Get the FFT<D> object.
941 template <int D>
942 inline FFT<D> const & System<D>::fft() const
943 { return domain_.fft(); }
944
945 // Get the const FieldIo<D> object.
946 template <int D>
947 inline FieldIo<D> const & System<D>::fieldIo() const
948 { return domain_.fieldIo(); }
949
950 // Get the Iterator.
951 template <int D>
953 {
954 UTIL_ASSERT(iteratorPtr_);
955 return *iteratorPtr_;
956 }
957
958 // Get the FileMaster.
959 template <int D>
961 { return fileMaster_; }
962
963 // Get the Homogeneous::Mixture object.
964 template <int D>
965 inline
967 { return homogeneous_; }
968
969 // Get container of w fields (const reference)
970 template <int D>
971 inline
973 { return w_; }
974
975 // Get container of c fields (const reference)
976 template <int D>
977 inline
979 { return c_; }
980
981 // Get precomputed Helmoltz free energy per monomer / kT.
982 template <int D>
983 inline double System<D>::fHelmholtz() const
984 { return fHelmholtz_; }
985
986 // Get precomputed pressure (units of kT / monomer volume).
987 template <int D>
988 inline double System<D>::pressure() const
989 { return pressure_; }
990
991 // Have the c fields been computed for the current w fields?
992 template <int D>
993 inline bool System<D>::hasCFields() const
994 { return hasCFields_; }
995
996 // Does this system have an associated Sweep object?
997 template <int D>
998 inline bool System<D>::hasSweep() const
999 { return (sweepPtr_ != 0); }
1000
1001 #ifndef PSPG_SYSTEM_TPP
1002 // Suppress implicit instantiation
1003 extern template class System<1>;
1004 extern template class System<2>;
1005 extern template class System<3>;
1006 #endif
1007
1008} // namespace Pspg
1009} // namespace Pscf
1010//#include "System.tpp"
1011#endif
Symmetry-adapted Fourier basis for pseudo-spectral scft.
Definition: Basis.h:346
A spatially homogeneous mixture.
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition: IntVec.h:27
Flory-Huggins excess free energy model.
Definition: Interaction.h:26
Description of a regular grid of points in a periodic domain.
Definition: Mesh.h:61
A list of c fields stored in both basis and r-grid format.
Dynamic array on the GPU with alligned data.
Definition: DField.h:30
Spatial domain and spatial discretization for a periodic structure.
Fourier transform wrapper for real data.
File input/output operations for fields in several file formats.
Factory for subclasses of Iterator.
Base class for iterative solvers for SCF equations.
Solver for a mixture of polymers and solvents.
Field of real single precision values on an FFT mesh on a device.
Definition: RDField.h:34
Default Factory for subclasses of Sweep.
Solve a sequence of problems along a line in parameter space.
Main class in SCFT simulation of one system.
Definition: pspg/System.h:71
void writeThermo(std::ostream &out)
Write thermodynamic properties to a file.
void readWRGrid(const std::string &filename)
Read chemical potential fields in real space grid (r-grid) format.
double pressure() const
Get precomputed pressure times monomer volume / kT.
Definition: pspg/System.h:988
void setWRGrid(DArray< RDField< D > > const &fields)
Set new w fields, in real-space (r-grid) format.
UnitCell< D > const & unitCell() const
Get crystal UnitCell by const reference.
Definition: pspg/System.h:927
void writeQSlice(std::string const &filename, int polymerId, int blockId, int directionId, int segmentId) const
Write specified slice of a propagator at fixed s in r-grid format.
void compute(bool needStress=false)
Solve the modified diffusion equation once, without iteration.
CFieldContainer< D > const & c() const
Get container of monomer concentration / volume fration fields.
Definition: pspg/System.h:978
FieldIo< D > const & fieldIo() const
Get the FieldIo by const reference.
Definition: pspg/System.h:947
void writeGroup(std::string const &filename) const
Output all elements of the space group.
void symmetrizeWFields()
Symmetrize r-grid w-fields, compute basis components.
double fHelmholtz() const
Get precomputed Helmoltz free energy per monomer / kT.
Definition: pspg/System.h:983
FileMaster & fileMaster()
Get FileMaster by reference.
Definition: pspg/System.h:960
void writeCRGrid(const std::string &filename) const
Write concentration fields in real space grid (r-grid) format.
Homogeneous::Mixture & homogeneous()
Get homogeneous mixture (for reference calculations).
Definition: pspg/System.h:966
Mesh< D > const & mesh() const
Get spatial discretization Mesh by const reference.
Definition: pspg/System.h:932
void estimateWfromC(const std::string &filename)
Construct trial w-fields from c-fields.
void writeStars(const std::string &filename) const
Output information about stars and symmetrized basis functions.
Mixture< D > & mixture()
Get Mixture by reference.
Definition: pspg/System.h:903
void rGridToBasis(const std::string &inFileName, const std::string &outFileName)
Convert a field from real-space grid to symmetrized basis format.
FFT< D > const & fft() const
Get the FFT object by reference.
Definition: pspg/System.h:942
void rGridToKGrid(const std::string &inFileName, const std::string &outFileName)
Convert fields from real-space (r-grid) to Fourier (k-grid) format.
Domain< D > const & domain() const
Get Domain by const reference.
Definition: pspg/System.h:923
void basisToRGrid(const std::string &inFileName, const std::string &outFileName)
Convert a field from symmetry-adapted basis to r-grid format.
void writeParamNoSweep(std::ostream &out) const
Write parameter file to an ostream, omitting the sweep block.
int iterate(bool isContinuation=false)
Iteratively solve a SCFT problem.
void writeWBasis(const std::string &filename)
Write chemical potential fields in symmetry adapted basis format.
void setUnitCell(UnitCell< D > const &unitCell)
Set parameters of the associated unit cell.
void writeBlockCRGrid(const std::string &filename) const
Write c fields for all blocks and solvents in r-grid format.
WFieldContainer< D > const & w() const
Get container of chemical potential fields.
Definition: pspg/System.h:972
Basis< D > const & basis() const
Get the Basis by reference.
Definition: pspg/System.h:937
void readParam()
Read input parameters from default param file.
~System()
Destructor.
Definition: pspg/System.tpp:80
void writeQTail(std::string const &filename, int polymerId, int blockId, int directionId) const
Write the final slice of a propagator in r-grid format.
void writeQ(std::string const &filename, int polymerId, int blockId, int directionId) const
Write one propagator for one block, in r-grid format.
void writeWRGrid(const std::string &filename) const
Write chemical potential fields in real space grid (r-grid) format.
void kGridToRGrid(const std::string &inFileName, const std::string &outFileName)
Convert fields from Fourier (k-grid) to real-space (r-grid) format.
void writeQAll(std::string const &basename)
Write all propagators of all blocks, each to a separate file.
Iterator< D > & iterator()
Get the iterator by reference.
Definition: pspg/System.h:952
void readCommands()
Read commands from default command file.
void basisToKGrid(const std::string &inFileName, const std::string &outFileName)
Convert fields from symmetrized basis to Fourier (k-grid) format.
void sweep()
Sweep in parameter space, solving an SCF problem at each point.
void writeCBasis(const std::string &filename)
Write concentrations in symmetry-adapted basis format.
System()
Constructor.
Definition: pspg/System.tpp:43
void setWBasis(DArray< DArray< double > > const &fields)
Set chemical potential fields, in symmetry-adapted basis format.
void writeWaves(const std::string &filename) const
Output information about waves.
Interaction & interaction()
Get interaction (i.e., excess free energy model) by reference.
Definition: pspg/System.h:908
void kGridToBasis(const std::string &inFileName, const std::string &outFileName)
Convert fields from Fourier (k-grid) to symmetrized basis format.
bool hasCFields() const
Have monomer concentration fields (c fields) been computed?
Definition: pspg/System.h:993
void readWBasis(const std::string &filename)
Read chemical potential fields in symmetry adapted basis format.
virtual void readParameters(std::istream &in)
Read body of parameter file (without opening, closing lines).
void setOptions(int argc, char **argv)
Process command line options.
void computeFreeEnergy()
Compute free energy density and pressure for current fields.
bool hasSweep() const
Does this system have an associated Sweep object?
Definition: pspg/System.h:998
A list of fields stored in both basis and r-grid format.
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition: UnitCell.h:44
Dynamically allocatable contiguous array template.
Definition: DArray.h:32
A fixed capacity (static) contiguous array with a variable logical size.
Definition: FSArray.h:38
A FileMaster manages input and output files for a simulation.
Definition: FileMaster.h:143
An object that can read multiple parameters from file.
#define UTIL_ASSERT(condition)
Assertion macro suitable for debugging serial or parallel code.
Definition: global.h:75
C++ namespace for polymer self-consistent field theory (PSCF).
Utility classes for scientific computation.
Definition: accumulators.mod:1