18 #include "spinTransferTorque.h"
23 for (
int ie = 0; ie <
Tetra::N; ie++)
25 for (
int je = 0; je <
Tetra::N; je++)
27 double val = Ke[ie][je];
29 { K.push_back( Eigen::Triplet(tet.
ind[ie], tet.
ind[je], val) ); }
38 { L(fac.
ind[ie]) += Le[ie]; }
49 for (
int ie = 0; ie <
Tetra::N; ie++)
51 double dai_dx = tet.
da(ie,Nodes::IDX_X);
52 double dai_dy = tet.
da(ie,Nodes::IDX_Y);
53 double dai_dz = tet.
da(ie,Nodes::IDX_Z);
55 for (
int je = 0; je <
Tetra::N; je++)
57 double daj_dx = tet.
da(je,Nodes::IDX_X);
58 double daj_dy = tet.
da(je,Nodes::IDX_Y);
59 double daj_dz = tet.
da(je,Nodes::IDX_Z);
60 AE[ie][je] += sigma * (dai_dx * daj_dx + dai_dy * daj_dy + dai_dz * daj_dz) *
w;
101 std::cout <<
"Dirichlet boundary conditions..." << std::endl;
105 bool has_converged =
solve(_tol);
112 std::cout <<
"writing electrostatic potential solutions to file " <<
fileName
118 std::cout <<
"file " <<
fileName <<
" status : " << iznogood << std::endl;
124 Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> _gradV;
125 calc_gradV(tet, _gradV);
126 gradV.push_back(_gradV);
128 Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> _Hm;
129 calc_Hm(tet, _gradV, _Hm);
136 std::cerr <<
"Solver (STT) has not converged" << std::endl;
146 Eigen::Vector3d
v(0,0,0);
149 v +=
V[tet.
ind[i]] * tet.
da.row(i);
156 void calc_Hm(
Tetra::Tet const &tet, Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> _gradV,
157 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> _Hm)
const
159 Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> p_g;
163 { _Hm.col(npi) = -
p_stt.
sigma * _gradV.col(npi).cross(p_g.col(npi)); }
174 const int _idx = tet.idx;
175 tet.extraField = [this, _idx](Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> H)
177 for(int npi = 0; npi<Tetra::NPI; npi++) { H.col(npi) += Hm[_idx].col(npi); }
180 tet.
extraCoeffs_BE = [
this, &tet](
double Js, Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> U,
181 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> dUdx,
182 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> dUdy,
183 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> dUdz,
184 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::N>> BE)
186 const double prefactor = D0 / Nodes::sq(p_stt.lJ) / (gamma0*Js/mu0);
187 for (int npi = 0; npi < Tetra::NPI; npi++)
189 Eigen::Vector3d const &_gV = gradV[tet.idx].col(npi);
190 Eigen::Vector3d j_grad_u =
192 * Eigen::Vector3d(_gV.dot( Eigen::Vector3d(dUdx(Nodes::IDX_X,npi), dUdy(Nodes::IDX_X,npi), dUdz(Nodes::IDX_X,npi))),
193 _gV.dot( Eigen::Vector3d(dUdx(Nodes::IDX_Y,npi), dUdy(Nodes::IDX_Y,npi), dUdz(Nodes::IDX_Y,npi))),
194 _gV.dot( Eigen::Vector3d(dUdx(Nodes::IDX_Z,npi), dUdy(Nodes::IDX_Z,npi), dUdz(Nodes::IDX_Z,npi))));
196 Eigen::Vector3d m = pf * (ksi * j_grad_u + U.col(npi).cross(j_grad_u));
197 for (int i = 0; i < Tetra::N; i++)
199 const double ai_w = tet.weight[npi] * Tetra::a[i][npi];
200 BE.col(i) += ai_w*(Hm[tet.idx].col(npi) + prefactor*m);
237 std::vector<double>
V;
240 std::vector< Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> >
gradV;
244 std::vector< Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> >
Hm;
249 std::cout <<
"sigma: " << p_stt.
sigma << std::endl;
252 [](std::pair<std::string, double>
const &p)
253 { std::cout <<
"regName: " << p.first <<
"\tV :" << p.second << std::endl; });
257 void prepareData(std::vector<Eigen::Triplet<double>> &Kw, Eigen::Ref<Eigen::VectorXd> Lw)
259 const double sigma = p_stt.
sigma;
261 std::for_each(msh.
tet.begin(), msh.
tet.end(),
264 double K[Tetra::N][Tetra::N] = {{0}};
273 [&pot_val](
auto const &it) { pot_val += it.second; });
276 std::for_each(msh.
fac.begin(), msh.
fac.end(),
279 std::vector<double> L(Facette::N);
280 integrales(fac, pot_val, L);
281 assembling_vect(fac, L, Lw);
291 std::vector<Eigen::Triplet<double>> Kw;
292 Eigen::VectorXd Lw = Eigen::VectorXd::Zero(NOD);
295 Eigen::VectorXd Xw(NOD);
299 { std::cout <<
"line weighting..." << std::endl; }
301 Eigen::SparseMatrix<double> Kr(NOD,NOD);
302 Kr.setFromTriplets(Kw.begin(),Kw.end());
303 std::vector<double> maxRow(NOD,0);
306 for(
int i=0;i<NOD;i++)
308 for(
int k=0;k<Kr.outerSize();++k)
309 for(Eigen::SparseMatrix<double>::InnerIterator it(Kr,k); it; ++it)
310 {
if((it.row() == i)&&(fabs(it.value()) > maxRow[i])) { maxRow[i] = fabs(it.value()); } }
313 for (
int i = 0; i < NOD; i++)
315 double norme = maxRow[i];
322 { std::cout <<
"solving ..." << std::endl; }
324 Eigen::BiCGSTAB<Eigen::SparseMatrix<double>> _solver;
326 _solver.setTolerance(_tol);
327 _solver.setMaxIterations(MAXITER);
330 Eigen::VectorXd sol = _solver.solve(Lw);
331 for (
int i=0;i<NOD;i++)
333 return (_solver.iterations() < MAXITER);
int getNbNodes(void) const
Definition: mesh.h:74
void savesol(const int precision, const std::string fileName, std::string const &metadata) const
Definition: save.cpp:127
std::vector< Tetra::Tet > tet
Definition: mesh.h:137
std::vector< Facette::Fac > fac
Definition: mesh.h:134
void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: tetra.h:320
std::function< void(double Js, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> U, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dUdx, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dUdy, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dUdz, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, N >> BE)> extraCoeffs_BE
Definition: tetra.h:317
Eigen::Matrix< double, N, Nodes::DIM > da
Definition: tetra.h:169
Definition: electrostatSolver.h:81
int solve(const double _tol)
Definition: electrostatSolver.h:287
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > Hm
Definition: electrostatSolver.h:244
const std::string fileName
Definition: electrostatSolver.h:233
const bool verbose
Definition: electrostatSolver.h:224
const int precision
Definition: electrostatSolver.h:230
const unsigned int MAXITER
Definition: electrostatSolver.h:227
Mesh::mesh msh
Definition: electrostatSolver.h:218
double D0
Definition: electrostatSolver.h:211
electrostatSolver(Mesh::mesh const &_msh, STT const &_p_stt, const double _tol, const bool v, const int max_iter, const std::string _fileName)
Definition: electrostatSolver.h:84
std::vector< double > V
Definition: electrostatSolver.h:237
void prepareExtras(void)
Definition: electrostatSolver.h:168
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > gradV
Definition: electrostatSolver.h:240
double ksi
Definition: electrostatSolver.h:208
STT p_stt
Definition: electrostatSolver.h:221
void infos(void)
Definition: electrostatSolver.h:247
double pf
Definition: electrostatSolver.h:214
void calc_gradV(Tetra::Tet const &tet, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> _gradV) const
Definition: electrostatSolver.h:142
void prepareData(std::vector< Eigen::Triplet< double >> &Kw, Eigen::Ref< Eigen::VectorXd > Lw)
Definition: electrostatSolver.h:257
void calc_Hm(Tetra::Tet const &tet, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> _gradV, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> _Hm) const
Definition: electrostatSolver.h:156
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:48
std::vector< int > ind
Definition: element.h:42
void integrales(Tetra::Tet const &tet, double sigma, double AE[Tetra::N][Tetra::N])
Definition: electrostatSolver.h:43
void assembling_vect(Facette::Fac const &fac, std::vector< double > const &Le, Eigen::Ref< Eigen::VectorXd > L)
Definition: electrostatSolver.h:35
void assembling_mat(Tetra::Tet const &tet, double Ke[Tetra::N][Tetra::N], std::vector< Eigen::Triplet< double >> &K)
Definition: electrostatSolver.h:21
contains namespace Facette header containing Fac class, and some constants and a less_than operator t...
principal header, contains the struct fem This file is called by many source files in feellgood....
class mesh, readMesh is expecting a mesh file in gmsh format either text or binary,...
const int N
Definition: facette.h:17
constexpr double v[NPI]
Definition: facette.h:22
const int NPI
Definition: facette.h:18
constexpr double a[N][NPI]
Definition: facette.h:28
double sq(const double x)
Definition: node.h:42
const int NPI
Definition: tetra.h:23
const int N
Definition: tetra.h:22
constexpr double w[NPI]
Definition: tetra.h:36
Definition: spinTransferTorque.h:13
double sigma
Definition: spinTransferTorque.h:21
double lsf
Definition: spinTransferTorque.h:27
double beta
Definition: spinTransferTorque.h:15
double lJ
Definition: spinTransferTorque.h:24
double N0
Definition: spinTransferTorque.h:18
std::vector< std::pair< std::string, double > > boundaryCond
Definition: spinTransferTorque.h:36
bool V_file
Definition: spinTransferTorque.h:31
namespace Tetra header containing Tet class, some constants, and integrales