16#include <Champ_P1iP1B_implementation.h>
17#include <Champ_implementation_P1.h>
19#include <Domaine_VEF.h>
20#include <Domaine_Cl_VEF.h>
23#include <Matrice_Morse_Sym.h>
24#include <TRUSTLists.h>
25#include <SolveurSys.h>
29#include <Neumann_sortie_libre.h>
30#include <Champ_P0_VEF.h>
31#include <TRUSTTab_parts.h>
32#include <Frontiere_dis_base.h>
35#include <TRUSTArray_kokkos.tpp>
42 DoubleTab positions(1,dimension);
44 les_polys(0) = le_poly;
45 for (
int i=0; i<dimension; i++)
46 positions(0,i) = position(i);
61 DoubleTab positions(1,dimension);
63 les_polys(0) = le_poly;
64 for (
int i=0; i<dimension; i++)
65 positions(0,i) = position(i);
82 const Domaine& domaine_geom = zvef.
domaine();
84 const IntTab& sommet_poly = domaine_geom.
les_elems();
88 const int les_polys_size=les_polys.
size();
106 CDoubleArrView champ_filtre_v =
static_cast<DoubleVect&
>(
champ_filtre_).view_ro();
107 CIntTabView sommet_poly_v = sommet_poly.
view_ro();
108 CDoubleTabView coord_v = coord.
view_ro();
109 CDoubleTabView positions_v = positions.
view_ro();
110 CIntArrView les_polys_v = les_polys.view_ro();
111 DoubleTabView val_v = val.
view_rw();
112 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),les_polys_size, KOKKOS_LAMBDA(
116 val_v(rang_poly,0) = 0.;
119 int le_poly=les_polys_v(rang_poly);
124 val_v(rang_poly, 0) += champ_filtre_v(le_poly);
128 double xs = positions_v(rang_poly,0);
129 double ys = positions_v(rang_poly,1);
130 double zs = (dimension == 3) ? positions_v(rang_poly,2) : 0;
134 for (
int i=0; i<dimension+1; i++)
136 int som = prs+sommet_poly_v(le_poly,i);
137 double champ_filtre_som = champ_filtre_v(som);
141 li=coord_barycentrique_P1_triangle(sommet_poly_v,
144 else if (dimension == 3)
145 li=coord_barycentrique_P1_tetraedre(sommet_poly_v,
148 val_v(rang_poly,0) += champ_filtre_som * li;
153 end_gpu_timer(__KERNEL_NAME__);
157 Cerr <<
"Vous en etes deja la vous ?" << finl;
166 Cerr <<
"Champ_P1iP1B_implementation::valeur_aux_elems_compo non code." << finl;
179 assert(nb_compo_ == tab_val.
line_size());
199 DoubleTabView val = tab_val.
view_rw();
200 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nbs, KOKKOS_LAMBDA(
const int num_som)
202 int som = prs+num_som;
205 end_gpu_timer(__KERNEL_NAME__);
209 Cerr <<
"Vous en etes deja la vous ?" << finl;
223 Cerr <<
"Champ_P1iP1B_implementation::valeur_aux_sommets_compo pas code." << finl;
232 const Domaine& le_dom=zvef.
domaine();
233 const Domaine& dom=le_dom;
237 const DoubleTab& xg = zvef.
xp();
240 coord.
resize(nbe+nbs,dimension);
244 for(
int i=0; i<nbe; i++)
246 for(
int j=0; j<dimension; j++)
253 for(
int i=0; i<nbs; i++)
255 for(
int j=0; j<dimension; j++)
256 coord(k,j)=coord_sommets(i,j);
265 IntVect& polys)
const
267 Cerr <<
"Pas code " << finl;
275 matrice.typer(
"Matrice_Morse_Sym");
279 int nnz=nb_som_tot+nb_arete_tot;
282 const Domaine& dom=domaine_VEF.
domaine();
284 IntLists voisins(nb_som_tot);
285 DoubleLists coeffs(nb_som_tot);
286 DoubleVect diag(nb_som_tot);
288 for(
int arete=0; arete<nb_arete_tot; arete++)
290 if (renum_arete_perio[arete]==arete)
300 voisins[som1].add(som2);
306 for (
int i=0; i<nb_som_tot; i++)
315 MatPoisson.
remplir(voisins, coeffs, diag) ;
321static double coeff = 4. / 5.;
322static double coeff_inv = 1 / coeff;
323double second_membre(
const Domaine_VEF& domaine_VEF, ArrOfDouble& Pa, DoubleVect& secmem)
328 const Domaine& dom=domaine_VEF.
domaine();
331 for(
int arete=0; arete<nb_arete_tot; arete++)
333 if (renum_arete_perio[arete]==arete)
344 double norme=mp_norme_vect(secmem);
349void corriger(
const Domaine_VEF& domaine_VEF, DoubleTab& champ_filtre_,
Matrice& matrice,
const int Condition_Neumann_imposee_)
351 int nb_elem=domaine_VEF.
nb_elem();
352 int nb_som=domaine_VEF.
nb_som();
357 Cerr <<
"Erreur dans Champ_P1iP1B_impl.cpp: corriger(...), le champ doit avoir une partie sommets et elements" << finl;
360 DoubleTab_parts parties_P(champ_filtre_);
361 DoubleVect& Pk = parties_P[0];
362 DoubleVect& Ps = parties_P[1];
369 Cerr<<
"We try to Champ_P1iP1B_impl::corriger but get_renum_arete_perio"<<finl;
375 ToDo_Kokkos(
"critical for P0P1Pa");
376 DoubleVect& Pa = parties_P[2];
379 if (!matrice) assembler(domaine_VEF, matrice);
384 second_membre(domaine_VEF, Pa, secmem);
388 solution.
copy(secmem, RESIZE_OPTIONS::NOCOPY_NOINIT);
392 solveur.typer(
"Solv_GCP");
395 ref_cast(
Solv_GCP,solveur.valeur()).set_precond(p);
396 solveur.
nommer(
"Pa_filter_solver");
400 const Domaine& dom=domaine_VEF.
domaine();
401 for(
int i=0; i<nb_som; i++)
405 solution(i)=solution(som);
409 for(
int som=0; som<nb_som; som++)
410 Ps(som) += solution(som);
416 for(
int arete=0; arete<nb_arete; arete++)
418 if(!ok_arete[arete] && Pa(arete)!=0)
420 Cerr <<
"Pa(arete_superflue)!=0 dans Champ_P1iP1B_implementation::corriger" << finl;
421 Cerr <<
"Contacter le support TRUST." << finl;
422 Cerr <<
"S'il s'agit d'une reprise au format xyz d'un calcul" << finl;
423 Cerr <<
"alors il faut ecraser le fichier .ok_arete de votre calcul de reprise" << finl;
424 Cerr <<
"par le fichier .ok_arete de votre calcul precedant afin d'avoir les" << finl;
425 Cerr <<
"memes aretes superflues." << finl;
428 int som1=aretes_som(arete, 0);
429 int som2=aretes_som(arete, 1);
430 double sigma=solution(som1)+solution(som2);
431 Pa(arete)-=sigma*coeff_inv;
437 for(
int elem=0; elem<nb_elem; elem++)
440 for (
int som=0; som<nb_som_par_elem; som++)
441 sigma+=solution(les_elems(elem,som));
447 double moyenne_K = mp_moyenne_vect(Pk);
454 assert(Condition_Neumann_imposee_!=-1);
456 if (!Condition_Neumann_imposee_)
459 Ps -= mp_moyenne_vect(Ps);
479 && !implicitCoupling)
507 for(
int i=0; i<les_cl.size(); i++)
517 const DoubleTab& cg_faces = domaine_dis.
xv();
523 IntVect elem_voisins(nb_faces_fr);
526 DoubleTab val_interp(nb_faces_fr, 1);
529 for (
int i=0; i<nb_faces_fr; i++)
535 elem_voisins(i) = elem;
540 for (
int num_face=0; num_face<nb_faces_fr; num_face++)
544 cg_faces_fr(num_face,dim) = cg_faces(face,dim);
550 for (
int i=0; i<nb_faces_fr; i++)
552 x(i,0) = val_interp(i);
DoubleTab & valeur_aux_sommets(const Domaine &domain, DoubleTab &result) const override
renvoie les valeurs aux sommets du Domaine dom
void associer_domaine_dis_base(const Domaine_dis_base &) override
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_P0_VEF Classe qui represente un champ discret P0 par element associe a un domaine discre...
DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const override
Matrice matrice_filtrage_
DoubleTab & remplir_coord_noeuds(DoubleTab &positions) const override
virtual const Domaine_VEF & domaine_vef() const =0
DoubleTab & filtrage(const Domaine_VEF &, const Champ_base &, bool implicitCoupling=false) const
const double * adresse_champ_filtre_
double valeur_a_elem_compo(const DoubleVect &position, int le_poly, int ncomp) const override
DoubleVect & valeur_a_elem(const DoubleVect &position, DoubleVect &val, int le_poly) const override
DoubleVect & valeur_aux_sommets_compo(const Domaine &, DoubleVect &, int) const override
int remplir_coord_noeuds_et_polys(DoubleTab &positions, IntVect &polys) const override
DoubleTab & trace(const Frontiere_dis_base &fr, const DoubleTab &y, DoubleTab &x, int distant) const
void completer(const Domaine_Cl_dis_base &zcl)
const DoubleTab & champ_filtre() const
int Condition_Neumann_imposee_
DoubleTab & valeur_aux_sommets(const Domaine &, DoubleTab &) const override
DoubleVect & valeur_aux_elems_compo(const DoubleTab &positions, const IntVect &les_polys, DoubleVect &valeurs, int ncomp) const override
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
double temps() const
Renvoie le temps du champ.
virtual Champ_base & le_champ()=0
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
static void verifier(const char *const msg, double)
int_t nb_aretes_tot() const
renvoie le nombre d'aretes total (reelles+virtuelles).
const IntTab_t & aretes_som() const
renvoie le tableau de connectivite aretes/sommets.
int_t get_renum_som_perio(int_t i) const
int_t nb_aretes() const
Renvoie le nombre d'aretes reelles.
const DoubleTab_t & coord_sommets() const
virtual void creer_tableau_sommets(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Cree un tableau ayant une "ligne" par sommet du maillage.
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
const IntVect & get_ok_arete() const
int numero_premier_sommet() const
const ArrOfInt & get_renum_arete_perio() const
double xv(int num_face, int k) const
double xp(int num_elem, int k) const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
const Domaine & domaine() const
virtual int nb_comp() const
int num_premiere_face() const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
void compacte(int elim_coeff_nul=0)
Suppression des doublons on ordonne tab2;.
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
void remplir(const IntLists &, const DoubleLists &, const DoubleVect &)
void set_est_definie(int)
Classe Matrice Classe generique de la hierarchie des matrices.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
void nommer(const Nom &nom) override
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
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
void copy(const TRUSTArray< _TYPE_, _SIZE_ > &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")