19#include <Sous_Domaine.h>
21#include <Poly_geom_base.h>
23#include <Octree_Double.h>
24#include <Periodique.h>
25#include <Reordonner_faces_periodiques.h>
26#include <Frontiere_dis_base.h>
29#include <NettoieNoeuds.h>
31#include <TRUST_2_MED.h>
32#include <Comm_Group_MPI.h>
33#include <Option_Interpolation.h>
34#include <Array_tools.h>
35#include <Schema_Comm.h>
36#include <Interprete_bloc.h>
37#include <Extraire_surface.h>
38#include <Domaine_VF.h>
39#include <MD_Vector_std.h>
40#include <MD_Vector_seq.h>
41#include <Reorder_Mesh.h>
42#include <Perf_counters.h>
52static double cached_memory = 0;
54template<
class LIST_FRONTIERE>
55void check_frontiere(
const LIST_FRONTIERE& list,
const char *msg)
58 if (!is_parallel_object(n))
60 Cerr <<
" Fatal error: processors don't have the same number of boundaries " << msg << finl;
64 for (
int i = 0; i < n; i++)
67 Cerr <<
" Boundary " << msg <<
" : " << nom << finl;
68 if (!is_parallel_object(nom))
70 Cerr <<
" Fatal error: processors don't have the same number of boundaries " << msg << finl;
79template <
class _SIZE_>
86 int typ_commun_i =
static_cast<int>(typ);
87 envoyer_broadcast(typ_commun_i, min_pe);
88 Type_Face typ_commun =
static_cast<Type_Face
>(typ_commun_i);
90 if (typ_commun != typ)
92 if (typ != Type_Face::vide_0D)
94 Cerr <<
"Error in Domaine.cpp corriger_type: invalid boundary face type" << finl;
97 faces.
typer(typ_commun);
107template<
typename _SZ_>
124 domaines_frontieres_.vide();
125 les_ss_domaines_.vide();
128 bords_a_imprimer_.vide();
129 bords_a_imprimer_sum_.vide();
153template<
typename _SZ_>
156 Cerr <<
"Writing of " << nb_som() <<
" nodes." << finl;
157#ifdef SORT_POUR_DEBOG
158 s.
setf(ios::scientific);
167 Cerr <<
"Writing of " << nb_elem() <<
" elements." << finl;
168 s <<
"DUMMY_ZONE" << finl;
171 s << mes_faces_bord_;
172 s << mes_faces_joint_;
173 s << mes_faces_raccord_;
175 if (nb_groupes_faces() !=0)
177 s << finl <<
"groupes_faces" << finl;
178 s << mes_groupes_faces_;
182 s << finl <<
"bords_perio" << finl;
192template<
typename _SZ_>
196 return readOn_has_perio(s, dnu);
208template<
typename _SZ_>
211#ifdef SORT_POUR_DEBOG
212 s.setf(ios::scientific);
226 Cerr <<
"Reading domain " <<
le_nom() << finl;
230 Cerr <<
" Number of nodes: " << nbsom << finl;
243 Cerr <<
" Number of nodes after node-cleanup: " << nbsom << finl;
258template<
typename _SZ_>
263 Cerr <<
" Reading part of domain " <<
le_nom() << finl;
278 if (acc ==
"groupes_faces")
285 if (acc ==
"bords_perio")
292 Process::exit(
"misformatted domain file : One expected a closing bracket } to end. ");
295template<
class LIST_FRONTIERE>
296void check_frontiere(
const LIST_FRONTIERE& list,
const char *msg)
299 if (!is_parallel_object(n))
301 Cerr <<
" Fatal error: processors don't have the same number of boundaries " << msg << finl;
304 for (
int i = 0; i < n; i++)
307 Cerr <<
" Boundary " << msg <<
" : " << nom << finl;
308 if (!is_parallel_object(nom))
310 Cerr <<
" Fatal error: processors don't have the same number of boundaries " << msg << finl;
316template<
class LIST_FRONTIERE>
317void check_frontiere_own_ptr(
const LIST_FRONTIERE& list,
const char *msg)
320 if (!is_parallel_object(n))
322 Cerr <<
" Fatal error: processors don't have the same number of boundaries " << msg << finl;
325 for (
int i = 0; i < n; i++)
328 Cerr <<
" Boundary " << msg <<
" : " << nom << finl;
329 if (!is_parallel_object(nom))
331 Cerr <<
" Fatal error: processors don't have the same number of boundaries " << msg << finl;
340template<
typename _SZ_>
347 for (i = 0; i < n; i++)
348 ::corriger_type(
frontiere(i).faces(), type_elem());
352 Cerr <<
"Warning, the reread domaine " <<
nom_ <<
" has no defined boundaries (none boundary or connector)." << finl;
359 elem_->associer_domaine(*
this);
363 Cerr <<
" Number of elements: " <<
nb_elem << finl;
382template<
typename _SZ_>
389 for (i = 0; i < sz_sommets; i++)
392 xg(i, k) += les_coord(sommets(i, j), k);
404template<
typename _SZ_>
407 bool set_cache =
false;
412 if (!deriv_octree_ || !deriv_octree_->construit())
415 cached_elements_.reset();
416 cached_positions_.reset();
421 for (
int i = 0; i < cached_positions_.size(); i++)
422 if (sameDoubleTab(positions, cached_positions_[i]))
424 int size = cached_positions_[i].dimension(0);
427 elements = cached_elements_[i];
438 elements.
resize_tab(sz, RESIZE_OPTIONS::NOCOPY_NOINIT);
440 for (
int i = 0; i < sz; i++)
442 double x = positions(i, 0);
453 if (cached_positions_.size()>100)
456 Cerr <<
"Warning, cache flushed in Domaine_32_64<_SZ_>::chercher_elements() cause too much lines used !" << finl;
457 cached_elements_.reset();
458 cached_positions_.reset();
464 cached_positions_.add(positions);
465 cached_elements_.add(elements);
467 int last = cached_positions_.size();
468 mapToDevice(cached_positions_[last-1]);
469 mapToDevice(cached_elements_[last-1]);
470 cached_memory += (double)(positions.
size_array() *
sizeof(
double));
471 cached_memory += (double)(elements.
size_array() *
sizeof(
int));
472 if (cached_memory > 1e7)
474 Cerr << 2 * cached_positions_.size() <<
" arrays cached in memory for Domaine_32_64<_SZ_>::chercher_elements(...): ";
475 if (cached_memory < 1e6)
476 Cerr << int(cached_memory / 1024) <<
" KBytes" << finl;
478 Cerr << int(cached_memory / 1024 / 1024) <<
" MBytes" << finl;
491template<
typename _SZ_>
494 int n = positions.
size();
497 Cerr <<
"Domaine_32_64::chercher_elements(const DoubleVect& positions, ArrOfInt& elements, int reel) const -> Coding is made to copy a doublevect(dimesnion) in a DoubleTab(1,dimension)" << finl;
498 Cerr <<
"But, it comes with a DoubleVect of size " << n <<
" instead of " <<
dimension << finl;
502 DoubleTab positions2(1, n);
503 for (
int ii = 0; ii < n; ii++)
504 positions2(0, ii) = positions(ii);
515template<
typename _SZ_>
521 if ((face) < compteur)
528 if (face < nbf + compteur)
531 if ((face - compteur) < nbf)
536 compteur += (2 * nbf);
539 Cerr <<
"TRUST error in Domaine_32_64<_SZ_>::face_bords_interne_conjuguee " << finl;
546template<
typename _SZ_>
554 for (
auto it = list.begin(); it != list.end(); ++it)
558 Journal() <<
"Domaine_32_64<_SZ_>::comprimer() bord : " << front.
le_nom() << finl;
561 for (
auto it2 = std::next(it); it2 != list.end(); )
566 Journal() <<
"On agglomere le bord : " << front.
le_nom() << finl;
568 it2 = list.erase(it2);
581 for (
auto it = list.begin(); it != list.end(); ++it)
584 for (
auto it2 = std::next(it); it2 != list.end(); )
590 it2 = list.erase(it2);
601 for (
auto it = list.begin(); it != list.end(); ++it)
604 for (
auto it2 = std::next(it); it2 != list.end(); )
610 it2 = list.erase(it2);
621 for (
auto it = list.begin(); it != list.end(); ++it)
625 for (
auto it2 = std::next(it); it2 != list.end(); )
631 it2 = list.erase(it2);
648template<
typename _SZ_>
662template<
typename _SZ_>
676template<
typename _SZ_>
690template<
typename _SZ_>
703template<
typename _SZ_>
709template<
typename _SZ_>
713 assert(tableau_echange.
dimension(1) >= 2);
716 const int moi =
me();
717 for (
int_t i = 0; i < n; i++)
719 tableau_echange(i, 0) = moi;
720 tableau_echange(i, 1) = i;
724 elem_virt_pe_num_cpy.
resize(n_virt, 2);
725 for (
int_t i = 0; i < n_virt; i++)
727 elem_virt_pe_num_cpy(i, 0) = tableau_echange(n + i, 0);
728 elem_virt_pe_num_cpy(i, 1) = tableau_echange(n + i, 1);
735template<
typename _SZ_>
749 c[j] += xp(i, j) * volumes(i);
750 volume += volumes(i);
763template<
typename _SZ_>
768 elem_->calculer_volumes(volumes);
773 for (
int_t i = 0; i < size; i++)
775 double v = volumes(i);
778 Cerr <<
"Volume[" << i <<
"]=" << v << finl;
779 Cerr <<
"Several volumes of the mesh are not positive." << finl;
780 Cerr <<
"Something is wrong in the mesh..." << finl;
783 inverse_volumes(i) = 1. / v;
791template<
typename _SZ_>
802template<
typename _SZ_>
809template<
typename _SZ_>
813 deriv_octree_.detach();
816template<
typename _SZ_>
820 deriv_octree_.typer(
"OctreeRoot");
832template<
typename _SZ_>
836 deriv_octree_.typer(
"OctreeRoot");
850template<
typename _SZ_>
859template<
typename _SZ_>
865 Cerr <<
"Internal error in Domaine_32_64<_SZ_>::md_vector_elements(): descriptor for elements not initialized\n"
866 <<
" You might use a buggy Domain constructor that does not build descriptors,\n"
867 <<
" Use the following syntax to finish the domain construction\n"
868 <<
" Scatter ; " <<
le_nom() << finl;
876template<
typename _SZ_>
883template<
typename _SZ_>
890 double min_=0.5*DMAXFLOAT;
891 double max_=-0.5*DMAXFLOAT;
892 for (
int_t i=0; i<nbsom; i++)
895 min_ = (c < min_ ? c : min_);
896 max_ = (c > max_ ? c : max_);
908template<
typename _SZ_>
915 for(
int_t i=0; i<ajoutsz; i++)
916 for(
int k=0; k<dim; k++)
928template<
typename _SZ_>
943 ArrOfDouble tab_coord(dim);
945 for(
int_t i=0; i< ajoutsz; i++)
947 for (
int j = 0; j < dim; j++)
948 tab_coord[j] = soms(i,j);
952 if (nb_sommets_proches == 0)
957 else if (nb_sommets_proches == 1)
961 nums(i) = liste_sommets[0];
968 Cerr <<
"Error : several nodes of the domain 1 are within radius epsilon="
969 <<
epsilon_ <<
" of point " << tab_coord <<
". We must reduce epsilon. " << finl;
973 Cerr << compteur <<
" double nodes were found \n";
974 sommets_.resize(oldsz+ajoutsz-compteur,dim);
976 for(
int_t i =0; i<ajoutsz; i++)
979 nums(i)=oldsz+compteur;
981 for(
int k=0; k<dim; k++)
990 for(
int_t i=0; i<ajoutsz; i++)
999template<
typename _SZ_>
1009template<
typename _SZ_>
1020 Cerr <<
"Reading vertices for domain " <<
le_nom() << finl;
1031template <
typename _SZ_>
1036 os << itr.le_nom() << finl;
1040 os << itr->le_nom() << finl;
1044 os << itr.le_nom() << finl;
1048 os << itr.le_nom() << finl;
1051template <
typename _SZ_>
1057 if (itr.le_nom() == un_nom)
1064 if (itr->le_nom() == un_nom)
1071 if (itr.le_nom() == un_nom)
1078 if (itr.le_nom() == un_nom)
1082 Cerr <<
"Domaine_32_64<_SZ_>::rang_frontiere(): We have not found a boundary with name " << un_nom << finl;
1087template <
typename _SZ_>
1094template <
typename _SZ_>
1101template <
typename _SZ_>
1104 Journal() <<
"Domaine_32_64<_SZ_>::fixer_premieres_faces_frontiere()" << finl;
1108 itr.fixer_num_premiere_face(compteur);
1109 compteur += itr.nb_faces();
1110 Journal() <<
"Le bord " << itr.le_nom() <<
" commence a la face : " << itr.num_premiere_face() << finl;
1114 itr->fixer_num_premiere_face(compteur);
1115 compteur += itr->nb_faces();
1116 Journal() <<
"Le raccord " << itr->le_nom() <<
" commence a la face : " << itr->num_premiere_face() << finl;
1118 if (std::is_same<_SZ_, int>::value)
1121 itr.fixer_num_premiere_face((
int)compteur);
1122 compteur += itr.nb_faces();
1123 Journal() <<
"Le joint " << itr.le_nom() <<
" commence a la face : " << itr.num_premiere_face() << finl;
1126 itr.fixer_num_premiere_face(-1);
1130template<
typename _SZ_>
1131template<
typename _BORD_TYP_>
1132void Domaine_32_64<_SZ_>::correct_type_single_border_type(std::list<_BORD_TYP_>& list)
1135 for (
auto it = list.begin(); it != list.end(); ++it)
1137 Frontiere_t& front = *it;
1138 if (front.faces().type_face() == Type_Face::vide_0D)
1141 for (
auto it2 = std::next(it); it2 != list.end();)
1143 Frontiere_t& front2 = *it2;
1144 if (front.le_nom() == front2.le_nom())
1146 front.faces().typer(front2.faces().type_face());
1161template<
typename _SZ_>
1183template<
typename _SZ_>
1186 Cerr <<
"==============================================" << finl;
1187 Cerr <<
"The extreme coordinates of the domain " <<
le_nom() <<
" are:" << finl;
1193 bb_min[j] = BB(j,0);
1194 bb_max[j] = BB(j,1);
1200 if (j==0) Cerr <<
"x ";
1201 if (j==1) Cerr <<
"y ";
1202 if (j==2) Cerr <<
"z ";
1203 Cerr <<
"is between " << bb_min[j] <<
" and " << bb_max[j] << finl;
1205 Cerr <<
"==============================================" << finl;
1210 Cerr <<
"==============================================" << finl;
1211 Cerr <<
"The volume cells of the domain " <<
le_nom() <<
" are:" << finl;
1212 const int_t i_vmax = imax_array(volumes);
1213 const int_t i_vmin = imin_array(volumes);
1214 const double vmin_local = (i_vmin < 0) ? 1e40 : volumes[i_vmin];
1215 const double vmax_local = (i_vmax < 0) ? -1e40 : volumes[i_vmax];
1216 const double volmin =
mp_min(vmin_local);
1217 const double volmax =
mp_max(vmax_local);
1222 Cerr <<
"mean(volume cells)= " << volmoy << finl;
1223 Cerr <<
"min(volume cells)= " << volmin << finl;
1224 Cerr <<
"max(volume cells)= " << volmax << finl;
1225 if (volmin*1000<volmoy)
1227 Cerr <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1228 Cerr <<
"Warning, a cell volume is more than 1000 times smaller than the average cell volume. Check your mesh." << finl;
1229 Cerr <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1231 Cerr <<
"==============================================" << finl;
1236template<
typename _SZ_>
1239 Cerr <<
" Merging elem info for domain "<<
nom_ <<
" with " << dom2.
nom_ << finl;
1251 int nb_ccord =
les_elems().dimension_int(1);
1254 elems1.
resize(sz1+sz2, nb_ccord);
1255 for(
int_t i=0; i<sz2; i++)
1256 for(
int j=0; j<nb_ccord; j++)
1257 elems1(sz1+i,j)=elems2(i,j);
1278 for (
const auto &b : bp2)
1299template<
typename _SZ_>
1313template<
typename _SZ_>
1318 for (
int_t i = 0; i < nb_s; i++)
1326template<
typename _SZ_>
1330 Cerr <<
"Domaine: Creating a MEDCouplingUMesh object for the domain '" <<
le_nom() <<
"'" << finl;
1332 using MEDCoupling::DataArrayInt;
1333 using MEDCoupling::DataArrayDouble;
1338 INTERP_KERNEL::NormalizedCellType cell_type = type_geo_trio_to_type_medcoupling(type_ele, mesh_dim);
1339 MCAuto<MEDCouplingUMesh>& mc_mesh = virt ? mc_mesh_virt_ : mc_mesh_;
1340 mc_mesh = MEDCouplingUMesh::New(
nom_.getChar(), mesh_dim);
1346 MCAuto<DataArrayDouble>
coord(DataArrayDouble::New());
1353 coord->setInfoOnComponent(0,
"x");
1354 coord->setInfoOnComponent(1,
"y");
1356 mc_mesh->setCoords(
coord);
1366 conn_trust_to_med(les_elems2, type_ele,
true);
1368 mc_mesh->allocateCells(ncells);
1369 if (cell_type == INTERP_KERNEL::NORM_POLYHED)
1378 assert(ncells <= polyhedronIndex.
size_array() - 1);
1380 for (
int_t i = 0; i < ncells; i++)
1383 for (
int_t face = polyhedronIndex[i]; face < polyhedronIndex[i + 1]; face++)
1384 size += (
int)(facesIndex[face + 1] - facesIndex[face] + 1);
1386 ArrOfTID cell_def(size);
1388 for (
int_t face = polyhedronIndex[i]; face < polyhedronIndex[i + 1]; face++)
1390 for (
int_t node = facesIndex[face]; node < facesIndex[face + 1]; node++)
1391 cell_def[size++] = nodes_glob[node];
1394 cell_def[size++] = -1;
1396 mc_mesh->insertNextCell(cell_type, cell_def.
size_array(), cell_def.
addr());
1402 if (std::is_same<_SZ_, trustIdType>::value)
1405 for (
int_t i = 0; i < ncells; i++)
1407 int nvertices = nverts;
1409 for (
int j = nverts-1; j >= 0 && les_elems2(i, j) < 0; j--) nvertices--;
1411 mc_mesh->insertNextCell(cell_type, nvertices, (trustIdType *)(les_elems2.
addr() + i * nverts));
1417 for (
int_t i = 0; i < ncells; i++)
1419 ArrOfTID cell_def(nverts);
1421 for (; j<nverts && les_elems2(i, j) >= 0; j++)
1422 cell_def[j] = (trustIdType)les_elems2(i, j);
1423 mc_mesh->insertNextCell(cell_type, j, cell_def.
addr());
1427 *(virt ? &mc_mesh_virt_ready_ : &mc_mesh_ready_) =
true;
1433template<
typename _SZ_>
1434void Domaine_32_64<_SZ_>::prepare_rmp_with(
const Domaine_32_64& other_domain,
bool virt)
const
1437 using namespace MEDCoupling;
1441 const MEDCouplingUMesh* oth_msh = other_domain.get_mc_mesh(virt);
1443 Cerr <<
"Building remapper between " << le_nom() <<
" (" << (int)mc_mesh_->getSpaceDimension() <<
"D) mesh with " << (int)mc_mesh_->getNumberOfCells()
1444 <<
" cells and " << other_domain.
le_nom() <<
" (" << (int)oth_msh->getSpaceDimension() <<
"D) mesh with "
1445 << (int)oth_msh->getNumberOfCells() <<
" cells" << finl;
1446 rmps[&other_domain].prepare(oth_msh, mc_mesh_,
"P0P0");
1447 Cerr <<
"remapper prepared with " << rmps.at(&other_domain).getNumberOfColsOfMatrix() <<
" columns in matrix, with max value = " << rmps.at(&other_domain).getMaxValueInCrudeMatrix() << finl;
1449 Process::exit(
"Domaine_32_64<_SZ_>::prepare_rmp_with should not be called since it requires a TRUST version compiled with MEDCoupling !");
1453template <
typename _SIZE_>
1454void Domaine_32_64<_SIZE_>::prepare_dec_with(
const Domaine_32_64& other_domain, MEDCouplingFieldDouble *dist, MEDCouplingFieldDouble *loc)
const
1456#if defined(MEDCOUPLING_) && defined(MPI_)
1457 using namespace MEDCoupling;
1460 Cerr <<
"Building DEC of nature" << MEDCouplingNatureOfField::GetRepr(dist->getNature())
1462 <<
" cells) to " << le_nom() <<
" (" <<
Process::mp_sum(loc->getMesh()->getNumberOfCells()) <<
" cells) : ";
1466 decs.emplace(std::piecewise_construct,
1467 std::forward_as_tuple(&other_domain, dist->getNature()),
1469 OverlapDEC& dec = decs.at({ &other_domain, dist->getNature()});
1471 dec.attachSourceLocalField(dist);
1472 dec.attachTargetLocalField(loc);
1475 Cerr << statistics().compute_time(t0) <<
" s" << finl;
1477 Process::exit(
"Domaine::prepare_dec_with() should not be called since it requires a TRUST version compiled with MEDCoupling and MPI!");
1483template <
typename _SIZE_>
1486 if (!rmps.count(&other_domain))
1487 prepare_rmp_with(other_domain, virt);
1488 return &rmps.at(&other_domain);
1492template <
typename _SIZE_>
1495 if (!decs.count({ &other_domain, dist->getNature() } ))
1496 prepare_dec_with(other_domain, dist, loc);
1497 return &decs.at({ &other_domain, dist->getNature() });
1508template <
typename _SIZE_>
1511 Cerr <<
"Filling domain from list of domains in progress... " << finl;
1513 Process::exit(
"Error in Domaine_32_64<_SIZE_>::fill_from_list() : compression prohibited in parallel mode");
1514 if (lst.size() == 0)
1515 Process::exit(
"Error in Domaine_32_64<_SIZE_>::fill_from_list() : compression prohibited in parallel mode");
1517 for(
auto& elem: lst)
1527 Cerr <<
" Concatenating Domains "<<
nom_ <<
" and " << dom2.
nom_ << finl;;
1529 assert(typ_elem == dom2.type_elem()->
que_suis_je());
1535 dom2.
renum(les_nums);
1540 Cerr <<
"Filling from list - End!" << finl;
1550template <
typename _SIZE_>
1553 for (
int i_joint = 0; i_joint <
nb_joints(); i_joint++)
1557 sommets_communs[index] = Les_Nums[sommets_communs[index]];
1560 elements_distants += elem_offset;
1567template <
typename _SIZE_>
1571 for (
auto it = list.begin(); it != list.end(); ++it)
1574 for (
auto it2 = std::next(it); it2 != list.end();)
1580 it2 = list.erase(it2);
1603void echanger_tableau_aretes(
const IntTab& elem_aretes,
int nb_aretes_reelles, ArrOfInt& tab_aretes)
1607 const int nb_elem = elem_aretes.
dimension(0);
1609 const int nb_aretes_elem = elem_aretes.
dimension(1);
1620 ArrOfInt pe_arete(nb_aretes_reelles);
1623 IntVect pe_elem(nb_elem_tot);
1627 pe_elem.echange_espace_virtuel();
1632 for (i = nb_elem; i < nb_elem_tot; i++)
1633 for (
int pe = pe_elem[i], j = 0, a; j < nb_aretes_elem && (a = elem_aretes(i, j)) >= 0; j++)
1634 if (a < nb_aretes_reelles && pe_arete[a] > pe)
1643 tmp.
copy(elem_aretes, RESIZE_OPTIONS::NOCOPY_NOINIT);
1646 for (i = 0; i < nb_elem; i++)
1647 for (
int j = 0, a; j < nb_aretes_elem && (a = elem_aretes(i, j)) >= 0; j++)
1648 tmp(i, j) = tab_aretes[a];
1657 for (i = nb_elem; i < nb_elem_tot; i++)
1658 for (
int pe = pe_elem[i], j = 0, a; j < nb_aretes_elem && (a = elem_aretes(i, j)) >= 0; j++)
1659 if (a < nb_aretes_reelles && pe_arete[a] == pe)
1660 tab_aretes[a] = tmp(i, j);
1670 for (i = 0; i < nb_elem; i++)
1671 for (
int j = 0, a; j < nb_aretes_elem && (a = elem_aretes(i, j)) >= 0; j++)
1672 tmp(i, j) = tab_aretes[a];
1677 for (i = nb_elem; i < nb_elem_tot; i++)
1678 for (
int j = 0, a; j < nb_aretes_elem && (a = elem_aretes(i, j)) >= 0; j++)
1679 tab_aretes[a] = tmp(i, j);
1695 int it_selection = -1;
1698 for (
int t = 1; t < 4; t++)
1701 decentre_face(t, dir) = 1.;
1709 assert(item_possible.
size() != 0);
1711 while ((item_possible.
size() != 1) && (t < 4))
1713 double distmin = DMAXFLOAT;
1714 int size_initiale = item_possible.
size();
1715 dist.
resize(size_initiale);
1718 for (
int ind_it = 0; ind_it < size_initiale; ind_it++)
1721 dist[ind_it] += (coord_possible(ind_it, dir) - (coord_ref(dir) + decentre_face(t, dir))) * (coord_possible(ind_it, dir) - (coord_ref(dir) + decentre_face(t, dir)));
1722 if (dist[ind_it] <= distmin)
1723 distmin = dist[ind_it];
1727 int nb_it_suppr = 0;
1728 while (ind_it < size_initiale)
1730 if (!est_egal(dist[ind_it], distmin))
1732 int ind_it_suppr = ind_it - nb_it_suppr;
1733 int it_suppr = item_possible[ind_it_suppr];
1734 item_possible.
suppr(it_suppr);
1736 int size_actuelle = item_possible.
size();
1737 for (
int ind = ind_it_suppr; ind < size_actuelle; ind++)
1738 for (
int dir = 0; dir <
dimension; dir++)
1739 coord_possible(ind, dir) = coord_possible(ind + 1, dir);
1740 coord_possible.
resize(size_actuelle,
dimension, RESIZE_OPTIONS::COPY_NOINIT);
1747 if (item_possible.
size() == 1)
1748 it_selection = item_possible[0];
1751 Cerr <<
"Domaine::identifie_item_unique()" << finl;
1752 Cerr <<
"An item has not been found among the list." << finl;
1753 Cerr <<
"Please contact TRUST support." << finl;
1756 return it_selection;
1759template <
typename _SIZE_>
1783 md_vect_faces_front.
copy(mdseq);
1787 for (
int i_frontiere = 0; i_frontiere < nb_frontieres; i_frontiere++)
1789 Frontiere& front =
frontiere(i_frontiere);
1795 const int nb_faces_front = front.
nb_faces();
1799 md_frontiere.
copy(mdseq_front);
1814 for (
int i = 0; i < nb_faces_fr; i++)
1824 const int nb_faces = vect_renum.
size();
1825 const int nb_faces_tot = vect_renum.
size_totale();
1826 const int nb_faces_virt = nb_faces_tot - nb_faces;
1828 for (
int i = 0; i < nb_faces_virt; i++)
1845 for (i_frontiere = 0; i_frontiere < nb_frontieres; i_frontiere++)
1847 Frontiere& front =
frontiere(i_frontiere);
1855 if (faces_sommets_frontiere.
dimension(1) < nb_som_faces)
1858 fsf_old = faces_sommets_frontiere;
1860 faces_sommets_frontiere = -1;
1862 for (j = 0; j < fsf_old.
dimension(1); j++)
1863 faces_sommets_frontiere(i, j) = fsf_old(i, j);
1868 const int nb_faces_front = front.
nb_faces();
1870 for (
int i = i_premiere_face; i < i_premiere_face + nb_faces_front; i++)
1882 faces_sommets_frontiere,
1888 assert(faces_sommets_frontiere.
dimension(0) == nb_faces_front);
1889 const int nb_faces_tot_frontiere = faces_sommets_frontiere.
dimension_tot(0);
1890 const int nb_faces_virt_frontiere = nb_faces_tot_frontiere - nb_faces_front;
1892 const int ndebut = nb_faces;
1893 const int nfin = nb_faces_tot;
1894 for (
int i = ndebut; i < nfin; i++)
1896 const int j = vect_renum[i];
1899 assert(j >= nb_faces_front && j < nb_faces_tot_frontiere);
1901 tab[j - nb_faces_front] = i;
1907template <
typename _SIZE_>
1921 const int nbelem = elem_som.
dimension(0);
1926 bool is_poly = sub_type(Poly_geom_base, type_elem().valeur());
1928 std::vector<std::vector<int> > v_e_a(nbelem_tot);
1929 int nb_aretes_reelles = 0, i;
1936 ArrOfInt chaine_aretes_sommets;
1939 premiere_arete_som = -1;
1941 std::map<std::array<double, 3>, std::array<int, 2> > aretes_loc;
1943 for (
int i_elem = 0; i_elem < nbelem_tot; aretes_loc.clear(), i_elem++)
1946 const Elem_geom_base& elem_g = ref_cast(Elem_geom_base, type_elem().valeur());
1950 const Poly_geom_base& poly_g = ref_cast(Poly_geom_base, type_elem().valeur());
1956 for (i = 0; i < f_e_r.
dimension(0) && f_e_r(i, 0) >= 0; i++)
1957 for (j = 0; j < f_e_r.
dimension(1) && f_e_r(i, j) >= 0; j++)
1959 int s1 = elem_som(i_elem, f_e_r(i, j)), s2 = elem_som(i_elem, f_e_r(i, j + 1 < f_e_r.
dimension(1) && f_e_r(i, j + 1) >= 0 ? j + 1 : 0));
1960 std::array<double, 3> key;
1961 for (
int l = 0; l < 3; l++)
1963 aretes_loc[key] = {{ std::min(s1, s2), std::max(s1, s2) }};
1966 for (
auto &&kv : aretes_loc)
1969 int k = premiere_arete_som[kv.second[0]];
1971 k = chaine_aretes_sommets[k];
1977 aretes_som_.append_line(kv.second[0], kv.second[1]);
1979 int old_head = premiere_arete_som[kv.second[0]];
1981 int new_head = chaine_aretes_sommets.
size_array();
1983 premiere_arete_som[kv.second[0]] = new_head;
1985 v_e_a[i_elem].push_back(k);
1987 if (i_elem == nbelem - 1)
1995 int nb_aretes_elem = 0;
1996 for (i = 0; i < nbelem_tot; i++)
1997 nb_aretes_elem = std::max(nb_aretes_elem, (
int) v_e_a[i].size());
1998 nb_aretes_elem =
mp_max(nb_aretes_elem);
2002 for (j = 0; j < (int) v_e_a[i].size(); j++)
2006 const int n_aretes_tot =
aretes_som_.dimension(0);
2010 Journal() <<
"Domaine " <<
le_nom() <<
" nb_aretes=" << nb_aretes_reelles <<
" nb_aretes_tot=" << n_aretes_tot << finl;
2016 ArrOfInt pe_aretes(n_aretes_tot);
2018 echanger_tableau_aretes(
elem_aretes_, nb_aretes_reelles, pe_aretes);
2021 ArrOfInt indice_aretes_owner;
2022 indice_aretes_owner.
resize_array(n_aretes_tot, RESIZE_OPTIONS::NOCOPY_NOINIT);
2023 for (i = 0; i < nb_aretes_reelles; i++)
2024 indice_aretes_owner[i] = i;
2025 echanger_tableau_aretes(
elem_aretes_, nb_aretes_reelles, indice_aretes_owner);
2028 ArrOfInt pe_voisins;
2029 for (i = 0; i < n_aretes_tot; i++)
2030 if (pe_aretes[i] != moi)
2034 reverse_send_recv_pe_list(pe_voisins, liste_pe);
2039 array_trier_retirer_doublons(pe_voisins);
2042 ArrOfInt indices_pe(
nproc());
2044 for (i = 0; i < nb_voisins; i++)
2045 indices_pe[pe_voisins[i]] = i;
2047 ArrsOfInt aretes_communes_to_recv(nb_voisins);
2048 ArrsOfInt blocs_aretes_virt(nb_voisins);
2049 ArrsOfInt aretes_to_send(nb_voisins);
2052 for (i = 0; i < nb_aretes_reelles; i++)
2054 const int pe = pe_aretes[i];
2057 const int indice_pe = indices_pe[pe];
2060 Cerr <<
"Error: indice_pe=" << indice_pe <<
" shouldn't be negative in Domaine_32_64<_SZ_>::creer_aretes." << finl;
2061 Cerr <<
"It is a TRUST bug on this mesh with the Pa discretization, contact support." << finl;
2062 Cerr <<
"You could also try another partitioned mesh to get around this issue." << finl;
2066 const int indice_distant = indice_aretes_owner[i];
2067 aretes_to_send[indice_pe].append_array(indice_distant);
2068 aretes_communes_to_recv[indice_pe].append_array(i);
2072 for (i = nb_aretes_reelles; i < n_aretes_tot; i++)
2074 const int pe = pe_aretes[i];
2075 assert(pe <
nproc() && pe != moi);
2076 const int indice_pe = indices_pe[pe];
2079 Cerr <<
"Error: indice_pe=" << indice_pe <<
" shouldn't be negative in Domaine_32_64<_SZ_>::creer_aretes." << finl;
2080 Cerr <<
"It is a TRUST bug on this mesh with the Pa discretization, contact support." << finl;
2081 Cerr <<
"You could also try another partitioned mesh to get around this issue." << finl;
2084 const int indice_distant = indice_aretes_owner[i];
2085 aretes_to_send[indice_pe].append_array(indice_distant);
2093 for (i = 0; i < nb_voisins; i++)
2094 schema.
send_buffer(pe_voisins[i]) << aretes_to_send[i];
2097 for (i = 0; i < nb_voisins; i++)
2098 schema.
recv_buffer(pe_voisins[i]) >> aretes_to_send[i];
2106 MD_Vector_std md_aretes(n_aretes_tot, nb_aretes_reelles, pe_voisins, aretes_to_send, aretes_communes_to_recv, blocs_aretes_virt);
2121template <
typename _SIZE_>
2135 const Nom expr_elements(
"1");
2136 const Nom expr_faces(
"1");
2138 domaines_frontieres_.vide();
2140 for (
int i=0; i<nb_frontieres; i++)
2143 Noms nom_frontiere(1);
2147 nom_domaine_surfacique+=
"_boundaries_";
2148 nom_domaine_surfacique+=
frontiere(i).le_nom();
2150 Cerr <<
"Creating a surface domain named " << nom_domaine_surfacique <<
" for the boundary " << nom_frontiere[0] <<
" of the domain " <<
le_nom() << finl;
2155 Cerr <<
"Domain " << nom_domaine_surfacique
2156 <<
" already exists, writing to this object." << finl;
2158 Domaine& dom_new = ref_cast(Domaine,
interprete().objet(nom_domaine_surfacique));
2164 ob.
typer(
"Domaine");
2165 interp.
ajouter(nom_domaine_surfacique, ob);
2167 Domaine& dom_new = ref_cast(Domaine,
interprete().objet(nom_domaine_surfacique));
2170 OBS_PTR(Domaine)& ref_dom_new=domaines_frontieres_.add(OBS_PTR(Domaine)());
2171 ref_dom_new=dom_new;
2175template <
typename _SIZE_>
2187template <
typename _SIZE_>
2193 for (
int_t i = 0; i < dim0; i++)
2194 for (
int j = 0; j < dim1; j++)
2197 for (
int i = 0; i <
nb_bords(); i++)
2214 const int nb_bords = les_cl.size();
2216 for (
int n_bord = 0; n_bord <
nb_bords; n_bord++)
2218 if (sub_type(
Periodique, les_cl[n_bord].valeur()))
2220 const Nom& nom_b =les_cl[n_bord]->frontiere_dis().frontiere().le_nom();
2221 if(bords_per.
rang(nom_b) < 0)
2223 Cerr <<
"ERROR: you have put a periodic boundary condition on a boundary ('" << nom_b <<
"') which is not periodic." << finl;
2224 Cerr <<
"Use the keyword: declarer_bord_perio { domaine " <<
le_nom() <<
" bord " << nom_b <<
" }" << finl;
2225 Cerr <<
"after the loading of the domain to declare this boundary as being periodic." << finl;
2236template<
typename _SZ_>
Empty class used as a base for all the arrays.
void associer_domaine(const Domaine_t &)
Associe un domaine a tous les bords de la liste.
void associer_domaine(const Domaine_t &)
Associe un domaine a tous les objets Bord_Interne de la liste.
: Classe Comm_Group_MPI, derivee de la classe abstraite Comm_Group.
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
classe Domaine_32_64 un Domaine est un maillage compose d'un ensemble d'elements geometriques de meme...
int_t nb_faces_bords_int() const
IntVect_T< _SIZE_ > IntVect_t
void calculer_mon_centre_de_gravite(ArrOfDouble &c)
Calcule le centre de gravite du domaine.
double volume_total() const
void construire_elem_virt_pe_num()
Bords_Internes_t mes_bords_int_
virtual void clear()
Reset the Domaine completely except for its name.
ArrOfInt_t renum_som_perio_
void rang_elems_sommet(SmallArrOfTID_t &elems, double x, double y=0, double z=0) const
const OWN_PTR(Elem_geom_base_32_64< _SIZE_ >) &type_elem() const
Frontiere_32_64< _SIZE_ > Frontiere_t
virtual const MD_Vector & md_vector_sommets() const
Joints_t mes_faces_joint_
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_elem_tot() const
SmallArrOfTID_t & chercher_elements(const DoubleTab &pos, SmallArrOfTID_t &elem, int reel=0) const
Recherche des elements contenant les points dont les coordonnees sont specifiees.
SmallArrOfTID_T< _SIZE_ > SmallArrOfTID_t
DoubleTab_T< _SIZE_ > DoubleTab_t
const OctreeRoot_t & construit_octree() const
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
void creer_mes_domaines_frontieres(const Domaine_VF &domaine_vf)
SmallArrOfTID_t & chercher_aretes(const DoubleTab &pos, SmallArrOfTID_t &arr, int reel=0) const
void calculer_centres_gravite(DoubleTab_t &xp) const
Calcule les centres de gravites des elements du domaine.
int_t nb_faces_frontiere() const
Renvoie le nombre de faces frontiere du domaine (somme des nombres de bords, de raccords et de bords ...
Raccords_t mes_faces_raccord_
static int identifie_item_unique(IntList &item_possible, DoubleTab &coord_possible, const DoubleVect &coord_ref)
virtual void calculer_volumes(DoubleVect_t &volumes, DoubleVect_t &inv_volumes) const
Calcule les volumes des elements du domaine.
void init_faces_virt_bord(const MD_Vector &md_vect_faces, MD_Vector &md_vect_faces_bord)
DoubleTab_t & les_sommets()
void set_renum_som_perio(IntTab_t &renum)
int rang_frontiere(const Nom &) const
void fill_from_list(std::list< Domaine_32_64 * > &lst)
Fills the Domaine from a list of Domaine objects by aggregating them.
Entree & readOn_has_perio(Entree &s, bool &has_perio)
Lit les objets constituant un Domaine a partir d'un flot d'entree.
ArrOfInt_T< _SIZE_ > ArrOfInt_t
int associer_(Objet_U &) override
Association d'un Sous_Domaine au Domaine.
const Frontiere_t & frontiere(int i) const
int nb_frontieres_internes() const
ArrOfInt_t ind_faces_virt_bord_
void add(const Sous_Domaine_t &sd)
DoubleTab getBoundingBox() const
Raccords_t & faces_raccord()
void fixer_premieres_faces_frontiere()
void init_renum_perio()
Initialize the renumerotation array for periodicity.
Sous_Domaine_32_64< _SIZE_ > Sous_Domaine_t
void merge_wo_vertices_with(Domaine_32_64 &z)
Merge another Domaine into this, without considering vertices which are handled separately.
void construire_renum_som_perio(const Conds_lim &, const Domaine_dis_base &)
void renum(const IntVect_t &nums)
Renumerotation des noeuds: Le noeud de numero k devient le noeud de numero Les_Nums[k].
void read_former_domaine(Entree &s, bool &read_perio)
read what was (before TRUST 1.9.2) the "domaine" part from the input stream i.e. (roughly) the elemen...
Bords_Internes_t & bords_int()
void read_vertices(Entree &s)
only read vertices from the stream s
Groupes_Faces_t mes_groupes_faces_
OctreeRoot_32_64< _SIZE_ > OctreeRoot_t
int_t nb_aretes() const
Renvoie le nombre d'aretes reelles.
Noms bords_perio_
List of periodic boundaries - this is filled by Interprete 'Declarer_bord_perio'.
SmallArrOfTID_t & chercher_sommets(const DoubleTab &pos, SmallArrOfTID_t &som, int reel=0) const
void calculer_centres_gravite_aretes(DoubleTab_t &xa) const
Calcule les centres de gravites des aretes du domaine.
void check_domaine()
associate the read objects to the domaine and check that the reading objects are coherent
DoubleVect_T< _SIZE_ > DoubleVect_t
IntTab_t elem_virt_pe_num_
void correct_type_of_borders_after_merge()
Correcting type of borders if they were empty before merge (ie equal to vide_0D).
void build_mc_mesh(bool virt=false) const
Build the MEDCoupling mesh corresponding to the TRUST mesh.
void renum_joint_common_items(const IntVect_t &nums, const int_t elem_offset)
Renumerotation des noeuds et des elements presents dans les items communs des joints.
int_t face_bords_interne_conjuguee(int_t face) const
Renvoie -1 si face n'est pas une face de bord interne Renvoie le numero de la face dupliquee sinon.
SmallArrOfTID_t & indice_elements(const IntTab &som, SmallArrOfTID_t &elem, int reel=0) const
Cherche les numeros (indices) des elements contenants les sommets specifies par le parametre "sommets...
virtual void creer_tableau_sommets(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Cree un tableau ayant une "ligne" par sommet du maillage.
virtual const MD_Vector & md_vector_elements() const
renvoie le descripteur parallele des tableaux aux elements du domaine
double coord(int_t i, int j) const
void ajouter(const DoubleTab_t &soms)
Ajoute des noeuds (ou sommets) au domaine (sans verifier les doublons).
int nb_groupes_faces() const
void ecrire_noms_bords(Sortie &) const
Ecriture des noms des bords sur un flot de sortie.
Groupes_Faces_t & groupes_faces()
IntTab_T< _SIZE_ > IntTab_t
int comprimer()
Concatene les bords de meme nom et ceci pour: les bords, les bords periodiques, les bords internes et...
const Noms & bords_perio() const
int comprimer_joints()
Concatene les joints de meme nom.
Base class for domains description. This class holds all the data shared by all domains and not sensi...
double volume_total_
Volume total du domaine (somme sur tous les processeurs).
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Classe Elem_geom_base Cette classe est la classe de base pour la definition d'elements.
virtual int nb_som_face(int=0) const =0
Nb of vertices for one face of the element.
virtual int get_tab_faces_sommets_locaux(IntTab &faces_som_local) const
remplit le tableau faces_som_local(i,j) qui donne pour 0 <= i < nb_faces() et 0 <= j < nb_som_face(i)...
Class defining operators and methods for all reading operation in an input flow (file,...
Classe Faces Faces decrit un ensemble de faces par leur type (point ,segment, triangle ou quadrangle)...
void typer(const Motcle &)
Type les faces.
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
Type_Face type_face() const
const ArrOfInt_t & get_faces_virt() const
const Domaine_t & domaine() const
Renvoie le domaine associe a la frontiere.
int_t num_premiere_face() const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
void associer_domaine(const Domaine_t &)
Associe la frontiere au domaine dont elle depend.
IntTab_t & les_sommets_des_faces()
Renvoie les sommets des faces de la frontiere.
void add(const Frontiere_32_64 &)
Ajoute les sommets (et faces) de la frontiere passee en parametre a l'objet (Frontiere_32_64).
void associer_domaine(const Domaine_t &)
Associe un domaine a tous les objets Groupe_Faces de la liste.
Interprete un bloc d'instructions dans le jeu de donnees.
Objet_U & ajouter(const Nom &nom, DerObjU &object_to_add)
Ajoute l'objet ob a la liste des objets de l'interprete, et nomme l'objet avec nom.
static int objet_global_existant(const Nom &nom)
renvoie un drapeau indiquant si un objet de ce nom existe dans inteprete_courant() ou l'un de ses par...
static Interprete_bloc & interprete_courant()
renvoie l'interprete_bloc en train d'etre lu dans le jeu de donnees.
void associer_domaine(const Domaine_t &)
Associe un domaine a tous les joints de la liste.
virtual int get_nb_items_tot() const
static void append_item_to_blocs(ArrOfInt &blocs, int item)
methode outil pour ajouter un item a un tableau du genre "blocs" contenant des series de blocs.
Dummy parallel descriptor used for sequential computations.
C'est le plus simple des descripteurs, utilise pour les tableaux de valeurs aux sommets,...
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
void copy(const MD_Vector_base &)
construction d'un objet MD_Vector par copie d'un objet existant.
static void nettoie(Domaine_t &)
static int NettoiePasNoeuds
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom & le_nom() const override
Renvoie *this;.
Un tableau de chaine de caracteres (VECT(Nom)).
int rang(const char *const ch) const
Objet_U * typer(const char *nom_type)
Essaie de creer une instance du type "type".
virtual int associer_(Objet_U &)
Associe l'Objet_U a un autre Objet_U Methode virtuelle a surcharger.
const Interprete & interprete() const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
static double precision_geom
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
int_t rang_sommet(double x, double y=0, double z=0) const
int_t rang_elem(double x, double y=0, double z=0) const
void construire(int reel=0)
void rang_elems_sommet(SmallArrOfTID_t &, double x, double y=0, double z=0) const
int construit() const
Renvoie vrai si le domaine associe a l'octree est non nulle.
int_t rang_arete(double x, double y=0, double z=0) const
void associer_Domaine(const Domaine_t &d)
: Un octree permettant de chercher dans l'espace des elements ou des points decrits par des coordonne...
static int_t search_nodes_close_to(double x, double y, double z, const DoubleTab_t &coords, ArrOfInt_t &node_list, double epsilon)
Methode hors classe Cherche parmi les sommets de la liste node_list ceux qui sont a une.
void build_nodes(const DoubleTab_t &coords, const bool include_virtual, const double epsilon=0.)
construit un octree contenant les points de coordonnees coords.
int_t search_elements_box(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax, ArrOfInt_t &elements) const
cherche tous les elements ou points ayant potentiellement une intersection non vide avec la boite don...
static const Comm_Group & current_group()
renvoie une reference au groupe de processeurs actif courant
std::chrono::time_point< clock > time_point
classe Periodique Cette classe represente une condition aux limites periodique.
int get_tab_faces_sommets_locaux(IntTab &faces_som_local) const override=0
remplit le tableau faces_som_local(i,j) qui donne pour 0 <= i < nb_faces() et 0 <= j < nb_som_face(i)...
Classe Polyedre Cette represente l'element geometrique Polyedre.
const ArrOfInt_t & getPolyhedronIndex() const
void remplir_Nodes_glob(ArrOfInt_t &Nodes_glob, const IntTab_t &les_elems) const
const ArrOfInt_t & getFacesIndex() const
static void mp_max_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static double mp_min(double)
static double mp_max(double)
static bool is_parallel()
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static double mp_sum_as_double(int v)
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static void mp_min_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static bool is_sequential()
void associer_domaine(const Domaine_t &)
Associe un domaine a tous les raccords de la liste.
static void renum_som_perio(const Domaine_32_64< int > &dom, ArrOfInt_T< int > &renum_som_perio, bool calculer_espace_virtuel)
static void init_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
Create parallel descriptors for the vertex and element arrays of the domain (necessary because Scatte...
static void construire_espace_virtuel_traduction(const MD_Vector &md_indice, const MD_Vector &md_valeur, IntTab &tableau, const int error_is_fatal=1)
Construit la structure items_communs + espaces virtuels d'un tableau contenant des indices d'items ge...
static void uninit_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
methode utilisee par les interpretes qui modifient le domaine (sequentiel), detruit les descripteurs ...
void echange_taille_et_messages() const
Cette methode lance l'echange de donnees entre tous les processeurs.
Sortie & send_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y entasser des donnees a envoyer.
void end_comm() const
Vide les buffers et libere les ressources: on a fini de lire les donnees recues dans les buffers.
Entree & recv_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y lire les donnees recues.
void begin_comm() const
Reserve les buffers de comm pour une nouvelle communication.
void set_send_recv_pe_list(const ArrOfInt &send_pe_list, const ArrOfInt &recv_pe_list, const int me_to_me=0)
Definit la liste des processeurs a qui on va envoyer et de qui on va recevoir des donnees.
Classe de base des flux de sortie.
virtual void precision(int)
virtual void setf(IOS_FORMAT)
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
virtual void resize_tab(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void suppr(_TYPE_)
Supprime un element contenu dans la liste.
void set_md_vector(const MD_Vector &) override
int dimension_int(int d) const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
void copy(const TRUSTTab &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual const MD_Vector & get_md_vector() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")