CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
GrandCanonicalIO.cc
Go to the documentation of this file.
2 
7 
8 namespace CASM {
9 
35 
37 
42 
43  formatter.push_back(MonteCarloTFormatter<GrandCanonical>());
44 
45  std::set<std::string> exclude;
46  std::string name;
47 
48  // always sample Beta, potential_energy, and formation_energy
49  {
50  formatter.push_back(MonteCarloBetaFormatter<GrandCanonical>());
51  name = "potential_energy";
52  formatter.push_back(MonteCarloMeanFormatter(name));
53  formatter.push_back(MonteCarloPrecFormatter(name));
54  exclude.insert(name);
55 
56  name = "formation_energy";
57  formatter.push_back(MonteCarloMeanFormatter(name));
58  formatter.push_back(MonteCarloPrecFormatter(name));
59  exclude.insert(name);
60  }
61 
62 
63 
64  // always sample param_chem_pot, comp
65  for(int i = 0; i < mc.primclex().composition_axes().independent_compositions(); ++i) {
66  formatter.push_back(MonteCarloParamChemPotFormatter<GrandCanonical>(mc, i));
67  }
68 
69  for(int i = 0; i < mc.primclex().composition_axes().independent_compositions(); i++) {
70 
71  name = std::string("comp(") + mc.primclex().composition_axes().comp_var(i) + ")";
72  formatter.push_back(MonteCarloMeanFormatter(name));
73  formatter.push_back(MonteCarloPrecFormatter(name));
74  exclude.insert(name);
75  }
76 
77  // always sample comp_n
78  auto struc_mol_name = mc.primclex().get_prim().get_struc_molecule_name();
79  for(int i = 0; i < struc_mol_name.size(); ++i) {
80  name = std::string("comp_n(") + struc_mol_name[i] + ")";
81  formatter.push_back(MonteCarloMeanFormatter(name));
82  formatter.push_back(MonteCarloPrecFormatter(name));
83  exclude.insert(name);
84  }
85 
86  // include mean/prec of other properties
87  for(auto it = mc.samplers().cbegin(); it != mc.samplers().cend(); ++it) {
88  if(exclude.find(it->first) == exclude.end()) {
89  formatter.push_back(MonteCarloMeanFormatter(it->first));
90  formatter.push_back(MonteCarloPrecFormatter(it->first));
91  }
92  }
93 
94  // include heat_capacity
95  formatter.push_back(MonteCarloHeatCapacityFormatter<GrandCanonical>());
96 
97  // include susc_x
98  for(int i = 0; i < mc.primclex().composition_axes().independent_compositions(); i++) {
99  for(int j = i; j < mc.primclex().composition_axes().independent_compositions(); j++) {
100 
101  auto comp_var_i = mc.primclex().composition_axes().comp_var(i);
102  auto comp_var_j = mc.primclex().composition_axes().comp_var(j);
103  formatter.push_back(MonteCarloSuscXFormatter<GrandCanonical>(comp_var_i, comp_var_j));
104 
105  }
106  }
107 
108  // include thermo-chem susc
109  for(int i = 0; i < mc.primclex().composition_axes().independent_compositions(); i++) {
110 
111  auto comp_var_i = mc.primclex().composition_axes().comp_var(i);
112  formatter.push_back(MonteCarloThermoChemSuscXFormatter<GrandCanonical>(comp_var_i));
113 
114  }
115 
116  // include susc_n
117  for(int i = 0; i < struc_mol_name.size(); ++i) {
118  for(int j = i; j < struc_mol_name.size(); ++j) {
119 
120  auto species_i = struc_mol_name[i];
121  auto species_j = struc_mol_name[j];
122  formatter.push_back(MonteCarloSuscNFormatter<GrandCanonical>(species_i, species_j));
123 
124  }
125  }
126 
127  // include thermo-chem susc
128  for(int i = 0; i < struc_mol_name.size(); ++i) {
129 
130  auto species_i = struc_mol_name[i];
131  formatter.push_back(MonteCarloThermoChemSuscNFormatter<GrandCanonical>(species_i));
132 
133  }
134 
135  return formatter;
136  }
137 
156  DataFormatter<ConstMonteCarloPtr> make_lte_results_formatter(const GrandCanonical &mc, const double &phi_LTE1, const std::string &configname) {
157 
159 
160  bool print_json = true;
161  formatter.push_back(ConstantValueFormatter<std::string, ConstMonteCarloPtr>("configname", configname, print_json));
162  formatter.push_back(MonteCarloTFormatter<GrandCanonical>());
163  formatter.push_back(GrandCanonicalLTEFormatter(phi_LTE1));
164  std::set<std::string> exclude;
165  std::string name;
166 
167  // always sample Beta, potential_energy, and formation_energy
168  {
169  formatter.push_back(MonteCarloBetaFormatter<GrandCanonical>());
170  name = "gs_potential_energy";
171  auto evaluator = [ = ](const ConstMonteCarloPtr & ptr) {
172  return static_cast<const GrandCanonical *>(ptr)->potential_energy();
173  };
174  formatter.push_back(GenericDatumFormatter<double, ConstMonteCarloPtr>(name, name, evaluator));
175  exclude.insert(name);
176  }
177 
178  {
179  name = "gs_formation_energy";
180  auto evaluator = [ = ](const ConstMonteCarloPtr & ptr) {
181  return static_cast<const GrandCanonical *>(ptr)->formation_energy();
182  };
183  formatter.push_back(GenericDatumFormatter<double, ConstMonteCarloPtr>(name, name, evaluator));
184  exclude.insert(name);
185  }
186 
187 
188 
189  // always sample param_chem_pot, comp
190  for(int i = 0; i < mc.primclex().composition_axes().independent_compositions(); ++i) {
191  formatter.push_back(MonteCarloParamChemPotFormatter<GrandCanonical>(mc, i));
192  }
193 
194  for(int i = 0; i < mc.primclex().composition_axes().independent_compositions(); i++) {
195 
196  name = std::string("gs_comp(") + mc.primclex().composition_axes().comp_var(i) + ")";
197  auto evaluator = [ = ](const ConstMonteCarloPtr & ptr) {
198  const GrandCanonical *_ptr = static_cast<const GrandCanonical *>(ptr);
199  return _ptr->primclex().composition_axes().param_composition(_ptr->comp_n())[i];
200  };
201  formatter.push_back(GenericDatumFormatter<double, ConstMonteCarloPtr>(name, name, evaluator));
202  exclude.insert(name);
203  }
204 
205  // always sample comp_n
206  auto struc_mol_name = mc.primclex().get_prim().get_struc_molecule_name();
207  for(int i = 0; i < struc_mol_name.size(); ++i) {
208  name = std::string("gs_comp_n(") + struc_mol_name[i] + ")";
209  auto evaluator = [ = ](const ConstMonteCarloPtr & ptr) {
210  return static_cast<const GrandCanonical *>(ptr)->comp_n()[i];
211  };
212  formatter.push_back(GenericDatumFormatter<double, ConstMonteCarloPtr>(name, name, evaluator));
213  exclude.insert(name);
214  }
215 
216  return formatter;
217  }
218 
219 
231  json.put_obj();
232  json["temperature"] = conditions.temperature();
233  json["param_chem_pot"] = jsonParser::object();
234  auto param_chem_pot = conditions.param_chem_pot();
235  for(int i = 0; i < param_chem_pot.size(); i++) {
236  json["param_chem_pot"][CompositionConverter::comp_var(i)] = param_chem_pot(i);
237  }
238  json["tolerance"] = conditions.tolerance();
239 
240  return json;
241  }
242 
253  void from_json(GrandCanonicalConditions &conditions, const PrimClex &primclex, const jsonParser &json) {
254 
255  double temp = json["temperature"].get<double>();
256  double tol = json["tolerance"].get<double>();
257 
258  int Nparam = primclex.composition_axes().independent_compositions();
259  Eigen::VectorXd param_chem_pot(Nparam);
260 
261  for(int i = 0; i < Nparam; i++) {
262  param_chem_pot(i) = json["param_chem_pot"][CompositionConverter::comp_var(i)].get<double>();
263  }
264 
265  conditions = GrandCanonicalConditions(primclex, temp, param_chem_pot, tol);
266  }
267 
268 
271  auto evaluator = [ = ](const ConstMonteCarloPtr & mc) {
272  return phi_LTE1;
273  };
274  return GenericDatumFormatter<double, ConstMonteCarloPtr>("phi_LTE", "phi_LTE", evaluator);
275  }
276 
278  void write_lte_results(const MonteSettings &settings, const GrandCanonical &mc, const double &phi_LTE1, const std::string &configname, Log &_log) {
279  try {
280 
281  fs::create_directories(settings.output_directory());
283  auto formatter = make_lte_results_formatter(mc, phi_LTE1, configname);
284 
285  // write csv path results
286  if(settings.write_csv()) {
287  fs::path file = dir.results_csv();
288  _log << "write: " << dir.results_csv() << "\n";
289  fs::ofstream sout;
290 
291  if(!fs::exists(file)) {
292  sout.open(file);
293  formatter.print_header(&mc, sout);
294  }
295  else {
296  sout.open(file, std::ios::app);
297  }
298 
299  formatter.print(&mc, sout);
300 
301  sout.close();
302  }
303 
304  // write json path results
305  if(settings.write_json()) {
306  fs::path file = dir.results_json();
307  _log << "write: " << dir.results_json() << "\n";
308 
309  jsonParser results;
310  if(fs::exists(file)) {
311  results.read(file);
312  }
313  else {
314  results = jsonParser::object();
315  }
316 
317  formatter.to_json_arrays(&mc, results);
318  results.write(file);
319  }
320  }
321  catch(...) {
322  std::cerr << "ERROR writing results" << std::endl;
323  throw;
324  }
325 
326  }
327 }
Eigen::VectorXd param_chem_pot() const
parametric chemical potential: dg/dcomp_x
void from_json(ClexDescription &desc, const jsonParser &json)
GenericDatumFormatter< double, ConstMonteCarloPtr > MonteCarloMeanFormatter(std::string prop_name)
Print mean property values:
Definition: MonteIO.cc:10
void write_lte_results(const MonteSettings &settings, const GrandCanonical &mc, const double &phi_LTE1, const std::string &configname, Log &_log)
Will create new file or append to existing results file the results of the latest run...
Eigen::VectorXd param_composition(const Eigen::VectorXd &n) const
Convert number of mol per prim, 'n' to parametric composition 'x'.
void write(const std::string &file_name, unsigned int indent=2, unsigned int prec=12) const
Write json to file.
Definition: jsonParser.cc:191
jsonParser & to_json(const ClexDescription &desc, jsonParser &json)
PrimClex * primclex
Definition: settings.cc:101
const Eigen::VectorXd & comp_n() const
Number of atoms of each type, normalized per primitive cell.
GenericDatumFormatter< bool, ConstMonteCarloPtr > MonteCarloIsConvergedFormatter()
Print if converged.
Definition: MonteIO.cc:93
bool read(std::istream &stream)
Reads json from the stream.
Definition: jsonParser.cc:165
Main CASM namespace.
Definition: complete.cpp:8
Prints a string value specified at construction. A header string can also be passed.
const fs::path output_directory() const
Directory where output should go.
T get(Args...args) const
Get data from json, using one of several alternatives.
Definition: jsonParser.hh:729
std::vector< std::string > get_struc_molecule_name() const
Returns an Array of each possible Molecule in this Structure.
Definition: Structure.cc:166
Eigen::VectorXd comp_n(const ConfigDoF &configdof, const Supercell &scel)
Returns comp_n, the number of each molecule per primitive cell, ordered as Structure::get_struc_molec...
Definition: ConfigDoF.cc:312
double tol
static std::string comp_var(size_type i)
Composition variable names: "a", "b", ...
double formation_energy(const Configuration &config)
Returns the formation energy, normalized per unit cell.
DataFormatter< ConstMonteCarloPtr > make_lte_results_formatter(const GrandCanonical &mc, const double &phi_LTE1, const std::string &configname)
Make a results formatter.
void push_back(const BaseDatumFormatter< DataObject > &new_formatter, const std::string &args)
const PrimClex & primclex() const
const Access the PrimClex that *this is based on
Definition: MonteCarlo.hh:68
Eigen::VectorXd VectorXd
PrimClex is the top-level data structure for a CASM project.
Definition: PrimClex.hh:52
GenericDatumFormatter< MonteSampler::size_type, ConstMonteCarloPtr > MonteCarloNAvgSamplesFormatter()
Print number of samples used in calculating means.
Definition: MonteIO.cc:113
size_type independent_compositions() const
The dimensionality of the composition space.
const CompositionConverter & composition_axes() const
const Access CompositionConverter object
Definition: PrimClex.cc:237
ConfigIO::GenericConfigFormatter< std::string > configname()
Constructs DataFormmaterDictionary containing all Configuration DatumFormatters.
Definition: ConfigIO.cc:340
Interface base class for all types of Monte Carlo simulations (not meant to be used polymorphically) ...
Definition: MonteCarlo.hh:32
jsonParser & put_obj()
Puts new empty JSON object.
Definition: jsonParser.hh:276
DirectoryStructure & dir
Definition: settings.cc:102
Extract data from objects of 'DataObject' class.
GenericDatumFormatter< bool, ConstMonteCarloPtr > MonteCarloIsEquilibratedFormatter()
Print if equilibrated (not counting explicitly requested equilibration)
Definition: MonteIO.cc:83
bool write_csv() const
Write csv versions of files? (csv is the default format if no 'output_format' given) ...
bool write_json() const
Write json versions of files?
GenericDatumFormatter< double, ConstMonteCarloPtr > GrandCanonicalLTEFormatter(const double &phi_LTE1)
Print single spin flip LTE.
GenericDatumFormatter< MonteSampler::size_type, ConstMonteCarloPtr > MonteCarloNEquilSamplesFormatter()
Print number of samples used for equilibration (not counting explicitly requested equilibration) ...
Definition: MonteIO.cc:103
Settings for Monte Carlo calculations.
Definition: Log.hh:9
GenericDatumFormatter< double, ConstMonteCarloPtr > MonteCarloPrecFormatter(std::string prop_name)
Print calculated precision of property values: prec()
Definition: MonteIO.cc:26
A DatumFormatter that returns a value of specified type, via functions that may be specified at runti...
static jsonParser object()
Returns an empty json object.
Definition: jsonParser.hh:329
const SamplerMap & samplers() const
const Access sampler map
Definition: MonteCarlo.hh:153
const Structure & get_prim() const
const Access to primitive Structure
Definition: PrimClex.cc:260
DataFormatter< ConstMonteCarloPtr > make_results_formatter(const GrandCanonical &mc)
Make a LTE results formatter.