TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Champ_Elem_DG.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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#include <Champ_Elem_DG.h>
17#include <TRUSTTab_parts.h>
18#include <Domaine_Cl_dis_base.h>
19#include <Domaine_DG.h>
20#include <Option_DG.h>
21#include <Matrix_tools.h>
22#include <Array_tools.h>
23#include <BasisFunction.h>
24
25
26Implemente_instanciable(Champ_Elem_DG, "Champ_Elem_DG", Champ_Inc_P0_base);
27
28Sortie& Champ_Elem_DG::printOn(Sortie& s) const { return s << que_suis_je() << " " << le_nom(); }
29
31{
32 lire_donnees(s);
33 return s;
34}
35
36int Champ_Elem_DG::imprime(Sortie& os, int ncomp) const //TODO DG adapt
37{
38 const Domaine_dis_base& domaine_dis = domaine_dis_base();
39 const Domaine& domaine = domaine_dis.domaine();
40 const DoubleTab& coord=domaine.coord_sommets();
41 const int nb_som = domaine.nb_som();
42 const DoubleTab& val = valeurs();
43 int som;
44 os << nb_som << finl;
45 for (som=0; som<nb_som; som++)
46 {
47 if (dimension==3)
48 os << coord(som,0) << " " << coord(som,1) << " " << coord(som,2) << " " ;
49 if (dimension==2)
50 os << coord(som,0) << " " << coord(som,1) << " " ;
51 if (nb_compo_ == 1)
52 os << val(som) << finl;
53 else
54 os << val(som,ncomp) << finl;
55 }
56 os << finl;
57 Cout << "Champ_Elem_DG::imprime FIN >>>>>>>>>> " << finl;
58 return 1;
59}
60
62{
63 creer_tableau_distribue(domaine_dis_base().domaine().md_vector_elements()); // TODO 26/08/2024 nb_ddl a
64 return n;
65}
66
67
69{
70 le_dom_VF = ref_cast(Domaine_VF, z_dis);
71
72 order_ = Option_DG::Get_order_for(nom_);// Todo regler la relation ordre inconnu/quadrature avec dictionnaire ?
74}
75
76
77/*@brief Used to project a Champ_base to a Champ_Elem_DG. Mostly used for initial condition
78 *
79 */
81{
82 const Domaine_DG& domaine = ref_cast(Domaine_DG,le_dom_VF.valeur());
83 const DoubleVect& volume = domaine.volumes();
84
85 const BasisFunction& bfunc = domaine.get_basisFunction(order_);
86 assert(nb_bfunc_ == bfunc.nb_bfunc());
87
88 const int quad_order = bfunc.get_default_quadrature_order();
89
90 const Quadrature_base& quad = domaine.get_quadrature(quad_order); // if Uniforme remplissage automatique
91 //sinon interdit d'avoir 1
92
93 //creation d'un DoubleTab intermediaire pour recuperer les valeurs du champ ch sur les points de quadrature ?
94 const DoubleTab& integ_points = quad.get_integ_points();
95 int nb_pts_integ_max = quad.nb_pts_integ_max();
96
97 const int dim = is_vectorial() ? Objet_U::dimension : 1;
98
99 int nb_elem = domaine.nb_elem();
100
101 DoubleTab product(nb_pts_integ_max);
102 int nb_pts_integ = integ_points.dimension(0);
103 DoubleTab values(nb_pts_integ,dim);
104 DoubleTab phi_rhs(nb_bfunc_);
105 DoubleTab res;
106
107 DoubleTab fbase(nb_bfunc_, nb_pts_integ_max);
108
109 ch.valeur_aux(integ_points, values);
110
111 for (int num_elem = 0; num_elem < nb_elem; num_elem++)
112 {
113 Matrice_Dense invM;
114 bfunc.eval_bfunc(quad, num_elem, fbase);
115 if (!domaine.gram_schmidt())
116 invM = bfunc.eval_invMassMatrix(quad, num_elem); //to remove and ref on global matrix
117 for (int d =0; d<dim; d++)
118 {
119 for (int fb = 0; fb < nb_bfunc_; fb++)
120 {
121 for (int k = 0; k < quad.nb_pts_integ(num_elem) ; k++)
122 product(k) = values(quad.ind_pts_integ(num_elem) + k,d) * fbase(fb, k);
123
124 phi_rhs(fb) = quad.compute_integral_on_elem(num_elem, product);
125 }
126
127 if (domaine.gram_schmidt())
128 {
129 for (int fb = 0; fb < nb_bfunc_; fb++)
130 valeurs()(num_elem,fb+d*nb_bfunc_) = phi_rhs(fb)/volume(num_elem);
131 }
132 else
133 {
134 res.ref_array(valeurs(), (num_elem*dim+d)*nb_bfunc_, nb_bfunc_);
135 invM.ajouter_multvect_(phi_rhs, res);
136 }
137 }
138 }
139
141 return *this;
142}
143/*@brief Compute from a Champ_Elem_DG, its value at a certain position. Mostly used for post-processing
144 *
145 */
146DoubleTab& Champ_Elem_DG::valeur_aux(const DoubleTab& positions, DoubleTab& tab_valeurs) const
147{
148 const Domaine_DG& domaine_DG = ref_cast(Domaine_DG,le_dom_VF.valeur());
149 const Domaine& domaine = domaine_dis_base().domaine();
150 throw; // /!\ TODO
151 const int dim = Objet_U::dimension;
152
153 const BasisFunction& bfunc = domaine_DG.get_basisFunction(order_);
154 assert(nb_bfunc_ == bfunc.nb_bfunc());
155
156 const int quad_order = bfunc.get_default_quadrature_order();
157
158 const Quadrature_base& quad = domaine_DG.get_quadrature(quad_order);
159 int nb_pts_integ_max = quad.nb_pts_integ_max();
160
161 IntVect les_polys;
162 les_polys.resize(tab_valeurs.dimension(0), RESIZE_OPTIONS::NOCOPY_NOINIT);
163
164 domaine.chercher_elements(positions, les_polys); //TODO DG selectionner uniquement la premiere valeur de tab_valeurs (on refait plein de fois le même truc)
165
166 const Champ_base& ch_base = le_champ();
167 const DoubleTab& values = ch_base.valeurs();
168 int nb_polys = les_polys.size();
169
170
171 if (nb_polys == 0)
172 return tab_valeurs;
173
174 DoubleTab fbase(nb_bfunc_,nb_pts_integ_max);
175 DoubleTab coords(nb_pts_integ_max,dim);
176 for (int i = 0; i < nb_polys; i++)
177 {
178 int cell = les_polys(i);
179 assert(cell < values.dimension_tot(0));
180
181 if (cell != -1)
182 {
183 for (int j = 0; j < quad.nb_pts_integ(cell); j++)
184 for (int k = 0; k<dim; k++)
185 coords(j,k) = positions(quad.ind_pts_integ(cell) +j, k);
186// coords.ref_tab(positions, i*nb_points, nb_points); //pas possible car const
187
188 bfunc.eval_bfunc(coords, cell, fbase);
189
190 for (int j = 0; j < quad.nb_pts_integ(cell) ; j++)
191 {
192 tab_valeurs(i,j) = 0.;
193 for (int l =0; l<nb_bfunc_; l++)
194 tab_valeurs(i,j) += values(cell,l) * fbase(l,j); // reconstruction valeurs du champ aux points d'integrations
195 }
196 }
197 }
198
199 return tab_valeurs;
200}
201
202DoubleTab& Champ_Elem_DG::eval_elem(DoubleTab& tab_valeurs) const
203{
204 const Domaine_DG& domaine = ref_cast(Domaine_DG,le_dom_VF.valeur());
205
206 const int nb_elem = domaine.nb_elem();
207
208 const BasisFunction& bfunc = domaine.get_basisFunction(order_);
209 assert(nb_bfunc_ == bfunc.nb_bfunc());
210
211 const Quadrature_base& quad = domaine.get_quadrature(5);
212 int nb_pts_integ_max = quad.nb_pts_integ_max();
213
214 const int dim = is_vectorial() ? Objet_U::dimension : 1;
215
216 const Champ_base& ch_base = le_champ();
217 const DoubleTab& values = ch_base.valeurs();
218
219 assert(tab_valeurs.dimension(0) == nb_elem && tab_valeurs.dimension(1) == dim*nb_pts_integ_max );
220
221 DoubleTab fbase(nb_bfunc_,nb_pts_integ_max);
222 tab_valeurs = 0.;
223 for (int i = 0; i < nb_elem; i++)
224 {
225 bfunc.eval_bfunc(quad, i, fbase);
226
227 for (int d =0; d<dim; d++)
228 {
229
230 for (int j = 0; j < quad.nb_pts_integ(i) ; j++)
231 {
232 for (int l =0; l<nb_bfunc_; l++)
233 tab_valeurs(i,j+d*nb_pts_integ_max) += values(i,l+d*nb_bfunc_) * fbase(l,j); // reconstruction valeurs du champ aux points d'integrations
234 }
235 }
236 }
237
238 return tab_valeurs;
239}
240
241DoubleTab& Champ_Elem_DG::valeur_aux_elems(const DoubleTab& positions, const IntVect& polys, DoubleTab& result) const
242{
243
244 const Domaine_DG& domaine = ref_cast(Domaine_DG,le_dom_VF.valeur());
245
246 const DoubleVect& volume = domaine.volumes();
247
248 const BasisFunction& bfunc = domaine.get_basisFunction(order_);
249 assert(nb_bfunc_ == bfunc.nb_bfunc());
250
251 const Quadrature_base& quad = domaine.get_quadrature(5);
252 int nb_pts_integ_max = quad.nb_pts_integ_max();
253
254 const Champ_base& ch_base = le_champ();
255 const DoubleTab& values = ch_base.valeurs();
256 int nb_polys = polys.size();
257
258 if (nb_polys == 0)
259 return result;
260
261 int ndim = is_vectorial() ? Objet_U::dimension : 1;
262 ToDo_Kokkos("critical");
263
264 DoubleTab fbase(nb_bfunc_, nb_pts_integ_max);
265 DoubleTab product(nb_pts_integ_max);
266
267 for (int i = 0; i < nb_polys; i++)
268 {
269 int cell = polys(i);
270 assert(cell < values.dimension_tot(0));
271
272 if (cell != -1)
273 {
274 bfunc.eval_bfunc(quad, cell, fbase);
275
276 for (int j = 0; j<ndim; j++)
277 {
278 product = 0.;
279 for (int k = 0; k < quad.nb_pts_integ(cell) ; k++)
280 for (int l =0; l<nb_bfunc_; l++)
281 product(k) += values(cell,j*nb_bfunc_ + l) * fbase(l,k); // reconstruction valeurs du champ aux points coords
282
283 result(i,j) = quad.compute_integral_on_elem(cell, product);
284 result(i,j) /= volume(cell);
285 }
286 }
287 }
288
289 return result;
290
291}
Manages the local polynomial basis functions for Discontinuous Galerkin elements.
void eval_bfunc(const Quadrature_base &quad, const int &nelem, DoubleTab &fbasis) const
Evaluates all basis functions at the element quadrature points.
const int & nb_bfunc() const
const int & get_default_quadrature_order() const
const Matrice_Dense eval_invMassMatrix(const Quadrature_base &quad, const int &nelem) const
Computes the inverse of the local L2 mass matrix for element nelem.
DoubleTab & eval_elem(DoubleTab &valeurs) const override
int fixer_nb_valeurs_nodales(int n) override
Champ_base & affecter_(const Champ_base &ch) override
int imprime(Sortie &, int) const override
DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const override
provoque une erreur ! doit etre surchargee par les classes derivees
void associer_domaine_dis_base(const Domaine_dis_base &) override
DoubleTab & valeur_aux(const DoubleTab &positions, DoubleTab &valeurs) const override
Provoque une erreur ! Doit etre surchargee par les classes derivees.
: class Champ_Inc_P0_base
Champ_base & le_champ() override
const Domaine & domaine() const
virtual void creer_tableau_distribue(const MD_Vector &, RESIZE_OPTIONS=RESIZE_OPTIONS::COPY_INIT)
int lire_donnees(Entree &)
Lit les valeurs du champs a partir d'un flot d'entree.
const Domaine_dis_base & domaine_dis_base() const override
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
Champ_base()
Constructeur par defaut d'un Champ_base.
virtual DoubleTab & valeur_aux(const DoubleTab &positions, DoubleTab &valeurs) const
Provoque une erreur ! Doit etre surchargee par les classes derivees.
const Quadrature_base & get_quadrature(int order) const
Definition Domaine_DG.h:100
const BasisFunction & get_basisFunction(int order) const
class Domaine_VF
Definition Domaine_VF.h:44
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
const Nom & le_nom() const override
Renvoie le nom du champ.
int nb_compo_
Definition Field_base.h:95
bool is_vectorial() const
Definition Field_base.h:82
DoubleVect & ajouter_multvect_(const DoubleVect &x, DoubleVect &r) const override
Operation de multiplication-accumulation (saxpy) matrice vecteur.
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static int Nb_col_from_order(const int order)
Definition Option_DG.cpp:81
static int Get_order_for(const Nom &n)
Definition Option_DG.cpp:70
int ind_pts_integ(int e) const
int nb_pts_integ(int e) const
const DoubleTab & get_integ_points() const
int nb_pts_integ_max() const
double compute_integral_on_elem(int num_elem, Parser_U &parser) const
Classe de base des flux de sortie.
Definition Sortie.h:52
void ref_array(TRUSTArray< _TYPE_, _SIZE_ > &, _SIZE_ start=0, _SIZE_ sz=-1) override
Definition TRUSTTab.tpp:332
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")