275 m_internal->corefinementTimer.start();
276 m_internal->migrationTimer.start();
278 pinfo() <<
"Surface infos berfore migration "
279 << m_master_group.name() <<
"(" << m_master_group.size() <<
") and "
280 << m_slave_group.name() <<
"(" << m_slave_group.size() <<
")";
282 IParallelMng * parallel_mng = subDomain()->parallelMng();
290 master_lower_left(maxValue,maxValue,maxValue),
291 master_upper_right(-maxValue,-maxValue,-maxValue),
292 slave_lower_left(maxValue,maxValue,maxValue),
293 slave_upper_right(-maxValue,-maxValue,-maxValue);
299 for (
Node node : iface->nodes()) {
300 master_lower_left =
math::min(master_lower_left, nodesCoordinates[node]);
301 master_upper_right =
math::max(master_upper_right, nodesCoordinates[node]);
305 for (
Node node : iface->nodes()) {
306 master_lower_left =
math::min(master_lower_left, nodesCoordinates[node]);
307 master_upper_right =
math::max(master_upper_right, nodesCoordinates[node]);
313 for (
Node node : iface->nodes()) {
314 slave_lower_left =
math::min(slave_lower_left, nodesCoordinates[node]);
315 slave_upper_right =
math::max(slave_upper_right, nodesCoordinates[node]);
320 master_lower_left.subSame(m_box_tolerance);
321 master_upper_right.addSame(m_box_tolerance);
322 slave_lower_left.subSame(m_box_tolerance);
323 slave_upper_right.
addSame(m_box_tolerance);
325 <<
" M= " << master_lower_left <<
" - " << master_upper_right
326 <<
" S= " << slave_lower_left <<
" - " << slave_upper_right;
331 myBox.
add(master_lower_left);
332 myBox.
add(master_upper_right);
333 myBox.
add(slave_lower_left);
334 myBox.
add(slave_upper_right);
336 const Integer nbSubDomain = subDomain()->nbSubDomain();
348#ifndef NO_USER_WARNING
349#warning "optimisations possibles"
351 for(
Integer i_sub_domain=0; i_sub_domain<nbSubDomain;++i_sub_domain) {
352 if (i_sub_domain == subDomain()->subDomainId())
continue;
353 Internal::Box masterBox(allBoxes[4*i_sub_domain],allBoxes[4*i_sub_domain+1],nodesCoordinates);
354 masterBox.m_trace = traceMng();
356 if (masterBox.isInside(*iface)) {
357 faces_to_send[i_sub_domain].insert(iface->localId());
358 Cell boundaryCell = iface->boundaryCell();
359 if (boundaryCell.
null())
360 fatal() <<
"Non boundary face used in co-refinement";
361 cells_to_send[i_sub_domain].insert(boundaryCell.
localId());
363 nodes_to_send[i_sub_domain].insert(node.localId());
367 Internal::Box slaveBox(allBoxes[4*i_sub_domain+2],allBoxes[4*i_sub_domain+3],nodesCoordinates);
368 slaveBox.m_trace = traceMng();
370 if (masterBox.isInside(*iface)) {
371 faces_to_send[i_sub_domain].insert(iface->localId());
372 Cell boundaryCell = iface->boundaryCell();
373 if (boundaryCell.
null())
374 fatal() <<
"Non boundary face used in co-refinement";
375 cells_to_send[i_sub_domain].insert(boundaryCell.
localId());
377 nodes_to_send[i_sub_domain].insert(node.localId());
382 Internal::exchange_items(
mesh(),nodes_to_send,faces_to_send,cells_to_send);
385 << m_master_group.name() <<
"(" << m_master_group.size() <<
") and "
386 << m_slave_group.name() <<
"(" << m_slave_group.size() <<
")";
388 m_internal->migrationTimer.stop();
395 FaceGroup slave_coref_group = m_slave_group;
396 FaceGroup master_coref_group = m_master_group;
398 typedef Internal::NodeComparator::IntPair IntPair;
399 std::map<IntPair, Integer > slave_edges;
400 std::map<IntPair, Integer > master_edges;
401 Internal::surfaceSetup(slave_edges,slave_coref_group,m_geometry);
402 Internal::surfaceSetup(master_edges,master_coref_group,m_geometry);
406 for(std::map<IntPair, Integer>::iterator i=slave_edges.begin(); i!=slave_edges.end(); ++i)
409 else if (i->second > 2)
410 fatal() <<
"Not manifold slave surface";
411 if (addEdges.connexCount() > 1)
412 fatal() <<
"Slave surface is not connex";
416 for(std::map<IntPair, Integer>::iterator i=master_edges.begin(); i!=master_edges.end(); ++i)
419 else if (i->second > 2)
420 fatal() <<
"Not manifold master surface";
421 if (addEdges.connexCount() > 1)
422 fatal() <<
"Master surface is not connex";
436 FaceFaceContactList coarse_contacts;
460#ifndef NO_USER_WARNING
461#warning "utiliser un destroySurface ???"
463 delete masterSurface;
473 typedef std::map<Integer,Real3> SharedCorefinement;
474 SharedCorefinement voidface_shared_corefinement;
475 ARCANE_ASSERT(( coarse_contacts.empty() == master_coref_group.
empty() ),(
"Incompatible emptyness"));
477 if (coarse_contacts.empty())
480 voidface_shared_corefinement[iface->localId()];
486 SharedCorefinement facevoid_shared_corefinement;
487 for(FaceFaceContactList::iterator i = coarse_contacts.begin(); i != coarse_contacts.end(); ++i) {
489 const Face master_face = contact.faceA;
490 const Face slave_face = contact.faceB;
491 if (slave_face.
null()) {
492 if (master_face.
isOwn()) {
493 facevoid_shared_corefinement[master_face.
localId()] += contact.normalA;
495 }
else if (master_face.
null()) {
496 if (slave_face.
isOwn()) {
498 voidface_shared_corefinement[slave_face.
localId()];
500 }
else if (master_face.
isOwn() or slave_face.
isOwn()) {
501 if (checkFaces(master_face,slave_face)) {
504 if (master_face.
isOwn())
505 m_contacts.add(contact);
508 if (master_face.
isOwn()) {
509 facevoid_shared_corefinement[master_face.
localId()] += contact.normalA;
511 if (slave_face.
isOwn()) {
512 voidface_shared_corefinement[slave_face.
localId()];
519 for(SharedCorefinement::const_iterator i=facevoid_shared_corefinement.begin();
520 i != facevoid_shared_corefinement.end(); ++i) {
521 Face faceA(internals[i->first]);
523 ARCANE_ASSERT((faceA.
isOwn()),(
"Non local facevoid"));
525 contact.normalA = i->second;
527 m_contacts.
add(contact);
536 for(FaceFaceContactList::iterator i = m_contacts.begin(); i != m_contacts.end(); ++i)
539 const Face master_face = contact.faceA;
540 const Face slave_face = contact.faceB;
541 if (not slave_face.
null()) {
542 ARCANE_ASSERT((not master_face.
null()),(
"Integrity error"));
543 if (slave_face.
isOwn()) {
544 if (master_face.
isOwn()) {
546 SharedCorefinement::iterator vf_finder = voidface_shared_corefinement.find(slave_face.
localId());
547 if (vf_finder != voidface_shared_corefinement.end()) {
548 vf_finder->second += contact.normalB;
553 if (master_face.
isOwn())
554 ++info_to_send[slave_face.
owner()];
566 parallel_mng->allToAll(info_to_send,info_to_recv,1);
567 std::list<std::shared_ptr<SerializeMessage> > recv_messages;
568 for(
Integer i=0;i<nbSubDomain;++i)
570 if (info_to_recv[i] > 0)
573 recv_messages.push_back(std::shared_ptr<SerializeMessage>(message));
580 for(
Integer i=0;i<nbSubDomain;++i)
582 const Integer faceface_info_to_send = info_to_send[i];
583 if (faceface_info_to_send > 0)
586 sent_messages[i].reset(message);
589 sbuf.
setMode(ISerializer::ModeReserve);
590 sbuf.reserveInteger(2);
601 for(FaceFaceContactList::iterator i = m_contacts.begin(); i != m_contacts.end(); ++i)
604 const Face master_face = contact.faceA;
605 const Face slave_face = contact.faceB;
606 if (not slave_face.
null() and not slave_face.
isOwn() and master_face.
isOwn())
608 std::shared_ptr<SerializeMessage> message = sent_messages[slave_face.
owner()];
628 delete messageList; messageList = NULL;
632 for(std::list<std::shared_ptr<SerializeMessage> >::iterator i=recv_messages.begin(); i!=recv_messages.end(); ++i)
634 std::shared_ptr<SerializeMessage> & message = *i;
635 const Integer origDomainId = message->destRank();
636 ARCANE_ASSERT((origDomainId != subDomain()->subDomainId()),(
"Local to local sent"));
640 ARCANE_ASSERT((faceface_count == info_to_recv[origDomainId]),(
"Bad recv faceface count"));
644 mesh()->faceFamily()->itemsUniqueIdToLocalId(lids,uids,
true);
647 for(
Integer j=0;j<faceface_count;++j)
649 Face faceA(internals[lids[2*j ]]);
650 Face faceB(internals[lids[2*j+1]]);
651 ARCANE_ASSERT((faceB.
isOwn()),(
"Not local information recieved"));
657 m_contacts.add(contact);
659 SharedCorefinement::iterator vf_finder = voidface_shared_corefinement.find(faceB.
localId());
660 if (vf_finder != voidface_shared_corefinement.end()) {
661 vf_finder->second += contact.normalB;
668 for(SharedCorefinement::const_iterator i=voidface_shared_corefinement.begin();
669 i != voidface_shared_corefinement.end(); ++i) {
671 Face faceB(internals[i->first]);
672 ARCANE_ASSERT((faceB.
isOwn()),(
"Non local voidface"));
673 Real3 faceB_normal = m_geometry->computeOrientedMeasure(faceB);
677 contact.normalB = faceB_normal - i->second;
679 m_contacts.
add(contact);
686 m_internal->corefinementTimer.stop();
689 times[0] = m_internal->corefinementTimer.totalTime();
690 times[1] = m_internal->migrationTimer.totalTime();
692 info() <<
"Corefinement timers : all=" << times[0] <<
" migration=" << times[1] <<
" #domains=" << parallel_mng->
commSize();