14#include "arcane/utils/PlatformUtils.h"
15#include "arcane/utils/ArgumentException.h"
16#include "arcane/utils/CheckedConvert.h"
18#include "arcane/mesh/DynamicMesh.h"
19#include "arcane/mesh/FaceUniqueIdBuilder.h"
21#include "arcane/core/IParallelMng.h"
22#include "arcane/core/Timer.h"
24#include "arcane/parallel/BitonicSortT.H"
99 bool m_is_verbose =
false;
142 static const Int64 BITS_CELL_UID = 39;
143 static const Int64 BITS_RANK = 20;
144 static const Int64 BITS_INDEX = 5;
145 static const Int64 ONE_INT64 = 1;
146 static const Int64 MASK_CELL_UID = (ONE_INT64 << BITS_CELL_UID) - 1;
147 static const Int64 MASK_RANK = ((ONE_INT64 << BITS_RANK) - 1) << BITS_CELL_UID;
148 static const Int64 MASK_INDEX = ((ONE_INT64 << BITS_INDEX) - 1) << (BITS_CELL_UID + BITS_RANK);
154 setValue(NULL_ITEM_UNIQUE_ID, -1, -1);
159 bool isMaxValue()
const
161 Int64 max_id = (MASK_CELL_UID - 1);
162 return cellUid() == max_id;
167 Int64 max_id = (MASK_CELL_UID - 1);
168 setValue(max_id, -1, -1);
173 Int64 v_fli = face_local_index + 1;
174 Int64 v_rank = _rank + 1;
175 Int64 v_uid = cell_uid + 1;
176 m_value = v_fli << (BITS_CELL_UID + BITS_RANK);
177 m_value += v_rank << (BITS_CELL_UID);
179 if (cellUid() != cell_uid)
180 ARCANE_FATAL(
"Bad uid expected='{0}' computed='{1}' v={2}", cell_uid, cellUid(), m_value);
182 ARCANE_FATAL(
"Bad rank expected='{0}' computed='{1}'", _rank, rank());
183 if (faceLocalIndex() != face_local_index)
184 ARCANE_FATAL(
"Bad local_index expected='{0}' computed='{1}'", face_local_index, faceLocalIndex());
186 Int64 cellUid()
const {
return (m_value & MASK_CELL_UID) - 1; }
187 Int32 rank()
const {
return CheckedConvert::toInt32(((m_value & MASK_RANK) >> BITS_CELL_UID) - 1); }
188 Int32 faceLocalIndex()
const {
return CheckedConvert::toInt32(((m_value & MASK_INDEX) >> (BITS_CELL_UID + BITS_RANK)) - 1); }
190 bool isValid()
const {
return cellUid() != NULL_ITEM_UNIQUE_ID; }
207 : m_cell_uid(NULL_ITEM_UNIQUE_ID)
209 , m_face_local_index(-1)
214 bool isMaxValue()
const
216 Int64 max_id = INT64_MAX;
217 return cellUid() == max_id;
222 Int64 max_id = INT64_MAX;
223 setValue(max_id, -1, -1);
227 m_cell_uid = cell_uid;
229 m_face_local_index = face_local_index;
231 Int64 cellUid()
const {
return m_cell_uid; }
232 Int32 rank()
const {
return m_rank; }
233 Int32 faceLocalIndex()
const {
return m_face_local_index; }
234 bool isValid()
const {
return m_cell_uid != NULL_ITEM_UNIQUE_ID; }
240 Int32 m_face_local_index;
256 : m_node0_uid(NULL_ITEM_UNIQUE_ID)
257 , m_node1_uid(NULL_ITEM_UNIQUE_ID)
258 , m_node2_uid(NULL_ITEM_UNIQUE_ID)
259 , m_cell_uid(NULL_ITEM_UNIQUE_ID)
261 , m_face_local_index(-1)
263 bool hasSameNodes(
const BoundaryFaceInfo& fsi)
const
265 return fsi.m_node0_uid == m_node0_uid && fsi.m_node1_uid == m_node1_uid && fsi.m_node2_uid == m_node2_uid;
267 void setNodes(
Face face)
285 Int32 m_face_local_index;
303 AnyFaceInfo() =
default;
309 m_cell0.setValue(uid, rank, face_local_index);
313 m_cell1.setValue(uid, rank, face_local_index);
318 CellFaceInfo m_cell0;
319 CellFaceInfo m_cell1;
337 Int32 m_face_local_index_and_owner_rank;
338 Int32 m_index_in_rank_list;
358 if (k1.m_node0_uid < k2.m_node0_uid)
360 if (k1.m_node0_uid > k2.m_node0_uid)
364 if (k1.m_node1_uid < k2.m_node1_uid)
366 if (k1.m_node1_uid > k2.m_node1_uid)
370 if (k1.m_node2_uid < k2.m_node2_uid)
372 if (k1.m_node2_uid > k2.m_node2_uid)
376 return (k1.m_cell_uid < k2.m_cell_uid);
396 fsi.m_cell_uid = INT64_MAX;
397 fsi.m_rank = INT32_MAX;
398 fsi.m_node0_uid = INT64_MAX;
399 fsi.m_node1_uid = INT64_MAX;
400 fsi.m_node2_uid = INT64_MAX;
405 return fsi.m_cell_uid != INT64_MAX;
427 Int64 k1_cell0_uid = k1.m_cell0.cellUid();
428 Int64 k2_cell0_uid = k2.m_cell0.cellUid();
429 if (k1_cell0_uid < k2_cell0_uid)
431 if (k1_cell0_uid > k2_cell0_uid)
434 Int64 k1_face0_local_index = k1.m_cell0.faceLocalIndex();
435 Int64 k2_face0_local_index = k2.m_cell0.faceLocalIndex();
436 if (k1_face0_local_index < k2_face0_local_index)
438 if (k1_face0_local_index > k2_face0_local_index)
441 return (k1.m_cell1.cellUid() < k2.m_cell1.cellUid());
461 csi.m_cell0.setMaxValue();
462 csi.m_cell1.setMaxValue();
468 return !csi.m_cell0.isMaxValue();
479 bool operator()(
const Item& i1,
const Item& i2)
const
495, m_parallel_mng(
mesh->parallelMng())
510 if (m_parallel_mng->isParallel())
524 info() <<
"Compute FacesUniqueId() Sequential V3";
527 Int64 face_unique_id_counter = 0;
543 for (
Integer i = 0; i < nb_cell; ++i) {
544 Cell cell = cells[i];
546 if (face.uniqueId() == NULL_ITEM_UNIQUE_ID) {
547 face.mutableItemBase().setUniqueId(face_unique_id_counter);
548 ++face_unique_id_counter;
565 bool is_verbose = m_is_verbose;
569 info() <<
"Compute FacesUniqueId() V3 using parallel sort";
591 bool is_last_already_done =
false;
592 for (
Integer i = 0; i < n; ++i) {
594 Int64 cell_uid0 = fsi.m_cell_uid;
595 bool is_inside =
false;
599 is_inside = ((i + 1) != n && fsi.hasSameNodes(all_fsi[i + 1]));
600 if (is_last_already_done) {
601 is_last_already_done =
false;
607 Int64 cell_uid1 = next_fsi.m_cell_uid;
608 if (cell_uid0 < cell_uid1) {
609 csi.setCell0(cell_uid0, fsi.m_rank, fsi.m_face_local_index);
610 csi.setCell1(cell_uid1, next_fsi.m_rank, next_fsi.m_face_local_index);
613 csi.setCell0(cell_uid1, next_fsi.m_rank, next_fsi.m_face_local_index);
614 csi.setCell1(cell_uid0, fsi.m_rank, fsi.m_face_local_index);
616 is_last_already_done =
true;
619 csi.setCell0(cell_uid0, fsi.m_rank, fsi.m_face_local_index);
621 all_face_list.
add(csi);
624 info() <<
"FACES_KEY i=" << i
625 <<
" n0=" << fsi.m_node0_uid
626 <<
" n1=" << fsi.m_node1_uid
627 <<
" n2=" << fsi.m_node2_uid
628 <<
" cell=" << fsi.m_cell_uid
629 <<
" rank=" << fsi.m_rank
630 <<
" li=" << fsi.m_face_local_index
631 <<
" in=" << is_inside;
640 for (
Integer z = 0; z < cell_nb_face; ++z) {
646 Cell next_cell = (cell0 == cell) ? cell1 : cell0;
649 if (cell_uid < next_cell_uid) {
651 csi.m_cell0.setValue(cell_uid, my_rank, z);
653 csi.m_cell1.setValue(next_cell_uid, my_rank, -1);
654 all_face_list.
add(csi);
661 for (
Integer i = 0; i < n; ++i) {
663 info() <<
"CELL_TO_SORT i=" << i
664 <<
" cell0=" << csi.m_cell0.cellUid()
665 <<
" lidx0=" << csi.m_cell0.faceLocalIndex()
666 <<
" cell1=" << csi.m_cell1.cellUid();
672 all_face_sorter.setNeedIndexAndRank(
false);
674 all_face_sorter.
sort(all_face_list);
676 info() <<
"END_ALL_FACE_SORTER time=" << (
Real)(sort_end_time - sort_begin_time);
678 _resendCellsAndComputeFacesUniqueId(all_face_sorter.
keys());
692 bool is_verbose = m_is_verbose;
696 boundary_face_sorter.setNeedIndexAndRank(
false);
699 boundary_faces_info.
clear();
706 fsi.m_rank = my_rank;
712 if (cell.
face(z) == face) {
713 face_local_index = z;
716 fsi.m_face_local_index = face_local_index;
717 boundary_faces_info.
add(fsi);
723 for (
Integer i = 0; i < n; ++i) {
725 info() <<
"KEY i=" << i
726 <<
" n0=" << fsi.m_node0_uid
727 <<
" n1=" << fsi.m_node1_uid
728 <<
" n2=" << fsi.m_node2_uid
729 <<
" cell=" << fsi.m_cell_uid
730 <<
" rank=" << fsi.m_rank
731 <<
" li=" << fsi.m_face_local_index;
736 boundary_face_sorter.
sort(boundary_faces_info);
738 info() <<
"END_BOUNDARY_FACE_SORT time=" << (
Real)(sort_end_time - sort_begin_time);
744 for (
Integer i = 0; i < n; ++i) {
746 info() <<
" AFTER KEY i=" << i
747 <<
" n0=" << bfi.m_node0_uid
748 <<
" n1=" << bfi.m_node1_uid
749 <<
" n2=" << bfi.m_node2_uid
750 <<
" cell=" << bfi.m_cell_uid
751 <<
" rank=" << bfi.m_rank
752 <<
" li=" << bfi.m_face_local_index;
761 Integer begin_own_list_index = 0;
762 if (n != 0 && my_rank != 0) {
763 if (BoundaryFaceBitonicSortTraits::isValid(all_bfi[0])) {
764 Int64 node0_uid = all_bfi[0].m_node0_uid;
765 for (
Integer i = 0; i < n; ++i) {
766 if (all_bfi[i].m_node0_uid != node0_uid) {
767 begin_own_list_index = i;
771 end_face_list.
add(all_bfi[i]);
775 info() <<
"BEGIN_OWN_LIST_INDEX=" << begin_own_list_index;
777 for (
Integer k = 0, kn = end_face_list.
size(); k < kn; ++k)
778 info() <<
" SEND n0=" << end_face_list[k].m_node0_uid
779 <<
" n1=" << end_face_list[k].m_node1_uid
780 <<
" n2=" << end_face_list[k].m_node2_uid;
787 Integer send_message_size = BoundaryFaceBitonicSortTraits::messageSize(end_face_list);
792 if (my_rank != (nb_rank - 1)) {
802 if (recv_message_size != 0) {
804 end_face_list_recv.
resize(message_size);
805 requests.
add(BoundaryFaceBitonicSortTraits::recv(pm, my_rank + 1, end_face_list_recv));
807 if (send_message_size != 0)
808 requests.
add(BoundaryFaceBitonicSortTraits::send(pm, my_rank - 1, end_face_list));
812 boundary_faces_info.
clear();
813 boundary_faces_info.
addRange(all_bfi.
subConstView(begin_own_list_index, n - begin_own_list_index));
814 boundary_faces_info.
addRange(end_face_list_recv);
821void FaceUniqueIdBuilder2::
827 bool is_verbose = m_is_verbose;
834 for (
Integer i = 0; i < nb_computed_face; ++i) {
835 const AnyFaceInfo& csi = all_csi[i];
836 info() <<
"CELLS_KEY i=" << i
837 <<
" cell0=" << csi.m_cell0.cellUid()
838 <<
" lidx0=" << csi.m_cell0.faceLocalIndex()
839 <<
" cell1=" << csi.m_cell1.cellUid()
840 <<
" lidx1=" << csi.m_cell1.faceLocalIndex()
841 <<
" rank0=" << csi.m_cell0.rank()
842 <<
" rank1=" << csi.m_cell1.rank();
850 for (
Integer i = 0; i < nb_computed_face; ++i) {
851 const AnyFaceInfo& csi = all_csi[i];
852 Int32 rank0 = csi.m_cell0.rank();
853 Int32 rank1 = csi.m_cell1.rank();
855 ++nb_info_to_send[rank0];
858 if (csi.m_cell1.isValid() && rank1 != rank0)
859 ++nb_info_to_send[rank1];
874 for (
Integer i = 0; i < nb_rank; ++i) {
875 Int64 next = all_first_face_uid[i];
876 all_first_face_uid[i] = to_add;
883 for (
Integer i = 0; i < nb_rank; ++i) {
884 nb_info_to_send_indexes[i] = total_nb_to_send;
885 total_nb_to_send += nb_info_to_send[i];
887 info() <<
"TOTAL_NB_TO_SEND=" << total_nb_to_send;
889 UniqueArray<ResendCellInfo> resend_infos(total_nb_to_send);
891 for (
Integer i = 0; i < nb_computed_face; ++i) {
893 Int32 rank0 = csi.m_cell0.rank();
894 Int32 rank1 = csi.m_cell1.rank();
896 ResendCellInfo& rci0 = resend_infos[nb_info_to_send_indexes[rank0]];
897 rci0.m_cell_uid = csi.m_cell0.cellUid();
898 rci0.m_face_local_index_and_owner_rank = (csi.m_cell0.faceLocalIndex() * nb_rank) + rank0;
899 rci0.m_index_in_rank_list = i;
900 ++nb_info_to_send_indexes[rank0];
902 if (csi.m_cell1.isValid() && rank1 != rank0) {
903 ResendCellInfo& rci1 = resend_infos[nb_info_to_send_indexes[rank1]];
904 rci1.m_cell_uid = csi.m_cell1.cellUid();
906 rci1.m_face_local_index_and_owner_rank = (csi.m_cell1.faceLocalIndex() * nb_rank) + rank0;
907 rci1.m_index_in_rank_list = i;
908 ++nb_info_to_send_indexes[rank1];
915 info() <<
"TOTAL_NB_COMPUTED_FACE=" << total_nb_computed_face;
919 for (
Integer i = 0; i < nb_rank; ++i)
920 info() <<
"NB_TO_SEND: I=" << i <<
" n=" << nb_info_to_send[i];
924 Timer::SimplePrinter sp(
traceMng(),
"Sending size with AllToAll");
925 pm->allToAll(nb_info_to_send, nb_info_to_recv, 1);
929 for (
Integer i = 0; i < nb_rank; ++i)
930 info() <<
"NB_TO_RECV: I=" << i <<
" n=" << nb_info_to_recv[i];
933 for (
Integer i = 0; i < nb_rank; ++i)
934 total_nb_to_recv += nb_info_to_recv[i];
940 UniqueArray<ResendCellInfo> recv_infos;
947 Int32 total_send = 0;
948 Int32 total_recv = 0;
949 for (
Integer i = 0; i < nb_rank; ++i) {
950 send_counts[i] = (
Int32)(nb_info_to_send[i] * vsize);
951 recv_counts[i] = (
Int32)(nb_info_to_recv[i] * vsize);
952 send_indexes[i] = total_send;
953 recv_indexes[i] = total_recv;
954 total_send += send_counts[i];
955 total_recv += recv_counts[i];
957 recv_infos.resize(total_nb_to_recv);
962 info() <<
"BUF_SIZES: send=" << send_buf.size() <<
" recv=" << recv_buf.size();
964 Timer::SimplePrinter sp(
traceMng(),
"Send values with AllToAll");
965 pm->allToAllVariable(send_buf, send_counts, send_indexes, recv_buf, recv_counts, recv_indexes);
974 for (
Int32 rank = 0; rank < nb_rank; ++rank) {
975 for (
Integer z = 0, zs = nb_info_to_recv[rank]; z < zs; ++z) {
979 Int64 cell_uid = rci.m_cell_uid;
980 Int32 full_local_index = rci.m_face_local_index_and_owner_rank;
981 Int32 face_local_index = full_local_index / nb_rank;
982 Int32 owner_rank = full_local_index % nb_rank;
983 Int64 face_uid = all_first_face_uid[rank] + rci.m_index_in_rank_list;
984 info() <<
"RECV index=" << index <<
" uid=" << cell_uid
985 <<
" local_idx=" << full_local_index
986 <<
" face_local_idx=" << face_local_index
987 <<
" owner_rank=" << owner_rank
988 <<
" rank_idx=" << rci.m_index_in_rank_list
990 <<
" first_face_uid=" << all_first_face_uid[rank]
991 <<
" computed_uid=" << face_uid;
999 for (
Int32 i = 0; i < nb_rank; ++i) {
1001 for (
Integer z = 0, zs = nb_info_to_recv[i]; z < zs; ++z) {
1005 Int64 cell_uid = rci.m_cell_uid;
1006 Int32 full_local_index = rci.m_face_local_index_and_owner_rank;
1007 Int32 face_local_index = full_local_index / nb_rank;
1008 Int32 owner_rank = full_local_index % nb_rank;
1012 ARCANE_FATAL(
"Can not find cell data for '{0}'", cell_uid);
1013 Face face = cell.face(face_local_index);
1014 Int64 face_uid = all_first_face_uid[rank] + rci.m_index_in_rank_list;
1015 face.mutableItemBase().setUniqueId(face_uid);
1016 face.mutableItemBase().setOwner(owner_rank, my_rank);
1033 info() <<
"Compute FacesUniqueId() V5 (experimental)";
1043 nodes_uid.
resize(nb_node);
1047 nodes_uid[index] = node.uniqueId();
1055 Int32 new_rank = my_rank;
1056 if (is_parallel && face.
nbCell() == 1)
1057 new_rank = A_NULL_RANK;
1088 if (face_uid == NULL_ITEM_UNIQUE_ID) {
1094 ARCANE_FATAL(
"Internal error in face uniqueId computation: nb_invalid={0}", nb_error);
1104 f.computeFacesUniqueIdAndOwnerVersion3();
1111_computeFaceUniqueIdVersion5(DynamicMesh*
mesh)
1113 FaceUniqueIdBuilder2 f(
mesh);
1114 f.computeFacesUniqueIdAndOwnerVersion5();
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Int64 generateHashUniqueId(SmallSpan< const Int64 > nodes_unique_id)
Génère un identifiant unique à partir d'une liste d'identifiants de noeuds.
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Tableau d'items de types quelconques.
void clear()
Supprime les éléments 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.
void addRange(ConstReferenceType val, Int64 n)
Ajoute n élément de valeur val à la fin du tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
FaceConnectedListViewType faces() const
Liste des faces de la maille.
Face face(Int32 i) const
i-ème face de la maille
Int32 nbFace() const
Nombre de faces de la maille.
Vue constante d'un tableau de type T.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr ConstArrayView< T > subConstView(Integer abegin, Integer asize) const noexcept
Sous-vue (constante) à partir de l'élément abegin et contenant asize éléments.
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2).
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void allGather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf)=0
Effectue un regroupement sur tous les processeurs. Il s'agit d'une opération collective....
virtual void waitAllRequests(ArrayView< Request > rvalues)=0
Bloque en attendant que les requêtes rvalues soient terminées.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Node node(Int32 i) const
i-ème noeud de l'entité
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
void unsetUniqueId()
Annule l'uniqueId a la valeur NULL_ITEM_UNIQUE_ID.
Algorithme de tri bi-tonique parallèle.
ConstArrayView< KeyType > keys() const override
Après un tri, retourne la liste des éléments de ce rang.
void sort(ConstArrayView< KeyType > keys) override
Trie en parallèle les éléments de keys sur tous les rangs.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
Implementation of a mesh.
Functor for sorting AnyFaceInfo using bitonic sort.
Info for managing faces of sub-domains.
Functor for sorting BoundaryFaceInfo via bitonic sort.
Info for managing boundary faces of sub-domains.
Stores info about a face of a mesh cell.
Stores info about a face of a mesh cell.
Construction of the uniqueId() for faces.
void _checkFacesUniqueId()
Checks that all faces have a valid uid.
void _unsetFacesUniqueId()
Invalidates the uids to ensure they are all positioned.
void _computeAndSortBoundaryFaces(Array< BoundaryFaceInfo > &boundary_faces_info)
Determines the list of boundary faces for each subdomain and sorts them across all procs.
void _computeParallel()
Calculates the unique IDs of each face in parallel.
void computeFacesUniqueIdAndOwnerVersion3()
Calculates the unique IDs of each face in parallel.
void _computeSequential()
Calculates the unique IDs of each face sequentially.
FaceUniqueIdBuilder2(DynamicMesh *mesh)
Constructs an instance for the mesh mesh.
void computeFacesUniqueIdAndOwnerVersion5()
Calculates uniqueId() via a hash generated by the uniqueId() of the nodes.
Associative array of ItemInternal.
void eachItem(const Lambda &lambda)
Template function to iterate over the instance's entities.
impl::ItemBase tryFind(Int64 key) const
Returns the entity associated with key if found, or the null entity otherwise.
Int32 count() const
Number of elements in the table.
@ ReduceSum
Somme des valeurs.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
double Real
Type représentant un réel.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
unsigned char Byte
Type d'un octet.
UniqueArray< Integer > IntegerUniqueArray
Tableau dynamique à une dimension d'entiers.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
@ Cell
Le maillage est AMR par maille.
std::int32_t Int32
Type entier signé sur 32 bits.