Feellgood
fem.h
Go to the documentation of this file.
1 #ifndef fem_h
2 #define fem_h
3 
9 #include <cassert>
10 #include <cmath>
11 #include <cstdlib>
12 #include <fstream>
13 #include <functional>
14 #include <iomanip>
15 #include <iostream>
16 #include <list>
17 #include <map>
18 #include <sstream>
19 #include <utility>
20 #include <vector>
21 
22 #include <sys/times.h>
23 #include <time.h>
24 #include <unistd.h>
25 
26 #include "mesh.h"
27 #include "fmm_demag.h"
28 #include "spinAccumulationSolver.h"
29 #include "linear_algebra.h"
30 #include "chronometer.h"
31 #include "ANN.h"
32 #include "feellgoodSettings.h"
33 
35 const int NB_ENERGY_TERMS = 4;
36 
39  {
40  EXCHANGE = 0,
41  ANISOTROPY = 1,
42  DEMAG = 2,
43  ZEEMAN = 3
44  };
45 
50 class Fem
51  {
52 public:
54  inline Fem(Settings &mySets, timing &t_prm) : msh(mySets)
55  {
56  vmax = 0.0;
57  std::fill(E.begin(),E.end(),0);
58  Etot0 = INFINITY; // avoid "WARNING: energy increased" on first time step
59  Etot = 0.0;
60 
61  recenter_mem = false;
62  if (mySets.recenter)
63  {
64  if (mySets.verbose)
65  {
66  std::cout << "Approximate nearest neighbors:\n";
67  }
68  pts = annAllocPts(msh.getNbNodes(), Nodes::DIM);
69  if (!pts)
70  {
71  std::cout << "ANN memory error while allocating points" << std::endl;
72  SYSTEM_ERROR;
73  }
74  else if (mySets.verbose)
75  {
76  std::cout << " points allocated\n";
77  }
78 
79  for (int i = 0; i < msh.getNbNodes(); i++)
80  {
81  this->pts[i][0] = msh.getNode_p(i).x();
82  this->pts[i][1] = msh.getNode_p(i).y();
83  this->pts[i][2] = msh.getNode_p(i).z();
84  }
85 
86  if (mySets.verbose)
87  {
88  std::cout << " building kd_tree\n";
89  }
90 
91  kdtree = new ANNkd_tree(pts, msh.getNbNodes(), Nodes::DIM);
92  if (!kdtree)
93  {
94  std::cout << "ANN memory error while allocating kd_tree" << std::endl;
95  SYSTEM_ERROR;
96  }
97  recenter_mem = true;
98 
99  if (mySets.verbose)
100  {
101  std::cout << " kd_tree allocated\n";
102  }
103  }
104  else if (mySets.verbose)
105  {
106  std::cout << "No recentering.\n";
107  }
108 
109  if (mySets.restoreFileName == "")
110  {
111  msh.init_distrib(mySets);
112  }
113  else
114  {
115  t_prm.set_t(msh.readSol(mySets.verbose, mySets.restoreFileName));
116  }
117 
118  /* This potentially overrides the initial time set above by msh.readSol(). */
119  if (!isnan(mySets.initial_time))
120  {
121  t_prm.set_t(mySets.initial_time);
122  }
123 
124  if (mySets.recenter)
125  {
126  direction(Nodes::IDX_Z);
127  } /* DW propagation direction for recentering */
128  }
129 
132  {
133  if (recenter_mem)
134  {
135  annDeallocPts(pts);
136  delete kdtree;
137  }
138  }
139 
141  double vmax;
142 
144  std::array<double,NB_ENERGY_TERMS> E;
145 
147  double DW_dir;
148 
150  double Etot0;
151 
153  double Etot;
154 
157 
159  void energy(double const t
161  ,Settings &settings );
162 
166  inline void evolution(void)
167  {
168  msh.evolution();
169  Etot0 = Etot;
170  }
171 
173  void saver(Settings &settings , timing const &t_prm ,
174  std::ofstream &fout , const int nt ,
175  std::vector<Eigen::Vector3d> &s ) const;
176 
188  bool recenter(double thres ,
189  char recentering_direction );
190 
192  int time_integration(Settings &settings ,
193  LinAlgebra &linAlg ,
194  spinAcc &spinAcc_solver ,
195  scal_fmm::fmm &myFMM ,
196  timing &t_prm ,
197  int &nt );
198 
199 private:
201  ANNkd_tree *kdtree;
203  ANNpointArray pts;
206  void direction(enum Nodes::index idx_dir );
207 
209  void compute_all(Settings &settings , spinAcc &spinAcc_solver ,
210  scal_fmm::fmm &myFMM , const double t )
211  {
212  bool success(false);
213  chronometer fmm_counter(2);
214  myFMM.calc_demag(msh);
215  if (settings.spin_acc && spinAcc_solver.compute())
216  { success = true; }
217  if (settings.verbose)
218  {
219  std::cout << "magnetostatics done in " << fmm_counter.millis() << std::endl;
220  if (settings.spin_acc)
221  {
222  if (success)
223  { std::cout << "spin diffusion solved.\n"; }
224  else
225  { std::cout << "spin diffusion solver failed.\n"; }
226  }
227  }
228  energy(t, settings);
229  evolution();
230  }
231  }; // end class
232 
233 #endif
Definition: fem.h:51
double Etot
Definition: fem.h:153
void direction(enum Nodes::index idx_dir)
Definition: recentering.cpp:7
void evolution(void)
Definition: fem.h:166
std::array< double, NB_ENERGY_TERMS > E
Definition: fem.h:144
double Etot0
Definition: fem.h:150
Mesh::mesh msh
Definition: fem.h:156
bool recenter(double thres, char recentering_direction)
Definition: recentering.cpp:47
ANNpointArray pts
Definition: fem.h:203
ANNkd_tree * kdtree
Definition: fem.h:201
~Fem()
Definition: fem.h:131
double DW_dir
Definition: fem.h:147
int time_integration(Settings &settings, LinAlgebra &linAlg, spinAcc &spinAcc_solver, scal_fmm::fmm &myFMM, timing &t_prm, int &nt)
Definition: time_integration.cpp:136
bool recenter_mem
Definition: fem.h:200
Fem(Settings &mySets, timing &t_prm)
Definition: fem.h:54
void compute_all(Settings &settings, spinAcc &spinAcc_solver, scal_fmm::fmm &myFMM, const double t)
Definition: fem.h:209
void saver(Settings &settings, timing const &t_prm, std::ofstream &fout, const int nt, std::vector< Eigen::Vector3d > &s) const
Definition: save.cpp:15
double vmax
Definition: fem.h:141
void energy(double const t, Settings &settings)
Definition: energy.cpp:5
Definition: linear_algebra.h:38
Definition: mesh.h:27
const Eigen::Vector3d getNode_p(const int i) const
Definition: mesh.h:144
void init_distrib(Settings const &mySets)
Definition: mesh.h:215
int getNbNodes(void) const
Definition: mesh.h:135
double readSol(bool VERBOSE, const std::string fileName)
Definition: read.cpp:173
void evolution(void)
Definition: mesh.h:180
Container for all the settings provided by the user, with conversions to/from YAML.
Definition: feellgoodSettings.h:73
int verbose
Definition: feellgoodSettings.h:135
bool spin_acc
Definition: feellgoodSettings.h:159
double initial_time
Definition: feellgoodSettings.h:195
std::string restoreFileName
Definition: feellgoodSettings.h:192
bool recenter
Definition: feellgoodSettings.h:144
Definition: chronometer.h:18
std::string millis()
Definition: chronometer.h:49
Definition: fmm_demag.h:58
void calc_demag(Mesh::mesh &msh)
Definition: fmm_demag.h:93
Definition: spinAccumulationSolver.h:23
bool compute(void)
Definition: spinAccumulationSolver.cpp:163
Definition: time_integration.h:6
void set_t(double _t)
Definition: time_integration.h:53
many settings to give some parameters to the solver, boundary conditions for the problem,...
const int NB_ENERGY_TERMS
Definition: fem.h:35
ENERGY_TYPE
Definition: fem.h:39
this header is the interface to scalfmm. Its purpose is to prepare an octree for the application of t...
secondary header, it grabs altogether the linear algebra by the solver to apply fem method It encap...
class mesh, readMesh is expecting a mesh file in gmsh format either text or binary,...
index
Definition: node.h:34
const int DIM
Definition: node.h:20