CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
DoFManager.cc
Go to the documentation of this file.
2 #include "casm/clex/Supercell.hh"
3 
5 
6 namespace CASM {
7 
8 
10  for(Index i = 0; i < m_environs.size(); i++) {
11  add_dof(m_environs[i]->name());
12  }
13  }
14 
15  //************************************************************
16 
18  for(Index i = 0; i < m_environs.size(); i++) {
19  delete m_environs[i];
20  }
21  }
22 
23  //************************************************************
24  bool DoFManager::contains(const std::string &dof_name) const {
25  for(Index i = 0; i < m_environs.size(); i++) {
26  if(dof_name == (m_environs[i]->name()))
27  return true;
28  }
29  return false;
30  }
31  //************************************************************
32  void DoFManager::add_dof(const std::string &dof_name) {
33  if(contains(dof_name))
34  return;
35 
36  if(dof_name.find("occ") == 0)
37  m_environs.push_back(new OccupationDoFEnvironment(dof_name));
38  else if(dof_name.find("disp") == 0)
39  m_environs.push_back(new DisplacementDoFEnvironment(dof_name));
40  else if(dof_name.find("strain") == 0)
41  m_environs.push_back(new StrainDoFEnvironment(dof_name));
42  else {
43  std::cerr << "CRITICAL ERROR: Unknown option '" << dof_name << "' passed to DoFManager::add_dof()!\n"
44  << " Exiting...\n";
45  exit(1);
46  }
47  return;
48  }
49 
50  //************************************************************
51 
53  for(Index i = 0; i < m_environs.size(); i++) {
54  m_environs[i]->set_local_state(config, l);
55  }
56  }
57 
58  //************************************************************
59 
61  for(Index i = 0; i < m_environs.size(); i++) {
62  m_environs[i]->set_global_state(config);
63  }
64  }
65 
66  //************************************************************
67 
69  for(Index i = 0; i < m_environs.size(); i++) {
70  m_environs[i]->resize_neighborhood(nlist_size);
71  }
72  }
73 
74  //************************************************************
75 
78  for(Index i = 0; i < m_environs.size(); i++) {
79  tlabels.push_back(m_environs[i]->get_function_label_visitor());
80  if(!tlabels.back())
81  tlabels.pop_back();
82  }
83  return tlabels;
84  }
85 
86  //************************************************************
87 
88  void DoFManager::print_clexulator_member_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
89  for(Index i = 0; i < m_environs.size(); i++) {
90  m_environs[i]->print_clexulator_member_definitions(stream, tree, indent);
91  }
92  }
93 
94  //************************************************************
95 
96  void DoFManager::print_clexulator_private_method_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
97  for(Index i = 0; i < m_environs.size(); i++) {
98  m_environs[i]->print_clexulator_private_method_definitions(stream, tree, indent);
99  }
100  }
101 
102  //************************************************************
103 
104  void DoFManager::print_clexulator_private_method_implementations(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
105  for(Index i = 0; i < m_environs.size(); i++) {
106  m_environs[i]->print_clexulator_private_method_implementations(stream, tree, indent);
107  }
108  }
109 
110  //************************************************************
111 
112  void DoFManager::print_clexulator_public_method_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
113  for(Index i = 0; i < m_environs.size(); i++) {
114  m_environs[i]->print_clexulator_public_method_definitions(stream, tree, indent);
115  }
116  }
117 
118  //************************************************************
119 
120  void DoFManager::print_clexulator_public_method_implementations(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
121  for(Index i = 0; i < m_environs.size(); i++) {
122  m_environs[i]->print_clexulator_public_method_implementations(stream, tree, indent);
123  }
124  }
125 
126  //************************************************************
127 
128  void DoFManager::print_to_clexulator_constructor(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
129  for(Index i = 0; i < m_environs.size(); i++) {
130  m_environs[i]->print_to_clexulator_constructor(stream, tree, indent);
131  }
132  }
133 
134  //************************************************************
135 
136  void OccupationDoFEnvironment::print_clexulator_member_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent)const {
137  const SiteOrbitBranch &asym_unit(tree.asym_unit());
138  for(Index no = 0; no < asym_unit.size(); no++) {
139  if(asym_unit[no].size() == 0 || asym_unit[no][0].clust_basis.size() == 0)
140  continue;
141 
142  stream <<
143  indent << "// Occupation Function tables for basis sites in asymmetric unit " << no << ":\n";
144  for(Index ne = 0; ne < asym_unit[no].size(); ne++) {
145  Index b = asym_unit[no][ne][0].basis_ind();
146  stream << indent << "// - basis site " << b << ":\n";
147  for(Index f = 0; f < asym_unit[no][ne].clust_basis.size(); f++) {
148  stream <<
149  indent << "double " << "m_occ_func_" << b << '_' << f << '[' << asym_unit[no][ne][0].site_occupant().size() << "];\n";
150  }
151  stream << '\n';
152  }
153 
154  }
155 
156  }
157  //************************************************************
158  void OccupationDoFEnvironment::print_clexulator_private_method_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
159  const SiteOrbitBranch &asym_unit(tree.asym_unit());
160  for(Index no = 0; no < asym_unit.size(); no++) {
161  if(asym_unit[no].size() == 0 || asym_unit[no][0].clust_basis.size() == 0)
162  continue;
163 
164  for(Index ne = 0; ne < asym_unit[no].size(); ne++) {
165  Index b = asym_unit[no][ne][0].basis_ind();
166  stream <<
167  indent << "// Occupation Function accessors for basis site " << b << ":\n";
168  for(Index f = 0; f < asym_unit[no][ne].clust_basis.size(); f++) {
169  stream <<
170  indent << "const double &occ_func_" << b << '_' << f << "(const int &nlist_ind)const{return " << "m_occ_func_" << b << '_' << f << "[*(m_occ_ptr+*(m_nlist_ptr+nlist_ind))];}\n";
171  }
172  stream << '\n';
173  }
174 
175  }
176  }
177  //************************************************************
178  void OccupationDoFEnvironment::print_clexulator_public_method_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
179 
180  }
181 
182  //************************************************************
183 
184  void OccupationDoFEnvironment::print_to_clexulator_constructor(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const {
185  stream.flags(std::ios::showpoint | std::ios::fixed | std::ios::right);
186  stream.precision(10);
187 
188  const SiteOrbitBranch &asym_unit(tree.asym_unit());
189  for(Index no = 0; no < asym_unit.size(); no++) {
190  for(Index ne = 0; ne < asym_unit[no].size(); ne++) {
191  Index b = asym_unit[no][ne][0].basis_ind();
192  for(Index f = 0; f < asym_unit[no][ne].clust_basis.size(); f++) {
193  for(Index s = 0; s < asym_unit[no][ne][0].site_occupant().size(); s++) {
194  if(s == 0)
195  stream << indent;
196  stream << "m_occ_func_" << b << '_' << f << '[' << s << "] = "
197  << asym_unit[no][ne].clust_basis[f]->eval(Array<Index>(1, asym_unit[no][ne][0].site_occupant().ID()), Array<Index>(1, s));
198  if(s + 1 == asym_unit[no][ne][0].site_occupant().size())
199  stream << ";\n\n";
200  else
201  stream << ", ";
202  }
203  }
204  }
205  }
206  }
207 
208  //************************************************************
209 
211  //do nothing for global set_state
212  }
213 
214  //************************************************************
215 
217  const Supercell &scel(config.get_supercell());
218  for(Index n = 0; n < m_neighbor_occ.size(); n++) {
219  m_neighbor_occ[n] = config.occ(scel.nlist().sites(l)[n]);
220  }
221  return;
222  }
223 
224  //************************************************************
225 
227  //do nothing for global set_state
228  }
229 
230  //************************************************************
231 
233  const Supercell &scel(config.get_supercell());
234  for(Index n = 0; n < m_neighbor_disp.size(); n++) {
235  m_neighbor_disp[n] = config.disp(scel.nlist().sites(l)[n])[m_disp_index];
236  }
237  return;
238  }
239 
240  //************************************************************
241 
243  //something like
244  /*
245  for(Index i=0; i<m_strain_vals.size(); i++){
246  m_strain_vals[i]=config.get_unrolled_strain_metric()[i];
247  }
248  return;
249  */
250  }
251  //************************************************************
252 
254  //Do nothing for local state
255 
256  }
257 
258 };
259 
bool contains(const std::string &dof_name) const
Definition: DoFManager.cc:24
void set_global_dof_state(const Configuration &config)
Definition: DoFManager.cc:60
void print_clexulator_member_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:88
const_displacement_t disp(Index site_l) const
Occupant displacement.
void print_clexulator_private_method_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:96
void set_local_dof_state(const Configuration &config, Index l)
Definition: DoFManager.cc:52
const int & occ(Index site_l) const
Occupant variable on site l.
Index size() const
Definition: Array.hh:145
void resize_neighborhood(Index nlist_size)
Definition: DoFManager.cc:68
void push_back(const T &toPush)
Definition: Array.hh:513
void print_clexulator_public_method_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:112
ReturnArray< FunctionVisitor * > get_function_label_visitors() const
Definition: DoFManager.cc:76
Main CASM namespace.
Definition: complete.cpp:8
void print_to_clexulator_constructor(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:184
Represents a supercell of the primitive parent crystal structure.
Definition: Supercell.hh:37
void print_clexulator_member_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:136
void set_global_state(const Configuration &config)
set the state of GLOBAL parameters based on their value in config
Definition: DoFManager.cc:210
void print_clexulator_private_method_implementations(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:104
EigenIndex Index
For long integer indexing:
void set_global_state(const Configuration &config)
set the state of GLOBAL parameters based on their value in config
Definition: DoFManager.cc:226
Array< DoFEnvironment * > m_environs
Definition: DoFManager.hh:14
void print_clexulator_public_method_implementations(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:120
void set_local_state(const Configuration &config, Index l)
set the state of LOCAL parameters based on their value in config
Definition: DoFManager.cc:253
void print_clexulator_public_method_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:178
void print_clexulator_private_method_definitions(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:158
void set_local_state(const Configuration &config, Index l)
set the state of LOCAL parameters based on their value in config
Definition: DoFManager.cc:232
void pop_back()
Definition: Array.hh:212
void print_to_clexulator_constructor(std::ostream &stream, const SiteOrbitree &tree, const std::string &indent) const
Definition: DoFManager.cc:128
void set_global_state(const Configuration &config)
set the state of GLOBAL parameters based on their value in config
Definition: DoFManager.cc:242
Supercell & get_supercell() const
Get the Supercell for this Configuration.
DoFManager holds multiple DoFEnvironments, and provides a simple interface for adding and managing Do...
Definition: DoFManager.hh:13
Index size(Index no) const
How many equivalent clusters are int orbit 'no'.
void set_local_state(const Configuration &config, Index l)
set the state of LOCAL parameters based on their value in config
Definition: DoFManager.cc:216
T & back()
Definition: Array.hh:177
Basic std::vector like container (deprecated)
const GenericOrbitBranch< ClustType > & asym_unit() const
Definition: Orbitree.hh:227
void add_dof(const std::string &dof_name)
Definition: DoFManager.cc:32
A Configuration represents the values of all degrees of freedom in a Supercell.