14#include "arcane/mesh/TiedInterfaceMng.h"
15#include "arcane/mesh/DynamicMesh.h"
16#include "arcane/mesh/FaceFamily.h"
18#include "arcane/mesh/TiedInterface.h"
20#include "arcane/core/XmlNode.h"
21#include "arcane/core/IMesh.h"
22#include "arcane/core/ISubDomain.h"
23#include "arcane/core/ICaseDocument.h"
24#include "arcane/core/CaseNodeNames.h"
25#include "arcane/core/IParallelMng.h"
26#include "arcane/core/IMeshPartitionConstraintMng.h"
27#include "arcane/core/IMeshUtilities.h"
28#include "arcane/core/ArcaneException.h"
41: TraceAccessor(mesh->traceMng())
43, m_sub_domain(mesh->subDomain())
45, m_tied_interface_items_info(VariableBuildInfo(m_sub_domain, m_name +
"TiedInterfaceItemsInfo"))
46, m_tied_interface_nodes_iso(VariableBuildInfo(m_sub_domain, m_name +
"TiedInterfaceNodesIso"))
47, m_tied_interface_face_groups(VariableBuildInfo(m_sub_domain, m_name +
"TiedInterfaceFaceGroups"))
59 m_tied_constraint = 0;
61 _deleteTiedInterfaces();
67void TiedInterfaceMng::
68computeTiedInterfaces(
const XmlNode& mesh_node)
70 ICaseDocument* doc = subDomain()->caseDocument();
71 CaseNodeNames* cnn = doc->caseNodeNames();
72 String tied_interfaces_name = cnn->tied_interfaces;
73 String tied_interface_not_structured_name = cnn->tied_interfaces_not_structured;
74 String tied_interfaces_planar_tolerance = cnn->tied_interfaces_planar_tolerance;
75 String semi_conform_name = cnn->tied_interfaces_semi_conform;
76 String name_attribute = cnn->tied_interfaces_slave;
77 XmlNode tied_interface_elem = mesh_node.child(tied_interfaces_name);
78 XmlNodeList child_list = tied_interface_elem.children(semi_conform_name);
79 bool has_error =
false;
81 IParallelMng* pm = m_mesh->parallelMng();
82 bool is_parallel = pm->isParallel();
83 UniqueArray<FaceGroup> interfaces_group;
84 UniqueArray<bool> is_structured_list;
85 UniqueArray<Real> planar_tolerance_list;
86 FaceFamily& face_family = m_mesh->trueFaceFamily();
87 for (
auto& i : child_list) {
88 XmlNode group_attr = i.attr(name_attribute);
89 if (group_attr.null()) {
90 error() <<
"Attribute '" << name_attribute <<
"' missing";
94 String group_name = i.attrValue(name_attribute);
95 FaceGroup face_group = face_family.findGroup(group_name);
96 if (face_group.null()) {
97 error() <<
"Can't find the interface '" << group_name <<
"'";
101 if (interfaces_group.contains(face_group)) {
102 error() <<
"The group '" << group_name <<
"' is already present in list of tied interfaces.";
106 interfaces_group.add(face_group);
108 bool is_not_structured = i.attr(tied_interface_not_structured_name).valueAsBoolean();
109 info() <<
"** NOT STRUCTURED? = " << is_not_structured;
110 is_structured_list.add(!is_not_structured);
111 XmlNode tolerance_node = i.attr(tied_interfaces_planar_tolerance);
112 if (tolerance_node.null()) {
113 planar_tolerance_list.add(0.);
116 planar_tolerance_list.add(tolerance_node.valueAsReal());
120 fatal() <<
"Can't determine the tied interfaces";
126 FaceGroup g1 = face_family.findGroup(
"SOUDURE");
128 g1 = face_family.findGroup(
"SOUDURES");
131 if (!interfaces_group.contains(g1)) {
132 info() <<
"Add automatically the group '" << g1.name() <<
"' to the list of tied interfaces";
133 interfaces_group.add(g1);
134 is_structured_list.add(
true);
135 planar_tolerance_list.add(0.0);
138 info() <<
"built-in group " << g1.name() <<
" already in list of tied interfaces";
142 Integer nb_interface = interfaces_group.size();
143 IItemFamily* cell_family = m_mesh->cellFamily();
144 if (nb_interface != 0) {
152 cells_owner[iitem] = (*iitem).owner();
156 TiedInterface::PartitionConstraintBase* c = TiedInterface::createConstraint(m_mesh, interfaces_group);
157 m_tied_constraint = c;
158 IMeshPartitionConstraintMng* pcmng = m_mesh->partitionConstraintMng();
159 pcmng->addConstraint(c);
160 pcmng->computeAndApplyConstraints();
162 cells_owner.synchronize();
163 m_mesh->utilities()->changeOwnersFromCells();
164 m_mesh->setDynamic(
true);
165 m_mesh->exchangeItems();
167 c->setInitialRepartition(
false);
169 for (Integer i = 0, is = interfaces_group.size(); i < is; ++i) {
170 FaceGroup face_group = interfaces_group[i];
171 info() <<
" Semi-conform interface name=" << face_group.
name();
172 TiedInterface* tied_interface =
new TiedInterface(m_mesh);
173 if (planar_tolerance_list[i] > 0)
174 tied_interface->setPlanarTolerance(planar_tolerance_list[i]);
175 tied_interface->build(face_group, is_structured_list[i]);
179 m_true_tied_interfaces.add(tied_interface);
180 m_tied_interfaces.add(tied_interface);
181 face_family.applyTiedInterface(tied_interface);
184 face_family.endUpdate();
185 face_family.prepareForDump();
187 prepareTiedInterfacesForDump();
193void TiedInterfaceMng::
194prepareTiedInterfacesForDump()
196 Integer nb_tied_interface = m_tied_interfaces.count();
197 m_tied_interface_face_groups.resize(nb_tied_interface * 2);
201 Integer nb_tied_node_per_interface = 0;
202 Integer nb_tied_face_per_interface = 0;
203 for (Integer i = 0; i < nb_tied_interface; ++i) {
204 ITiedInterface* ti = m_tied_interfaces[i];
206 TiedInterfaceNodeList nodes = ti->tiedNodes();
207 nb_tied_node_per_interface += nodes.
dim1Size();
208 for (Integer zz = 0, zs = nodes.dim1Size(); zz < zs; ++zz)
209 total_nb_node += nodes[zz].size();
211 TiedInterfaceFaceList faces = ti->tiedFaces();
212 nb_tied_face_per_interface += faces.
dim1Size();
213 for (Integer zz = 0, zs = faces.dim1Size(); zz < zs; ++zz)
214 total_nb_face += faces[zz].size();
217 Integer items_info_size = total_nb_node + total_nb_face +
218 nb_tied_node_per_interface + nb_tied_face_per_interface + nb_tied_interface * 2;
220 Integer nodes_iso_size = total_nb_node;
222 m_tied_interface_items_info.resize(items_info_size);
223 m_tied_interface_nodes_iso.resize(nodes_iso_size);
227 for (Integer i = 0; i < nb_tied_interface; ++i) {
228 ITiedInterface* ti = m_tied_interfaces[i];
230 TiedInterfaceNodeList nodes = ti->tiedNodes();
231 Integer nb_node = nodes.dim1Size();
232 m_tied_interface_items_info[items_info_index] = nb_node;
234 for (Integer zz = 0; zz < nb_node; ++zz) {
235 Integer nb_node2 = nodes[zz].size();
236 m_tied_interface_items_info[items_info_index] = nb_node2;
240 for (Integer zz = 0; zz < nb_node; ++zz) {
241 Integer nb_node2 = nodes[zz].size();
242 for (Integer zz2 = 0; zz2 < nb_node2; ++zz2) {
243 m_tied_interface_items_info[items_info_index] = nodes[zz][zz2].node().uniqueId().asInt64();
245 m_tied_interface_nodes_iso[nodes_iso_index] = nodes[zz][zz2].isoCoordinates();
250 TiedInterfaceFaceList faces = ti->tiedFaces();
251 Integer nb_face = faces.dim1Size();
252 m_tied_interface_items_info[items_info_index] = nb_face;
254 for (Integer zz = 0; zz < nb_face; ++zz) {
255 Integer nb_face2 = faces[zz].size();
256 m_tied_interface_items_info[items_info_index] = nb_face2;
260 for (Integer zz = 0; zz < nb_face; ++zz) {
261 Integer nb_face2 = faces[zz].size();
262 for (Integer zz2 = 0; zz2 < nb_face2; ++zz2) {
263 m_tied_interface_items_info[items_info_index] = faces[zz][zz2].face().uniqueId().asInt64();
268 debug() <<
"ITEMS_INFO_INDEX=" << items_info_index <<
" N=" << items_info_size;
269 debug() <<
"NODES_ISO_INDEX=" << nodes_iso_index <<
" N=" << nodes_iso_size;
270 if (nodes_iso_index != nodes_iso_size)
271 throw InternalErrorException(A_FUNCINFO,
"Bad size for 'nodes_iso_index'");
272 if (items_info_index != items_info_size)
273 throw InternalErrorException(A_FUNCINFO,
"Bad size for 'items_info_index'");
274 for (Integer i = 0; i < nb_tied_interface; ++i) {
275 ITiedInterface* ti = m_tied_interfaces[i];
276 m_tied_interface_face_groups[(i * 2)] = ti->masterInterfaceName();
277 m_tied_interface_face_groups[(i * 2) + 1] = ti->slaveInterfaceName();
284void TiedInterfaceMng::
285readTiedInterfacesFromDump()
287 _deleteTiedInterfaces();
288 Integer nb_tied_interface = m_tied_interface_face_groups.size() / 2;
293 IItemFamily* node_family = m_mesh->nodeFamily();
294 FaceFamily& face_family = m_mesh->trueFaceFamily();
295 NodeInfoListView nodes_internal(node_family);
296 FaceInfoListView faces_internal(&face_family);
297 UniqueArray<TiedNode> nodes;
298 UniqueArray<TiedFace> faces;
300 for (Integer i = 0; i < nb_tied_interface; ++i) {
301 TiedInterface* tied_interface =
new TiedInterface(m_mesh);
302 String master_group_name = m_tied_interface_face_groups[(i * 2)];
303 String slave_group_name = m_tied_interface_face_groups[(i * 2) + 1];
304 tied_interface->reload(&face_family, master_group_name, slave_group_name);
305 FaceGroup master_group = tied_interface->masterInterface();
306 FaceGroup slave_group = tied_interface->slaveInterface();
307 m_tied_interfaces.add(tied_interface);
308 m_true_tied_interfaces.add(tied_interface);
313 for (Integer zz = 0; zz < nb_node; ++zz) {
316 items_size[zz] = nb_node2;
318 tied_interface->resizeNodes(items_size);
320 for (Integer zz = 0; zz < nb_node; ++zz) {
321 Integer nb_node2 = items_size[zz];
323 local_ids.resize(nb_node2);
325 node_family->itemsUniqueIdToLocalId(local_ids, unique_ids,
true);
326 items_info_index += nb_node2;
328 for (Integer zz2 = 0; zz2 < nb_node2; ++zz2) {
329 Node node(nodes_internal[local_ids[zz2]]);
330 nodes.add(TiedNode(zz2, node, m_tied_interface_nodes_iso[nodes_iso_index]));
333 tied_interface->setNodes(zz, nodes);
338 items_size.resize(nb_face);
339 for (Integer zz = 0; zz < nb_face; ++zz) {
342 items_size[zz] = nb_face2;
344 tied_interface->resizeFaces(items_size);
345 UniqueArray<TiedFace> faces2;
346 for (Integer zz = 0; zz < nb_face; ++zz) {
347 Integer nb_face2 = items_size[zz];
349 local_ids.resize(nb_face2);
351 face_family.itemsUniqueIdToLocalId(local_ids, unique_ids,
true);
352 items_info_index += nb_face2;
353 for (Integer zz2 = 0; zz2 < nb_face2; ++zz2) {
354 Face face(faces_internal[local_ids[zz2]]);
355 faces2.add(TiedFace(zz2, face));
357 tied_interface->setFaces(zz, faces2);
359 info() <<
"Read interface nb_face=" << nb_face <<
" nb_node=" << nb_node;
363 if (!m_tied_constraint) {
364 info() <<
"Rebuilding tied interface constraints";
365 UniqueArray<FaceGroup> interface_groups;
366 for (Integer i = 0, n = m_true_tied_interfaces.size(); i < n; ++i)
367 interface_groups.add(m_true_tied_interfaces[i]->slaveInterface());
369 Integer nb_interface = interface_groups.size();
370 if (nb_interface != 0) {
371 TiedInterface::PartitionConstraintBase* c = TiedInterface::createConstraint(m_mesh, interface_groups);
372 m_tied_constraint = c;
373 IMeshPartitionConstraintMng* pcmng = m_mesh->partitionConstraintMng();
374 pcmng->addConstraint(c);
376 c->setInitialRepartition(
false);
384void TiedInterfaceMng::
385_applyTiedInterfaceStructuration(TiedInterface* tied_interface)
395 TiedInterfaceNodeList nodes = tied_interface->tiedNodes();
396 for (Integer zz = 0, zs = nodes.dim1Size(); zz < zs; ++zz) {
397 Integer current_nb_node = nodes[zz].size();
400 for (Integer i = 0; i < current_nb_node; ++i) {
401 Real2 iso_val = nodes[zz][i].isoCoordinates();
402 info() <<
"ISO zz=" << zz <<
" i=" << i <<
" v=" << iso_val <<
" old=" << old_y;
403 if (iso_val.y > old_y) {
407 info() <<
"COMPUTED M = " << computed_m;
418void TiedInterfaceMng::
419_deleteTiedInterfaces()
421 for (Integer i = 0, is = m_tied_interfaces.count(); i < is; ++i)
422 delete m_tied_interfaces[i];
423 m_tied_interfaces.clear();
424 m_true_tied_interfaces.clear();
Int32 dim1Size() const
Number of elements in the first dimension.
const String & name() const
Group name.
Implementation of a mesh.
ItemGroupT< Face > FaceGroup
Group of faces.
ItemVariableScalarRefT< Int32 > VariableItemInt32
32-bit integer type quantity
Integer arcaneCheckArraySize(unsigned long long size)
Checks that size can be converted into an 'Integer' to serve as the size of an array....
Int32 Integer
Type representing an integer.
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
UniqueArray< Integer > IntegerUniqueArray
Dynamic 1D array of integers.