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() <<
"Trying to read MED File name=" << 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() <<
"Error reading number of meshes";
318 info() <<
"MED: nb_mesh=" << nb_mesh;
320 error() <<
"No mesh is present";
328 int nb_axis = MEDmeshnAxis(fid, mesh_index);
330 error() <<
"Can not read number of axis (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() <<
"Can not read mesh info (MEDmeshInfo) r=" << err;
357 if (meshtype != MED_UNSTRUCTURED_MESH) {
358 error() <<
"Arcane handle only MED unstructured mesh (MED_UNSTRUCTURED_MESH) type=" << meshtype;
361 Integer mesh_dimension = meshdim;
362 if (mesh_dimension != 2 && mesh_dimension != 3)
363 ARCANE_FATAL(
"MED reader handles only 2D or 3D meshes");
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() <<
"Can not read number of nodes (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() <<
"Check Group 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(
"Can not read number of geometric entities 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(
"Can not read informations for geotype 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(
"Can not read number of items for geotype={0} name={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(
"MED type '{0}' is not supported by 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(
"Can not find family id '{0}' for cell '{1}' of geotype '{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;
636 _clearItemsInGroups();
652 Int32 item_dimension = iinfo.dimension();
654 if (item_dimension != (mesh_dimension - 1))
657 info() <<
"Reading faces geotype=" << geotype <<
" arcane_type=" << iinfo.arcaneType()
660 Int32 nb_item =
_readItems(fid, meshname, iinfo, polygon_nb_nodes, med_connectivity, med_family_values);
664 Int32 nb_item_node = iinfo.nbNode();
665 Int32 nb_family_values = med_family_values.
size();
666 if (arcane_type == IT_NullType) {
668 ARCANE_FATAL(
"MED type '{0}' is not supported by Arcane", iinfo.medType());
672 info() <<
"FACES_INFOS nb_item=" << nb_item <<
" type=" << arcane_type
673 <<
" nb_family_values=" << nb_family_values;
675 const Int32* indirection = iinfo.indirection();
676 Int64 med_connectivity_index = 0;
678 for (
Int32 i = 0; i < nb_item; ++i) {
680 Span<med_int> med_cinfo_span(med_connectivity.
span().subspan(med_connectivity_index, nb_item_node));
682 for (
Integer k = 0; k < nb_item_node; ++k) {
683 cinfo_span[k] = med_cinfo_span[indirection[k]];
687 for (
Integer k = 0; k < nb_item_node; ++k)
688 cinfo_span[k] = med_cinfo_span[k];
690 med_connectivity_index += nb_item_node;
692 nodes_reorderer.reorder(arcane_type, cinfo_span);
697 Node first_node(MeshUtils::findOneItem(node_family, ordered_nodes[0]));
698 if (first_node.
null())
699 ARCANE_FATAL(
"Can not find node uid={0} for face index '{1}'", ordered_nodes[0], i);
702 info() <<
"ERROR: Can not find face in mesh i=" << i <<
" nodes=" << ordered_nodes;
704 for (
Face subface : first_node.
faces()) {
706 for (
Node subnode : subface.nodes()) {
710 ARCANE_FATAL(
"Can not find face with nodes=", ordered_nodes);
715 if (i < nb_family_values) {
717 med_int f = med_family_values[i];
720 ARCANE_FATAL(
"Can not find family id '{0}' for face '{1}' of geotype '{2}'",
721 f, i, iinfo.medType());
727 info() <<
"END_READING_ITEMS";
736 med_idt fid,
const char* meshname)
738 const bool do_verbose =
false;
746 int err = MEDmeshNodeCoordinateRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_FULL_INTERLACE,
749 error() <<
"Can not read nodes coordinates err=" << err;
754 for (Int64 i = 0; i < nb_node; ++i) {
755 Real3 xyz(coordinates[i * 3], coordinates[(i * 3) + 1], coordinates[(i * 3) + 2]);
757 info() <<
"I=" << i <<
" XYZ=" << xyz;
758 nodes_coordinates[i + 1] = xyz;
761 else if (spacedim == 2) {
762 for (
Int64 i = 0; i < nb_node; ++i) {
763 Real3 xyz(coordinates[i * 2], coordinates[(i * 2) + 1], 0.0);
765 info() <<
"I=" << i <<
" XYZ=" << xyz;
766 nodes_coordinates[i + 1] = xyz;
770 ARCANE_THROW(NotImplementedException,
"spacedim!=2 && spacedim!=3");
778 nodes_coord_var[inode] = nodes_coordinates[node.uniqueId()];
805 constexpr bool is_verbose =
false;
807 connectivity.
clear();
808 family_values.
clear();
810 int med_item_type = iinfo.medType();
811 med_bool coordinatechangement = {};
812 med_bool geotransformation = {};
813 med_int nb_med_item = 0;
814 if (iinfo.medType() == MED_POLYGON) {
817 med_int nb_index = ::MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, med_item_type,
818 MED_INDEX_NODE, MED_NODAL, &coordinatechangement,
821 ARCANE_FATAL(
"Can not read MED med_item_type '{0}' error={1}", med_item_type, nb_index);
823 info() <<
"MED: Reading items";
824 info() <<
"MED: type=" << med_item_type <<
" nb_index=" << nb_index;
827 nb_med_item = nb_index - 1;
828 polygon_nb_nodes.
resize(nb_med_item);
830 med_int nb_connectivity = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT,
831 MED_CELL, MED_POLYGON, MED_CONNECTIVITY, MED_NODAL,
832 &coordinatechangement, &geotransformation);
833 if (nb_connectivity < 0)
834 ARCANE_FATAL(
"Can not get connectivity size for MED_POLYGON err={0}", nb_connectivity);
840 connectivity.
resize(nb_connectivity);
841 info() <<
"Reading polygons nb_connectivity=" << nb_connectivity;
842 int r = MEDmeshPolygonRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, MED_NODAL,
843 indexes.
data(), connectivity.
data());
845 ARCANE_FATAL(
"Can not read connectivity for MED_POLYGON err={0}", r);
846 info() <<
"INDEXES=" << indexes;
847 for (
Int32 i = 0; i < nb_med_item; ++i)
848 polygon_nb_nodes[i] =
static_cast<Int16>(indexes[i + 1] - indexes[i]);
851 nb_med_item = ::MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, med_item_type,
852 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
855 ARCANE_FATAL(
"Can not read MED med_item_type '{0}' error={1}", med_item_type, nb_med_item);
857 info() <<
"MED: Reading items";
858 info() <<
"MED: type=" << med_item_type <<
" nb_item=" << nb_med_item;
859 if (nb_med_item == 0)
862 Int64 nb_node = iinfo.nbNode();
867 connectivity.
resize(nb_node * nb_med_item);
868 int err = MEDmeshElementConnectivityRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL,
869 med_item_type, MED_NODAL, MED_FULL_INTERLACE,
870 connectivity.
data());
872 ARCANE_FATAL(
"Can not read connectivity MED med_item_type '{0}' error={1}",
876 info() <<
"CON: " << connectivity;
878 med_int nb_med_family = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT,
879 MED_CELL, med_item_type, MED_FAMILY_NUMBER, MED_NODAL,
880 &coordinatechangement, &geotransformation);
881 info() <<
"nb_family=" << nb_med_family;
882 if (nb_med_family < 0)
883 ARCANE_FATAL(
"Can not read family size for type med_item_type={0} error={1}", med_item_type, nb_med_family);
884 if (nb_med_family > 0) {
885 family_values.
resize(nb_med_family);
886 int r = MEDmeshEntityFamilyNumberRd(fid, meshname, MED_NO_DT, MED_NO_IT,
887 MED_CELL, med_item_type, family_values.
data());
889 ARCANE_FATAL(
"Can not read family values for type med_item_type={0} error={1}", med_item_type, nb_med_family);
891 info() <<
"FAM: " << family_values;
901_readFamilies(med_idt fid,
const char* meshname)
905 info() <<
"Read families";
908 med_int nb_family = MEDnFamily(fid, meshname);
910 ARCANE_FATAL(
"Can not read number of families (error={0})", nb_family);
912 info() <<
"MED: nb_family= " << nb_family;
913 for (med_int i = 0; i < nb_family; i++) {
914 info() <<
"MED: Read family i=" << i;
916 med_int nb_group = MEDnFamilyGroup(fid, meshname, i + 1);
918 ARCANE_FATAL(
"Can not read number of groups for family index={0}", i);
919 info() <<
"MED: family index=" << i <<
" nb_group=" << nb_group;
927 med_int family_number = 0;
928 if (MEDfamilyInfo(fid, meshname, i + 1, familyname.data(), &family_number, all_group_names.data()) < 0)
929 ARCANE_FATAL(
"Can not read group names from family index={0}", i);
931 MEDFamilyInfo med_family(family_number);
933 med_family.m_index = group_index;
934 MEDGroupInfo med_group(group_index);
937 for (
Int32 z = 0; z < nb_group; ++z) {
944 for (; pos < MED_LNAME_SIZE; ++pos) {
945 char c = med_group_name[pos];
948 if (c ==
' ' || c ==
'_')
950 valid_name.
add(
static_cast<Byte>(c));
952 String name(valid_name.
view());
953 med_group.m_names.add(name);
954 info() <<
"Family id=" << family_number <<
" group='" << name <<
"'";
979 for (
String name : group_names)
980 pm->broadcastString(name, 0);
985 String current_group_name;
986 for (
Int32 i = 0; i < nb_group; ++i) {
987 pm->broadcastString(current_group_name, 0);
1001class MEDMeshReaderService
1002:
public BasicService
1016 return str ==
"med";
1019 [[maybe_unused]]
const XmlNode& mesh_element,
1022 [[maybe_unused]]
bool use_internal_partition)
override
1024 ARCANE_UNUSED(dir_name);
1026 return reader.readMesh(
mesh, file_name);
1045class MEDCaseMeshReader
1058 , m_read_info(read_info)
1065 ARCANE_UNUSED(build_info);
1070 String fname = m_read_info.fileName();
1071 m_trace_mng->info() <<
"MED Reader (ICaseMeshReader) file_name=" << fname;
1094 if (read_info.format() ==
"med")
#define ARCANE_THROW(exception_class,...)
Macro for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Utility functions for the mesh.
Face getFaceFromNodesUniqueId(Node node, Int64ConstArrayView face_nodes_unique_id)
Searches for a face entity using the unique numbers of these nodes.
This file contains the various service factories and macros for registering services.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro to declare an interface when registering a service.
Integer size() const
Number of elements in the vector.
AbstractService(const ServiceBuildInfo &)
Constructor from a ServiceBuildInfo.
Modifiable view of an array of type T.
Base class for 1D data vectors.
Span< const T > span() const
Immutable view of this array.
void resize(Int64 s)
Changes the number of elements in the array to s.
void clear()
Removes the elements from the array.
void add(ConstReferenceType val)
Adds element val to the end of the array.
const T * data() const
Access to the root of the array without any protection.
ArrayView< T > view() const
Mutable view of this array.
Necessary information for reading a mesh file.
Constant view of an array of type T.
constexpr Integer size() const noexcept
Number of elements in the array.
static std::optional< Int32 > tryParseFromEnvironment(StringView s, bool throw_if_invalid)
Interface for the mesh reading service from the dataset.
Interface of an entity family.
virtual ItemGroup findGroup(const String &name) const =0
Searches for a group.
virtual NodeGroup allNodes()=0
Group of all nodes.
Interface of a mesh creation/reading service.
Interface of the service managing the reading of a mesh.
eReturnType
Types of return codes for a read or write operation.
@ RTError
Error during the operation.
@ RTOk
Operation successfully performed.
Interface of the parallelism manager for a subdomain.
virtual Int32 commRank() const =0
Rank of this instance in the communicator.
virtual VariableNodeReal3 & nodesCoordinates()=0
Node coordinates.
virtual void allocateCells(Integer nb_cell, Int64ConstArrayView cells_infos, bool one_alloc=true)=0
Allocation of a mesh.
void addItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Adds entities.
Utility class for printing information about an entity.
Type of an entity (Item).
Info on a mesh entity type.
String typeName() const
Type name.
Mesh entity type manager.
ItemTypeId getPolygonType(Int16 nb_node) const
Returns the type for a polygon having nb_node.
ItemTypeInfo * typeFromId(Integer id) const
Type corresponding to the number id.
constexpr Int32 localId() const
Local identifier of the entity in the processor subdomain.
constexpr bool null() const
true if the entity is null (i.e. not connected to the mesh)
void allocateMeshItems(IPrimaryMesh *pm) override
Allocates the mesh entities managed by this service.
void fillMeshBuildInfo(MeshBuildInfo &build_info) override
Fills build_info with the necessary information to create the mesh.
Service for reading a mesh in MED format from the dataset.
Ref< IMeshBuilder > createBuilder(const CaseMeshReaderReadInfo &read_info) const override
Returns a builder to create and read the mesh whose information is specified in read_info.
bool allowExtension(const String &str) override
Checks if the service supports files with the extension str.
void build() override
Build-level construction of the service.
eReturnType readMeshFromFile(IPrimaryMesh *mesh, const XmlNode &mesh_element, const String &file_name, const String &dir_name, bool use_internal_partition) override
Reads a mesh from a file.
Int32 m_family_id
Family ID for MED.
Int32 m_index
Index in the Arcane group list.
List of groups and the entities belonging to them.
Int32 m_index
Index of the group in the group list.
UniqueArray< Int64 > m_unique_ids
List of uniqueId() of the group's entities.
UniqueArray< String > m_names
Associated group names.
UniqueArray< Int32 > m_local_ids
List of localId() of the group's entities.
Information for mapping MED types to Arcane types for entities.
void _broadcastGroups(ConstArrayView< String > names, IItemFamily *family)
Broadcast the groups of group_names for the family family.
UniqueArray< MEDToArcaneItemInfo > m_med_to_arcane_types
Conversion table between MED and Arcane types.
void _readAvailableTypes(med_idt fid, const char *meshname)
Retrieves the list of geometric types present in the mesh.
IPrimaryMesh * m_mesh
Mesh currently being read.
UniqueArray< MEDGroupInfo > m_med_groups
List of group information.
std::unordered_map< Int32, MEDFamilyInfo > m_med_families_map
List of families.
std::unordered_map< med_int, Int32 > m_med_geotype_to_arcane_type_index
Table of indices in m_med_to_arcane_type for each geotype.
UniqueArray< med_int > m_med_geotypes_in_mesh
List of 'geotypes' present in the mesh.
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)
Reads information about entities of a given type.
void _readFaces(IPrimaryMesh *mesh, Int32 mesh_dimension, med_idt fid, const char *meshname)
Reads the faces.
Parameters necessary for building a mesh.
View of node information.
FaceConnectedListViewType faces() const
List of faces of the node.
Utility class to reorder the nodes of an entity.
Exception when a function is not implemented.
Reference to an instance.
Structure containing the information to create a service.
1D data array with pre-allocated stack buffer.
View of an array of elements of type T.
constexpr __host__ __device__ SmallSpan< T, DynExtent > subSpan(Int32 abegin, Int32 asize) const
Sub-view starting from element abegin and containing asize elements.
View of an array of elements of type T.
Unicode character string.
TraceAccessor(ITraceMng *m)
Constructs an accessor via the trace manager m.
TraceMessage info() const
Flow for an information message.
TraceMessage error() const
Flow for an error message.
ITraceMng * traceMng() const
Trace manager.
1D data vector with value semantics (STL style).
ItemGroupT< Cell > CellGroup
Group of cells.
ItemGroupT< Face > FaceGroup
Group of faces.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro for registering a service.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Coordinate type quantity at node.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
@ ST_SubDomain
The service is used at the subdomain level.
std::int16_t Int16
Signed integer type of 16 bits.
unsigned char Byte
Type of a byte.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Creates a reference on a pointer.
std::int32_t Int32
Signed integer type of 32 bits.