68 const DoubleTab& xv = domaine.xv(), &o_xv = o_domaine.xv(), &xs = domaine.domaine().coord_sommets(), &o_xs = o_domaine.domaine().coord_sommets();
69 const IntTab& f_s = domaine.face_sommets(), &o_f_s = o_domaine.face_sommets();
71 int i, j, f, o_f, s, o_s, nf_tot = fvf->nb_faces_tot(), o_nf_tot =
o_fvf->nb_faces_tot(), d, D =
dimension;
74 std::set<int> s_som, s_o_som;
75 for (i = 0; i < nf_tot; i++)
76 for (f = fvf->num_face(i), j = 0; j < f_s.
dimension(1) && (s = f_s(f, j)) >= 0; j++)
78 for (i = 0; i < o_nf_tot; i++)
79 for (f =
o_fvf->num_face(i), j = 0; j < o_f_s.dimension(1) && (s = o_f_s(f, j)) >= 0; j++)
81 std::vector<int> som(s_som.begin(), s_som.end()), o_som(s_o_som.begin(), s_o_som.end());
82 int ns_tot = (int) som.size(), o_ns_tot = (int) o_som.size();
84 DoubleTrav xvf(nf_tot, D), o_xvf(o_nf_tot, D), xsf(ns_tot, D), o_xsf(o_ns_tot, D);
85 for (i = 0; i < nf_tot; i++)
86 for (d = 0; d < D; d++)
87 xvf(i, d) = xv(fvf->num_face(i), d);
88 for (i = 0; i < o_nf_tot; i++)
89 for (d = 0; d < D; d++)
90 o_xvf(i, d) = o_xv(
o_fvf->num_face(i), d);
91 for (i = 0; i < ns_tot; i++)
92 for (d = 0; d < D; d++)
93 xsf(i, d) = xs(som[i], d);
94 for (i = 0; i < o_ns_tot; i++)
95 for (d = 0; d < D; d++)
96 o_xsf(i, d) = o_xs(o_som[i], d);
99 MCAuto<DataArrayDouble> fdad(DataArrayDouble::New()), o_fdad(DataArrayDouble::New()), sdad(DataArrayDouble::New()), o_sdad(DataArrayDouble::New());
100 fdad->useExternalArrayWithRWAccess(xvf.addr(), nf_tot, D), o_fdad->useExternalArrayWithRWAccess(o_xvf.addr(), o_nf_tot, D);
101 sdad->useExternalArrayWithRWAccess(xsf.addr(), ns_tot, D), o_sdad->useExternalArrayWithRWAccess(o_xsf.
addr(), o_ns_tot, D);
103 MCAuto<DataArrayIdType> f_idx(nf_tot && o_nf_tot ? o_fdad->findClosestTupleId(fdad) :
nullptr), s_idx(ns_tot && o_ns_tot ? o_sdad->findClosestTupleId(sdad) :
nullptr);
105 for (i = 0; i < nf_tot; i++)
107 f = fvf->num_face(i), o_f = o_nf_tot ?
o_fvf->num_face((
int)(f_idx->getIJ(i, 0))) : -1;
108 double d2 = o_f >= 0 ? domaine.dot(&xv(f, 0), &xv(f, 0), &o_xv(o_f, 0), &o_xv(o_f, 0)) : 1e8;
113 if (i < fvf->nb_faces() && d2 >= 1e-12)
114 Process::exit(
Nom(
"Echange_contact_PolyMAC_MPFA: missing opposite faces detected between ") + fvf->
le_nom() +
" and " +
o_fvf->le_nom() +
" ! Have you used Decouper_multi?");
116 for (i = 0; i < ns_tot; i++)
118 s = som[i], o_s = o_ns_tot ? o_som[s_idx->getIJ(i, 0)] : -1;
119 if (o_s >= 0 && domaine.dot(&xs(s, 0), &xs(s, 0), &o_xs(o_s, 0), &o_xs(o_s, 0)) < 1e-12)
124 Process::exit(
"Echange_contact_PolyMAC_MPFA : MEDCoupling is required!");
int rang_frontiere(const Nom &)