Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Hdf5VariableInfoBase.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Hdf5ItemVariableInfo.cc (C) 2000-2023 */
9/* */
10/* Lecture de variables au format HDF5. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ITraceMng.h"
15#include "arcane/utils/StringBuilder.h"
16#include "arcane/utils/HashTableMap.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/NotSupportedException.h"
19#include "arcane/utils/ArgumentException.h"
20
21#include "arcane/hdf5/Hdf5VariableInfoBase.h"
22
23#include "arcane/core/MeshVariable.h"
24#include "arcane/core/IItemFamily.h"
25#include "arcane/core/IMesh.h"
26#include "arcane/core/IMeshSubMeshTransition.h"
27#include "arcane/core/IVariable.h"
28#include "arcane/core/IVariableMng.h"
29#include "arcane/core/IParallelMng.h"
30
31#include <typeinfo>
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arcane
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42template<typename VariableType,typename DataType>
45{
46 public:
48 public:
49 VariableType& trueVariable() { return m_variable; }
50 virtual IVariable* variable() const { return m_variable.variable(); }
51 public:
52 virtual void readVariable(Hdf5Utils::HFile& hfile,const String& filename,
55
56 private:
57 void _readStandardArray(Array<DataType>& buffer,Array<Int64>& unique_ids,const String& ids_hpath,
59 void _writeStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st);
60 private:
61 VariableType m_variable;
62};
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67template<typename VariableType,typename DataType>
70{
71 public:
73 public:
74 VariableType& trueVariable() { return m_variable; }
75 virtual IVariable* variable() const { return m_variable.variable(); }
76 public:
77 virtual void readVariable(Hdf5Utils::HFile& hfile,const String& filename,
79 IData* data);
80 virtual void writeVariable(Hdf5Utils::HFile& hfile,Hdf5Utils::StandardTypes& st);
81
82 private:
83 void _readStandardArray(Array<DataType>& buffer,
85 void _writeStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st);
86 private:
87 VariableType m_variable;
88};
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
93Hdf5VariableInfoBase* Hdf5VariableInfoBase::
94create(IMesh* mesh,const String& name,const String& family_name)
95{
96 IItemFamily* family = mesh->findItemFamily(family_name,true);
97 IVariable* var = family->findVariable(name,true);
98 return Hdf5VariableInfoBase::create(var);
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
103
104Hdf5VariableInfoBase* Hdf5VariableInfoBase::
105create(IVariable* var)
106{
107 _checkValidVariable(var);
109 IItemFamily* item_family = var->itemFamily();
110 if (item_family){
111 IMesh* mesh = item_family->mesh();
112 if (var->isPartial()){
113 switch(var->dataType()){
114 case DT_Real:
116 break;
117 case DT_Real2:
119 break;
120 case DT_Real2x2:
122 break;
123 case DT_Real3:
125 break;
126 case DT_Real3x3:
128 break;
129 case DT_Byte:
131 break;
132 case DT_Int32:
134 break;
135 case DT_Int64:
137 break;
138 default:
139 throw FatalErrorException(A_FUNCINFO,"Bad variable type");
140 break;
141 }
142 }
143 else{
144 switch(var->dataType()){
145 case DT_Real:
147 break;
148 case DT_Real2:
150 break;
151 case DT_Real2x2:
153 break;
154 case DT_Real3:
156 break;
157 case DT_Real3x3:
159 break;
160 case DT_Byte:
162 break;
163 case DT_Int32:
165 break;
166 case DT_Int64:
168 break;
169 default:
170 throw FatalErrorException(A_FUNCINFO,"Bad variable type");
171 break;
172 }
173 }
174 }
175 else{
176 if (var->dimension()==0){
177 switch(var->dataType()){
178 case DT_Real:
180 break;
181 case DT_Real2:
183 break;
184 case DT_Real2x2:
186 break;
187 case DT_Real3:
189 break;
190 case DT_Real3x3:
192 break;
193 case DT_Byte:
195 break;
196 case DT_Int32:
198 break;
199 case DT_Int64:
201 break;
202 default:
203 throw FatalErrorException(A_FUNCINFO,"Bad variable type");
204 break;
205 }
206 }
207 }
208 if (!var_info)
209 throw NotSupportedException(A_FUNCINFO,
210 String::format("IData for variable '{0}'",var->fullName()));
211 return var_info;
212}
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
217void Hdf5VariableInfoBase::
218_checkValidVariable(IVariable* var)
219{
220 IItemFamily* item_family = var->itemFamily();
221 if (item_family){
222 if (var->dimension()==1)
223 return;
224 }
225 else{
226 if (var->dimension()==0)
227 return;
228 }
229
230 ARCANE_FATAL("Bad variable '{0}'. Variable has to be an item variable and have dimension"
231 "'1' or be a scalar variable",var->fullName());
232}
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
239 const String& hdf_path,Integer save_type)
240{
241 IVariable* var = variable();
242 ItemGroup group = var->itemGroup();
243 IParallelMng* pm = group.mesh()->parallelMng();
244 ItemGroup enumerate_group = group.own();
245 Integer nb_item = enumerate_group.size();
246 ITraceMng* tm = pm->traceMng();
247
248 // Pour l'instant la méthode parallèle créé un tampon
249 // du nombre total d'éléments du tableau
252 {
253 Integer index = 0;
255 unique_ids[index] = (*iitem).uniqueId();
256 ++index;
257 }
258 }
259
260 if (save_type & SAVE_IDS){
262 ids_writer.parallelWrite(pm,st,unique_ids,unique_ids);
263 }
264
265 // Pour l'instant, on ne peut sauver que des tableaux 2D dont le nombre
266 // d'éléments dans la 2ème dimension est identique. Cela pose problème
267 // si toutes les entités n'ont pas le même nombre de noeuds. Pour
268 // éviter ce problème, on calcule le nombre max de noeud possible et on
269 // utilise cette valeur. Pour les entités qui ont moins de noeuds, on
270 // ajoute comme coordonnées des NaN. Cela n'est pas optimum notamment
271 // si une seule entité a beaucoup plus de noeuds que les autres mais
272 // cela fonctionne dans tous les cas.
273 if (save_type & SAVE_COORDS){
274 IMesh* mesh = enumerate_group.mesh();
275 VariableNodeReal3& nodes_coords(mesh->toPrimaryMesh()->nodesCoordinates());
276 eItemKind item_kind = enumerate_group.itemKind();
277 if (item_kind==IK_Edge || item_kind==IK_Face || item_kind==IK_Cell){
278 Integer index = 0;
279 Real3UniqueArray coords;
281 Integer max_nb_node = 0;
282 const Real nan_value = std::numeric_limits<Real>::quiet_NaN();
284 {
285 ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
286 ItemWithNodes item = (*iitem).toItemWithNodes();
287 Integer nb_node = item.nbNode();
290 }
291 max_nb_node = pm->reduce(Parallel::ReduceMax,max_nb_node);
292 }
294 ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
295 ItemWithNodes item = (*iitem).toItemWithNodes();
296 Integer nb_node = item.nbNode();
298 for( NodeLocalId inode : item.nodeIds() ){
299 coords.add(nodes_coords[inode]);
301 }
303 // Ajoute des NaN pour les coordonnées restantes
304 for( Integer k=nb_node; k<max_nb_node; ++k )
305 coords.add(real3_nan);
306 centers.add(item_center);
307 items_type[index] = item.typeInfo()->typeId();
308 ++index;
309 }
311 coords_writer.parallelWrite(pm,st,coords,unique_ids);
313 centers_writer.parallelWrite(pm,st,centers,unique_ids);
315 types_writer.parallelWrite(pm,st,items_type,unique_ids);
316 }
317 else if (item_kind==IK_Node){
318 Real3UniqueArray coords;
320 coords.add(nodes_coords[iitem]);
321 }
323 coords_writer.parallelWrite(pm,st,coords,unique_ids);
324 }
325 else
326 tm->pwarning() << "Can not save coordinates for family name="
327 << enumerate_group.itemFamily()->name();
328 }
329
330}
331
332/*---------------------------------------------------------------------------*/
333/*---------------------------------------------------------------------------*/
334
335void Hdf5VariableInfoBase::
338{
339 IVariable* var = variable();
340 ItemGroup group = var->itemGroup();
341 IParallelMng* pm = group.mesh()->parallelMng();
343 ITraceMng* tm = pm->traceMng();
344 bool is_master = pm->isMasterIO();
345
346 // Lit les unique ids sauvegardés
350 Integer nb_old_item = 0;
351 if (is_master){
352 ids_reader.readDim();
354 tm->info() << "NB_OLD_ITEM nb=" << nb_old_item;
356 dummy_uids.resize(nb_old_item);
357 }
358 ids_reader.parallelRead(pm,st,saved_unique_ids,dummy_uids);
359
360 Real3UniqueArray saved_centers(nb_old_item);
361 Hdf5Utils::StandardArrayT<Real3> centers_reader(hfile.id(),hdf_path+"_Center");
362 if (is_master)
363 centers_reader.readDim();
364 centers_reader.parallelRead(pm,st,saved_centers,dummy_uids);
365 tm->info() << "READ SAVED CENTERS nb=" << saved_centers.size();
366
367 uids.copy(saved_unique_ids);
368 centers.copy(saved_centers);
369}
370
371/*---------------------------------------------------------------------------*/
372/*---------------------------------------------------------------------------*/
373
374/*---------------------------------------------------------------------------*/
375/*---------------------------------------------------------------------------*/
376
377template<typename VariableType,typename DataType>
378Hdf5ItemVariableInfo<VariableType,DataType>::
379Hdf5ItemVariableInfo(IMesh* mesh,IVariable* v)
380: Hdf5VariableInfoBase()
381, m_variable(v)
382{
383 ARCANE_UNUSED(mesh);
384}
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
388
389template<typename VariableType,typename DataType> void
390Hdf5ItemVariableInfo<VariableType,DataType>::
391readVariable(Hdf5Utils::HFile& hfile,const String& filename,
392 Hdf5Utils::StandardTypes& st,const String& ids_hpath,IData* var_data)
393{
394 ARCANE_UNUSED(ids_hpath);
395
396 if (!var_data)
397 var_data = variable()->data();
398 if (!var_data)
399 throw ArgumentException(A_FUNCINFO,"Null var_data");
400 UniqueArray<DataType> buffer;
401 IArrayDataT<DataType>* data_array = dynamic_cast<IArrayDataT<DataType>*>(var_data);
402 if (!data_array){
403 const char* n = typeid(var_data).name();
404 throw FatalErrorException(A_FUNCINFO,String::format("Bad type for IData '{0}'",n));
405 }
406 ArrayView<DataType> var_value = data_array->view();
407 IVariable* var = m_variable.variable();
408 IVariableMng* vm = var->variableMng();
409 ITraceMng* tm = vm->traceMng();
410 IParallelMng* pm = vm->parallelMng();
411 bool is_master = pm->isMasterIO();
412 //Integer master_rank = pm->masterIORank();
413 if (is_master){
414 if (hfile.id()<0)
415 hfile.openRead(filename);
416 }
417
418 Int64UniqueArray unique_ids;
419 _readStandardArray(buffer,unique_ids,ids_hpath,hfile.id(),st);
420
421 Integer buf_size = buffer.size();
422 //ArrayView<DataType> var_value = m_variable.asArray();
423 Integer nb_var_value = var_value.size();
424 if (var->isPartial()){
425 // Dans le cas d'une variables partielle, il faut d'abord
426 // mettre dans une table de hashage la valeur pour chaque uid,
427 // puis parcourir le groupe de la variable et remplir
428 // la valeur pour chaque uid.
429 HashTableMapT<Int64,DataType> values_from_uid(buf_size,true);
430 for( Integer z=0; z<buf_size; ++z ){
431 values_from_uid.add(unique_ids[z],buffer[z]);
432 }
433 ItemGroup var_group = m_variable.itemGroup();
434 ENUMERATE_ITEM(iitem,var_group){
435 Item item = *iitem;
436 Int64 uid = item.uniqueId();
437 if (m_correspondance_functor){
438 uid = m_correspondance_functor->getOldUniqueId(uid,iitem.index());
439 }
440 typename HashTableMapT<Int64,DataType>::Data* data = values_from_uid.lookup(uid);
441 if (!data)
442 throw FatalErrorException(A_FUNCINFO,
443 String::format("Can not find item uid='{0}' reading variable '{1}'",
444 uid,var->fullName()));
445 DataType value = data->value();
446 var_value[iitem.index()] = value;
447 }
448 }
449 else{
450 Int32UniqueArray local_ids(buf_size);
451 var->itemFamily()->itemsUniqueIdToLocalId(local_ids,unique_ids,false);
452 for( Integer z=0; z<buf_size; ++z ){
453 Integer lid = local_ids[z];
454 if (lid==NULL_ITEM_LOCAL_ID)
455 continue;
456 if (lid>nb_var_value)
457 throw FatalErrorException(A_FUNCINFO,String::format("Bad item index '{0}' max={1}",lid,nb_var_value));
458 var_value[lid] = buffer[z];
459 }
460 }
461 tm->info(4) << "End of read for variable '" << var->fullName() << "'";
462}
463
464/*---------------------------------------------------------------------------*/
465/*---------------------------------------------------------------------------*/
466
467template<typename VariableType,typename DataType> void
468Hdf5ItemVariableInfo<VariableType,DataType>::
469_readStandardArray(Array<DataType>& buffer,Int64Array& unique_ids,
470 const String& ids_hpath,hid_t file_id,
471 Hdf5Utils::StandardTypes& st)
472{
473 ARCANE_UNUSED(ids_hpath);
474
475 IVariable* var = m_variable.variable();
476 IVariableMng* vm = var->variableMng();
477 ITraceMng* tm = vm->traceMng();
478 IParallelMng* pm = vm->parallelMng();
479 bool is_master = pm->isMasterIO();
480
481 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
482
483 if (is_master){
484 if (!ids_hpath.null())
485 values.setIdsPath(ids_hpath);
486 values.readDim();
487 Int64ConstArrayView dims(values.dimensions());
488 Integer nb_dim = dims.size();
489 if (nb_dim!=1)
490 tm->fatal() << "Only one-dimension array are allowed "
491 << " dim=" << nb_dim << " var_name=" << var->fullName() << " path=" << path();
492 Integer nb_item = arcaneCheckArraySize(dims[0]);
493 tm->info(4) << "NB_ITEM: nb_item=" << nb_item;
494 buffer.resize(nb_item);
495 unique_ids.resize(nb_item);
496 }
497 values.parallelRead(pm,st,buffer,unique_ids);
498#if 0
499 {
500 Integer index=0;
501 Integer nb_item = buffer.size();
502 for( Integer i=0; i<nb_item; ++i ){
503 ++index;
504 tm->info() << " VAR_VAL i=" << i << " value=" << buffer[i] << " uid=" << unique_ids[i];
505 if (index>20)
506 break;
507 }
508 }
509#endif
510}
511
512/*---------------------------------------------------------------------------*/
513/*---------------------------------------------------------------------------*/
514
515template<typename VariableType,typename DataType> void
516Hdf5ItemVariableInfo<VariableType,DataType>::
517_writeStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st)
518{
519 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
520 //ITraceMng* tm = m_mesh->traceMng();
521 //tm->info() << "WRITE STANDARD ARRAY N=" << buffer.size();
522 values.write(st,buffer);
523}
524
525/*---------------------------------------------------------------------------*/
526/*---------------------------------------------------------------------------*/
527
528template<typename VariableType,typename DataType> void
531{
532 IVariable* var = m_variable.variable();
533 IVariableMng* vm = var->variableMng();
534 IParallelMng* pm = vm->parallelMng();
535 ITraceMng* tm = vm->traceMng();
536
537 ItemGroup group = m_variable.itemGroup();
538 ItemGroup enumerate_group = group.own();
539 if (var->isPartial())
540 enumerate_group = group;
541
542 Integer nb_item = enumerate_group.size();
543
546 tm->info(4) << "WRITE VARIABLE name=" << m_variable.name()
547 << " is_partial=" << m_variable.variable()->isPartial();
548
549 {
550 Integer index = 0;
552 if (iitem->isOwn()){
553 values[index] = m_variable[iitem];
554 unique_ids[index] = iitem->uniqueId();
555 //tm->info() << "WRITE uid=" << iitem->uniqueId()
556 // << " value=" << m_variable[iitem];
557 ++index;
558 }
559 }
560 values.resize(index);
561 unique_ids.resize(index);
562 }
563 // Pour l'instant la méthode parallèle créé un tampon
564 // du nombre total d'éléments du tableau
566 {
568 values_writer.parallelWrite(pm,st,values,unique_ids);
569 }
570}
571
572/*---------------------------------------------------------------------------*/
573/*---------------------------------------------------------------------------*/
574
575/*---------------------------------------------------------------------------*/
576/*---------------------------------------------------------------------------*/
577
578template<typename VariableType,typename DataType>
582, m_variable(v)
583{
584}
585
586/*---------------------------------------------------------------------------*/
587/*---------------------------------------------------------------------------*/
588
589template<typename VariableType,typename DataType> void
590Hdf5ScalarVariableInfo<VariableType,DataType>::
591readVariable(Hdf5Utils::HFile& hfile,const String& filename,
592 Hdf5Utils::StandardTypes& st,const String& ids_hpath,IData* data)
593{
594 ARCANE_UNUSED(ids_hpath);
595
596 UniqueArray<DataType> buffer;
597 IVariable* var = m_variable.variable();
598 IVariableMng* vm = var->variableMng();
599 ITraceMng* tm = vm->traceMng();
600 IParallelMng* pm = vm->parallelMng();
601 bool is_master = pm->isMasterIO();
602 //Integer master_rank = pm->masterIORank();
603 if (is_master){
604 if (hfile.id()<0)
605 hfile.openRead(filename);
606 }
607
608 Int64UniqueArray unique_ids;
609 _readStandardArray(buffer,hfile.id(),st);
610
611 Integer buf_size = buffer.size();
612 if (!data)
613 data = m_variable.variable()->data();
614 IArrayDataT<DataType>* true_data = dynamic_cast<IArrayDataT<DataType>*>(data);
615 if (!true_data)
616 throw FatalErrorException("Can not convert IData to IArrayDataT");
617 ArrayView<DataType> var_value = m_variable.asArray();
618 for( Integer z=0; z<buf_size; ++z )
619 var_value[z] = buffer[z];
620 tm->info(4) << "End of read for variable '" << var->fullName() << "'";
621}
622
623/*---------------------------------------------------------------------------*/
624/*---------------------------------------------------------------------------*/
625
626template<typename VariableType,typename DataType> void
627Hdf5ScalarVariableInfo<VariableType,DataType>::
628_readStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st)
629{
630 IVariable* var = m_variable.variable();
631 IVariableMng* vm = var->variableMng();
632 ITraceMng* tm = vm->traceMng();
633 IParallelMng* pm = vm->parallelMng();
634 bool is_master = pm->isMasterIO();
635
636 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
637
638 if (is_master){
639 values.readDim();
640 Int64ConstArrayView dims(values.dimensions());
641 Integer nb_dim = dims.size();
642 if (nb_dim!=1)
643 tm->fatal() << "Only one-dimension array are allowed "
644 << " dim=" << nb_dim << " var_name=" << var->fullName() << " path=" << path();
645 Integer nb_item = arcaneCheckArraySize(dims[0]);
646 tm->info(4) << "NB_ITEM: nb_item=" << nb_item;
647 buffer.resize(nb_item);
648 }
649 values.read(st,buffer);
650#if 0
651 {
652 Integer index=0;
653 Integer nb_item = buffer.size();
654 for( Integer i=0; i<nb_item; ++i ){
655 ++index;
656 tm->info() << " VAR_VAL i=" << i << " value=" << buffer[i];
657 if (index>20)
658 break;
659 }
660 }
661#endif
662}
663
664/*---------------------------------------------------------------------------*/
665/*---------------------------------------------------------------------------*/
666
667template<typename VariableType,typename DataType> void
668Hdf5ScalarVariableInfo<VariableType,DataType>::
669_writeStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st)
670{
671 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
672 values.write(st,buffer);
673}
674
675/*---------------------------------------------------------------------------*/
676/*---------------------------------------------------------------------------*/
677
678template<typename VariableType,typename DataType> void
679Hdf5ScalarVariableInfo<VariableType,DataType>::
680writeVariable(Hdf5Utils::HFile& hfile,Hdf5Utils::StandardTypes& st)
681{
682 IVariable* var = m_variable.variable();
683 IVariableMng* vm = var->variableMng();
684 IParallelMng* pm = vm->parallelMng();
685 ITraceMng* tm = vm->traceMng();
686 bool is_master = pm->isMasterIO();
687
688 ConstArrayView<DataType> var_values = m_variable.asArray();
689 Integer size = var_values.size();
690 UniqueArray<DataType> values(size);
691 for( Integer i=0; i<size; ++i )
692 values[i] = var_values[i];
693
694 // Comme il s'agit d'une variable scalaire, on considère que tous
695 // les processeurs ont la même valeur. Donc seul le processeur
696 // maitre écrit.
697 if (is_master){
698 //{
699 Int64UniqueArray unique_ids;
700 Hdf5Utils::StandardArrayT<DataType> values_writer(hfile.id(),path());
701 tm->info(4) << "WRITE SCALAR VARIABLE name=" << m_variable.variable()->fullName();
702 values_writer.write(st,values);
703 //values_writer.parallelWrite(pm,st,values,unique_ids);
704 }
705}
706
707/*---------------------------------------------------------------------------*/
708/*---------------------------------------------------------------------------*/
709
710} // End namespace Arcane
711
712/*---------------------------------------------------------------------------*/
713/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
#define ENUMERATE_NODE(name, group)
Enumérateur générique d'un groupe de noeuds.
Tableau d'items de types quelconques.
virtual void writeVariable(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st)
Encapsule un hid_t pour un fichier.
Encapsule un dataset simple d'un fichier HDF5 qui représente un tableau.
Définition des types standards Arcane pour hdf5.
Classe de base pour lire ou écrire une variables.
void writeGroup(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st, const String &hdf_path, Integer save_type)
Interface d'une donnée.
Definition IData.h:33
Interface d'une famille d'entités.
virtual IVariable * findVariable(const String &name, bool throw_exception=false)=0
Recherche la variable de nom name associée à cette famille.
virtual IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed=false, bool register_modifier_if_created=false)=0
Retourne la famille de nom name.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IPrimaryMesh * toPrimaryMesh()=0
Retourne l'instance sous la forme d'un IPrimaryMesh.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface du gestionnaire de variables.
Interface d'une variable.
Definition IVariable.h:54
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual Integer dimension() const =0
Dimension de la variable.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variable associé à la variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:126
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Definition ItemGroup.cc:189
Int16 typeId() const
Numéro du type.
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Definition Item.h:714
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:765
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
Definition Item.h:774
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
Definition Item.h:377
ItemWithNodes toItemWithNodes() const
Converti l'entité en le genre ItemWithNodes.
Definition Item.h:1626
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Exception lorsqu'une erreur fatale est survenue.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
TraceMessage pwarning() const
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:325
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:513
UniqueArray< Real3 > Real3UniqueArray
Tableau dynamique à une dimension de vecteurs de rang 3.
Definition UtilsTypes.h:529
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:515
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
@ DT_Real2x2
Donnée de type tenseur 3x3.
Definition DataTypes.h:48
@ DT_Real3x3
Donnée de type tenseur 3x3.
Definition DataTypes.h:49
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43
@ DT_Real3
Donnée de type vecteur 3.
Definition DataTypes.h:47
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
@ DT_Real2
Donnée de type vecteur 2.
Definition DataTypes.h:46
@ DT_Real
Donnée de type réel.
Definition DataTypes.h:41
@ DT_Byte
Donnée de type octet.
Definition DataTypes.h:40
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:638
Int32 Integer
Type représentant un entier.