56 Cerr <<
"Assemblage de la matrice de pression ... ";
57 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
58 la_matrice.typer(
"Matrice_Morse");
62 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins();
63 const DoubleVect& fs = domaine.face_surfaces(), &pf = mon_equation->milieu().porosite_face(), &pe = mon_equation->milieu().porosite_elem(), &ve = domaine.volumes();
65 int i, j, k, e, f, fb, n_f, ne = domaine.nb_elem(), ne_tot = domaine.nb_elem_tot(), nf = domaine.nb_faces(), nf_tot = domaine.nb_faces_tot(), na_tot =
66 dimension < 3 ? domaine.domaine().nb_som_tot() : domaine.domaine().nb_aretes_tot(), infoo=-1;
67 domaine.init_m2(), ch.
fcl();
74 for (
int n_bord = 0; n_bord < le_dom_PolyMAC_CDO->nb_front_Cl(); n_bord++)
75 if (sub_type(
Neumann_sortie_libre, le_dom_Cl_PolyMAC_CDO->les_conditions_limites(n_bord).valeur()))
81 Stencil stencil_M(0, 2), stencil_R(0, 2);
83 for (e = 0; e < ne_tot; e++)
85 for (i = 0, j = domaine.m2d(e), n_f = domaine.m2d(e + 1) - domaine.m2d(e); i < n_f; i++, j++)
87 for (k = domaine.w2i(j), f = e_f(e, i); f < nf && k < domaine.w2i(j + 1); k++)
89 fb = e_f(e, domaine.w2j(k));
90 stencil_M.append_line(ne_tot + f, ne_tot + fb);
94 if (ch.
fcl()(f, 0) != 1 && e < ne)
95 stencil_M.append_line(e, ne_tot + f);
96 if (ch.
fcl()(f, 0) != 1 && f < nf)
97 stencil_M.append_line(ne_tot + f, e);
98 if (e == f_e(f, 0) && f < nf)
102 stencil_M.append_line(e, e);
106 tableau_trier_retirer_doublons(stencil_M), tableau_trier_retirer_doublons(stencil_R);
118 rec.get_set_coeff() = 0;
122 for (e = 0; e < ne_tot; e++)
124 n_f = domaine.m2d(e + 1) - domaine.m2d(e), W0.
resize(n_f, n_f), W.resize(n_f, n_f);
125 for (i = 0, j = domaine.m2d(e), W0 = 0; i < n_f; i++, j++)
126 for (k = domaine.w2i(j); k < domaine.w2i(j + 1); k++)
127 W0(i, domaine.w2j(k)) = domaine.w2c(k);
133 for (i = 0, j = domaine.m2d(e), W = 0; i < n_f; i++, j++)
134 for (k = domaine.m2i(j); k < domaine.m2i(j + 1); k++)
135 W(i, domaine.m2j(k)) = domaine.m2c(k);
136 for (i = 0; i < n_f; i++)
137 f = e_f(e, i), W(i, i) += diag(f) * domaine.volumes_entrelaces_dir()(f, e != f_e(f, 0)) / domaine.volumes_entrelaces(f) / ve(e);
140 F77NAME(dpotrf)(&uplo, &n_f, W.addr(), &n_f, &infoo);
141 F77NAME(dpotri)(&uplo, &n_f, W.addr(), &n_f, &infoo);
142 for (i = 0; i < n_f; i++)
143 for (j = i + 1; j < n_f; j++)
145 for (i = 0; i < n_f; i++)
146 for (j = 0; j < n_f; j++)
153 double mee, mef, mff, rfe, rff;
154 for (i = 0, mee = 0; i < n_f; mee += mef, i++)
156 for (f = e_f(e, i), mef = 0, rfe = 0, j = 0; f < nf && j < n_f; mef += mff, rfe += rff, j++, mff = 0, rff = 0)
158 fb = e_f(e, j), mff = fs(f) * fs(fb) * pe(e) * W(i, j) / ve(e), rff = e == f_e(f, 0) ? fs(fb) * pe(e) * W(i, j) / (ve(e) * pf(f)) : 0;
159 if (mff && ch.
fcl()(f, 0) != 1 && ch.
fcl()(fb, 0) != 1)
160 mat(ne_tot + f, ne_tot + fb) += mff;
161 else if (ch.
fcl()(f, 0) == 1 && f == fb)
162 mat(ne_tot + f, ne_tot + fb) += 1;
164 rec(f, ne_tot + fb) += rff;
166 if (ch.
fcl()(f, 0) != 1 && e < ne)
167 mat(e, ne_tot + f) -= mef;
168 if (ch.
fcl()(f, 0) != 1 && f < nf)
169 mat(ne_tot + f, e) -= mef;
170 if (e == f_e(f, 0) && f < nf)
183 Cerr << statistics().get_time_since_last_open(STD_COUNTERS::matrix_assembly) <<
" s" << finl;
184 statistics().end_count(STD_COUNTERS::matrix_assembly);
226 for (i = 0; i < nb_cond_lim; i++)
232 int nfin = ndeb + la_front_dis.
nb_faces();
237 double Pimp, coPolyMAC_CDO;
242 for (
int num_face = ndeb; num_face < nfin; num_face++)
246 secmem[face_voisins(num_face, 0)] += coPolyMAC_CDO;
252 bool ch_unif = (Gpt.
nb_dim() == 1);
253 for (
int num_face = ndeb; num_face < nfin; num_face++)
258 double Gpoint = ch_unif ? Gpt(k) : Gpt(num_face - ndeb, k);
261 secmem(face_voisins(num_face, 0)) += Stt;
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
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.