17#include <Op_Diff_EF.h>
18#include <Domaine_EF.h>
19#include <Champ_Uniforme.h>
20#include <Milieu_base.h>
23#include <Probleme_base.h>
24#include <Neumann_paroi.h>
25#include <Echange_global_impose.h>
26#include <Echange_interne_global_impose.h>
27#include <Echange_couplage_thermique.h>
28#include <Echange_interne_global_parfait.h>
29#include <Champ_front_calc_interne.h>
32#include <Op_Conv_EF.h>
38Op_Diff_EF::Op_Diff_EF():transpose_(1),transpose_partout_(0),nouvelle_expression_(0)
72 param.ajouter(
"grad_u_transpose", &
transpose_ );
75 param.ajouter_condition(
"(value_of_grad_u_transpose_EQ_0)_OR_(value_of_grad_u_transpose_EQ_1)",
" grad_u_transpose doit valoir 0 ou 1 ");
76 param.ajouter_condition(
"(value_of_grad_u_transpose_partout_EQ_0)_OR_(value_of_grad_u_transpose_partout_EQ_1)",
" grad_u_transpose_partout doit valoir 0 ou 1 ");
77 param.ajouter_condition(
"(value_of_grad_u_transpose_partout_EQ_0)_OR_((value_of_grad_u_transpose_partout_EQ_1)_AND_(value_of_grad_u_transpose_EQ_1))",
" si grad_u_transpose_partout vaut 1 alors grad_u_transpose doit valoir 1");
78 param.lire_avec_accolades_depuis(s);
93 diffusivite_volumique_ = diffu;
109 if (!diffusivite_volumique_)
111 Cerr <<
que_suis_je() <<
" has no volumic diffusivity associated." << finl;
114 return diffusivite_volumique_.valeur();
119 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
126 else if (diffu.
nb_dim()==1)
131 for (
int i=0; i<diffu.
size_totale(); i++) nu(i)=diffu(i,0);
139 assert(diffusivite_volumique_);
140 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
145 if (diffu.
size() == 1)
146 lambda = diffu(0, 0);
147 else if (diffu.
nb_dim() == 1)
152 for (
int i = 0; i < diffu.
size_totale(); i++) lambda(i) = diffu(i, 0);
158 const Domaine_EF& domaine_ef = le_dom_EF.valeur();
159 const Domaine& domaine = domaine_ef.
domaine();
161 const int nb_som_elem = domaine.nb_som_elem();
162 const DoubleTab& Bij_thilde = domaine_ef.
Bij_thilde();
163 const DoubleTab& iphi_thilde = domaine_ef.
IPhi_thilde();
165 const IntTab& elems = domaine.les_elems();
167 const double r_tol = 1e-12;
170 const bool have_lambda = bool(diffusivite_volumique_);
175 for (
int elem = 0; elem < nb_elem_tot; elem++)
178 double grad[3][3] = {{0., 0., 0.}, {0., 0., 0.}, {0., 0., 0.}};
179 double sum_ur_over_r = 0.;
182 for (
int j = 0; j < nb_som_elem; j++)
184 const int som = elems(elem, j);
185 for (
int comp = 0; comp <
dimension; comp++)
186 for (
int dir = 0; dir <
dimension; dir++)
187 grad[comp][dir] += deplacement(som, comp) * Bij_thilde(elem, j, dir);
190 const double r_s = xs(som, 0);
191 const double w = iphi_thilde(elem, j);
192 if (r_s > r_tol && w > 0.)
194 sum_ur_over_r += (deplacement(som, 0) / r_s) * w;
200 const double vol = volumes_thilde(elem);
201 double inv_vol = 1.0 / vol;
203 for (
int comp = 0; comp <
dimension; comp++)
204 for (
int dir = 0; dir <
dimension; dir++)
205 grad[comp][dir] *= inv_vol;
207 double eps_xx = grad[0][0];
208 double eps_yy = grad[1][1];
209 double eps_zz = (
dimension == 3) ? grad[2][2] : 0.;
210 double gamma_xy = grad[0][1] + grad[1][0];
211 double gamma_yz = (
dimension == 3) ? (grad[1][2] + grad[2][1]) : 0.;
212 double gamma_zx = (
dimension == 3) ? (grad[2][0] + grad[0][2]) : 0.;
217 const double eps_theta = (sum_w > 0.) ? (sum_ur_over_r / sum_w) : eps_xx;
221 const double mu =
nu_(elem);
222 const double lambda = have_lambda ?
lambda_(elem) : 0.;
223 const double trace_eps = eps_xx + eps_yy + eps_zz;
225 const double sigma_xx = 2. * mu * eps_xx + lambda * trace_eps;
226 const double sigma_yy = 2. * mu * eps_yy + lambda * trace_eps;
227 const double sigma_zz = 2. * mu * eps_zz + lambda * trace_eps;
228 const double tau_xy = mu * gamma_xy;
229 const double tau_yz = mu * gamma_yz;
230 const double tau_zx = mu * gamma_zx;
232 const double vm2 = 0.5 * ((sigma_xx - sigma_yy) * (sigma_xx - sigma_yy) +
233 (sigma_yy - sigma_zz) * (sigma_yy - sigma_zz) +
234 (sigma_zz - sigma_xx) * (sigma_zz - sigma_xx)) +
235 3. * (tau_xy * tau_xy + tau_yz * tau_yz + tau_zx * tau_zx);
236 const double vm = (vm2 > 0.) ? std::sqrt(vm2) : 0.;
238 von_mises(elem, 0) = vm;
239 deformation(elem, 0) = eps_xx;
240 deformation(elem, 1) = eps_yy;
241 deformation(elem, 2) = eps_zz;
242 contraintes(elem, 0) = sigma_xx;
243 contraintes(elem, 1) = sigma_yy;
244 contraintes(elem, 2) = sigma_zz;
251 ref_cast(
Op_Conv_EF,
equation().operateur(1).l_op_base()).ajouter_a_la_diffusion(tab_inconnue,resu);
258 const Domaine_EF& domaine_ef = le_dom_EF.valeur();
267 else if ((
dimension==2)&&(nb_som_elem==4))
281 Cerr<<__FILE__<<(int)__LINE__<<
"cas non prevu "<<finl;
284 return ajouter(tab_inconnue,resu);
288 else if ((
dimension==2)&&(nb_som_elem==4))
340 ArrOfInt marqueur_neuman;
343 remplir_marqueur_sommet_neumann( marqueur_neuman,domaine_ef,la_zcl_EF.valeur(),
transpose_partout_ );
345 const DoubleVect& volumes= domaine_ef.
volumes();
347 const DoubleTab& bij=domaine_ef.
Bij();
348 const DoubleTab& bij_thilde=domaine_ef.
Bij_thilde();
353 for (
int elem=0; elem<nb_elem_tot; elem++)
356 double pond=1./volumes(elem);
359 for (
int i1=0; i1<nb_som_elem; i1++)
361 int glob=elems(elem,i1);
362 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 :
transpose_;
363 for (
int i2=0; i2<nb_som_elem; i2++)
365 int glob2=elems(elem,i2);
366 for (
int n = 0; n < N; n++)
368 resu(glob, n) -= bij(elem, i1, d) * (bij_thilde(elem, i2, d) * tab_inconnue(glob2, n) + transpose * bij_thilde(elem, i2, n) * tab_inconnue(glob2, d)) *
nu_(elem) * pond;
381 return ajouter(tab_inconnue,resu);
391 const auto& tab1_ = matrice.
get_tab1();
392 const auto& tab2_ = matrice.
get_tab2();
394 auto k2=tab1_[i+1]-1;
395 for (
auto k=k1; k<k2; k++)
397 Cerr <<
"i ou j ne conviennent pas " << finl;
398 Cerr <<
"i=" << i << finl;
399 Cerr <<
"j=" << j << finl;
400 Cerr <<
"n_lignes=" << matrice.
nb_lignes() << finl;
401 Cerr <<
"n_colonnes=" << matrice.
nb_colonnes() << finl;
403 return coeff_opt(matrice,i,j);
406#define matrice_coef(i,j) matrice.coef(i,j)
411 ref_cast(
Op_Conv_EF,
equation().operateur(1).l_op_base()).ajouter_contribution_a_la_diffusion(transporte,matrice);
424 const DoubleVect& volumes= domaine_ef.
volumes();
426 const DoubleTab& bij=domaine_ef.
Bij();
432 ArrOfInt marqueur_neuman;
433 remplir_marqueur_sommet_neumann( marqueur_neuman,domaine_ef,la_zcl_EF.valeur(),
transpose_partout_ );
434 for (
int elem=0; elem<nb_elem_tot; elem++)
437 double pond=volumes_thilde(elem)/volumes(elem)/volumes(elem);
439 for (
int i1=0; i1<nb_som_elem; i1++)
441 int glob=elems(elem,i1);
443 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 :
transpose_;
445 for (
int i2=0; i2<nb_som_elem; i2++)
447 int glob2=elems(elem,i2);
450 cb+=bij(elem,i1,b)*bij(elem,i2,b);
451 for (
int n = 0; n < N; n++)
453 matrice_coef(glob * N + n, glob2 * N + n) += cb *
nu_(elem) * pond;
456 matrice_coef(glob * N + n, glob2 * N + d) += bij(elem, i1, d) * bij(elem, i2, n) *
nu_(elem) * pond;
462 else if (
bidim_axi) ajouter_contribution_axisymetrique(N, matrice);
464 if (diffusivite_volumique_)
465 ajouter_contribution_diffusivite_volumique(N, matrice);
468void Op_Diff_EF::ajouter_contribution_axisymetrique(
int N,
Matrice_Morse& matrice)
const
471 const DoubleTab& IPhi_thilde = domaine_ef.
IPhi_thilde();
478 const double r_tol = 1e-12;
479 for (
int elem = 0; elem < nb_elem_tot; elem++)
481 for (
int i1 = 0; i1 < nb_som_elem; i1++)
483 const int glob = elems(elem, i1);
484 if (glob >= nb_som)
continue;
485 const double r_s = xs(glob, 0);
486 if (r_s <= r_tol)
continue;
487 const double coeff = 2.0 *
nu_(elem) / (r_s * r_s);
488 matrice_coef(glob * N, glob * N) += IPhi_thilde(elem, i1) * coeff;
492void Op_Diff_EF::ajouter_contribution_diffusivite_volumique(
int N,
Matrice_Morse& matrice)
const
495 const double *lambda_ptr =
lambda_.addr();
497 const Domaine_EF& domaine_ef = ref_cast(Domaine_EF,
equation().domaine_dis());
498 const DoubleVect& volumes = domaine_ef.
volumes();
499 const DoubleTab& bij = domaine_ef.
Bij();
500 const DoubleTab& IPhi_thilde = domaine_ef.
IPhi_thilde();
506 for (
int elem = 0; elem < nb_elem_tot; elem++)
509 double pond_lambda = lambda_ptr[elem] / volumes(elem);
511 for (
int i1 = 0; i1 < nb_som_elem; i1++)
513 const int glob = elems(elem, i1);
514 if (glob >= nb_som)
continue;
515 for (
int i2 = 0; i2 < nb_som_elem; i2++)
517 const int glob2 = elems(elem, i2);
518 for (
int n = 0; n < N; n++)
519 for (
int d = 0; d < N; d++)
520 matrice_coef(glob * N + n, glob2 * N + d) += bij(elem, i1, n) * bij(elem, i2, d) * pond_lambda;
527 const double r_tol = 1e-12;
528 for (
int i1 = 0; i1 < nb_som_elem; i1++)
530 const int glob = elems(elem, i1);
531 if (glob >= nb_som)
continue;
532 const double r_s1 = xs(glob, 0);
533 const double inv_r1 = (r_s1 > r_tol) ? (1.0 / r_s1) : 0.0;
534 const double m1 = IPhi_thilde(elem, i1) * inv_r1;
536 for (
int i2 = 0; i2 < nb_som_elem; i2++)
538 const int glob2 = elems(elem, i2);
539 const double r_s2 = xs(glob2, 0);
540 const double inv_r2 = (r_s2 > r_tol) ? (1.0 / r_s2) : 0.0;
541 const double m2 = IPhi_thilde(elem, i2) * inv_r2;
543 for (
int n = 0; n < N; n++)
544 matrice_coef(glob * N + n, glob2 * N + 0) += bij(elem, i1, n) * m2 * pond_lambda;
546 for (
int n = 0; n < N; n++)
547 matrice_coef(glob * N + 0, glob2 * N + n) += m1 * bij(elem, i2, n) * pond_lambda;
549 matrice_coef(glob * N + 0, glob2 * N + 0) += m1 * m2 * pond_lambda;
566 const DoubleVect& volumes= domaine_ef.
volumes();
568 const DoubleTab& bij=domaine_ef.
Bij();
569 const DoubleTab& bij_thilde=domaine_ef.
Bij_thilde();
575 ArrOfInt marqueur_neuman;
576 remplir_marqueur_sommet_neumann( marqueur_neuman,domaine_ef,la_zcl_EF.valeur(),
transpose_partout_ );
577 for (
int elem=0; elem<nb_elem_tot; elem++)
580 double pond=1./volumes(elem);
582 for (
int i1=0; i1<nb_som_elem; i1++)
584 int glob=elems(elem,i1);
586 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 :
transpose_;
588 for (
int i2=0; i2<nb_som_elem; i2++)
590 int glob2=elems(elem,i2);
593 cb+=bij(elem,i1,b)*bij_thilde(elem,i2,b);
594 for (
int n = 0; n < N; n++)
596 matrice_coef(glob * N + n, glob2 * N + n) += cb *
nu_(elem) * pond;
599 matrice_coef(glob * N + n, glob2 * N + d) += bij(elem, i1, d) * bij_thilde(elem, i2, n) *
nu_(elem) * pond;
610 ref_cast(
Op_Conv_EF,
equation().operateur(1).l_op_base()).contribue_au_second_membre_a_la_diffusion(resu);
619 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
625 const DoubleTab& bij=domaine_ef.
Bij();
630 const DoubleVect& volumes= domaine_ef.
volumes();
640 bool has_traction_bc =
false;
641 for (
int n_bord = 0; n_bord < domaine_Cl_EF.
nb_cond_lim(); n_bord++)
644 has_traction_bc =
true;
648 if (!has_traction_bc)
655 for (
int n_bord = 0; n_bord < domaine_Cl_EF.
nb_cond_lim(); n_bord++)
658 if (
Motcle(la_cl->que_suis_je()) !=
Motcle(
"Paroi_pression_imposee"))
continue;
666 for (
int i1 = 0; i1 < nb_som_face; i1++)
668 const int glob = face_sommets(face, i1);
670 for (
int comp = 0; comp < N; comp++)
671 resu(glob, comp) -= val * face_normales(face, comp) / nb_som_face;
680 for (
int face=0; face<premiere_face_int; face++)
682 int elem=face_voisins(face,0);
683 if (elem==-1) face_voisins(face,1);
685 double pond= volumes_thilde(elem)/volumes(elem)/volumes(elem);
687 for (
int i1=0; i1<nb_som_elem; i1++)
690 int glob2=elems(elem,i1);
695 flux_bords_(face,0)+=face_normales(face,a)*bij(elem,i1,a)*tab_inconnue(glob2)*
nu_(elem)*pond;
706 for (n_bord=0; n_bord<nb_bords; n_bord++)
711 int nfin = ndeb + le_bord.
nb_faces();
716 for (
int face=ndeb; face<nfin; face++)
720 for (
int i1=0; i1<nb_som_face; i1++)
722 int glob2=face_sommets(face,i1);
725 resu[glob2] += flux/nb_som_face;
734 for (
int face=ndeb; face<nfin; face++)
737 double h=la_cl_paroi.
h_imp(face-ndeb);
738 double Text=la_cl_paroi.
T_ext(face-ndeb);
744 for (
int i1=0; i1<nb_som_face; i1++)
746 int glob2=face_sommets(face,i1);
747 tm+=tab_inconnue(glob2);
751 double flux=(phiext+h*(Text-tm))*domaine_EF.
surface(face);
754 for (
int i1=0; i1<nb_som_face; i1++)
756 int glob2=face_sommets(face,i1);
767 const IntVect& fmap = Text.
face_map();
768 std::vector<bool> hit(nfin-ndeb);
769 std::fill(hit.begin(), hit.end(),
false);
770 for (
int face=ndeb; face<nfin; face++)
772 int opp_face = fmap(face-ndeb)+ndeb;
775 int som=face_sommets(face,0);
776 int som_opp=face_sommets(opp_face,0);
784 int elem_opp = (elem1 != -1) ? elem1 : domaine_EF.
face_voisins(opp_face, 1);
787 int face_plus_2 = f1 != opp_face ? f1 : domaine_EF.
elem_faces(elem_opp, 1);
788 int som_p2 = face_sommets(face_plus_2, 0);
790 double pond = volumes_thilde(elem_opp)/volumes(elem_opp)/volumes(elem_opp);
791 double B =
nu_(elem_opp)*pond;
792 resu[som] -= B*(tab_inconnue[som]-tab_inconnue[som_p2]);
801 int face_p2 = f1 != face ? f1 : domaine_EF.
elem_faces(elem, 1);
802 int som_p2=face_sommets(face_p2,0);
804 double pond = volumes_thilde(elem)/volumes(elem)/volumes(elem);
805 double B =
nu_(elem)*pond;
806 resu[som] += B*(-tab_inconnue[som_p2] + tab_inconnue[som_opp]);
808 hit[face-ndeb] =
true;
809 hit[opp_face-ndeb] =
true;
814 for (
int face=ndeb; face<nfin; face++)
823 const DoubleVect& surface_gap = la_cl_paroi.
surface_gap();
824 for (
int face=ndeb; face<nfin; face++)
826 double h=la_cl_paroi.
h_imp(face-ndeb);
828 const IntVect& fmap = Text.
face_map();
829 int opp_face = fmap(face-ndeb)+ndeb;
836 for (
int i1=0; i1<nb_som_face; i1++)
838 int glob2=face_sommets(face,i1);
839 int glob3 =face_sommets(opp_face,i1);
840 tm+=tab_inconnue(glob2);
841 to+=tab_inconnue(glob3);
846 flux=h*(to-tm)*surface_gap(face-ndeb);
854 for (
int i1=0; i1<nb_som_face; i1++)
856 int glob2=face_sommets(face,i1);
864 for (
int face=ndeb; face<nfin; face++)
867 double h=la_cl_paroi.
h_imp(face-ndeb);
868 double Text=la_cl_paroi.
T_ext(face-ndeb);
874 for (
int i1=0; i1<nb_som_face; i1++)
876 int glob2=face_sommets(face,i1);
878 tm+=tab_inconnue(glob2);
883 double flux=h*(Text-tm)*domaine_EF.
surface(face);
886 for (
int i1=0; i1<nb_som_face; i1++)
888 int glob2=face_sommets(face,i1);
908 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
926 for (n_bord=0; n_bord<nb_bords; n_bord++)
931 int nfin = ndeb + le_bord.
nb_faces();
937 for (
int face=ndeb; face<nfin; face++)
940 double h=la_cl_paroi.
h_imp(face-ndeb);
943 double tm=1./(nb_som_face*nb_som_face);
944 double flux=(dphi_dT+h)*domaine_EF.
surface(face)*tm;
946 for (
int i1=0; i1<nb_som_face; i1++)
948 int glob2=face_sommets(face,i1);
949 for (
int j1=0; j1<nb_som_face; j1++)
951 int glob1=face_sommets(face,j1);
952 matrice.
coef(glob1,glob2) += flux;
962 const IntVect& fmap = Text.
face_map();
963 std::vector<bool> hit(nfin-ndeb);
964 std::fill(hit.begin(), hit.end(),
false);
965 for (
int face=ndeb; face<nfin; face++)
968 int opp_face = fmap(face-ndeb)+ndeb;
971 int elem_opp = (elem1 != -1) ? elem1 : domaine_EF.
face_voisins(opp_face, 1);
974 int face_plus_2 = f1 != opp_face ? f1 : domaine_EF.
elem_faces(elem_opp, 1);
978 int face_min_1 = f1 != face ? f1 : domaine_EF.
elem_faces(elem, 1);
980 for (
int i1=0; i1<nb_som_face; i1++)
982 int som=face_sommets(face,i1);
983 int som_opp=face_sommets(opp_face,i1);
986 for (
int j1=0; j1<nb_som_face; j1++)
989 int som_p2=face_sommets(face_plus_2,j1);
990 matrice.
coef(som,som_p2) -= matrice.
coef(som_opp, som_opp);
991 matrice.
coef(som, som) += matrice.
coef(som_opp, som_opp);
993 hit[face-ndeb] =
true;
994 hit[opp_face-ndeb] =
true;
997 for (
int j1=0; j1<nb_som_face; j1++)
1000 int som_m1=face_sommets(face_min_1, j1);
1001 matrice.
coef(som,som_opp) = -matrice.
coef(som,som);
1002 matrice.
coef(som,som_m1) = 0;
1012 const IntVect& fmap = Text.
face_map();
1013 const DoubleVect& surface_gap = la_cl_paroi.
surface_gap();
1014 for (
int face=ndeb; face<nfin; face++)
1016 double h=la_cl_paroi.
h_imp(face-ndeb);
1017 double tm=1./(nb_som_face*nb_som_face);
1019 double flux=h*surface_gap(face-ndeb)*tm;
1020 int opp_face = fmap(face-ndeb)+ndeb;
1022 for (
int i1=0; i1<nb_som_face; i1++)
1024 int glob2=face_sommets(face,i1);
1025 int glob3=face_sommets(opp_face,i1);
1026 for (
int j1=0; j1<nb_som_face; j1++)
1028 int glob1=face_sommets(face,j1);
1029 matrice.
coef(glob1,glob2) += flux;
1030 matrice.
coef(glob1,glob3) -= flux;
1040 for (
int face=ndeb; face<nfin; face++)
1042 double h=la_cl_paroi.
h_imp(face-ndeb);
1043 double tm=1./(nb_som_face*nb_som_face);
1044 double flux=h*domaine_EF.
surface(face)*tm;
1045 for (
int i1=0; i1<nb_som_face; i1++)
1047 int glob2=face_sommets(face,i1);
1048 for (
int j1=0; j1<nb_som_face; j1++)
1050 int glob1=face_sommets(face,j1);
1051 matrice.
coef(glob1,glob2) += flux;
1060 static int testee=0;
DoubleTab & valeurs() override
Returns the array of field values at the current time.
virtual DoubleTab & valeurs()=0
class Champ_base This class is the base of the fields hierarchy.
class Champ_front_calc_interne Derived class of Champ_front_calc representing
const IntVect & face_map() const
class Cond_lim Generic class used to represent any class
int nb_som_elem() const
Returns the number of vertices of the geometric elements that make up the domain.
int_t nb_elem_tot() const
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Creates a parallel array of values at elements.
DoubleTab_t & les_sommets()
int_t nb_som() const
Returns the number of vertices of the domain.
int nb_cond_lim() const
Returns the number of boundary conditions.
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
const DoubleTab & IPhi_thilde() const
const DoubleTab & Bij() const
const DoubleTab & Bij_thilde() const
const DoubleVect & volumes_thilde() const
virtual double face_normales(int face, int comp) const
double volumes(int i) const
int face_sommets(int i, int j) const
Returns the index of the i-th vertex of face num_face.
virtual double surface(int i) const
int nb_som_face() const
Returns the number of vertices per face.
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
int premiere_face_int() const
A face is internal if and only if it separates two elements.
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
const Domaine & domaine() const
: class Echange_couplage_thermique
double flux_exterieur_impose(int i) const override
Classe Echange_global_impose This class represents the special case of the class.
virtual double derivee_flux_exterieur_imposee(int i) const
virtual double h_imp(int num) const
Returns the value of the imposed heat exchange coefficient on the i-th component.
virtual double T_ext(int num) const
Returns the value of the imposed temperature on the i-th component of the boundary field.
Class Echange_interne_global_impose: This class represents the special case of.
const DoubleVect surface_gap() const
Class Echange_interne_global_parfait: Special case of a perfect internal exchange (h=+inf).
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Champ_Inc_base & inconnue() const =0
virtual Nature_du_champ nature_du_champ() const
int num_premiere_face() const
int num_face(const int) const
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
const auto & get_tab2() const
const auto & get_tab1() const
double coef(int i, int j) const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
int nb_lignes() const override
Return local number of lines (=size on the current proc).
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
A character string (Nom) in uppercase.
Classe Neumann_paroi This boundary condition corresponds to an imposed flux for the.
Classe Neumann This class is the base class of the hierarchy of Neumann-type boundary conditions.
virtual double flux_impose(int i) const
Returns the value of the imposed flux on the i-th component of the field representing the flux at the...
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
class Op_Conv_EF Represents the convection operator associated with a scalar transport equation.
class Op_Diff_EF_base Base class for EF diffusion operators.
class Op_Diff_EF Represents the diffusion operator.
void ajouter_contribution_new(const DoubleTab &, Matrice_Morse &) const
DoubleTab & ajouter_vectoriel_dim3_nbn_8(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_scalaire_template(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_vectoriel_gen(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_vectoriel_dim2_nbn_4(const DoubleTab &, DoubleTab &) const
const Champ_base & diffusivite() const override
void remplir_lambda(DoubleTab &) const
DoubleTab & ajouter_new(const DoubleTab &, DoubleTab &) const
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
void contribuer_au_second_membre(DoubleTab &) const override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter_scalaire_gen(const DoubleTab &, DoubleTab &) const
void remplir_nu(DoubleTab &) const override
void completer() override
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its equation.
void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
void ajouter_bords(const DoubleTab &, DoubleTab &, int contrib_interne=1) const
DoubleTab & ajouter_scalaire_dim3_nbn_8(const DoubleTab &, DoubleTab &) const
void associer_diffusivite_volumique(const Champ_base &) override
void associer_diffusivite(const Champ_base &) override
Associates the diffusivity field.
const Champ_base & diffusivite_volumique() const
DoubleTab & ajouter_vectoriel_template(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_scalaire_dim2_nbn_4(const DoubleTab &, DoubleTab &) const
void calculer_von_mises(const DoubleTab &deplacement, DoubleTab &deformation, DoubleTab &contraintes, DoubleTab &von_mises) const override
void ajouter_contributions_bords(Matrice_Morse &matrice) const
void marque_elem(const Equation_base &eqn)
int elem_contribue(const int elem) const
void modifier_flux(const Operateur_base &) const
Multiplies the boundary flux by rho cp or rho if necessary.
virtual void completer()
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its equation.
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Base class for output streams.
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
virtual const MD_Vector & get_md_vector() const