16#include <TRUST_2_MED.h>
24#include <medcoupling++.h>
27#include <MEDLoader.hxx>
32void traite_nom_fichier_med(
Nom& nom_fic)
34 Nom nom_fic2(nom_fic);
35 nom_fic2.prefix(
".med");
36 if (nom_fic2==nom_fic)
38 Cerr<<
"Error : the med field must have a .med extension"<<finl;
39 Cerr<<nom_fic2 <<
" "<<nom_fic<<finl;
43 nom_fic2.prefix(
"_0000");
45 nom_fic=nom_fic2.
nom_me(nom_fic.
me());
48 std::ifstream test(nom_fic);
53 std::ifstream test(nom_fic);
57 nom_fic=nom_fic2.
nom_me(0);
58 std::ifstream test2(nom_fic);
61 Cerr<<
"med file "<<nom_fic<<
" not found."<<finl;
68extern "C" int MEDimport(
char*,
char*);
69void test_version(
Nom& nom)
74 med_bool med_ok, hdf_ok;
75 if (MEDfileCompatibility(nom, &med_ok, &hdf_ok))
77 Cerr<<
"Problem when trying to open the file "<<nom<<finl;
81 if (hdf_ok && med_ok)
return;
89 char* nomtmp =
new char[strlen(nom)+1];
90 int compteur=(int)strlen(nom);
94 const char* ptr=nomtmp+compteur;
95 bool pas_de_slach=
false;
97 while((*ptr!=
'/')&&(compteur>0))
101 if (*ptr==
'/') pas_de_slach=
true;
116 nomentier.prefix(cible);
129 std::ifstream test(nom2);
132 struct stat org,newf;
135 if (org.st_mtime>newf.st_mtime)
142 Cerr<<
"Creation of the file "<<nom2<<
" to newer format."<<finl;
146 Cerr<<
"The file "<<nom2<<
" is up to date."<<finl;
155void read_med_field_names(
const Nom& nom_fic,
Noms& noms_chps, ArrOfDouble& temps_sauv)
157#if defined(MEDCOUPLING_) && defined(MED_)
159 using namespace MEDCoupling;
163 vector<string> nams(GetAllFieldNames(fnam));
164 noms_chps.resize((
int)nams.size());
165 for(
const auto& s: nams)
166 noms_chps.add(
Nom(s));
169 for(
const auto& fldName: nams)
171 vector< MCTimeLabel > it(GetAllFieldIterations(fnam, fldName));
172 vector<double> other_tims;
173 other_tims.resize(it.size());
175 auto lambd = [](
const MCTimeLabel& cplx_pair) {
return cplx_pair.second; };
176 transform(it.begin(), it.end(),
177 back_inserter(other_tims),
179 std::sort(other_tims.begin(), other_tims.end());
180 if (tims.size() == 0)
182 else if (tims != other_tims)
183 Process::exit(
"LireMED::read_med_field_names() - different timesteps between the various fields found in the MED file !!");
185 temps_sauv.
resize((
int)tims.size());
186 std::copy(tims.begin(), tims.end(), temps_sauv.
addr());
194med_geometry_type type_geo_trio_to_type_med(
const Nom& type_elem_i,med_axis_type& rep)
199 Motcle type_elem_0 = type_elem_i;
200 type_elem_0.
prefix(
"_64");
203 Motcle type_elem = type_elem_0;
205 if (type_elem !=
Motcle(type_elem_0))
208 Cerr<<
"#"<<type_elem<<
"#"<<
Motcle(type_elem_0)<<
"#"<<(type_elem!=
Motcle(type_elem_0))<<finl;
209 if (type_elem==
"QUADRILATERE_2D")
210 type_elem=
"SEGMENT_2D";
211 if (type_elem==
"RECTANGLE_2D")
213 type_elem=
"RECTANGLE";
217 med_geometry_type type_elem_med;
218 if ((type_elem==
"RECTANGLE") || (type_elem==
"QUADRANGLE"))
219 type_elem_med=MED_QUAD4;
220 else if ((type_elem==
"HEXAEDRE")|| (type_elem==
"HEXAEDRE_VEF"))
221 type_elem_med=MED_HEXA8;
222 else if (type_elem==
"TRIANGLE")
223 type_elem_med=MED_TRIA3;
224 else if (type_elem==
"TETRAEDRE")
225 type_elem_med=MED_TETRA4;
226 else if ((type_elem==
"SEGMENT_2D") || (type_elem==
"SEGMENT"))
227 type_elem_med=MED_SEG2;
228 else if (type_elem==
"TRIANGLE_3D")
229 type_elem_med=MED_TRIA3;
230 else if (type_elem==
"QUADRANGLE_3D")
231 type_elem_med=MED_QUAD4;
232 else if (type_elem==
"PRISME")
233 type_elem_med=MED_PENTA6;
234 else if (type_elem==
"POLYEDRE")
235 type_elem_med=MED_POLYHEDRON;
236 else if (type_elem==
"POLYGONE")
237 type_elem_med=MED_POLYGON;
238 else if (type_elem==
"POLYGONE_3D")
239 type_elem_med=MED_POLYGON;
240 else if(type_elem==
"SEGMENT")
241 type_elem_med=MED_SEG2;
242 else if(type_elem==
"PRISME_HEXAG")
243 type_elem_med=MED_OCTA12;
244 else if(type_elem==
"POINT_1D")
245 type_elem_med=MED_POINT1;
246 else if(type_elem==
"POINT")
247 type_elem_med=MED_POINT1;
250 Cerr<<type_elem<<
" no available code" <<finl;
252 type_elem_med=MED_QUAD4;
254 return type_elem_med;
257med_geometry_type type_geo_trio_to_type_med(
const Nom& type_elem)
260 return type_geo_trio_to_type_med(type_elem,rep);
267INTERP_KERNEL::NormalizedCellType type_geo_trio_to_type_medcoupling(
const Nom& type_elem_,
int& mesh_dimension)
270 type_elem=type_elem_;
272 if (type_elem!=
Motcle(type_elem_))
274 if (type_elem ==
"QUADRILATERE_2D")
275 type_elem =
"SEGMENT_2D";
276 if (type_elem ==
"RECTANGLE_2D")
278 type_elem =
"RECTANGLE";
282 INTERP_KERNEL::NormalizedCellType type_cell;
283 if ((type_elem==
"RECTANGLE") || (type_elem==
"QUADRANGLE") || (type_elem==
"QUADRANGLE_3D"))
285 type_cell = INTERP_KERNEL::NORM_QUAD4;
288 else if ((type_elem==
"HEXAEDRE") || (type_elem==
"HEXAEDRE_VEF"))
290 type_cell = INTERP_KERNEL::NORM_HEXA8;
293 else if ((type_elem==
"TRIANGLE") || (type_elem==
"TRIANGLE_3D"))
295 type_cell = INTERP_KERNEL::NORM_TRI3;
298 else if (type_elem==
"TETRAEDRE")
300 type_cell = INTERP_KERNEL::NORM_TETRA4;
303 else if ((type_elem==
"SEGMENT") || (type_elem==
"SEGMENT_2D"))
305 type_cell = INTERP_KERNEL::NORM_SEG2;
308 else if (type_elem==
"PRISME")
310 type_cell = INTERP_KERNEL::NORM_PENTA6;
313 else if (type_elem==
"POLYEDRE")
315 type_cell = INTERP_KERNEL::NORM_POLYHED;
318 else if ((type_elem==
"POLYGONE") || (type_elem==
"POLYGONE_3D"))
320 type_cell = INTERP_KERNEL::NORM_POLYGON;
323 else if(type_elem==
"PRISME_HEXAG")
325 type_cell = INTERP_KERNEL::NORM_HEXGP12;
328 else if ((type_elem==
"POINT") || (type_elem==
"POINT_1D"))
330 type_cell = INTERP_KERNEL::NORM_POINT1;
335 Cerr<<type_elem<<
" no available cell." <<finl;
337 return INTERP_KERNEL::NORM_POINT1;
339 assert(mesh_dimension>=0);
343void fill_connectivity_from_mc_mesh(
const MEDCoupling::MEDCouplingUMesh * mc_mesh, IntTab& face_sommet, IntTab& elem_face)
345 using namespace MEDCoupling;
346 using DAI = MCAuto<DataArrayIdType>;
348 DAI desc(DataArrayIdType::New()), descIndx(DataArrayIdType::New()), revDesc(DataArrayIdType::New()), revDescIndx(DataArrayIdType::New());
349 MCAuto<MEDCoupling::MEDCouplingUMesh> mc_desc(mc_mesh->buildDescendingConnectivity(desc, descIndx, revDesc, revDescIndx));
351 DataArrayIdType* c(mc_desc->getNodalConnectivity()), *cI(mc_desc->getNodalConnectivityIndex());
352 const mcIdType *cP(c->getConstPointer()), *cIP(cI->getConstPointer());
356 DAI dsi = cI->deltaShiftIndex();
357 const mcIdType* dsiP = dsi->getConstPointer();
359 int max_pts =
static_cast<int>(dsi->getMaxValue(idx_dnu));
360 face_sommet.
resize(nb_faces, max_pts-1);
363 for (
auto i = 0; i < nb_faces; i++)
365 auto nb_pts = dsiP[i] - 1;
366 for (
auto j = 0; j < nb_pts; j++)
367 face_sommet(i,j) =
static_cast<int>(cP[cIP[i]+1+j]);
372 DAI dsi2 = descIndx->deltaShiftIndex();
373 int max_nb_of_fac =
static_cast<int>(dsi2->getMaxValue(idx_dnu));
374 elem_face.
resize(nb_elem, max_nb_of_fac);
376 const mcIdType *descP(desc->getConstPointer()), *descIndxP(descIndx->getConstPointer());
378 for (
auto i = 0; i < nb_elem; i++)
379 for (
auto j = 0; j < descIndxP[i+1]-descIndxP[i]; j++)
380 elem_face(i, j) =
static_cast<int>(descP[descIndxP[i]+j]);
388template <
typename _SIZE_>
389void conn_trust_to_med(IntTab_T<_SIZE_>& les_elems,
const Nom& type_elem,
bool toMED)
392 using int_t = _SIZE_;
393 using IntTab_t = IntTab_T<_SIZE_>;
398 med_geometry_type type_elem_med;
399 type_elem_med=type_geo_trio_to_type_med(type_elem);
400 IntTab_t les_elemsn(les_elems);
402 switch (type_elem_med)
410 std::iota(filter.
addr(), filter.
addr()+2, 0);
416 std::iota(filter.
addr(), filter.
addr()+3, 0);
430 std::iota(filter.
addr(), filter.
addr()+4, 0);
442 std::iota(filter.
addr(), filter.
addr()+6, 0);
467 std::iota(filter.
addr(), filter.
addr()+nb_som_max, 0);
471 Cerr<<
"case not scheduled"<<finl;
478 Cerr<<
"Problem for filtering operation "<<finl;
483 for (int_t el=0; el<nele; el++)
484 for (
int n=0; n<ns; n++)
485 les_elems(el,n)=les_elemsn(el,filter[n]);
489 for (int_t el=0; el<nele; el++)
490 for (
int n=0; n<ns; n++)
491 les_elems(el,filter[n])=les_elemsn(el,n);
497template void conn_trust_to_med(IntTab_T<int>& les_elems,
const Nom& type_elem,
bool toMED);
499template void conn_trust_to_med(IntTab_T<trustIdType>& les_elems,
const Nom& type_elem,
bool toMED);
class Char_ptr Une chaine de caractere pour nommer les objets de TRUST
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
Nom nom_me(int, const char *prefix=0, int without_padding=0) const
Insere _prefix000n (n=me() ou nproc()) dans un nom de fichier (par ex:toto.
Nom & prefix(const char *const)
const std::string & getString() const
Un tableau de chaine de caracteres (VECT(Nom)).
static int check_int_overflow(trustIdType)
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
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.
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void resize(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
int dimension_int(int d) const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const