14#include "arcane/utils/ArcanePrecomp.h"
16#include "arcane/utils/Iostream.h"
17#include "arcane/utils/StdHeader.h"
18#include "arcane/utils/HashTableMap.h"
19#include "arcane/utils/ValueConvert.h"
20#include "arcane/utils/ScopedPtr.h"
21#include "arcane/utils/ITraceMng.h"
22#include "arcane/utils/String.h"
23#include "arcane/utils/IOException.h"
24#include "arcane/utils/Collection.h"
25#include "arcane/utils/Enumerator.h"
27#include "arcane/utils/Real3.h"
29#include "arcane/FactoryService.h"
30#include "arcane/IMeshReader.h"
31#include "arcane/ISubDomain.h"
32#include "arcane/IMeshSubMeshTransition.h"
33#include "arcane/IItemFamily.h"
34#include "arcane/Item.h"
35#include "arcane/ItemEnumerator.h"
36#include "arcane/VariableTypes.h"
37#include "arcane/IVariableAccessor.h"
38#include "arcane/IParallelMng.h"
39#include "arcane/IIOMng.h"
40#include "arcane/IMeshUtilities.h"
41#include "arcane/IMeshWriter.h"
42#include "arcane/BasicService.h"
43#include "arcane/XmlNode.h"
94 virtual bool hasCutInfos()
const {
return false; }
95 virtual ConstArrayView<Integer> communicatingSubDomains()
const {
return ConstArrayView<Integer>(); }
99 bool _readMesh(IPrimaryMesh* mesh,
const String& file_name,
const String& dir_name,
bool use_internal_partition);
100 bool _readHybridGrid(IPrimaryMesh* mesh,VoronoiFile& voronoi_file,
bool use_internal_partition);
101 void _readCellVariable(IMesh* mesh,VoronoiFile& voronoi_file,
const String& name_str,Integer nb_cell);
102 void _readItemGroup(IMesh* mesh,VoronoiFile& voronoi_file,
const String& name_str,Integer nb_item,
103 eItemKind ik,ConstArrayView<Integer> local_ids);
104 void _createFaceGroup(IMesh* mesh,
const String& name,ConstArrayView<Integer> faces_lid);
105 bool _readData(IMesh* mesh,VoronoiFile& voronoi_file,
bool use_internal_partition,eItemKind cell_kind,
106 ConstArrayView<Integer> local_ids);
107 void _readNodesHybridGrid(IMesh* mesh,VoronoiFile& voronoi_file,Array<Real3>& node_coords);
108 void _readCellsHybridGrid(IMesh* mesh,VoronoiFile& voronoi_file,
109 Array<Integer>& cells_nb_node,
110 Array<Integer>& cells_type,
111 Array<Int64>& cells_connectivity,
112 Integer& mesh_dimension);
113 void _readFacesMesh(IMesh* mesh,
const String& file_name,
114 const String& dir_name,
bool use_internal_partition);
127 static const int BUFSIZE = 10000;
129 VoronoiFile(std::istream* stream) : m_stream(stream) {}
130 const char* getNextLine();
132 Integer getInteger();
133 bool isEnd(){ (*m_stream) >> ws;
return m_stream->eof(); }
135 std::istream* m_stream;
142const char* VoronoiFile::
145 while (m_stream->good()){
146 m_stream->getline(m_buf,
sizeof(m_buf)-1);
150 if (m_buf[0]==
'\n' || m_buf[0]==
'\r')
153 for(
int i=0; i<BUFSIZE && m_buf[i]!=
'\0'; ++i ){
162 for(
int i=0; i<BUFSIZE && m_buf[i]!=
'\0'; ++i ){
164 if (m_buf[i]==
'\n' || m_buf[i]==
'\r'){
172 throw IOException(
"VoronoiFile::getNexLine()",
"Unexpected EndOfFile");
182 (*m_stream) >> ws >> v;
183 if (m_stream->good())
185 throw IOException(
"VoronoiFile::getReal()",
"Bad Real");
195 (*m_stream) >> ws >> v;
196 if (m_stream->good())
198 throw IOException(
"VoronoiFile::getInteger()",
"Bad Integer");
209VoronoiMeshIOService::
210VoronoiMeshIOService(
const ServiceBuildInfo& sbi)
218VoronoiMeshIOService::
219~VoronoiMeshIOService()
222 for(Integer i=0;i<size;++i)
252bool VoronoiMeshIOService::
263 VoronoiFile voronoi_file(&ifile);
270 ret = _readHybridGrid(mesh,voronoi_file,use_internal_partition);
289 const char* func_name =
"VoronoiMeshIOService::_readNodesHybridGrid()";
291 std::istringstream
iline(buf);
297 throw IOException(func_name,
"Syntax error while reading number of nodes");
308 for( Integer i=0; i<
nb_node; ++i ){
333 const char* func_name =
"VoronoiMeshIOService::_readCellsHybridGrid()";
335 std::istringstream
iline(buf);
338 Integer nb_cell_node = 0;
341 throw IOException(func_name,
"Syntax error while reading cells");
342 if (
nb_cell<0 || nb_cell_node<0){
343 throw IOException(func_name,String::format(
"Invalid dimensions: nb_cell={0} nb_cell_node={1}",
nb_cell,nb_cell_node));
353 cells_connectivity.resize(nb_cell_node);
356 for( Integer i=0; i<
nb_cell; ++i ){
367 cells_nb_node[i] = n;
368 for( Integer
j=0;
j<n; ++
j ){
381bool VoronoiMeshIOService::
387 Integer nb_cell_node = 0;
388 Integer
sid = subDomain()->subDomainId();
409 nb_cell = cells_nb_node.size();
410 nb_cell_node = cells_connectivity.size();
422 for( Integer i=0; i<
nb_cell; ++i ){
437 cells_infos_index += current_cell_nb_node;
438 connectivity_index += current_cell_nb_node;
444 Integer dimension = subDomain()->parallelMng()->reduce(Parallel::ReduceMax,mesh_dimension);
454 Int32 node_uid = node.uniqueId().asInt32();
455 nodes_coord_var[inode] = node_coords[node_uid];
460 bool r = _readData(mesh,voronoi_file,use_internal_partition,
IK_Cell,cells_local_id);
471bool VoronoiMeshIOService::
472_readData(IMesh* mesh,VoronoiFile& voronoi_file,
bool use_internal_partition,
473 eItemKind cell_kind,ConstArrayView<Integer> local_ids)
475 ARCANE_UNUSED(use_internal_partition);
476 ARCANE_UNUSED(local_ids);
480 Integer sid = subDomain()->subDomainId();
481 Integer nb_cell_kind = mesh->nbItem(cell_kind);
483 _readCellVariable(mesh,voronoi_file,
"CellCenter",nb_cell_kind);
497void VoronoiMeshIOService::
498_readCellVariable(IMesh* mesh,VoronoiFile& voronoi_file,
const String& var_name,Integer nb_cell)
502 info() <<
"Reading values for variable: " << var_name <<
" n=" << nb_cell;
506 for( Integer i=0; i<nb_cell; ++i ){
507 cx = voronoi_file.getReal();
508 cy = voronoi_file.getReal();
509 cz = voronoi_file.getReal();
510 values[i] = Real3(cx,cy,cz);
512 info() <<
"Variable build done: " << voronoi_file.isEnd();
518void VoronoiMeshIOService::
519_readItemGroup(IMesh* mesh,VoronoiFile& voronoi_file,
const String& name,Integer nb_item,
520 eItemKind ik,ConstArrayView<Integer> local_ids)
522 IItemFamily* item_family = mesh->itemFamily(ik);
523 info() <<
"Reading group inf for group: " << name;
526 for( Integer i=0; i<nb_item; ++i ){
527 Integer v = voronoi_file.getInteger();
529 ids.add(local_ids[i]);
531 info() <<
"Building group: " << name <<
" nb_element=" << ids.size();
533 item_family->createGroup(name,ids);
#define ARCANE_REGISTER_SUB_DOMAIN_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Classe de base de service lié à un sous-domaine.
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
Interface du service gérant la lecture d'un maillage.
eReturnType
Types des codes de retour d'une lecture ou écriture.
@ RTError
Erreur lors de l'opération.
@ RTOk
Opération effectuée avec succès.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
Exception lorsqu'une erreur d'entrée/sortie est détectée.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual void allocateCells(Integer nb_cell, Int64ConstArrayView cells_infos, bool one_alloc=true)=0
Allocation d'un maillage.
virtual void endAllocate()=0
Indique une fin d'allocation de mailles.
virtual void setDimension(Integer dim)=0
Positionne la dimension du maillage (1D, 2D ou 3D).
Infos sur un type d'entité du maillage.
Integer nbLocalEdge() const
Nombre d'arêtes de l'entité
Integer nbLocalNode() const
Nombre de noeuds de l'entité
Integer nbLocalFace() const
Nombre de faces de l'entité
Gestionnaire des types d'entités de maillage.
static Integer nbBasicItemType()
nombre de types disponibles
static Integer nbBuiltInItemType()
nombre de types intégrés (hors types additionnels)
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Classe gérant un vecteur de réel de dimension 3.
Structure contenant les informations pour créer un service.
Lecteur des fichiers de maillage au format Voronoi interne IFP.
virtual void build()
Construction de niveau build du service.
UniqueArray< VariableCellReal3 * > m_variables
Table des variables crées localement par lecture du maillage.
virtual eReturnType readMeshFromFile(IPrimaryMesh *mesh, const XmlNode &mesh_node, const String &file_name, const String &dir_name, bool use_internal_partition)
void _readCellsHybridGrid(IMesh *mesh, VoronoiFile &voronoi_file, Array< Integer > &cells_nb_node, Array< Integer > &cells_type, Array< Int64 > &cells_connectivity, Integer &mesh_dimension)
Lecture des mailles et de leur connectivité.
void _readNodesHybridGrid(IMesh *mesh, VoronoiFile &voronoi_file, Array< Real3 > &node_coords)
Lecture des noeuds et de leur coordonnées.
virtual bool allowExtension(const String &str)
Vérifie si le service supporte les fichiers avec l'extension str.
Chaîne de caractères unicode.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
MeshVariableScalarRefT< Cell, Real3 > VariableCellReal3
Grandeur au centre des mailles de type coordonnées.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
ArrayView< Real3 > Real3ArrayView
Equivalent C d'un tableau à une dimension de Real3.
eItemKind
Genre d'entité de maillage.
@ IK_Cell
Entité de maillage de genre maille.
UniqueArray< Integer > IntegerUniqueArray
Tableau dynamique à une dimension d'entiers.
Int32 Integer
Type représentant un entier.