14#include "arcane/utils/ITraceMng.h"
15#include "arcane/utils/SmallArray.h"
16#include "arcane/utils/FixedArray.h"
17#include "arcane/utils/Convert.h"
19#include "arcane/core/IMeshReader.h"
20#include "arcane/core/BasicService.h"
22#include "arcane/core/IPrimaryMesh.h"
23#include "arcane/core/IItemFamily.h"
24#include "arcane/core/ICaseMeshReader.h"
25#include "arcane/core/IMeshBuilder.h"
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/MeshPartInfo.h"
28#include "arcane/core/NodesOfItemReorderer.h"
30#include "arcane/core/ItemPrinter.h"
61 class MEDToArcaneItemInfo
65 MEDToArcaneItemInfo(
int dimension,
int nb_node, med_int med_type,
67 : m_dimension(dimension)
69 , m_med_type(med_type)
70 , m_arcane_type(arcane_type)
71 , m_indirection(indirection)
76 int dimension()
const {
return m_dimension; }
77 int nbNode()
const {
return m_nb_node; }
78 med_int medType()
const {
return m_med_type; }
79 Int16 arcaneType()
const {
return m_arcane_type; }
80 const Int32* indirection()
const {
return m_indirection; }
86 med_int m_med_type = {};
88 const Int32* m_indirection =
nullptr;
96 explicit MEDFamilyInfo(
Int32 family_id)
120 explicit MEDGroupInfo(
Int32 index)
141 _initMEDToArcaneTypes();
158 explicit AutoCloseMED(med_idt
id)
187 void _initMEDToArcaneTypes();
188 void _addTypeInfo(
int dimension,
int nb_node, med_int med_type,
ItemTypeId arcane_type)
190 _addTypeInfo(dimension, nb_node, med_type, arcane_type,
nullptr);
192 void _addTypeInfo(
int dimension,
int nb_node, med_int med_type,
ItemTypeId arcane_type,
193 const Int32* indirection)
195 MEDToArcaneItemInfo t(dimension, nb_node, med_type, arcane_type, indirection);
200 void _readAndCreateCells(IPrimaryMesh* mesh, Int32 mesh_dimension, med_idt fid,
const char* meshname);
201 void _readFaces(IPrimaryMesh* mesh, Int32 mesh_dimension, med_idt fid,
const char* meshname);
204 _readNodesCoordinates(IPrimaryMesh* mesh, Int64 nb_node, Int32 spacedim,
205 med_idt fid,
const char* meshname);
206 void _readFamilies(med_idt fid,
const char* meshname);
208 void _clearItemsInGroups()
211 g.m_unique_ids.clear();
212 g.m_local_ids.clear();
225 const Int32 Hexaedron8_indirection[] = { 1, 0, 3, 2, 5, 4, 7, 6 };
226 const Int32 Hexaedron20_indirection[] = { 1, 8, 10, 3, 9, 2, 0, 11, 5, 14, 18, 7, 6, 4, 16, 15, 13, 12, 17, 19 };
227 const Int32 Pyramid5_indirection[] = { 1, 0, 3, 2, 4 };
228 const Int32 Quad4_indirection[] = { 1, 0, 3, 2 };
229 const Int32 Quad8_indirection[] = { 1, 0, 3, 2, 4, 7, 6, 5 };
230 const Int32 Triangle3_indirection[] = { 1, 0, 2 };
232 const Int32 Tetraedron4_indirection[] = { 1, 0, 2, 3 };
239_initMEDToArcaneTypes()
246 _addTypeInfo(1, 2, MED_SEG2, ITI_Line2);
247 _addTypeInfo(1, 3, MED_SEG3, ITI_Line3);
248 _addTypeInfo(1, 4, MED_SEG4, ITI_NullType);
251 _addTypeInfo(2, 3, MED_TRIA3, ITI_Triangle3, Triangle3_indirection);
252 _addTypeInfo(2, 4, MED_QUAD4, ITI_Quad4, Quad4_indirection);
253 _addTypeInfo(2, 6, MED_TRIA6, ITI_NullType);
254 _addTypeInfo(2, 7, MED_TRIA7, ITI_NullType);
255 _addTypeInfo(2, 8, MED_QUAD8, ITI_Quad8, Quad8_indirection);
256 _addTypeInfo(2, 9, MED_QUAD9, ITI_NullType);
259 _addTypeInfo(3, 4, MED_TETRA4, ITI_Tetraedron4);
260 _addTypeInfo(3, 5, MED_PYRA5, ITI_Pyramid5, Pyramid5_indirection);
261 _addTypeInfo(3, 6, MED_PENTA6, ITI_Pentaedron6);
262 _addTypeInfo(3, 8, MED_HEXA8, ITI_Hexaedron8);
263 _addTypeInfo(3, 10, MED_TETRA10, ITI_Tetraedron10);
264 _addTypeInfo(3, 12, MED_OCTA12, ITI_Octaedron12);
265 _addTypeInfo(3, 13, MED_PYRA13, ITI_NullType);
266 _addTypeInfo(3, 15, MED_PENTA15, ITI_NullType);
267 _addTypeInfo(3, 18, MED_PENTA18, ITI_NullType);
268 _addTypeInfo(3, 20, MED_HEXA20, ITI_Hexaedron20);
269 _addTypeInfo(3, 27, MED_HEXA27, ITI_NullType);
277 _addTypeInfo(2, 0, MED_POLYGON, ITI_GenericPolygon);
278 _addTypeInfo(2, 0, MED_POLYGON2, ITI_NullType);
279 _addTypeInfo(3, 0, MED_POLYHEDRON, ITI_NullType);
293 info() <<
"Tentative de lecture du fichier MED nommé=" << file_name;
295 return _readMesh(mesh, file_name);
304 const med_idt fid = MEDfileOpen(filename.localstr(), MED_ACC_RDONLY);
306 MESSAGE(
"ERROR: can not open MED file ");
307 error() <<
"ERROR: can not open MED file '" << filename <<
"'";
313 int nb_mesh = MEDnMesh(fid);
315 error() <<
"Erreur lors de la lecture du nombre de maillages";
318 info() <<
"MED: nb_mesh=" << nb_mesh;
320 error() <<
"Aucun maillage n'est présent";
328 int nb_axis = MEDmeshnAxis(fid, mesh_index);
330 error() <<
"Impossible de lire le nombre d'axes (MEDmeshnAxis)";
333 info() <<
"MED: nb_axis=" << nb_axis;
335 UniqueArray<char> axisname(MED_SNAME_SIZE * nb_axis + 1,
'\0');
336 UniqueArray<char> unitname(MED_SNAME_SIZE * nb_axis + 1,
'\0');
338 char meshname[MED_NAME_SIZE + 1];
340 char meshdescription[MED_COMMENT_SIZE + 1];
341 meshdescription[0] =
'\0';
342 char dtunit[MED_SNAME_SIZE + 1];
344 med_int spacedim = 0;
346 med_mesh_type meshtype = MED_UNDEF_MESH_TYPE;
347 med_sorting_type sortingtype = MED_SORT_UNDEF;
349 med_axis_type axistype = MED_UNDEF_AXIS_TYPE;
351 err = MEDmeshInfo(fid, mesh_index, meshname, &spacedim, &meshdim, &meshtype, meshdescription,
352 dtunit, &sortingtype, &nstep, &axistype, axisname.data(), unitname.data());
354 error() <<
"Impossible de lire les informations du maillage (MEDmeshInfo) r=" << err;
357 if (meshtype != MED_UNSTRUCTURED_MESH) {
358 error() <<
"Arcane ne gère que les maillages non structurés MED (MED_UNSTRUCTURED_MESH) type=" << meshtype;
361 Integer mesh_dimension = meshdim;
362 if (mesh_dimension != 2 && mesh_dimension != 3)
363 ARCANE_FATAL(
"Le lecteur MED ne gère que les maillages 2D ou 3D");
365 info() <<
"MED: name=" << meshname;
366 info() <<
"MED: description=" << meshdescription;
367 info() <<
"MED: spacedim=" << spacedim;
368 info() <<
"MED: meshdim=" << meshdim;
369 info() <<
"MED: dtunit=" << dtunit;
370 info() <<
"MED: meshtype=" << meshtype;
371 info() <<
"MED: sortingtype=" << sortingtype;
372 info() <<
"MED: axistype=" << axistype;
373 info() <<
"MED: nstep=" << nstep;
378 med_bool coordinatechangement;
379 med_bool geotransformation;
382 med_int med_nb_node = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_NODE, MED_NO_GEOTYPE,
383 MED_COORDINATE, MED_NO_CMODE, &coordinatechangement,
385 if (med_nb_node < 0) {
386 error() <<
"Impossible de lire le nombre de nœuds (MEDmeshnEntity) err=" << med_nb_node;
389 nb_node = med_nb_node;
391 info() <<
"MED: nb_node=" << nb_node;
393 mesh->setDimension(mesh_dimension);
398 mesh->itemTypeMng()->buildPolygonTypes();
400 IParallelMng* pm = mesh->parallelMng();
401 bool is_parallel = pm->isParallel();
402 Int32 rank = mesh->meshPartInfo().partRank();
404 bool is_read_items = !(is_parallel && rank != 0);
407 _readFamilies(fid, meshname);
408 _readAndCreateCells(mesh, mesh_dimension, fid, meshname);
417 UniqueArray<String> cell_group_names;
418 IItemFamily* cell_family = mesh->cellFamily();
425 UniqueArray<Int32> cell_local_ids;
427 Int32 nb_cell_in_group = g.m_unique_ids.size();
428 cell_local_ids.resize(nb_cell_in_group);
429 cell_family->itemsUniqueIdToLocalId(cell_local_ids, g.m_unique_ids);
430 for (
const String& name : g.m_names) {
431 info() <<
"Group=" << name <<
" index=" << g.m_index <<
" nb_item=" << nb_cell_in_group;
432 CellGroup cell_group = cell_family->findGroup(name,
true);
433 cell_group.
addItems(cell_local_ids);
434 cell_group_names.add(name);
445 bool is_face_group_disabled =
false;
447 is_face_group_disabled = (v.value());
448 if (!is_face_group_disabled)
449 _readFaces(mesh, mesh_dimension, fid, meshname);
452 UniqueArray<String> face_group_names;
453 IItemFamily* face_family = mesh->faceFamily();
457 Int32 nb_face_in_group = g.m_local_ids.size();
458 info() <<
"Vérification du groupe index=" << g.m_index <<
" nb_item=" << nb_face_in_group;
459 if (nb_face_in_group == 0)
461 for (
const String& name : g.m_names) {
462 info() <<
"FaceGroup=" << name <<
" index=" << g.m_index <<
" nb_item=" << nb_face_in_group;
463 FaceGroup face_group = face_family->findGroup(name,
true);
465 face_group_names.add(name);
473 return _readNodesCoordinates(mesh, nb_node, spacedim, fid, meshname);
487 med_bool coordinatechangement;
488 med_bool geotransformation;
489 med_int nb_geo = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, MED_GEO_ALL,
490 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
493 ARCANE_FATAL(
"Impossible de lire le nombre d'entités géométriques nb_geo={0}", nb_geo);
494 info() <<
"MED: nb_geotype = " << nb_geo;
497 for (med_int it = 1; it <= nb_geo; it++) {
499 med_geometry_type geotype = MED_GEO_ALL;
503 med_int type_ret = MEDmeshEntityInfo(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, it,
504 geotype_name.data(), &geotype);
506 ARCANE_FATAL(
"Impossible de lire les informations pour le géotype index={0} ret={1}", it, type_ret);
508 med_int nb_item = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, geotype,
509 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
512 ARCANE_FATAL(
"Impossible de lire le nombre d'éléments pour le géotype={0} nom={1} ret={2}",
513 geotype, geotype_name.data(), nb_item);
514 info() <<
"MED: type=" << geotype <<
" '" << geotype_name.data() <<
"' nb_item=" << nb_item;
525 _clearItemsInGroups();
530 Int64 cell_unique_id = 0;
544 Int32 item_dimension = iinfo.dimension();
546 if (item_dimension != mesh_dimension)
548 Int32 nb_item =
_readItems(fid, meshname, iinfo, polygon_nb_nodes, med_connectivity, med_family_values);
551 Int16 arcane_type = iinfo.arcaneType();
552 Int32 nb_item_node = iinfo.nbNode();
553 Int32 nb_family_values = med_family_values.
size();
554 if (arcane_type == IT_NullType) {
556 ARCANE_FATAL(
"Le type MED '{0}' n'est pas pris en charge par Arcane", iinfo.medType());
558 Int64 cells_infos_index = 0;
559 Int64 med_connectivity_index = 0;
560 const bool is_polygon = (iinfo.medType() == MED_POLYGON);
562 UniqueArray<Int64> cells_infos;
564 cells_infos.resize(2 * nb_item + med_connectivity.
size());
566 cells_infos.resize((2 + nb_item_node) * nb_item);
568 info() <<
"CELL_INFOS size=" << cells_infos.size() <<
" nb_item=" << nb_item
569 <<
" type=" << arcane_type;
571 const Int32* indirection = iinfo.indirection();
572 for (Int32 i = 0; i < nb_item; ++i) {
573 Int64 current_cell_unique_id = cell_unique_id;
576 nb_item_node = polygon_nb_nodes[i];
577 arcane_type = itm->
getPolygonType(
static_cast<Int16
>(nb_item_node));
578 cells_infos[cells_infos_index] = arcane_type;
580 cells_infos[cells_infos_index] = current_cell_unique_id;
582 Span<Int64> cinfo_span(cells_infos.span().subspan(cells_infos_index, nb_item_node));
583 Span<med_int> med_cinfo_span(med_connectivity.
span().subspan(med_connectivity_index, nb_item_node));
584 for (
Integer k = 0; k < nb_item_node; ++k) {
585 cinfo_span[k] = med_cinfo_span[k];
589 cells_infos[cells_infos_index] = arcane_type;
592 cells_infos[cells_infos_index] = current_cell_unique_id;
594 Span<Int64> cinfo_span(cells_infos.span().subspan(cells_infos_index, nb_item_node));
595 Span<med_int> med_cinfo_span(med_connectivity.
span().subspan(med_connectivity_index, nb_item_node));
597 for (
Integer k = 0; k < nb_item_node; ++k) {
598 cinfo_span[k] = med_cinfo_span[indirection[k]];
602 for (
Integer k = 0; k < nb_item_node; ++k)
603 cinfo_span[k] = med_cinfo_span[k];
606 if (i < nb_family_values) {
608 med_int f = med_family_values[i];
611 ARCANE_FATAL(
"Impossible de trouver l'ID de famille '{0}' pour la maille '{1}' de géotype '{2}'",
612 f, i, iinfo.medType());
614 m_med_groups[x->second.m_index].m_unique_ids.add(current_cell_unique_id);
617 med_connectivity_index += nb_item_node;
618 cells_infos_index += nb_item_node;
637 _clearItemsInGroups();
653 Int32 item_dimension = iinfo.dimension();
655 if (item_dimension != (mesh_dimension - 1))
658 info() <<
"Lecture des faces géotype=" << geotype <<
" arcane_type=" << iinfo.arcaneType()
661 Int32 nb_item =
_readItems(fid, meshname, iinfo, polygon_nb_nodes, med_connectivity, med_family_values);
665 Int32 nb_item_node = iinfo.nbNode();
666 Int32 nb_family_values = med_family_values.
size();
667 if (arcane_type == IT_NullType) {
669 ARCANE_FATAL(
"Le type MED '{0}' n'est pas pris en charge par Arcane", iinfo.medType());
673 info() <<
"FACES_INFOS nb_item=" << nb_item <<
" type=" << arcane_type
674 <<
" nb_family_values=" << nb_family_values;
676 const Int32* indirection = iinfo.indirection();
677 Int64 med_connectivity_index = 0;
679 for (
Int32 i = 0; i < nb_item; ++i) {
681 Span<med_int> med_cinfo_span(med_connectivity.
span().subspan(med_connectivity_index, nb_item_node));
683 for (
Integer k = 0; k < nb_item_node; ++k) {
684 cinfo_span[k] = med_cinfo_span[indirection[k]];
688 for (
Integer k = 0; k < nb_item_node; ++k)
689 cinfo_span[k] = med_cinfo_span[k];
691 med_connectivity_index += nb_item_node;
693 nodes_reorderer.reorder(arcane_type, cinfo_span);
698 Node first_node(MeshUtils::findOneItem(node_family, ordered_nodes[0]));
699 if (first_node.
null())
700 ARCANE_FATAL(
"Impossible de trouver le nœud uid={0} pour l'indice de face '{1}'", ordered_nodes[0], i);
703 info() <<
"ERREUR: Impossible de trouver la face dans le maillage i=" << i <<
" nœuds=" << ordered_nodes;
705 for (
Face subface : first_node.
faces()) {
707 for (
Node subnode : subface.nodes()) {
711 ARCANE_FATAL(
"Impossible de trouver la face avec les nœuds=", ordered_nodes);
716 if (i < nb_family_values) {
718 med_int f = med_family_values[i];
721 ARCANE_FATAL(
"Impossible de trouver l'ID de famille '{0}' pour la face '{1}' de géotype '{2}'",
722 f, i, iinfo.medType());
728 info() <<
"FIN_LECTURE_DES_ENTITES";
737 med_idt fid,
const char* meshname)
739 const bool do_verbose =
false;
747 int err = MEDmeshNodeCoordinateRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_FULL_INTERLACE,
750 error() <<
"Impossible de lire les coordonnées des nœuds err=" << err;
755 for (Int64 i = 0; i < nb_node; ++i) {
756 Real3 xyz(coordinates[i * 3], coordinates[(i * 3) + 1], coordinates[(i * 3) + 2]);
758 info() <<
"I=" << i <<
" XYZ=" << xyz;
759 nodes_coordinates[i + 1] = xyz;
762 else if (spacedim == 2) {
763 for (
Int64 i = 0; i < nb_node; ++i) {
764 Real3 xyz(coordinates[i * 2], coordinates[(i * 2) + 1], 0.0);
766 info() <<
"I=" << i <<
" XYZ=" << xyz;
767 nodes_coordinates[i + 1] = xyz;
771 ARCANE_THROW(NotImplementedException,
"spacedim!=2 && spacedim!=3");
779 nodes_coord_var[inode] = nodes_coordinates[node.uniqueId()];
806 constexpr bool is_verbose =
false;
808 connectivity.
clear();
809 family_values.
clear();
811 int med_item_type = iinfo.medType();
812 med_bool coordinatechangement = {};
813 med_bool geotransformation = {};
814 med_int nb_med_item = 0;
815 if (iinfo.medType() == MED_POLYGON) {
818 med_int nb_index = ::MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, med_item_type,
819 MED_INDEX_NODE, MED_NODAL, &coordinatechangement,
822 ARCANE_FATAL(
"Impossible de lire le med_item_type MED '{0}' erreur={1}", med_item_type, nb_index);
824 info() <<
"MED: Lecture des entités";
825 info() <<
"MED: type=" << med_item_type <<
" nb_index=" << nb_index;
828 nb_med_item = nb_index - 1;
829 polygon_nb_nodes.
resize(nb_med_item);
831 med_int nb_connectivity = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT,
832 MED_CELL, MED_POLYGON, MED_CONNECTIVITY, MED_NODAL,
833 &coordinatechangement, &geotransformation);
834 if (nb_connectivity < 0)
835 ARCANE_FATAL(
"Impossible d'obtenir la taille de connectivité pour MED_POLYGON err={0}", nb_connectivity);
841 connectivity.
resize(nb_connectivity);
842 info() <<
"Lecture des polygones nb_connectivity=" << nb_connectivity;
843 int r = MEDmeshPolygonRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, MED_NODAL,
844 indexes.
data(), connectivity.
data());
846 ARCANE_FATAL(
"Impossible de lire la connectivité pour MED_POLYGON err={0}", r);
847 info() <<
"INDEXES=" << indexes;
848 for (
Int32 i = 0; i < nb_med_item; ++i)
849 polygon_nb_nodes[i] =
static_cast<Int16>(indexes[i + 1] - indexes[i]);
852 nb_med_item = ::MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, med_item_type,
853 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
856 ARCANE_FATAL(
"Impossible de lire le med_item_type MED '{0}' erreur={1}", med_item_type, nb_med_item);
858 info() <<
"MED: Lecture des entités";
859 info() <<
"MED: type=" << med_item_type <<
" nb_item=" << nb_med_item;
860 if (nb_med_item == 0)
863 Int64 nb_node = iinfo.nbNode();
868 connectivity.
resize(nb_node * nb_med_item);
869 int err = MEDmeshElementConnectivityRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL,
870 med_item_type, MED_NODAL, MED_FULL_INTERLACE,
871 connectivity.
data());
873 ARCANE_FATAL(
"Impossible de lire la connectivité MED med_item_type '{0}' erreur={1}",
877 info() <<
"CON: " << connectivity;
879 med_int nb_med_family = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT,
880 MED_CELL, med_item_type, MED_FAMILY_NUMBER, MED_NODAL,
881 &coordinatechangement, &geotransformation);
882 info() <<
"nb_family=" << nb_med_family;
883 if (nb_med_family < 0)
884 ARCANE_FATAL(
"Impossible de lire la taille de la famille pour le type med_item_type={0} erreur={1}", med_item_type, nb_med_family);
885 if (nb_med_family > 0) {
886 family_values.
resize(nb_med_family);
887 int r = MEDmeshEntityFamilyNumberRd(fid, meshname, MED_NO_DT, MED_NO_IT,
888 MED_CELL, med_item_type, family_values.
data());
890 ARCANE_FATAL(
"Impossible de lire les valeurs de famille pour le type med_item_type={0} erreur={1}", med_item_type, nb_med_family);
892 info() <<
"FAM: " << family_values;
902_readFamilies(med_idt fid,
const char* meshname)
906 info() <<
"Lecture des familles";
909 med_int nb_family = MEDnFamily(fid, meshname);
911 ARCANE_FATAL(
"Impossible de lire le nombre de familles (erreur={0})", nb_family);
913 info() <<
"MED: nb_family= " << nb_family;
914 for (med_int i = 0; i < nb_family; i++) {
915 info() <<
"MED: Lecture de la famille i=" << i;
917 med_int nb_group = MEDnFamilyGroup(fid, meshname, i + 1);
919 ARCANE_FATAL(
"Impossible de lire le nombre de groupes pour l'indice de famille={0}", i);
920 info() <<
"MED: indice de famille=" << i <<
" nb_group=" << nb_group;
928 med_int family_number = 0;
929 if (MEDfamilyInfo(fid, meshname, i + 1, familyname.data(), &family_number, all_group_names.data()) < 0)
930 ARCANE_FATAL(
"Impossible de lire les noms de groupes à partir de l'indice de famille={0}", i);
932 MEDFamilyInfo med_family(family_number);
934 med_family.m_index = group_index;
935 MEDGroupInfo med_group(group_index);
938 for (
Int32 z = 0; z < nb_group; ++z) {
945 for (; pos < MED_LNAME_SIZE; ++pos) {
946 char c = med_group_name[pos];
949 if (c ==
' ' || c ==
'_')
951 valid_name.
add(
static_cast<Byte>(c));
953 String name(valid_name.
view());
954 med_group.m_names.add(name);
955 info() <<
"ID de famille=" << family_number <<
" groupe='" << name <<
"'";
980 for (
String name : group_names)
981 pm->broadcastString(name, 0);
986 String current_group_name;
987 for (
Int32 i = 0; i < nb_group; ++i) {
988 pm->broadcastString(current_group_name, 0);
1002class MEDMeshReaderService
1003:
public BasicService
1017 return str ==
"med";
1020 [[maybe_unused]]
const XmlNode& mesh_element,
1023 [[maybe_unused]]
bool use_internal_partition)
override
1025 ARCANE_UNUSED(dir_name);
1027 return reader.readMesh(
mesh, file_name);
1046class MEDCaseMeshReader
1059 , m_read_info(read_info)
1066 ARCANE_UNUSED(build_info);
1071 String fname = m_read_info.fileName();
1072 m_trace_mng->info() <<
"Lecteur MED (ICaseMeshReader) file_name=" << fname;
1095 if (read_info.format() ==
"med")
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires sur le maillage.
Face getFaceFromNodesUniqueId(Node node, Int64ConstArrayView face_nodes_unique_id)
Recherche une entité face à partir des numéros uniques de ces noeuds.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Integer size() const
Nombre d'éléments du vecteur.
Classe de base d'un service.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
Vue modifiable d'un tableau d'un type T.
Tableau d'items de types quelconques.
void clear()
Supprime les éléments du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
const T * data() const
Accès à la racine du tableau hors toute protection.
ArrayView< T > view() const
Vue mutable sur ce tableau.
Span< const T > span() const
Vue immutable sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Informations nécessaires pour la lecture d'un fichier de maillage.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
static std::optional< Int32 > tryParseFromEnvironment(StringView s, bool throw_if_invalid)
Tableau 1D de taille fixe.
Interface du service de lecture du maillage à partir du jeu de données.
Interface d'une famille d'entités.
virtual ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
Interface d'un service de création/lecture du maillage.
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.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
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.
Interface du gestionnaire de traces.
void addItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Ajoute des entités.
Classe utilitaire pour imprimer les infos sur une entité.
Type d'une entité (Item).
Infos sur un type d'entité du maillage.
String typeName() const
Nom du type.
Gestionnaire des types d'entités d'un maillage.
ItemTypeId getPolygonType(Int16 nb_node) const
Retourne le type pour un polygone ayant nb_node.
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
void allocateMeshItems(IPrimaryMesh *pm) override
Alloue les entités du maillage géré par ce service.
void fillMeshBuildInfo(MeshBuildInfo &build_info) override
Remplit build_info avec les informations nécessaires pour créer le maillage.
Service de lecture d'un maillage au format MED depuis le jeu de données.
Ref< IMeshBuilder > createBuilder(const CaseMeshReaderReadInfo &read_info) const override
Retourne un builder pour créer et lire le maillage dont les informations sont spécifiées dans read_in...
bool allowExtension(const String &str) override
Vérifie si le service supporte les fichiers avec l'extension str.
void build() override
Construction de niveau build du service.
eReturnType readMeshFromFile(IPrimaryMesh *mesh, const XmlNode &mesh_element, const String &file_name, const String &dir_name, bool use_internal_partition) override
Lit un maillage à partir d'un fichier.
Int32 m_family_id
Id de la famille pour MED.
Int32 m_index
Index dans la liste des groupes Arcane.
Liste des groupes et des entités leur appartenant.
Int32 m_index
Index du groupe dans la liste des groupes.
UniqueArray< Int64 > m_unique_ids
Liste des uniqueId() des entités du groupe.
UniqueArray< String > m_names
Nom des groupes associés.
UniqueArray< Int32 > m_local_ids
Liste des localId() des entités du groupe.
Informations pour passer des types MED aux types Arcane pour les entités.
Lecteur de maillages au format MED.
void _broadcastGroups(ConstArrayView< String > names, IItemFamily *family)
Broadcast les groupes de group_names pour la famille family.
UniqueArray< MEDToArcaneItemInfo > m_med_to_arcane_types
Tableau de conversion entre les types MED et Arcane.
void _readAvailableTypes(med_idt fid, const char *meshname)
Récupère la liste des types géométriques présents dans le maillage.
IPrimaryMesh * m_mesh
Maillage en cours de lecture.
UniqueArray< MEDGroupInfo > m_med_groups
Liste des informations sur les groupes.
std::unordered_map< Int32, MEDFamilyInfo > m_med_families_map
Liste des familles.
std::unordered_map< med_int, Int32 > m_med_geotype_to_arcane_type_index
Table des index dans m_med_to_arcane_type de chaque geotype.
UniqueArray< med_int > m_med_geotypes_in_mesh
Liste des 'geotype' présents dans le maillage.
Int32 _readItems(med_idt fid, const char *meshnane, const MEDToArcaneItemInfo &iinfo, Array< Int16 > &polygon_nb_nodes, Array< med_int > &connectivity, Array< med_int > &family_values)
Lit les informations des entités d'un type donné.
void _readFaces(IPrimaryMesh *mesh, Int32 mesh_dimension, med_idt fid, const char *meshname)
Lit les faces.
Paramètres nécessaires à la construction d'un maillage.
Vue sur les informations des noeuds.
FaceConnectedListViewType faces() const
Liste des faces du noeud.
Classe utilitaire pour réordonner les noeuds d'une entité.
Exception lorsqu'une fonction n'est pas implémentée.
Référence à une instance.
Structure contenant les informations pour créer un service.
Tableau 1D de données avec buffer pré-alloué sur la pile.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ SmallSpan< T, DynExtent > subSpan(Int32 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage error() const
Flot pour un message d'erreur.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemGroupT< Face > FaceGroup
Groupe de faces.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
@ ST_SubDomain
Le service s'utilise au niveau du sous-domaine.
std::int16_t Int16
Type entier signé sur 16 bits.
unsigned char Byte
Type d'un octet.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.