55 const IntTab& elem_faces = domaine_VEF.
elem_faces();
58 int elem, indice, face, compi, compj;
60 for (elem = 0; elem < nb_elem_tot; elem++)
61 for (indice = 0; indice < nfe; indice++)
63 face = elem_faces(elem, indice);
65 if (elem != face_voisins(face, 0)) signe = -1;
66 for (compi = 0; compi <
dimension; compi++)
67 for (compj = 0; compj <
dimension; compj++)
68 grad(elem, compi, compj) += signe * vit(face, compi) * face_normales(face, compj);
82 const int nb_som = grad.
dimension(0) - nb_elem_tot;
97 if (
masse.nb_lignes() < 2)
99 Cerr <<
"On remplit la matrice de masse" << finl;
104 IntLists voisins(nb_som);
105 DoubleLists coeffs(nb_som);
106 DoubleVect diag(nb_som);
108 for (elem = 0; elem < nb_elem_tot; elem++)
110 double vol = domaine_VEF.
volumes(elem);
111 double coeff_ij = mijK * vol - miK * vol;
112 double coeff_ii = miiK * vol - miK * vol;
113 for (
int isom = 0; isom < nb_som_elem; isom++)
115 int som = elem_som(elem, isom);
117 diag[ii] += coeff_ii;
118 for (
int jsom = isom + 1; jsom < nb_som_elem; jsom++)
120 int sombis = elem_som(elem, jsom);
129 rang = voisins[i].rang(j);
133 coeffs[i].add(coeff_ij);
138 coeffs[i][rang] += coeff_ij;
145 for (
int i = 0; i < nb_som; i++)
151 mat.
remplir(voisins, coeffs, diag);
155 int elem, indice, face, compi, compj, som;
160 for (elem = 0; elem < nb_elem_tot; elem++)
163 for (indice = 0; indice < nfe; indice++)
165 face = elem_faces(elem, indice);
166 for (
int comp = 0; comp <
dimension; comp++)
167 sigma[comp] += vit(face, comp);
169 for (indice = 0; indice < nfe; indice++)
172 face = elem_faces(elem, indice);
174 if (elem != face_voisins(face, 0))
176 for (compi = 0; compi <
dimension; compi++)
177 for (compj = 0; compj <
dimension; compj++)
178 secmem(som, compi, compj) += coeff_som * signe * sigma[compi] * face_normales(face, compj);
184 const IntTab& face_sommets = domaine_VEF.
face_sommets();
185 int nb_bords = les_cl.size();
186 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
194 int num2 = num1 + le_bord.
nb_faces();
195 for (face = num1; face < num2; face++)
197 for (indice = 0; indice < (nfe - 1); indice++)
200 for (compi = 0; compi <
dimension; compi++)
201 for (compj = 0; compj <
dimension; compj++)
202 secmem(som, compi, compj) += 1. /
dimension * vit(face, compi) * face_normales(face, compj);
215 DoubleTab& sgrad = ref_cast_non_const(DoubleTab,
savgrad);
217 for (compi = 0; compi <
dimension; compi++)
218 for (compj = 0; compj <
dimension; compj++)
221 for (i = 0; i < nb_som; i++)
224 secmemij(soml) = secmem(soml, compi, compj);
225 gradij(soml) = sgrad(soml, compi, compj);
227 for (elem = 0; elem < nb_elem_tot; elem++)
228 for (indice = 0; indice < nfe; indice++)
231 secmemij(som) -= coeff * grad(elem, compi, compj);
234 for (i = 0; i < nb_som; i++)
237 double x = gradij(soml);
238 grad(nps + soml, compi, compj) = x;
239 sgrad(soml, compi, compj) = x;
243 for (elem = 0; elem < nb_elem_tot; elem++)
245 double vol = domaine_VEF.
volumes(elem);
246 for (compi = 0; compi <
dimension; compi++)
247 for (compj = 0; compj <
dimension; compj++)
248 grad(elem, compi, compj) /= vol;
249 for (indice = 0; indice < nfe; indice++)
252 for (compi = 0; compi <
dimension; compi++)
253 for (compj = 0; compj <
dimension; compj++)
254 grad(elem, compi, compj) -= coeff * grad(som, compi, compj);
260 for (
int ind = 0; ind < ntot; ind++)
261 for (compi = 0; compi <
dimension; compi++)
262 for (compj = 0; compj <
dimension; compj++)
263 tmp(ind, compi, compj) = 0.5 * (grad(ind, compi, compj) + grad(ind, compj, compi));
271 const DoubleTab& face_normales = domaine_VEF.
face_normales();
274 const int nb_bords = les_cl.size();
275 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
281 int num2 = num1 + le_bord.
nb_faces();
287 for (
int face = num1; face < num2; face++)
289 if (!fait[face - num1])
291 int face_associee = num1 + la_cl_perio.
face_associee(face - num1);
292 fait[face - num1] = (fait[face_associee - num1] = 1);
293 for (
int comp = 0; comp <
dimension; comp++)
295 div(face, comp) += div(face_associee, comp);
296 div(face_associee, comp) = div(face, comp);
303 if (sub_type(
Symetrie, la_cl.valeur()))
305 for (
int face = num1; face < num2; face++)
311 psc += div(face, comp) * face_normales(face, comp);
313 norme += face_normales(face, comp) * face_normales(face, comp);
316 if (std::fabs(norme) >= DMINFLOAT)
319 div(face, comp) -= psc * face_normales(face, comp);
331 const DoubleTab& face_normales = domaine_VEF.
face_normales();
335 int elem, indice, face, compi, compj;
337 for (elem = 0; elem < nb_elem_tot; elem++)
339 double nu_tot = nu + nu_turb(elem);
340 for (indice = 0; indice < nfe; indice++)
342 face = elem_faces(elem, indice);
344 if (elem != face_voisins(face, 0))
346 for (compi = 0; compi <
dimension; compi++)
347 for (compj = 0; compj <
dimension; compj++)
348 div(face, compi) -= nu_tot * grad(elem, compi, compj) * signe * face_normales(face, compj);
356 const DoubleTab& face_normales = domaine_VEF.
face_normales();
358 const IntTab& elem_faces = domaine_VEF.
elem_faces();
359 const IntTab& face_voisins = domaine_VEF.
face_voisins();
363 int elem, indice, indice2, face, compi, compj, som;
366 for (elem = 0; elem < nb_elem_tot; elem++)
368 double nu_tot = nu + nu_turb(elem);
369 for (indice = 0; indice < nfe; indice++)
372 face = elem_faces(elem, indice);
374 if (elem != face_voisins(face, 0))
376 for (
int comp = 0; comp <
dimension; comp++)
378 sigma[comp] = signe * face_normales(face, comp);
380 for (indice2 = 0; indice2 < nfe; indice2++)
381 for (compi = 0; compi <
dimension; compi++)
382 for (compj = 0; compj <
dimension; compj++)
383 div(elem_faces(elem, indice2), compi) -= coeff_som * nu_tot * grad(som, compi, compj) * sigma[compj];
388 const IntTab& face_sommets = domaine_VEF.
face_sommets();
389 int nb_bords = les_cl.size();
390 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
396 int num2 = num1 + le_bord.
nb_faces();
398 for (
int face2 = num1; face2 < num2; face2++)
400 double nu_tot = nu + nu_turb(face_voisins(face2, 0));
401 for (indice = 0; indice < (nfe - 1); indice++)
404 for (compi = 0; compi <
dimension; compi++)
405 for (compj = 0; compj <
dimension; compj++)
406 div(face2, compi) -= nu_tot /
dimension * face_normales(face2, compj) * grad(som, compi, compj);
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t get_renum_som_perio(int_t i) const
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
virtual void creer_tableau_sommets(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Cree un tableau ayant une "ligne" par sommet du maillage.
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
virtual double face_normales(int face, int comp) const
double volumes(int i) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.