TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Champ_Generique_refChamp.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_Generique_refChamp.h>
17#include <Champ_Inc_P0_base.h>
18#include <Champ_Inc_P1_base.h>
19#include <Champ_Fonc_P0_base.h>
20#include <Champ_Fonc_P1_base.h>
21#include <Domaine_VF.h>
22#include <Champ_Uniforme.h>
23#include <Champ_Inc_Q1_base.h>
24#include <Champ_Fonc_Q1_base.h>
25#include <Equation_base.h>
26#include <Synonyme_info.h>
27#include <Param.h>
28#include <Postraitement.h>
29
30Implemente_instanciable(Champ_Generique_refChamp,"refChamp",Champ_Generique_base);
31// XD refchamp champ_generique_base refchamp INHERITS_BRACE Field of prolem
32
33Add_synonym(Champ_Generique_refChamp,"Champ_Post_refChamp");
34
36{
37 return os;
38}
39
41{
43}
44
45/*! @brief pb_champ : triggers the reading of the problem name (nom_pb_) to which the discrete field belongs and the name of that discrete field (nom_champ_)
46 *
47 * nom_source : option to name the field as a source (otherwise named by default)
48 *
49 */
51{
52 param.ajouter_non_std("nom_source",(this)); // XD attr nom_source chaine nom_source OPT The alias name for the field
53 param.ajouter_non_std("Pb_champ",(this),Param::REQUIRED); // XD attr pb_champ deuxmots pb_champ REQ { Pb_champ nom_pb
54 // XD_CONT nom_champ } : nom_pb is the problem name and nom_champ is the selected field name.
55}
56
58{
59 if (mot=="Pb_champ")
60 {
61 // Read the problem name and the field name
62 is >> nom_pb_ >> nom_champ_;
63 // Search for the problem among the objects known to the interpreter
64 const Objet_U& ob = interprete().objet(nom_pb_);
65 if (!sub_type(Probleme_base, ob))
66 {
67 Cerr << "Error in Champ_Generique_refChamp ::lire(keyword=\"pb_champ\"\n"
68 << " The object " << nom_pb_ << " is not a Probleme_base" << finl;
69 exit();
70 }
71 Probleme_base& pb = ref_cast_non_const(Probleme_base, ob);
72 ref_pb_ = pb;
73 // Search for the field "nom_champ" in the problem:
74 OBS_PTR(Champ_base) ref_champ;
75 Noms liste_noms;
76 pb.get_noms_champs_postraitables(liste_noms);
78 ref_champ = pb.get_champ(nom_champ_);
79 ref_champ->corriger_unite_nom_compo();
80 set_ref_champ(ref_champ.valeur());
81 return 1;
82 }
83 else if (mot=="nom_source")
84 {
85 Nom id_source;
86 is >> id_source;
87 nommer(id_source);
88 return 1;
89 }
90 else
92}
93
94/*! @brief Initialize the class with the given field.
95 *
96 * We take a reference to this field (it must remain valid afterwards).
97 *
98 */
100{
101 ref_champ_ = champ;
102}
103
104/*! @brief Returns the number of coordinates of each vertex of the domain.
105 *
106 * See GenericField_base::get_dimension()
107 *
108 */
110{
111 // We do not use Objet_U::dimension intentionally as we hope to remove
112 // this static variable soon.
113 const DoubleTab coords = get_ref_coordinates();
114 const int dim = coords.dimension(1);
115 return dim;
116}
117
119{
120 list.add("nom");
121 list.add("nom_cible");
122 list.add("unites");
123 list.add("composantes");
124 list.add("synonyms");
125}
126
128{
129
130 Motcles motcles(5);
131 motcles[0] = "nom";
132 motcles[1] = "nom_cible";
133 motcles[2] = "unites";
134 motcles[3] = "composantes";
135 motcles[4] = "synonyms";
136
137 int rang = motcles.search(query);
138 switch(rang)
139 {
140 case 0:
141 {
142 Noms mots(1);
143 mots[0] = nom_post_;
144 return mots;
145 }
146 case 1:
147 {
148 Noms mots(1);
149 mots[0] = nom_champ_;
150 return mots;
151 }
152 case 2 :
153 {
154 const Noms mots0= get_ref_champ_base().unites();
155 ref_cast_non_const(Champ_base,get_ref_champ_base()).corriger_unite_nom_compo();
156 const Noms mots = get_ref_champ_base().unites();
157 if (mots.size()!=mots0.size())
158 {
159 Cerr<<"iuuuuuu"<<mots<<" "<<mots0<<finl;
160 exit();
161 }
162 for (int i=0; i<mots.size(); i++)
163 {
164 if (mots0[i]!=mots[i])
165 {
166 Cerr <<" iiiiiiiiii"<<mots0[i]<< " "<<mots[i]<<finl;
167 exit();
168 }
169 }
170 return mots;
171 }
172 case 4 :
173 {
174 if (syno_.size()>0)
175 return syno_;
176
177 const Noms mots = get_ref_champ_base().get_synonyms();
178
179 return mots;
180 }
181 case 3 :
182 {
183 if (compo_.size()>1)
184 return compo_;
185
186 const Noms mots = get_ref_champ_base().noms_compo();
187 int nb_comp = mots.size();
188
189 Noms compo(nb_comp);
190 for (int i=0; i<nb_comp; i++)
191 {
192 Nom nume(i);
193 compo[i] = nom_post_+nume;
194 }
195 return compo;
196 }
197 default :
198 {
199 Cerr<<"The identifiable properties are : "<<motcles<<finl;
200 exit();
201 }
202 }
203 //For compilation
204 // We never reach here
205 return get_property(query);
206
207}
208
209/*! @brief If the field is not a discrete field: exception Champ_Generique_erreur("INVALID") Otherwise, returns the localisation of the field for support "index".
210 *
211 * If index == -1 (default value), raises an exception if the field has multiple supports.
212 * Otherwise, raises an exception if the index exceeds the number of field localisations.
213 *
214 */
216{
217 Entity loc;
218 //For initialization
219 loc =Entity::NODE;
220
221 const Champ_base& ch = get_ref_champ_base();
222 const Domaine_dis_base& z_dis_base = get_ref_domaine_dis_base();
223
224 // Discrete fields with a single localisation:
225 if ((sub_type(Champ_Inc_P0_base, ch) || sub_type(Champ_Fonc_P0_base, ch)) && index <= 0)
226 {
227 loc = Entity::ELEMENT;
228 }
229 else if ((sub_type(Champ_Inc_P1_base, ch)|| sub_type(Champ_Fonc_P1_base, ch)) && index <= 0)
230 {
231 loc = Entity::NODE;
232 }
233 else if ((ch.que_suis_je().debute_par("Champ_Face_PolyMAC")
234 || ch.que_suis_je().debute_par("Champ_Fonc_Face_PolyMAC")
235 || ch.valeurs().dimension(0) == ref_cast(Domaine_VF,z_dis_base).nb_faces()) && index <= 0)
236 {
237 loc = Entity::FACE;
238 }
239 else
240 {
241 // Discrete fields with multiple localisations
242 Nom message="Invalid localization used for postprocessing the field ";
243 message+=ch.le_nom()+". Change your data file.";
244 throw Champ_Generique_erreur(message);
245 }
246 return loc;
247}
248
249/*! @brief Verifies that the field is indeed a discrete field and returns the value array.
250 *
251 * Otherwise, raises the exception Champ_Generique_erreur("NO_REF")
252 *
253 */
255{
256 // Call to get_localisation to verify that the field is indeed a discrete field
257 // (multi-support or not)
259 // Returns the field values
260 const DoubleTab& val = get_ref_champ_base().valeurs();
261 return val;
262}
263
264/*! @brief Creates a copy of the value array. See GenericField_base::get_copy_values()
265 *
266 */
267void Champ_Generique_refChamp::get_copy_values(DoubleTab& values) const
268{
269 const DoubleTab& val = get_ref_values();
270 // Creates a copy of the array
271 values = val;
272}
273
274/*! @brief call to Champ_base::valeur_aux()
275 *
276 */
277void Champ_Generique_refChamp::get_xyz_values(const DoubleTab& coords, DoubleTab& values, ArrOfBit& validity_flag) const
278{
279 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
280}
281
283{
284 const Champ_base& ch = get_ref_champ_base();
285 if (sub_type(Champ_Inc_base,ch))
286 return ref_cast(Champ_Inc_base,ch).equation().domaine_Cl_dis();
287 else
288 {
289 Cerr<<"No zcl_dis is available for the field "<<ch.que_suis_je()<<finl;
290 exit();
291 }
292
293 //For compilation
294 return get_ref_zcl_dis_base();
295}
296
298{
299 const DoubleTab& coord = get_ref_domain().coord_sommets();
300 return coord;
301}
302
303void Champ_Generique_refChamp::get_copy_coordinates(DoubleTab& coordinates) const
304{
305 const DoubleTab& coord = get_ref_coordinates();
306 coordinates = coord;
307}
308
309const IntTab& Champ_Generique_refChamp::get_ref_connectivity(Entity index1, Entity index2) const
310{
311 const Champ_base& ch = get_ref_champ_base();
312 const Domaine_dis_base& domaine_dis_base = ch.domaine_dis_base();
313 const Domaine& domaine = domaine_dis_base.domaine();
314 const Domaine_VF& domaine_vf = ref_cast(Domaine_VF, domaine_dis_base);
315
316 switch(index1)
317 {
318 case Entity::ELEMENT:
319 {
320 switch(index2)
321 {
322 case Entity::NODE:
323 return domaine.les_elems();
324 case Entity::FACE:
325 return domaine_vf.elem_faces();
326 default :
327 {
328 exit();
329 }
330 }
331 break;
332 }
333 case Entity::FACE:
334 {
335 switch(index2)
336 {
337 case Entity::NODE:
338 return domaine_vf.face_sommets();
339 case Entity::ELEMENT:
340 return domaine_vf.face_voisins();
341 default :
342 {
343 exit();
344 }
345 }
346 break;
347 }
348 default :
349 {
350 exit();
351 }
352 }
353 Nom message="Invalid localization used for postprocessing the field ";
354 message+=ch.le_nom()+". Change your data file.";
355 throw Champ_Generique_erreur(message);
356}
357
358void Champ_Generique_refChamp::get_copy_connectivity(Entity index1, Entity index2, IntTab& tab) const
359{
360 const IntTab& connectivity = get_ref_connectivity(index1, index2);
361 tab = connectivity;
362}
363
364// Returns the problem that carries the target field
366{
367 return ref_pb_.valeur();
368}
369
370/*! @brief Returns the underlying champ_base.
371 *
372 * Tests that the field has been properly associated. Eventually, this method will be removed from GenericField_base but remains
373 * here (to test if the field has been associated).
374 * Exceptions:
375 * Champ_Generique_erreur("NOT_INITIALIZED")
376 *
377 */
379{
380 if (!ref_champ_)
381 throw Champ_Generique_erreur("NOT_INITIALIZED");
382 return ref_champ_.valeur();
383}
384
386{
387 ref_champ_.reset();
389}
390
395
396/*! @brief See Champ_Generique_base::mettre_a_jour If the field is a champ_inc in the equation, it must already have
397 *
398 * been updated by the equation.
399 * If it is a calculated field, the update is done in get_champ
400 *
401 */
403{
404
405}
406
407/*! @brief See Champ_Generique_base::get_champ.
408 *
409 * Here, the storage space is not used, the field already exists
410 *
411 */
413{
414 const Nom& nom_cible = get_ref_champ_base().le_nom();
415 ref_pb_->get_champ(nom_cible);
416 return get_ref_champ_base();
417}
418
420{
421 return get_champ(espace_stockage);
422}
423
424/*! @brief Associates the field and determines its localisation.
425 *
426 */
428{
429 assert(!ref_champ_);
430 ref_champ_ = champ;
431
432 // Determination of the field localisation
433 // We handle a few fields of known types...
434 // For the others, they must be interpolated somewhere.
435 // The ideal would be for the localisation to be a property of the discrete field itself.
436
437 Nom type = champ.que_suis_je();
438 type.majuscule();
439
440 if (type.debute_par("CHAMP_P0"))
441 {
442 localisation_ = "ELEMENTS";
443 }
444 else if (type == "CHAMP_P1")
445 {
446 localisation_ = "SOMMETS";
447 }
448 else if (type.debute_par("CHAMP_FACE"))
449 {
450 localisation_ = "FACES";
451 }
452 else if (type == "CHAMP_P1NC")
453 {
454 localisation_ = "FACES";
455 }
456 else
457 {
458 localisation_ = "LOCALISATION_INCONNUE";
459 }
460}
461
462//Returns the time of the target field
464{
465 double temps;
466 temps = get_ref_champ_base().temps();
467 return temps;
468}
469
470//Returns the directive (champ_elem, champ_sommets, champ_face or pression)
471//to launch the discretisation of the storage space returned by
472//the get_champ() method of the Champ_Generique_base that triggered the call
474{
475 Motcle directive;
476 const Champ_base& ch = get_ref_champ_base();
477
478 // Discrete fields with a single localisation:
479 if (sub_type(Champ_Inc_P0_base,ch) || sub_type(Champ_Fonc_P0_base,ch))
480 directive = ch.is_basis_function() ? "champ_elem_DG" : (ch.is_quadrature() ? "champ_fonc_quad_DG" : "champ_elem");
481 else if (sub_type(Champ_Inc_P1_base,ch) || sub_type(Champ_Fonc_P1_base,ch)
482 || sub_type(Champ_Inc_P1_base,ch) || sub_type(Champ_Inc_Q1_base,ch)
483 || sub_type(Champ_Fonc_Q1_base,ch))
484 {
485 directive = "champ_sommets";
486 // assert(localisation_=="SOMMETS");
487 }
488 else
489 {
490 const Nom& type = ch.que_suis_je();
491 if ((type.debute_par("Champ_Face")) || (type=="Champ_P1NC") || (type=="Champ_Q1NC") ||
492 (type=="Champ_Fonc_Face") || (type=="Champ_Fonc_P1NC") || (type=="Champ_Fonc_Q1NC"))
493 {
494 directive = "champ_face";
495 // assert(localisation_=="FACES");
496 }
497 else if ((type=="Champ_P1_isoP1Bulle") || (type=="Champ_Fonc_P1_isoP1Bulle"))
498 {
499 directive = "pression";
500 }
501 else if (sub_type(Champ_Uniforme,ch))
502 {
503 directive = "champ_uniforme";
504 }
505
506 else if (sub_type(Champ_Don_base,ch))
507 {
508 directive = "champ_don";
509 }
510
511 else
512 {
513 Cerr<<"No directive is available to create a storing field for the source field of type "<<ch.que_suis_je()<<finl;
514 exit();
515 }
516 }
517
518 return directive;
519
520}
521
526
527//Name the field as a source by default
528//nom_champ_base + "_natif_" + nom_dom_natif
530{
531 if (nom_post_=="??")
532 {
533 Nom nom_post_source, nom_champ_base, nom_dom_natif;
534 nom_champ_base = get_ref_champ_base().le_nom();
535 if (ref_cast_non_const(Postraitement, post).domaine())
536 {
537 nom_post_source = nom_champ_base + "_natif_" + ref_cast_non_const(Postraitement, post).domaine()->le_nom();
538 }
539 else
540 {
541 nom_dom_natif = get_ref_domain().le_nom();
542 nom_post_source = nom_champ_base + "_natif_" + nom_dom_natif;
543 }
544 nommer(nom_post_source);
545 }
546}
547
549{
550 return 0;
551}
552
554{
555 return syno_ = noms;
556}
558{
559 return compo_ = noms;
560}
class Champ_Don_base base class of Given Fields (not calculated)
: class Champ_Fonc_P1_base
: class Champ_Fonc_Q1_base
class Champ_Generique_base
virtual const Domaine_dis_base & get_ref_domaine_dis_base() const
Returns a ref to the discretized domain on which the storage space will be evaluated.
int lire_motcle_non_standard(const Motcle &, Entree &) override
Reads non-simple-type parameters of an Objet_U from an input stream.
void nommer(const Nom &nom) override
Assigns a name to the Objet_U. Virtual method to override.
virtual const Domaine & get_ref_domain() const
Returns a ref to the domain on which the storage space will be evaluated.
Special field class that encapsulates a reference to a volume field of TRUST of type Champ_base.
void initialize(const Champ_base &champ)
Initialize the class with the given field.
void get_xyz_values(const DoubleTab &coords, DoubleTab &values, ArrOfBit &validity_flag) const override
call to Champ_base::valeur_aux()
int get_dimension() const override
Returns the number of coordinates of each vertex of the domain.
void mettre_a_jour(double temps) override
See Champ_Generique_base::mettre_a_jour If the field is a champ_inc in the equation,...
virtual void set_ref_champ(const Champ_base &)
Associates the field and determines its localisation.
void get_copy_values(DoubleTab &) const override
Creates a copy of the value array. See GenericField_base::get_copy_values().
void nommer_source(const Postraitement_base &post)
void get_property_names(Motcles &list) const override
Returns the list of possible "queries" for the field.
virtual const Champ_base & get_ref_champ_base() const
Returns the underlying champ_base.
int lire_motcle_non_standard(const Motcle &, Entree &) override
Reads non-simple-type parameters of an Objet_U from an input stream.
double get_time() const override
Returns the time of the Champ_Generique_base.
const DoubleTab & get_ref_values() const override
Verifies that the field is indeed a discrete field and returns the value array.
OWN_PTR(Champ_base) ptr_champ_
const Champ_base & get_champ(OWN_PTR(Champ_base)&espace_stockage) const override
See Champ_Generique_base::get_champ.
const DoubleTab & get_ref_coordinates() const override
Returns a reference to the array of coordinates of the vertices of the mesh supporting the field,...
const Domaine_Cl_dis_base & get_ref_zcl_dis_base() const override
Returns a ref to the discretized boundary conditions domain of the equation carrying the target field...
void get_copy_coordinates(DoubleTab &) const override
const Motcle get_directive_pour_discr() const override
Returns the directive (champ_elem, champ_sommets, champ_face or pression) to launch the discretizatio...
void set_param(Param &param) const override
pb_champ : triggers the reading of the problem name (nom_pb_) to which the discrete field belongs and...
const Champ_base & get_champ_without_evaluation(OWN_PTR(Champ_base)&espace_stockage) const override
OBS_PTR(Champ_base) ref_champ_
const Probleme_base & get_ref_pb_base() const override
Returns the problem that carries the target field.
Entity get_localisation(const int index=-1) const override
If the field is not a discrete field: exception Champ_Generique_erreur("INVALID") Otherwise,...
const Noms & fixer_noms_synonyms(const Noms &noms) override
void get_copy_connectivity(Entity index1, Entity index2, IntTab &) const override
const Noms & fixer_noms_compo(const Noms &noms) override
const IntTab & get_ref_connectivity(Entity index1, Entity index2) const override
Returns the connectivity array between the geometric entity index1 and entity index2.
const Noms get_property(const Motcle &query) const override
Returns the requested property.
void completer(const Postraitement_base &post) override
: class Champ_Inc_P0_base
Class Champ_Inc_base.
virtual DoubleTab & valeurs()=0
Champ_Uniforme Represents a field that is constant in space and time.
class Champ_base This class is the base of the fields hierarchy.
Definition Champ_base.h:43
virtual const Domaine_dis_base & domaine_dis_base() const
double temps() const
Returns the time of the field.
void corriger_unite_nom_compo()
This method will set the units and the name of components, it is not actually const!...
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
class Domaine_VF
Definition Domaine_VF.h:44
int face_sommets(int i, int j) const
Returns the index of the i-th vertex of face num_face.
Definition Domaine_VF.h:582
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
Definition Domaine_VF.h:542
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
Definition Domaine_VF.h:418
const Nom & le_nom() const override
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
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
Returns the name of the field.
const Noms & get_synonyms() const
Definition Field_base.h:52
bool is_quadrature() const
Definition Field_base.h:81
const Noms & unites() const
Returns the units of the field components.
bool is_basis_function() const
Definition Field_base.h:80
const Noms & noms_compo() const
Returns the array of names of the field components.
static Objet_U & objet(const Nom &)
See Interprete_bloc::objet_global(). BM: the Interprete class is not the best place for this.
A character string (Nom) in uppercase.
Definition Motcle.h:26
An array of Motcle objects.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:319
class Nom: a character string for naming TRUST objects.
Definition Nom.h:31
virtual int debute_par(const char *const n) const
Definition Nom.cpp:314
Nom & majuscule()
Converts the name to uppercase. Only letters 'a'-'z' are modified.
Definition Nom.cpp:176
const Nom & le_nom() const override
Returns *this.
Definition Nom.cpp:555
An array of character strings (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:71
const Interprete & interprete() const
Definition Objet_U.cpp:211
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
Objet_U()
Default constructor: assigns a unique identifier to the object (object_id_) and registers the object ...
Definition Objet_U.cpp:54
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
@ REQUIRED
Definition Param.h:115
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
Base class for all post-processing objects.
class Postraitement. The class holds -a list of generic fields champs_post_complet_ containing
class Probleme_base It is a Probleme_U that is not a coupling.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void creer_champ(const Motcle &motlu) override
const Champ_base & get_champ(const Motcle &nom) const override
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
Base class for output streams.
Definition Sortie.h:52
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133