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);
425 const DoubleVect& volumes= domaine_ef.
volumes();
427 const DoubleTab& bij=domaine_ef.
Bij();
433 ArrOfInt marqueur_neuman;
434 remplir_marqueur_sommet_neumann( marqueur_neuman,domaine_ef,la_zcl_EF.valeur(),
transpose_partout_ );
435 for (
int elem=0; elem<nb_elem_tot; elem++)
438 double pond=volumes_thilde(elem)/volumes(elem)/volumes(elem);
440 for (
int i1=0; i1<nb_som_elem; i1++)
442 int glob=elems(elem,i1);
444 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 :
transpose_;
446 for (
int i2=0; i2<nb_som_elem; i2++)
448 int glob2=elems(elem,i2);
451 cb+=bij(elem,i1,b)*bij(elem,i2,b);
452 for (
int n = 0; n < N; n++)
454 matrice_coef(glob * N + n, glob2 * N + n) += cb *
nu_(elem) * pond;
457 matrice_coef(glob * N + n, glob2 * N + d) += bij(elem, i1, d) * bij(elem, i2, n) *
nu_(elem) * pond;
463 else if (
bidim_axi) ajouter_contribution_axisymetrique(N, matrice);
465 if (diffusivite_volumique_)
466 ajouter_contribution_diffusivite_volumique(N, matrice);
469void Op_Diff_EF::ajouter_contribution_axisymetrique(
int N,
Matrice_Morse& matrice)
const
472 const DoubleTab& IPhi_thilde = domaine_ef.
IPhi_thilde();
479 const double r_tol = 1e-12;
480 for (
int elem = 0; elem < nb_elem_tot; elem++)
482 for (
int i1 = 0; i1 < nb_som_elem; i1++)
484 const int glob = elems(elem, i1);
485 if (glob >= nb_som)
continue;
486 const double r_s = xs(glob, 0);
487 if (r_s <= r_tol)
continue;
488 const double coeff = 2.0 *
nu_(elem) / (r_s * r_s);
489 matrice_coef(glob * N, glob * N) += IPhi_thilde(elem, i1) * coeff;
493void Op_Diff_EF::ajouter_contribution_diffusivite_volumique(
int N,
Matrice_Morse& matrice)
const
496 const double *lambda_ptr =
lambda_.addr();
498 const Domaine_EF& domaine_ef = ref_cast(Domaine_EF,
equation().domaine_dis());
499 const DoubleVect& volumes = domaine_ef.
volumes();
500 const DoubleTab& bij = domaine_ef.
Bij();
501 const DoubleTab& IPhi_thilde = domaine_ef.
IPhi_thilde();
507 for (
int elem = 0; elem < nb_elem_tot; elem++)
510 double pond_lambda = lambda_ptr[elem] / volumes(elem);
512 for (
int i1 = 0; i1 < nb_som_elem; i1++)
514 const int glob = elems(elem, i1);
515 if (glob >= nb_som)
continue;
516 for (
int i2 = 0; i2 < nb_som_elem; i2++)
518 const int glob2 = elems(elem, i2);
519 for (
int n = 0; n < N; n++)
520 for (
int d = 0; d < N; d++)
521 matrice_coef(glob * N + n, glob2 * N + d) += bij(elem, i1, n) * bij(elem, i2, d) * pond_lambda;
528 const double r_tol = 1e-12;
529 for (
int i1 = 0; i1 < nb_som_elem; i1++)
531 const int glob = elems(elem, i1);
532 if (glob >= nb_som)
continue;
533 const double r_s1 = xs(glob, 0);
534 const double inv_r1 = (r_s1 > r_tol) ? (1.0 / r_s1) : 0.0;
535 const double m1 = IPhi_thilde(elem, i1) * inv_r1;
537 for (
int i2 = 0; i2 < nb_som_elem; i2++)
539 const int glob2 = elems(elem, i2);
540 const double r_s2 = xs(glob2, 0);
541 const double inv_r2 = (r_s2 > r_tol) ? (1.0 / r_s2) : 0.0;
542 const double m2 = IPhi_thilde(elem, i2) * inv_r2;
544 for (
int n = 0; n < N; n++)
545 matrice_coef(glob * N + n, glob2 * N + 0) += bij(elem, i1, n) * m2 * pond_lambda;
547 for (
int n = 0; n < N; n++)
548 matrice_coef(glob * N + 0, glob2 * N + n) += m1 * bij(elem, i2, n) * pond_lambda;
550 matrice_coef(glob * N + 0, glob2 * N + 0) += m1 * m2 * pond_lambda;
568 const DoubleVect& volumes= domaine_ef.
volumes();
570 const DoubleTab& bij=domaine_ef.
Bij();
571 const DoubleTab& bij_thilde=domaine_ef.
Bij_thilde();
577 ArrOfInt marqueur_neuman;
578 remplir_marqueur_sommet_neumann( marqueur_neuman,domaine_ef,la_zcl_EF.valeur(),
transpose_partout_ );
579 for (
int elem=0; elem<nb_elem_tot; elem++)
582 double pond=1./volumes(elem);
584 for (
int i1=0; i1<nb_som_elem; i1++)
586 int glob=elems(elem,i1);
588 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 :
transpose_;
590 for (
int i2=0; i2<nb_som_elem; i2++)
592 int glob2=elems(elem,i2);
595 cb+=bij(elem,i1,b)*bij_thilde(elem,i2,b);
596 for (
int n = 0; n < N; n++)
598 matrice_coef(glob * N + n, glob2 * N + n) += cb *
nu_(elem) * pond;
601 matrice_coef(glob * N + n, glob2 * N + d) += bij(elem, i1, d) * bij_thilde(elem, i2, n) *
nu_(elem) * pond;
612 ref_cast(
Op_Conv_EF,
equation().operateur(1).l_op_base()).contribue_au_second_membre_a_la_diffusion(resu);
621 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
627 const DoubleTab& bij=domaine_ef.
Bij();
632 const DoubleVect& volumes= domaine_ef.
volumes();
642 bool has_traction_bc =
false;
643 for (
int n_bord = 0; n_bord < domaine_Cl_EF.
nb_cond_lim(); n_bord++)
646 has_traction_bc =
true;
650 if (!has_traction_bc)
657 for (
int n_bord = 0; n_bord < domaine_Cl_EF.
nb_cond_lim(); n_bord++)
660 if (
Motcle(la_cl->que_suis_je()) !=
Motcle(
"Paroi_pression_imposee"))
continue;
668 for (
int i1 = 0; i1 < nb_som_face; i1++)
670 const int glob = face_sommets(face, i1);
672 for (
int comp = 0; comp < N; comp++)
673 resu(glob, comp) -= val * face_normales(face, comp) / nb_som_face;
682 for (
int face=0; face<premiere_face_int; face++)
684 int elem=face_voisins(face,0);
685 if (elem==-1) face_voisins(face,1);
687 double pond= volumes_thilde(elem)/volumes(elem)/volumes(elem);
689 for (
int i1=0; i1<nb_som_elem; i1++)
692 int glob2=elems(elem,i1);
697 flux_bords_(face,0)+=face_normales(face,a)*bij(elem,i1,a)*tab_inconnue(glob2)*
nu_(elem)*pond;
708 for (n_bord=0; n_bord<nb_bords; n_bord++)
713 int nfin = ndeb + le_bord.
nb_faces();
718 for (
int face=ndeb; face<nfin; face++)
722 for (
int i1=0; i1<nb_som_face; i1++)
724 int glob2=face_sommets(face,i1);
727 resu[glob2] += flux/nb_som_face;
736 for (
int face=ndeb; face<nfin; face++)
739 double h=la_cl_paroi.
h_imp(face-ndeb);
740 double Text=la_cl_paroi.
T_ext(face-ndeb);
746 for (
int i1=0; i1<nb_som_face; i1++)
748 int glob2=face_sommets(face,i1);
749 tm+=tab_inconnue(glob2);
753 double flux=(phiext+h*(Text-tm))*domaine_EF.
surface(face);
756 for (
int i1=0; i1<nb_som_face; i1++)
758 int glob2=face_sommets(face,i1);
769 const IntVect& fmap = Text.
face_map();
770 std::vector<bool> hit(nfin-ndeb);
771 std::fill(hit.begin(), hit.end(),
false);
772 for (
int face=ndeb; face<nfin; face++)
774 int opp_face = fmap(face-ndeb)+ndeb;
777 int som=face_sommets(face,0);
778 int som_opp=face_sommets(opp_face,0);
786 int elem_opp = (elem1 != -1) ? elem1 : domaine_EF.
face_voisins(opp_face, 1);
789 int face_plus_2 = f1 != opp_face ? f1 : domaine_EF.
elem_faces(elem_opp, 1);
790 int som_p2 = face_sommets(face_plus_2, 0);
792 double pond = volumes_thilde(elem_opp)/volumes(elem_opp)/volumes(elem_opp);
793 double B =
nu_(elem_opp)*pond;
794 resu[som] -= B*(tab_inconnue[som]-tab_inconnue[som_p2]);
803 int face_p2 = f1 != face ? f1 : domaine_EF.
elem_faces(elem, 1);
804 int som_p2=face_sommets(face_p2,0);
806 double pond = volumes_thilde(elem)/volumes(elem)/volumes(elem);
807 double B =
nu_(elem)*pond;
808 resu[som] += B*(-tab_inconnue[som_p2] + tab_inconnue[som_opp]);
810 hit[face-ndeb] =
true;
811 hit[opp_face-ndeb] =
true;
816 for (
int face=ndeb; face<nfin; face++)
825 const DoubleVect& surface_gap = la_cl_paroi.
surface_gap();
826 for (
int face=ndeb; face<nfin; face++)
828 double h=la_cl_paroi.
h_imp(face-ndeb);
830 const IntVect& fmap = Text.
face_map();
831 int opp_face = fmap(face-ndeb)+ndeb;
838 for (
int i1=0; i1<nb_som_face; i1++)
840 int glob2=face_sommets(face,i1);
841 int glob3 =face_sommets(opp_face,i1);
842 tm+=tab_inconnue(glob2);
843 to+=tab_inconnue(glob3);
848 flux=h*(to-tm)*surface_gap(face-ndeb);
856 for (
int i1=0; i1<nb_som_face; i1++)
858 int glob2=face_sommets(face,i1);
866 for (
int face=ndeb; face<nfin; face++)
869 double h=la_cl_paroi.
h_imp(face-ndeb);
870 double Text=la_cl_paroi.
T_ext(face-ndeb);
876 for (
int i1=0; i1<nb_som_face; i1++)
878 int glob2=face_sommets(face,i1);
880 tm+=tab_inconnue(glob2);
885 double flux=h*(Text-tm)*domaine_EF.
surface(face);
888 for (
int i1=0; i1<nb_som_face; i1++)
890 int glob2=face_sommets(face,i1);
910 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
928 for (n_bord=0; n_bord<nb_bords; n_bord++)
933 int nfin = ndeb + le_bord.
nb_faces();
939 for (
int face=ndeb; face<nfin; face++)
942 double h=la_cl_paroi.
h_imp(face-ndeb);
945 double tm=1./(nb_som_face*nb_som_face);
946 double flux=(dphi_dT+h)*domaine_EF.
surface(face)*tm;
948 for (
int i1=0; i1<nb_som_face; i1++)
950 int glob2=face_sommets(face,i1);
951 for (
int j1=0; j1<nb_som_face; j1++)
953 int glob1=face_sommets(face,j1);
954 matrice.
coef(glob1,glob2) += flux;
964 const IntVect& fmap = Text.
face_map();
965 std::vector<bool> hit(nfin-ndeb);
966 std::fill(hit.begin(), hit.end(),
false);
967 for (
int face=ndeb; face<nfin; face++)
970 int opp_face = fmap(face-ndeb)+ndeb;
973 int elem_opp = (elem1 != -1) ? elem1 : domaine_EF.
face_voisins(opp_face, 1);
976 int face_plus_2 = f1 != opp_face ? f1 : domaine_EF.
elem_faces(elem_opp, 1);
980 int face_min_1 = f1 != face ? f1 : domaine_EF.
elem_faces(elem, 1);
982 for (
int i1=0; i1<nb_som_face; i1++)
984 int som=face_sommets(face,i1);
985 int som_opp=face_sommets(opp_face,i1);
988 for (
int j1=0; j1<nb_som_face; j1++)
991 int som_p2=face_sommets(face_plus_2,j1);
992 matrice.
coef(som,som_p2) -= matrice.
coef(som_opp, som_opp);
993 matrice.
coef(som, som) += matrice.
coef(som_opp, som_opp);
995 hit[face-ndeb] =
true;
996 hit[opp_face-ndeb] =
true;
999 for (
int j1=0; j1<nb_som_face; j1++)
1002 int som_m1=face_sommets(face_min_1, j1);
1003 matrice.
coef(som,som_opp) = -matrice.
coef(som,som);
1004 matrice.
coef(som,som_m1) = 0;
1014 const IntVect& fmap = Text.
face_map();
1015 const DoubleVect& surface_gap = la_cl_paroi.
surface_gap();
1016 for (
int face=ndeb; face<nfin; face++)
1018 double h=la_cl_paroi.
h_imp(face-ndeb);
1019 double tm=1./(nb_som_face*nb_som_face);
1021 double flux=h*surface_gap(face-ndeb)*tm;
1022 int opp_face = fmap(face-ndeb)+ndeb;
1024 for (
int i1=0; i1<nb_som_face; i1++)
1026 int glob2=face_sommets(face,i1);
1027 int glob3=face_sommets(opp_face,i1);
1028 for (
int j1=0; j1<nb_som_face; j1++)
1030 int glob1=face_sommets(face,j1);
1031 matrice.
coef(glob1,glob2) += flux;
1032 matrice.
coef(glob1,glob3) -= flux;
1042 for (
int face=ndeb; face<nfin; face++)
1044 double h=la_cl_paroi.
h_imp(face-ndeb);
1045 double tm=1./(nb_som_face*nb_som_face);
1046 double flux=h*domaine_EF.
surface(face)*tm;
1047 for (
int i1=0; i1<nb_som_face; i1++)
1049 int glob2=face_sommets(face,i1);
1050 for (
int j1=0; j1<nb_som_face; j1++)
1052 int glob1=face_sommets(face,j1);
1053 matrice.
coef(glob1,glob2) += flux;
1062 static int testee=0;
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Champ_front_calc_interne Classe derivee de Champ_front_calc qui represente
const IntVect & face_map() const
classe Cond_lim Classe generique servant a representer n'importe quelle classe
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_elem_tot() const
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
DoubleTab_t & les_sommets()
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
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
renvoie le numero du ieme sommet de la face num_face.
virtual double surface(int i) const
int nb_som_face() const
renvoie le nombre de sommets par 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 premiere_face_int() const
une face est interne ssi elle separe deux elements.
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
const Domaine & domaine() const
: class Echange_couplage_thermique
double flux_exterieur_impose(int i) const override
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
virtual double derivee_flux_exterieur_imposee(int i) const
virtual double h_imp(int num) const
Renvoie la valeur du coefficient d'echange de chaleur impose sur la i-eme composante.
virtual double T_ext(int num) const
Renvoie la valeur de la temperature imposee sur la i-eme composante du champ de frontiere.
Classe Echange_interne_global_impose: Cette classe represente le cas particulier de la classe.
const DoubleVect surface_gap() const
Classe Echange_interne_global_parfait Cette classe represente le cas particulier d'un echange interne...
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
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
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
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
Classe Neumann Cette classe est la classe de base de la hierarchie des conditions aux limites de type...
virtual double flux_impose(int i) const
Renvoie la valeur du flux impose sur la i-eme composante du champ representant le flux a la frontiere...
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
class Op_Conv_EF Cette classe represente l'operateur de convection associe a une equation de
class Op_Diff_EF_base Classe de base des operateurs de diffusion EF
class Op_Diff_EF Cette classe represente l'operateur de diffusion
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
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son 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
associe le champ de diffusivite
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
multiplie le flux bordpar rho cp ou rho si necessaire
virtual void completer()
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
virtual const MD_Vector & get_md_vector() const