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 <fstream>
12 #include <iostream>
13 #include <list>
14 #include <vector>
15 
16 #include <sys/times.h>
17 
18 #include "mesh.h"
19 #include "fmm_demag.h"
20 #include "spinAccumulationSolver.h"
21 #include "linear_algebra.h"
22 #include "chronometer.h"
23 #include "ANN/ANN.h"
24 #include "settings.h"
25 
27 const int NB_ENERGY_TERMS = 4;
28 
31  {
32  EXCHANGE = 0,
33  ANISOTROPY = 1,
34  DEMAG = 2,
35  ZEEMAN = 3
36  };
37 
42 class Fem
43  {
44 public:
46  inline Fem(Settings &mySets, timing &t_prm) : msh(mySets)
47  {
48  vmax = 0.0;
49  std::fill(E.begin(),E.end(),0);
50  Etot0 = INFINITY; // avoid "WARNING: energy increased" on first time step
51  Etot = 0.0;
52 
53  recenter_mem = false;
54  if (mySets.recenter)
55  {
56  if (mySets.verbose)
57  {
58  std::cout << "Approximate nearest neighbors:\n";
59  }
60 
61  pts = annAllocPts(msh.getNbNodes(), Nodes::DIM);
62  if (!pts)
63  {
64  std::cerr << "ANN memory error while allocating points\n";
65  SYSTEM_ERROR;
66  }
67  else if (mySets.verbose)
68  {
69  std::cout << " points allocated\n";
70  }
71 
72  for (int i = 0; i < msh.getNbNodes(); i++)
73  {
74  this->pts[i][0] = msh.getNode_p(i).x();
75  this->pts[i][1] = msh.getNode_p(i).y();
76  this->pts[i][2] = msh.getNode_p(i).z();
77  }
78 
79  if (mySets.verbose)
80  {
81  std::cout << " building kd_tree\n";
82  }
83 
84  kdtree = new ANNkd_tree(pts, msh.getNbNodes(), Nodes::DIM);
85  if (!kdtree)
86  {
87  std::cerr << "ANN memory error while allocating kd_tree\n";
88  SYSTEM_ERROR;
89  }
90  recenter_mem = true;
91 
92  if (mySets.verbose)
93  {
94  std::cout << " kd_tree allocated\n";
95  }
96  }
97  else if (mySets.verbose)
98  {
99  std::cout << "No recentering.\n";
100  }
101 
102  if (mySets.restoreFileName == "")
103  {
104  msh.init_distrib();
105  }
106  else
107  {
108  t_prm.set_t(msh.readSol(mySets.verbose, mySets.restoreFileName));
109  }
110 
111  /* This potentially overrides the initial time set above by msh.readSol(). */
112  if (!isnan(mySets.initial_time))
113  {
114  t_prm.set_t(mySets.initial_time);
115  }
116 
117  if (mySets.recenter)
118  {
119  direction(Nodes::IDX_Z);
120  } /* DW propagation direction for recentering */
121  }
122 
125  {
126  if (recenter_mem)
127  {
128  annDeallocPts(pts);
129  delete kdtree;
130  }
131  }
132 
134  double vmax;
135 
137  std::array<double,NB_ENERGY_TERMS> E;
138 
140  double DW_dir;
141 
143  double Etot0;
144 
146  double Etot;
147 
150 
152  void energy(const double t
154  ,Settings &settings );
155 
159  inline void evolution(void)
160  {
161  msh.evolution();
162  Etot0 = Etot;
163  }
164 
166  void saver(Settings &settings , const timing &t_prm ,
167  std::ofstream &fout , const int nt ,
168  std::vector<Eigen::Vector3d> &s ) const;
169 
181  bool recenter(double thres ,
182  char recentering_direction );
183 
185  int time_integration(Settings &settings ,
186  LinAlgebra &linAlg ,
187  spinAcc &spinAcc_solver ,
188  scal_fmm::fmm &myFMM ,
189  timing &t_prm ,
190  int &nt );
191 
192 private:
194  ANNkd_tree *kdtree;
196  ANNpointArray pts;
199  void direction(enum Nodes::index idx_dir );
200 
203  void compute_all(Settings &settings , spinAcc &spinAcc_solver ,
204  scal_fmm::fmm &myFMM , const double t )
205  {
206  bool success(false);
207  chronometer fmm_counter(2);
208  myFMM.calc_demag(msh);
209  if (settings.spin_acc && spinAcc_solver.compute())
210  { success = true; }
211  if (settings.verbose)
212  {
213  std::cout << "magnetostatics done in " << fmm_counter.millis() << "\n";
214  if (settings.spin_acc)
215  {
216  if (success)
217  { std::cout << "spin diffusion solved.\n"; }
218  else
219  { std::cerr << "spin diffusion solver failed.\n"; }
220  }
221  }
222  energy(t, settings);
223  evolution();
224  }
225  }; // end class
226 
227 #endif
Definition: fem.h:43
double Etot
Definition: fem.h:146
void direction(enum Nodes::index idx_dir)
Definition: recentering.cpp:7
void evolution(void)
Definition: fem.h:159
std::array< double, NB_ENERGY_TERMS > E
Definition: fem.h:137
double Etot0
Definition: fem.h:143
Mesh::mesh msh
Definition: fem.h:149
bool recenter(double thres, char recentering_direction)
Definition: recentering.cpp:47
ANNpointArray pts
Definition: fem.h:196
ANNkd_tree * kdtree
Definition: fem.h:194
void energy(const double t, Settings &settings)
Definition: energy.cpp:5
~Fem()
Definition: fem.h:124
double DW_dir
Definition: fem.h:140
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:193
Fem(Settings &mySets, timing &t_prm)
Definition: fem.h:46
void compute_all(Settings &settings, spinAcc &spinAcc_solver, scal_fmm::fmm &myFMM, const double t)
Definition: fem.h:203
void saver(Settings &settings, const timing &t_prm, std::ofstream &fout, const int nt, std::vector< Eigen::Vector3d > &s) const
Definition: save.cpp:13
double vmax
Definition: fem.h:134
Definition: linear_algebra.h:35
Definition: mesh.h:34
const Eigen::Vector3d getNode_p(const int i) const
Definition: mesh.h:153
double readSol(bool VERBOSE, const std::string &fileName)
Definition: read.cpp:199
void init_distrib()
Definition: mesh.h:221
int getNbNodes(void) const
Definition: mesh.h:144
void evolution(void)
Definition: mesh.h:189
Container for all the settings provided by the user, with conversions to/from YAML.
Definition: settings.h:70
int verbose
Definition: settings.h:136
bool spin_acc
Definition: settings.h:160
double initial_time
Definition: settings.h:196
std::string restoreFileName
Definition: settings.h:193
bool recenter
Definition: settings.h:145
Definition: chronometer.h:18
std::string millis()
Definition: chronometer.h:49
Definition: fmm_demag.h:60
void calc_demag(Mesh::mesh &msh)
Definition: fmm_demag.h:96
Definition: spinAccumulationSolver.h:23
bool compute(void)
Definition: spinAccumulationSolver.cpp:151
Definition: time_integration.h:7
void set_t(const double _t)
Definition: time_integration.h:54
const int NB_ENERGY_TERMS
Definition: fem.h:27
ENERGY_TYPE
Definition: fem.h:31
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:33
const int DIM
Definition: node.h:19
many settings to give some parameters to the solver, boundary conditions for the problem,...