TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Descripteur_FT.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// C'est un premier jet.
17// On peut envisager de stocker autrement :
18// pour chaque PE_voisin : un espace distant + un espace virtuel.
19// Dans ce cas les communications sont toujours symetriques.
20
21#ifndef Descripteur_FT_included
22#define Descripteur_FT_included
23
24#include <Objet_U.h>
25#include <Schema_Comm.h>
26#include <TRUSTArrays.h>
27#include <MD_Vector.h>
28#include <MD_Vector_tools.h>
29#include <TRUSTTabs_forward.h>
30#include <TRUSTTabFT.h>
31
32class Comm_Group;
33
34/*! @brief : class Descripteur_FT Descripteur_FT stocke pour chaque PE une liste de numeros d'elements.
35 *
36 * @sa Desc_Structure_FT
37 */
38class Descripteur_FT : public Objet_U
39{
40 Declare_instanciable_sans_constructeur(Descripteur_FT);
41public:
42 // Constructeur
44 Descripteur_FT(const Descripteur_FT&) = default;
46 void reset();
47
48 // Ajoute l'element au PE_voisin, renvoie le rang de l'element ajoute
49 // dans le tableau d'elements du PE.
50 // Il faut appeler calcul_liste_pe_voisins()
51 int ajoute_element(int PE_voisin, int element);
52 int ajoute_elements(int PE_voisin, const ArrOfInt& elements);
53
54 // renvoie les PEs pour lesquels le tableau d'elements n'est pas vide,
55 // tries dans l'ordre croissant de numero de PE.
56 inline const ArrOfInt& pe_voisins() const;
57
58 // Renvoie la liste des elements distants/virtuels du pe en parametre.
59 inline const ArrOfInt& elements(int pe_voisin) const;
60
61 inline const VECT(ArrOfInt)& all_elements() const
62 {
63 return elements_;
64 }
65
66 // Remplace la liste des elements par celle en parametre.
67 // Si on vide un tableau ou si on en remplit un qui etait vide, il
68 // faut recalculer la liste de pe voisins.
69 void set_elements(int PE_voisin, const ArrOfInt& elements);
70
71 // Renvoie "pas zero" si l'element est deja dans le descripteur pour le pe donne,
72 // 0 sinon.
73 int contient_element(int pe, int element) const;
74
75 // Recalcul de la liste des pe_voisins (triee par ordre croissant)
76 // A faire apres avoir modifie les voisinages.
78
79 void retirer_elements(const ArrOfInt& nouveau_pe,
80 Descripteur_FT& elements_retires);
81
82private:
83
84 // Tableau des numeros des PEs voisins (contient exactement la
85 // liste des PEs pour lesquels le tableau elements_ est non vide,
86 // dans l'ordre croissant).
87 ArrOfIntFT pe_voisins_;
88 // Tableau des numeros des elements distants ou virtuels
89 // (sommets ou facettes) (le vecteur a autant d'elements que le nb de procs,
90 // la plupart des tableaux sont generalement vides).
91 VECT(ArrOfInt) elements_;
92
93 // Si on ajoute des elements ou si on remplace la liste d'elements,
94 // le statut devient BAD et on n'a plus le droit d'acceder a la liste
95 // des PEs. Celle-ci doit etre recalculee avec calcul_liste_pe_voisins();
96 enum Status { BAD=1, OK=2 } status_;
97};
98
99/*! @brief : class Desc_Structure_FT
100 *
101 * Desc_Structure_FT est un descripteur adapte aux maillages lagrangiens des
102 * interfaces. Il contient un tableau d'elements et non une serie d'intervalles
103 * (le plus souvent, les elements distants et virtuels ne sont pas contigus dans
104 * les tableaux). De plus, l'allocation memoire est specialisee (les tableaux
105 * croissent geometriquement mais ne decroissent jamais, leur taille est
106 * generalement superieure au nombre d'elements qu'ils contiennent).
107 *
108 * Definition de la correspondance:
109 * Pour deux processeurs numerotes A et B quelconques et un indice i,
110 * on considere les deux numeros suivants
111 * nA = (Sur processeur A, espace_distant.elements(B) [i])
112 * nB = (Sur processeur B, espace_virtuel.elements(A) [i])
113 * On dit que l'espace distant et l'espace virtuel sont en correspondance
114 * si l'element nA sur le processeur A et l'element nB sur le processeur B
115 * representent le meme element (sommet ou facette ...)
116 *
117 */
119{
120 Declare_instanciable_sans_constructeur(Desc_Structure_FT);
121public:
122 // Constructeur par defaut (initialisation des structures)
124
125 // Vide la structure (la memoire n'est pas liberee)
126 void reset();
127
128 // Echange des espaces virtuels pour differents types de tableaux
129 void echange_espace_virtuel(ArrOfDouble& tab) const;
130 void echange_espace_virtuel(ArrOfInt& tab) const;
131 void echange_espace_virtuel(ArrOfDouble& tab, MD_Vector_tools::Operations_echange op) const;
133
134 // Collection des donnees virtuelles (sommation des valeurs virtuelles
135 // sur les differents processeurs et collection sur le noeud reel,
136 // puis echange_espace_virtuel)
137 void collecter_espace_virtuel(ArrOfDouble& tab, MD_Vector_tools::Operations_echange op) const;
139
140 Descripteur_FT& espace_distant(); // Status -> BAD
141 const Descripteur_FT& espace_distant() const ;
142 Descripteur_FT& espace_virtuel(); // Status -> BAD
143 const Descripteur_FT& espace_virtuel() const ;
144
145 // Cette fonction doit etre appelee chaque fois qu'on modifie les
146 // espaces distants et virtuels
147 void calcul_schema_comm(const int nb_items_tot);
148
149 void echanger_elements(const ArrOfInt& nouveau_pe);
150 void remplir_element_pe(ArrOfInt& element_pe) const;
151
152 int check() const;
153
154 const Schema_Comm& schema_comm() const;
155 const Schema_Comm& schema_comm_inverse() const;
156
157 const MD_Vector& get_md_vector() const;
158
159protected:
160
163
164 // Si on modifie le descripteur (utilisation de espace_distant()
165 // ou espace_virtuel() en version non-const), alors le
166 // statut passe a BAD. On recalcule le descripteur au besoin
168
169 ArrOfInt pe_voisins_;
170 VECT(ArrOfInt) blocs_to_recv_;
172 mutable DoubleVect tmp_doublevect_;
173 mutable IntVect tmp_intvect_;
174
177};
178
179/*! @brief Renvoie la liste des PE pour lesquels la liste d'elements est non vide, dans l'ordre croissant des numeros de PE.
180 *
181 */
182inline const ArrOfInt& Descripteur_FT::pe_voisins() const
183{
184 assert(status_ == OK);
185 return pe_voisins_;
186}
187
188/*! @brief Renvoie la liste des elements distants/virtuels du pe en parametre.
189 *
190 */
191inline const ArrOfInt& Descripteur_FT::elements(int pe_voisin) const
192{
193 return elements_[pe_voisin];
194}
195
196#endif
: Cette classe decrit un groupe de processeurs sur lesquels
Definition Comm_Group.h:40
void collecter_espace_virtuel(ArrOfDouble &tab, MD_Vector_tools::Operations_echange op) const
int check() const
Verification de la coherence de la structure (graphe des voisins et taille des espaces virtuels et di...
void echange_espace_virtuel(ArrOfDouble &tab) const
Descripteur_FT & espace_virtuel()
Renvoie une reference non-const a l'espace virtuel.
void echanger_elements(const ArrOfInt &nouveau_pe)
Correction des espaces distants et virtuels lors d'un changement de proprietaire (noeud ou facette).
VECT(ArrOfInt) blocs_to_recv_
DoubleVect tmp_doublevect_
const MD_Vector & get_md_vector() const
Descripteur_FT espace_virtuel_
Schema_Comm schema_comm_
Descripteur_FT & espace_distant()
Renvoie une reference non-const a l'espace distant.
void calcul_schema_comm(const int nb_items_tot)
const Schema_Comm & schema_comm() const
const Schema_Comm & schema_comm_inverse() const
enum Desc_Structure_FT::Status status_md_
Schema_Comm schema_comm_inverse_
Descripteur_FT espace_distant_
void remplir_element_pe(ArrOfInt &element_pe) const
remplit le tableau qui donne pour chaque element le numero du pe proprietaire.
: class Descripteur_FT Descripteur_FT stocke pour chaque PE une liste de numeros d'elements.
int contient_element(int pe, int element) const
Renvoie "pas zero" si l'element est deja dans le descripteur pour le pe donne, 0 sinon.
Descripteur_FT & operator=(const Descripteur_FT &)
void set_elements(int PE_voisin, const ArrOfInt &elements)
Remplace la liste des elements par celle en parametre.
void retirer_elements(const ArrOfInt &nouveau_pe, Descripteur_FT &elements_retires)
Pour chaque PE du descripteur, et pour 0 <= i < elements_[pe].
int ajoute_element(int PE_voisin, int element)
Ajoute l'element au tableau du PE_voisin.
const VECT(ArrOfInt) &all_elements() const
Descripteur_FT(const Descripteur_FT &)=default
const ArrOfInt & elements(int pe_voisin) const
Renvoie la liste des elements distants/virtuels du pe en parametre.
const ArrOfInt & pe_voisins() const
Renvoie la liste des PE pour lesquels la liste d'elements est non vide, dans l'ordre croissant des nu...
void calcul_liste_pe_voisins()
Calcule la liste des PEs dont la liste d'elements est non vide, tries dans l'ordre croissant de numer...
int ajoute_elements(int PE_voisin, const ArrOfInt &elements)
Ajoute l'element au tableau du PE_voisin.
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
Definition MD_Vector.h:48
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55