TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
SurfaceVapeurIJKComputation.h
1/****************************************************************************
2* Copyright (c) 2015 - 2016, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef SurfaceVapeurIJKComputation_included
17#define SurfaceVapeurIJKComputation_included
18
19#include <IJK_Field_vector.h>
20#include <IJK_Field.h> // est-ce que j'en ai vraiment besoin ?
21#include <Linear_algebra_tools_impl.h>
22#include <Maillage_FT_IJK.h>
23#include <medcoupling++.h>
24#ifdef MEDCOUPLING_
25#include <MEDCouplingCMesh.hxx>
26#include <MEDCouplingFieldDouble.hxx>
27#include <MEDCouplingUMesh.hxx>
28#include <MEDLoader.hxx>
29#include <MCAuto.hxx>
30using MEDCoupling::DataArrayDouble;
31using MEDCoupling::DataArrayIdType;
32using MEDCoupling::DataArrayInt;
33using MEDCoupling::MCAuto;
34using MEDCoupling::MEDCouplingCMesh;
35using MEDCoupling::MEDCouplingFieldDouble;
36using MEDCoupling::MEDCouplingUMesh;
37using DAI = MCAuto<DataArrayInt>;
38using DAD = MCAuto<DataArrayDouble>;
39using MCT = MCAuto<DataArrayIdType>;
40using MCC = MCAuto<MEDCouplingCMesh>;
41using MCU = MCAuto<MEDCouplingUMesh>;
42using MCF = MCAuto<MEDCouplingFieldDouble>;
43#endif
44
45
46static const int max_authorized_nb_of_groups_ = 3;
47static const int max_authorized_nb_of_components_ = 3;
48static const int dir_ = 3;
49static const double EPS_ = 1.e-12;
50
51void get_coo_to_keep(const int d, std::vector<int>& COO2KEEP);
52void get_coo_inv_to_keep(const int d, std::array<int, 3>& COOINV);
53void print_int_med(const DataArrayIdType *data);
54void print_double_med(const DataArrayDouble *data);
55void print_umesh_conn(const DataArrayIdType *data);
56
58{
59public:
62 void initialize(const Domaine_IJK& splitting);
63 // Met à jour les valeurs de surface_vapeur_par_face_ et
64 // barycentre_vapeur_par_face_.
66 const Maillage_FT_IJK& maillage_ft_ijk,
67 const IJK_Field_double& indicatrice_ft,
68 const IJK_Field_vector3_double& normale_of_interf,
69 IJK_Field_vector3_double& surface_vapeur_par_face,
70 FixedVector<IJK_Field_vector3_double, 3>& barycentre_vapeur_par_face
71 );
72 // Permet de recuperer un mcu qui est une vue de maillage_bulles_ft_ijk. Il
73 // n'y a pas de copie memoire, seulement des passages de case memoire.
74 // splitting.get_origin, get_constant_delta(DIRECTION_X),
75 // ...
76 static void get_maillage_MED_from_IJK_FT(MEDCouplingUMesh *maillage_bulles_mcu,
77 const Maillage_FT_IJK& maillage_bulles_ft_ijk);
79
80protected:
81 int rempli_surface_vapeur_par_face_interieur_bulles(IJK_Field_vector3_double& surface_vapeur_par_face, const IJK_Field_double& indicatrice_ft);
82 // Cette methode appelle la methode statique get_maillage_MED_from_IJK_FT sur ses propres membres. Elle met donc a jour le maillage maillage_bulles_med_.
83 void set_maillage_MED(const Maillage_FT_IJK& maillage_ft_ijk);
84
85 // TODO: ecrire dans un fichier pour voir ce que ça donne. Utiliser nom_du_cas
86 // ou toto.med Methode qui calcule les faces mouillees du maillage IJK par la
87 // phase vapeur à l'aide de MEDCoupling. Les faces mouillees sont ensuite
88 // utilisees pour faire des operations d'operateur discret de FT dans la
89 // thermique principalement. surfaces: une vecteur comme celui de la vitesse
90 // qui porte non pas les composantes x,y,z de la vitesse mais les surfaces des
91 // faces I,J,K mouillees par la phase vapeur. barycentres: un vecteur qui
92 // porte les valeurs sur les 3 faces I,J,K un vecteur de 3 composantes
93 // rapporte à une cellule. Ces 3 composantes sont les coordonnees du
94 // barycentre de la phase vapeur.
96 const Maillage_FT_IJK& maillage_ft_ijk,
97 const IJK_Field_vector3_double& normale_of_interf,
98 IJK_Field_vector3_double& surfaces,
100
101 // Cette methode calcule le vecteur que va d'un barycentre à l'autre entre
102 // deux sous-cellules d'une cellule du maillage IJ. Params:
103 //- barycentre: le tableau des barycentre pour le maillage merge
104 // (indice par les elements du maillage merge)
105 //- ids_diph: le tableau des indices des sub-volumes pour chaque volume
106 // diphasique
107 // (indice de la meme manière que le tableau qui donne la correspondance
108 // avec l'indice de l'element dans le maillage IJ).
109 // Returns:
110 //- le vecteur dont il est question, un tableau de taille egale au nombre de
111 // cellules
112 // du mesh2d.
113 void get_vect_from_sub_cells_tuple(const int dim, const DataArrayDouble *bary0,
114 const DataArrayIdType *cIcellsIdinMesh0, const DataArrayIdType *cellsIdinMesh0,
115 DataArrayDouble *vect) const;
116
117 // Slice the bubble.
118 // Params:
119 // intersect_pt : la coordonnee d'intersection
120 // dim: la direction normale à laquelle on fait la coupe
121 // MEDCouplingUMesh* slice_bubble(const double intersect_pt, const int dim,
122 // DataArrayIdType* cutcellsid, bool& plan_cut_some_bubble) const;
123 void slice_bubble(const double intersect_pt, const int dim, DataArrayIdType *cutcellsid, bool& plan_cut_some_bubble,
124 MCU& mesh1dfil) const;
125
126 // Cette methode trouve les doublons dans mesh_merge et leurs id.
127 // Params:
128 // mesh_merge:
129 // le tableau de conversion qui donne l'indice old pour les indices new
130 // (donc new to old).
131 // n_tot_mesh2d:
132 // le nombre de maille du maillage IJ.
133 // Returns:
134 // un tableau avec les indices des 2 cellules du maillage diphasique en
135 // couple et un tableau avec les cellules du maillage non decoupe
136 // correspondantes.
137 void findCommonTuples(const DataArrayIdType *mesh_merge, const mcIdType n_tot_mesh2d, DataArrayIdType *tab_id_subcells,
138 DataArrayIdType *tab_id_cut_cells) const;
139
140 // Cette methode ordonne les noeuds par ordre croissant cellule par cellule
141 static void order_elem_mesh_filaire(MEDCouplingUMesh *mesh1D);
142
143 // Cette methode permet de recuperer les indices IJK en partant des
144 // informations concernant la geometrie IJK et le plan de coupe que l'on est
145 // en train de parcourir. Elle renvoie les coordonnees IJK correspondant, dans
146 // le bon ordre.
147 void get_IJK_ind_from_ind2d(const int dim, const int i_plan, const trustIdType i_2d, const int nx,
148 std::array<int, 3>& ijk_coo) const;
149
150 // Cette methode verifie si les subcells sont dans le bon sens (vapeur ->
151 // liquide) et les echange sinon. Params:
152 //- vector: TODO
153 //- orthoprojected: TODO
154 //- ids_diph: TODO
155 //- ids_IJ_cell_from_diph: TODO.
156 // Returns:
157 //- TODO
159 const IJK_Field_vector3_double& normale_of_interf,
160 const DataArrayDouble *vector,
161 const int dim, const int i_plan, const int nx,
162 const DataArrayIdType *ids_diph,
163 DataArrayIdType *ids_IJ_cell_from_diph) const;
164
165 // Maillage au format MEDCouplingUMesh
167 // Ref to maillage_ft_ijk
168 // const FixedVector<IJK_Field_double, 3> normale_of_interf_;
169 OBS_PTR(Domaine_IJK) ref_domaine_;
173};
174
175#endif
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Definition Domaine_IJK.h:47
: class Maillage_FT_IJK
OBS_PTR(Domaine_IJK) ref_domaine_
static void get_maillage_MED_from_IJK_FT(MEDCouplingUMesh *maillage_bulles_mcu, const Maillage_FT_IJK &maillage_bulles_ft_ijk)
void set_maillage_MED(const Maillage_FT_IJK &maillage_ft_ijk)
void slice_bubble(const double intersect_pt, const int dim, DataArrayIdType *cutcellsid, bool &plan_cut_some_bubble, MCU &mesh1dfil) const
void check_if_vect_is_from_liquid2vapor(const IJK_Field_vector3_double &normale_of_interf, const DataArrayDouble *vector, const int dim, const int i_plan, const int nx, const DataArrayIdType *ids_diph, DataArrayIdType *ids_IJ_cell_from_diph) const
void findCommonTuples(const DataArrayIdType *mesh_merge, const mcIdType n_tot_mesh2d, DataArrayIdType *tab_id_subcells, DataArrayIdType *tab_id_cut_cells) const
int compute_surf_and_barys(const Maillage_FT_IJK &maillage_ft_ijk, const IJK_Field_double &indicatrice_ft, const IJK_Field_vector3_double &normale_of_interf, IJK_Field_vector3_double &surface_vapeur_par_face, FixedVector< IJK_Field_vector3_double, 3 > &barycentre_vapeur_par_face)
void get_IJK_ind_from_ind2d(const int dim, const int i_plan, const trustIdType i_2d, const int nx, std::array< int, 3 > &ijk_coo) const
void get_vect_from_sub_cells_tuple(const int dim, const DataArrayDouble *bary0, const DataArrayIdType *cIcellsIdinMesh0, const DataArrayIdType *cellsIdinMesh0, DataArrayDouble *vect) const
static void order_elem_mesh_filaire(MEDCouplingUMesh *mesh1D)
void initialize(const Domaine_IJK &splitting)
int rempli_surface_vapeur_par_face_interieur_bulles(IJK_Field_vector3_double &surface_vapeur_par_face, const IJK_Field_double &indicatrice_ft)
void calculer_surfaces_et_barys_faces_mouillees_vapeur(const Maillage_FT_IJK &maillage_ft_ijk, const IJK_Field_vector3_double &normale_of_interf, IJK_Field_vector3_double &surfaces, FixedVector< IJK_Field_vector3_double, 3 > &barycentres)