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]; }
73 std::cout <<
"Dirichlet boundary conditions..." << std::endl;
77 bool has_converged =
solve(_tol);
84 std::cout <<
"writing electrostatic potential solutions to file " <<
fileName
90 std::cout <<
"file " <<
fileName <<
" status : " << iznogood << std::endl;
96 Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> _gradV;
97 calc_gradV(tet, _gradV);
98 gradV.push_back(_gradV);
100 Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> _Hm;
101 calc_Hm(tet, _gradV, _Hm);
108 std::cerr <<
"Solver (STT) has not converged" << std::endl;
118 Eigen::Vector3d
v(0,0,0);
121 v +=
V[tet.
ind[i]] * tet.
da.row(i);
128 void calc_Hm(
Tetra::Tet const &tet, Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> _gradV,
129 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> _Hm)
const
131 Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> p_g;
135 { _Hm.col(npi) = -
p_stt.
sigma * _gradV.col(npi).cross(p_g.col(npi)); }
146 const int _idx = tet.idx;
147 tet.extraField = [this, _idx](Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> H)
149 for(int npi = 0; npi<Tetra::NPI; npi++) { H.col(npi) += Hm[_idx].col(npi); }
152 tet.
extraCoeffs_BE = [
this, &tet](
double Js, Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> U,
153 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> dUdx,
154 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> dUdy,
155 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> dUdz,
156 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::N>> BE)
158 const double prefactor = D0 / Nodes::sq(p_stt.lJ) / (gamma0*Js/mu0);
159 for (int npi = 0; npi < Tetra::NPI; npi++)
161 Eigen::Vector3d const &_gV = gradV[tet.idx].col(npi);
162 Eigen::Vector3d j_grad_u =
164 * Eigen::Vector3d(_gV.dot( Eigen::Vector3d(dUdx(Nodes::IDX_X,npi), dUdy(Nodes::IDX_X,npi), dUdz(Nodes::IDX_X,npi))),
165 _gV.dot( Eigen::Vector3d(dUdx(Nodes::IDX_Y,npi), dUdy(Nodes::IDX_Y,npi), dUdz(Nodes::IDX_Y,npi))),
166 _gV.dot( Eigen::Vector3d(dUdx(Nodes::IDX_Z,npi), dUdy(Nodes::IDX_Z,npi), dUdz(Nodes::IDX_Z,npi))));
168 Eigen::Vector3d m = pf * (ksi * j_grad_u + U.col(npi).cross(j_grad_u));
169 for (int i = 0; i < Tetra::N; i++)
171 const double ai_w = tet.weight[npi] * Tetra::a[i][npi];
172 BE.col(i) += ai_w*(Hm[tet.idx].col(npi) + prefactor*m);
209 std::vector<double>
V;
212 std::vector< Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> >
gradV;
216 std::vector< Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> >
Hm;
221 std::cout <<
"sigma: " << p_stt.
sigma << std::endl;
224 [](std::pair<std::string, double>
const &p)
225 { std::cout <<
"regName: " << p.first <<
"\tV :" << p.second << std::endl; });
229 void prepareData(std::vector<Eigen::Triplet<double>> &Kw, Eigen::Ref<Eigen::VectorXd> Lw)
231 const double sigma = p_stt.
sigma;
233 std::for_each(msh.
tet.begin(), msh.
tet.end(),
236 double K[Tetra::N][Tetra::N] = {{0}};
245 [&pot_val](
auto const &it) { pot_val += it.second; });
248 std::for_each(msh.
fac.begin(), msh.
fac.end(),
251 std::vector<double> L(Facette::N);
252 integrales(fac, pot_val, L);
253 assembling_vect(fac, L, Lw);
263 std::vector<Eigen::Triplet<double>> Kw;
264 Eigen::VectorXd Lw = Eigen::VectorXd::Zero(NOD);
267 Eigen::VectorXd Xw(NOD);
271 { std::cout <<
"line weighting..." << std::endl; }
273 Eigen::SparseMatrix<double> Kr(NOD,NOD);
274 Kr.setFromTriplets(Kw.begin(),Kw.end());
275 std::vector<double> maxRow(NOD,0);
278 for(
int i=0;i<NOD;i++)
280 for(
int k=0;k<Kr.outerSize();++k)
281 for(Eigen::SparseMatrix<double>::InnerIterator it(Kr,k); it; ++it)
282 {
if((it.row() == i)&&(fabs(it.value()) > maxRow[i])) { maxRow[i] = fabs(it.value()); } }
285 for (
int i = 0; i < NOD; i++)
287 double norme = maxRow[i];
294 { std::cout <<
"solving ..." << std::endl; }
296 Eigen::BiCGSTAB<Eigen::SparseMatrix<double>> _solver;
298 _solver.setTolerance(_tol);
299 _solver.setMaxIterations(MAXITER);
302 Eigen::VectorXd sol = _solver.solve(Lw);
303 for (
int i=0;i<NOD;i++)
305 return (_solver.iterations() < MAXITER);
int getNbNodes(void) const
Definition: mesh.h:98
void savesol(const int precision, const std::string fileName, std::string const &metadata) const
Definition: save.cpp:153
std::vector< Tetra::Tet > tet
Definition: mesh.h:162
std::vector< Facette::Fac > fac
Definition: mesh.h:159
void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: tetra.h:321
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:318
Eigen::Matrix< double, N, Nodes::DIM > da
Definition: tetra.h:169
Definition: electrostatSolver.h:53
int solve(const double _tol)
Definition: electrostatSolver.h:259
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > Hm
Definition: electrostatSolver.h:216
const std::string fileName
Definition: electrostatSolver.h:205
const bool verbose
Definition: electrostatSolver.h:196
const int precision
Definition: electrostatSolver.h:202
const unsigned int MAXITER
Definition: electrostatSolver.h:199
Mesh::mesh msh
Definition: electrostatSolver.h:190
double D0
Definition: electrostatSolver.h:183
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:56
std::vector< double > V
Definition: electrostatSolver.h:209
void prepareExtras(void)
Definition: electrostatSolver.h:140
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > gradV
Definition: electrostatSolver.h:212
double ksi
Definition: electrostatSolver.h:180
STT p_stt
Definition: electrostatSolver.h:193
void infos(void)
Definition: electrostatSolver.h:219
double pf
Definition: electrostatSolver.h:186
void calc_gradV(Tetra::Tet const &tet, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> _gradV) const
Definition: electrostatSolver.h:114
void prepareData(std::vector< Eigen::Triplet< double >> &Kw, Eigen::Ref< Eigen::VectorXd > Lw)
Definition: electrostatSolver.h:229
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:128
std::vector< int > ind
Definition: element.h:44
void integrales(Tetra::Tet const &tet, double sigma, double AE[Tetra::N][Tetra::N])
Definition: electrostatSolver.cpp:3
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
double sq(const double x)
Definition: node.h:42
const int NPI
Definition: tetra.h:23
const int N
Definition: tetra.h:22
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