From ec0166ab5200057f24498f4a010c0832e42a609f Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Fri, 23 Oct 2026 14:10:24 +0200 Subject: [PATCH 1/4] [arcane,core] In 'ItemTypeInfo' to directly keep the buffer ids instead of getting it from the underlying 'ItemTypeMng'. --- arcane/src/arcane/core/ItemTypeInfo.h | 7 ++-- arcane/src/arcane/core/ItemTypeInfoBuilder.cc | 39 ++++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/arcane/src/arcane/core/ItemTypeInfo.h b/arcane/src/arcane/core/ItemTypeInfo.h index 0378fc3f9..45b07618c 100644 --- a/arcane/src/arcane/core/ItemTypeInfo.h +++ b/arcane/src/arcane/core/ItemTypeInfo.h @@ -152,7 +152,7 @@ class ItemTypeInfo //! Local connectivity of the i-th edge of the cell LocalEdge localEdge(Integer id) const { - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; Integer fi = buf[m_first_item_index + id]; return LocalEdge(&buf[fi]); } @@ -160,14 +160,13 @@ class ItemTypeInfo //! Local connectivity of the i-th face of the cell LocalFace localFace(Integer id) const { - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; Integer fi = buf[m_first_item_index + m_nb_edge + id]; return LocalFace(&buf[fi]); } protected: - ItemTypeMng* m_mng = nullptr; ItemTypeId m_type_id{ IT_NullType }; ItemTypeId m_linear_type_id{ IT_NullType }; //! Dimension (-1) if not initialized. @@ -185,6 +184,8 @@ class ItemTypeInfo //! Index of this type in the list of indices of \a m_mng. Integer m_first_item_index = 0; String m_type_name; + ItemTypeMng* m_mng = nullptr; + Array* m_ids_buffer = nullptr; }; /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/core/ItemTypeInfoBuilder.cc b/arcane/src/arcane/core/ItemTypeInfoBuilder.cc index e87d02047..c6bcdfcba 100644 --- a/arcane/src/arcane/core/ItemTypeInfoBuilder.cc +++ b/arcane/src/arcane/core/ItemTypeInfoBuilder.cc @@ -46,6 +46,7 @@ setInfos(ItemTypeMng* mng, ItemTypeId type_id, String type_name, Dimension dimension, Int32 nb_node, Int32 nb_edge, Int32 nb_face) { m_mng = mng; + m_ids_buffer = &mng->m_ids_buffer; m_type_id = type_id; m_linear_type_id = type_id; m_dimension = static_cast(dimension); @@ -102,7 +103,7 @@ setOrder(Int16 order, ItemTypeId linear_type_id) void ItemTypeInfoBuilder:: addEdge(Int32 edge_index, Int32 n0, Int32 n1, Int32 f_left, Int32 f_right) { - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + edge_index] = buf.size(); buf.add(n0); buf.add(n1); @@ -116,7 +117,7 @@ addEdge(Int32 edge_index, Int32 n0, Int32 n1, Int32 f_left, Int32 f_right) void ItemTypeInfoBuilder:: addEdge2D(Integer edge_index, Integer n0, Integer n1) { - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + edge_index] = buf.size(); buf.add(n0); buf.add(n1); @@ -131,7 +132,7 @@ void ItemTypeInfoBuilder:: addFaceVertex(Integer face_index, Integer n0) { _checkDimension(1); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_FaceVertex); buf.add(1); @@ -146,7 +147,7 @@ void ItemTypeInfoBuilder:: addFaceLine(Integer face_index, Integer n0, Integer n1) { _checkDimension(2); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Line2); buf.add(2); @@ -177,7 +178,7 @@ void ItemTypeInfoBuilder:: addFaceLine3(Integer face_index, Integer n0, Integer n1, Integer n2) { _checkDimension(2); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Line3); buf.add(3); @@ -195,7 +196,7 @@ void ItemTypeInfoBuilder:: addFaceLine4(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3) { _checkDimension(2); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Line4); buf.add(4); @@ -213,7 +214,7 @@ void ItemTypeInfoBuilder:: addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Triangle3); buf.add(3); @@ -233,7 +234,7 @@ addFaceTriangle6(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Triangle6); buf.add(6); @@ -255,7 +256,7 @@ void ItemTypeInfoBuilder:: addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Quad4); buf.add(4); @@ -276,7 +277,7 @@ addFaceQuad8(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6, Integer n7) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Quad8); buf.add(8); @@ -301,7 +302,7 @@ addFaceQuad9(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6, Integer n7, Integer n8) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Quad9); buf.add(9); @@ -326,7 +327,7 @@ void ItemTypeInfoBuilder:: addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Pentagon5); buf.add(5); @@ -348,7 +349,7 @@ addFaceHexagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Hexagon6); buf.add(6); @@ -371,7 +372,7 @@ addFaceHeptagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer Integer n4, Integer n5, Integer n6) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Heptagon7); buf.add(7); @@ -395,7 +396,7 @@ addFaceOctogon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n Integer n4, Integer n5, Integer n6, Integer n7) { _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(IT_Octogon8); buf.add(8); @@ -421,7 +422,7 @@ addFaceGeneric(Integer face_index, Integer type_id, ConstArrayView n) // Currently, this method is only called for 2D faces, so // the current element must be of dimension 3. _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(type_id); Integer face_nb_node = n.size(); @@ -443,7 +444,7 @@ addFaceGeneric(Int32 face_index, ItemTypeId type_id, ConstArrayView nodes // Currently, this method is only called for 2D faces, so // the current element must be of dimension 3. _checkDimension(3); - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; buf[m_first_item_index + m_nb_edge + face_index] = buf.size(); buf.add(type_id); Integer face_nb_node = nodes.size(); @@ -463,7 +464,7 @@ computeFaceEdgeInfos() { Integer cell_nb_edge = nbLocalEdge(); for (Integer i_face = 0; i_face < nbLocalFace(); ++i_face) { - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; Integer fi = buf[m_first_item_index + m_nb_edge + i_face]; Integer* index = &buf[fi]; LocalFace local_face(index); @@ -503,7 +504,7 @@ _setNbEdgeAndFace(Integer nb_edge, Integer nb_face) m_nb_edge = nb_edge; Integer total = m_nb_face + m_nb_edge; if (total != 0) { - Array& buf = m_mng->m_ids_buffer; + Array& buf = *m_ids_buffer; m_first_item_index = buf.size(); buf.resize(m_first_item_index + total); } From 771c9f938493a20d4c51f70b3cd40b4c9e0145b8 Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Fri, 23 Oct 2026 14:12:58 +0200 Subject: [PATCH 2/4] [arcane,core] Make fields of ItemTypeInfo private and give access only to ItemTypeInfoBuilder. --- arcane/src/arcane/core/ItemTypeInfo.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arcane/src/arcane/core/ItemTypeInfo.h b/arcane/src/arcane/core/ItemTypeInfo.h index 45b07618c..b9909d58c 100644 --- a/arcane/src/arcane/core/ItemTypeInfo.h +++ b/arcane/src/arcane/core/ItemTypeInfo.h @@ -44,6 +44,8 @@ namespace Arcane */ class ItemTypeInfo { + friend ItemTypeInfoBuilder; + public: /*! @@ -165,7 +167,7 @@ class ItemTypeInfo return LocalFace(&buf[fi]); } - protected: + private: ItemTypeId m_type_id{ IT_NullType }; ItemTypeId m_linear_type_id{ IT_NullType }; From 73c74aca437c3229437ac13e35519229fd8c45ac Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Fri, 23 Oct 2026 14:40:10 +0200 Subject: [PATCH 3/4] [arcane,core] Do not use 'ItemTypeMng' in 'ItemTypeInfo'. --- arcane/src/arcane/core/ItemTypeInfo.h | 14 +++-- arcane/src/arcane/core/ItemTypeInfoBuilder.cc | 9 +++ arcane/src/arcane/core/ItemTypeInfoBuilder.h | 1 - arcane/src/arcane/core/ItemTypeMng.cc | 60 +++++++++---------- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/arcane/src/arcane/core/ItemTypeInfo.h b/arcane/src/arcane/core/ItemTypeInfo.h index b9909d58c..0f35e1310 100644 --- a/arcane/src/arcane/core/ItemTypeInfo.h +++ b/arcane/src/arcane/core/ItemTypeInfo.h @@ -15,15 +15,18 @@ /*---------------------------------------------------------------------------*/ #include "arcane/utils/String.h" +#include "arcane/utils/Array.h" -#include "arcane/core/ItemTypeMng.h" #include "arcane/core/ItemTypeId.h" +// No longer used but keep for compatibility +#include "arcane/core/ItemTypeMng.h" /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ namespace Arcane { +class ItemTypeMng; /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -44,7 +47,7 @@ namespace Arcane */ class ItemTypeInfo { - friend ItemTypeInfoBuilder; + friend class ItemTypeInfoBuilder; public: @@ -137,7 +140,7 @@ class ItemTypeInfo //! Type of the corresponding linear element ItemTypeId linearItemTypeId() const { return m_linear_type_id; } //! Type of the corresponding linear element - const ItemTypeInfo* linearTypeInfo() const { return m_mng->typeFromId(m_linear_type_id); } + const ItemTypeInfo* linearTypeInfo() const { return m_linear_type; } //! Indicates if the type has a center node bool hasCenterNode() const { return m_has_center_node; } /*! @@ -145,9 +148,9 @@ class ItemTypeInfo * * A polygon is a 2D element of order 1 containing at least 5 nodes. */ - bool isPolygon() const { return m_is_poly && m_dimension==2; } + bool isPolygon() const { return m_is_poly && m_dimension == 2; } //! Indicates if the type is a polyhedron - bool isPolyhedron() const { return m_is_poly && m_dimension==3; } + bool isPolyhedron() const { return m_is_poly && m_dimension == 3; } public: @@ -186,6 +189,7 @@ class ItemTypeInfo //! Index of this type in the list of indices of \a m_mng. Integer m_first_item_index = 0; String m_type_name; + const ItemTypeInfo* m_linear_type = this; ItemTypeMng* m_mng = nullptr; Array* m_ids_buffer = nullptr; }; diff --git a/arcane/src/arcane/core/ItemTypeInfoBuilder.cc b/arcane/src/arcane/core/ItemTypeInfoBuilder.cc index c6bcdfcba..7bd81ad9c 100644 --- a/arcane/src/arcane/core/ItemTypeInfoBuilder.cc +++ b/arcane/src/arcane/core/ItemTypeInfoBuilder.cc @@ -94,6 +94,15 @@ setOrder(Int16 order, ItemTypeId linear_type_id) { m_order = order; m_linear_type_id = linear_type_id; + // We can not use m_mng->typeFromId() here because 'm_mng' is not yet initialized + if (!m_mng) + ARCANE_FATAL("You have to call setInfos() before calling setOrder()"); + m_linear_type = m_mng->m_types[linear_type_id]; + // Make sure the linear type is already created and coherent + if (!m_linear_type) + ARCANE_FATAL("Null linear type for type_id '{0} - {1}' linear_type_id={2}", m_type_id, m_type_name, linear_type_id); + if (m_linear_type->itemTypeId() != linear_type_id) + ARCANE_FATAL("Incoherent type '{0}' and type_id '{1}'", m_linear_type->itemTypeId(), linear_type_id); _checkSetIsPolygon(); } diff --git a/arcane/src/arcane/core/ItemTypeInfoBuilder.h b/arcane/src/arcane/core/ItemTypeInfoBuilder.h index 625e3dbb2..d78f60a89 100644 --- a/arcane/src/arcane/core/ItemTypeInfoBuilder.h +++ b/arcane/src/arcane/core/ItemTypeInfoBuilder.h @@ -26,7 +26,6 @@ namespace Arcane /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ - /*! * \internal * \brief Construction of the information for a mesh entity type. diff --git a/arcane/src/arcane/core/ItemTypeMng.cc b/arcane/src/arcane/core/ItemTypeMng.cc index 26beca60d..7a1dc94c7 100644 --- a/arcane/src/arcane/core/ItemTypeMng.cc +++ b/arcane/src/arcane/core/ItemTypeMng.cc @@ -287,30 +287,6 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) type->addEdge(2, 2, 0, 0, 1); } - // Cell3D_Triangle10 - { - ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); - m_types[IT_Cell3D_Triangle10] = type; - Int32 nb_face = 3; - Int32 nb_edge = 0; - if (is_non_manifold) - std::swap(nb_face, nb_edge); - - type->setInfos(this, IT_Cell3D_Triangle6, "Cell3D_Triangle10", Dimension::Dim2, 6, nb_edge, nb_face); - type->setOrder(2, ITI_Cell3D_Triangle3); - - if (is_non_manifold) { - type->addEdge2D(0, 0, 1); - type->addEdge2D(1, 1, 2); - type->addEdge2D(2, 2, 0); - } - else { - type->addFaceLine4(0, 0, 1, 3, 4); - type->addFaceLine4(1, 1, 2, 5, 6); - type->addFaceLine4(2, 2, 0, 7, 8); - } - } - // Quad4 { _addPolygonType(IT_Quad4, 4, "Quad4"); @@ -482,8 +458,8 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) { ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); m_types[IT_Pyramid13] = type; - type->setOrder(2, ITI_Pyramid5); type->setInfos(this, IT_Pyramid13, "Pyramid13", Dimension::Dim3, 13, 8, 5); + type->setOrder(2, ITI_Pyramid5); type->addFaceQuad8(0, 0, 3, 2, 1, 5, 6, 7, 8); type->addFaceTriangle6(1, 0, 4, 3, 9, 12, 8); @@ -529,9 +505,9 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) { ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); m_types[IT_Pentaedron15] = type; - type->setOrder(2, ITI_Pentaedron15); type->setInfos(this, IT_Pentaedron15, "Pentaedron15", Dimension::Dim3, 15, 9, 5); + type->setOrder(2, ITI_Pentaedron15); type->addFaceTriangle6(0, 0, 2, 1, 6, 7, 8); type->addFaceQuad8(1, 0, 3, 5, 2, 12, 11, 14, 8); @@ -959,9 +935,9 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) { ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); m_types[IT_CellLine3] = type; - type->setOrder(2, ITI_CellLine2); type->setInfos(this, IT_CellLine3, "CellLine3", Dimension::Dim1, 3, 0, 2); + type->setOrder(2, ITI_CellLine2); type->addFaceVertex(0, 0); type->addFaceVertex(1, 1); @@ -971,9 +947,9 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) { ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); m_types[IT_CellLine4] = type; - type->setOrder(3, ITI_CellLine2); type->setInfos(this, IT_CellLine4, "CellLine4", Dimension::Dim1, 4, 0, 2); + type->setOrder(3, ITI_CellLine2); type->addFaceVertex(0, 0); type->addFaceVertex(1, 1); @@ -983,18 +959,18 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) { ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); m_types[IT_Cell3D_Line3] = type; - type->setOrder(2, ITI_Cell3D_Line2); type->setInfos(this, IT_Cell3D_Line3, "Cell3D_Line3", Dimension::Dim1, 3, 0, 0); + type->setOrder(2, ITI_Cell3D_Line2); } // Cell3D_Line4 { ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); m_types[IT_Cell3D_Line4] = type; - type->setOrder(3, ITI_Cell3D_Line2); type->setInfos(this, IT_Cell3D_Line4, "Cell3D_Line4", Dimension::Dim1, 4, 0, 0); + type->setOrder(3, ITI_Cell3D_Line2); } // Cell3D_Triangle3 @@ -1044,6 +1020,30 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) } } + // Cell3D_Triangle10 + { + ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); + m_types[IT_Cell3D_Triangle10] = type; + Int32 nb_face = 3; + Int32 nb_edge = 0; + if (is_non_manifold) + std::swap(nb_face, nb_edge); + + type->setInfos(this, IT_Cell3D_Triangle6, "Cell3D_Triangle10", Dimension::Dim2, 6, nb_edge, nb_face); + type->setOrder(2, ITI_Cell3D_Triangle3); + + if (is_non_manifold) { + type->addEdge2D(0, 0, 1); + type->addEdge2D(1, 1, 2); + type->addEdge2D(2, 2, 0); + } + else { + type->addFaceLine4(0, 0, 1, 3, 4); + type->addFaceLine4(1, 1, 2, 5, 6); + type->addFaceLine4(2, 2, 0, 7, 8); + } + } + // Cell3D_Quad4 { ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); From 1ad710379903d249d496bc5e50c386e94f332202 Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Fri, 23 Oct 2026 15:34:07 +0200 Subject: [PATCH 4/4] [arcane,core] In ItemTypeInfoBuilder, set the linear type using 'ItemTypeInfo' instead of 'ItemTypeId'. This way we no longer using ItemTypeMng. --- arcane/src/arcane/core/ItemTypeInfoBuilder.cc | 16 +++----- arcane/src/arcane/core/ItemTypeInfoBuilder.h | 5 ++- arcane/src/arcane/core/ItemTypeMng.cc | 38 +++++++++---------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/arcane/src/arcane/core/ItemTypeInfoBuilder.cc b/arcane/src/arcane/core/ItemTypeInfoBuilder.cc index 7bd81ad9c..538124ae2 100644 --- a/arcane/src/arcane/core/ItemTypeInfoBuilder.cc +++ b/arcane/src/arcane/core/ItemTypeInfoBuilder.cc @@ -90,19 +90,13 @@ setInfos(ItemTypeMng* mng, Int16 type_id, String type_name, Dimension dimension, /*---------------------------------------------------------------------------*/ void ItemTypeInfoBuilder:: -setOrder(Int16 order, ItemTypeId linear_type_id) +setOrder(Int16 order, ItemTypeInfo* linear_type) { + if (!linear_type) + ARCANE_FATAL("Null linear type for type '{0}'", m_type_name); m_order = order; - m_linear_type_id = linear_type_id; - // We can not use m_mng->typeFromId() here because 'm_mng' is not yet initialized - if (!m_mng) - ARCANE_FATAL("You have to call setInfos() before calling setOrder()"); - m_linear_type = m_mng->m_types[linear_type_id]; - // Make sure the linear type is already created and coherent - if (!m_linear_type) - ARCANE_FATAL("Null linear type for type_id '{0} - {1}' linear_type_id={2}", m_type_id, m_type_name, linear_type_id); - if (m_linear_type->itemTypeId() != linear_type_id) - ARCANE_FATAL("Incoherent type '{0}' and type_id '{1}'", m_linear_type->itemTypeId(), linear_type_id); + m_linear_type = linear_type; + m_linear_type_id = linear_type->itemTypeId(); _checkSetIsPolygon(); } diff --git a/arcane/src/arcane/core/ItemTypeInfoBuilder.h b/arcane/src/arcane/core/ItemTypeInfoBuilder.h index d78f60a89..3b5d24796 100644 --- a/arcane/src/arcane/core/ItemTypeInfoBuilder.h +++ b/arcane/src/arcane/core/ItemTypeInfoBuilder.h @@ -94,12 +94,13 @@ class ItemTypeInfoBuilder Int32 nb_node, Int32 nb_edge, Int32 nb_face); /*! - * \brief Positions the order of the type. + * \brief Set the order of the type. * * If not called, the type is considered to be for order 1 entities. * The first argument is the entity order and the second is the corresponding order 1 element. + * You have to call setInfos() before calling this method. */ - void setOrder(Int16 order, ItemTypeId linear_type); + void setOrder(Int16 order, ItemTypeInfo* linear_type); /*! * \brief Adds an edge to the list of edges diff --git a/arcane/src/arcane/core/ItemTypeMng.cc b/arcane/src/arcane/core/ItemTypeMng.cc index 7a1dc94c7..9ec77f0d8 100644 --- a/arcane/src/arcane/core/ItemTypeMng.cc +++ b/arcane/src/arcane/core/ItemTypeMng.cc @@ -206,7 +206,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Line3] = type; type->setInfos(this, IT_Line3, "Line3", Dimension::Dim1, 3, 0, 0); - type->setOrder(2, ITI_Line2); + type->setOrder(2, m_types[ITI_Line2]); type->setIsValidForCell(false); } @@ -216,7 +216,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Line4] = type; type->setInfos(this, IT_Line4, "Line4", Dimension::Dim1, 4, 0, 0); - type->setOrder(3, ITI_Line2); + type->setOrder(3, m_types[ITI_Line2]); type->setIsValidForCell(false); } @@ -257,7 +257,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Triangle6] = type; type->setInfos(this, IT_Triangle6, "Triangle6", Dimension::Dim2, 6, 3, 3); - type->setOrder(2, ITI_Triangle3); + type->setOrder(2, m_types[ITI_Triangle3]); type->addFaceLine3(0, 0, 1, 3); type->addFaceLine3(1, 1, 2, 4); @@ -275,7 +275,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Triangle10] = type; type->setInfos(this, IT_Triangle10, "Triangle10", Dimension::Dim2, 10, 3, 3); - type->setOrder(3, ITI_Triangle3); + type->setOrder(3, m_types[ITI_Triangle3]); type->setHasCenterNode(true); type->addFaceLine4(0, 0, 1, 3, 4); @@ -298,7 +298,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Quad8] = type; type->setInfos(this, IT_Quad8, "Quad8", Dimension::Dim2, 8, 4, 4); - type->setOrder(2, ITI_Quad4); + type->setOrder(2, m_types[ITI_Quad4]); type->addFaceLine3(0, 0, 1, 4); type->addFaceLine3(1, 1, 2, 5); @@ -318,7 +318,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Quad9] = type; type->setInfos(this, IT_Quad9, "Quad9", Dimension::Dim2, 9, 4, 4); - type->setOrder(2, ITI_Quad4); + type->setOrder(2, m_types[ITI_Quad4]); type->setHasCenterNode(true); type->addFaceLine3(0, 0, 1, 4); @@ -377,7 +377,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Hexaedron20] = type; type->setInfos(this, IT_Hexaedron20, "Hexaedron20", Dimension::Dim3, 20, 12, 6); - type->setOrder(2, ITI_Hexaedron8); + type->setOrder(2, m_types[ITI_Hexaedron8]); type->addFaceQuad8(0, 0, 4, 7, 3, 16, 15, 19, 11); type->addFaceQuad8(1, 1, 2, 6, 5, 9, 18, 13, 17); @@ -407,7 +407,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Hexaedron27] = type; type->setInfos(this, IT_Hexaedron27, "Hexaedron27", Dimension::Dim3, 27, 12, 6); - type->setOrder(2, ITI_Hexaedron8); + type->setOrder(2, m_types[ITI_Hexaedron8]); type->setHasCenterNode(true); type->addFaceQuad9(0, 0, 4, 7, 3, 16, 15, 19, 11, 20); @@ -459,7 +459,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) ItemTypeInfoBuilder* type = m_types_buffer->allocOne(); m_types[IT_Pyramid13] = type; type->setInfos(this, IT_Pyramid13, "Pyramid13", Dimension::Dim3, 13, 8, 5); - type->setOrder(2, ITI_Pyramid5); + type->setOrder(2, m_types[ITI_Pyramid5]); type->addFaceQuad8(0, 0, 3, 2, 1, 5, 6, 7, 8); type->addFaceTriangle6(1, 0, 4, 3, 9, 12, 8); @@ -507,7 +507,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Pentaedron15] = type; type->setInfos(this, IT_Pentaedron15, "Pentaedron15", Dimension::Dim3, 15, 9, 5); - type->setOrder(2, ITI_Pentaedron15); + type->setOrder(2, m_types[ITI_Pentaedron6]); type->addFaceTriangle6(0, 0, 2, 1, 6, 7, 8); type->addFaceQuad8(1, 0, 3, 5, 2, 12, 11, 14, 8); @@ -553,7 +553,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Tetraedron10] = type; type->setInfos(this, IT_Tetraedron10, "Tetraedron10", Dimension::Dim3, 10, 6, 4); - type->setOrder(2, ITI_Tetraedron4); + type->setOrder(2, m_types[ITI_Tetraedron4]); type->addFaceTriangle6(0, 0, 2, 1, 6, 5, 4); type->addFaceTriangle6(1, 0, 3, 2, 7, 9, 6); @@ -937,7 +937,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_CellLine3] = type; type->setInfos(this, IT_CellLine3, "CellLine3", Dimension::Dim1, 3, 0, 2); - type->setOrder(2, ITI_CellLine2); + type->setOrder(2, m_types[ITI_CellLine2]); type->addFaceVertex(0, 0); type->addFaceVertex(1, 1); @@ -949,7 +949,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_CellLine4] = type; type->setInfos(this, IT_CellLine4, "CellLine4", Dimension::Dim1, 4, 0, 2); - type->setOrder(3, ITI_CellLine2); + type->setOrder(3, m_types[ITI_CellLine2]); type->addFaceVertex(0, 0); type->addFaceVertex(1, 1); @@ -961,7 +961,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Cell3D_Line3] = type; type->setInfos(this, IT_Cell3D_Line3, "Cell3D_Line3", Dimension::Dim1, 3, 0, 0); - type->setOrder(2, ITI_Cell3D_Line2); + type->setOrder(2, m_types[ITI_Cell3D_Line2]); } // Cell3D_Line4 @@ -970,7 +970,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) m_types[IT_Cell3D_Line4] = type; type->setInfos(this, IT_Cell3D_Line4, "Cell3D_Line4", Dimension::Dim1, 4, 0, 0); - type->setOrder(3, ITI_Cell3D_Line2); + type->setOrder(3, m_types[ITI_Cell3D_Line2]); } // Cell3D_Triangle3 @@ -1006,7 +1006,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) std::swap(nb_face, nb_edge); type->setInfos(this, IT_Cell3D_Triangle6, "Cell3D_Triangle6", Dimension::Dim2, 6, nb_edge, nb_face); - type->setOrder(2, ITI_Cell3D_Triangle3); + type->setOrder(2, m_types[ITI_Cell3D_Triangle3]); if (is_non_manifold) { type->addEdge2D(0, 0, 1); @@ -1030,7 +1030,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) std::swap(nb_face, nb_edge); type->setInfos(this, IT_Cell3D_Triangle6, "Cell3D_Triangle10", Dimension::Dim2, 6, nb_edge, nb_face); - type->setOrder(2, ITI_Cell3D_Triangle3); + type->setOrder(2, m_types[ITI_Cell3D_Triangle3]); if (is_non_manifold) { type->addEdge2D(0, 0, 1); @@ -1079,7 +1079,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) std::swap(nb_face, nb_edge); type->setInfos(this, IT_Cell3D_Quad8, "Cell3D_Quad8", Dimension::Dim2, 8, nb_edge, nb_face); - type->setOrder(2, ITI_Cell3D_Quad4); + type->setOrder(2, m_types[ITI_Cell3D_Quad4]); if (is_non_manifold) { type->addEdge2D(0, 0, 1); @@ -1106,7 +1106,7 @@ _buildTypes(IMesh* mesh, IParallelSuperMng* parallel_mng, ITraceMng* trace) std::swap(nb_face, nb_edge); type->setInfos(this, IT_Cell3D_Quad9, "Cell3D_Quad9", Dimension::Dim2, 9, nb_edge, nb_face); - type->setOrder(2, ITI_Cell3D_Quad4); + type->setOrder(2, m_types[ITI_Cell3D_Quad4]); if (is_non_manifold) { type->addEdge2D(0, 0, 1);