CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
BasisSet.hh
Go to the documentation of this file.
1 #ifndef BASISSET_HH
2 #define BASISSET_HH
3 
4 #include <iostream>
5 #include <sstream> //John G 010413
6 #include <map>
7 #include <memory>
8 #include "casm/basis_set/DoF.hh"
10 
11 //#include "../container/SparseTensor.cc"
12 //#include "../container/Tensor.cc"
13 //#include "../basis_set/DoF.cc"
14 //#include "../symmetry/SymOp.hh"
15 //#include "../symmetry/SymGroup.hh"
16 //#include "../misc/HierarchyID.cc"
17 
18 namespace CASM {
19 
20  class FunctionVisitor;
21  class SymOp;
22  class SymGroup;
23  class SymGroupRep;
24  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25 
26  class BasisSet: private Array<Function *>, public std::enable_shared_from_this<BasisSet> {
27  public:
29  typedef std::pair<SubBasis, Index> PolyConstraint;
30 
34 
35  BasisSet(const std::string &name = "") :
37  BasisSet(const BasisSet &init_basis);
38  const BasisSet &operator=(const BasisSet &RHS);
39 
40  //Delete Functions upon destruction
41  ~BasisSet();
42 
43  void clear();
44 
45  const std::string &name() const {
46  return m_name;
47  }
48 
50  return m_basis_symrep_ID;
51  }
52 
54  return m_max_poly_order;
55  }
57  return m_min_poly_order;
58  }
59 
62  }
65  }
66  BasisSet poly_quotient_set(const Function *divisor) const;
67 
68  std::shared_ptr<BasisSet> shared_copy() const {
69  return std::make_shared<BasisSet>(*this);
70  }
71 
72  Function const *operator[](Index i) const {
74  }
75 
76  Function const *back() const {
78  }
79 
80  const double &eval_cache(Index i) const {
81  assert(i < size() && i < m_eval_cache.size());
82  return m_eval_cache[i];
83  }
84 
85  const double &deval_cache(Index i) const {
86  assert(i < size() && i < m_deval_cache.size());
87  return m_deval_cache[i];
88  }
89 
90  bool compare(const BasisSet &RHS) const;
91 
92  int dependency_layer() const;
93 
94  void clear_formulae() {
95  for(Index i = 0; i < size(); i++) {
96  at(i)->clear_formula();
97  }
98  }
99 
100  void set_name(const std::string &new_name) {
101  m_name = new_name;
102  }
103 
105  m_basis_symrep_ID = new_ID;
106  }
107 
108  void add_min_poly_constraint(const Array<Index> &expons, Index expon_sum) {
109  m_min_poly_constraints.push_back(PolyConstraint(expons, expon_sum));
110  }
111 
112  void add_max_poly_constraint(const Array<Index> &expons, Index expon_sum) {
113  m_max_poly_constraints.push_back(PolyConstraint(expons, expon_sum));
114  }
115 
116  bool satisfies_exponent_constraints(const Array<Index> &expons)const;
117 
118  bool accept(const FunctionVisitor &visitor);
119 
121  void remote_eval_and_add_to(Array<double> &cumulant)const;
122 
124  void remote_deval_and_add_to(Array<double> &cumulant, const DoF::RemoteHandle &dvar)const;
125 
127  template<typename IteratorType>
128  void remote_eval_to(IteratorType result_begin, IteratorType result_end)const;
129 
131  template<typename IteratorType>
132  void remote_deval_to(IteratorType result_begin, IteratorType result_end, const DoF::RemoteHandle &dvar)const;
133 
135  void set_variable_basis(const Array<ContinuousDoF> &tvar_compon, SymGroupRepID _sym_rep_ID);
136 
137  void set_dof_IDs(const Array<Index> &new_IDs);
138 
139  const Array<Index> &dof_IDs() const {
140  return m_dof_IDs;
141  }
142 
143  const SubBasis &dof_sub_basis(Index i) const {
144  return m_dof_subbases[i];
145  }
146 
148  return m_dof_subbases;
149  }
150 
151  std::vector<std::set<Index> > independent_sub_bases() const;
152 
153  int register_remotes(const std::string &dof_name, const Array<DoF::RemoteHandle> &remote_handles);
154 
155  void append(const BasisSet &RHS);
156 
160 
161  // expects single basis set of polynomials with the same order( usually just order 1).
162  // makes a basis set of all of the combinations of polynomials with order
163  // spcecified by order.
164  //void construct_polynomials_by_order(const Array<BasisSet const * > &tsubs, Index order);
165 
166  void construct_orthonormal_discrete_functions(const DiscreteDoF &allowed_occs,
167  const Eigen::MatrixXd &gram_mat,
168  Index basis_ind,
169  const SymGroup &symgroup);
170 
171  void construct_orthonormal_discrete_functions(const DiscreteDoF &allowed_occs,
172  const Array<double> &occ_probs,
173  Index basis_ind,
174  const SymGroup &symgroup);
175 
177  const SymGroup &head_sym_group,
178  Index order,
179  Index min_dof_order = 1);
180 
181  //void construct_green_lagrange_dot_prods(const Array<BasisSet const *> &site_disp_dofs, BasisSet const *LG_strain_dofs, const Eigen::MatrixXd &ref_clust);
182  //void construct_disp_grad_dot_prods(const Array<BasisSet const *> &site_disp_dofs, BasisSet const *F_strain_dofs, const Eigen::MatrixXd &ref_clust);
183  //void construct_quadratic_ccds(const Array<BasisSet const *> &site_disp_dofs, BasisSet const *strain_dofs, const Eigen::MatrixXd &ref_clust,
184  // const Array<Array<SymOp> > &equiv_map, const SymGroupRep &permute_group, double sigma);
185 
186  //void construct_harmonic_polynomials(const Array<BasisSet const *> &rotation_dofs, Index order, Index min_order, bool even);
187 
188  void calc_invariant_functions(const SymGroup &head_sym_group);
189 
190  bool is_normal_basis_for(const SymGroup &head_sym_group);
191 
192  BasisSet calc_normal_basis(const SymGroup &head_sym_group, Eigen::MatrixXd &trans_mat)const;
193 
194  BasisSet transform_copy(const Eigen::MatrixXd &trans_mat) const;
195 
196  BasisSet &apply_sym(const SymOp &op, int dependency_layer = 1);
197 
198  //returns true if Gram_Schmidt leave BasisSet unchanged.
199  bool Gram_Schmidt();
200 
201  bool Gaussian_Elim();
202 
203  void get_symmetry_representation(const SymGroup &head_sym_group) const;
204 
205  //return true if basis_set was already orthogonal to argument
206  bool make_orthogonal_to(Function const *ortho_func);
207  bool make_orthogonal_to(const BasisSet &ortho_basis);
208 
209  jsonParser &to_json(jsonParser &json) const;
210  void from_json(const jsonParser &json);
211 
212  private:
214 
215  std::string m_name;
217 
218  std::vector<std::shared_ptr<BasisSet> > m_argument;
219 
220  // When forming tensor products with other basis sets,
221  // what is the minimum and maximum order of polynomial function
222  // that elements of this basis set can be used in
223  // For example, if basis_set1 = {u,v,w} with
224  // min_poly_order 0 and max_poly_order 2
225  // and basis_set2 = {x, y} with min_poly_order 1 and max_poly_order 1
226  // then the product space of basis_set1 and basis_set2 yields
227  // {x, y, x*u, x*v, x*w, y*u, y*v,y*w, x*u*u, x*u*v, x*u*w, ..., y*w*w}
229 
233 
234  mutable std::vector<double> m_eval_cache;
235  mutable std::vector<double> m_deval_cache;
236 
237  // public push_back is unsafe. Use BasisSet::append() instead,
238  // which calls this private push_back method
239  void push_back(Function *new_func);
240 
241  // non-const access to last function
243  return Array<Function *> :: back();
244  }
245 
246  // non-const access to function at Index (i)
248  return Array<Function *> :: at(i);
249  }
250 
251  static Index _new_ID() {
252  static Index ID_COUNT(0);
253  return ID_COUNT++;
254  }
255 
256  void _refresh_ID() {
257  m_basis_ID = _new_ID();
258  }
259 
260  void _eval_to_cache() const;
261  void _deval_to_cache(const DoF::RemoteHandle &_dvar) const;
262 
263  Function *_linear_combination(const Eigen::VectorXd &coeffs) const;
264 
265  void _set_arguments(const Array<BasisSet const *> &new_args);
266  void _set_arguments(const std::vector<std::shared_ptr<BasisSet> > &new_args) {
267  m_argument = new_args;
268  }
269 
270  void _update_dof_IDs(const Array<Index> before_IDs, const Array<Index> &after_IDs);
271 
272  //non-const access to constraints
274  return m_min_poly_constraints;
275  }
277  return m_max_poly_constraints;
278  }
279 
280 
281 
282  };
283 
284  jsonParser &to_json(const BasisSet &bset, jsonParser &json);
285  void from_json(BasisSet &bset, const jsonParser &json);
286 
287  BasisSet operator*(const SymOp &LHS, const BasisSet &RHS);
288 
289 
290  //*******************************************************************************************
292  template<typename IteratorType>
293  void BasisSet::remote_eval_to(IteratorType result_begin, IteratorType result_end)const {
294  for(Index i = 0; i < m_argument.size(); i++)
296 
297  Index i(0);
298  for(; result_begin != result_end; ++result_begin) {
299  assert(i < size());
300  if(at(i))
301  *result_begin = at(i)->cache_eval();
302  i++;
303  }
304  }
305 
306  //*******************************************************************************************
308  template<typename IteratorType>
309  void BasisSet::remote_deval_to(IteratorType result_begin, IteratorType result_end, const DoF::RemoteHandle &dvar)const {
310  for(Index i = 0; i < m_argument.size(); i++)
311  m_argument[i]->_deval_to_cache(dvar);
312 
313  Index i(0);
314  for(; result_begin != result_end; ++result_begin) {
315  assert(i < size());
316  if(at(i))
317  *result_begin = at(i)->cache_deval(dvar);
318  i++;
319  }
320  }
321 
322 }
323 #endif
Eigen::MatrixXd MatrixXd
const T & operator[](Index ind) const
Definition: Array.hh:167
bool make_orthogonal_to(Function const *ortho_func)
Definition: BasisSet.cc:1057
void _set_arguments(const Array< BasisSet const * > &new_args)
Definition: BasisSet.cc:884
std::pair< SubBasis, Index > PolyConstraint
Definition: BasisSet.hh:29
void get_symmetry_representation(const SymGroup &head_sym_group) const
Definition: BasisSet.cc:1018
const double & deval_cache(Index i) const
Definition: BasisSet.hh:85
void from_json(ClexDescription &desc, const jsonParser &json)
void _deval_to_cache(const DoF::RemoteHandle &_dvar) const
Remotely evaluate each basis function and add it to the respective value in cumulant.
Definition: BasisSet.cc:282
Index size() const
Definition: Array.hh:145
Type-safe ID object for communicating and accessing Symmetry representation info. ...
Function *& _at(Index i)
Definition: BasisSet.hh:247
void construct_polynomials_by_order(const Array< BasisSet const * > &tsubs, Index order)
Definition: BasisSet.cc:398
void calc_invariant_functions(const SymGroup &head_sym_group)
Definition: BasisSet.cc:734
void push_back(const T &toPush)
Definition: Array.hh:513
const Array< PolyConstraint > & max_poly_constraints() const
Definition: BasisSet.hh:63
jsonParser & to_json(const ClexDescription &desc, jsonParser &json)
BasisSet transform_copy(const Eigen::MatrixXd &trans_mat) const
Definition: BasisSet.cc:849
Index m_min_poly_order
Definition: BasisSet.hh:228
void construct_invariant_polynomials(const Array< BasisSet const * > &tsubs, const SymGroup &head_sym_group, Index order, Index min_dof_order=1)
Definition: BasisSet.cc:425
void add_min_poly_constraint(const Array< Index > &expons, Index expon_sum)
Definition: BasisSet.hh:108
void push_back(Function *new_func)
Definition: BasisSet.cc:803
std::string m_name
Definition: BasisSet.hh:215
std::shared_ptr< BasisSet > shared_copy() const
Definition: BasisSet.hh:68
void clear_formulae()
Definition: BasisSet.hh:94
const std::string & name() const
Definition: BasisSet.hh:45
bool Gram_Schmidt()
Definition: BasisSet.cc:905
Array< PolyConstraint > & _min_poly_constraints()
Definition: BasisSet.hh:273
Main CASM namespace.
Definition: complete.cpp:8
bool compare(const BasisSet &RHS) const
Definition: BasisSet.cc:251
Function const * operator[](Index i) const
Definition: BasisSet.hh:72
void remote_eval_and_add_to(Array< double > &cumulant) const
Remotely evaluate each basis function and add it to the respective value in cumulant.
Definition: BasisSet.cc:225
BasisSet poly_quotient_set(const Function *divisor) const
Definition: BasisSet.cc:163
BasisSet calc_normal_basis(const SymGroup &head_sym_group, Eigen::MatrixXd &trans_mat) const
Definition: BasisSet.cc:781
static Index _new_ID()
Definition: BasisSet.hh:251
std::vector< double > m_deval_cache
Definition: BasisSet.hh:235
SymGroup is a collection of symmetry operations that satisfy the group property The symmetry operatio...
Definition: SymGroup.hh:33
Array< SubBasis > m_dof_subbases
Definition: BasisSet.hh:231
void append(const BasisSet &RHS)
Definition: BasisSet.cc:112
jsonParser & to_json(jsonParser &json) const
Definition: BasisSet.cc:1109
void set_name(const std::string &new_name)
Definition: BasisSet.hh:100
SymOp is the Coordinate representation of a symmetry operation it keeps fraction (FRAC) and Cartesian...
Definition: SymOp.hh:28
BasisSet operator*(const SymOp &LHS, const BasisSet &RHS)
Definition: BasisSet.cc:1154
int dependency_layer() const
Definition: BasisSet.cc:269
std::vector< std::shared_ptr< BasisSet > > m_argument
Definition: BasisSet.hh:218
EigenIndex Index
For long integer indexing:
void construct_orthonormal_discrete_functions(const DiscreteDoF &allowed_occs, const Eigen::MatrixXd &gram_mat, Index basis_ind, const SymGroup &symgroup)
Definition: BasisSet.cc:541
bool accept(const FunctionVisitor &visitor)
Definition: BasisSet.cc:202
void set_basis_symrep_ID(SymGroupRepID new_ID)
Definition: BasisSet.hh:104
SymGroupRepID m_basis_symrep_ID
Definition: BasisSet.hh:213
Array< Index > SubBasis
Definition: BasisSet.hh:28
void _set_arguments(const std::vector< std::shared_ptr< BasisSet > > &new_args)
Definition: BasisSet.hh:266
void add_max_poly_constraint(const Array< Index > &expons, Index expon_sum)
Definition: BasisSet.hh:112
const Array< PolyConstraint > & min_poly_constraints() const
Definition: BasisSet.hh:60
Eigen::VectorXd VectorXd
bool is_normal_basis_for(const SymGroup &head_sym_group)
Definition: BasisSet.cc:760
Array< PolyConstraint > m_max_poly_constraints
Definition: BasisSet.hh:232
std::vector< double > m_eval_cache
Definition: BasisSet.hh:234
Index m_max_poly_order
Definition: BasisSet.hh:228
void _refresh_ID()
Definition: BasisSet.hh:256
Array< Index > m_dof_IDs
Definition: BasisSet.hh:230
Function *& at(Index ind)
Definition: Array.hh:157
void swap_elem(Index i, Index j)
Definition: Array.hh:231
BasisSet(const std::string &name="")
Definition: BasisSet.hh:35
Index find(const Function *&test_elem) const
int register_remotes(const std::string &dof_name, const Array< DoF::RemoteHandle > &remote_handles)
Definition: BasisSet.cc:385
bool Gaussian_Elim()
Definition: BasisSet.cc:958
void remote_eval_to(IteratorType result_begin, IteratorType result_end) const
Remotely evaluate each basis function and add it to the respective value in cumulant.
Definition: BasisSet.hh:293
SymGroupRepID basis_symrep_ID() const
Definition: BasisSet.hh:49
Array< PolyConstraint > m_min_poly_constraints
Definition: BasisSet.hh:232
Function * _back()
Definition: BasisSet.hh:242
Function const * back() const
Definition: BasisSet.hh:76
void _update_dof_IDs(const Array< Index > before_IDs, const Array< Index > &after_IDs)
Definition: BasisSet.cc:309
void clear()
Definition: BasisSet.cc:101
Index m_basis_ID
Definition: BasisSet.hh:216
BasisSet & apply_sym(const SymOp &op, int dependency_layer=1)
Definition: BasisSet.cc:868
Function * _linear_combination(const Eigen::VectorXd &coeffs) const
Definition: BasisSet.cc:814
void set_variable_basis(const Array< ContinuousDoF > &tvar_compon, SymGroupRepID _sym_rep_ID)
Define the basis set to contain only variables (e.g., x,y,z)
Definition: BasisSet.cc:289
const SubBasis & dof_sub_basis(Index i) const
Definition: BasisSet.hh:143
void remote_deval_to(IteratorType result_begin, IteratorType result_end, const DoF::RemoteHandle &dvar) const
Remotely evaluate derivative of each basis function (w.r.t. dvar) and add it to the respective value ...
Definition: BasisSet.hh:309
void set_dof_IDs(const Array< Index > &new_IDs)
Definition: BasisSet.cc:304
virtual double cache_deval(const DoF::RemoteHandle &dvar) const =0
Index max_poly_order() const
Definition: BasisSet.hh:53
void remote_deval_and_add_to(Array< double > &cumulant, const DoF::RemoteHandle &dvar) const
Remotely evaluate derivative of each basis function (w.r.t. dvar) and add it to the respective value ...
Definition: BasisSet.cc:238
const BasisSet & operator=(const BasisSet &RHS)
Definition: BasisSet.cc:58
Index min_poly_order() const
Definition: BasisSet.hh:56
pair_type bset
Definition: settings.cc:111
T & back()
Definition: Array.hh:177
Array< PolyConstraint > & _max_poly_constraints()
Definition: BasisSet.hh:276
bool satisfies_exponent_constraints(const Array< Index > &expons) const
Definition: BasisSet.cc:176
std::vector< std::set< Index > > independent_sub_bases() const
Definition: BasisSet.cc:351
Basic std::vector like container (deprecated)
virtual double cache_eval() const =0
void _eval_to_cache() const
Remotely evaluate each basis function and add it to the respective value in cumulant.
Definition: BasisSet.cc:277
const Array< SubBasis > & dof_sub_bases() const
Definition: BasisSet.hh:147
void from_json(const jsonParser &json)
const Array< Index > & dof_IDs() const
Definition: BasisSet.hh:139
const double & eval_cache(Index i) const
Definition: BasisSet.hh:80
void clear_formula()