101 if (surf_elem_arete_.nb_dim() == 2)
return surf_elem_arete_;
102 int e, f, a, s, sb, i, j, k, d, D =
dimension, sgn;
106 double vecz[3] = { 0, 0, 1 };
109 for (i = 0, j = ea_d(e); j < ea_d(e + 1); i++, j++)
111 auto vec =
cross(D, 3, &xf(f = e_f(e, i), 0), vecz, &xe(e, 0));
112 for (sgn =
dot(&xs(f_s(f, 1), 0), &vec[0], &xs(f_s(f, 0), 0)) > 0 ? 1 : -1, d = 0; d < D; d++) surf_elem_arete_(j, d) = sgn * vec[d];
114 else for (i = 0; i < e_f.dimension(1) && (f = e_f(e, i)) >= 0; i++)
115 for (j = 0; j < f_s.dimension(1) && (s = f_s(f, j)) >= 0; j++)
117 sb = f_s(f, j + 1 < f_s.dimension(1) && f_s(f, j + 1) >= 0 ? j + 1 : 0);
118 a =
som_arete[s].at(sb), k = (int)(std::find(&e_a(e, 0), &e_a(e, 0) + ea_d(e + 1) - ea_d(e), a) - &e_a(e, 0) + ea_d(e));
119 auto vec =
cross(D, D, &xf(f, 0), &
xa_(a, 0), &xe(e, 0), &xe(e, 0));
120 for (sgn =
dot(&vec[0], &
ta_(a, 0)) >= 0 ? 1 : -1, d = 0; d < D; d++) surf_elem_arete_(k, d) += sgn * vec[d] / 2;
122 return surf_elem_arete_;
130 if (1e6 * std::abs(m(i, j, n)) < std::abs(m(i, i, n)) + std::abs(m(j, j, n))) m(i, j, n) = 0;
138 const DoubleVect& ve =
volumes();
139 int i, j, k, a, s, sb, n, N = nu ? nu->
dimension(1) : 1, e_nu = nu && nu->
dimension_tot(0) == 1 ? 0 : e, n_a = ea_d(e + 1) - ea_d(e), d, D =
dimension, idx;
140 double prefac, fac, beta = 1 || n_a == 3 * D - 3 ? 1. / D : D == 2 ? 1. / sqrt(2) : 1. / sqrt(3);
141 m1.
resize(n_a, n_a, N), m1 = 0;
142 DoubleTrav v_e(n_a, D), v_ea(n_a, n_a, D);
144 for (i = 0; i < n_a; i++)
145 for (a = e_a(e, i), s = a_s(a, 0), sb = a_s(a, 1), d = 0; d < D; d++) v_e(i, d) = (xs(sb, d) - xs(s, d)) / ve(e);
147 for (i = 0, idx = ea_d(e); i < n_a; i++, idx++)
148 for (a = e_a(e, i), s = a_s(a, 0), sb = a_s(a, 1), prefac = D * beta /
dot(&xs(sb, 0), &S_ea(idx, 0), &xs(s, 0)), j = 0; j < n_a; j++)
149 for (fac = prefac * ((j == i) -
dot(&S_ea(idx, 0), &v_e(j, 0))), d = 0; d < D; d++)
150 v_ea(i, j, d) = v_e(j, d) + fac * (xs(sb, d) - xs(s, d));
152 for (i = 0; i < n_a; i++)
153 for (j = 0; j < n_a; j++)
155 for (n = 0; n < N; n++) m1(i, j, n) = m1(j, i, n);
156 else for (k = 0, idx = ea_d(e); k < n_a; k++, idx++)
157 for (a = e_a(e, k), s = a_s(a, 0), sb = a_s(a, 1), fac =
dot(&xs(sb, 0), &S_ea(idx, 0), &xs(s, 0)) / D, n = 0; n < N; n++)
158 m1(i, j, n) += fac *
nu_dot(nu, e_nu, n, &v_ea(k, i, 0), &v_ea(k, j, 0));
167 const DoubleVect& ve =
volumes();
168 int i, j, k, a, s, sb, n, N = nu ? nu->
dimension(1) : 1, e_nu = nu && nu->
dimension_tot(0) == 1 ? 0 : e, n_a = ea_d(e + 1) - ea_d(e), d, D =
dimension, idx;
169 double prefac, fac, beta = n_a == 3 * D - 3 ? 1. / D : D == 2 ? 1. / sqrt(2) : 1. / sqrt(3);
172 for (i = 0, idx = ea_d(e); i < n_a; i++, idx++)
173 for (d = 0; d < D; d++) v_e(i, d) = S_ea(idx, d) / ve(e);
175 for (i = 0, idx = ea_d(e); i < n_a; i++, idx++)
176 for (a = e_a(e, i), s = a_s(a, 0), sb = a_s(a, 1), prefac = D * beta /
dot(&xs(sb, 0), &S_ea(idx, 0), &xs(s, 0)), j = 0; j < n_a; j++)
177 for (fac = prefac * ((j == i) -
dot(&xs(sb, 0), &v_e(j, 0), &xs(s, 0))), d = 0; d < D; d++)
178 v_ea(i, j, d) = v_e(j, d) + fac * S_ea(idx, d);
180 for (i = 0; i < n_a; i++)
181 for (j = 0; j < n_a; j++)
183 for (n = 0; n < N; n++) w1(i, j, n) = w1(j, i, n);
184 else for (k = 0, idx = ea_d(e); k < n_a; k++, idx++)
185 for (a = e_a(e, k), s = a_s(a, 0), sb = a_s(a, 1), fac =
dot(&xs(sb, 0), &S_ea(idx, 0), &xs(s, 0)) / D, n = 0; n < N; n++)
186 w1(i, j, n) += fac *
nu_dot(nu, e_nu, n, &v_ea(k, i, 0), &v_ea(k, j, 0));
const IntTab_t & aretes_som() const
renvoie le tableau de connectivite aretes/sommets.
const DoubleTab_t & coord_sommets() const
int_t elem_aretes(int_t i, int j) const
renvoie le numero de la jeme arete du ieme element.
double dot(const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
void W1(const DoubleTab *nu, int e, DoubleTab &w1, DoubleTab &v_e, DoubleTab &v_ea) const
const DoubleTab & surf_elem_arete() const
void M1(const DoubleTab *nu, int e, DoubleTab &m1) const
void discretiser() override
void calculer_volumes_entrelaces() override
void discretiser_aretes()
std::vector< std::map< int, int > > som_arete
void discretiser() override
double nu_dot(const DoubleTab *nu, int e, int n, const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
const IntTab & elem_arete_d() const
int nb_faces() const
renvoie le nombre global de faces.
IntTab & face_sommets() override
renvoie le tableau de connectivite faces/sommets.
DoubleVect volumes_entrelaces_
double volume_entrelace_axi(double r_face, double r_elem, double axis_length) const
IntTab & elem_faces()
renvoie le tableau de connectivite element/faces
std::array< double, 3 > cross(int dima, int dimb, const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
DoubleTab volumes_entrelaces_dir_
const Domaine & domaine() const