16#include <Extraire_domaine.h>
17#include <Probleme_base.h>
18#include <Equation_base.h>
19#include <NettoieNoeuds.h>
20#include <Sous_Domaine.h>
22#include <Domaine_VF.h>
26#include <ParserView.h>
28Implemente_instanciable(
Extraire_domaine,
"Extraire_Domaine",Interprete_geometrique_base);
42 Nom expr_elements(
"1");
44 condition_elements.
addVar(
"x");
45 condition_elements.
addVar(
"y");
47 condition_elements.
addVar(
"z");
54 param.
ajouter(
"condition_elements",&expr_elements);
56 param.
ajouter(
"sous_domaine|sous_zone",&nom_sous_domaine);
60 condition_elements.
setString(expr_elements);
69 Cerr <<
"and not of type Probleme_base" << finl;
77 int nb_elem=domaine_vf.
nb_elem();
78 IntTrav tab_marq_elem;
80 IntArrView marq_elem =
static_cast<ArrOfInt&
>(tab_marq_elem).view_wo();
83 if (nom_sous_domaine==
Nom())
86 ParserView parser_condition_elements(condition_elements);
88 CDoubleTabView xp = domaine_vf.
xp().view_ro();
89 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
const int elem,
int& local_nb_elem_m)
91 int threadId = parser_condition_elements.
acquire();
92 parser_condition_elements.
setVar(0,xp(elem,0),threadId);
93 parser_condition_elements.
setVar(1,xp(elem,1),threadId);
95 parser_condition_elements.
setVar(2,xp(elem,2),threadId);
96 double res=parser_condition_elements.
eval(threadId);
97 parser_condition_elements.
release(threadId);
98 if (std::fabs(res)>1e-5)
106 end_gpu_timer(__KERNEL_NAME__);
110 const Sous_Domaine& ssz= ref_cast(Sous_Domaine,
objet(nom_sous_domaine));
111 CIntArrView les_elems = ssz.
les_elems().view_ro();
112 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), ssz.
nb_elem_tot(), KOKKOS_LAMBDA(
const int i,
int& local_nb_elem_m)
114 int elem = les_elems(i);
121 end_gpu_timer(__KERNEL_NAME__);
128 ArrOfInt tab_marq(nb_faces);
129 IntArrView marq = tab_marq.view_rw();
130 CIntTabView face_voisin = domaine_vf.
face_voisins().view_ro();
131 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), nb_faces, KOKKOS_LAMBDA(
const int fac,
int& local_nb_t)
133 int elem0 = face_voisin(fac, 0);
134 int elem1 = face_voisin(fac, 1);
136 if (elem0 != -1) val0 = marq_elem(elem0);
138 if (elem1 != -1) val1 = marq_elem(elem1);
142 if ((val0 == 1) || (val1 == 1))
152 end_gpu_timer(__KERNEL_NAME__);
156 int nb_som_elem=les_elems_old.
dimension(1);
157 les_elems.
resize(nb_elem_m,nb_som_elem);
160 ToDo_Kokkos(
"critical");
161 for (
int elem=0; elem<nb_elem; elem++)
163 if (tab_marq_elem(elem)==1)
165 for (
int k=0; k<nb_som_elem; k++)
166 les_elems(nb,k)=les_elems_old(elem,k);
170 assert(nb==nb_elem_m);
174 Faces& les_faces=faces.
faces();
175 int nb_som_face=face_sommets.
dimension(1);
177 indfaces.
resize(nb_t,nb_som_face);
178 IntTab& facesv=les_faces.
voisins();
182 ToDo_Kokkos(
"critical");
183 for (
int fac=0; fac<nb_faces; fac++)
184 if (tab_marq[fac]==1)
186 for (
int s=0; s<nb_som_face; s++)
187 indfaces(nb,s)=face_sommets(fac,s);
194 dom.type_elem()->associer_domaine(dom);
void associer_domaine(const Domaine_t &)
Associe un domaine a tous les bords de la liste.
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
DoubleTab_t & les_sommets()
void fixer_premieres_faces_frontiere()
void typer(const Nom &)
Type les elements du domaine avec le nom passe en parametre.
int nb_faces() const
renvoie le nombre global de faces.
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
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
Class defining operators and methods for all reading operation in an input flow (file,...
Classe Extraire_domaine Lecture d'un fichier.
Entree & interpreter_(Entree &) override
IntTab_t & voisins()
Renvoie le tableau des voisins (des faces).
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
void nommer(const Nom &) override
Donne un nom a la frontiere.
void typer_faces(const Motcle &)
Type les faces de la frontiere.
const Faces_t & faces() const
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
static void nettoie(Domaine_t &)
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
KOKKOS_INLINE_FUNCTION int acquire() const
KOKKOS_INLINE_FUNCTION void setVar(int i, double val, int threadId) const
void parseString() override
KOKKOS_INLINE_FUNCTION void release(int threadId) const
KOKKOS_INLINE_FUNCTION double eval(int threadId) const
classe Parser_U Version de la classe Parser, derivant de Objet_U.
void setString(const std::string &s)
void addVar(const char *v)
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Domaine_dis_base & domaine_dis() const
Renvoie le domaine discretise associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
int_t nb_elem_tot() const
const IntVect_t & les_elems() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const