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)
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() <<
"Invalid dimensions for variable '" << name <<
"' "
131 <<
"(size=" << 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() <<
"Invalid dimensions for variable '" << name <<
"' "
143 <<
"(size=" << 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() <<
"** -- Dumping information for cell " << cell.uniqueId();
174 trace->pinfo() <<
"** -- Structure:";
175 trace->pinfo() <<
"unique id: " <<
Trace::Width(5) << cell.uniqueId();
176 trace->pinfo() <<
"local id: " <<
Trace::Width(5) << cell.localId();
177 trace->pinfo() <<
"owner: " <<
Trace::Width(5) << cell.owner();
178 trace->pinfo() <<
"type: " <<
Trace::Width(5) << cell.typeInfo()->typeName();
180 trace->pinfo() <<
"number of nodes: " <<
Trace::Width(5) << nb_node;
181 for (
Integer i = 0; i < nb_node; ++i)
182 trace->pinfo() <<
"unique id of node " <<
Trace::Width(2)
183 << i <<
" : " <<
Trace::Width(5) << cell.node(i).uniqueId();
185 trace->pinfo() <<
"number of edges: " <<
Trace::Width(5) << nb_edge;
186 for (
Integer i = 0; i < nb_edge; ++i)
187 trace->pinfo() <<
"unique id of edge " <<
Trace::Width(2)
188 << i <<
" : " <<
Trace::Width(5) << cell.edge(i).uniqueId();
190 trace->pinfo() <<
"number of faces: " <<
Trace::Width(5) << nb_face;
191 for (
Integer i = 0; i < nb_face; ++i)
192 trace->pinfo() <<
"local id of 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() <<
"** -- Dumping information for node " << 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() <<
"** -- Dumping information for face " << edge.localId() <<
" (localid)";
290 trace->pinfo() <<
"** -- Structure:";
291 trace->pinfo() <<
"unique id: " << Trace::Width(5) <<
"None";
292 trace->pinfo() <<
"local id: " << Trace::Width(5) << edge.localId();
293 trace->pinfo() <<
"owner: " << Trace::Width(5) << edge.owner();
295 trace->pinfo() <<
"number of nodes: " << Trace::Width(5) << nb_node;
296 for (
Integer i = 0; i < nb_node; ++i)
297 trace->pinfo() <<
"unique id of node " << Trace::Width(2)
298 << i <<
" : " << Trace::Width(5) << edge.node(i).uniqueId();
300 trace->pinfo() <<
"number of cells: " << Trace::Width(5) << nb_cell;
301 for (
Integer i = 0; i < nb_cell; ++i)
302 trace->pinfo() <<
"unique id of cell " << 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() <<
"** -- Dumping information for face " << face.localId() <<
" (localid)";
344 trace->pinfo() <<
"** -- Structure:";
345 trace->pinfo() <<
"unique id: " <<
Trace::Width(5) <<
"None";
346 trace->pinfo() <<
"local id: " <<
Trace::Width(5) << face.localId();
347 trace->pinfo() <<
"owner: " <<
Trace::Width(5) << face.owner();
349 trace->pinfo() <<
"number of nodes: " <<
Trace::Width(5) << nb_node;
350 for (
Integer i = 0; i < nb_node; ++i)
351 trace->pinfo() <<
"unique id of node " <<
Trace::Width(2)
352 << i <<
" : " <<
Trace::Width(5) << face.node(i).uniqueId();
354 trace->pinfo() <<
"number of cells: " <<
Trace::Width(5) << nb_cell;
355 for (
Integer i = 0; i < nb_cell; ++i)
356 trace->pinfo() <<
"unique id of cell " <<
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];
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]];
527 std::ofstream ofile(file_name.
localstr());
533 ofile <<
"** Mesh Sorted --> "
534 <<
" Nodes " << nb_node
535 <<
" Edges " << nb_edge
536 <<
" Faces " << nb_face
537 <<
" Cells " << 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 <<
"** Nodes\n";
598 for (
Integer i = 0; i < nb_node; ++i) {
599 const Node& node = sorted_nodes[i];
600 ofile <<
"Node: " << i <<
" Coord: " << coords[node];
602 _fillSorted(node, lids, edges_sorted_id,
EdgeFiller());
603 std::sort(std::begin(lids), std::end(lids));
604 _writeItems(ofile,
"Edges", 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,
"Cells", lids);
617 ofile <<
"** Edges\n";
618 for (
Integer i = 0; i < nb_edge; ++i) {
619 Edge edge = sorted_edges[i];
623 ofile <<
"Edge: " << i
624 <<
" Nodes " << 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 <<
" Cells " << 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 <<
" Nodes " << 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 <<
" Edges " << 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 <<
" Cells " << 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 <<
" Back " << cells_sorted_id[back_cell.
localId()];
665 if (!front_cell.
null())
666 ofile <<
" Front " << cells_sorted_id[front_cell.
localId()];
672 ofile <<
"** Cells\n";
673 for (
Integer i = 0; i < nb_cell; ++i) {
674 Cell cell = sorted_cells[i];
676 ofile <<
"Cell: " << 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);
697 std::ofstream ofile(file_name.
localstr());
703 ofile <<
"** Mesh --> "
704 <<
" Nodes " << nb_node
705 <<
" Edges " << nb_edge
706 <<
" Faces " << nb_face
707 <<
" Cells " << nb_cell
716 ofile <<
"** Nodes\n";
717 for (
Integer i = 0; i < nb_node; ++i) {
718 Node node = nodes[i];
721 ofile <<
"Node: " << i <<
" Coord: " << coords[node];
722 ofile <<
" Faces " << node_nb_face <<
" (";
723 for (
Integer i_face = 0; i_face < node_nb_face; ++i_face)
726 ofile <<
" Cells " << 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 <<
" Nodes " << 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 <<
" Cells " << 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 <<
" Back " << back_cell.localId();
752 const Cell& front_cell = face.frontCell();
753 if (!front_cell.null())
754 ofile <<
" Front " << front_cell.localId();
760 ofile <<
"** Cells\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 <<
"Cell: " << i
766 <<
" Nodes " << 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
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 <<
">";
831 std::ofstream ofile(file_name.
localstr());
838 trace->
info() <<
"Writing mesh connectivity in '" << file_name <<
"'";
840 ofile <<
"<?xml version='1.0' ?>\n";
841 ofile <<
"<mesh-connectivity>\n";
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 <<
"unknown in reference mesh";
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 <<
": number of nodes (" << nb_node <<
") "
1220 <<
"different than reference (" << 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() <<
") different than reference (" << 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() <<
"ERROR: One or more ghost cells of cell "
1274 << ItemPrinter(item) <<
" are not in the sub-domain"
1275 <<
" ref='" << elem.value() <<
"' not_found='" << not_found <<
'\'';
1277 trace->info() <<
"ERROR: One or more cells with node "
1278 << ItemPrinter(item) <<
" are not in the sub-domain"
1279 <<
" ref='" << elem.value() <<
"' not_found='" << not_found <<
'\'';
1293void MeshUtilsCheckConnectivity::
1296 ITraceMng* trace = m_mesh->traceMng();
1298 trace->info() <<
"Checking mesh checkMeshConnectivity()";
1300 XmlNode root_node = m_doc_node.child(String(
"mesh-connectivity"));
1302 trace->warning() <<
"Incorrect connectivity file";
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)
1455 next_node = before_ids[(min_node_index + (nb_node + 2)) % nb_node];
1458 if(prev_node==min_node)
1460 prev_node = before_ids[(min_node_index + (nb_node - 2)) % nb_node];
1461 incr2 = nb_node - 1 ;
1463 if (next_node > prev_node)
1464 need_swap_orientation =
true;
1465 if (need_swap_orientation) {
1466 for (
Integer k = 0; k < nb_node; ++k) {
1467 Integer index = (nb_node - k + min_node_index + incr) % nb_node;
1468 after_ids[k] = before_ids[index];
1472 for (
Integer k = 0; k < nb_node; ++k) {
1473 Integer index = (k + min_node_index + incr2) % nb_node;
1474 after_ids[k] = before_ids[index];
1477 return need_swap_orientation;
1488 bool need_swap_orientation =
false;
1494 if (nodes_unique_id[0] < nodes_unique_id[1]) {
1517 Int64 min_node = INT64_MAX;
1518 for (
Integer k = 0; k < nb_node; ++k) {
1519 Int64 id = nodes_unique_id[k];
1520 if (
id < min_node) {
1525 Int64 next_node = nodes_unique_id[(min_node_index + 1) % nb_node];
1526 Int64 prev_node = nodes_unique_id[(min_node_index + (nb_node - 1)) % nb_node];
1529 if(next_node==min_node)
1531 next_node = nodes_unique_id[(min_node_index + 2) % nb_node];
1534 if(prev_node==min_node)
1536 prev_node = nodes_unique_id[(min_node_index + (nb_node - 2)) % nb_node];
1537 incr2 = nb_node - 1 ;
1539 if (next_node > prev_node)
1540 need_swap_orientation =
true;
1541 if (need_swap_orientation) {
1542 for (
Integer k = 0; k < nb_node; ++k) {
1543 Integer index = (nb_node - k + min_node_index + incr) % nb_node;
1544 new_index[k] = index;
1548 for (
Integer k = 0; k < nb_node; ++k) {
1549 Integer index = (k + min_node_index + incr2) % nb_node;
1550 new_index[k] = index;
1553 return need_swap_orientation;
1567 bool same_face =
true;
1568 for (
Integer zz = 0; zz < n; ++zz)
1569 if (f.
node(zz).
localId() != face_nodes_local_id[zz]) {
1591 bool same_face =
true;
1592 for (
Integer zz = 0; zz < n; ++zz)
1593 if (f.
node(zz).
uniqueId() != face_nodes_unique_id[zz]) {
1612 ARCANE_FATAL(
"Can not remove item lid={0} because list is empty", local_id);
1616 if (items[0] == local_id)
1621 if (items[n] == local_id)
1623 for (
Integer i = 0; i < n; ++i) {
1624 if (items[i] == local_id) {
1625 for (
Integer z = i; z < n; ++z)
1626 items[z] = items[z + 1];
1642 group.internal()->shrinkMemory();
1644 meshvisitor::visitGroups(
mesh, f);
1654 Int64 total_capacity = 0;
1655 Int64 total_computed_capacity = 0;
1662 total_capacity += c;
1664 total_computed_capacity += c;
1665 if (print_level >= 1)
1667 <<
" nb_ref=" << p->
nbRef() <<
" size=" << p->
size()
1668 <<
" capacity=" << c;
1670 meshvisitor::visitGroups(
mesh, f);
1671 tm->
info() <<
"MeshGroupsMemoryUsage: capacity = " << total_capacity
1672 <<
" computed_capacity=" << total_computed_capacity;
1673 return total_capacity *
sizeof(
Int32);
1688 tm->
info(4) <<
"Dumping VariableSynchronizerTopology filename=" << filename;
1692 for (
Integer i = 0; i < nb_comm_rank; ++i)
1695 JSONWriter json_writer(JSONWriter::FormatFlags::None);
1696 json_writer.beginObject();
1701 json_writer.write(
"NbNeighbor", all_nb_comm_ranks);
1706 json_writer.write(
"NeighborsRank", all_neighbor_ranks);
1711 json_writer.write(
"NeighborsSize", all_nb_items_by_rank);
1721 json_writer.endObject();
1724 std::ofstream ofile(filename.
localstr());
1725 auto bytes = json_writer.getBuffer().
bytes();
1726 ofile.write(
reinterpret_cast<const char*
>(bytes.data()), bytes.size());
1739 friend bool operator<(
const MyIdsToTest& a,
const MyIdsToTest& b)
1741 return a.ids < b.ids;
1743 static constexpr int MAX_SIZE = 16;
1747 std::array<Int32, MAX_SIZE> ids = {};
1750 void _computePatternOccurence(
const ItemGroup& items,
const String& message,
1753 std::map<MyIdsToTest, Int32> occurence_map;
1754 Int32 nb_skipped = 0;
1757 MyIdsToTest diff_ids;
1761 bool is_skipped =
false;
1763 if (index >= MyIdsToTest::MAX_SIZE) {
1768 lid0 = sub_item.localId();
1769 diff_ids.ids[index] = sub_item.localId() - lid0;
1776 ++occurence_map[diff_ids];
1778 ITraceMng* tm = items.mesh()->traceMng();
1779 tm->
info() <<
"Occurence: " << message <<
" group=" << items.name()
1780 <<
" nb=" << items.size() <<
" map_size=" << occurence_map.size()
1781 <<
" nb_skipped=" << nb_skipped;
1786computeConnectivityPatternOccurence(
IMesh*
mesh)
1792 _computePatternOccurence(
mesh->allNodes(),
"NodeCells", cty.nodeCell());
1793 _computePatternOccurence(
mesh->allNodes(),
"NodeFaces", cty.nodeFace());
1794 _computePatternOccurence(
mesh->allFaces(),
"FaceCells", cty.faceCell());
1795 _computePatternOccurence(
mesh->allFaces(),
"FaceNodes", cty.faceNode());
1796 _computePatternOccurence(
mesh->allCells(),
"CellNodes", cty.cellNode());
1797 _computePatternOccurence(
mesh->allCells(),
"CellFaces", cty.cellFace());
1804markMeshConnectivitiesAsMostlyReadOnly(
IMesh*
mesh,
RunQueue* queue,
bool do_prefetch)
1810 const String tag_name =
"ArcaneConnectivity";
1814 for (VariableCollection::Enumerator iv(used_variables); ++iv;) {
1816 if (!v->
hasTag(tag_name))
1829impl::ItemBase MeshUtils::
1841impl::ItemBase MeshUtils::
1853namespace MeshUtils::impl
1856 Int64 _getMaxUniqueId(
const ItemGroup& group,
Int64 max_uid)
1860 if (max_uid < item.uniqueId())
1871getMaxItemUniqueIdCollective(
IMesh*
mesh)
1873 Int64 max_uid = NULL_ITEM_UNIQUE_ID;
1874 max_uid = impl::_getMaxUniqueId(
mesh->allNodes(), max_uid);
1875 max_uid = impl::_getMaxUniqueId(
mesh->allEdges(), max_uid);
1876 max_uid = impl::_getMaxUniqueId(
mesh->allCells(), max_uid);
1877 max_uid = impl::_getMaxUniqueId(
mesh->allFaces(), max_uid);
1887 const String& expected_hash,
bool print_hash,
1899 Item item{ *iitem };
1900 own_items_uid.
add(item.uniqueId());
1904 std::sort(global_items_uid.
begin(), global_items_uid.
end());
1910 tm->
info() <<
"HASH_RESULT family=" << family->
name()
1911 <<
" v=" << hash_str <<
" expected=" << expected_hash;
1912 if (!expected_hash.
empty() && hash_str != expected_hash)
1913 ARCANE_FATAL(
"Bad hash for uniqueId() for family '{0}' v={1} expected='{2}'",
1914 family->
fullName(), hash_str, expected_hash);
1926 uids[iitem.index()] = iitem->uniqueId();
1942 Int64 uid0 = nodes_unique_id[0];
1943 Int64 hash = Hasher::hashfunc(uid0);
1944 for (
Int32 i = 1; i < nb_node; ++i) {
1945 Int64 next_hash = Hasher::hashfunc(nodes_unique_id[i]);
1946 hash ^= next_hash + 0x9e3779b9 + (hash << 6) + (hash >> 2);
1948 Int64 new_uid = abs(hash);
1949 ARCANE_ASSERT(new_uid >= 0, (
"UniqueId is not >= 0"));
1960 mesh->utilities()->computeAndSetOwnersForNodes();
1970 mesh->utilities()->computeAndSetOwnersForEdges();
1980 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.
Tableau d'items de types quelconques.
void clear()
Supprime les éléments du tableau.
iterator end()
Itérateur sur le premier élément après la fin du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
iterator begin()
Itérateur sur le premier élément du tableau.
Span< const T > constSpan() const
Vue constante sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à 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 flottant.
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.
Fonctor pour une fonction de hachage.
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.
Implémentation d'un groupe d'entités de maillage.
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.
Structure interne d'une entité de maillage.
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.
Face face(Int32 i) const
i-ème face du noeud
Int32 nbEdge() const
Nombre d'arêtes connectées au noeud.
Edge edge(Int32 i) const
i-ème arête du noeud
Int32 nbFace() const
Nombre de faces connectées au noeud.
Int32 nbCell() const
Nombre de mailles connectées au noeud.
Exception lorsqu'une fonction n'est pas implémentée.
Classe gérant un vecteur de réel de dimension 3.
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é.
Classe pour calculer le hash d'un tableau.
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.
Integer toInteger(Real r)
Converti un Int64 en un Integer.
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.
impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
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é.
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