15#include "arcane/core/IMesh.h"
16#include "arcane/core/IMeshFactoryMng.h"
17#include "arcane/core/IMeshMng.h"
18#include "arcane/core/IMeshModifier.h"
19#include "arcane/core/IPrimaryMesh.h"
20#include "arcane/core/MeshBuildInfo.h"
22#include "arcane/core/IMeshSection.h"
23#include "arcane/std/MeshSection_axl.h"
42class MeshSectionService
63 return m_cloned_mesh->handle();
77 Int32 m_mesh_uid = -1;
84ARCANE_REGISTER_SERVICE_MESHSECTION(MeshSection, MeshSectionService);
105 ARCANE_NOT_YET_IMPLEMENTED(
"Not supported yet");
115 m_mesh_uid = unique_id;
131void MeshSectionService::
134 if (m_cloned_mesh !=
nullptr) {
138 IMeshMng* mm = subDomain()->
meshMng();
140 if (m_mesh_uid == -1) {
142 m_mesh_uid =
options()->getUniqueIdServiceMesh();
149 String service_mesh_name = mesh()->name() +
"_MeshSection" + m_mesh_uid;
151 MeshHandle* mesh_handle = mm->
findMeshHandle(service_mesh_name,
false);
153 if (mesh_handle ==
nullptr) {
154 IParallelMng* pm = subDomain()->parallelMng();
155 MeshBuildInfo mbi(service_mesh_name);
156 mbi.addParallelMng(
makeRef(pm));
157 m_cloned_mesh = mm->meshFactoryMng()->createMesh(mbi);
158 m_cloned_mesh->modifier()->setDynamic(
true);
159 m_cloned_mesh->setDimension(mesh()->dimension());
160 m_cloned_mesh->endAllocate();
163 m_cloned_mesh = mesh_handle->mesh()->toPrimaryMesh();
164 m_cloned_mesh->modifier()->clearItems();
171void MeshSectionService::
177 is_added.fill(
false);
182 for (Node node : icell->nodes()) {
183 b += node_coord[node];
185 b /= icell->nbNode();
188 for (
auto& [p0, normal] : m_plans) {
200 Int16 cell_type = icell->itemTypeId();
201 cells_infos.add(cell_type);
203 Int64 cell_uid = icell->uniqueId().asInt64();
204 cells_infos.add(cell_uid);
206 for (Node node : icell->nodes()) {
207 Int64 node_uid = node.uniqueId().asInt64();
208 cells_infos.add(node_uid);
209 pos_node[node.uniqueId()] = node_coord[node];
213 for (Face face : icell->faces()) {
214 if (is_added[face])
continue;
215 is_added[face] =
true;
217 Int16 face_type = face.itemTypeId();
218 faces_infos.add(face_type);
220 Int64 face_uid = face.uniqueId().asInt64();
221 faces_infos.add(face_uid);
223 for (Node node : face.nodes()) {
224 Int64 node_uid = node.uniqueId().asInt64();
225 faces_infos.add(node_uid);
226 pos_node[node.uniqueId()] = node_coord[node];
236void MeshSectionService::
239 UniqueArray<Int64> cells_infos;
240 cells_infos.reserve(10000);
242 UniqueArray<Int64> faces_infos;
243 faces_infos.reserve(10000);
245 std::unordered_map<Int64, Real3> coord_map;
250 _createCells(nb_cell, cells_infos, nb_face, faces_infos, coord_map);
252 m_cloned_mesh->modifier()->addFaces(nb_face, faces_infos);
253 m_cloned_mesh->modifier()->addCells(nb_cell, cells_infos);
254 m_cloned_mesh->modifier()->endUpdate();
258 ENUMERATE_ (Node, inode, m_cloned_mesh->allNodes()) {
259 node_coords[inode] = coord_map[inode->uniqueId()];
263 info() <<
"New mesh -- NbNode : " << m_cloned_mesh->nbNode() <<
" -- NbCells : " << m_cloned_mesh->nbCell();
ArcaneMeshSectionObject(const Arcane::ServiceBuildInfo &sbi)
Constructeur.
CaseOptionsMeshSection * options() const
Options du jeu de données du service.
virtual MeshHandle * findMeshHandle(const String &name, bool throw_exception)=0
Recherche le maillage de nom name.
virtual void clearItems()=0
Supprime toutes les entitées de toutes les familles de ce maillage.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
virtual IMeshMng * meshMng() const =0
Retourne le gestionnaire de maillage.
CellGroup ownCells() const
Retourne le groupe contenant toutes les mailles propres à ce domaine.
void addPlane(const Real3 &p0, const Real3 &normal) override
Méthode permettant d'ajouter un plan au service de coupe. L'utilisation de ces plans dépend du servic...
void updateSection() override
Méthode permettant de mettre à jour la section du maillage avec tous les plans.
MeshHandle meshSection() override
Méthode permettant d'obtenir la section du maillage.
VariableCollection variables() override
Méthode permettant d'obtenir un ensemble de variables copiées sur le nouveau maillage.
void setVariables(VariableCollection variables) override
Méthode permettant d'ajouter un ensemble de variables à copier sur le nouveau maillage.
void setServiceMeshUniqueId(Int32 unique_id) override
Méthode permettant de définir un identifiant unique pour créer plusieurs services de section pour un ...
Classe gérant un vecteur réel de 3 dimensions.
eServiceType creationType() const
Type du service pouvant être créé par cette instance.
Structure contenant les informations pour créer un service.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
__host__ __device__ Real dot(Real2 u, Real2 v)
Produit scalaire de u par v dans .
__host__ __device__ Real3 normalizeReal3(Real3 v)
Normalisation d'un Real3.
MeshVariableScalarRefT< Face, Byte > VariableFaceBool
Grandeur aux faces de type booléen.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Type entier signé sur 64 bits.
eServiceType
Type du service.
@ ST_CaseOption
Le service s'utilise au niveau du jeu de données.
std::int16_t Int16
Type entier signé sur 16 bits.
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
@ Cell
Le maillage est AMR par maille.
std::int32_t Int32
Type entier signé sur 32 bits.