14#include "arcane/utils/ITraceMng.h"
15#include "arcane/utils/SmallArray.h"
16#include "arcane/utils/FixedArray.h"
18#include "arcane/core/IMeshReader.h"
19#include "arcane/core/BasicService.h"
21#include "arcane/core/IPrimaryMesh.h"
22#include "arcane/core/IItemFamily.h"
23#include "arcane/core/ICaseMeshReader.h"
24#include "arcane/core/IMeshBuilder.h"
25#include "arcane/core/IParallelMng.h"
26#include "arcane/core/MeshPartInfo.h"
27#include "arcane/core/NodesOfItemReorderer.h"
29#include "arcane/core/ItemPrinter.h"
60 class MEDToArcaneItemInfo
64 MEDToArcaneItemInfo(
int dimension,
int nb_node, med_int med_type,
66 : m_dimension(dimension)
68 , m_med_type(med_type)
69 , m_arcane_type(arcane_type)
70 , m_indirection(indirection)
75 int dimension()
const {
return m_dimension; }
76 int nbNode()
const {
return m_nb_node; }
77 med_int medType()
const {
return m_med_type; }
78 Int16 arcaneType()
const {
return m_arcane_type; }
79 const Int32* indirection()
const {
return m_indirection; }
85 med_int m_med_type = {};
87 const Int32* m_indirection =
nullptr;
95 explicit MEDFamilyInfo(
Int32 family_id)
119 explicit MEDGroupInfo(
Int32 index)
140 _initMEDToArcaneTypes();
157 explicit AutoCloseMED(med_idt
id)
186 void _initMEDToArcaneTypes();
187 void _addTypeInfo(
int dimension,
int nb_node, med_int med_type,
ItemTypeId arcane_type)
189 _addTypeInfo(dimension, nb_node, med_type, arcane_type,
nullptr);
191 void _addTypeInfo(
int dimension,
int nb_node, med_int med_type,
ItemTypeId arcane_type,
192 const Int32* indirection)
194 MEDToArcaneItemInfo t(dimension, nb_node, med_type, arcane_type, indirection);
199 void _readAndCreateCells(IPrimaryMesh* mesh, Int32 mesh_dimension, med_idt fid,
const char* meshname);
200 void _readFaces(IPrimaryMesh* mesh, Int32 mesh_dimension, med_idt fid,
const char* meshname);
203 _readNodesCoordinates(IPrimaryMesh* mesh, Int64 nb_node, Int32 spacedim,
204 med_idt fid,
const char* meshname);
205 void _readFamilies(med_idt fid,
const char* meshname);
207 void _clearItemsInGroups()
210 g.m_unique_ids.clear();
211 g.m_local_ids.clear();
224 const Int32 Hexaedron8_indirection[] = { 1, 0, 3, 2, 5, 4, 7, 6 };
225 const Int32 Hexaedron20_indirection[] = { 1, 8, 10, 3, 9, 2, 0, 11, 5, 14, 18, 7, 6, 4, 16, 15, 13, 12, 17, 19 };
226 const Int32 Pyramid5_indirection[] = { 1, 0, 3, 2, 4 };
227 const Int32 Quad4_indirection[] = { 1, 0, 3, 2 };
228 const Int32 Quad8_indirection[] = { 1, 0, 3, 2, 4, 7, 6, 5 };
229 const Int32 Triangle3_indirection[] = { 1, 0, 2 };
231 const Int32 Tetraedron4_indirection[] = { 1, 0, 2, 3 };
238_initMEDToArcaneTypes()
245 _addTypeInfo(1, 2, MED_SEG2, ITI_Line2);
246 _addTypeInfo(1, 3, MED_SEG3, ITI_Line3);
247 _addTypeInfo(1, 4, MED_SEG4, ITI_NullType);
250 _addTypeInfo(2, 3, MED_TRIA3, ITI_Triangle3, Triangle3_indirection);
251 _addTypeInfo(2, 4, MED_QUAD4, ITI_Quad4, Quad4_indirection);
252 _addTypeInfo(2, 6, MED_TRIA6, ITI_NullType);
253 _addTypeInfo(2, 7, MED_TRIA7, ITI_NullType);
254 _addTypeInfo(2, 8, MED_QUAD8, ITI_Quad8, Quad8_indirection);
255 _addTypeInfo(2, 9, MED_QUAD9, ITI_NullType);
258 _addTypeInfo(3, 4, MED_TETRA4, ITI_Tetraedron4);
259 _addTypeInfo(3, 5, MED_PYRA5, ITI_Pyramid5, Pyramid5_indirection);
260 _addTypeInfo(3, 6, MED_PENTA6, ITI_Pentaedron6);
261 _addTypeInfo(3, 8, MED_HEXA8, ITI_Hexaedron8);
262 _addTypeInfo(3, 10, MED_TETRA10, ITI_Tetraedron10);
263 _addTypeInfo(3, 12, MED_OCTA12, ITI_Octaedron12);
264 _addTypeInfo(3, 13, MED_PYRA13, ITI_NullType);
265 _addTypeInfo(3, 15, MED_PENTA15, ITI_NullType);
266 _addTypeInfo(3, 18, MED_PENTA18, ITI_NullType);
267 _addTypeInfo(3, 20, MED_HEXA20, ITI_Hexaedron20);
268 _addTypeInfo(3, 27, MED_HEXA27, ITI_NullType);
276 _addTypeInfo(2, 0, MED_POLYGON, ITI_GenericPolygon);
277 _addTypeInfo(2, 0, MED_POLYGON2, ITI_NullType);
278 _addTypeInfo(3, 0, MED_POLYHEDRON, ITI_NullType);
292 info() <<
"Trying to read MED File name=" << file_name;
294 return _readMesh(mesh, file_name);
303 const med_idt fid = MEDfileOpen(filename.localstr(), MED_ACC_RDONLY);
305 MESSAGE(
"ERROR: can not open MED file ");
306 error() <<
"ERROR: can not open MED file '" << filename <<
"'";
312 int nb_mesh = MEDnMesh(fid);
314 error() <<
"Error reading number of meshes";
317 info() <<
"MED: nb_mesh=" << nb_mesh;
319 error() <<
"No mesh is present";
327 int nb_axis = MEDmeshnAxis(fid, mesh_index);
329 error() <<
"Can not read number of axis (MEDmeshnAxis)";
332 info() <<
"MED: nb_axis=" << nb_axis;
334 UniqueArray<char> axisname(MED_SNAME_SIZE * nb_axis + 1,
'\0');
335 UniqueArray<char> unitname(MED_SNAME_SIZE * nb_axis + 1,
'\0');
337 char meshname[MED_NAME_SIZE + 1];
339 char meshdescription[MED_COMMENT_SIZE + 1];
340 meshdescription[0] =
'\0';
341 char dtunit[MED_SNAME_SIZE + 1];
343 med_int spacedim = 0;
345 med_mesh_type meshtype = MED_UNDEF_MESH_TYPE;
346 med_sorting_type sortingtype = MED_SORT_UNDEF;
348 med_axis_type axistype = MED_UNDEF_AXIS_TYPE;
350 err = MEDmeshInfo(fid, mesh_index, meshname, &spacedim, &meshdim, &meshtype, meshdescription,
351 dtunit, &sortingtype, &nstep, &axistype, axisname.data(), unitname.data());
353 error() <<
"Can not read mesh info (MEDmeshInfo) r=" << err;
356 if (meshtype != MED_UNSTRUCTURED_MESH) {
357 error() <<
"Arcane handle only MED unstructured mesh (MED_UNSTRUCTURED_MESH) type=" << meshtype;
360 Integer mesh_dimension = meshdim;
361 if (mesh_dimension != 2 && mesh_dimension != 3)
362 ARCANE_FATAL(
"MED reader handles only 2D or 3D meshes");
364 info() <<
"MED: name=" << meshname;
365 info() <<
"MED: description=" << meshdescription;
366 info() <<
"MED: spacedim=" << spacedim;
367 info() <<
"MED: meshdim=" << meshdim;
368 info() <<
"MED: dtunit=" << dtunit;
369 info() <<
"MED: meshtype=" << meshtype;
370 info() <<
"MED: sortingtype=" << sortingtype;
371 info() <<
"MED: axistype=" << axistype;
372 info() <<
"MED: nstep=" << nstep;
377 med_bool coordinatechangement;
378 med_bool geotransformation;
381 med_int med_nb_node = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_NODE, MED_NO_GEOTYPE,
382 MED_COORDINATE, MED_NO_CMODE, &coordinatechangement,
384 if (med_nb_node < 0) {
385 error() <<
"Can not read number of nodes (MEDmeshnEntity) err=" << med_nb_node;
388 nb_node = med_nb_node;
390 info() <<
"MED: nb_node=" << nb_node;
392 mesh->setDimension(mesh_dimension);
397 mesh->itemTypeMng()->buildPolygonTypes();
399 IParallelMng* pm = mesh->parallelMng();
400 bool is_parallel = pm->isParallel();
401 Int32 rank = mesh->meshPartInfo().partRank();
403 bool is_read_items = !(is_parallel && rank != 0);
406 _readFamilies(fid, meshname);
407 _readAndCreateCells(mesh, mesh_dimension, fid, meshname);
416 UniqueArray<String> cell_group_names;
417 IItemFamily* cell_family = mesh->cellFamily();
424 UniqueArray<Int32> cell_local_ids;
426 Int32 nb_cell_in_group = g.m_unique_ids.size();
427 cell_local_ids.resize(nb_cell_in_group);
428 cell_family->itemsUniqueIdToLocalId(cell_local_ids, g.m_unique_ids);
429 for (
const String& name : g.m_names) {
430 info() <<
"Group=" << name <<
" index=" << g.m_index <<
" nb_item=" << nb_cell_in_group;
431 CellGroup cell_group = cell_family->findGroup(name,
true);
432 cell_group.
addItems(cell_local_ids);
433 cell_group_names.add(name);
444 bool is_face_group_disabled =
false;
446 is_face_group_disabled = (v.value());
447 if (!is_face_group_disabled)
448 _readFaces(mesh, mesh_dimension, fid, meshname);
451 UniqueArray<String> face_group_names;
452 IItemFamily* face_family = mesh->faceFamily();
456 Int32 nb_face_in_group = g.m_local_ids.size();
457 info() <<
"Check Group index=" << g.m_index <<
" nb_item=" << nb_face_in_group;
458 if (nb_face_in_group == 0)
460 for (
const String& name : g.m_names) {
461 info() <<
"FaceGroup=" << name <<
" index=" << g.m_index <<
" nb_item=" << nb_face_in_group;
462 FaceGroup face_group = face_family->findGroup(name,
true);
464 face_group_names.add(name);
472 return _readNodesCoordinates(mesh, nb_node, spacedim, fid, meshname);
486 med_bool coordinatechangement;
487 med_bool geotransformation;
488 med_int nb_geo = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, MED_GEO_ALL,
489 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
492 ARCANE_FATAL(
"Can not read number of geometric entities nb_geo={0}", nb_geo);
493 info() <<
"MED: nb_geotype = " << nb_geo;
496 for (med_int it = 1; it <= nb_geo; it++) {
498 med_geometry_type geotype = MED_GEO_ALL;
502 med_int type_ret = MEDmeshEntityInfo(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, it,
503 geotype_name.data(), &geotype);
505 ARCANE_FATAL(
"Can not read informations for geotype index={0} ret={1}", it, type_ret);
507 med_int nb_item = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, geotype,
508 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
511 ARCANE_FATAL(
"Can not read number of items for geotype={0} name={1} ret={2}",
512 geotype, geotype_name.data(), nb_item);
513 info() <<
"MED: type=" << geotype <<
" '" << geotype_name.data() <<
"' nb_item=" << nb_item;
524 _clearItemsInGroups();
529 Int64 cell_unique_id = 0;
543 Int32 item_dimension = iinfo.dimension();
545 if (item_dimension != mesh_dimension)
547 Int32 nb_item =
_readItems(fid, meshname, iinfo, polygon_nb_nodes, med_connectivity, med_family_values);
550 Int16 arcane_type = iinfo.arcaneType();
551 Int32 nb_item_node = iinfo.nbNode();
552 Int32 nb_family_values = med_family_values.
size();
553 if (arcane_type == IT_NullType) {
555 ARCANE_FATAL(
"MED type '{0}' is not supported by Arcane", iinfo.medType());
557 Int64 cells_infos_index = 0;
558 Int64 med_connectivity_index = 0;
559 const bool is_polygon = (iinfo.medType() == MED_POLYGON);
561 UniqueArray<Int64> cells_infos;
563 cells_infos.resize(2 * nb_item + med_connectivity.
size());
565 cells_infos.resize((2 + nb_item_node) * nb_item);
567 info() <<
"CELL_INFOS size=" << cells_infos.size() <<
" nb_item=" << nb_item
568 <<
" type=" << arcane_type;
570 const Int32* indirection = iinfo.indirection();
571 for (Int32 i = 0; i < nb_item; ++i) {
572 Int64 current_cell_unique_id = cell_unique_id;
575 nb_item_node = polygon_nb_nodes[i];
576 arcane_type = itm->
getPolygonType(
static_cast<Int16
>(nb_item_node));
577 cells_infos[cells_infos_index] = arcane_type;
579 cells_infos[cells_infos_index] = current_cell_unique_id;
581 Span<Int64> cinfo_span(cells_infos.span().subspan(cells_infos_index, nb_item_node));
582 Span<med_int> med_cinfo_span(med_connectivity.
span().subspan(med_connectivity_index, nb_item_node));
583 for (
Integer k = 0; k < nb_item_node; ++k) {
584 cinfo_span[k] = med_cinfo_span[k];
588 cells_infos[cells_infos_index] = arcane_type;
591 cells_infos[cells_infos_index] = current_cell_unique_id;
593 Span<Int64> cinfo_span(cells_infos.span().subspan(cells_infos_index, nb_item_node));
594 Span<med_int> med_cinfo_span(med_connectivity.
span().subspan(med_connectivity_index, nb_item_node));
596 for (
Integer k = 0; k < nb_item_node; ++k) {
597 cinfo_span[k] = med_cinfo_span[indirection[k]];
601 for (
Integer k = 0; k < nb_item_node; ++k)
602 cinfo_span[k] = med_cinfo_span[k];
605 if (i < nb_family_values) {
607 med_int f = med_family_values[i];
610 ARCANE_FATAL(
"Can not find family id '{0}' for cell '{1}' of geotype '{2}'",
611 f, i, iinfo.medType());
613 m_med_groups[x->second.m_index].m_unique_ids.add(current_cell_unique_id);
616 med_connectivity_index += nb_item_node;
617 cells_infos_index += nb_item_node;
635 _clearItemsInGroups();
651 Int32 item_dimension = iinfo.dimension();
653 if (item_dimension != (mesh_dimension - 1))
656 info() <<
"Reading faces geotype=" << geotype <<
" arcane_type=" << iinfo.arcaneType()
659 Int32 nb_item =
_readItems(fid, meshname, iinfo, polygon_nb_nodes, med_connectivity, med_family_values);
663 Int32 nb_item_node = iinfo.nbNode();
664 Int32 nb_family_values = med_family_values.
size();
665 if (arcane_type == IT_NullType) {
667 ARCANE_FATAL(
"MED type '{0}' is not supported by Arcane", iinfo.medType());
671 info() <<
"FACES_INFOS nb_item=" << nb_item <<
" type=" << arcane_type
672 <<
" nb_family_values=" << nb_family_values;
674 const Int32* indirection = iinfo.indirection();
675 Int64 med_connectivity_index = 0;
677 for (
Int32 i = 0; i < nb_item; ++i) {
679 Span<med_int> med_cinfo_span(med_connectivity.
span().subspan(med_connectivity_index, nb_item_node));
681 for (
Integer k = 0; k < nb_item_node; ++k) {
682 cinfo_span[k] = med_cinfo_span[indirection[k]];
686 for (
Integer k = 0; k < nb_item_node; ++k)
687 cinfo_span[k] = med_cinfo_span[k];
689 med_connectivity_index += nb_item_node;
691 nodes_reorderer.reorder(arcane_type, cinfo_span);
696 Node first_node(MeshUtils::findOneItem(node_family, ordered_nodes[0]));
697 if (first_node.
null())
698 ARCANE_FATAL(
"Can not find node uid={0} for face index '{1}'", ordered_nodes[0], i);
701 info() <<
"ERROR: Can not find face in mesh i=" << i <<
" nodes=" << ordered_nodes;
703 for (
Face subface : first_node.
faces()) {
705 for (
Node subnode : subface.nodes()) {
709 ARCANE_FATAL(
"Can not find face with nodes=", ordered_nodes);
714 if (i < nb_family_values) {
716 med_int f = med_family_values[i];
719 ARCANE_FATAL(
"Can not find family id '{0}' for face '{1}' of geotype '{2}'",
720 f, i, iinfo.medType());
726 info() <<
"END_READING_ITEMS";
735 med_idt fid,
const char* meshname)
737 const bool do_verbose =
false;
745 int err = MEDmeshNodeCoordinateRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_FULL_INTERLACE,
748 error() <<
"Can not read nodes coordinates err=" << err;
753 for (Int64 i = 0; i < nb_node; ++i) {
754 Real3 xyz(coordinates[i * 3], coordinates[(i * 3) + 1], coordinates[(i * 3) + 2]);
756 info() <<
"I=" << i <<
" XYZ=" << xyz;
757 nodes_coordinates[i + 1] = xyz;
760 else if (spacedim == 2) {
761 for (
Int64 i = 0; i < nb_node; ++i) {
762 Real3 xyz(coordinates[i * 2], coordinates[(i * 2) + 1], 0.0);
764 info() <<
"I=" << i <<
" XYZ=" << xyz;
765 nodes_coordinates[i + 1] = xyz;
769 ARCANE_THROW(NotImplementedException,
"spacedim!=2 && spacedim!=3");
777 nodes_coord_var[inode] = nodes_coordinates[node.uniqueId()];
804 constexpr bool is_verbose =
false;
806 connectivity.
clear();
807 family_values.
clear();
809 int med_item_type = iinfo.medType();
810 med_bool coordinatechangement = {};
811 med_bool geotransformation = {};
812 med_int nb_med_item = 0;
813 if (iinfo.medType() == MED_POLYGON) {
816 med_int nb_index = ::MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, med_item_type,
817 MED_INDEX_NODE, MED_NODAL, &coordinatechangement,
820 ARCANE_FATAL(
"Can not read MED med_item_type '{0}' error={1}", med_item_type, nb_index);
822 info() <<
"MED: Reading items";
823 info() <<
"MED: type=" << med_item_type <<
" nb_index=" << nb_index;
826 nb_med_item = nb_index - 1;
827 polygon_nb_nodes.
resize(nb_med_item);
829 med_int nb_connectivity = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT,
830 MED_CELL, MED_POLYGON, MED_CONNECTIVITY, MED_NODAL,
831 &coordinatechangement, &geotransformation);
832 if (nb_connectivity < 0)
833 ARCANE_FATAL(
"Can not get connectivity size for MED_POLYGON err={0}", nb_connectivity);
839 connectivity.
resize(nb_connectivity);
840 info() <<
"Reading polygons nb_connectivity=" << nb_connectivity;
841 int r = MEDmeshPolygonRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, MED_NODAL,
842 indexes.
data(), connectivity.
data());
844 ARCANE_FATAL(
"Can not read connectivity for MED_POLYGON err={0}", r);
845 info() <<
"INDEXES=" << indexes;
846 for (
Int32 i = 0; i < nb_med_item; ++i)
847 polygon_nb_nodes[i] =
static_cast<Int16>(indexes[i + 1] - indexes[i]);
850 nb_med_item = ::MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL, med_item_type,
851 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
854 ARCANE_FATAL(
"Can not read MED med_item_type '{0}' error={1}", med_item_type, nb_med_item);
856 info() <<
"MED: Reading items";
857 info() <<
"MED: type=" << med_item_type <<
" nb_item=" << nb_med_item;
858 if (nb_med_item == 0)
861 Int64 nb_node = iinfo.nbNode();
866 connectivity.
resize(nb_node * nb_med_item);
867 int err = MEDmeshElementConnectivityRd(fid, meshname, MED_NO_DT, MED_NO_IT, MED_CELL,
868 med_item_type, MED_NODAL, MED_FULL_INTERLACE,
869 connectivity.
data());
871 ARCANE_FATAL(
"Can not read connectivity MED med_item_type '{0}' error={1}",
875 info() <<
"CON: " << connectivity;
877 med_int nb_med_family = MEDmeshnEntity(fid, meshname, MED_NO_DT, MED_NO_IT,
878 MED_CELL, med_item_type, MED_FAMILY_NUMBER, MED_NODAL,
879 &coordinatechangement, &geotransformation);
880 info() <<
"nb_family=" << nb_med_family;
881 if (nb_med_family < 0)
882 ARCANE_FATAL(
"Can not read family size for type med_item_type={0} error={1}", med_item_type, nb_med_family);
883 if (nb_med_family > 0) {
884 family_values.
resize(nb_med_family);
885 int r = MEDmeshEntityFamilyNumberRd(fid, meshname, MED_NO_DT, MED_NO_IT,
886 MED_CELL, med_item_type, family_values.
data());
888 ARCANE_FATAL(
"Can not read family values for type med_item_type={0} error={1}", med_item_type, nb_med_family);
890 info() <<
"FAM: " << family_values;
900_readFamilies(med_idt fid,
const char* meshname)
904 info() <<
"Read families";
907 med_int nb_family = MEDnFamily(fid, meshname);
909 ARCANE_FATAL(
"Can not read number of families (error={0})", nb_family);
911 info() <<
"MED: nb_family= " << nb_family;
912 for (med_int i = 0; i < nb_family; i++) {
913 info() <<
"MED: Read family i=" << i;
915 med_int nb_group = MEDnFamilyGroup(fid, meshname, i + 1);
917 ARCANE_FATAL(
"Can not read number of groups for family index={0}", i);
918 info() <<
"MED: family index=" << i <<
" nb_group=" << nb_group;
926 med_int family_number = 0;
927 if (MEDfamilyInfo(fid, meshname, i + 1, familyname.data(), &family_number, all_group_names.data()) < 0)
928 ARCANE_FATAL(
"Can not read group names from family index={0}", i);
930 MEDFamilyInfo med_family(family_number);
932 med_family.m_index = group_index;
933 MEDGroupInfo med_group(group_index);
936 for (
Int32 z = 0; z < nb_group; ++z) {
943 for (; pos < MED_LNAME_SIZE; ++pos) {
944 char c = med_group_name[pos];
947 if (c ==
' ' || c ==
'_')
949 valid_name.
add(
static_cast<Byte>(c));
951 String name(valid_name.
view());
952 med_group.m_names.add(name);
953 info() <<
"Family id=" << family_number <<
" group='" << name <<
"'";
978 for (
String name : group_names)
979 pm->broadcastString(name, 0);
984 String current_group_name;
985 for (
Int32 i = 0; i < nb_group; ++i) {
986 pm->broadcastString(current_group_name, 0);
1000class MEDMeshReaderService
1001:
public BasicService
1015 return str ==
"med";
1018 [[maybe_unused]]
const XmlNode& mesh_element,
1021 [[maybe_unused]]
bool use_internal_partition)
override
1023 ARCANE_UNUSED(dir_name);
1025 return reader.readMesh(
mesh, file_name);
1044class MEDCaseMeshReader
1057 , m_read_info(read_info)
1064 ARCANE_UNUSED(build_info);
1069 String fname = m_read_info.fileName();
1070 m_trace_mng->info() <<
"MED Reader (ICaseMeshReader) file_name=" << fname;
1093 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.