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