12 #pragma GCC diagnostic push
13 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
15 #pragma GCC diagnostic pop
25 using Edge = std::pair<int, int>;
37 bool simplified =
false )
47 { std::cout <<
" reindexed\n"; }
49 double xmin =
minNodes(Nodes::IDX_X);
50 double xmax =
maxNodes(Nodes::IDX_X);
52 double ymin =
minNodes(Nodes::IDX_Y);
53 double ymax =
maxNodes(Nodes::IDX_Y);
55 double zmin =
minNodes(Nodes::IDX_Z);
56 double zmax =
maxNodes(Nodes::IDX_Z);
58 l = Eigen::Vector3d(xmax - xmin, ymax - ymin, zmax - zmin);
59 c = Eigen::Vector3d(0.5 * (xmax + xmin), 0.5 * (ymax + ymin), 0.5 * (zmax + zmin));
66 long_axis = Nodes::IDX_X;
68 long_axis = Nodes::IDX_Z;
73 long_axis = Nodes::IDX_Y;
75 long_axis = Nodes::IDX_Z;
81 std::for_each(
tet.begin(),
tet.end(),
84 double vol_tet = te.calc_vol();
85 paramTetra[te.idxPrm].volume += vol_tet;
87 totalMagVol += vol_tet;
90 std::plus<>(), [](
const Tetra::prm ®ion){ return region.volume; });
95 volumeRegions[te.idxPrm].push_back(te.idx);
100 std::for_each(
tet.begin(),
tet.end(),
103 for (int i = 0; i < 3; ++i)
105 for (int j = i + 1; j < 4; ++j)
106 { edges.push_back(std::minmax(te.ind[i], te.ind[j])); }
109 std::sort(EXEC_POL,
edges.begin(),
edges.end());
110 auto last = std::unique(EXEC_POL,
edges.begin(),
edges.end());
112 edges.shrink_to_fit();
119 magTet.push_back(te.idx);
120 for (int i=0;i<4;i++)
121 { magNode[te.ind[i]] = true; }
125 for(
unsigned int i=0;i<tri.size();i++)
127 if (isMagnetic(tri[i]) && !mySets.paramTriangle[tri[i].idxPrm].suppress_charges)
128 { magTri.push_back(i); }
131 if(mySets.getFieldType() ==
R4toR3)
132 { setExtSpaceField(mySets); }
151 inline const Eigen::Vector3d
getNode_p(
const int i)
const {
return node[i].p; }
154 inline const Eigen::Vector3d
getNode_u(
const int i)
const {
return node[i].get_u(Nodes::NEXT); }
157 inline const Eigen::Vector3d
getNode_v(
const int i)
const {
return node[i].get_v(Nodes::NEXT); }
160 inline double getProj_ep(
const int i)
const {
return node[i].proj_ep();}
163 inline double getProj_eq(
const int i)
const {
return node[i].proj_eq();}
167 { node[i].d[Nodes::CURRENT].u = val; }
173 void infos(
void)
const;
178 std::for_each(EXEC_POL, node.begin(), node.end(),
183 inline void updateNode(
const int i,
const double vp,
const double vq,
const double dt)
184 { node[i].make_evol(vp*gamma0, vq*gamma0, dt); }
189 std::for_each(EXEC_POL, node.begin(), node.end(),
206 std::vector<Triangle::Tri>
tri;
209 std::vector<Tetra::Tet>
tet;
217 double readSol(
bool VERBOSE ,
218 const std::string& fileName );
224 for (
int nodeIdx = 0; nodeIdx < int(node.size()); ++nodeIdx)
227 n.
d[Nodes::NEXT].
phi = 0.;
228 n.
d[Nodes::NEXT].
phiv = 0.;
231 if (!magNode[nodeIdx])
233 n.
d[Nodes::CURRENT].
u = Eigen::Vector3d(NAN, NAN, NAN);
234 n.
d[Nodes::NEXT].
u = n.
d[Nodes::CURRENT].
u;
243 n.
d[Nodes::NEXT].
u = n.
d[Nodes::CURRENT].
u;
248 std::set<int> nodeRegions;
250 for (
size_t regIdx = 1; regIdx < volumeRegions.size(); ++regIdx)
252 const std::vector<int> ®ionTetras = volumeRegions[regIdx];
253 bool node_in_region = std::any_of(EXEC_POL,
254 regionTetras.begin(), regionTetras.end(),
255 [
this, nodeIdx](
const int tetIdx)
257 const Tetra::Tet &tetrahedron = tet[tetIdx];
258 for (int i = 0; i < Tetra::N; ++i)
260 if (tetrahedron.ind[i] == nodeIdx)
266 { nodeRegions.insert(regIdx); }
270 std::vector<std::string> region_names;
271 region_names.resize(nodeRegions.size());
272 std::transform(nodeRegions.begin(), nodeRegions.end(), region_names.begin(),
273 [
this](
const int regIdx){ return paramTetra[regIdx].regName; });
276 n.d[Nodes::NEXT].u = n.d[Nodes::CURRENT].u;
286 double thiele(
const int region )
const;
293 int region = -1 )
const;
298 double min_dot_product = std::transform_reduce(EXEC_POL, edges.begin(), edges.end(), 1.0,
299 [](
const double a,
const double b){ return std::min(a, b); },
300 [
this](
const Edge &edge)
302 Eigen::Vector3d m1 = getNode_u(edge.first);
303 Eigen::Vector3d m2 = getNode_u(edge.second);
306 return std::acos(min_dot_product);
315 void savesol(
const int precision ,
316 const std::string& fileName ,
317 const std::string &metadata ,
319 std::vector<Eigen::Vector3d> &s )
const;
323 inline void set(
const int i ,
324 const std::function<
void(
Nodes::Node &,
const double)>& what_to_set ,
326 { what_to_set(node[i], val); }
336 {
return (magNode[f.
ind[0]] && magNode[f.
ind[1]] && magNode[f.
ind[2]]); }
346 bool controlTriangles();
386 void checkMeshFile(
const Settings &mySets );
389 void readNodes(
const Settings &mySets );
392 void readTetraedrons(
const Settings &mySets );
395 void readTriangles(
const Settings &mySets );
398 void readMesh(
const Settings &mySets );
401 double doOnNodes(
const double init_val ,
403 const std::function<
bool(
double,
double)>& whatToDo )
const;
408 return doOnNodes(__DBL_MAX__, coord, [](
const double a,
const double b)
415 return doOnNodes(__DBL_MIN__, coord, [](
const double a,
const double b)
424 bool findErrInTriangle(
const int nbSurfTri,
const int nbTetraFaces,
425 const std::pair<int,int> pairIdVolRegs,
const int idSurfReg);
430 double surface(std::vector<int> &triIndices)
const;
434 void setExtSpaceField(
Settings &s );
const Eigen::Vector3d getNode_p(const int i) const
Definition: mesh.h:151
Eigen::Vector3d l
Definition: mesh.h:197
std::vector< int > magTet
Definition: mesh.h:358
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > extSpaceField
Definition: mesh.h:367
bool isMagnetic(const Tetra::Tet &t) const
Definition: mesh.h:332
const Eigen::Vector3d getNode_u(const int i) const
Definition: mesh.h:154
Eigen::Vector3d c
Definition: mesh.h:194
void set_node_zero_v(const int i)
Definition: mesh.h:170
void set_node_u0(const int i, const Eigen::Vector3d &val)
Definition: mesh.h:166
double max_angle() const
Definition: mesh.h:296
std::vector< Edge > edges
Definition: mesh.h:350
int getNbTris(void) const
Definition: mesh.h:145
int getNbNodes(void) const
Definition: mesh.h:142
std::vector< Nodes::Node > node
Definition: mesh.h:372
double minNodes(const Nodes::index coord) const
Definition: mesh.h:406
std::vector< bool > magNode
Definition: mesh.h:355
void init_distrib(const Settings &mySets)
Definition: mesh.h:222
mesh(Settings &mySets, bool simplified=false)
Definition: mesh.h:36
std::vector< std::vector< int > > volumeRegions
Definition: mesh.h:382
int getNodeIndex(const int i) const
Definition: mesh.h:329
bool isMagnetic(const Triangle::Tri &f)
Definition: mesh.h:335
double getProj_ep(const int i) const
Definition: mesh.h:160
void readMesh(const Settings &mySets)
Definition: read.cpp:12
std::vector< Tetra::Tet > tet
Definition: mesh.h:209
double maxNodes(const Nodes::index coord) const
Definition: mesh.h:413
int getNbTets(void) const
Definition: mesh.h:148
void sortNodes(Nodes::index long_axis)
Definition: mesh.cpp:252
std::vector< int > magTri
Definition: mesh.h:364
void set(const int i, const std::function< void(Nodes::Node &, const double)> &what_to_set, const double val)
Definition: mesh.h:323
mesh(const mesh &)=delete
void setBasis(const double r)
Definition: mesh.h:176
void evolution(void)
Definition: mesh.h:187
double totalMagVol
Definition: mesh.h:203
const Eigen::Vector3d getNode_v(const int i) const
Definition: mesh.h:157
std::vector< int > node_index
Definition: mesh.h:379
std::vector< Tetra::prm > & paramTetra
Definition: mesh.h:212
double getProj_eq(const int i) const
Definition: mesh.h:163
void updateNode(const int i, const double vp, const double vq, const double dt)
Definition: mesh.h:183
bool controlTriangles()
Definition: mesh.cpp:121
double vol
Definition: mesh.h:200
std::vector< Triangle::Tri > tri
Definition: mesh.h:206
mesh & operator=(const mesh &)=delete
Container for all the settings provided by the user, with conversions to/from YAML.
Definition: settings.h:70
Eigen::Vector3d getMagnetization(const Eigen::Ref< const Eigen::Vector3d > p) const
Definition: settings.h:267
int verbose
Definition: settings.h:136
mag_exprType getMagType() const
Definition: settings.h:255
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:25
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 ...