CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
CanonicalIO.cc
Go to the documentation of this file.
2 
3 #include "casm/external/gzstream/gzstream.h"
6 #include "casm/casm_io/VaspIO.hh"
9 
10 namespace CASM {
11  namespace Monte {
12 
33 
35 
40 
41  std::set<std::string> exclude;
42  std::string name;
43 
44  // always print temperature, Beta
45  formatter.push_back(MonteCarloTFormatter<Canonical>());
46  formatter.push_back(MonteCarloBetaFormatter<Canonical>());
47 
48  // always print comp
49  for(int i = 0; i < mc.primclex().composition_axes().independent_compositions(); ++i) {
50  name = std::string("comp(") + mc.primclex().composition_axes().comp_var(i) + ")";
51  formatter.push_back(MonteCarloCompFormatter<Canonical>(mc, i));
52  exclude.insert(name);
53  }
54 
55  // always print comp_n
56  auto struc_mol_name = mc.primclex().get_prim().get_struc_molecule_name();
57  for(int i = 0; i < struc_mol_name.size(); ++i) {
58  name = std::string("comp_n(") + struc_mol_name[i] + ")";
59  formatter.push_back(MonteCarloCompNFormatter<Canonical>(mc, i));
60  exclude.insert(name);
61  }
62 
63  // always print potential_energy, and formation_energy, though they are the same
64  {
65  name = "potential_energy";
66  formatter.push_back(MonteCarloMeanFormatter(name));
67  formatter.push_back(MonteCarloPrecFormatter(name));
68  exclude.insert(name);
69 
70  name = "formation_energy";
71  formatter.push_back(MonteCarloMeanFormatter(name));
72  formatter.push_back(MonteCarloPrecFormatter(name));
73  exclude.insert(name);
74  }
75 
76  // include mean/prec of other properties
77  for(auto it = mc.samplers().cbegin(); it != mc.samplers().cend(); ++it) {
78  if(exclude.find(it->first) == exclude.end()) {
79  formatter.push_back(MonteCarloMeanFormatter(it->first));
80  formatter.push_back(MonteCarloPrecFormatter(it->first));
81  }
82  }
83 
84  // include heat_capacity
85  formatter.push_back(MonteCarloHeatCapacityFormatter<Canonical>());
86 
87  return formatter;
88  }
89 
90 
102  jsonParser &to_json(const CanonicalConditions &conditions, jsonParser &json) {
103  json.put_obj();
104  json["temperature"] = conditions.temperature();
105 
106  json["comp"] = jsonParser::object();
107  auto param_composition = conditions.param_composition();
108  for(int i = 0; i < param_composition.size(); i++) {
109  json["comp"][CompositionConverter::comp_var(i)] = param_composition(i);
110  }
111 
112  json["comp_n"] = jsonParser::object();
113  auto mol_composition = conditions.mol_composition();
114  auto components = conditions.primclex().composition_axes().components();
115  for(int i = 0; i < components.size(); ++i) {
116  json["comp_n"][components[i]] = mol_composition(i);
117  }
118 
119  json["tolerance"] = conditions.tolerance();
120 
121  return json;
122  }
123 
137  void from_json(CanonicalConditions &conditions, const PrimClex &primclex, const jsonParser &json) {
138 
139  double temp = json["temperature"].get<double>();
140  double tol = json["tolerance"].get<double>();
141 
143 
144  if(json.contains("comp")) {
145 
146  if(json["comp"].is_array()) {
147  from_json(comp, json["comp"]);
148  }
149  else {
150  int Nparam = primclex.composition_axes().independent_compositions();
151  comp.resize(Nparam);
152 
153  for(int i = 0; i < Nparam; i++) {
154  comp(i) = json["comp"][CompositionConverter::comp_var(i)].get<double>();
155  }
156  }
157  }
158  else if(json.contains("comp_n")) {
159 
161 
162  if(json["comp_n"].is_array()) {
163  from_json(comp_n, json["comp_n"]);
164  }
165  else {
166  auto components = primclex.composition_axes().components();
167  comp_n.resize(components.size());
168 
169  for(int i = 0; i < components.size(); i++) {
170  comp_n(i) = json["comp_n"][components[i]].get<double>();
171  }
172  }
173 
174  comp_n = comp_n / comp_n.sum() * primclex.get_prim().basis.size();
175  comp = primclex.composition_axes().param_composition(comp_n);
176  }
177  else {
178  throw std::runtime_error("Error reading conditions: No 'comp' or 'comp_n' specified");
179  }
180  conditions = CanonicalConditions(primclex, temp, comp, tol);
181  }
182  }
183 }
GenericDatumFormatter< double, ConstMonteCarloPtr > MonteCarloMeanFormatter(std::string prop_name)
Print mean property values:
Definition: MonteIO.cc:10
Index size() const
Definition: Array.hh:145
Eigen::VectorXd param_composition(const Eigen::VectorXd &n) const
Convert number of mol per prim, 'n' to parametric composition 'x'.
PrimClex * primclex
Definition: settings.cc:101
GenericDatumFormatter< bool, ConstMonteCarloPtr > MonteCarloIsConvergedFormatter()
Print if converged.
Definition: MonteIO.cc:93
jsonParser & to_json(const CanonicalConditions &conditions, jsonParser &json)
Store CanonicalConditions in JSON format.
Definition: CanonicalIO.cc:102
Eigen::VectorXd param_composition() const
parametric composition: comp_x
Main CASM namespace.
Definition: complete.cpp:8
Eigen::VectorXd comp(const Configuration &config)
Returns parametric composition, as calculated using PrimClex::param_comp.
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
std::vector< std::string > components() const
The order of components in mol composition vectors.
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", ...
void push_back(const BaseDatumFormatter< DataObject > &new_formatter, const std::string &args)
Eigen::VectorXd mol_composition() const
mol composition: comp_n
Array< CoordType > basis
Lattice vectors that specifies periodicity of the crystal.
const PrimClex & primclex() const
const Access the PrimClex that *this is based on
Definition: MonteCarlo.hh:68
void from_json(CanonicalConditions &conditions, const PrimClex &primclex, const jsonParser &json)
Read CanonicalConditions from JSON format.
Definition: CanonicalIO.cc:137
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
DataFormatter< ConstMonteCarloPtr > make_results_formatter(const Canonical &mc)
Make a LTE results formatter.
Definition: CanonicalIO.cc:32
size_type independent_compositions() const
The dimensionality of the composition space.
const CompositionConverter & composition_axes() const
const Access CompositionConverter object
Definition: PrimClex.cc:237
jsonParser & put_obj()
Puts new empty JSON object.
Definition: jsonParser.hh:276
Extract data from objects of 'DataObject' class.
bool contains(const std::string &name) const
Return true if JSON object contains 'name'.
Definition: jsonParser.cc:500
GenericDatumFormatter< bool, ConstMonteCarloPtr > MonteCarloIsEquilibratedFormatter()
Print if equilibrated (not counting explicitly requested equilibration)
Definition: MonteIO.cc:83
GenericDatumFormatter< MonteSampler::size_type, ConstMonteCarloPtr > MonteCarloNEquilSamplesFormatter()
Print number of samples used for equilibration (not counting explicitly requested equilibration) ...
Definition: MonteIO.cc:103
GenericDatumFormatter< double, ConstMonteCarloPtr > MonteCarloPrecFormatter(std::string prop_name)
Print calculated precision of property values: prec()
Definition: MonteIO.cc:26
const PrimClex & primclex() const
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