16#include <Op_Conv_EF_VEF_P1NC_Stab.h>
17#include <Champ_P1NC.h>
18#include <BilanQdmVEF.h>
19#include <Sous_Domaine.h>
20#include <Sous_domaine_dis_base.h>
21#include <Schema_Temps_base.h>
23#include <Porosites_champ.h>
24#include <Sous_domaine_VF.h>
25#include <Probleme_base.h>
27#include <TRUSTVects.h>
31#include <Neumann_sortie_libre.h>
32#include <Dirichlet_homogene.h>
33#include <Neumann_homogene.h>
34#include <Periodique.h>
36#include <Echange_impose_base.h>
37#include <Array_tools.h>
73 Motcle motlu, accouverte =
"{" , accfermee =
"}" ;
76 les_mots[0] =
"alpha";
78 les_mots[2] =
"TdivU";
80 les_mots[4] =
"volumes_etendus";
81 les_mots[5] =
"volumes_non_etendus";
82 les_mots[6] =
"amont_sous_domaine";
83 les_mots[7] =
"amont_sous_zone";
84 les_mots[8] =
"nouvelle_matrice_implicite";
85 les_mots[9] =
"alpha_sous_domaine";
86 les_mots[10] =
"alpha_sous_zone";
90 if (motlu!=accouverte)
92 Cerr <<
"Erreur Op_Conv_EF_VEF_P1NC_Stab::readOn()" << finl;
93 Cerr <<
"Depuis la 1.5.3, la syntaxe du mot cle EF_stab a change." << finl;
94 Cerr <<
"Il faut commencer par une accolade ouvrante {" << finl;
95 Cerr <<
"et les options eventuelles sont entre les accolades:" << finl;
96 Cerr <<
"Convection { EF_stab } -> Convection { EF_stab { } }" << finl;
101 while(motlu!=accfermee)
103 int rang=les_mots.search(motlu);
140 s >> nom_sous_domaine;
143 s >> new_jacobienne_;
149 noms_ssz_alpha.dimensionner(nb_ssz_alpha);
150 alpha_ssz.resize(nb_ssz_alpha);
151 for (
int i=0; i<nb_ssz_alpha; i++)
153 s>>noms_ssz_alpha[i];
159 Cerr <<
"Erreur Op_Conv_EF_VEF_P1NC_Stab::readOn()" << finl;
160 Cerr <<
"Mot clef " << motlu <<
" non connu." << finl;
161 Cerr <<
"Sortie du programme." << finl;
175static KOKKOS_INLINE_FUNCTION
double maximum(
const double x,
181static KOKKOS_INLINE_FUNCTION
double maximum(
const double x,
185 return maximum(maximum(x,y),z);
188static KOKKOS_INLINE_FUNCTION
double minimum(
const double x,
194static KOKKOS_INLINE_FUNCTION
double Dij(
int elem,
199 const double kij=Kij(elem,face_loc_i,face_loc_j);
200 const double kji=Kij(elem,face_loc_j,face_loc_i);
201 return maximum(-kij,-kji,0);
204static inline double Dij(
int elem,
207 const DoubleTab& Kij)
209 const double kij=Kij(elem,face_loc_i,face_loc_j);
210 const double kji=Kij(elem,face_loc_j,face_loc_i);
211 return maximum(-kij,-kji,0);
214static KOKKOS_INLINE_FUNCTION
double limiteur(
double r)
216 return r<=0 ? 0 : Kokkos::fmax(Kokkos::fmin(2,r),Kokkos::fmin(1,2*r));
219KOKKOS_INLINE_FUNCTION
double formule_Id_2D(
int n)
224KOKKOS_INLINE_FUNCTION
double formule_Id_3D(
int n)
229KOKKOS_INLINE_FUNCTION
double formule_2D(
int n)
245KOKKOS_INLINE_FUNCTION
double formule_3D(
int n)
273void Op_Conv_EF_VEF_P1NC_Stab::reinit_conv_pour_Cl(
const DoubleTab& transporte,
const IntList& faces,
const DoubleTabs& valeurs_faces,
const DoubleTab& tab_vitesse, DoubleTab& resu)
const
275 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
276 const Domaine_Cl_VEF& domaine_Cl_VEF=la_zcl_vef.valeur();
279 const int nb_comp=transporte.
line_size();
280 int n_bord=0, num1=0, num2=0, ind_face=0,facei=0, dim=0;
283 const DoubleVect& transporteV= transporte;
286 for (n_bord=0; n_bord<nb_bord; n_bord++)
289 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
293 if (sub_type(Neumann_sortie_libre,la_cl.valeur()))
295 const Neumann_sortie_libre& la_sortie_libre
296 = ref_cast(Neumann_sortie_libre, la_cl.valeur());
297 ToDo_Kokkos(
"critical");
298 for (ind_face=num1; ind_face<num2; ind_face++)
304 psc-=tab_vitesse(facei,dim)*face_normales(facei,dim);
307 for (dim=0; dim<nb_comp; dim++)
308 resu(facei,dim)+=psc*(la_sortie_libre.
val_ext(facei-num1,dim)-transporteV[facei*nb_comp+dim]);
317 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
320 const int nb_faces_elem = domaine_VEF.
elem_faces().line_size();
323 assert(tab_Kij.
nb_dim()==3);
324 assert(tab_Kij.
dimension(0)==nb_elem_tot);
326 assert(tab_Kij.
dimension(1)==nb_faces_elem);
331 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
332 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
333 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
335 DoubleTabView3 Kij = tab_Kij.
view_rw<3>();
336 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
337 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
338 const int elem,
const int face_loci)
340 int face_i=elem_faces(elem,face_loci);
343 if(face_voisins(face_i,0)!=elem) signei=-1.0;
346 for(
int comp=0; comp<dim; comp++)
347 psci+=
vitesse(face_i,comp)*face_normales(face_i,comp);
351 for(
int face_locj=face_loci+1; face_locj<nb_faces_elem; face_locj++)
353 int face_j=elem_faces(elem,face_locj);
355 if(face_voisins(face_j,0)!=elem)
360 for(
int comp=0; comp<dim; comp++)
361 pscj+=
vitesse(face_j,comp)*face_normales(face_j,comp);
364 Kokkos::atomic_add(&Kij(elem,face_loci,face_locj), -1./nb_faces_elem*pscj);
365 Kokkos::atomic_add(&Kij(elem,face_loci,face_loci), +1./nb_faces_elem*pscj);
366 Kokkos::atomic_add(&Kij(elem,face_locj,face_loci), -1./nb_faces_elem*psci);
367 Kokkos::atomic_add(&Kij(elem,face_locj,face_locj), +1./nb_faces_elem*psci);
370 end_gpu_timer(__KERNEL_NAME__);
376 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
380 if ( (sub_type(
Dirichlet,la_cl.valeur()))
385 if ( volumes_etendus_ )
388 CIntTabView elem_faces_dirichlet_v = elem_faces_dirichlet_.view_ro();
389 CIntArrView elem_nb_faces_dirichlet_v = elem_nb_faces_dirichlet_.view_ro();
390 CIntArrView elem_faces_frontiere_v = elem_faces_frontiere[n_bord].view_ro();
391 const int elem_faces_frontiere_size = elem_faces_frontiere[n_bord].size_array();
395 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
396 Kokkos::RangePolicy<>(0,elem_faces_frontiere_size), KOKKOS_LAMBDA(
399 const int elem=elem_faces_frontiere_v(elem_ind);
401 const int nb_faces_bord = elem_nb_faces_dirichlet_v(elem);
407 const double coeff = (dim==2) ?
408 nb_faces_bord/2. : nb_faces_bord*nb_faces_bord/6.-nb_faces_bord/3.+1./2;
414 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
416 const int face_i = elem_faces(elem,face_loc_i);
419 bool is_not_on_boundary =
true;
420 for (
int f_loc=0; f_loc<nb_faces_bord; f_loc++)
421 is_not_on_boundary&=(face_i!=elem_faces_dirichlet_v(elem,f_loc));
423 if (is_not_on_boundary)
425 for (
int face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
429 for (
int f_loc=0; f_loc<nb_faces_bord; f_loc++)
431 const int face_bord = elem_faces_dirichlet_v(elem,f_loc);
432 const int face_loc_k = num_fac_loc(face_bord,0);
433 assert(face_loc_k>=0);
434 assert(face_loc_k<nb_faces_elem);
436 const double kkj = Kij(elem,face_loc_k,face_loc_j);
437 Kij(elem,face_loc_i,face_loc_j) += coeff*kkj;
452 for (
int f_loc=0; f_loc<nb_faces_bord; f_loc++)
454 const int face_bord = elem_faces_dirichlet_v(elem,f_loc);
455 const int face_loc_j = num_fac_loc(face_bord,0);
456 assert(face_loc_j>=0);
457 assert(face_loc_j<nb_faces_elem);
459 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
460 Kij(elem,face_loc_j,face_loc_i)=0;
471 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
474 for (
int face_loc_k=0; face_loc_k<nb_faces_elem; face_loc_k++)
476 sum+=Kij(elem,face_loc_i,face_loc_k);
479 Kij(elem,face_loc_i,face_loc_i) -= sum;
488 end_gpu_timer(__KERNEL_NAME__);
504 else if (sub_type(
Symetrie,la_cl.valeur()))
521 Cerr <<
"Erreur Op_Conv_EF_VEF_P1NC_Stab::calculer_coefficients_operateur_centre()" << finl;
522 Cerr <<
"Condition aux limites " << la_cl.que_suis_je() <<
" non codee." << finl;
523 Cerr <<
"Sortie du programme." << finl;
537 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
538 const int nb_faces = domaine_VEF.
nb_faces();
540 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
541 CDoubleTabView tab_vitesse = vitesse_->valeurs().
view_ro();
542 DoubleArrView fluent =
fluent_.view_rw();
543 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
544 Kokkos::RangePolicy<>(0, nb_faces), KOKKOS_LAMBDA(
548 for (
int i=0; i<nb_comp; i++)
549 psc+=tab_vitesse(num_face,i)*face_normales(num_face,i);
550 fluent(num_face)=std::fabs(psc);
552 end_gpu_timer(__KERNEL_NAME__);
557 DoubleTab& resu)
const
559 DoubleTab sauv(resu);
562 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
564 const DoubleTab& vitesse_2=la_vitesse.
valeurs();
567 const IntTab& elem_faces = domaine_VEF.
elem_faces();
570 const int nb_faces_elem=elem_faces.
dimension(1);
575 DoubleTab transporte_;
576 DoubleTab vitesse_face_;
580 const DoubleTab& tab_vitesse=modif_par_porosite_si_flag(vitesse_2,vitesse_face_,marq,porosite_face);
585 const DoubleTab& transporte=modif_par_porosite_si_flag(transporte_2,transporte_,!marq,porosite_face);
587 DoubleTrav Kij(nb_elem_tot,nb_faces_elem,nb_faces_elem);
607 ajouter_old(transporte,resu,tab_vitesse);
611 IntList NeumannFaces;
612 DoubleTabs ValeursNeumannFaces;
613 reinit_conv_pour_Cl(transporte,NeumannFaces,ValeursNeumannFaces,tab_vitesse,resu);
617 if (test_) test(transporte,resu,tab_vitesse);
630 DoubleTab& resu,
const DoubleTab& vitesse_2)
const
632 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
633 const IntTab& elem_faces=domaine_VEF.
elem_faces();
634 const IntTab& face_voisins = domaine_VEF.
face_voisins();
637 const int nb_faces_elem=elem_faces.
line_size();
644 DoubleTab tab_vitesse(vitesse_->valeurs());
645 DoubleTabView tab_vitesse_v = tab_vitesse.
view_rw();
646 CDoubleArrView porosite_face_v = porosite_face.view_ro();
648 const int vit_size0 = tab_vitesse.
dimension(0);
649 const int vit_size1 = tab_vitesse.
dimension(1);
650 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
651 Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {vit_size0, vit_size1}), KOKKOS_LAMBDA(
652 const int i,
const int j)
654 tab_vitesse_v(i,j)*=porosite_face_v(i);
656 end_gpu_timer(__KERNEL_NAME__);
657 const int nb_comp=transporte.
line_size();
659 int vol_etendus = volumes_etendus_;
662 CDoubleTabView face_normales_v = face_normales.
view_ro();
663 CIntTabView face_voisins_v = face_voisins.
view_ro();
664 CIntTabView elem_faces_v = elem_faces.
view_ro();
665 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
666 CIntArrView elem_nb_faces_dirichlet_v = elem_nb_faces_dirichlet_.view_ro();
667 CDoubleArrView porosite_elem_v = porosite_elem.view_ro();
669 DoubleArrView resuV =
static_cast<DoubleVect&
>(resu).view_rw();
671 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
672 Kokkos::RangePolicy<>(0, nb_elem_tot), KOKKOS_LAMBDA(
677 int type_elem=elem_nb_faces_dirichlet_v(elem);
680 coeff = (nb_dim==2) ? formule_Id_2D(type_elem) : formule_Id_3D(type_elem);
682 coeff = (nb_dim==2) ? formule_2D(type_elem) : formule_3D(type_elem);
684 int facei, facei_loc, dim;
688 for (facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
690 facei=elem_faces_v(elem,facei_loc);
691 double signe=(face_voisins_v(facei,0)==elem)? 1.:-1.;
693 for (dim=0; dim<nb_dim; dim++)
694 div+=signe*face_normales_v(facei,dim)*tab_vitesse_v(facei,dim);
697 if (!marq) div/=porosite_elem_v(elem);
700 for (facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
702 facei=elem_faces_v(elem,facei_loc);
703 for (dim=0; dim<nb_comp; dim++)
705 int ligne=facei*nb_comp+dim;
706 double delta = div*transporteV[ligne];
707 Kokkos::atomic_sub(&resuV[ligne], delta);
711 end_gpu_timer(__KERNEL_NAME__);
718 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
721 const int nb_comp=transporte.
line_size();
723 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
734 else if ( sub_type(
Neumann,la_cl.valeur())
737 || sub_type(
Symetrie,la_cl.valeur())
742 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
743 CIntArrView num_face = le_bord.
num_face().view_ro();
745 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
748 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
749 Kokkos::RangePolicy<>(num1, num2), KOKKOS_LAMBDA(
752 int facei = num_face(ind_face);
754 for (
int dim=0; dim<nb_dim; dim++)
755 psc-=
vitesse(facei,dim)*face_normales(facei,dim);
757 for (
int dim=0; dim<nb_comp; dim++)
758 flux_bords(facei,dim)=psc*transporteV[facei*nb_comp+dim];
760 end_gpu_timer(__KERNEL_NAME__);
765 Cerr <<
"Erreur Op_Conv_EF_VEF_P1NC_Stab::calculer_flux_bords()" << finl;
766 Cerr <<
"Condition aux limites " << la_cl.que_suis_je() <<
" non codee." << finl;
767 Cerr <<
"Sortie du programme." << finl;
776 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
778 const int nb_faces_elem=domaine_VEF.
elem_faces().line_size();
779 const int nb_comp=transporte.
line_size();
781 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
782 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
783 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
784 DoubleArrView resuV =
static_cast<DoubleVect&
>(resu).view_rw();
785 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
786 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
787 const int elem,
const int facei_loc)
789 int facei = elem_faces(elem, facei_loc);
790 for (
int facej_loc = facei_loc + 1; facej_loc < nb_faces_elem; facej_loc++)
792 int facej = elem_faces(elem, facej_loc);
793 double kij = Kij(elem, facei_loc, facej_loc);
794 double kji = Kij(elem, facej_loc, facei_loc);
796 for (
int dim = 0; dim < nb_comp; dim++)
798 int ligne = facei * nb_comp + dim;
799 int colonne = facej * nb_comp + dim;
800 double delta = transporteV[colonne] - transporteV[ligne];
801 Kokkos::atomic_add(&resuV[ligne], kij * delta);
802 Kokkos::atomic_sub(&resuV[colonne], kji * delta);
806 end_gpu_timer(__KERNEL_NAME__);
813 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
815 const int nb_faces_elem=domaine_VEF.
elem_faces().line_size();
816 const int nb_comp=transporte.
line_size();
818 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
819 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
820 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
821 CDoubleArrView alpha_tab = alpha_tab_.view_ro();
822 DoubleArrView resuV =
static_cast<DoubleVect&
>(resu).view_rw();
823 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
824 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
825 const int elem,
const int facei_loc)
827 int facei=elem_faces(elem,facei_loc);
828 for (
int facej_loc=facei_loc+1; facej_loc<nb_faces_elem; facej_loc++)
830 int facej=elem_faces(elem,facej_loc);
831 double dij=Dij(elem,facei_loc,facej_loc,Kij);
832 double coeffij=alpha_tab[facei]*dij;
833 double coeffji=alpha_tab[facej]*dij;
835 for (
int dim=0; dim<nb_comp; dim++)
837 int ligne=facei*nb_comp+dim;
838 int colonne=facej*nb_comp+dim;
839 double delta=transporteV[colonne]-transporteV[ligne];
843 Kokkos::atomic_add(&resuV[ligne], coeffij*delta);
844 Kokkos::atomic_sub(&resuV[colonne], coeffji*delta);
848 end_gpu_timer(__KERNEL_NAME__);
855 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
857 const int nb_faces_elem=domaine_VEF.
elem_faces().line_size();
858 const int nb_comp=transporte.
line_size();
859 if (nb_comp>3)
Process::exit(
"EF_stab is not coded for more than 3 components for array transporte.");
863 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
864 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
866 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
867 CDoubleArrView alpha_tab = alpha_tab_.view_ro();
868 CDoubleArrView beta = beta_.view_ro();
869 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
870 DoubleArrView resuV =
static_cast<DoubleVect&
>(resu).view_rw();
871 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
872 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
873 const int elem,
const int facei_loc)
875 double P_plus[3],P_moins[3],Q_plus[3],Q_moins[3];
876 int facei = elem_faces(elem, facei_loc);
877 calculer_senseur(Kij, transporteV, nb_comp, facei, elem_faces, face_voisins, num_fac_loc, P_plus, P_moins,
880 for (
int facej_loc = 0; facej_loc < nb_faces_elem; facej_loc++)
881 if (facej_loc != facei_loc)
883 int facej = elem_faces(elem, facej_loc);
885 double kij = Kij(elem, facei_loc, facej_loc);
886 double kji = Kij(elem, facej_loc, facei_loc);
887 double dij = Dij(elem, facei_loc, facej_loc, Kij);
888 double lij = kij + dij;
889 double lji = kji + dij;
895 int face_amont = facei;
896 int face_aval = facej;
900 double coeff = 1. * (lij < lji) + 0.5 * (lij == lji);
901 assert(coeff == 1. || coeff == 0.5);
904 double alpha_beta_amont = alpha_tab[face_amont] * beta[face_amont];
905 double alpha_beta_aval = alpha_tab[face_aval] * beta[face_aval];
907 for (
int dim = 0; dim < nb_comp; dim++)
909 int ligne = face_aval * nb_comp + dim;
910 int colonne = face_amont * nb_comp + dim;
912 double delta = transporteV[colonne] - transporteV[ligne];
916 if (delta >= 0.) R = (Kokkos::fabs(P_plus[dim]) < DMINFLOAT) ? 0. : Q_plus[dim] / P_plus[dim];
917 else R = (Kokkos::fabs(P_moins[dim]) < DMINFLOAT) ? 0. : Q_moins[dim] / P_moins[dim];
919 double limit = limiteur(R);
921 double daij = Kokkos::fmin(limit * dij, lji);
925 double coeffij = alpha_beta_amont * daij * coeff * delta;
926 double coeffji = alpha_beta_aval * daij * coeff * delta;
929 Kokkos::atomic_add(&resuV[colonne], + coeffij);
930 Kokkos::atomic_add(&resuV[ligne], - coeffji);
935 end_gpu_timer(__KERNEL_NAME__);
940KOKKOS_INLINE_FUNCTION
void
941Op_Conv_EF_VEF_P1NC_Stab::calculer_senseur(CDoubleTabView3 Kij, CDoubleArrView transporteV,
942 const int nb_comp,
const int face_i,
943 CIntTabView elem_faces, CIntTabView face_voisins, CIntTabView num_fac_loc,
944 double* P_plus,
double* P_moins,
945 double* Q_plus,
double* Q_moins)
const
947 for (
int i = 0; i < nb_comp; i++)
949 P_plus[i] = 0., P_moins[i] = 0.;
950 Q_plus[i] = 0., Q_moins[i] = 0.;
952 const int nb_faces_elem=(int)elem_faces.extent(1);
953 for (
int elem_voisin=0; elem_voisin<2; elem_voisin++)
955 int elem = face_voisins(face_i,elem_voisin);
958 int face_i_loc = num_fac_loc(face_i,elem_voisin);
960 for (
int face_k_loc=0; face_k_loc<nb_faces_elem; face_k_loc++)
962 int face_k=elem_faces(elem,face_k_loc);
963 double kik=Kij(elem,face_i_loc,face_k_loc);
967 for (
int dim=0; dim<nb_comp; dim++)
969 double deltaki = transporteV[face_k*nb_comp+dim]-transporteV[face_i*nb_comp+dim];
979 double tmp = kik*deltaki;
982 if (tmp>0) Q_plus[dim]+=tmp;
983 else Q_moins[dim]+=tmp;
987 if (tmp>0) P_plus[dim]+=tmp;
988 else P_moins[dim]+=tmp;
1001Op_Conv_EF_VEF_P1NC_Stab::calculer_senseur(
const DoubleTab& Kij,
const DoubleVect& transporteV,
1002 const int nb_comp,
const int face_i,
1003 const IntTab& elem_faces,
const IntTab& face_voisins,
const IntTab& num_fac_loc,
1004 ArrOfDouble& P_plus, ArrOfDouble& P_moins,
1005 ArrOfDouble& Q_plus, ArrOfDouble& Q_moins)
const
1011 const int nb_faces_elem=elem_faces.
dimension(1);
1012 for (
int elem_voisin=0; elem_voisin<2; elem_voisin++)
1014 int elem = face_voisins(face_i,elem_voisin);
1017 int face_i_loc = num_fac_loc(face_i,elem_voisin);
1018 assert(face_i_loc>=0);
1019 assert(face_i_loc<nb_faces_elem);
1021 for (
int face_k_loc=0; face_k_loc<nb_faces_elem; face_k_loc++)
1023 int face_k=elem_faces(elem,face_k_loc);
1024 double kik=Kij(elem,face_i_loc,face_k_loc);
1028 for (
int dim=0; dim<nb_comp; dim++)
1030 double deltaki = transporteV[face_k*nb_comp+dim]-transporteV[face_i*nb_comp+dim];
1040 double tmp = kik*deltaki;
1043 if (tmp>0) Q_plus[dim]+=tmp;
1044 else Q_moins[dim]+=tmp;
1048 if (tmp>0) P_plus[dim]+=tmp;
1049 else P_moins[dim]+=tmp;
1051 assert(P_plus[dim]>=0);
1052 assert(Q_plus[dim]>=0);
1053 assert(P_moins[dim]<=0);
1054 assert(Q_moins[dim]<=0);
1064void Op_Conv_EF_VEF_P1NC_Stab::test(
const DoubleTab& transporte,
const DoubleTab& resu,
const DoubleTab& tab_vitesse)
const
1066 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1067 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1068 const int nb_faces_elem=elem_faces.
dimension(1);
1069 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1071 DoubleTab Kij2(nb_elem_tot,nb_faces_elem, nb_faces_elem);
1074 DoubleTab Kij_ancien(nb_elem_tot,nb_faces_elem, nb_faces_elem);
1077 test_difference_Kij(transporte,Kij2,Kij_ancien,tab_vitesse);
1078 test_difference_resu(Kij2,Kij_ancien,transporte,resu,tab_vitesse);
1081void Op_Conv_EF_VEF_P1NC_Stab::test_difference_Kij(
const DoubleTab& transporte, DoubleTab& Kij, DoubleTab& Kij_ancien,
const DoubleTab& tab_vitesse )
const
1083 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1084 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1085 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1087 const int nb_faces_elem=elem_faces.
dimension(1);
1088 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1089 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
1091 const int nb_comp = (transporte.
nb_dim()!=1) ? transporte.
dimension(1) : 1;
1098 for(
int elem0=0; elem0<nb_elem_tot; elem0++)
1101 for(
int face_loci=0; face_loci<nb_faces_elem; face_loci++)
1103 int face_i0=elem_faces(elem0,face_loci);
1105 if(face_voisins(face_i0,0)!=elem0)
1109 psci+=tab_vitesse(face_i0,comp)*face_normales(face_i0,comp);
1112 for(face_locj=face_loci+1; face_locj<nb_faces_elem; face_locj++)
1114 int face_j0=elem_faces(elem0,face_locj);
1116 if(face_voisins(face_j0,0)!=elem0)
1122 pscj+=tab_vitesse(face_j0,comp)*face_normales(face_j0,comp);
1124 Kij_ancien(elem0,face_loci,face_locj)=-1./nb_faces_elem*pscj;
1125 Kij_ancien(elem0,face_loci,face_loci)+=1./nb_faces_elem*pscj;
1126 Kij_ancien(elem0,face_locj,face_loci)=-1./nb_faces_elem*psci;
1127 Kij_ancien(elem0,face_locj,face_locj)+=1./nb_faces_elem*psci;
1135 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1138 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1141 if ( (sub_type(Dirichlet,la_cl.valeur()))
1142 || (sub_type(Dirichlet_homogene,la_cl.valeur()))
1145 if ( volumes_etendus_ )
1147 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
1149 int face = le_bord.
num_face(ind_face);
1150 int elem=face_voisins(face,0);
1154 for (face_loc_j=0; (face_loc_j<nb_faces_elem && face_j!=face); face_loc_j++)
1156 face_j=elem_faces(elem,face_loc_j);
1159 assert(face_loc_j>=0);
1160 assert(face_loc_j<nb_faces_elem);
1161 assert(elem_faces(elem,face_loc_j)==face);
1162 const double kjj=Kij_ancien(elem,face_loc_j,face_loc_j);
1163 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1165 int face_i=elem_faces(elem,face_loc_i);
1168 double& kii=Kij_ancien(elem,face_loc_i,face_loc_i);
1169 const double kji=Kij_ancien(elem,face_loc_j,face_loc_i);
1171 double& kij=Kij_ancien(elem,face_loc_i,face_loc_j);
1173 for (
int face_loc_k=(face_loc_i+1); face_loc_k<nb_faces_elem; face_loc_k++)
1175 int face_k=elem_faces(elem,face_loc_k);
1178 double& kik=Kij_ancien(elem,face_loc_i,face_loc_k);
1179 const double kjk=Kij_ancien(elem,face_loc_j,face_loc_k);
1180 double& kki=Kij_ancien(elem,face_loc_k,face_loc_i);
1188 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1189 Kij_ancien(elem,face_loc_j,face_loc_i)=0;
1192 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1195 for (
int face_loc_k=0; face_loc_k<nb_faces_elem; face_loc_k++)
1197 sum+=Kij_ancien(elem,face_loc_i,face_loc_k);
1200 Kij_ancien(elem,face_loc_i,face_loc_i)-=sum;
1212 const double max_kij = local_max_abs_vect(Kij);
1213 if (max_kij > 1.e-15)
1215 Cerr <<
"Erreur dans le calcul des Kij : " << max_kij << finl;
1216 Cerr <<
"Sortie du programme" << finl;
1223void Op_Conv_EF_VEF_P1NC_Stab::test_difference_resu(
const DoubleTab& Kij,
const DoubleTab& Kij_ancien,
1224 const DoubleTab& transporte,
const DoubleTab& resu,
const DoubleTab& tab_vitesse)
const
1226 DoubleTab resu1(resu);
1235 DoubleTab resu2(resu);
1242 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1244 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1245 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1246 const int nb_faces_elem=elem_faces.
line_size();
1247 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1248 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
1250 const int nb_faces0 = transporte.
dimension(0);
1252 ArrOfDouble pplusi(nb_comp);
1253 ArrOfDouble qplusi(nb_comp);
1254 ArrOfDouble pmoinsi(nb_comp);
1255 ArrOfDouble qmoinsi(nb_comp);
1257 for(
int elem=0; elem<nb_elem_tot; elem++)
1261 for(
int face_loci=0; face_loci<nb_faces_elem; face_loci++)
1263 int face_i0=elem_faces(elem,face_loci);
1264 for(
int comp0=0; comp0<nb_comp; comp0++)
1265 resu2(face_i0,comp0)+=Kij_ancien(elem,face_loci,face_loci)*transporte(face_i0,comp0);
1272 int elem1=face_voisins(face_i0,0), elem2=face_voisins(face_i0,1);
1273 int face_loc_i=0, face_loc_j=0;
1274 double dT,min_dT,max_dT, K,min_K,max_K;
1279 while((face_loc_i<nb_faces_elem)&&(elem_faces(elem1,face_loc_i)!=face_i0))
1281 if(face_loc_i==nb_faces_elem)
1286 while( (face_loc_i<nb_faces_elem) &&
1287 (face_voisins(elem_faces(elem1,face_loc_i),0)!=elem2) &&
1288 (face_voisins(elem_faces(elem1,face_loc_i),1)!=elem2) )
1292 assert(face_loc_i<nb_faces_elem);
1293 for(face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
1295 int face_j=elem_faces(elem1,face_loc_j);
1298 K=Kij_ancien(elem1,face_loc_i,face_loc_j);
1311 for(
int comp0=0; comp0<nb_comp; comp0++)
1313 dT =transporte(face_j,comp0);
1314 dT-=transporte(face_i0,comp0);
1327 pplusi[comp0] +=min_K*min_dT;
1328 pmoinsi[comp0]+=min_K*max_dT;
1329 qplusi[comp0] +=max_K*max_dT;
1330 qmoinsi[comp0]+=max_K*min_dT;
1342 while((face_loc_i<nb_faces_elem)&&(elem_faces(elem2,face_loc_i)!=face_i0))
1344 if(face_loc_i==nb_faces_elem)
1348 while( (face_loc_i<nb_faces_elem) &&
1349 (face_voisins(elem_faces(elem2,face_loc_i),0)!=elem1) &&
1350 (face_voisins(elem_faces(elem2,face_loc_i),1)!=elem1) )
1353 assert(face_loc_i<nb_faces_elem);
1354 for(face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
1356 int face_j=elem_faces(elem2,face_loc_j);
1359 K=Kij_ancien(elem2,face_loc_i,face_loc_j);
1372 for(
int comp0=0; comp0<nb_comp; comp0++)
1374 dT =transporte(face_j,comp0);
1375 dT-=transporte(face_i0,comp0);
1388 pplusi[comp0] +=min_K*min_dT;
1389 pmoinsi[comp0]+=min_K*max_dT;
1390 qplusi[comp0] +=max_K*max_dT;
1391 qmoinsi[comp0]+=max_K*min_dT;
1397 for(face_locj=0; face_locj<nb_faces_elem; face_locj++)
1398 if(face_locj!=face_loci)
1400 int face_j0=elem_faces(elem,face_locj);
1401 const double kij=Kij_ancien(elem,face_loci,face_locj);
1402 const double kji=Kij_ancien(elem,face_locj,face_loci);
1403 double dij=Dij(elem,face_loci,face_locj,Kij_ancien);
1409 for(
int comp0=0; comp0<nb_comp; comp0++)
1411 const double Ti=transporte(face_i0,comp0);
1412 const double Tj=transporte(face_j0,comp0);
1413 double deltaij=Ti-Tj;
1418 if (lij==lji) coef=.5;
1425 double R=qplusi[comp0]/pplusi[comp0];
1426 Fij=minimum(limiteur(R)*dij,lji);
1429 else if(pmoinsi[comp0])
1431 double R=qmoinsi[comp0]/pmoinsi[comp0];
1432 Fij=minimum(limiteur(R)*dij,lji);
1439 resu2(face_i0,comp0)+=coef*(kij*Tj+Fij);
1440 resu2(face_j0,comp0)+=coef*(kji*Ti-Fij);
1451 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1454 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1457 int num2 = num1 + nb_faces_b;
1458 if (sub_type(Periodique,la_cl.valeur()))
1460 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
1462 IntVect fait(nb_faces_b);
1465 for (face=num1; face<num2; face++)
1467 if (fait(face-num1) == 0)
1469 fait(face-num1) = 1;
1471 fait(face_associee) = 1;
1472 for (
int comp=0; comp<nb_comp; comp++)
1473 resu2(face_associee+num1, comp)=(resu2(face,comp)+=resu2(face_associee+num1,comp));
1486 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1489 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1492 int num2 = num1 + nb_faces;
1494 if (sub_type(Dirichlet,la_cl.valeur()) || sub_type(Dirichlet_homogene,la_cl.valeur()))
1496 for (face=num1; face<num2; face++)
1497 for (
int dim=0; dim<nb_comp; dim++)
1502 const double max_abs_resu1 = local_max_abs_vect(resu1);
1503 Journal() <<
"local_max_abs_vect(resu1) = " << max_abs_resu1
1506 if (max_abs_resu1 > 1.e-15)
1508 Cerr <<
"Erreur dans le calcul des resu : " << max_abs_resu1 << finl;
1509 Cerr <<
"Affichage des faces de bord" << finl;
1512 Cerr <<
"Affichage des faces de bord." << finl;
1514 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1517 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1520 int num2 = num1 + nb_faces;
1522 if (sub_type(Periodique,la_cl.valeur()))
1524 Cerr <<
"Bord periodique : ";
1525 for (face=num1; face<num2; face++)
1527 Cerr << face <<
",";
1532 else if (sub_type(Dirichlet,la_cl.valeur()) || (sub_type(Dirichlet_homogene,la_cl.valeur())) )
1534 Cerr <<
"Bord de Dirichlet : ";
1535 for (face=num1; face<num2; face++)
1537 Cerr << face <<
",";
1546 Cerr <<
"Affichage des faces qui posent probleme : " << finl;
1549 for (
int face_i=0; face_i<nb_faces0; face_i++)
1551 if (resu1(face_i)>1.e-15)
1552 Cerr << face_i <<
"(" << face_voisins(face_i,0) <<
","
1553 << face_voisins(face_i,1) <<
") ; ";
1558 for (
int face_i=0; face_i<nb_faces0; face_i++)
1560 Cerr << face_i <<
"(" << face_voisins(face_i,0) <<
","
1561 << face_voisins(face_i,1) <<
") ";
1563 for (
int dim=0; dim<nb_comp; dim++)
1566 << face_i <<
"," << dim <<
")= "
1567 << resu1(face_i,dim);
1578 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1581 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1584 int num2 = num1 + nb_faces;
1586 if (sub_type(Periodique,la_cl.valeur()))
1588 Cerr <<
"Affichage des valeurs des resu au bord perio" << finl;
1589 for (face=num1; face<num2; face++)
1591 Cerr <<
"resu1(" << face <<
") : " << resu1(face) << finl;
1592 Cerr <<
"resu2(" << face <<
") : " << resu2(face) << finl;
1601 static int count = 0;
1605 Cerr <<
"Sortie du programme" << finl;
1618 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1628 CIntArrView le_bord_num_face =
static_cast<const ArrOfInt&
>(le_bord.
num_face()).view_ro();
1629 CIntArrView face_associee =
static_cast<const ArrOfInt&
>(la_cl_perio.
face_associee()).view_ro();
1630 DoubleArrView resuV =
static_cast<ArrOfDouble&
>(resu).view_rw();
1631 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(num1, num2), KOKKOS_LAMBDA(
const int ind_face)
1633 int facei = le_bord_num_face(ind_face);
1634 int ind_face_associee = face_associee(ind_face);
1635 int faceiAss = le_bord_num_face(ind_face_associee);
1638 for (
int dim=0; dim<nb_comp; dim++)
1640 int ligne=facei*nb_comp+dim;
1641 int ligneAss=faceiAss*nb_comp+dim;
1643 Kokkos::atomic_add(&resuV[ligneAss],resuV[ligne]);
1644 Kokkos::atomic_store(&resuV[ligne],resuV[ligneAss]);
1648 end_gpu_timer(__KERNEL_NAME__);
1654void Op_Conv_EF_VEF_P1NC_Stab::ajouter_old(
const DoubleTab& transporte, DoubleTab& resu,
const DoubleTab& tab_vitesse )
const
1656 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1660 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1661 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1663 const int nb_faces_elem=elem_faces.
dimension(1);
1664 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1671 int face_i0, face_j0, elem0, comp0;
1672 DoubleTab Kij(nb_elem_tot,nb_faces_elem, nb_faces_elem);
1676 for(elem0=0; elem0<nb_elem_tot; elem0++)
1680 for(; face_loci<nb_faces_elem; face_loci++)
1682 face_i0=elem_faces(elem0,face_loci);
1684 if(face_voisins(face_i0,0)!=elem0)
1688 psci+=tab_vitesse(face_i0,comp0)*face_normales(face_i0,comp0);
1691 for(face_locj=face_loci+1; face_locj<nb_faces_elem; face_locj++)
1693 face_j0=elem_faces(elem0,face_locj);
1695 if(face_voisins(face_j0,0)!=elem0)
1701 pscj+=tab_vitesse(face_j0,comp0)*face_normales(face_j0,comp0);
1703 Kij(elem0,face_loci,face_locj)=-1./nb_faces_elem*pscj;
1704 Kij(elem0,face_loci,face_loci)+=1./nb_faces_elem*pscj;
1705 Kij(elem0,face_locj,face_loci)=-1./nb_faces_elem*psci;
1706 Kij(elem0,face_locj,face_locj)+=1./nb_faces_elem*psci;
1717 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1720 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1722 if (( (sub_type(Dirichlet,la_cl.valeur())) || (sub_type(Dirichlet_homogene,la_cl.valeur())) )
1723 && ( volumes_etendus_))
1725 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
1728 int elem=face_voisins(face,0);
1732 for (face_loc_j=0; (face_loc_j<nb_faces_elem && face_j!=face); face_loc_j++)
1734 face_j=elem_faces(elem,face_loc_j);
1737 assert(face_loc_j>=0);
1738 assert(face_loc_j<nb_faces_elem);
1739 assert(elem_faces(elem,face_loc_j)==face);
1740 const double kjj=Kij(elem,face_loc_j,face_loc_j);
1741 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1743 int face_i=elem_faces(elem,face_loc_i);
1746 double& kii=Kij(elem,face_loc_i,face_loc_i);
1747 const double kji=Kij(elem,face_loc_j,face_loc_i);
1749 double& kij=Kij(elem,face_loc_i,face_loc_j);
1751 for (
int face_loc_k=(face_loc_i+1); face_loc_k<nb_faces_elem; face_loc_k++)
1753 int face_k=elem_faces(elem,face_loc_k);
1756 double& kik=Kij(elem,face_loc_i,face_loc_k);
1757 const double kjk=Kij(elem,face_loc_j,face_loc_k);
1758 double& kki=Kij(elem,face_loc_k,face_loc_i);
1766 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1767 Kij(elem,face_loc_j,face_loc_i)=0;
1770 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1773 for (
int face_loc_k=0; face_loc_k<nb_faces_elem; face_loc_k++)
1775 sum+=Kij(elem,face_loc_i,face_loc_k);
1778 Kij(elem,face_loc_i,face_loc_i)-=sum;
1790 ArrOfDouble pplusi(nb_comp);
1791 ArrOfDouble qplusi(nb_comp);
1792 ArrOfDouble pmoinsi(nb_comp);
1793 ArrOfDouble qmoinsi(nb_comp);
1795 for(elem0=0; elem0<nb_elem_tot; elem0++)
1800 for(; face_loci<nb_faces_elem; face_loci++)
1802 face_i0=elem_faces(elem0,face_loci);
1804 for(comp0=0; comp0<nb_comp; comp0++)
1805 resu(face_i0,comp0)+=Kij(elem0,face_loci,face_loci)*transporte(face_i0,comp0);
1807 pplusi=0., qplusi=0., pmoinsi=0., qmoinsi=0.;
1809 int elem1=face_voisins(face_i0,0);
1810 int elem2=face_voisins(face_i0,1);
1813 double dT,min_dT,max_dT;
1814 double K,min_K,max_K;
1819 while((face_loc_i<nb_faces_elem)&&(elem_faces(elem1,face_loc_i)!=face_i0))
1821 if(face_loc_i==nb_faces_elem)
1826 while( (face_loc_i<nb_faces_elem) &&
1827 (face_voisins(elem_faces(elem1,face_loc_i),0)!=elem2) &&
1828 (face_voisins(elem_faces(elem1,face_loc_i),1)!=elem2) )
1831 assert(face_loc_i<nb_faces_elem);
1832 for(face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
1834 int face_j=elem_faces(elem1,face_loc_j);
1837 K=Kij(elem1,face_loc_i,face_loc_j);
1850 for(comp0=0; comp0<nb_comp; comp0++)
1852 dT =transporte(face_j,comp0);
1853 dT-=transporte(face_i0,comp0);
1866 pplusi[comp0] +=min_K*min_dT;
1867 pmoinsi[comp0]+=min_K*max_dT;
1868 qplusi[comp0] +=max_K*max_dT;
1869 qmoinsi[comp0]+=max_K*min_dT;
1881 while((face_loc_i<nb_faces_elem)&&(elem_faces(elem2,face_loc_i)!=face_i0))
1883 if(face_loc_i==nb_faces_elem)
1887 while( (face_loc_i<nb_faces_elem) &&
1888 (face_voisins(elem_faces(elem2,face_loc_i),0)!=elem1) &&
1889 (face_voisins(elem_faces(elem2,face_loc_i),1)!=elem1) )
1892 assert(face_loc_i<nb_faces_elem);
1893 for(face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
1895 int face_j=elem_faces(elem2,face_loc_j);
1898 K=Kij(elem2,face_loc_i,face_loc_j);
1911 for(comp0=0; comp0<nb_comp; comp0++)
1913 dT =transporte(face_j,comp0);
1914 dT-=transporte(face_i0,comp0);
1927 pplusi[comp0] +=min_K*min_dT;
1928 pmoinsi[comp0]+=min_K*max_dT;
1929 qplusi[comp0] +=max_K*max_dT;
1930 qmoinsi[comp0]+=max_K*min_dT;
1938 for(face_locj=0; face_locj<nb_faces_elem; face_locj++)
1939 if(face_locj!=face_loci)
1941 face_j0=elem_faces(elem0,face_locj);
1942 const double kij=Kij(elem0,face_loci,face_locj);
1943 const double kji=Kij(elem0,face_locj,face_loci);
1944 double dij=Dij(elem0,face_loci,face_locj,Kij);
1950 for(comp0=0; comp0<nb_comp; comp0++)
1952 const double Ti=transporte(face_i0,comp0);
1953 const double Tj=transporte(face_j0,comp0);
1954 double deltaij=Ti-Tj;
1959 if (lij==lji) coef=.5;
1966 double R=qplusi[comp0]/pplusi[comp0];
1967 Fij=minimum(limiteur(R)*dij,lji);
1970 else if(pmoinsi[comp0])
1972 double R=qmoinsi[comp0]/pmoinsi[comp0];
1973 Fij=minimum(limiteur(R)*dij,lji);
1979 resu(face_i0,comp0)+=coef*(kij*Tj+Fij);
1980 resu(face_j0,comp0)+=coef*(kji*Ti-Fij);
1989 const int ncomp_ch_transporte = transporte.
line_size();
1991 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1994 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2000 if (sub_type(Neumann_sortie_libre,la_cl.valeur()))
2002 const Neumann_sortie_libre& la_sortie_libre = ref_cast(Neumann_sortie_libre, la_cl.valeur());
2005 int num2 = num1 + le_bord.
nb_faces();
2007 for (num_face=num1; num_face<num2; num_face++)
2011 psc += tab_vitesse(num_face,i)*face_normales(num_face,i);
2014 for (i=0; i<ncomp_ch_transporte; i++)
2015 resu(num_face,i) -= psc*transporte(num_face,i);
2019 for (i=0; i<ncomp_ch_transporte; i++)
2020 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
2026 else if (sub_type(Periodique,la_cl.valeur()))
2028 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
2029 int face_associee,ind_face_associee;
2030 IntVect fait(nb_faces_tot);
2033 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
2036 if (fait(ind_face) == 0)
2040 fait(ind_face_associee) = 1;
2041 face_associee=le_bord.
num_face(ind_face_associee);
2042 for (
int comp=0; comp<nb_comp; comp++)
2043 resu(face_associee, comp)=(resu(face,comp)+=resu(face_associee,comp));
2084void Op_Conv_EF_VEF_P1NC_Stab::calculer_data_pour_dirichlet()
2086 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
2087 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
2089 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2090 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
2096 elem_nb_faces_dirichlet_.resize(nb_elem_tot);
2098 elem_nb_faces_dirichlet_=0;
2099 elem_faces_dirichlet_=-1;
2100 elem_faces_frontiere.dimensionner(nb_bord);
2102 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
2105 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2108 if ( (sub_type(Dirichlet,la_cl.valeur()))
2109 || (sub_type(Dirichlet_homogene,la_cl.valeur()))
2115 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
2118 const int elem=face_voisins(face,0);
2120 elem_faces_frontiere[n_bord].append_array(elem);
2122 elem_nb_faces_dirichlet_(elem)+=1;
2125 if (elem_faces_dirichlet_(elem,0)==-1) elem_faces_dirichlet_(elem,0)=face;
2126 else if (elem_faces_dirichlet_(elem,1)==-1) elem_faces_dirichlet_(elem,1)=face;
2127 else if (
Objet_U::dimension==3 && elem_faces_dirichlet_(elem,2)==-1) elem_faces_dirichlet_(elem,2)=face;
2130 Cerr <<
"Erreur Op_Conv_EF_VEF_P1NC_Stab::calculer_data_pour_dirichlet()" << finl;
2131 Cerr <<
"L'element numero " << elem <<
" contient plus de "
2133 Cerr <<
"Sortie du programme." << finl;
2142 array_trier_retirer_doublons(elem_faces_frontiere[n_bord]);
2149 calculer_data_pour_dirichlet();
2158 alpha_tab_.resize_array(le_dom_vef->nb_faces_tot());
2159 alpha_tab_ = alpha_;
2160 beta_.resize_array(le_dom_vef->nb_faces_tot());
2165 for (
int i=0; i<nb_ssz_alpha; i++)
2182 Cerr <<
"On ne trouve pas le sous_domaine discretise associe a " << noms_ssz_alpha[i] << finl;
2188 for (
int face=0; face<nb_faces; face++)
2191 beta_[la_face] = 1.;
2192 alpha_tab_[la_face] = alpha_ssz(i);
2216 Cerr <<
"On ne trouve pas le sous_domaine discretise associe a " << nom_sous_domaine << finl;
2223 for (
int face=0; face<nb_faces; face++)
2226 beta_[la_face] = 0.;
2227 alpha_tab_[la_face] = 1.;
2235 if (new_jacobienne_==0)
2240 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
2242 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
2244 const int nb_comp=transporte_2.
line_size();
2246 DoubleTrav Kij(nb_elem_tot,nb_faces_elem,nb_faces_elem);
2253 const DoubleTab& vitesse_2=la_vitesse.
valeurs();
2255 DoubleTrav transporte_;
2256 DoubleTrav vitesse_face_;
2262 const DoubleTab& transporte=modif_par_porosite_si_flag(transporte_2,transporte_,!marq,porosite_face);
2263 const DoubleTab& tab_vitesse=modif_par_porosite_si_flag(vitesse_2,vitesse_face_,marq,porosite_face);
2266 if (is_compressible_) ajouter_contribution_partie_compressible(transporte,tab_vitesse,matrice);
2270 if (test_) test_implicite();
2280 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
2285 const int nb_faces_elem=domaine_VEF.
elem_faces().dimension(1);
2288 const int nb_comp=transporte.
line_size();
2290 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
2291 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
2292 Matrice_Morse_View matrice;
2293 matrice.set(matrice_morse);
2294 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
2295 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
2296 const int elem,
const int facei_loc)
2298 int facei = elem_faces(elem, facei_loc);
2300 for (
int facej_loc = facei_loc+1; facej_loc < nb_faces_elem; facej_loc++)
2302 int facej = elem_faces(elem, facej_loc);
2304 double kij = Kij(elem, facei_loc, facej_loc);
2305 double kji = Kij(elem, facej_loc, facei_loc);
2307 for (
int dim = 0; dim < nb_comp; dim++)
2309 int ligne = facei*nb_comp + dim;
2310 int colonne = facej*nb_comp + dim;
2313 matrice.atomic_add(ligne, ligne, kij);
2314 matrice.atomic_add(ligne, colonne, -kij);
2315 matrice.atomic_add(colonne, colonne, kji);
2316 matrice.atomic_add(colonne, ligne, -kji);
2320 end_gpu_timer(__KERNEL_NAME__);
2326 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
2336 int faceiAss=0,ind_faceiAss=0;
2337 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2338 for (
int ind_face=num1; ind_face<num2; ind_face++)
2342 int facei=le_bord.
num_face(ind_face);
2343 faceiAss=le_bord.
num_face(ind_faceiAss);
2347 for (
int elem_loc=0; elem_loc<2; elem_loc++)
2349 int elem=face_voisins(facei,elem_loc);
2353 int facei_loc=num_fac_loc(facei,elem_loc);
2356 faceToComplete=faceiAss;
2359 faceToComplete=facei;
2360 facei_loc=num_fac_loc(faceiAss,elem_loc);
2361 assert(facei_loc!=-1);
2365 for (
int facej_loc=0; facej_loc<nb_faces_elem; facej_loc++)
2367 int facej=elem_faces(elem,facej_loc);
2369 if (facej_loc!=facei_loc)
2371 double kij=Kij(elem,facei_loc,facej_loc);
2374 for (
int dim=0; dim<nb_comp; dim++)
2376 int ligne=faceToComplete*nb_comp+dim;
2377 int colonne=facej*nb_comp+dim;
2380 matrice_morse(ligne,ligne)+=kij;
2381 matrice_morse(ligne,colonne)-=kij;
2393 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
2396 const int nb_faces_elem=domaine_VEF.
elem_faces().line_size();
2398 const int nb_comp=transporte.
line_size();
2400 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
2401 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
2402 CDoubleArrView alpha_tab =
static_cast<const ArrOfDouble&
>(alpha_tab_).view_ro();
2403 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
2404 Matrice_Morse_View matrice;
2405 matrice.set(matrice_morse);
2406 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
2407 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
2408 const int elem,
const int facei_loc)
2410 int facei = elem_faces(elem, facei_loc);
2412 for (
int facej_loc = facei_loc+1; facej_loc < nb_faces_elem; facej_loc++)
2414 int facej = elem_faces(elem, facej_loc);
2416 double dij = Dij(elem, facei_loc, facej_loc, Kij);
2418 double coeffij = alpha_tab(facei)*dij;
2419 double coeffji = alpha_tab(facej)*dij;
2421 for (
int dim = 0; dim < nb_comp; dim++)
2423 int ligne = facei*nb_comp + dim;
2424 int colonne = facej*nb_comp + dim;
2428 matrice.atomic_add(ligne, ligne, coeffij);
2429 matrice.atomic_add(ligne, colonne, -coeffij);
2430 matrice.atomic_add(colonne, colonne, coeffji);
2431 matrice.atomic_add(colonne, ligne, -coeffji);
2435 end_gpu_timer(__KERNEL_NAME__);
2441 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
2451 int faceiAss=0,ind_faceiAss=0;
2453 for (
int ind_face=num1; ind_face<num2; ind_face++)
2455 int facei=le_bord.
num_face(ind_face);
2457 faceiAss=le_bord.
num_face(ind_faceiAss);
2461 for (
int elem_loc=0; elem_loc<2; elem_loc++)
2463 int elem=face_voisins(facei,elem_loc);
2467 int facei_loc=num_fac_loc(facei,elem_loc);
2470 faceToComplete=faceiAss;
2473 faceToComplete=facei;
2474 facei_loc=num_fac_loc(faceiAss,elem_loc);
2475 assert(facei_loc!=-1);
2479 for (
int facej_loc=0; facej_loc<nb_faces_elem; facej_loc++)
2481 int facej=elem_faces(elem,facej_loc);
2483 if (facej_loc!=facei_loc)
2485 double dij=Dij(elem,facei_loc,facej_loc,tab_Kij);
2488 double coeffij=alpha_tab_[faceToComplete]*dij;
2491 for (
int dim=0; dim<nb_comp; dim++)
2493 int ligne=faceToComplete*nb_comp+dim;
2494 int colonne=facej*nb_comp+dim;
2497 matrice_morse(ligne,ligne)+=coeffij;
2498 matrice_morse(ligne,colonne)-=coeffij;
2515void Op_Conv_EF_VEF_P1NC_Stab::ajouter_contribution_partie_compressible(
const DoubleTab& transporte,
const DoubleTab& vitesse_2,
2518 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
2520 const IntTab& elem_faces=domaine_VEF.
elem_faces();
2521 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2524 const int nb_faces_elem=elem_faces.
line_size();
2532 DoubleTrav tab_vitesse(vitesse_->valeurs());
2533 for (
int i=0; i<tab_vitesse.
dimension(0); i++)
2534 for (
int j=0; j<tab_vitesse.
line_size(); j++)
2535 tab_vitesse(i,j)*=porosite_face(i);
2537 const int nb_comp=transporte.
line_size();
2539 double (*formule)(int);
2541 if (!volumes_etendus_)
2542 formule= (
dimension==2) ? &formule_Id_2D : &formule_Id_3D;
2544 formule= (
dimension==2) ? &formule_2D : &formule_3D;
2546 ToDo_Kokkos(
"critical");
2547 for (
int elem=0; elem<nb_elem_tot; elem++)
2551 int type_elem=elem_nb_faces_dirichlet_(elem);
2552 double coeff=formule(type_elem);
2556 for (
int facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
2558 int facei=elem_faces(elem,facei_loc);
2559 int signe=(face_voisins(facei,0)==elem)? 1.:-1.;
2562 div+=signe*face_normales(facei,dim)*tab_vitesse(facei,dim);
2565 if (!marq) div/=porosite_elem(elem);
2568 for (
int facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
2570 int facei=elem_faces(elem,facei_loc);
2572 for (
int dim=0; dim<nb_comp; dim++)
2574 int ligne=facei*nb_comp+dim;
2575 matrice(ligne,ligne)+=div;
2584 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
2587 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2591 if (sub_type(Periodique,la_cl.valeur()))
2593 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
2595 for (
int ind_face=num1; ind_face<num2; ind_face++)
2597 int facei = le_bord.
num_face(ind_face);
2599 int faceiAss = le_bord.
num_face(ind_faceiAss);
2603 for (
int elem_loc=0; elem_loc<2; elem_loc++)
2605 int elem = face_voisins(facei,elem_loc);
2609 int facei_loc=num_fac_loc(facei,elem_loc);
2612 faceToComplete=faceiAss;
2615 faceToComplete=facei;
2616 facei_loc=num_fac_loc(faceiAss,elem_loc);
2617 assert(facei_loc!=-1);
2622 int type_elem=elem_nb_faces_dirichlet_(elem);
2623 double coeff=formule(type_elem);
2627 for (facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
2629 facei=elem_faces(elem,facei_loc);
2630 int signe=(face_voisins(facei,0)==elem)? 1.:-1.;
2633 div+=signe*face_normales(facei,dim)*tab_vitesse(facei,dim);
2636 if (!marq) div/=porosite_elem(elem);
2639 for (
int dim=0; dim<nb_comp; dim++)
2641 int ligne=faceToComplete*nb_comp+dim;
2642 matrice(ligne,ligne)+=div;
2650void Op_Conv_EF_VEF_P1NC_Stab::ajouter_contribution_antidiffusion(
const DoubleTab& Kij,
const DoubleTab& transporte,
2653 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
2654 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
2655 const IntTab& elem_faces=domaine_VEF.
elem_faces();
2656 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2658 const int nb_faces_elem=elem_faces.
line_size();
2660 const int nb_comp=transporte.
line_size();
2662 int elem=0, elem_loc=0, facei=0,facei_loc=0, faceiAss=0, ind_face=0,ind_faceiAss=0;
2663 int facej=0,facej_loc=0, ligne=0,colonne=0, dim=0, face_amont=0,face_aval=0;
2664 int faceToComplete=0, num1=0,num2=0, n_bord=0;
2665 double kij=0.,kji=0.,dij=0., lij=0.,lji=0., daij=0.;
2666 double delta=0., coeffij=0.,coeffji=0., coeff=0., R=0.;
2669 ArrOfDouble P_plus(nb_comp),P_moins(nb_comp);
2670 ArrOfDouble Q_plus(nb_comp),Q_moins(nb_comp);
2671 P_plus=0., P_moins=0., Q_plus=0., Q_moins=0.;
2673 const DoubleVect& transporteV = transporte;
2674 const ArrOfDouble& alpha_tab = alpha_tab_;
2676 ToDo_Kokkos(
"critical");
2677 for (elem=0; elem<nb_elem_tot; elem++)
2678 for (facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
2680 facei=elem_faces(elem,facei_loc);
2681 P_plus=0., P_moins=0., Q_plus=0., Q_moins=0.;
2682 calculer_senseur(Kij,transporteV,nb_comp,facei,elem_faces,face_voisins,num_fac_loc,P_plus,P_moins,Q_plus,Q_moins);
2683 for (facej_loc=0; facej_loc<nb_faces_elem; facej_loc++)
2684 if (facej_loc!=facei_loc)
2686 facej=elem_faces(elem,facej_loc);
2688 kij = Kij(elem,facei_loc,facej_loc);
2689 kji = Kij(elem,facej_loc,facei_loc);
2690 dij = Dij(elem,facei_loc,facej_loc,Kij);
2703 coeff = 1.*(lij<lji)+0.5*(lij==lji);
2704 assert(coeff==1. || coeff==0.5);
2706 for (dim=0; dim<nb_comp; dim++)
2708 ligne=face_amont*nb_comp+dim;
2709 colonne=face_aval*nb_comp+dim;
2711 delta=transporteV[ligne]-transporteV[colonne];
2720 if (delta>=0.) R=(std::fabs(P_plus[dim])<DMINFLOAT) ? 0. : Q_plus[dim]/P_plus[dim];
2721 else R=(std::fabs(P_moins[dim])<DMINFLOAT) ? 0. : Q_moins[dim]/P_moins[dim];
2724 daij=minimum(limiteur(R)*dij,lji);
2727 coeffij=alpha_tab_[face_amont]*beta_[face_amont]*daij;
2728 coeffji=alpha_tab_[face_aval]*beta_[face_aval]*daij;
2731 matrice(ligne,ligne)-=coeffij*coeff;
2732 matrice(ligne,colonne)+=coeffij*coeff;
2733 matrice(colonne,colonne)-=coeffji*coeff;
2734 matrice(colonne,ligne)+=coeffji*coeff;
2743 for (n_bord=0; n_bord<nb_bord; n_bord++)
2746 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2750 if (sub_type(Periodique,la_cl.valeur()))
2752 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
2755 ArrOfDouble Pj_plus(nb_comp),Pj_moins(nb_comp);
2756 ArrOfDouble Qj_plus(nb_comp),Qj_moins(nb_comp);
2757 Pj_plus=0., Pj_moins=0.;
2758 Qj_plus=0., Qj_moins=0.;
2760 for (ind_face=num1; ind_face<num2; ind_face++)
2764 faceiAss=le_bord.
num_face(ind_faceiAss);
2768 for (elem_loc=0; elem_loc<2; elem_loc++)
2770 elem=face_voisins(facei,elem_loc);
2774 facei_loc=num_fac_loc(facei,elem_loc);
2776 faceToComplete=faceiAss;
2779 faceToComplete=facei;
2780 facei_loc=num_fac_loc(faceiAss,elem_loc);
2781 assert(facei_loc!=-1);
2785 P_plus=0., P_moins=0.;
2786 Q_plus=0., Q_moins=0.;
2787 calculer_senseur(Kij,transporteV,nb_comp,faceToComplete,elem_faces,face_voisins,num_fac_loc,P_plus,P_moins,Q_plus,Q_moins);
2789 for (facej_loc=0; facej_loc<nb_faces_elem; facej_loc++)
2790 if (facej_loc!=facei_loc)
2792 facej=elem_faces(elem,facej_loc);
2794 kij = Kij(elem,facei_loc,facej_loc);
2795 kji = Kij(elem,facej_loc,facei_loc);
2796 dij = Dij(elem,facei_loc,facej_loc,Kij);
2804 face_amont=faceToComplete;
2809 coeff = 1.*(lij<lji)+0.5*(lij==lji);
2810 assert(coeff==1. || coeff==0.5);
2812 for (dim=0; dim<nb_comp; dim++)
2814 ligne=face_amont*nb_comp+dim;
2815 colonne=face_aval*nb_comp+dim;
2816 delta=transporteV[ligne]-transporteV[colonne];
2825 if (delta>=0.) R=(std::fabs(P_plus[dim])<DMINFLOAT) ? 0. : Q_plus[dim]/P_plus[dim];
2826 else R=(std::fabs(P_moins[dim])<DMINFLOAT) ? 0. : Q_moins[dim]/P_moins[dim];
2828 daij=minimum(limiteur(R)*dij,lji);
2831 coeffij=alpha_tab[face_amont]*beta_[face_amont]*daij;
2834 matrice(ligne,ligne)-=coeffij*coeff;
2835 matrice(ligne,colonne)+=coeffij*coeff;
2840 face_aval=faceToComplete;
2843 Pj_plus=0., Pj_moins=0., Qj_plus=0., Qj_moins=0.;
2844 calculer_senseur(Kij,transporteV,nb_comp,facej,elem_faces,face_voisins,num_fac_loc,Pj_plus,Pj_moins,Qj_plus,Qj_moins);
2846 for (dim=0; dim<nb_comp; dim++)
2848 ligne=face_amont*nb_comp+dim;
2849 colonne=face_aval*nb_comp+dim;
2851 delta=transporteV[ligne]-transporteV[colonne];
2860 if (delta>=0.) R=(std::fabs(Pj_plus[dim])<DMINFLOAT) ? 0. : Qj_plus[dim]/Pj_plus[dim];
2861 else R=(std::fabs(Pj_moins[dim])<DMINFLOAT) ? 0. : Qj_moins[dim]/Pj_moins[dim];
2863 daij=minimum(limiteur(R)*dij,lij);
2866 coeffij=alpha_tab[face_aval]*beta_[face_aval]*daij;
2869 matrice(colonne,colonne)-=coeffij*coeff;
2870 matrice(colonne,ligne)+=coeffij*coeff;
2880void Op_Conv_EF_VEF_P1NC_Stab::test_implicite()
const
2882 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
2883 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
2886 const DoubleTab& tab_vitesse=vitesse_->valeurs();
2888 DoubleTab tab_test(unknown);
2889 DoubleVect& test2 = tab_test;
2892 DoubleTab resuExp(unknown);
2893 DoubleVect& resu2Exp = resuExp;
2896 DoubleTab resuImp(unknown);
2897 DoubleVect& resu2Imp = resuImp;
2900 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
2905 DoubleTab Kij(nb_elem_tot,nb_faces_elem,nb_faces_elem);
2910 int face=0,face2=0, faceAss=0, ind_face=0,ind_faceAss=0, n_bord=0, num1=0,num2=0;
2912 SFichier testResu(
"test.txt");
2913 SFichier testMat(
"matrice.txt");
2918 IntTab faces_associees(nb_faces_tot);
2919 for (face=0; face<nb_faces_tot; face++)
2920 faces_associees(face)=face;
2922 for (n_bord=0; n_bord<nb_bord; n_bord++)
2925 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2929 if (sub_type(Periodique,la_cl.valeur()))
2931 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
2933 for (ind_face=num1; ind_face<num2; ind_face++)
2937 faceAss=le_bord.
num_face(ind_faceAss);
2942 faces_associees(face)=faceAss;
2943 faces_associees(faceAss)=face;
2957 Matrice_Morse matrice;
2959 if (is_compressible_)
2960 ajouter_contribution_partie_compressible(unknown,tab_vitesse,matrice);
2963 ajouter_contribution_antidiffusion(Kij,unknown,matrice);
2972 for (face=0; face<size; face++)
2975 test2[faces_associees(face)]=1.;
2979 if (is_compressible_)
2994 testResu<<
"*************************"<<finl;
2995 testResu<<
"Face test : "<<face<<finl;
2996 for (face2=0; face2<size; face2++)
2997 if (resu2Exp[face2]<=1.e-13)
2998 testResu<<face2<<
" OK"<<finl;
3000 testResu<<face2<<
" residu : "<<resu2Exp[face2]<<finl;
3001 testResu<<
"*************************"<<finl;
3004 test2[faces_associees(face)]=0.;
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Classe Dirichlet_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
const Sous_Domaine_t & ss_domaine(int i) const
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le 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.
int nb_faces() const
renvoie le nombre global de faces.
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
const IntTab & get_num_fac_loc() const
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.
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
int nombre_de_sous_domaines_dis() const
const Sous_domaine_dis_base & sous_domaine_dis(int i) const
const Domaine & domaine() const
classe Echange_impose_base: Cette condition limite sert uniquement pour l'equation d'energie.
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
int num_premiere_face() const
int num_face(const int) const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
Sortie & imprimer_formatte(Sortie &s) const override
DoubleVect & ajouter_multvect_(const DoubleVect &, DoubleVect &) const override
Operation de multiplication-accumulation (saxpy) matrice vecteur.
DoubleVect & porosite_elem()
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Classe Neumann_homogene Cette classe est la classe de base de la hierarchie des conditions aux limite...
double val_ext(int i) const override
Renvoie la valeur de la i-eme composante du champ impose a l'exterieur de la frontiere.
Classe Neumann_val_ext Cette classe est la classe de base de la hierarchie des conditions.
Classe Neumann Cette classe est la classe de base de la hierarchie des conditions aux limites de type...
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 int est_egal_a(const Objet_U &) const
Renvoie 1 si l'objet x et *this sont une seule et meme instance (meme adresse en memoire).
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
class Op_Conv_EF_VEF_P1NC_Stab
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
DoubleTab & ajouter_diffusion(const DoubleTab &, const DoubleTab &, DoubleTab &) const
void remplir_fluent() 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_diffusion(const DoubleTab &, const DoubleTab &, Matrice_Morse &) const
void calculer_coefficients_operateur_centre(DoubleTab &, const int, const DoubleTab &vitesse) const
public_for_cuda void calculer_flux_bords(const DoubleTab &, const DoubleTab &, const DoubleTab &) const
void ajouter_contribution_operateur_centre(const DoubleTab &, const DoubleTab &, Matrice_Morse &) const
DoubleTab & ajouter_operateur_centre(const DoubleTab &, const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_partie_compressible(const DoubleTab &, DoubleTab &, const DoubleTab &vitesse) const
DoubleTab & ajouter_antidiffusion(const DoubleTab &, const DoubleTab &, DoubleTab &) const
void modifier_pour_Cl(Matrice_Morse &, DoubleTab &) const override
DOES NOTHING - to override in derived classes.
void mettre_a_jour_pour_periodicite(DoubleTab &) const
void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const override
void dimensionner(Matrice_Morse &) const override
on dimensionne notre matrice au moyen de la methode dimensionner de la classe Op_VEF_Face.
virtual void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
void modifier_pour_Cl(Matrice_Morse &, DoubleTab &) const override
On modifie le second membre et la matrice dans le cas des conditions de dirichlet.
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
int phi_u_transportant(const Equation_base &eq) const
definit si l'on convecte psi avec phi*u ou avec u
const Champ_Inc_base & vitesse() const
void modifier_flux(const Operateur_base &) const
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
static KOKKOS_INLINE_FUNCTION void Kokkos_exit(const char *)
Routine de sortie de TRUST dans une region Kokkos.
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
Cette classe abstraite contient les informations geometrique de sous-domaine communes aux methodes de...
const IntTab & les_faces() const
const Sous_Domaine & sous_domaine() const
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
_SIZE_ size_array() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
_SIZE_ dimension(int d) const