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 <<
"Error Op_Conv_EF_VEF_P1NC_Stab::readOn()" << finl;
93 Cerr <<
"Since version 1.5.3, the syntax of the keyword EF_stab has changed." << finl;
94 Cerr <<
"It must begin with an opening brace {" << finl;
95 Cerr <<
"and the optional parameters are between the braces:" << 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 <<
"Error Op_Conv_EF_VEF_P1NC_Stab::readOn()" << finl;
160 Cerr <<
"Keyword " << motlu <<
" not recognized." << finl;
161 Cerr <<
"Exiting." << 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 <<
"Error Op_Conv_EF_VEF_P1NC_Stab::calculer_coefficients_operateur_centre()" << finl;
522 Cerr <<
"Boundary condition " << la_cl.que_suis_je() <<
" not implemented." << finl;
523 Cerr <<
"Exiting." << 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);
629 DoubleTab& resu,
const DoubleTab& vitesse_2)
const
631 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
632 const IntTab& elem_faces=domaine_VEF.
elem_faces();
633 const IntTab& face_voisins = domaine_VEF.
face_voisins();
636 const int nb_faces_elem=elem_faces.
line_size();
643 DoubleTab tab_vitesse(vitesse_->valeurs());
644 DoubleTabView tab_vitesse_v = tab_vitesse.
view_rw();
645 CDoubleArrView porosite_face_v = porosite_face.view_ro();
647 const int vit_size0 = tab_vitesse.
dimension(0);
648 const int vit_size1 = tab_vitesse.
dimension(1);
649 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
650 Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {vit_size0, vit_size1}), KOKKOS_LAMBDA(
651 const int i,
const int j)
653 tab_vitesse_v(i,j)*=porosite_face_v(i);
655 end_gpu_timer(__KERNEL_NAME__);
656 const int nb_comp=transporte.
line_size();
658 int vol_etendus = volumes_etendus_;
661 CDoubleTabView face_normales_v = face_normales.
view_ro();
662 CIntTabView face_voisins_v = face_voisins.
view_ro();
663 CIntTabView elem_faces_v = elem_faces.
view_ro();
664 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
665 CIntArrView elem_nb_faces_dirichlet_v = elem_nb_faces_dirichlet_.view_ro();
666 CDoubleArrView porosite_elem_v = porosite_elem.view_ro();
668 DoubleArrView resuV =
static_cast<DoubleVect&
>(resu).view_rw();
670 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
671 Kokkos::RangePolicy<>(0, nb_elem_tot), KOKKOS_LAMBDA(
676 int type_elem=elem_nb_faces_dirichlet_v(elem);
679 coeff = (nb_dim==2) ? formule_Id_2D(type_elem) : formule_Id_3D(type_elem);
681 coeff = (nb_dim==2) ? formule_2D(type_elem) : formule_3D(type_elem);
683 int facei, facei_loc, dim;
687 for (facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
689 facei=elem_faces_v(elem,facei_loc);
690 double signe=(face_voisins_v(facei,0)==elem)? 1.:-1.;
692 for (dim=0; dim<nb_dim; dim++)
693 div+=signe*face_normales_v(facei,dim)*tab_vitesse_v(facei,dim);
696 if (!marq) div/=porosite_elem_v(elem);
699 for (facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
701 facei=elem_faces_v(elem,facei_loc);
702 for (dim=0; dim<nb_comp; dim++)
704 int ligne=facei*nb_comp+dim;
705 double delta = div*transporteV[ligne];
706 Kokkos::atomic_sub(&resuV[ligne], delta);
710 end_gpu_timer(__KERNEL_NAME__);
717 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
720 const int nb_comp=transporte.
line_size();
722 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
733 else if ( sub_type(
Neumann,la_cl.valeur())
736 || sub_type(
Symetrie,la_cl.valeur())
741 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
742 CIntArrView num_face = le_bord.
num_face().view_ro();
744 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
747 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
748 Kokkos::RangePolicy<>(num1, num2), KOKKOS_LAMBDA(
751 int facei = num_face(ind_face);
753 for (
int dim=0; dim<nb_dim; dim++)
754 psc-=
vitesse(facei,dim)*face_normales(facei,dim);
756 for (
int dim=0; dim<nb_comp; dim++)
757 flux_bords(facei,dim)=psc*transporteV[facei*nb_comp+dim];
759 end_gpu_timer(__KERNEL_NAME__);
764 Cerr <<
"Error Op_Conv_EF_VEF_P1NC_Stab::calculer_flux_bords()" << finl;
765 Cerr <<
"Boundary condition " << la_cl.que_suis_je() <<
" not implemented." << finl;
766 Cerr <<
"Exiting." << finl;
775 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
777 const int nb_faces_elem=domaine_VEF.
elem_faces().line_size();
778 const int nb_comp=transporte.
line_size();
780 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
781 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
782 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
783 DoubleArrView resuV =
static_cast<DoubleVect&
>(resu).view_rw();
784 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
785 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
786 const int elem,
const int facei_loc)
788 int facei = elem_faces(elem, facei_loc);
789 for (
int facej_loc = facei_loc + 1; facej_loc < nb_faces_elem; facej_loc++)
791 int facej = elem_faces(elem, facej_loc);
792 double kij = Kij(elem, facei_loc, facej_loc);
793 double kji = Kij(elem, facej_loc, facei_loc);
795 for (
int dim = 0; dim < nb_comp; dim++)
797 int ligne = facei * nb_comp + dim;
798 int colonne = facej * nb_comp + dim;
799 double delta = transporteV[colonne] - transporteV[ligne];
800 Kokkos::atomic_add(&resuV[ligne], kij * delta);
801 Kokkos::atomic_sub(&resuV[colonne], kji * delta);
805 end_gpu_timer(__KERNEL_NAME__);
812 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
814 const int nb_faces_elem=domaine_VEF.
elem_faces().line_size();
815 const int nb_comp=transporte.
line_size();
817 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
818 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
819 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
820 CDoubleArrView alpha_tab = alpha_tab_.view_ro();
821 DoubleArrView resuV =
static_cast<DoubleVect&
>(resu).view_rw();
822 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
823 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
824 const int elem,
const int facei_loc)
826 int facei=elem_faces(elem,facei_loc);
827 for (
int facej_loc=facei_loc+1; facej_loc<nb_faces_elem; facej_loc++)
829 int facej=elem_faces(elem,facej_loc);
830 double dij=Dij(elem,facei_loc,facej_loc,Kij);
831 double coeffij=alpha_tab[facei]*dij;
832 double coeffji=alpha_tab[facej]*dij;
834 for (
int dim=0; dim<nb_comp; dim++)
836 int ligne=facei*nb_comp+dim;
837 int colonne=facej*nb_comp+dim;
838 double delta=transporteV[colonne]-transporteV[ligne];
842 Kokkos::atomic_add(&resuV[ligne], coeffij*delta);
843 Kokkos::atomic_sub(&resuV[colonne], coeffji*delta);
847 end_gpu_timer(__KERNEL_NAME__);
854 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
856 const int nb_faces_elem=domaine_VEF.
elem_faces().line_size();
857 const int nb_comp=transporte.
line_size();
858 if (nb_comp>3)
Process::exit(
"EF_stab is not coded for more than 3 components for array transporte.");
862 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
863 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
865 CDoubleArrView transporteV =
static_cast<const DoubleVect&
>(transporte).view_ro();
866 CDoubleArrView alpha_tab = alpha_tab_.view_ro();
867 CDoubleArrView beta = beta_.view_ro();
868 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
869 DoubleArrView resuV =
static_cast<DoubleVect&
>(resu).view_rw();
870 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
871 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
872 const int elem,
const int facei_loc)
874 double P_plus[3],P_moins[3],Q_plus[3],Q_moins[3];
875 int facei = elem_faces(elem, facei_loc);
876 calculer_senseur(Kij, transporteV, nb_comp, facei, elem_faces, face_voisins, num_fac_loc, P_plus, P_moins,
879 for (
int facej_loc = 0; facej_loc < nb_faces_elem; facej_loc++)
880 if (facej_loc != facei_loc)
882 int facej = elem_faces(elem, facej_loc);
884 double kij = Kij(elem, facei_loc, facej_loc);
885 double kji = Kij(elem, facej_loc, facei_loc);
886 double dij = Dij(elem, facei_loc, facej_loc, Kij);
887 double lij = kij + dij;
888 double lji = kji + dij;
894 int face_amont = facei;
895 int face_aval = facej;
899 double coeff = 1. * (lij < lji) + 0.5 * (lij == lji);
900 assert(coeff == 1. || coeff == 0.5);
903 double alpha_beta_amont = alpha_tab[face_amont] * beta[face_amont];
904 double alpha_beta_aval = alpha_tab[face_aval] * beta[face_aval];
906 for (
int dim = 0; dim < nb_comp; dim++)
908 int ligne = face_aval * nb_comp + dim;
909 int colonne = face_amont * nb_comp + dim;
911 double delta = transporteV[colonne] - transporteV[ligne];
915 if (delta >= 0.) R = (Kokkos::fabs(P_plus[dim]) < DMINFLOAT) ? 0. : Q_plus[dim] / P_plus[dim];
916 else R = (Kokkos::fabs(P_moins[dim]) < DMINFLOAT) ? 0. : Q_moins[dim] / P_moins[dim];
918 double limit = limiteur(R);
920 double daij = Kokkos::fmin(limit * dij, lji);
924 double coeffij = alpha_beta_amont * daij * coeff * delta;
925 double coeffji = alpha_beta_aval * daij * coeff * delta;
928 Kokkos::atomic_add(&resuV[colonne], + coeffij);
929 Kokkos::atomic_add(&resuV[ligne], - coeffji);
934 end_gpu_timer(__KERNEL_NAME__);
939KOKKOS_INLINE_FUNCTION
void
940Op_Conv_EF_VEF_P1NC_Stab::calculer_senseur(CDoubleTabView3 Kij, CDoubleArrView transporteV,
941 const int nb_comp,
const int face_i,
942 CIntTabView elem_faces, CIntTabView face_voisins, CIntTabView num_fac_loc,
943 double* P_plus,
double* P_moins,
944 double* Q_plus,
double* Q_moins)
const
946 for (
int i = 0; i < nb_comp; i++)
948 P_plus[i] = 0., P_moins[i] = 0.;
949 Q_plus[i] = 0., Q_moins[i] = 0.;
951 const int nb_faces_elem=(int)elem_faces.extent(1);
952 for (
int elem_voisin=0; elem_voisin<2; elem_voisin++)
954 int elem = face_voisins(face_i,elem_voisin);
957 int face_i_loc = num_fac_loc(face_i,elem_voisin);
959 for (
int face_k_loc=0; face_k_loc<nb_faces_elem; face_k_loc++)
961 int face_k=elem_faces(elem,face_k_loc);
962 double kik=Kij(elem,face_i_loc,face_k_loc);
966 for (
int dim=0; dim<nb_comp; dim++)
968 double deltaki = transporteV[face_k*nb_comp+dim]-transporteV[face_i*nb_comp+dim];
978 double tmp = kik*deltaki;
981 if (tmp>0) Q_plus[dim]+=tmp;
982 else Q_moins[dim]+=tmp;
986 if (tmp>0) P_plus[dim]+=tmp;
987 else P_moins[dim]+=tmp;
1000Op_Conv_EF_VEF_P1NC_Stab::calculer_senseur(
const DoubleTab& Kij,
const DoubleVect& transporteV,
1001 const int nb_comp,
const int face_i,
1002 const IntTab& elem_faces,
const IntTab& face_voisins,
const IntTab& num_fac_loc,
1003 ArrOfDouble& P_plus, ArrOfDouble& P_moins,
1004 ArrOfDouble& Q_plus, ArrOfDouble& Q_moins)
const
1010 const int nb_faces_elem=elem_faces.
dimension(1);
1011 for (
int elem_voisin=0; elem_voisin<2; elem_voisin++)
1013 int elem = face_voisins(face_i,elem_voisin);
1016 int face_i_loc = num_fac_loc(face_i,elem_voisin);
1017 assert(face_i_loc>=0);
1018 assert(face_i_loc<nb_faces_elem);
1020 for (
int face_k_loc=0; face_k_loc<nb_faces_elem; face_k_loc++)
1022 int face_k=elem_faces(elem,face_k_loc);
1023 double kik=Kij(elem,face_i_loc,face_k_loc);
1027 for (
int dim=0; dim<nb_comp; dim++)
1029 double deltaki = transporteV[face_k*nb_comp+dim]-transporteV[face_i*nb_comp+dim];
1039 double tmp = kik*deltaki;
1042 if (tmp>0) Q_plus[dim]+=tmp;
1043 else Q_moins[dim]+=tmp;
1047 if (tmp>0) P_plus[dim]+=tmp;
1048 else P_moins[dim]+=tmp;
1050 assert(P_plus[dim]>=0);
1051 assert(Q_plus[dim]>=0);
1052 assert(P_moins[dim]<=0);
1053 assert(Q_moins[dim]<=0);
1063void Op_Conv_EF_VEF_P1NC_Stab::test(
const DoubleTab& transporte,
const DoubleTab& resu,
const DoubleTab& tab_vitesse)
const
1065 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1066 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1067 const int nb_faces_elem=elem_faces.
dimension(1);
1068 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1070 DoubleTab Kij2(nb_elem_tot,nb_faces_elem, nb_faces_elem);
1073 DoubleTab Kij_ancien(nb_elem_tot,nb_faces_elem, nb_faces_elem);
1076 test_difference_Kij(transporte,Kij2,Kij_ancien,tab_vitesse);
1077 test_difference_resu(Kij2,Kij_ancien,transporte,resu,tab_vitesse);
1080void Op_Conv_EF_VEF_P1NC_Stab::test_difference_Kij(
const DoubleTab& transporte, DoubleTab& Kij, DoubleTab& Kij_ancien,
const DoubleTab& tab_vitesse )
const
1082 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1083 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1084 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1086 const int nb_faces_elem=elem_faces.
dimension(1);
1087 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1088 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
1090 const int nb_comp = (transporte.
nb_dim()!=1) ? transporte.
dimension(1) : 1;
1097 for(
int elem0=0; elem0<nb_elem_tot; elem0++)
1100 for(
int face_loci=0; face_loci<nb_faces_elem; face_loci++)
1102 int face_i0=elem_faces(elem0,face_loci);
1104 if(face_voisins(face_i0,0)!=elem0)
1108 psci+=tab_vitesse(face_i0,comp)*face_normales(face_i0,comp);
1111 for(face_locj=face_loci+1; face_locj<nb_faces_elem; face_locj++)
1113 int face_j0=elem_faces(elem0,face_locj);
1115 if(face_voisins(face_j0,0)!=elem0)
1121 pscj+=tab_vitesse(face_j0,comp)*face_normales(face_j0,comp);
1123 Kij_ancien(elem0,face_loci,face_locj)=-1./nb_faces_elem*pscj;
1124 Kij_ancien(elem0,face_loci,face_loci)+=1./nb_faces_elem*pscj;
1125 Kij_ancien(elem0,face_locj,face_loci)=-1./nb_faces_elem*psci;
1126 Kij_ancien(elem0,face_locj,face_locj)+=1./nb_faces_elem*psci;
1134 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1137 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1140 if ( (sub_type(Dirichlet,la_cl.valeur()))
1141 || (sub_type(Dirichlet_homogene,la_cl.valeur()))
1144 if ( volumes_etendus_ )
1146 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
1148 int face = le_bord.
num_face(ind_face);
1149 int elem=face_voisins(face,0);
1153 for (face_loc_j=0; (face_loc_j<nb_faces_elem && face_j!=face); face_loc_j++)
1155 face_j=elem_faces(elem,face_loc_j);
1158 assert(face_loc_j>=0);
1159 assert(face_loc_j<nb_faces_elem);
1160 assert(elem_faces(elem,face_loc_j)==face);
1161 const double kjj=Kij_ancien(elem,face_loc_j,face_loc_j);
1162 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1164 int face_i=elem_faces(elem,face_loc_i);
1167 double& kii=Kij_ancien(elem,face_loc_i,face_loc_i);
1168 const double kji=Kij_ancien(elem,face_loc_j,face_loc_i);
1170 double& kij=Kij_ancien(elem,face_loc_i,face_loc_j);
1172 for (
int face_loc_k=(face_loc_i+1); face_loc_k<nb_faces_elem; face_loc_k++)
1174 int face_k=elem_faces(elem,face_loc_k);
1177 double& kik=Kij_ancien(elem,face_loc_i,face_loc_k);
1178 const double kjk=Kij_ancien(elem,face_loc_j,face_loc_k);
1179 double& kki=Kij_ancien(elem,face_loc_k,face_loc_i);
1187 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1188 Kij_ancien(elem,face_loc_j,face_loc_i)=0;
1191 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1194 for (
int face_loc_k=0; face_loc_k<nb_faces_elem; face_loc_k++)
1196 sum+=Kij_ancien(elem,face_loc_i,face_loc_k);
1199 Kij_ancien(elem,face_loc_i,face_loc_i)-=sum;
1211 const double max_kij = local_max_abs_vect(Kij);
1212 if (max_kij > 1.e-15)
1214 Cerr <<
"Error in Kij computation: " << max_kij << finl;
1215 Cerr <<
"Exiting" << finl;
1222void Op_Conv_EF_VEF_P1NC_Stab::test_difference_resu(
const DoubleTab& Kij,
const DoubleTab& Kij_ancien,
1223 const DoubleTab& transporte,
const DoubleTab& resu,
const DoubleTab& tab_vitesse)
const
1225 DoubleTab resu1(resu);
1234 DoubleTab resu2(resu);
1241 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1243 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1244 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1245 const int nb_faces_elem=elem_faces.
line_size();
1246 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1247 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
1249 const int nb_faces0 = transporte.
dimension(0);
1251 ArrOfDouble pplusi(nb_comp);
1252 ArrOfDouble qplusi(nb_comp);
1253 ArrOfDouble pmoinsi(nb_comp);
1254 ArrOfDouble qmoinsi(nb_comp);
1256 for(
int elem=0; elem<nb_elem_tot; elem++)
1260 for(
int face_loci=0; face_loci<nb_faces_elem; face_loci++)
1262 int face_i0=elem_faces(elem,face_loci);
1263 for(
int comp0=0; comp0<nb_comp; comp0++)
1264 resu2(face_i0,comp0)+=Kij_ancien(elem,face_loci,face_loci)*transporte(face_i0,comp0);
1271 int elem1=face_voisins(face_i0,0), elem2=face_voisins(face_i0,1);
1272 int face_loc_i=0, face_loc_j=0;
1273 double dT,min_dT,max_dT, K,min_K,max_K;
1278 while((face_loc_i<nb_faces_elem)&&(elem_faces(elem1,face_loc_i)!=face_i0))
1280 if(face_loc_i==nb_faces_elem)
1285 while( (face_loc_i<nb_faces_elem) &&
1286 (face_voisins(elem_faces(elem1,face_loc_i),0)!=elem2) &&
1287 (face_voisins(elem_faces(elem1,face_loc_i),1)!=elem2) )
1291 assert(face_loc_i<nb_faces_elem);
1292 for(face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
1294 int face_j=elem_faces(elem1,face_loc_j);
1297 K=Kij_ancien(elem1,face_loc_i,face_loc_j);
1310 for(
int comp0=0; comp0<nb_comp; comp0++)
1312 dT =transporte(face_j,comp0);
1313 dT-=transporte(face_i0,comp0);
1326 pplusi[comp0] +=min_K*min_dT;
1327 pmoinsi[comp0]+=min_K*max_dT;
1328 qplusi[comp0] +=max_K*max_dT;
1329 qmoinsi[comp0]+=max_K*min_dT;
1341 while((face_loc_i<nb_faces_elem)&&(elem_faces(elem2,face_loc_i)!=face_i0))
1343 if(face_loc_i==nb_faces_elem)
1347 while( (face_loc_i<nb_faces_elem) &&
1348 (face_voisins(elem_faces(elem2,face_loc_i),0)!=elem1) &&
1349 (face_voisins(elem_faces(elem2,face_loc_i),1)!=elem1) )
1352 assert(face_loc_i<nb_faces_elem);
1353 for(face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
1355 int face_j=elem_faces(elem2,face_loc_j);
1358 K=Kij_ancien(elem2,face_loc_i,face_loc_j);
1371 for(
int comp0=0; comp0<nb_comp; comp0++)
1373 dT =transporte(face_j,comp0);
1374 dT-=transporte(face_i0,comp0);
1387 pplusi[comp0] +=min_K*min_dT;
1388 pmoinsi[comp0]+=min_K*max_dT;
1389 qplusi[comp0] +=max_K*max_dT;
1390 qmoinsi[comp0]+=max_K*min_dT;
1396 for(face_locj=0; face_locj<nb_faces_elem; face_locj++)
1397 if(face_locj!=face_loci)
1399 int face_j0=elem_faces(elem,face_locj);
1400 const double kij=Kij_ancien(elem,face_loci,face_locj);
1401 const double kji=Kij_ancien(elem,face_locj,face_loci);
1402 double dij=Dij(elem,face_loci,face_locj,Kij_ancien);
1408 for(
int comp0=0; comp0<nb_comp; comp0++)
1410 const double Ti=transporte(face_i0,comp0);
1411 const double Tj=transporte(face_j0,comp0);
1412 double deltaij=Ti-Tj;
1417 if (lij==lji) coef=.5;
1424 double R=qplusi[comp0]/pplusi[comp0];
1425 Fij=minimum(limiteur(R)*dij,lji);
1428 else if(pmoinsi[comp0])
1430 double R=qmoinsi[comp0]/pmoinsi[comp0];
1431 Fij=minimum(limiteur(R)*dij,lji);
1438 resu2(face_i0,comp0)+=coef*(kij*Tj+Fij);
1439 resu2(face_j0,comp0)+=coef*(kji*Ti-Fij);
1450 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1453 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1456 int num2 = num1 + nb_faces_b;
1457 if (sub_type(Periodique,la_cl.valeur()))
1459 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
1461 IntVect fait(nb_faces_b);
1464 for (face=num1; face<num2; face++)
1466 if (fait(face-num1) == 0)
1468 fait(face-num1) = 1;
1470 fait(face_associee) = 1;
1471 for (
int comp=0; comp<nb_comp; comp++)
1472 resu2(face_associee+num1, comp)=(resu2(face,comp)+=resu2(face_associee+num1,comp));
1485 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1488 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1491 int num2 = num1 + nb_faces;
1493 if (sub_type(Dirichlet,la_cl.valeur()) || sub_type(Dirichlet_homogene,la_cl.valeur()))
1495 for (face=num1; face<num2; face++)
1496 for (
int dim=0; dim<nb_comp; dim++)
1501 const double max_abs_resu1 = local_max_abs_vect(resu1);
1502 Journal() <<
"local_max_abs_vect(resu1) = " << max_abs_resu1
1505 if (max_abs_resu1 > 1.e-15)
1507 Cerr <<
"Error in resu computation: " << max_abs_resu1 << finl;
1508 Cerr <<
"Displaying boundary faces" << finl;
1511 Cerr <<
"Displaying boundary faces." << finl;
1513 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1516 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1519 int num2 = num1 + nb_faces;
1521 if (sub_type(Periodique,la_cl.valeur()))
1523 Cerr <<
"Periodic boundary: ";
1524 for (face=num1; face<num2; face++)
1526 Cerr << face <<
",";
1531 else if (sub_type(Dirichlet,la_cl.valeur()) || (sub_type(Dirichlet_homogene,la_cl.valeur())) )
1533 Cerr <<
"Dirichlet boundary: ";
1534 for (face=num1; face<num2; face++)
1536 Cerr << face <<
",";
1545 Cerr <<
"Display of problematic faces: " << finl;
1548 for (
int face_i=0; face_i<nb_faces0; face_i++)
1550 if (resu1(face_i)>1.e-15)
1551 Cerr << face_i <<
"(" << face_voisins(face_i,0) <<
","
1552 << face_voisins(face_i,1) <<
") ; ";
1557 for (
int face_i=0; face_i<nb_faces0; face_i++)
1559 Cerr << face_i <<
"(" << face_voisins(face_i,0) <<
","
1560 << face_voisins(face_i,1) <<
") ";
1562 for (
int dim=0; dim<nb_comp; dim++)
1565 << face_i <<
"," << dim <<
")= "
1566 << resu1(face_i,dim);
1577 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1580 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1583 int num2 = num1 + nb_faces;
1585 if (sub_type(Periodique,la_cl.valeur()))
1587 Cerr <<
"Display of resu values at the periodic boundary" << finl;
1588 for (face=num1; face<num2; face++)
1590 Cerr <<
"resu1(" << face <<
") : " << resu1(face) << finl;
1591 Cerr <<
"resu2(" << face <<
") : " << resu2(face) << finl;
1600 static int count = 0;
1604 Cerr <<
"Exiting" << finl;
1617 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1627 CIntArrView le_bord_num_face =
static_cast<const ArrOfInt&
>(le_bord.
num_face()).view_ro();
1628 CIntArrView face_associee =
static_cast<const ArrOfInt&
>(la_cl_perio.
face_associee()).view_ro();
1629 DoubleArrView resuV =
static_cast<ArrOfDouble&
>(resu).view_rw();
1630 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(num1, num2), KOKKOS_LAMBDA(
const int ind_face)
1632 int facei = le_bord_num_face(ind_face);
1633 int ind_face_associee = face_associee(ind_face);
1634 int faceiAss = le_bord_num_face(ind_face_associee);
1637 for (
int dim=0; dim<nb_comp; dim++)
1639 int ligne=facei*nb_comp+dim;
1640 int ligneAss=faceiAss*nb_comp+dim;
1642 Kokkos::atomic_add(&resuV[ligneAss],resuV[ligne]);
1643 Kokkos::atomic_store(&resuV[ligne],resuV[ligneAss]);
1647 end_gpu_timer(__KERNEL_NAME__);
1653void Op_Conv_EF_VEF_P1NC_Stab::ajouter_old(
const DoubleTab& transporte, DoubleTab& resu,
const DoubleTab& tab_vitesse )
const
1655 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1659 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1660 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1662 const int nb_faces_elem=elem_faces.
dimension(1);
1663 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1670 int face_i0, face_j0, elem0, comp0;
1671 DoubleTab Kij(nb_elem_tot,nb_faces_elem, nb_faces_elem);
1675 for(elem0=0; elem0<nb_elem_tot; elem0++)
1679 for(; face_loci<nb_faces_elem; face_loci++)
1681 face_i0=elem_faces(elem0,face_loci);
1683 if(face_voisins(face_i0,0)!=elem0)
1687 psci+=tab_vitesse(face_i0,comp0)*face_normales(face_i0,comp0);
1690 for(face_locj=face_loci+1; face_locj<nb_faces_elem; face_locj++)
1692 face_j0=elem_faces(elem0,face_locj);
1694 if(face_voisins(face_j0,0)!=elem0)
1700 pscj+=tab_vitesse(face_j0,comp0)*face_normales(face_j0,comp0);
1702 Kij(elem0,face_loci,face_locj)=-1./nb_faces_elem*pscj;
1703 Kij(elem0,face_loci,face_loci)+=1./nb_faces_elem*pscj;
1704 Kij(elem0,face_locj,face_loci)=-1./nb_faces_elem*psci;
1705 Kij(elem0,face_locj,face_locj)+=1./nb_faces_elem*psci;
1716 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1719 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1721 if (( (sub_type(Dirichlet,la_cl.valeur())) || (sub_type(Dirichlet_homogene,la_cl.valeur())) )
1722 && ( volumes_etendus_))
1724 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
1727 int elem=face_voisins(face,0);
1731 for (face_loc_j=0; (face_loc_j<nb_faces_elem && face_j!=face); face_loc_j++)
1733 face_j=elem_faces(elem,face_loc_j);
1736 assert(face_loc_j>=0);
1737 assert(face_loc_j<nb_faces_elem);
1738 assert(elem_faces(elem,face_loc_j)==face);
1739 const double kjj=Kij(elem,face_loc_j,face_loc_j);
1740 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1742 int face_i=elem_faces(elem,face_loc_i);
1745 double& kii=Kij(elem,face_loc_i,face_loc_i);
1746 const double kji=Kij(elem,face_loc_j,face_loc_i);
1748 double& kij=Kij(elem,face_loc_i,face_loc_j);
1750 for (
int face_loc_k=(face_loc_i+1); face_loc_k<nb_faces_elem; face_loc_k++)
1752 int face_k=elem_faces(elem,face_loc_k);
1755 double& kik=Kij(elem,face_loc_i,face_loc_k);
1756 const double kjk=Kij(elem,face_loc_j,face_loc_k);
1757 double& kki=Kij(elem,face_loc_k,face_loc_i);
1765 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1766 Kij(elem,face_loc_j,face_loc_i)=0;
1769 for (
int face_loc_i=0; face_loc_i<nb_faces_elem; face_loc_i++)
1772 for (
int face_loc_k=0; face_loc_k<nb_faces_elem; face_loc_k++)
1774 sum+=Kij(elem,face_loc_i,face_loc_k);
1777 Kij(elem,face_loc_i,face_loc_i)-=sum;
1789 ArrOfDouble pplusi(nb_comp);
1790 ArrOfDouble qplusi(nb_comp);
1791 ArrOfDouble pmoinsi(nb_comp);
1792 ArrOfDouble qmoinsi(nb_comp);
1794 for(elem0=0; elem0<nb_elem_tot; elem0++)
1799 for(; face_loci<nb_faces_elem; face_loci++)
1801 face_i0=elem_faces(elem0,face_loci);
1803 for(comp0=0; comp0<nb_comp; comp0++)
1804 resu(face_i0,comp0)+=Kij(elem0,face_loci,face_loci)*transporte(face_i0,comp0);
1806 pplusi=0., qplusi=0., pmoinsi=0., qmoinsi=0.;
1808 int elem1=face_voisins(face_i0,0);
1809 int elem2=face_voisins(face_i0,1);
1812 double dT,min_dT,max_dT;
1813 double K,min_K,max_K;
1818 while((face_loc_i<nb_faces_elem)&&(elem_faces(elem1,face_loc_i)!=face_i0))
1820 if(face_loc_i==nb_faces_elem)
1825 while( (face_loc_i<nb_faces_elem) &&
1826 (face_voisins(elem_faces(elem1,face_loc_i),0)!=elem2) &&
1827 (face_voisins(elem_faces(elem1,face_loc_i),1)!=elem2) )
1830 assert(face_loc_i<nb_faces_elem);
1831 for(face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
1833 int face_j=elem_faces(elem1,face_loc_j);
1836 K=Kij(elem1,face_loc_i,face_loc_j);
1849 for(comp0=0; comp0<nb_comp; comp0++)
1851 dT =transporte(face_j,comp0);
1852 dT-=transporte(face_i0,comp0);
1865 pplusi[comp0] +=min_K*min_dT;
1866 pmoinsi[comp0]+=min_K*max_dT;
1867 qplusi[comp0] +=max_K*max_dT;
1868 qmoinsi[comp0]+=max_K*min_dT;
1880 while((face_loc_i<nb_faces_elem)&&(elem_faces(elem2,face_loc_i)!=face_i0))
1882 if(face_loc_i==nb_faces_elem)
1886 while( (face_loc_i<nb_faces_elem) &&
1887 (face_voisins(elem_faces(elem2,face_loc_i),0)!=elem1) &&
1888 (face_voisins(elem_faces(elem2,face_loc_i),1)!=elem1) )
1891 assert(face_loc_i<nb_faces_elem);
1892 for(face_loc_j=0; face_loc_j<nb_faces_elem; face_loc_j++)
1894 int face_j=elem_faces(elem2,face_loc_j);
1897 K=Kij(elem2,face_loc_i,face_loc_j);
1910 for(comp0=0; comp0<nb_comp; comp0++)
1912 dT =transporte(face_j,comp0);
1913 dT-=transporte(face_i0,comp0);
1926 pplusi[comp0] +=min_K*min_dT;
1927 pmoinsi[comp0]+=min_K*max_dT;
1928 qplusi[comp0] +=max_K*max_dT;
1929 qmoinsi[comp0]+=max_K*min_dT;
1937 for(face_locj=0; face_locj<nb_faces_elem; face_locj++)
1938 if(face_locj!=face_loci)
1940 face_j0=elem_faces(elem0,face_locj);
1941 const double kij=Kij(elem0,face_loci,face_locj);
1942 const double kji=Kij(elem0,face_locj,face_loci);
1943 double dij=Dij(elem0,face_loci,face_locj,Kij);
1949 for(comp0=0; comp0<nb_comp; comp0++)
1951 const double Ti=transporte(face_i0,comp0);
1952 const double Tj=transporte(face_j0,comp0);
1953 double deltaij=Ti-Tj;
1958 if (lij==lji) coef=.5;
1965 double R=qplusi[comp0]/pplusi[comp0];
1966 Fij=minimum(limiteur(R)*dij,lji);
1969 else if(pmoinsi[comp0])
1971 double R=qmoinsi[comp0]/pmoinsi[comp0];
1972 Fij=minimum(limiteur(R)*dij,lji);
1978 resu(face_i0,comp0)+=coef*(kij*Tj+Fij);
1979 resu(face_j0,comp0)+=coef*(kji*Ti-Fij);
1988 const int ncomp_ch_transporte = transporte.
line_size();
1990 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1993 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1999 if (sub_type(Neumann_sortie_libre,la_cl.valeur()))
2001 const Neumann_sortie_libre& la_sortie_libre = ref_cast(Neumann_sortie_libre, la_cl.valeur());
2004 int num2 = num1 + le_bord.
nb_faces();
2006 for (num_face=num1; num_face<num2; num_face++)
2010 psc += tab_vitesse(num_face,i)*face_normales(num_face,i);
2013 for (i=0; i<ncomp_ch_transporte; i++)
2014 resu(num_face,i) -= psc*transporte(num_face,i);
2018 for (i=0; i<ncomp_ch_transporte; i++)
2019 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
2025 else if (sub_type(Periodique,la_cl.valeur()))
2027 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
2028 int face_associee,ind_face_associee;
2029 IntVect fait(nb_faces_tot);
2032 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
2035 if (fait(ind_face) == 0)
2039 fait(ind_face_associee) = 1;
2040 face_associee=le_bord.
num_face(ind_face_associee);
2041 for (
int comp=0; comp<nb_comp; comp++)
2042 resu(face_associee, comp)=(resu(face,comp)+=resu(face_associee,comp));
2083void Op_Conv_EF_VEF_P1NC_Stab::calculer_data_pour_dirichlet()
2085 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
2086 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
2088 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2089 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
2095 elem_nb_faces_dirichlet_.resize(nb_elem_tot);
2097 elem_nb_faces_dirichlet_=0;
2098 elem_faces_dirichlet_=-1;
2099 elem_faces_frontiere.dimensionner(nb_bord);
2101 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
2104 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2107 if ( (sub_type(Dirichlet,la_cl.valeur()))
2108 || (sub_type(Dirichlet_homogene,la_cl.valeur()))
2114 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
2117 const int elem=face_voisins(face,0);
2119 elem_faces_frontiere[n_bord].append_array(elem);
2121 elem_nb_faces_dirichlet_(elem)+=1;
2124 if (elem_faces_dirichlet_(elem,0)==-1) elem_faces_dirichlet_(elem,0)=face;
2125 else if (elem_faces_dirichlet_(elem,1)==-1) elem_faces_dirichlet_(elem,1)=face;
2126 else if (
Objet_U::dimension==3 && elem_faces_dirichlet_(elem,2)==-1) elem_faces_dirichlet_(elem,2)=face;
2129 Cerr <<
"Error in Op_Conv_EF_VEF_P1NC_Stab::calculer_data_pour_dirichlet()" << finl;
2130 Cerr <<
"Element number " << elem <<
" contains more than "
2132 Cerr <<
"Exiting." << finl;
2141 array_trier_retirer_doublons(elem_faces_frontiere[n_bord]);
2148 calculer_data_pour_dirichlet();
2157 alpha_tab_.resize_array(le_dom_vef->nb_faces_tot());
2158 alpha_tab_ = alpha_;
2159 beta_.resize_array(le_dom_vef->nb_faces_tot());
2164 for (
int i=0; i<nb_ssz_alpha; i++)
2181 Cerr <<
"Cannot find the discretized sub-domain associated with " << noms_ssz_alpha[i] << finl;
2187 for (
int face=0; face<nb_faces; face++)
2190 beta_[la_face] = 1.;
2191 alpha_tab_[la_face] = alpha_ssz(i);
2215 Cerr <<
"Cannot find the discretized sub-domain associated with " << nom_sous_domaine << finl;
2222 for (
int face=0; face<nb_faces; face++)
2225 beta_[la_face] = 0.;
2226 alpha_tab_[la_face] = 1.;
2234 if (new_jacobienne_==0)
2239 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
2241 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
2243 const int nb_comp=transporte_2.
line_size();
2245 DoubleTrav Kij(nb_elem_tot,nb_faces_elem,nb_faces_elem);
2252 const DoubleTab& vitesse_2=la_vitesse.
valeurs();
2254 DoubleTrav transporte_;
2255 DoubleTrav vitesse_face_;
2261 const DoubleTab& transporte=modif_par_porosite_si_flag(transporte_2,transporte_,!marq,porosite_face);
2262 const DoubleTab& tab_vitesse=modif_par_porosite_si_flag(vitesse_2,vitesse_face_,marq,porosite_face);
2265 if (is_compressible_) ajouter_contribution_partie_compressible(transporte,tab_vitesse,matrice);
2269 if (test_) test_implicite();
2279 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
2284 const int nb_faces_elem=domaine_VEF.
elem_faces().dimension(1);
2287 const int nb_comp=transporte.
line_size();
2289 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
2290 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
2291 Matrice_Morse_View matrice;
2292 matrice.set(matrice_morse);
2293 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
2294 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
2295 const int elem,
const int facei_loc)
2297 int facei = elem_faces(elem, facei_loc);
2299 for (
int facej_loc = facei_loc+1; facej_loc < nb_faces_elem; facej_loc++)
2301 int facej = elem_faces(elem, facej_loc);
2303 double kij = Kij(elem, facei_loc, facej_loc);
2304 double kji = Kij(elem, facej_loc, facei_loc);
2306 for (
int dim = 0; dim < nb_comp; dim++)
2308 int ligne = facei*nb_comp + dim;
2309 int colonne = facej*nb_comp + dim;
2312 matrice.atomic_add(ligne, ligne, kij);
2313 matrice.atomic_add(ligne, colonne, -kij);
2314 matrice.atomic_add(colonne, colonne, kji);
2315 matrice.atomic_add(colonne, ligne, -kji);
2319 end_gpu_timer(__KERNEL_NAME__);
2325 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
2335 int faceiAss=0,ind_faceiAss=0;
2336 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2337 for (
int ind_face=num1; ind_face<num2; ind_face++)
2341 int facei=le_bord.
num_face(ind_face);
2342 faceiAss=le_bord.
num_face(ind_faceiAss);
2346 for (
int elem_loc=0; elem_loc<2; elem_loc++)
2348 int elem=face_voisins(facei,elem_loc);
2352 int facei_loc=num_fac_loc(facei,elem_loc);
2355 faceToComplete=faceiAss;
2358 faceToComplete=facei;
2359 facei_loc=num_fac_loc(faceiAss,elem_loc);
2360 assert(facei_loc!=-1);
2364 for (
int facej_loc=0; facej_loc<nb_faces_elem; facej_loc++)
2366 int facej=elem_faces(elem,facej_loc);
2368 if (facej_loc!=facei_loc)
2370 double kij=Kij(elem,facei_loc,facej_loc);
2373 for (
int dim=0; dim<nb_comp; dim++)
2375 int ligne=faceToComplete*nb_comp+dim;
2376 int colonne=facej*nb_comp+dim;
2379 matrice_morse(ligne,ligne)+=kij;
2380 matrice_morse(ligne,colonne)-=kij;
2392 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
2395 const int nb_faces_elem=domaine_VEF.
elem_faces().line_size();
2397 const int nb_comp=transporte.
line_size();
2399 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
2400 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
2401 CDoubleArrView alpha_tab =
static_cast<const ArrOfDouble&
>(alpha_tab_).view_ro();
2402 CDoubleTabView3 Kij = tab_Kij.
view_ro<3>();
2403 Matrice_Morse_View matrice;
2404 matrice.set(matrice_morse);
2405 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
2406 range_2D({0,0}, {nb_elem_tot,nb_faces_elem}), KOKKOS_LAMBDA(
2407 const int elem,
const int facei_loc)
2409 int facei = elem_faces(elem, facei_loc);
2411 for (
int facej_loc = facei_loc+1; facej_loc < nb_faces_elem; facej_loc++)
2413 int facej = elem_faces(elem, facej_loc);
2415 double dij = Dij(elem, facei_loc, facej_loc, Kij);
2417 double coeffij = alpha_tab(facei)*dij;
2418 double coeffji = alpha_tab(facej)*dij;
2420 for (
int dim = 0; dim < nb_comp; dim++)
2422 int ligne = facei*nb_comp + dim;
2423 int colonne = facej*nb_comp + dim;
2427 matrice.atomic_add(ligne, ligne, coeffij);
2428 matrice.atomic_add(ligne, colonne, -coeffij);
2429 matrice.atomic_add(colonne, colonne, coeffji);
2430 matrice.atomic_add(colonne, ligne, -coeffji);
2434 end_gpu_timer(__KERNEL_NAME__);
2440 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
2450 int faceiAss=0,ind_faceiAss=0;
2452 for (
int ind_face=num1; ind_face<num2; ind_face++)
2454 int facei=le_bord.
num_face(ind_face);
2456 faceiAss=le_bord.
num_face(ind_faceiAss);
2460 for (
int elem_loc=0; elem_loc<2; elem_loc++)
2462 int elem=face_voisins(facei,elem_loc);
2466 int facei_loc=num_fac_loc(facei,elem_loc);
2469 faceToComplete=faceiAss;
2472 faceToComplete=facei;
2473 facei_loc=num_fac_loc(faceiAss,elem_loc);
2474 assert(facei_loc!=-1);
2478 for (
int facej_loc=0; facej_loc<nb_faces_elem; facej_loc++)
2480 int facej=elem_faces(elem,facej_loc);
2482 if (facej_loc!=facei_loc)
2484 double dij=Dij(elem,facei_loc,facej_loc,tab_Kij);
2487 double coeffij=alpha_tab_[faceToComplete]*dij;
2490 for (
int dim=0; dim<nb_comp; dim++)
2492 int ligne=faceToComplete*nb_comp+dim;
2493 int colonne=facej*nb_comp+dim;
2496 matrice_morse(ligne,ligne)+=coeffij;
2497 matrice_morse(ligne,colonne)-=coeffij;
2513void Op_Conv_EF_VEF_P1NC_Stab::ajouter_contribution_partie_compressible(
const DoubleTab& transporte,
const DoubleTab& vitesse_2,
2516 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
2518 const IntTab& elem_faces=domaine_VEF.
elem_faces();
2519 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2522 const int nb_faces_elem=elem_faces.
line_size();
2530 DoubleTrav tab_vitesse(vitesse_->valeurs());
2531 for (
int i=0; i<tab_vitesse.
dimension(0); i++)
2532 for (
int j=0; j<tab_vitesse.
line_size(); j++)
2533 tab_vitesse(i,j)*=porosite_face(i);
2535 const int nb_comp=transporte.
line_size();
2537 double (*formule)(int);
2539 if (!volumes_etendus_)
2540 formule= (
dimension==2) ? &formule_Id_2D : &formule_Id_3D;
2542 formule= (
dimension==2) ? &formule_2D : &formule_3D;
2544 ToDo_Kokkos(
"critical");
2545 for (
int elem=0; elem<nb_elem_tot; elem++)
2549 int type_elem=elem_nb_faces_dirichlet_(elem);
2550 double coeff=formule(type_elem);
2554 for (
int facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
2556 int facei=elem_faces(elem,facei_loc);
2557 int signe=(face_voisins(facei,0)==elem)? 1.:-1.;
2560 div+=signe*face_normales(facei,dim)*tab_vitesse(facei,dim);
2563 if (!marq) div/=porosite_elem(elem);
2566 for (
int facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
2568 int facei=elem_faces(elem,facei_loc);
2570 for (
int dim=0; dim<nb_comp; dim++)
2572 int ligne=facei*nb_comp+dim;
2573 matrice(ligne,ligne)+=div;
2582 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
2585 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2589 if (sub_type(Periodique,la_cl.valeur()))
2591 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
2593 for (
int ind_face=num1; ind_face<num2; ind_face++)
2595 int facei = le_bord.
num_face(ind_face);
2597 int faceiAss = le_bord.
num_face(ind_faceiAss);
2601 for (
int elem_loc=0; elem_loc<2; elem_loc++)
2603 int elem = face_voisins(facei,elem_loc);
2607 int facei_loc=num_fac_loc(facei,elem_loc);
2610 faceToComplete=faceiAss;
2613 faceToComplete=facei;
2614 facei_loc=num_fac_loc(faceiAss,elem_loc);
2615 assert(facei_loc!=-1);
2620 int type_elem=elem_nb_faces_dirichlet_(elem);
2621 double coeff=formule(type_elem);
2625 for (facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
2627 facei=elem_faces(elem,facei_loc);
2628 int signe=(face_voisins(facei,0)==elem)? 1.:-1.;
2631 div+=signe*face_normales(facei,dim)*tab_vitesse(facei,dim);
2634 if (!marq) div/=porosite_elem(elem);
2637 for (
int dim=0; dim<nb_comp; dim++)
2639 int ligne=faceToComplete*nb_comp+dim;
2640 matrice(ligne,ligne)+=div;
2648void Op_Conv_EF_VEF_P1NC_Stab::ajouter_contribution_antidiffusion(
const DoubleTab& Kij,
const DoubleTab& transporte,
2651 const Domaine_VEF& domaine_VEF=le_dom_vef.valeur();
2652 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
2653 const IntTab& elem_faces=domaine_VEF.
elem_faces();
2654 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2656 const int nb_faces_elem=elem_faces.
line_size();
2658 const int nb_comp=transporte.
line_size();
2660 int elem=0, elem_loc=0, facei=0,facei_loc=0, faceiAss=0, ind_face=0,ind_faceiAss=0;
2661 int facej=0,facej_loc=0, ligne=0,colonne=0, dim=0, face_amont=0,face_aval=0;
2662 int faceToComplete=0, num1=0,num2=0, n_bord=0;
2663 double kij=0.,kji=0.,dij=0., lij=0.,lji=0., daij=0.;
2664 double delta=0., coeffij=0.,coeffji=0., coeff=0., R=0.;
2667 ArrOfDouble P_plus(nb_comp),P_moins(nb_comp);
2668 ArrOfDouble Q_plus(nb_comp),Q_moins(nb_comp);
2669 P_plus=0., P_moins=0., Q_plus=0., Q_moins=0.;
2671 const DoubleVect& transporteV = transporte;
2672 const ArrOfDouble& alpha_tab = alpha_tab_;
2674 ToDo_Kokkos(
"critical");
2675 for (elem=0; elem<nb_elem_tot; elem++)
2676 for (facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
2678 facei=elem_faces(elem,facei_loc);
2679 P_plus=0., P_moins=0., Q_plus=0., Q_moins=0.;
2680 calculer_senseur(Kij,transporteV,nb_comp,facei,elem_faces,face_voisins,num_fac_loc,P_plus,P_moins,Q_plus,Q_moins);
2681 for (facej_loc=0; facej_loc<nb_faces_elem; facej_loc++)
2682 if (facej_loc!=facei_loc)
2684 facej=elem_faces(elem,facej_loc);
2686 kij = Kij(elem,facei_loc,facej_loc);
2687 kji = Kij(elem,facej_loc,facei_loc);
2688 dij = Dij(elem,facei_loc,facej_loc,Kij);
2701 coeff = 1.*(lij<lji)+0.5*(lij==lji);
2702 assert(coeff==1. || coeff==0.5);
2704 for (dim=0; dim<nb_comp; dim++)
2706 ligne=face_amont*nb_comp+dim;
2707 colonne=face_aval*nb_comp+dim;
2709 delta=transporteV[ligne]-transporteV[colonne];
2718 if (delta>=0.) R=(std::fabs(P_plus[dim])<DMINFLOAT) ? 0. : Q_plus[dim]/P_plus[dim];
2719 else R=(std::fabs(P_moins[dim])<DMINFLOAT) ? 0. : Q_moins[dim]/P_moins[dim];
2722 daij=minimum(limiteur(R)*dij,lji);
2725 coeffij=alpha_tab_[face_amont]*beta_[face_amont]*daij;
2726 coeffji=alpha_tab_[face_aval]*beta_[face_aval]*daij;
2729 matrice(ligne,ligne)-=coeffij*coeff;
2730 matrice(ligne,colonne)+=coeffij*coeff;
2731 matrice(colonne,colonne)-=coeffji*coeff;
2732 matrice(colonne,ligne)+=coeffji*coeff;
2741 for (n_bord=0; n_bord<nb_bord; n_bord++)
2744 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2748 if (sub_type(Periodique,la_cl.valeur()))
2750 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
2753 ArrOfDouble Pj_plus(nb_comp),Pj_moins(nb_comp);
2754 ArrOfDouble Qj_plus(nb_comp),Qj_moins(nb_comp);
2755 Pj_plus=0., Pj_moins=0.;
2756 Qj_plus=0., Qj_moins=0.;
2758 for (ind_face=num1; ind_face<num2; ind_face++)
2762 faceiAss=le_bord.
num_face(ind_faceiAss);
2766 for (elem_loc=0; elem_loc<2; elem_loc++)
2768 elem=face_voisins(facei,elem_loc);
2772 facei_loc=num_fac_loc(facei,elem_loc);
2774 faceToComplete=faceiAss;
2777 faceToComplete=facei;
2778 facei_loc=num_fac_loc(faceiAss,elem_loc);
2779 assert(facei_loc!=-1);
2783 P_plus=0., P_moins=0.;
2784 Q_plus=0., Q_moins=0.;
2785 calculer_senseur(Kij,transporteV,nb_comp,faceToComplete,elem_faces,face_voisins,num_fac_loc,P_plus,P_moins,Q_plus,Q_moins);
2787 for (facej_loc=0; facej_loc<nb_faces_elem; facej_loc++)
2788 if (facej_loc!=facei_loc)
2790 facej=elem_faces(elem,facej_loc);
2792 kij = Kij(elem,facei_loc,facej_loc);
2793 kji = Kij(elem,facej_loc,facei_loc);
2794 dij = Dij(elem,facei_loc,facej_loc,Kij);
2802 face_amont=faceToComplete;
2807 coeff = 1.*(lij<lji)+0.5*(lij==lji);
2808 assert(coeff==1. || coeff==0.5);
2810 for (dim=0; dim<nb_comp; dim++)
2812 ligne=face_amont*nb_comp+dim;
2813 colonne=face_aval*nb_comp+dim;
2814 delta=transporteV[ligne]-transporteV[colonne];
2823 if (delta>=0.) R=(std::fabs(P_plus[dim])<DMINFLOAT) ? 0. : Q_plus[dim]/P_plus[dim];
2824 else R=(std::fabs(P_moins[dim])<DMINFLOAT) ? 0. : Q_moins[dim]/P_moins[dim];
2826 daij=minimum(limiteur(R)*dij,lji);
2829 coeffij=alpha_tab[face_amont]*beta_[face_amont]*daij;
2832 matrice(ligne,ligne)-=coeffij*coeff;
2833 matrice(ligne,colonne)+=coeffij*coeff;
2838 face_aval=faceToComplete;
2841 Pj_plus=0., Pj_moins=0., Qj_plus=0., Qj_moins=0.;
2842 calculer_senseur(Kij,transporteV,nb_comp,facej,elem_faces,face_voisins,num_fac_loc,Pj_plus,Pj_moins,Qj_plus,Qj_moins);
2844 for (dim=0; dim<nb_comp; dim++)
2846 ligne=face_amont*nb_comp+dim;
2847 colonne=face_aval*nb_comp+dim;
2849 delta=transporteV[ligne]-transporteV[colonne];
2858 if (delta>=0.) R=(std::fabs(Pj_plus[dim])<DMINFLOAT) ? 0. : Qj_plus[dim]/Pj_plus[dim];
2859 else R=(std::fabs(Pj_moins[dim])<DMINFLOAT) ? 0. : Qj_moins[dim]/Pj_moins[dim];
2861 daij=minimum(limiteur(R)*dij,lij);
2864 coeffij=alpha_tab[face_aval]*beta_[face_aval]*daij;
2867 matrice(colonne,colonne)-=coeffij*coeff;
2868 matrice(colonne,ligne)+=coeffij*coeff;
2878void Op_Conv_EF_VEF_P1NC_Stab::test_implicite()
const
2880 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
2881 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
2884 const DoubleTab& tab_vitesse=vitesse_->valeurs();
2886 DoubleTab tab_test(unknown);
2887 DoubleVect& test2 = tab_test;
2890 DoubleTab resuExp(unknown);
2891 DoubleVect& resu2Exp = resuExp;
2894 DoubleTab resuImp(unknown);
2895 DoubleVect& resu2Imp = resuImp;
2898 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
2903 DoubleTab Kij(nb_elem_tot,nb_faces_elem,nb_faces_elem);
2908 int face=0,face2=0, faceAss=0, ind_face=0,ind_faceAss=0, n_bord=0, num1=0,num2=0;
2910 SFichier testResu(
"test.txt");
2911 SFichier testMat(
"matrice.txt");
2916 IntTab faces_associees(nb_faces_tot);
2917 for (face=0; face<nb_faces_tot; face++)
2918 faces_associees(face)=face;
2920 for (n_bord=0; n_bord<nb_bord; n_bord++)
2923 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
2927 if (sub_type(Periodique,la_cl.valeur()))
2929 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
2931 for (ind_face=num1; ind_face<num2; ind_face++)
2935 faceAss=le_bord.
num_face(ind_faceAss);
2940 faces_associees(face)=faceAss;
2941 faces_associees(faceAss)=face;
2955 Matrice_Morse matrice;
2957 if (is_compressible_)
2958 ajouter_contribution_partie_compressible(unknown,tab_vitesse,matrice);
2961 ajouter_contribution_antidiffusion(Kij,unknown,matrice);
2970 for (face=0; face<size; face++)
2973 test2[faces_associees(face)]=1.;
2977 if (is_compressible_)
2992 testResu<<
"*************************"<<finl;
2993 testResu<<
"Face test : "<<face<<finl;
2994 for (face2=0; face2<size; face2++)
2995 if (resu2Exp[face2]<=1.e-13)
2996 testResu<<face2<<
" OK"<<finl;
2998 testResu<<face2<<
" residu : "<<resu2Exp[face2]<<finl;
2999 testResu<<
"*************************"<<finl;
3002 test2[faces_associees(face)]=0.;
DoubleTab & valeurs() override
Returns the array of field values at the current time.
class Cond_lim Generic class used to represent any class
Classe Dirichlet_homogene This class is the base class of the hierarchy of homogeneous Dirichlet-type...
Dirichlet This class is the base class of the hierarchy of Dirichlet-type boundary conditions.
const Sous_Domaine_t & ss_domaine(int i) const
int nb_faces_elem(int=0) const
Returns the number of faces of type i of the geometric elements that make up 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.
int nb_faces() const
Returns the total number of faces.
int nb_faces_tot() const
Returns the total number of 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
Returns the index of the i-th face of element num_elem; the face numbering convention is.
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
int nb_faces_bord() const
Returns the number of faces on which boundary conditions are applied:
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
int nombre_de_sous_domaines_dis() const
const Sous_domaine_dis_base & sous_domaine_dis(int i) const
const Domaine & domaine() const
Echange_impose_base: This boundary condition is used only for the energy equation.
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()
Returns the problem associated with the equation.
Schema_Temps_base & schema_temps()
Returns the time scheme associated with the equation.
int num_premiere_face() const
int num_face(const int) const
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
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
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Classe Neumann_homogene This class is the base class of the hierarchy of homogeneous Neumann-type bou...
double val_ext(int i) const override
Returns the value of the i-th component of the field imposed on the exterior of the boundary.
Classe Neumann_val_ext This class is the base class of the hierarchy of.
Classe Neumann This class is the base class of the hierarchy of Neumann-type boundary conditions.
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 int est_egal_a(const Objet_U &) const
Returns 1 if x and *this are the same instance (same memory address).
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
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
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its 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
Size the matrix using the dimensionner method of class Op_VEF_Face.
virtual void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
void modifier_pour_Cl(Matrice_Morse &, DoubleTab &) const override
Modify the right-hand side and the matrix for Dirichlet conditions.
void completer() override
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its equation.
int phi_u_transportant(const Equation_base &eq) const
Defines whether psi is convected with phi*u or with u.
const Champ_Inc_base & vitesse() const
void modifier_flux(const Operateur_base &) const
class Periodique This class represents a periodic boundary condition.
int face_associee(int i) const
const Domaine & domaine() const
Returns the domain associated with the problem.
static KOKKOS_INLINE_FUNCTION void Kokkos_exit(const char *)
Exit routine for TRUST within a Kokkos region.
static Sortie & Journal(int message_level=0)
Returns a static Sortie object used as an event journal.
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
double temps_courant() const
Returns the current time.
Base class for output streams.
This abstract class contains the geometrical subdomain information common to finite-volume methods (V...
const IntTab & les_faces() const
const Sous_Domaine & sous_domaine() const
Symetrie On symmetry faces, the following properties hold:
_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