16#ifndef Domaine_VF_included
17#define Domaine_VF_included
19#include <Domaine_dis_base.h>
20#include <Domaine_forward.h>
21#include <TRUSTArrays.h>
24#include <medcoupling++.h>
27#include <MEDCouplingFieldTemplate.hxx>
28#include <MEDCouplingCMesh.hxx>
29using MEDCoupling::MEDCouplingCMesh;
30using MEDCoupling::MCAuto;
31using MEDCoupling::MEDCouplingFieldDouble;
51 virtual const DoubleVect&
face_surfaces()
const {
return face_surfaces_; }
52 virtual inline double face_surfaces(
int i)
const {
return face_surfaces_(i); }
76 inline double xv(
int num_face,
int k)
const {
return xv_(num_face,k); }
77 inline double xp(
int num_elem,
int k)
const {
return xp_(num_elem,k); }
78 inline double xa(
int num_arete,
int k)
const {
return xa_(num_arete,k); }
93 inline DoubleTab&
xv() {
return xv_;}
94 inline const DoubleTab&
xv()
const {
return xv_;}
95 inline DoubleTab&
xp() {
return xp_; }
96 inline const DoubleTab&
xp()
const {
return xp_; }
97 inline DoubleTab&
xa() {
return xa_; }
98 inline const DoubleTab&
xa()
const {
return xa_; }
162 virtual const DoubleTab&
xv_bord()
const;
166 virtual double compute_L1_norm(
const DoubleVect& val_source,
const bool basis_function,
const int order)
const;
167 virtual double compute_L2_norm(
const DoubleVect& val_source,
const bool basis_function,
const int order)
const;
168 virtual void compute_average(
const DoubleVect& val_source,
double& sum,
double& volume,
const bool basis_function,
const int order)
const;
169 virtual void compute_average_porosity(
const DoubleVect& val_source,
const DoubleVect& porosity,
double& sum,
double& volume,
const bool basis_function,
const int order)
const;
175 inline double dot (
const double *a,
const double *b,
const double *ma =
nullptr,
const double *mb =
nullptr)
const;
178 inline std::array<double, 3>
cross(
int dima,
int dimb,
const double *a,
const double *b,
const double *ma =
nullptr,
const double *mb =
nullptr)
const;
180 inline virtual double dist_norm(
int )
const { Cerr << __func__ <<
" method should be overrided in a derived class !! " << finl;
throw; }
181 inline virtual double dist_norm_bord(
int )
const { Cerr << __func__ <<
" method should be overrided in a derived class !! " << finl;
throw; }
182 inline virtual double dist_face_elem0(
int ,
int )
const { Cerr << __func__ <<
" method should be overrided in a derived class !! " << finl;
throw; }
183 inline virtual double dist_face_elem1(
int ,
int )
const { Cerr << __func__ <<
" method should be overrided in a derived class !! " << finl;
throw; }
184 inline virtual double dist_face_elem0_period(
int ,
int ,
double )
const { Cerr << __func__ <<
" method should be overrided in a derived class !! " << finl;
throw; }
185 inline virtual double dist_face_elem1_period(
int ,
int ,
double )
const { Cerr << __func__ <<
" method should be overrided in a derived class !! " << finl;
throw; }
199 inline const MEDCouplingUMesh* get_mc_face_mesh()
const;
200 inline const MEDCouplingUMesh* get_mc_dual_mesh()
const;
204 DoubleVect face_surfaces_;
261 mutable MCAuto<MEDCouplingUMesh> mc_face_mesh_;
262 mutable MCAuto<MEDCouplingUMesh> mc_dual_mesh_;
263 mutable bool mc_face_mesh_ready_ =
false;
264 mutable bool mc_dual_mesh_ready_ =
false;
287 MCAuto<MEDCouplingCMesh> mc_Cmesh_;
288 std::vector<int> mc_Cmesh_elemCorrespondence_, mc_Cmesh_nodesCorrespondence_;
289 std::vector<int> mc_Cmesh_facesXCorrespondence_, mc_Cmesh_facesYCorrespondence_, mc_Cmesh_facesZCorrespondence_;
290 std::vector<double> mc_Cmesh_x_coords_, mc_Cmesh_y_coords_, mc_Cmesh_z_coords_;
292 bool mc_Cmesh_ready_ =
false, mc_Cmesh_with_faces_corr_ =
false;
294 void build_mc_Cmesh();
295 void build_mc_Cmesh_nodesCorrespondence();
296 void build_mc_Cmesh_correspondence(
bool withFace);
298 template <
typename TYPE>
299 TYPE Cmesh_error(
const char * nom_funct)
const
301 cerr <<
"Domaine_VF::" << nom_funct <<
" should not be called since the MEDCouplingCMesh of Domaine_VF is not yet filled !!!" << endl;
302 Cerr <<
"Add the interpret Build_Map_to_Structured in your data file !!!" << finl;
308 inline const MEDCouplingCMesh* get_mc_CMesh()
const
310 if (mc_Cmesh_ready_)
return mc_Cmesh_;
311 else return Cmesh_error<MEDCouplingCMesh*>(__func__);
314 const std::vector<int>& get_mc_Cmesh_elemCorrespondence()
const
316 if (mc_Cmesh_ready_)
return mc_Cmesh_elemCorrespondence_;
317 else return Cmesh_error<std::vector<int>&>(__func__);
320 const std::vector<int>& get_mc_Cmesh_facesXCorrespondence()
const
322 if (mc_Cmesh_ready_ && mc_Cmesh_with_faces_corr_)
return mc_Cmesh_facesXCorrespondence_;
323 else return Cmesh_error<std::vector<int>&>(__func__);
326 const std::vector<int>& get_mc_Cmesh_facesYCorrespondence()
const
328 if (mc_Cmesh_ready_ && mc_Cmesh_with_faces_corr_)
return mc_Cmesh_facesYCorrespondence_;
329 else return Cmesh_error<std::vector<int>&>(__func__);
332 const std::vector<int>& get_mc_Cmesh_facesZCorrespondence()
const
334 if (mc_Cmesh_ready_ && mc_Cmesh_with_faces_corr_)
return mc_Cmesh_facesZCorrespondence_;
335 else return Cmesh_error<std::vector<int>&>(__func__);
338 const std::vector<int>& get_mc_Cmesh_nodesCorrespondence()
const
340 if (mc_Cmesh_ready_)
return mc_Cmesh_nodesCorrespondence_;
341 else return Cmesh_error<std::vector<int>&>(__func__);
344 const std::vector<double>& get_mc_Cmesh_x_coords()
const
346 if (mc_Cmesh_ready_)
return mc_Cmesh_x_coords_;
347 else return Cmesh_error<std::vector<double>&>(__func__);
350 const std::vector<double>& get_mc_Cmesh_y_coords()
const
352 if (mc_Cmesh_ready_)
return mc_Cmesh_y_coords_;
353 else return Cmesh_error<std::vector<double>&>(__func__);
356 const std::vector<double>& get_mc_Cmesh_z_coords()
const
358 if (mc_Cmesh_ready_)
return mc_Cmesh_z_coords_;
359 else return Cmesh_error<std::vector<double>&>(__func__);
363 int get_mc_Cmesh_ni()
const
365 if (mc_Cmesh_ready_)
return static_cast<int>(mc_Cmesh_x_coords_.size());
366 else return Cmesh_error<int>(__func__);
370 int get_mc_Cmesh_nj()
const
372 if (mc_Cmesh_ready_)
return static_cast<int>(mc_Cmesh_y_coords_.size());
373 else return Cmesh_error<int>(__func__);
377 int get_mc_Cmesh_nk()
const
379 if (mc_Cmesh_ready_)
return static_cast<int>(mc_Cmesh_z_coords_.size());
380 else return Cmesh_error<int>(__func__);
391 assert(voisin==0 || voisin==1);
399 for(
int som_loc=0; som_loc<nse; som_loc++)
401 if(les_elems(elem, som_loc)==som)
625 return les_bords_[i];
633 return les_bords_[i];
648 Cerr<<
"Try using orientation(num_face) instead of orientation() if the mesh is axis oriented."<< finl;
671 Cerr<<
"Your mesh is not axis oriented."<<finl;
672 Cerr<<
"Try recoding using face_normales(). Example for g(face)=gravite[orientation[face]];" << finl;
673 Cerr<<
"Compute something like: g(face)=Sum(i=0;i<gravite.size();i++) of gravite[i]*face_normales(face,i)/surface(face);" << finl;
696inline double Domaine_VF::dot(
const double *a,
const double *b,
const double *ma,
const double *mb)
const
699 for (
int i = 0; i <
dimension; i++) res += (a[i] - (ma ? ma[i] : 0)) * (b[i] - (mb ? mb[i] : 0));
705 const double dr = std::fabs(r_elem - r_face);
706 const double r = (r_elem < r_face) ? r_elem : r_face;
707 return 2. * M_PI * (r * dr + 0.5 * dr * dr) * axis_length;
711inline std::array<double, 3>
Domaine_VF::cross(
int dima,
int dimb,
const double *a,
const double *b,
const double *ma,
const double *mb)
const
713 std::array<double, 3> va = {{ 0, 0, 0 }}, vb = {{ 0, 0, 0 }}, res;
714 for (
int i = 0; i < dima; i++) va[i] = a[i] - (ma ? ma[i] : 0);
715 for (
int i = 0; i < dimb; i++) vb[i] = b[i] - (mb ? mb[i] : 0);
716 for (
int i = 0; i < 3; i++) res[i] = va[(i + 1) % 3] * vb[(i + 2) % 3] - va[(i + 2) % 3] * vb[(i + 1) % 3];
723inline const MEDCouplingUMesh* Domaine_VF::get_mc_face_mesh()
const
726 return mc_face_mesh_;
729inline const MEDCouplingUMesh* Domaine_VF::get_mc_dual_mesh()
const
732 return mc_dual_mesh_;
Empty class used as a base for all the arrays.
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_faces_frontiere() const
Renvoie le nombre de faces frontiere du domaine (somme des nombres de bords, de raccords et de bords ...
const ArrOfInt_t & ind_faces_virt_bord() const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int premiere_face_bord() const
renvoie le numero de la premiere des faces sur lesquelles sont appliquees les conditions limites :
IntVect rang_elem_non_std_
void creer_tableau_aretes(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
virtual const DoubleVect & face_surfaces() const
int nb_faces() const
renvoie le nombre global de faces.
virtual double compute_L1_norm(const DoubleVect &val_source, const bool basis_function, const int order) const
void build_mc_face_mesh() const
Build the MEDCoupling face mesh. It is always made of polygons (in 3D) for simplicity purposes....
void build_map_mc_Cmesh(const bool with_faces) override
IntTab & face_sommets() override
renvoie le tableau de connectivite faces/sommets.
virtual const DoubleTab & xv_bord() const
virtual double dist_face_elem1(int, int) const
const IntTab & face_numero_bord() const
virtual double compute_L2_norm(const DoubleVect &val_source, const bool basis_function, const int order) const
void init_dist_paroi_globale(const Conds_lim &conds_lim) override
DoubleVect volumes_entrelaces_
const MD_Vector & md_vector_faces() const
void order_faces(Faces &les_faces)
This method (that may be overriden in various discretisations) is used to order faces according to th...
const MD_Vector & md_vector_aretes() const
virtual void get_ind_integ_points(IntTab &nelem) const
int nb_faces_bord_tot() const
renvoie le nombre total de faces sur lesquelles sont appliquees les conditions limites :
const DoubleTab & xv() const
const DoubleVect & volumes() const
const DoubleTab & xa() const
double volume_entrelace_axi(double r_face, double r_elem, double axis_length) const
const IntTab & get_face_voisins_dual() const
DoubleVect & volumes_entrelaces()
int nb_faces_tot() const
renvoie le nombre total de faces.
void face_voisins_reel_fictif(int face, int &el0, int &elf) const
renvoie dans el0 le numero de l'elt a l'interieur renvoie dans elf le numero de l'elt fictif (-1 si i...
virtual Faces * creer_faces()
renvoie new(Faces) ! elle est surchargee par Domaine_VDF par ex.
double xa(int num_arete, int k) const
double dot(const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
void sort_along_zcurve(const Faces &les_faces, IntTab &sort_key) const
Tweak the face sorting keys so that internal faces (=standard faces) follow a Z-curve indexing scheme...
int nb_arete_face() const
renvoie le nombre d'aretes par face.
IntTab face_dual_
For each face f, face_dual_(f, j) returns the element built on the left and right of the face in the ...
virtual double face_normales(int face, int comp) const
const DoubleTab & volumes_entrelaces_dir() const
int nb_faces_internes() const
une face est interne ssi elle separe deux elements.
double xv(int num_face, int k) const
virtual double dist_face_elem1_period(int, int, double) const
MD_Vector md_vector_faces_
void discretiser_no_face() override
virtual void prepare_elem_non_std(Faces &les_faces)
Identify non-standard elements (will be used later to identify non standard faces) Some discretisatio...
int nb_frontiere_dis() const
const Joint & joint(int i) const
ArrOfInt & faces_doubles()
renvoie 1 pour les faces appartenant a un bord perio ou un item commun, 0 par defaut
double volumes(int i) const
const DoubleTab & normale_paroi_elem() const
void remplir_face_numero_bord()
virtual void compute_sort_key(Faces &les_faces, IntTab &sort_key)
Generate an IntTab (sort_key) with two columns allowing to sort the faces along a specific order....
virtual int get_max_nb_integ_points() const
virtual double dist_face_elem0_period(int, int, double) const
void creer_tableau_faces_bord(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
DoubleVect inverse_volumes_
const IntTab & get_num_fac_loc() const
void discretiser() override
Genere les faces construits les frontieres.
void modifier_pour_Cl(const Conds_lim &) override
int numero_sommet_local(int som, int elem) const
void build_mc_dual_mesh() const
Build the dual mesh of the domain for post-processing of face fields.
VECT(Front_VF) les_bords_
const ArrOfInt & ind_faces_virt_bord() const
IntTab & face_numero_bord()
void construire_face_virt_pe_num()
Remplissage du tableau face_virt_pe_num_ (voir commentaire dans Domaine_VF.
IntTab & elem_faces()
renvoie le tableau de connectivite element/faces
IntTab & face_aretes() override
renvoie le tableau de connectivite faces/aretes.
int get_face_voisins_dual(const int i, const int j) const
virtual void typer_elem(Domaine &)
virtual void get_position(DoubleTab &positions) const
int numero_face_local(int face, int elem) const
virtual double surface(int i) const
const DoubleVect & inverse_volumes() const
int est_une_face_virt_bord(int) const
renvoie 1 si face est une face virtuelle de bord, 0 sinon
virtual double dist_norm(int) const
int nb_som_face() const
renvoie le nombre de sommets par face.
Frontiere_dis_base & frontiere_dis(int) override
renvoie la ieme frontiere_discrete.
DoubleTab normalized_boundaries_outward_vector(int global_face_number, double scale_factor) const
Compute the normalized boundary outward vector associated to the face global_face_number and eventual...
virtual double face_surfaces(int i) const
virtual const IntVect & orientation() const
const IntTab & face_virt_pe_num() const
const ArrOfInt & est_face_bord() const
const IntTab & face_voisins_fictifs() const
double xp(int num_elem, int k) const
ArrOfInt & est_face_bord()
virtual void renumber_faces(Faces &les_faces, IntTab &sort_key)
Re-index faces according to the new order given by 'sort_key'.
std::array< double, 3 > cross(int dima, int dimb, const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
void calculer_face_surfaces(const DoubleVect &surfaces)
virtual void remplir_face_voisins_fictifs(const Domaine_Cl_dis_base &)
const DoubleTab & normale_paroi_faces() const
virtual int orientation_si_definie(int) const
IntTab face_voisins_fictifs_
DoubleTab & volumes_entrelaces_dir()
int oriente_normale(int f, int e) const
void construire_num_fac_loc()
MD_Vector md_vector_faces_front_
DoubleTab calculer_xgr() const
calcul le tableau xgr pour le calcul des moments des forces aux bords :
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
virtual const DoubleTab & face_normales() const
MD_Vector md_vector_aretes_
DoubleTab volumes_entrelaces_dir_
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
virtual void compute_average_porosity(const DoubleVect &val_source, const DoubleVect &porosity, double &sum, double &volume, const bool basis_function, const int order) const
const DoubleTab & xp() const
const MD_Vector & md_vector_faces_bord() const
virtual void compute_average(const DoubleVect &val_source, double &sum, double &volume, const bool basis_function, const int order) const
virtual double dist_face_elem0(int, int) const
DoubleVect & inverse_volumes()
virtual double dist_norm_bord(int) const
virtual DoubleTab & face_normales()
virtual void get_nb_integ_points(IntTab &nelem) const
const DoubleVect & volumes_entrelaces() const
const Front_VF & front_VF(int i) const
void typer_discretiser_ss_domaine(int i) override
double volumes_entrelaces(int num_face) const
IntTab & face_voisins() override
renvoie le tableaux des volumes des connectivites face elements cf au dessus.
double inverse_volumes(int i) const
void marquer_faces_double_contrib(const Conds_lim &)
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
virtual int get_nb_items_tot() const
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.