14#include "arcane/utils/CheckedConvert.h"
15#include "arcane/utils/List.h"
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/OStringStream.h"
18#include "arcane/utils/StringBuilder.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/JSONWriter.h"
21#include "arcane/utils/IHashAlgorithm.h"
24#include "arcane/core/IVariableMng.h"
25#include "arcane/core/VariableTypes.h"
26#include "arcane/core/ISubDomain.h"
27#include "arcane/core/StdNum.h"
28#include "arcane/core/MeshVariableInfo.h"
29#include "arcane/core/Variable.h"
30#include "arcane/core/IMesh.h"
31#include "arcane/core/IMeshSubMeshTransition.h"
33#include "arcane/core/ItemGroup.h"
34#include "arcane/core/Item.h"
35#include "arcane/core/ItemCompare.h"
36#include "arcane/core/ItemPrinter.h"
38#include "arcane/core/XmlNode.h"
39#include "arcane/core/XmlNodeList.h"
40#include "arcane/core/IParallelMng.h"
41#include "arcane/core/IIOMng.h"
42#include "arcane/core/IXmlDocumentHolder.h"
43#include "arcane/core/IItemFamily.h"
44#include "arcane/core/VariableCollection.h"
45#include "arcane/core/ITiedInterface.h"
46#include "arcane/core/SharedVariable.h"
47#include "arcane/core/MeshVisitor.h"
48#include "arcane/core/IMeshUtilities.h"
49#include "arcane/core/IVariableSynchronizer.h"
50#include "arcane/core/UnstructuredMeshConnectivity.h"
51#include "arcane/core/datatype/DataAllocationInfo.h"
73template <
class ValueType>
inline void
80template <>
inline void
89template <>
inline void
90_writeValue(ITraceMng* trace,
const String& name, Real3x3 v)
92 Integer wl = CheckedConvert::toInteger(62 - name.length());
93 trace->pinfo() << name <<
".xx" << Trace::Width(wl) << v.x.x;
94 trace->pinfo() << name <<
".xy" << Trace::Width(wl) << v.x.y;
95 trace->pinfo() << name <<
".xz" << Trace::Width(wl) << v.x.z;
97 trace->pinfo() << name <<
".yx" << Trace::Width(wl) << v.y.x;
98 trace->pinfo() << name <<
".yy" << Trace::Width(wl) << v.y.y;
99 trace->pinfo() << name <<
".yz" << Trace::Width(wl) << v.y.z;
101 trace->pinfo() << name <<
".zx" << Trace::Width(wl) << v.z.x;
102 trace->pinfo() << name <<
".zy" << Trace::Width(wl) << v.z.y;
103 trace->pinfo() << name <<
".zz" << Trace::Width(wl) << v.z.z;
106template <
class ItemType,
class ValueType>
inline void
115 for (VariableCollection::Enumerator i(variables); ++i;) {
122 if (group.itemKind() != item_kind)
125 const String& name = vp->name();
126 auto* v =
dynamic_cast<VariableScalarTrueType*
>(vp);
129 if (values.size() < item.localId()) {
130 trace->error() <<
"Dimensions invalides pour la variable '" << name <<
"' "
131 <<
"(taille=" << values.size() <<
" index=" << item.localId();
134 _writeValue(trace, name, values[item.localId()]);
137 auto* v2 =
dynamic_cast<VariableArrayTrueType*
>(vp);
141 if (values.dim1Size() < lid) {
142 trace->error() <<
"Dimensions invalides pour la variable '" << name <<
"' "
143 <<
"(taille=" << values.dim1Size() <<
" index=" << lid;
146 Integer n = values[lid].size();
147 for (
Integer z = 0; z < n; ++z) {
148 _writeValue(trace, name +
"[" + z +
"]", values[lid][z]);
161 Integer sid = sd->subDomainId();
169 Integer nb_edge = cell.nbEdge();
170 Integer nb_face = cell.nbFace();
172 trace->pinfo() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
173 trace->pinfo() <<
"** -- Affichage des informations pour la maille " << cell.uniqueId();
174 trace->pinfo() <<
"** -- Structure:";
175 trace->pinfo() <<
"id unique: " <<
Trace::Width(5) << cell.uniqueId();
176 trace->pinfo() <<
"id local: " <<
Trace::Width(5) << cell.localId();
177 trace->pinfo() <<
"propriétaire: " <<
Trace::Width(5) << cell.owner();
178 trace->pinfo() <<
"type: " <<
Trace::Width(5) << cell.typeInfo()->typeName();
180 trace->pinfo() <<
"nombre de nœuds: " <<
Trace::Width(5) << nb_node;
181 for (
Integer i = 0; i < nb_node; ++i)
182 trace->pinfo() <<
"id unique du nœud " <<
Trace::Width(2)
183 << i <<
" : " <<
Trace::Width(5) << cell.node(i).uniqueId();
185 trace->pinfo() <<
"nombre d'arêtes: " <<
Trace::Width(5) << nb_edge;
186 for (
Integer i = 0; i < nb_edge; ++i)
187 trace->pinfo() <<
"id unique de l'arête " <<
Trace::Width(2)
188 << i <<
" : " <<
Trace::Width(5) << cell.edge(i).uniqueId();
190 trace->pinfo() <<
"nombre de faces: " <<
Trace::Width(5) << nb_face;
191 for (
Integer i = 0; i < nb_face; ++i)
192 trace->pinfo() <<
"id local de la face " <<
Trace::Width(2)
195 trace->pinfo() <<
"** -- Variables:";
196 _writeInfo<Cell, Real>(sd, variables, cell);
197 _writeInfo<Cell, Real2>(sd, variables, cell);
198 _writeInfo<Cell, Real3>(sd, variables, cell);
199 _writeInfo<Cell, Real2x2>(sd, variables, cell);
200 _writeInfo<Cell, Real3x3>(sd, variables, cell);
201 _writeInfo<Cell, Int32>(sd, variables, cell);
202 _writeInfo<Cell, Int64>(sd, variables, cell);
204 trace->pinfo() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
207 for (
Integer i = 0; i < nb_node; ++i)
208 writeMeshItemInfo(sd, cell.node(i),
false);
209 for (
Integer i = 0; i < nb_edge; ++i)
210 writeMeshItemInfo(sd, cell.edge(i),
false);
211 for (
Integer i = 0; i < nb_face; ++i)
212 writeMeshItemInfo(sd, cell.face(i),
false);
234 trace->
pinfo() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
235 trace->
pinfo() <<
"** -- Affichage des informations pour le nœud " << node.
uniqueId();
236 trace->
pinfo() <<
"** -- Structure:";
247 for (
Integer i = 0; i < nb_face; ++i)
251 trace->
pinfo() <<
"** -- Variables:";
252 _writeInfo<Node, Real>(sd, variables, node);
253 _writeInfo<Node, Real2>(sd, variables, node);
254 _writeInfo<Node, Real3>(sd, variables, node);
255 _writeInfo<Node, Real2x2>(sd, variables, node);
256 _writeInfo<Node, Real3x3>(sd, variables, node);
257 _writeInfo<Node, Int32>(sd, variables, node);
258 _writeInfo<Node, Int64>(sd, variables, node);
261 for (
Integer i = 0; i < nb_cell; ++i)
262 writeMeshItemInfo(sd, node.
cell(i),
false);
263 for (
Integer i = 0; i < nb_edge; ++i)
264 writeMeshItemInfo(sd, node.
edge(i),
false);
265 for (
Integer i = 0; i < nb_face; ++i)
266 writeMeshItemInfo(sd, node.
face(i),
false);
274writeMeshItemInfo(ISubDomain* sd, Edge edge,
bool depend_info)
276 ITraceMng* trace = sd->traceMng();
277 Integer sid = sd->subDomainId();
278 StringBuilder buf(
"Info-");
280 Trace::Setter mci(trace, buf.
toString());
282 VariableCollection variables(sd->variableMng()->usedVariables());
284 Integer nb_cell = edge.nbCell();
285 Integer nb_face = edge.nbFace();
286 Integer nb_node = edge.nbNode();
288 trace->pinfo() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
289 trace->pinfo() <<
"** -- Affichage des informations pour l'arête " << edge.localId() <<
" (localid)";
290 trace->pinfo() <<
"** -- Structure:";
291 trace->pinfo() <<
"id unique: " << Trace::Width(5) <<
"None";
292 trace->pinfo() <<
"id local: " << Trace::Width(5) << edge.localId();
293 trace->pinfo() <<
"propriétaire: " << Trace::Width(5) << edge.owner();
295 trace->pinfo() <<
"nombre de nœuds: " << Trace::Width(5) << nb_node;
296 for (
Integer i = 0; i < nb_node; ++i)
297 trace->pinfo() <<
"id unique du nœud " << Trace::Width(2)
298 << i <<
" : " << Trace::Width(5) << edge.node(i).uniqueId();
300 trace->pinfo() <<
"nombre de mailles: " << Trace::Width(5) << nb_cell;
301 for (
Integer i = 0; i < nb_cell; ++i)
302 trace->pinfo() <<
"id unique de la maille " << Trace::Width(2)
303 << i <<
" : " << Trace::Width(5) << edge.cell(i).uniqueId();
305 trace->pinfo() <<
"** -- Variables:";
306 _writeInfo<Edge, Real>(sd, variables, edge);
307 _writeInfo<Edge, Real2>(sd, variables, edge);
308 _writeInfo<Edge, Real3>(sd, variables, edge);
309 _writeInfo<Edge, Real2x2>(sd, variables, edge);
310 _writeInfo<Edge, Real3x3>(sd, variables, edge);
311 _writeInfo<Edge, Int32>(sd, variables, edge);
312 _writeInfo<Edge, Int64>(sd, variables, edge);
315 for (
Integer i = 0; i < nb_node; ++i)
316 writeMeshItemInfo(sd, edge.node(i),
false);
317 for (
Integer i = 0; i < nb_face; ++i)
318 writeMeshItemInfo(sd, edge.face(i),
false);
319 for (
Integer i = 0; i < nb_cell; ++i)
320 writeMeshItemInfo(sd, edge.cell(i),
false);
331 Integer sid = sd->subDomainId();
338 Integer nb_cell = face.nbCell();
339 Integer nb_edge = face.nbEdge();
340 Integer nb_node = face.nbNode();
342 trace->pinfo() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
343 trace->pinfo() <<
"** -- Affichage des informations pour la face " << face.localId() <<
" (localid)";
344 trace->pinfo() <<
"** -- Structure:";
345 trace->pinfo() <<
"id unique: " <<
Trace::Width(5) <<
"None";
346 trace->pinfo() <<
"id local: " <<
Trace::Width(5) << face.localId();
347 trace->pinfo() <<
"propriétaire: " <<
Trace::Width(5) << face.owner();
349 trace->pinfo() <<
"nombre de nœuds: " <<
Trace::Width(5) << nb_node;
350 for (
Integer i = 0; i < nb_node; ++i)
351 trace->pinfo() <<
"id unique du nœud " <<
Trace::Width(2)
352 << i <<
" : " <<
Trace::Width(5) << face.node(i).uniqueId();
354 trace->pinfo() <<
"nombre de mailles: " <<
Trace::Width(5) << nb_cell;
355 for (
Integer i = 0; i < nb_cell; ++i)
356 trace->pinfo() <<
"id unique de la maille " <<
Trace::Width(2)
357 << i <<
" : " <<
Trace::Width(5) << face.cell(i).uniqueId();
359 trace->pinfo() <<
"** -- Variables:";
360 _writeInfo<Face, Real>(sd, variables, face);
361 _writeInfo<Face, Real2>(sd, variables, face);
362 _writeInfo<Face, Real3>(sd, variables, face);
363 _writeInfo<Face, Real2x2>(sd, variables, face);
364 _writeInfo<Face, Real3x3>(sd, variables, face);
365 _writeInfo<Face, Int32>(sd, variables, face);
366 _writeInfo<Face, Int64>(sd, variables, face);
369 for (
Integer i = 0; i < nb_node; ++i)
370 writeMeshItemInfo(sd, face.node(i),
false);
371 for (
Integer i = 0; i < nb_edge; ++i)
372 writeMeshItemInfo(sd, face.edge(i),
false);
373 for (
Integer i = 0; i < nb_cell; ++i)
374 writeMeshItemInfo(sd, face.cell(i),
false);
385 bool operator()(
const Node& node1,
const Node& node2)
387 const Real3& r1 = m_coords[node1];
388 const Real3& r2 = m_coords[node2];
395 : m_items(mesh->itemsInternal(
IK_Node))
403class _CompareItemWithNodes
416 for (
Integer i = 0; i < n; ++i) {
429 : m_items(mesh->itemsInternal(ik))
430 , m_nodes_sorted_id(nodes_sorted_id)
443 ofile <<
" " << name <<
" " << nb_sub_item <<
" (";
444 for (
Integer i = 0; i < nb_sub_item; ++i)
445 ofile <<
' ' << ids[i];
468 for (
Integer i = 0; i < nb_edge; ++i)
469 ids[i] = item.edgeId(i);
480 for (
Integer i = 0; i < nb_cell; ++i)
481 ids[i] = item.cellId(i);
492 for (
Integer i = 0; i < nb_face; ++i)
493 ids[i] = item.faceId(i);
504 for (
Integer i = 0; i < nb_node; ++i)
505 ids[i] = item.nodeId(i);
512 Integer n = filler.nbItem(item);
514 filler.fillLocalIds(item, local_ids);
515 for (
Integer i = 0; i < n; ++i)
516 local_ids[i] = sorted_ids[local_ids[i]];
523writeMeshInfosSorted(
IMesh* mesh,
const String& file_name)
527 std::ofstream ofile(file_name.
localstr());
529 Integer nb_node = mesh->nbNode();
530 Integer nb_edge = mesh->nbEdge();
531 Integer nb_face = mesh->nbFace();
532 Integer nb_cell = mesh->nbCell();
533 ofile <<
"** Maillage Trié --> "
534 <<
" Nœuds " << nb_node
535 <<
" Arêtes " << nb_edge
536 <<
" Faces " << nb_face
537 <<
" Mailles " << nb_cell
551 for (
Integer i = 0; i < nb_node; ++i)
552 sorted_nodes[i] = nodes[i];
556 std::sort(std::begin(sorted_nodes), std::end(sorted_nodes), compare_nodes);
558 for (
Integer i = 0; i < nb_node; ++i)
559 nodes_sorted_id[sorted_nodes[i].localId()] = i;
563 for (
Integer i = 0; i < nb_edge; ++i)
564 sorted_edges[i] = edges[i];
567 std::sort(std::begin(sorted_edges), std::end(sorted_edges), compare_edges);
569 for (
Integer i = 0; i < nb_edge; ++i)
570 edges_sorted_id[sorted_edges[i].localId()] = i;
574 for (
Integer i = 0; i < nb_face; ++i)
575 sorted_faces[i] = faces[i];
578 std::sort(std::begin(sorted_faces), std::end(sorted_faces), compare_faces);
580 for (
Integer i = 0; i < nb_face; ++i)
581 faces_sorted_id[sorted_faces[i].localId()] = i;
585 for (
Integer i = 0; i < nb_cell; ++i)
586 sorted_cells[i] = cells[i];
589 std::sort(std::begin(sorted_cells), std::end(sorted_cells), compare_cells);
591 for (
Integer i = 0; i < nb_cell; ++i)
592 cells_sorted_id[sorted_cells[i].localId()] = i;
596 ofile <<
"** Nœuds\n";
598 for (
Integer i = 0; i < nb_node; ++i) {
599 const Node& node = sorted_nodes[i];
600 ofile <<
"Nœud: " << i <<
" Coordonnée: " << coords[node];
602 _fillSorted(node, lids, edges_sorted_id,
EdgeFiller());
603 std::sort(std::begin(lids), std::end(lids));
604 _writeItems(ofile,
"Arêtes", lids);
606 _fillSorted(node, lids, faces_sorted_id,
FaceFiller());
607 std::sort(std::begin(lids), std::end(lids));
608 _writeItems(ofile,
"Faces", lids);
610 _fillSorted(node, lids, cells_sorted_id,
CellFiller());
611 std::sort(std::begin(lids), std::end(lids));
612 _writeItems(ofile,
"Mailles", lids);
617 ofile <<
"** Arêtes\n";
618 for (
Integer i = 0; i < nb_edge; ++i) {
619 Edge edge = sorted_edges[i];
623 ofile <<
"Arête: " << i
624 <<
" Nœuds " << edge_nb_node <<
" (";
625 for (
Integer i_node = 0; i_node < edge_nb_node; ++i_node)
626 ofile <<
' ' << nodes_sorted_id[edge.
node(i_node).
localId()];
628 ofile <<
" Faces " << edge_nb_face <<
" (";
629 for (
Integer i_face = 0; i_face < edge_nb_face; ++i_face)
630 ofile <<
' ' << faces_sorted_id[edge.
face(i_face).
localId()];
632 ofile <<
" Mailles " << edge_nb_cell <<
" (";
633 for (
Integer i_cell = 0; i_cell < edge_nb_cell; ++i_cell)
634 ofile <<
' ' << cells_sorted_id[edge.
cell(i_cell).
localId()];
639 ofile <<
"** Faces\n";
640 for (
Integer i = 0; i < nb_face; ++i) {
641 Face face = sorted_faces[i];
645 ofile <<
"Face: " << i;
646 ofile <<
" Nœuds " << face.
nbNode() <<
" (";
647 for (
Integer i_node = 0; i_node < face_nb_node; ++i_node)
648 ofile <<
' ' << nodes_sorted_id[face.
node(i_node).
localId()];
651 ofile <<
" Arêtes " << face_nb_edge <<
" (";
652 for (
Integer i_edge = 0; i_edge < face_nb_edge; ++i_edge)
653 ofile <<
' ' << edges_sorted_id[face.
edge(i_edge).
localId()];
656 ofile <<
" Mailles " << face_nb_cell <<
" (";
657 for (
Integer i_cell = 0; i_cell < face_nb_cell; ++i_cell)
658 ofile <<
' ' << cells_sorted_id[face.
cell(i_cell).
localId()];
661 if (!back_cell.
null())
662 ofile <<
" Arrière " << cells_sorted_id[back_cell.
localId()];
665 if (!front_cell.
null())
666 ofile <<
" Avant " << cells_sorted_id[front_cell.
localId()];
672 ofile <<
"** Mailles\n";
673 for (
Integer i = 0; i < nb_cell; ++i) {
674 Cell cell = sorted_cells[i];
676 ofile <<
"Maille: " << i;
678 _fillSorted(cell, lids, nodes_sorted_id,
NodeFiller());
679 _writeItems(ofile,
"Nodes", lids);
680 _fillSorted(cell, lids, edges_sorted_id,
EdgeFiller());
681 _writeItems(ofile,
"Edges", lids);
682 _fillSorted(cell, lids, faces_sorted_id,
FaceFiller());
683 _writeItems(ofile,
"Faces", lids);
693writeMeshInfos(
IMesh* mesh,
const String& file_name)
697 std::ofstream ofile(file_name.
localstr());
699 Integer nb_node = mesh->nbNode();
700 Integer nb_edge = mesh->nbEdge();
701 Integer nb_face = mesh->nbFace();
702 Integer nb_cell = mesh->nbCell();
703 ofile <<
"** Maillage --> "
704 <<
" Nœuds " << nb_node
705 <<
" Arêtes " << nb_edge
706 <<
" Faces " << nb_face
707 <<
" Mailles " << nb_cell
716 ofile <<
"** Nœuds\n";
717 for (
Integer i = 0; i < nb_node; ++i) {
718 Node node = nodes[i];
721 ofile <<
"Nœud: " << i <<
" Coordonnée: " << coords[node];
722 ofile <<
" Faces " << node_nb_face <<
" (";
723 for (
Integer i_face = 0; i_face < node_nb_face; ++i_face)
726 ofile <<
" Mailles " << node_nb_cell <<
" (";
727 for (
Integer i_cell = 0; i_cell < node_nb_cell; ++i_cell)
733 ofile <<
"** Faces\n";
734 for (
Integer i = 0; i < nb_face; ++i) {
735 Face face = faces[i];
736 Integer face_nb_node = face.nbNode();
737 Integer face_nb_cell = face.nbCell();
738 ofile <<
"Face: " << i
739 <<
" Nœuds " << face_nb_node <<
" (";
740 for (
Integer i_node = 0; i_node < face_nb_node; ++i_node)
741 ofile <<
' ' << face.node(i_node).localId();
743 ofile <<
" Mailles " << face_nb_cell <<
" (";
745 for (
Integer i_cell = 0; i_cell < face_nb_cell; ++i_cell)
746 ofile <<
' ' << face.cell(i_cell).localId();
748 const Cell& back_cell = face.backCell();
749 if (!back_cell.null())
750 ofile <<
" Arrière " << back_cell.localId();
752 const Cell& front_cell = face.frontCell();
753 if (!front_cell.null())
754 ofile <<
" Avant " << front_cell.localId();
760 ofile <<
"** Mailles\n";
761 for (
Integer i = 0; i < nb_cell; ++i) {
762 Cell cell = cells[i];
763 Integer cell_nb_node = cell.nbNode();
764 Integer cell_nb_face = cell.nbFace();
765 ofile <<
"Maille: " << i
766 <<
" Nœuds " << cell_nb_node <<
" (";
767 for (
Integer i_node = 0; i_node < cell_nb_node; ++i_node)
768 ofile <<
' ' << cell.node(i_node).localId();
770 ofile <<
" Faces " << cell_nb_face <<
" (";
771 for (
Integer i_face = 0; i_face < cell_nb_face; ++i_face)
772 ofile <<
' ' << cell.face(i_face).localId();
783 template <
typename ItemType>
void
786 ItemGroup all_items(mesh->itemFamily(ik)->allItems());
787 items.resize(all_items.size());
795 std::sort(std::begin(items), std::end(items),
ItemCompare());
802 std::istringstream istr(str.localstr());
804 while (istr.good()) {
812 template <
typename SubItemType>
void
815 Int32 n = sub_list.size();
818 ofile <<
"<" << item_name <<
" count='" << n <<
"'>";
819 for (SubItemType sub_item : sub_list)
820 ofile <<
' ' << sub_item.uniqueId();
821 ofile <<
"</" << item_name <<
">";
829writeMeshConnectivity(
IMesh* mesh,
const String& file_name)
831 std::ofstream ofile(file_name.
localstr());
838 trace->
info() <<
"Écriture de la connectivité du maillage dans '" << file_name <<
"'";
840 ofile <<
"<?xml version='1.0' ?>\n";
841 ofile <<
"<mesh-connectivity>\n";
847 _sortByUniqueIds(mesh,
IK_Node, nodes);
848 _sortByUniqueIds(mesh,
IK_Edge, edges);
849 _sortByUniqueIds(mesh,
IK_Face, faces);
850 _sortByUniqueIds(mesh,
IK_Cell, cells);
854 ofile <<
"<nodes count='" << nodes.
size() <<
"'>\n";
855 for (
Node item : nodes) {
856 ofile <<
" <node uid='" << item.
uniqueId() <<
"' owner='" << item.
owner() <<
"'>";
857 _writeSubItems(ofile,
"cells", item.cells());
858 _writeSubItems(ofile,
"faces", item.faces());
859 _writeSubItems(ofile,
"edges", item.edges());
860 ofile <<
"</node>\n";
862 ofile <<
"</nodes>\n";
867 ofile <<
"<edges count='" << edges.
size() <<
"'>\n";
868 for (
Edge edge : edges) {
869 ofile <<
" <edge uid='" << edge.uniqueId() <<
"' owner='" << edge.owner() <<
"'>";
870 _writeSubItems(ofile,
"nodes", edge.nodes());
871 _writeSubItems(ofile,
"cells", edge.cells());
872 _writeSubItems(ofile,
"faces", edge.faces());
873 ofile <<
"</edge>\n";
875 ofile <<
"</edges>\n";
880 ofile <<
"<faces count='" << faces.
size() <<
"'>\n";
881 for (
Face face : faces) {
883 ofile <<
" <face uid='" << face.uniqueId()
884 <<
"' typeid='" << face.type()
885 <<
"' owner='" << face.owner() <<
"'>";
886 _writeSubItems(ofile,
"nodes", face.nodes());
887 _writeSubItems(ofile,
"edges", face.edges());
891 Cell back_cell = face.backCell();
892 if (!back_cell.
null())
893 ofile <<
" back='" << back_cell.
uniqueId() <<
"'";
894 Cell front_cell = face.frontCell();
895 if (!front_cell.
null())
896 ofile <<
" front='" << front_cell.
uniqueId() <<
"'";
901 if (face.isSlaveFace())
902 _writeSubItems(ofile,
"slave-faces", face.slaveFaces());
903 if (face.isMasterFace()) {
904 ofile <<
"<faces count='1'>";
905 ofile <<
' ' << face.masterFace().uniqueId();
909 ofile <<
"</face>\n";
911 ofile <<
"</faces>\n";
916 ofile <<
"<cells count='" << cells.
size() <<
"'>\n";
921 ghost_cells_layer1.
reserve(100);
922 for (
Cell cell : cells) {
923 ofile <<
" <cell uid='" << cell.uniqueId()
924 <<
"' typeid='" << cell.type()
925 <<
"' owner='" << cell.owner() <<
"'>";
926 _writeSubItems(ofile,
"nodes", cell.nodes());
927 _writeSubItems(ofile,
"edges", cell.edges());
928 _writeSubItems(ofile,
"faces", cell.faces());
929 if (mesh->isAmrActivated()) {
930 ofile <<
"<amr level='" << cell.level() <<
"'>";
940 ofile <<
"<child count='" << cell.nbHChildren() <<
"'>";
941 for (
Integer j = 0; j < cell.nbHChildren(); ++j) {
942 ofile <<
' ' << cell.hChild(j).uniqueId();
949 ghost_cells_layer1.
clear();
950 for (
Node node : cell.nodes()) {
952 ghost_cells_layer1.
add(sub_cell.uniqueId().asInt64());
958 std::sort(std::begin(ghost_cells_layer1), std::end(ghost_cells_layer1));
959 auto new_end = std::unique(std::begin(ghost_cells_layer1), std::end(ghost_cells_layer1));
961 ofile <<
"<ghost1 count='" << ghost_cells_layer1.
size() <<
"'>";
962 for (
auto j : ghost_cells_layer1)
964 ofile <<
"</ghost1>\n";
967 ofile <<
"</cell>\n";
969 ofile <<
"</cells>\n";
975 ofile <<
"<groups>\n";
978 std::map<String, ItemGroup> sorted_groups;
983 sorted_groups.insert(std::make_pair(group.
name(), group));
985 for (
const auto& [name, group] : sorted_groups) {
986 ofile <<
"<group name='" << group.name()
988 <<
"' count='" << group.size() <<
"'>\n";
990 ofile <<
' ' << i_item->uniqueId();
992 ofile <<
"\n</group>\n";
994 ofile <<
"</groups>\n";
999 ofile <<
"<tied-interfaces>\n";
1003 FaceGroup slave_group = interface->slaveInterface();
1004 FaceGroup master_group = interface->masterInterface();
1005 ofile <<
"<tied-interface master_name='" << master_group.
name()
1006 <<
"' slave_name='" << slave_group.
name() <<
"'>\n";
1007 TiedInterfaceNodeList tied_nodes(interface->tiedNodes());
1008 TiedInterfaceFaceList tied_faces(interface->tiedFaces());
1012 ofile <<
"<master-face uid='" << face.
uniqueId() <<
"'>\n";
1013 for (
Integer zz = 0, zs = tied_nodes[iface.index()].
size(); zz < zs; ++zz) {
1014 TiedNode tn = tied_nodes[iface.index()][zz];
1017 for (
Integer zz = 0, zs = tied_faces[iface.index()].
size(); zz < zs; ++zz) {
1018 TiedFace tf = tied_faces[iface.index()][zz];
1019 ofile <<
"<face uid='" << tf.
face().
uniqueId() <<
"'/>\n";
1021 ofile <<
"</master-face>\n";
1023 ofile <<
"</tied-interface>\n";
1025 ofile <<
"</tied-interfaces>\n";
1027 ofile <<
"</mesh-connectivity>\n";
1036class MeshUtilsCheckConnectivity
1040 class ItemInternalXml
1044 ItemInternalXml() {}
1045 explicit ItemInternalXml(
Item item)
1051 bool operator<(
const ItemInternalXml& i2)
const
1053 return m_item.uniqueId() < i2.m_item.
uniqueId();
1055 bool operator<(
Int64 uid)
const
1057 return m_item.uniqueId() < uid;
1065 typedef std::map<Int64, ItemInternalXml> ItemInternalXmlMap;
1069 MeshUtilsCheckConnectivity(
IMesh* mesh,
const XmlNode& doc_node,
bool check_sub_domain)
1071 , m_doc_node(doc_node)
1072 , m_has_error(false)
1073 , m_check_sub_domain(check_sub_domain)
1086 bool m_check_sub_domain;
1087 ItemInternalXmlMap m_nodes_internal;
1088 ItemInternalXmlMap m_edges_internal;
1089 ItemInternalXmlMap m_faces_internal;
1090 ItemInternalXmlMap m_cells_internal;
1108 void _read(
eItemKind ik, ItemInternalXmlMap& items_internal,
1129checkMeshConnectivity(IMesh* mesh,
const XmlNode& doc_node,
bool check_sub_domain)
1133 MeshUtilsCheckConnectivity v(mesh, doc_node, check_sub_domain);
1138checkMeshConnectivity(
IMesh* mesh,
const String& file_name,
bool check_sub_domain)
1143 XmlNode root = doc->documentNode();
1144 checkMeshConnectivity(mesh, root, check_sub_domain);
1147void MeshUtilsCheckConnectivity::
1149 const String& lower_case_kind_name)
1151 ITraceMng* trace = m_mesh->traceMng();
1155 String ustr_uid(
"uid");
1156 String ustr_cells(
"cells");
1157 String ustr_count(
"count");
1158 String ustr_nodes(
"nodes");
1159 String ustr_ghost1(
"ghost1");
1166 items_internal.insert(ItemInternalXmlMap::value_type(item.uniqueId().asInt64(), ixml));
1169#ifdef ARCANE_DEBUG_MESH
1170 for (
Integer i = 0; i < items_internal.size(); ++i) {
1172 trace->info() <<
"Item " << kind_name <<
":" << item_xml.m_item->
uniqueId()
1173 <<
' ' << i <<
' ' << item_xml.m_item;
1177 XmlNodeList xml_items(root_node.children(lower_case_kind_name));
1178 for (
const auto& xml_node : xml_items) {
1179 Integer uid = xml_node.attr(ustr_uid).valueAsInteger();
1180 ItemInternalXmlMap::iterator iixml = items_internal.find(uid);
1181 if (iixml != items_internal.end()) {
1182 iixml->second.m_element = xml_node;
1187 ixml->m_element = xml_node;
1188#ifdef ARCANE_DEBUG_MESH
1189 trace->info() <<
"FOUND " << uid <<
' ' << z->m_item->uniqueId() <<
' ' << z->m_element.name()
1190 <<
' ' << z->m_item;
1193#ifdef ARCANE_DEBUG_MESH
1195 trace->info() <<
"FOUND " << uid <<
" NOT HERE";
1202 for (ItemInternalXmlMap::const_iterator i(items_internal.begin()); i != items_internal.end(); ++i) {
1204 Item item = item_xml.m_item;
1205 const XmlNode& xitem = item_xml.m_element;
1207 trace->error() <<
"Item " << kind_name <<
":" << item.uniqueId()
1208 <<
"inconnu dans le maillage de référence";
1213 ItemWithNodes item_with_node(item);
1214 XmlNode xitem_node = xitem.child(ustr_nodes);
1215 Integer ref_nb_node = xitem_node.attr(ustr_count).valueAsInteger();
1216 Integer nb_node = item_with_node.nbNode();
1217 if (ref_nb_node != nb_node) {
1218 trace->error() <<
"Item " << kind_name <<
":" << item.uniqueId()
1219 <<
": nombre de nœuds (" << nb_node <<
") "
1220 <<
"différent du référentiel (" << ref_nb_node <<
")";
1225 m_items_unique_id.reserve(ref_nb_node);
1226 String s = xitem_node.value();
1227 _stringToIds(s, m_items_unique_id);
1228 bool is_bad =
false;
1229 for (
NodeEnumerator i_node(item_with_node.nodes()); i_node(); ++i_node) {
1230 if (m_items_unique_id[i_node.index()] != i_node->uniqueId()) {
1238 ostr() <<
"Item " << kind_name <<
":" << item.uniqueId()
1240 for (
NodeEnumerator i_node(item_with_node.nodes()); i_node(); ++i_node) {
1241 ostr() <<
' ' << i_node->uniqueId();
1243 ostr() <<
") différents du référentiel (" << s <<
")";
1244 trace->error() << ostr.str();
1254 elem = xitem.child(ustr_ghost1);
1256 elem = xitem.child(ustr_cells);
1258 _stringToIds(elem.value(), m_items_unique_id);
1259 local_ids.resize(m_items_unique_id.size());
1260 m_mesh->cellFamily()->itemsUniqueIdToLocalId(local_ids, m_items_unique_id,
false);
1261 StringBuilder not_found;
1262 bool has_not_found =
false;
1263 for (
Integer uui = 0, uuis = m_items_unique_id.size(); uui < uuis; ++uui) {
1264 if (local_ids[uui] == NULL_ITEM_ID) {
1266 not_found += m_items_unique_id[uui];
1268 has_not_found =
true;
1271 if (has_not_found) {
1273 trace->info() <<
"ERREUR : Une ou plusieurs mailles fantômes de la maille "
1274 << ItemPrinter(item) <<
" ne sont pas dans le sous-domaine"
1275 <<
" ref='" << elem.value() <<
"' not_found='" << not_found <<
'\'';
1277 trace->info() <<
"ERREUR : Une ou plusieurs mailles avec le nœud "
1278 << ItemPrinter(item) <<
" ne sont pas dans le sous-domaine"
1279 <<
" ref='" << elem.value() <<
"' not_found='" << not_found <<
'\'';
1293void MeshUtilsCheckConnectivity::
1296 ITraceMng* trace = m_mesh->traceMng();
1298 trace->info() <<
"Vérification de la connectivité du maillage checkMeshConnectivity()";
1300 XmlNode root_node = m_doc_node.child(String(
"mesh-connectivity"));
1302 trace->warning() <<
"Fichier de connectivité incorrect";
1305 XmlNode nodes_root = root_node.child(
"nodes");
1306 XmlNode faces_root = root_node.child(
"faces");
1307 XmlNode cells_root = root_node.child(
"cells");
1309 _read(
IK_Node, m_nodes_internal, nodes_root,
"node");
1310 _read(
IK_Face, m_faces_internal, faces_root,
"face");
1311 _read(
IK_Cell, m_cells_internal, cells_root,
"cell");
1313 String ustr_groups(
"groups");
1314 String ustr_group(
"group");
1315 String ustr_count(
"count");
1317 XmlNode groups_root = root_node.child(ustr_groups);
1319 const ItemGroup& group = *i_group;
1320 if (group.isLocalToSubDomain() || group.isOwn())
1322 XmlNode group_elem = groups_root.childWithNameAttr(ustr_group, String(group.name()));
1323 if (group_elem.null()) {
1325 trace->error() <<
"Unable to find group <" << group.name()
1326 <<
"> in reference file";
1329 Integer size = group_elem.attr(ustr_count).valueAsInteger();
1330 m_items_unique_id.reserve(size);
1331 _stringToIds(group_elem.value(), m_items_unique_id);
1332 Integer ref_size = m_items_unique_id.size();
1333 if (ref_size != size) {
1334 trace->error() <<
"Number of items in group <" << group.name()
1335 <<
"> (" << size <<
" different than reference (" << ref_size;
1342 trace->fatal() <<
"Error(s) while checking mesh";
1353checkMeshProperties(
IMesh* mesh,
bool is_sorted,
bool has_no_hole,
bool check_faces)
1361 bool has_error =
false;
1367 if (!check_faces && ik ==
IK_Face)
1388 ARCANE_FATAL(
"Missing required mesh properties (sorted and/or no hole)");
1396printItems(std::ostream& ostr,
const String& name,
ItemGroup item_group)
1398 ostr <<
" ------- " << name <<
'\n';
1412 bool need_swap_orientation =
false;
1418 if (before_ids[0] < before_ids[1]) {
1419 after_ids[0] = before_ids[0];
1420 after_ids[1] = before_ids[1];
1423 after_ids[0] = before_ids[1];
1424 after_ids[1] = before_ids[0];
1441 Int64 min_node = INT64_MAX;
1442 for (
Integer k = 0; k < nb_node; ++k) {
1443 Int64 id = before_ids[k];
1444 if (
id < min_node) {
1449 Int64 next_node = before_ids[(min_node_index + 1) % nb_node];
1450 Int64 prev_node = before_ids[(min_node_index + (nb_node - 1)) % nb_node];
1453 if (next_node == min_node) {
1454 next_node = before_ids[(min_node_index + (nb_node + 2)) % nb_node];
1457 if (prev_node == min_node) {
1458 prev_node = before_ids[(min_node_index + (nb_node - 2)) % nb_node];
1459 incr2 = nb_node - 1;
1461 if (next_node > prev_node)
1462 need_swap_orientation =
true;
1463 if (need_swap_orientation) {
1464 for (
Integer k = 0; k < nb_node; ++k) {
1465 Integer index = (nb_node - k + min_node_index + incr) % nb_node;
1466 after_ids[k] = before_ids[index];
1470 for (
Integer k = 0; k < nb_node; ++k) {
1471 Integer index = (k + min_node_index + incr2) % nb_node;
1472 after_ids[k] = before_ids[index];
1475 return need_swap_orientation;
1486 bool need_swap_orientation =
false;
1492 if (nodes_unique_id[0] < nodes_unique_id[1]) {
1515 Int64 min_node = INT64_MAX;
1516 for (
Integer k = 0; k < nb_node; ++k) {
1517 Int64 id = nodes_unique_id[k];
1518 if (
id < min_node) {
1523 Int64 next_node = nodes_unique_id[(min_node_index + 1) % nb_node];
1524 Int64 prev_node = nodes_unique_id[(min_node_index + (nb_node - 1)) % nb_node];
1527 if (next_node == min_node) {
1528 next_node = nodes_unique_id[(min_node_index + 2) % nb_node];
1531 if (prev_node == min_node) {
1532 prev_node = nodes_unique_id[(min_node_index + (nb_node - 2)) % nb_node];
1533 incr2 = nb_node - 1;
1535 if (next_node > prev_node)
1536 need_swap_orientation =
true;
1537 if (need_swap_orientation) {
1538 for (
Integer k = 0; k < nb_node; ++k) {
1539 Integer index = (nb_node - k + min_node_index + incr) % nb_node;
1540 new_index[k] = index;
1544 for (
Integer k = 0; k < nb_node; ++k) {
1545 Integer index = (k + min_node_index + incr2) % nb_node;
1546 new_index[k] = index;
1549 return need_swap_orientation;
1563 bool same_face =
true;
1564 for (
Integer zz = 0; zz < n; ++zz)
1565 if (f.
node(zz).
localId() != face_nodes_local_id[zz]) {
1587 bool same_face =
true;
1588 for (
Integer zz = 0; zz < n; ++zz)
1589 if (f.
node(zz).
uniqueId() != face_nodes_unique_id[zz]) {
1608 ARCANE_FATAL(
"Can not remove item lid={0} because list is empty", local_id);
1612 if (items[0] == local_id)
1617 if (items[n] == local_id)
1619 for (
Integer i = 0; i < n; ++i) {
1620 if (items[i] == local_id) {
1621 for (
Integer z = i; z < n; ++z)
1622 items[z] = items[z + 1];
1635shrinkMeshGroups(
IMesh* mesh)
1638 group.internal()->shrinkMemory();
1640 meshvisitor::visitGroups(mesh, f);
1647printMeshGroupsMemoryUsage(
IMesh* mesh,
Int32 print_level)
1650 Int64 total_capacity = 0;
1651 Int64 total_computed_capacity = 0;
1658 total_capacity += c;
1660 total_computed_capacity += c;
1661 if (print_level >= 1)
1663 <<
" nb_ref=" << p->
nbRef() <<
" size=" << p->
size()
1664 <<
" capacity=" << c;
1666 meshvisitor::visitGroups(mesh, f);
1667 tm->
info() <<
"MeshGroupsMemoryUsage: capacity = " << total_capacity
1668 <<
" computed_capacity=" << total_computed_capacity;
1669 return total_capacity *
sizeof(
Int32);
1684 tm->
info(4) <<
"Dumping VariableSynchronizerTopology filename=" << filename;
1688 for (
Integer i = 0; i < nb_comm_rank; ++i)
1691 JSONWriter json_writer(JSONWriter::FormatFlags::None);
1692 json_writer.beginObject();
1697 json_writer.write(
"NbNeighbor", all_nb_comm_ranks);
1702 json_writer.write(
"NeighborsRank", all_neighbor_ranks);
1707 json_writer.write(
"NeighborsSize", all_nb_items_by_rank);
1717 json_writer.endObject();
1720 std::ofstream ofile(filename.
localstr());
1721 auto bytes = json_writer.getBuffer().
bytes();
1722 ofile.write(
reinterpret_cast<const char*
>(bytes.data()), bytes.size());
1735 friend bool operator<(
const MyIdsToTest& a,
const MyIdsToTest& b)
1737 return a.ids < b.ids;
1739 static constexpr int MAX_SIZE = 16;
1743 std::array<Int32, MAX_SIZE> ids = {};
1746 void _computePatternOccurence(
const ItemGroup& items,
const String& message,
1749 std::map<MyIdsToTest, Int32> occurence_map;
1750 Int32 nb_skipped = 0;
1753 MyIdsToTest diff_ids;
1757 bool is_skipped =
false;
1759 if (index >= MyIdsToTest::MAX_SIZE) {
1764 lid0 = sub_item.localId();
1765 diff_ids.ids[index] = sub_item.localId() - lid0;
1772 ++occurence_map[diff_ids];
1774 ITraceMng* tm = items.mesh()->traceMng();
1775 tm->
info() <<
"Occurence: " << message <<
" group=" << items.name()
1776 <<
" nb=" << items.size() <<
" map_size=" << occurence_map.size()
1777 <<
" nb_skipped=" << nb_skipped;
1782computeConnectivityPatternOccurence(
IMesh* mesh)
1788 _computePatternOccurence(mesh->allNodes(),
"NodeCells", cty.nodeCell());
1789 _computePatternOccurence(mesh->allNodes(),
"NodeFaces", cty.nodeFace());
1790 _computePatternOccurence(mesh->allFaces(),
"FaceCells", cty.faceCell());
1791 _computePatternOccurence(mesh->allFaces(),
"FaceNodes", cty.faceNode());
1792 _computePatternOccurence(mesh->allCells(),
"CellNodes", cty.cellNode());
1793 _computePatternOccurence(mesh->allCells(),
"CellFaces", cty.cellFace());
1800markMeshConnectivitiesAsMostlyReadOnly(
IMesh* mesh,
RunQueue* queue,
bool do_prefetch)
1806 const String tag_name =
"ArcaneConnectivity";
1810 for (VariableCollection::Enumerator iv(used_variables); ++iv;) {
1812 if (!v->
hasTag(tag_name))
1825impl::ItemBase MeshUtils::
1837impl::ItemBase MeshUtils::
1849namespace MeshUtils::impl
1852 Int64 _getMaxUniqueId(
const ItemGroup& group,
Int64 max_uid)
1856 if (max_uid < item.uniqueId())
1867getMaxItemUniqueIdCollective(
IMesh* mesh)
1869 Int64 max_uid = NULL_ITEM_UNIQUE_ID;
1870 max_uid = impl::_getMaxUniqueId(mesh->allNodes(), max_uid);
1871 max_uid = impl::_getMaxUniqueId(mesh->allEdges(), max_uid);
1872 max_uid = impl::_getMaxUniqueId(mesh->allCells(), max_uid);
1873 max_uid = impl::_getMaxUniqueId(mesh->allFaces(), max_uid);
1883 const String& expected_hash,
bool print_hash,
1895 Item item{ *iitem };
1900 std::sort(global_items_uid.
begin(), global_items_uid.
end());
1906 tm->
info() <<
"HASH_RESULT family=" << family->
name()
1907 <<
" v=" << hash_str <<
" expected=" << expected_hash;
1908 if (!expected_hash.
empty() && hash_str != expected_hash)
1909 ARCANE_FATAL(
"Bad hash for uniqueId() for family '{0}' v='{1}' expected='{2}'",
1910 family->
fullName(), hash_str, expected_hash);
1922 uids[iitem.index()] = iitem->uniqueId();
1938 Int64 uid0 = nodes_unique_id[0];
1939 Int64 hash = Hasher::hashfunc(uid0);
1940 for (
Int32 i = 1; i < nb_node; ++i) {
1941 Int64 next_hash = Hasher::hashfunc(nodes_unique_id[i]);
1942 hash ^= next_hash + 0x9e3779b9 + (hash << 6) + (hash >> 2);
1944 Int64 new_uid = math::abs(hash);
1945 ARCANE_ASSERT(new_uid >= 0, (
"UniqueId is not >= 0"));
1953computeAndSetOwnerForNodes(
IMesh* mesh)
1956 mesh->utilities()->computeAndSetOwnersForNodes();
1963computeAndSetOwnerForEdges(
IMesh* mesh)
1966 mesh->utilities()->computeAndSetOwnersForEdges();
1973computeAndSetOwnerForFaces(
IMesh* mesh)
1976 mesh->utilities()->computeAndSetOwnersForFaces();
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions mathématiques diverses.
Fonctions utilitaires sur le maillage.
Fonctions utilitaires sur les variables.
void prefetchVariableAsync(IVariable *var, const RunQueue *queue_or_null)
Pré-copie la mémoire associée à la variable var.
Integer size() const
Nombre d'éléments du vecteur.
File d'exécution pour un accélérateur.
Vue modifiable pour un tableau 2D.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void clear()
Supprime les éléments du tableau.
iterator begin()
Itérateur sur le premier élément du tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Span< const T > constSpan() const
Vue constante sur ce tableau.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
iterator end()
Itérateur sur le premier élément après la fin du tableau.
Vue sur les informations des mailles.
EnumeratorT< ItemGroup > Enumerator
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
ARCANE_DEPRECATED_122 Int32 size() const
Nombre d'éléments de la première dimension.
Informations sur l'allocation d'une donnée.
Vue sur les informations des arêtes.
Cell cell(Int32 i) const
i-ème maille de l'arête
Face face(Int32 i) const
i-ème face de l'arête
Int32 nbFace() const
Nombre de faces connectées à l'arête.
Int32 nbNode() const
Nombre de sommets de l'arête.
Int32 nbCell() const
Nombre de mailles connectées à l'arête.
Vue sur les informations des faces.
Cell frontCell() const
Maille devant la face (maille nulle si aucune).
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2).
Edge edge(Int32 i) const
i-ème arête de la face
Int32 nbEdge() const
Nombre d'arêtes de la face.
Cell backCell() const
Maille derrière la face (maille nulle si aucune).
Informations sur le type à virgule flottante.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface d'un algorithme de hashage.
virtual void computeHash64(Span< const Byte > input, ByteArray &output)
Calcule la valeur du hash pour le tableau input.
Interface d'une famille d'entités.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual ItemInternal * findOneItem(Int64 unique_id)=0
Entité de numéro unique unique_id.
virtual IParallelMng * parallelMng() const =0
Gestionnaire de parallélisme associé
virtual String name() const =0
Nom de la famille.
virtual ITraceMng * traceMng() const =0
Gestionnaire de trace associé
virtual String fullName() const =0
Nom complet de la famille (avec celui du maillage).
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void gatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf, Int32 rank)=0
Effectue un regroupement sur tous les processeurs.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Effectue un regroupement sur tous les processeurs.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void gather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf, Int32 rank)=0
Effectue un regroupement sur un processeurs. Il s'agit d'une opération collective....
Interface du gestionnaire d'un sous-domaine.
virtual Int32 subDomainId() const =0
Numéro du sous-domaine associé à ce gestionnaire.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
Interface d'un classe gérant une semi-conformité du maillage.
Interface du gestionnaire de traces.
virtual TraceMessage pinfo()=0
Flot pour un message d'information parallèle.
virtual TraceMessage error()=0
Flot pour un message d'erreur.
virtual TraceMessage info()=0
Flot pour un message d'information.
Interface du gestionnaire de variables.
virtual VariableCollection usedVariables()=0
Liste des variables utilisées.
Interface d'un service de synchronisation de variable.
virtual Int32ConstArrayView communicatingRanks()=0
Rangs des sous-domaines avec lesquels on communique.
virtual IParallelMng * parallelMng()=0
Gestionnaire parallèle associé
virtual Int32ConstArrayView sharedItems(Int32 index)=0
Liste des ids locaux des entités partagées avec un sous-domaine.
Interface d'une variable.
virtual bool hasTag(const String &tagname)=0
true si la variable possède le tag tagname
virtual void setAllocationInfo(const DataAllocationInfo &v)=0
Positionne les informations sur l'allocation.
virtual MeshHandle meshHandle() const =0
Maillage auquel est associé la variable.
static IXmlDocumentHolder * loadFromFile(const String &filename, ITraceMng *tm)
Charge un document XML.
Classe de base d'une vue sur une connectivité non structurée.
Classe de base pour les entités du maillage.
Integer nbEdge() const
Nombre d'arêtes de l'entité ou nombre d'arêtes connectés à l'entités (pour les noeuds).
ItemUniqueId uniqueId() const
Numéro unique de l'entité
Integer nbCell() const
Nombre de mailles connectées à l'entité (pour les noeuds, arêtes et faces).
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Integer nbFace() const
Nombre de faces de l'entité ou nombre de faces connectés à l'entités (pour les noeuds et arêtes).
Integer nbNode() const
Nombre de noeuds de l'entité
Vue sur une liste d'entités connectées à une autre.
virtual Integer nbRef() const
Nombre de références sur le groupe.
Integer size() const
Nombre d'entités du groupe.
Int64 capacity() const
Nombre d'éléments alloués.
bool hasComputeFunctor() const
Indique si le groupe est calculé
Groupe d'entités de maillage.
const String & name() const
Nom du groupe.
bool isLocalToSubDomain() const
Vrai si le groupe est local au sous-domaine.
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Index d'un Item dans une variable.
Classe utilitaire pour imprimer les infos sur une entité.
static eItemKind kind()
Genre de l'entité
Identifiant unique d'une entité.
Vue sur un vecteur d'entités.
Int32 size() const
Nombre d'éléments du vecteur.
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Node node(Int32 i) const
i-ème noeud de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
impl::ItemBase itemBase() const
Partie interne de l'entité.
IMesh * meshOrNull() const
Retourne le maillage associé à cette instance.
Informations générique sur les types d'une variable du maillage.
Vue sur les informations des noeuds.
Cell cell(Int32 i) const
i-ème maille du noeud
CellConnectedListViewType cells() const
Liste des mailles du noeud.
constexpr Int32 nbFace() const
Nombre de faces connectées au noeud.
constexpr Int32 nbEdge() const
Nombre d'arêtes connectées au noeud.
Face face(Int32 i) const
i-ème face du noeud
Edge edge(Int32 i) const
i-ème arête du noeud
Int32 nbCell() const
Nombre de mailles connectées au noeud.
Classe gérant un vecteur réel de 3 dimensions.
Encapsulation d'un pointeur qui se détruit automatiquement.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
constexpr Span< const Byte > bytes() const ARCCORE_NOEXCEPT
Retourne la conversion de l'instance dans l'encodage UTF-8.
Chaîne de caractères unicode.
Int64 length() const
Retourne la longueur de la chaîne.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
bool empty() const
Vrai si la chaîne est vide (nulle ou "").
Face semi-conforme du maillage.
Face face() const
Face soudée.
Noeud semi-conforme du maillage.
Node node() const
Noeud lié
Real2 isoCoordinates() const
Coordonnées iso-barycentriques du noeud.
Positionne une classe de message.
Formattage du flot en longueur.
Vecteur 1D de données avec sémantique par valeur (style STL).
Vue sur les connectivités standards d'un maillage non structuré.
ItemGroupT< Face > FaceGroup
Groupe de faces.
ItemEnumeratorT< Node > NodeEnumerator
Enumérateurs sur des noeuds.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
String toHexaString(ByteConstArrayView input)
Converti un tableau d'octet en sa représentation hexadécimale.
@ ReduceMax
Maximum des valeurs.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
bool operator<(const Item &item1, const Item &item2)
Compare deux entités.
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
@ HostAndDeviceMostlyRead
Indique que la donnée sera utilisée à la fois sur accélérateur et sur CPU et qu'elle ne sera pas souv...
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
SharedMeshVariableScalarRefT< Node, Real3 > SharedVariableNodeReal3
Grandeur au noeud de type coordonnées.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Convertit la vue en un tableau d'octets non modifiables.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
@ Cell
Le maillage est AMR par maille.
Collection< ITiedInterface * > TiedInterfaceCollection
Collection d'interfaces liées.
std::int32_t Int32
Type entier signé sur 32 bits.
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet