12 #pragma GCC diagnostic push
13 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
15 #pragma GCC diagnostic pop
27 using Edge = std::pair<int, int>;
39 bool simplified =
false )
49 { std::cout <<
" reindexed\n"; }
51 double xmin =
minNodes(Nodes::IDX_X);
52 double xmax =
maxNodes(Nodes::IDX_X);
54 double ymin =
minNodes(Nodes::IDX_Y);
55 double ymax =
maxNodes(Nodes::IDX_Y);
57 double zmin =
minNodes(Nodes::IDX_Z);
58 double zmax =
maxNodes(Nodes::IDX_Z);
60 l = Eigen::Vector3d(xmax - xmin, ymax - ymin, zmax - zmin);
61 c = Eigen::Vector3d(0.5 * (xmax + xmin), 0.5 * (ymax + ymin), 0.5 * (zmax + zmin));
68 long_axis = Nodes::IDX_X;
70 long_axis = Nodes::IDX_Z;
75 long_axis = Nodes::IDX_Y;
77 long_axis = Nodes::IDX_Z;
83 std::for_each(
tet.begin(),
tet.end(),
86 double vol_tet = te.calc_vol();
87 settings.paramTetra[te.idxPrm].volume += vol_tet;
89 totalMagVol += vol_tet;
92 std::plus<>(), [](
const Tetra::prm ®ion){ return region.volume; });
97 volumeRegions[te.idxPrm].push_back(te.idx);
102 std::for_each(
tet.begin(),
tet.end(),
105 for (int i = 0; i < 3; ++i)
107 for (int j = i + 1; j < 4; ++j)
108 { edges.push_back(std::minmax(te.ind[i], te.ind[j])); }
111 std::sort(EXEC_POL,
edges.begin(),
edges.end());
112 auto last = std::unique(EXEC_POL,
edges.begin(),
edges.end());
114 edges.shrink_to_fit();
121 magTet.push_back(te.idx);
122 for (int i=0;i<4;i++)
123 { magNode[te.ind[i]] = true; }
127 for(
unsigned int i=0;i<tri.size();i++)
129 if (isMagnetic(tri[i]) && !settings.paramTriangle[tri[i].idxPrm].suppress_charges)
130 { magTri.push_back(i); }
133 if(settings.getFieldType() ==
R4toR3)
134 { setExtSpaceField(); }
153 inline const Eigen::Vector3d
getNode_p(
const int i)
const {
return node[i].p; }
156 inline const Eigen::Vector3d
getNode_u(
const int i)
const {
return node[i].get_u(Nodes::NEXT); }
159 inline const Eigen::Vector3d
getNode_v(
const int i)
const {
return node[i].get_v(Nodes::NEXT); }
162 inline double getProj_ep(
const int i)
const {
return node[i].proj_ep();}
165 inline double getProj_eq(
const int i)
const {
return node[i].proj_eq();}
169 { node[i].d[Nodes::CURRENT].u = val; }
175 void infos(
void)
const;
180 std::for_each(EXEC_POL, node.begin(), node.end(),
185 inline void updateNode(
const int i,
const double vp,
const double vq,
const double dt)
186 { node[i].make_evol(vp*gamma0, vq*gamma0, dt); }
191 std::for_each(EXEC_POL, node.begin(), node.end(),
208 std::vector<Triangle::Tri>
tri;
211 std::vector<Tetra::Tet>
tet;
216 double readSol(
bool VERBOSE ,
217 const std::string& fileName );
223 for (
int nodeIdx = 0; nodeIdx < int(node.size()); ++nodeIdx)
226 n.
d[Nodes::NEXT].
phi = 0.;
227 n.
d[Nodes::NEXT].
phiv = 0.;
230 if (!magNode[nodeIdx])
232 n.
d[Nodes::CURRENT].
u = Eigen::Vector3d(NAN, NAN, NAN);
233 n.
d[Nodes::NEXT].
u = n.
d[Nodes::CURRENT].
u;
241 n.
d[Nodes::CURRENT].
u = settings.getMagnetization(n.
p);
242 n.
d[Nodes::NEXT].
u = n.
d[Nodes::CURRENT].
u;
247 std::set<int> nodeRegions;
249 for (
size_t regIdx = 1; regIdx < volumeRegions.size(); ++regIdx)
251 const std::vector<int> ®ionTetras = volumeRegions[regIdx];
252 bool node_in_region = std::any_of(EXEC_POL,
253 regionTetras.begin(), regionTetras.end(),
254 [
this, nodeIdx](
const int tetIdx)
256 const Tetra::Tet &tetrahedron = tet[tetIdx];
257 for (int i = 0; i < Tetra::N; ++i)
259 if (tetrahedron.ind[i] == nodeIdx)
265 { nodeRegions.insert(regIdx); }
269 std::vector<std::string> region_names;
270 region_names.resize(nodeRegions.size());
271 std::transform(nodeRegions.begin(), nodeRegions.end(), region_names.begin(),
272 [
this](
const int regIdx){ return settings.paramTetra[regIdx].regName; });
274 n.d[Nodes::CURRENT].u = settings.getMagnetization(n.p, region_names);
275 n.d[Nodes::NEXT].u = n.d[Nodes::CURRENT].u;
285 double thiele(
const int region )
const;
292 int region = -1 )
const;
297 double min_dot_product = std::transform_reduce(EXEC_POL, edges.begin(), edges.end(), 1.0,
298 [](
const double a,
const double b){ return std::min(a, b); },
299 [
this](
const Edge &edge)
301 Eigen::Vector3d m1 = getNode_u(edge.first);
302 Eigen::Vector3d m2 = getNode_u(edge.second);
305 return std::acos(min_dot_product);
314 void savesol(
const int precision ,
315 const std::string& fileName ,
316 const std::string &metadata ,
318 std::vector<Eigen::Vector3d> &s )
const;
322 inline void set(
const int i ,
323 const std::function<
void(
Nodes::Node &,
const double)>& what_to_set ,
325 { what_to_set(node[i], val); }
332 {
return (settings.paramTetra[t.
idxPrm].Ms > 0); }
336 {
return (magNode[f.
ind[0]] && magNode[f.
ind[1]] && magNode[f.
ind[2]]); }
349 bool controlTriangles();
392 void checkMeshFile();
398 void readTetraedrons();
401 void readTriangles();
407 double doOnNodes(
const double init_val ,
409 const std::function<
bool(
double,
double)>& whatToDo )
const;
414 return doOnNodes(__DBL_MAX__, coord, [](
const double a,
const double b)
421 return doOnNodes(__DBL_MIN__, coord, [](
const double a,
const double b)
431 bool diffTriHandler(
const size_t inf,
const size_t sup,
const std::vector<BasicTri> &allTriCtnr,
432 std::vector<size_t> &indNodTriToAdd, std::vector<std::pair<int,int>> ®sTriToAdd);
435 bool assertNoErrInTriangle(
const int nbSurfTri,
const int nbTetraFaces,
436 const std::pair<int,int> pairIdVolRegs,
const int idSurfReg);
441 double surface(std::vector<int> &triIndices)
const;
445 void setExtSpaceField();
const Eigen::Vector3d getNode_p(const int i) const
Definition: mesh.h:153
Eigen::Vector3d l
Definition: mesh.h:199
std::vector< int > magTet
Definition: mesh.h:361
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > extSpaceField
Definition: mesh.h:370
bool isMagnetic(const Tetra::Tet &t) const
Definition: mesh.h:331
const Eigen::Vector3d getNode_u(const int i) const
Definition: mesh.h:156
Eigen::Vector3d c
Definition: mesh.h:196
void init_distrib()
Definition: mesh.h:221
void set_node_zero_v(const int i)
Definition: mesh.h:172
void set_node_u0(const int i, const Eigen::Vector3d &val)
Definition: mesh.h:168
void readMesh()
Definition: read.cpp:12
double max_angle() const
Definition: mesh.h:295
std::vector< Edge > edges
Definition: mesh.h:353
int getNbTris(void) const
Definition: mesh.h:147
int getNbNodes(void) const
Definition: mesh.h:144
std::vector< Nodes::Node > node
Definition: mesh.h:378
double minNodes(const Nodes::index coord) const
Definition: mesh.h:412
std::vector< bool > magNode
Definition: mesh.h:358
mesh(Settings &mySets, bool simplified=false)
Definition: mesh.h:38
std::vector< std::vector< int > > volumeRegions
Definition: mesh.h:388
Settings & settings
Definition: mesh.h:374
int getNodeIndex(const int i) const
Definition: mesh.h:328
bool isMagnetic(const Triangle::Tri &f)
Definition: mesh.h:335
double getProj_ep(const int i) const
Definition: mesh.h:162
std::vector< Tetra::Tet > tet
Definition: mesh.h:211
double maxNodes(const Nodes::index coord) const
Definition: mesh.h:419
int getNbTets(void) const
Definition: mesh.h:150
void sortNodes(Nodes::index long_axis)
Definition: mesh.cpp:334
std::vector< int > magTri
Definition: mesh.h:367
void set(const int i, const std::function< void(Nodes::Node &, const double)> &what_to_set, const double val)
Definition: mesh.h:322
mesh(const mesh &)=delete
void setBasis(const double r)
Definition: mesh.h:178
void evolution(void)
Definition: mesh.h:189
double totalMagVol
Definition: mesh.h:205
const Eigen::Vector3d getNode_v(const int i) const
Definition: mesh.h:159
std::vector< int > node_index
Definition: mesh.h:385
double getProj_eq(const int i) const
Definition: mesh.h:165
void updateNode(const int i, const double vp, const double vq, const double dt)
Definition: mesh.h:185
bool controlTriangles()
Definition: mesh.cpp:121
double vol
Definition: mesh.h:202
std::vector< Triangle::Tri > tri
Definition: mesh.h:208
mesh & operator=(const mesh &)=delete
Container for all the settings provided by the user, with conversions to/from YAML.
Definition: settings.h:70
int verbose
Definition: settings.h:136
std::vector< Tetra::prm > paramTetra
Definition: settings.h:208
Definition: triangle.h:109
int idxPrm
Definition: element.h:56
std::array< int, N > ind
Definition: element.h:53
std::pair< int, int > Edge
Definition: mesh.h:27
index
Definition: node.h:33
constexpr double a[N][NPI]
Definition: tetra.h:68
header to define struct Node
many settings to give some parameters to the solver, boundary conditions for the problem,...
@ R4toR3
Definition: settings.h:43
@ POSITION_ONLY
M(x, y, z)
Definition: settings.h:26
Eigen::Vector3d p
Definition: node.h:61
dataNode d[NB_DATANODE]
Definition: node.h:70
double phi
Definition: node.h:51
double phiv
Definition: node.h:52
Eigen::Vector3d u
Definition: node.h:49
namespace Tetra header containing Tet class, some constants, and integrales
contains namespace Triangle header containing Tri class, and some constants and a less_than operator ...