// Copyright (C) 2006-2011 EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "MeshCut_Maillage.hxx" #include "MeshCut_Cube.hxx" #include #include #include #include #include #include using namespace MESHCUT; using namespace std; Maillage::Maillage(std::string _ID) { ID = _ID; nombreNoeudsMaillage = 0; nombreMaillesMaillage = 0; //nPOI1=0; nSEG2=0; nSEG3=0; nTRIA3=0; nTRIA6=0; nQUAD4=0; nQUAD8=0; nTETRA4=0; nTETRA10=0; nPYRAM5=0; nPYRAM13=0; nPENTA6=0; nPENTA15=0; nHEXA8=0; nHEXA20=0; GM.clear(); GN.clear(); for (int itm = (int) POI1; itm <= (int) HEXA20; itm++) EFFECTIFS_TYPES[(TYPE_MAILLE) itm] = 0; } Maillage::~Maillage() { } void Maillage::creationGMtype(TYPE_MAILLE tm, std::string nomGMtype) { //cout << "Creation GM type, groupe " << nomGMtype << endl; for (int nl = 0; nl < EFFECTIFS_TYPES[tm]; nl++) GM[nomGMtype][tm].push_back(nl); GM[nomGMtype][tm].resize(EFFECTIFS_TYPES[tm]); sort(GM[nomGMtype][tm].begin(), GM[nomGMtype][tm].end()); } void Maillage::afficheMailles(TYPE_MAILLE tm) { cout << "Affichage des mailles du type " << TM2string(tm) << " (effectif " << EFFECTIFS_TYPES[tm] << "): " << endl; if (EFFECTIFS_TYPES[tm]) { // Boucle sur les connectivités d'un type tm int nnoeuds = Nnoeuds(tm); for (int i = 0; i < EFFECTIFS_TYPES[tm]; i++) { cout << "\tMaille " << i << " :" << endl; //Boucle sur les noeuds de la maille de numéro local i dans le type tm int * offset = CNX[tm] + nnoeuds * i; for (int j = 0; j < nnoeuds; j++) { int ngnoeud = *(offset + j); //cout << "\t\t" << X[ngnoeud-1] << " " << Y[ngnoeud-1] << " " << Z[ngnoeud-1] << endl; cout << "\t" << ngnoeud << "\t" << *(XX + ngnoeud - 1) << " " << *(YY + ngnoeud - 1) << " " << *(ZZ + ngnoeud - 1) << endl; } } cout << endl; } } void Maillage::listeMaillesType(TYPE_MAILLE tm) { cout << "La fonction \"Restitution des mailles par type\" est obsolète " << endl; // cout << "Restitution des mailles du type " << TM2string(tm) << " (effectif " << EFFECTIFS_TYPES[tm] << "): " << endl; // if (EFFECTIFS_TYPES[tm]) // for (int i = 0; i < IDS_MAILLES[tm].size(); i++) // cout << IDS_MAILLES[tm][i] << " "; // cout << endl; } void Maillage::listeMaillesTousTypes() { for (int itm = (int) POI1; itm <= (int) HEXA20; itm++) { TYPE_MAILLE tm = (TYPE_MAILLE) itm; listeMaillesType(tm); } } void Maillage::listeMaillesParGM() { cout << "Liste des mailles par GM : " << endl; for (map > >::iterator I = GM.begin(); I != GM.end(); I++) listeMaillesGM(I->first); } void Maillage::listeMaillesGM(std::string nomGM) { cout << "Liste des mailles du groupe " << nomGM << " : " << endl; for (int itm = (int) POI1; itm <= (int) HEXA20; itm++) { TYPE_MAILLE tm = (TYPE_MAILLE) itm; if (GM[nomGM][tm].size()) { cout << "\t" << TM2string(tm) << " : "; for (unsigned int j = 0; j < GM[nomGM][tm].size(); j++) cout << GM[nomGM][tm][j] << " "; cout << endl; } } } //void Maillage::listeMaillesGMordonne(std::string nomGM) //{ // cout << "Liste ordonnée des mailles du groupe " << nomGM << " (" << GM[nomGM].size() << " mailles) : "; // sort(GM[nomGM].begin(), GM[nomGM].end()); // for (int j = 0; j < GM[nomGM].size(); j++) // cout << GM[nomGM][j] << " "; // cout << endl; //} void Maillage::listeNoeuds() { cout << "Liste des noeuds du maillage : " << endl; for (int i = 0; i < nombreNoeudsMaillage; i++) cout << "\t" << *(XX + i) << " " << *(YY + i) << " " << *(ZZ + i) << endl; cout << endl; } void Maillage::listeNoeudsGN(std::string nomGN) { cout << "Liste brute des noeuds du groupe " << nomGN << " (" << GN[nomGN].size() << " noeuds) : "; for (unsigned int j = 0; j < GN[nomGN].size(); j++) cout << GN[nomGN][j] << " "; cout << endl; } void Maillage::listeNoeudsGNordonne(std::string nomGN) { cout << "Liste ordonnée des noeuds du groupe " << nomGN << " (" << GN[nomGN].size() << " noeuds) : "; sort(GN[nomGN].begin(), GN[nomGN].end()); for (unsigned int j = 0; j < GN[nomGN].size(); j++) cout << GN[nomGN][j] << " "; cout << endl; } std::vector Maillage::G(int i, TYPE_MAILLE tm) { vector G; float x = 0.0; float y = 0.0; float z = 0.0; int nn = NnoeudsGeom(tm); for (int j = 0; j < nn; j++) { int ng = CNX[tm][nn * i + j]; x += XX[ng - 1]; y += YY[ng - 1]; z += ZZ[ng - 1]; } G.push_back(x / nn); G.push_back(y / nn); G.push_back(z / nn); G.resize(3); return G; } float Maillage::distanceNoeudMaille(int ngnoeud, int imaille, TYPE_MAILLE tm) { float x, y, z; float x0 = XX[ngnoeud - 1]; float y0 = YY[ngnoeud - 1]; float z0 = ZZ[ngnoeud - 1]; int nn = NnoeudsGeom(tm); float d1 = 1000000000000.0; float d; for (int j = 0; j < nn; j++) { int ng = CNX[tm][nn * imaille + j]; // Noeud courant dans la maille x = XX[ng - 1]; y = YY[ng - 1]; z = ZZ[ng - 1]; d = sqrt((x - x0) * (x - x0) + (y - y0) * (y - y0) + (z - z0) * (z - z0)); if (d < d1) d1 = d; } return d1; } /*! * Retourne le ng du noeud le plus proche de ngnoeud dans la maille imaille du type tm */ int Maillage::noeudVoisin(int ngnoeud, int imaille, TYPE_MAILLE tm) { float x, y, z; int ngv; float x0 = XX[ngnoeud - 1]; float y0 = YY[ngnoeud - 1]; float z0 = ZZ[ngnoeud - 1]; int nn = NnoeudsGeom(tm); float d1 = 1000000000000.0; float d; for (int j = 0; j < nn; j++) { int ng = CNX[tm][nn * imaille + j]; // Noeud courant dans la maille x = XX[ng - 1]; y = YY[ng - 1]; z = ZZ[ng - 1]; d = sqrt((x - x0) * (x - x0) + (y - y0) * (y - y0) + (z - z0) * (z - z0)); if (d < d1) { d1 = d; ngv = ng; } } return ngv; } float Maillage::distanceNoeudNoeud(int ng1, int ng2) { float x1, x2, y1, y2, z1, z2; x1 = XX[ng1 - 1]; y1 = YY[ng1 - 1]; z1 = ZZ[ng1 - 1]; x2 = XX[ng2 - 1]; y2 = YY[ng2 - 1]; z2 = ZZ[ng2 - 1]; return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2)); } //void Maillage::encombrements() //{ // float ex = 0.0; // float ey = 0.0; // float ez = 0.0; // // for (int itm = (int) SEG2; itm <= (int) HEXA20; itm++) // { // TYPE_MAILLE tm = (TYPE_MAILLE) itm; // if (MAILLAGE->EFFECTIFS_TYPES[tm]) // { // int nnoeuds = Nnoeuds(tm); // for (int i = 0; i < CON[tm].size() / nnoeuds; i++) // { // //Boucle sur les noeuds de la maille de numéro local i dans le type tm // for (int j = 0; j < nnoeuds; j++) // { // //..... CON[tm][nnoeuds*i+j]; // } // } // } // } // // Boucle sur les connectivités d'un type tm //} void Maillage::inputMED(std::string fichierMED) { //cout << endl << "Début procédure inputMED, fichier "<< fichierMED << endl; // int i, j, k, ichamp, igauss, ipt, ival; int j; // med_err ret = 0; // Code retour med_idt fid; // Descripteur de fichier MED char maa[MED_NAME_SIZE + 1]; // nom du maillage de longueur maxi MED_NAME_SIZE med_int spacedim; med_int mdim; // Dimension du maillage med_mesh_type type; char desc[MED_COMMENT_SIZE + 1]; // Description du maillage // Profils // med_int nprofils; // int iprofil; // char nomprofil[MED_NAME_SIZE + 1] = ""; // med_int nvalprofil, nvalprofil2; // med_int *pflval; // Champs // med_int nChamps, nCompChamp, nval; // char *compChamp, *unitChamp, *nomChamp; //char nomChamp [ MED_NAME_SIZE+1 ] = ""; // med_field_type typeChamp; // med_int nGauss, ngpdt, numdt, numo; med_int nPasTemps; // char locname[MED_NAME_SIZE + 1] = ""; // med_geometry_type type_geo; // med_int ngauss; char dtunit[MED_SNAME_SIZE + 1] = ""; // med_float dt = 0.0; // med_bool local; // med_int nbrefmaa; med_sorting_type sortingtype; med_axis_type axistype; // Initialisations FAMILLES.clear(); FAM_TYPES.clear(); FAMILLES_NOEUDS.clear(); GROUPES_MAILLES.clear(); GROUPES_NOEUDS.clear(); RESIDU.clear(); // Sera initialisé à 1 par la routine acquisitionTYPE_inputMED tailleFAMILLES.clear(); tailleGROUPES.clear(); // Ouverture du fichier MED en lecture seule fid = MEDfileOpen(string2char(fichierMED), MED_ACC_RDONLY); if (fid < 0) { ERREUR("Error file open\n"); } //cout << chrono() << " --- inputMED: MEDfileOpen: ouverture du maillage en lecture seule, OK" << endl; // Lecture des infos concernant le premier maillage if (MEDmeshInfo(fid, 1, maa, &spacedim, &mdim, &type, desc, dtunit, &sortingtype, &nPasTemps, &axistype, axisname, unitname) < 0) ERREUR("Error while reading mesh informations "); //cout << chrono() << " --- inputMED: MEDmeshInfo: OK" << endl; // cerr << "maa=" << maa << endl; // cerr << "spacedim=" << spacedim << endl; // cerr << "mdim=" << mdim << endl; // cerr << "type=" << type << endl; // cerr << "desc=" << desc << endl; // cerr << "dtunit=" << dtunit << endl; // cerr << "sortingtype=" << sortingtype << endl; // cerr << "nPasTemps=" << nPasTemps << endl; // cerr << "axistype=" << axistype << endl; // cerr << "axisname=" << axisname << endl; // cerr << "unitname=" << unitname << endl; dimensionMaillage = mdim; dimensionEspace = spacedim; ID = (string) maa; // nGauss = MEDnGauss(fid); // if (debug > 0) // cout << "Nombre d'éléments portant des points de Gauss: " << (int) nGauss << endl; // map REFGAUSS; // map::iterator iterGAUSS; // for (igauss = 1; igauss <= nGauss; igauss++) // { // if (MEDgaussInfo(fid, igauss, locname, &type_geo, &ngauss) < 0) // ERREUR("Erreur MEDgaussInfo"); // if (debug == 2) // { // cout << endl << " Retour MEDgaussInfo, localisation gauss n°" << igauss << " : " << endl; // cout << " locname = " << locname << endl; // cout << " type_geo = " << type_geo << endl; // cout << " ngauss = " << ngauss << endl; // cout << endl; // } // REFGAUSS[(string) locname] = (int) ngauss; // } // // if (debug == 2) // { // cout << endl << "Restitution de la table REFGAUSS:" << endl; // for (iterGAUSS = REFGAUSS.begin(); iterGAUSS != REFGAUSS.end(); iterGAUSS++) // { // cout << iterGAUSS->first << " : " << iterGAUSS->second << endl; // } // } // // nprofils = MEDnProfil(fid); // if (debug) // cout << endl << endl << "Nombre de profils: " << nprofils << endl; // for (iprofil = 1; iprofil <= nprofils; iprofil++) // { // if (MEDprofilInfo(fid, iprofil, nomprofil, &nvalprofil) < 0) // ERREUR("ERREUR MEDprofilInfo"); // nvalprofil2 = MEDnValProfil(fid, nomprofil); // if (debug == 2) // { // cout << "Profil " << iprofil << " : " << endl; // cout << " Nom profil : " << nomprofil << endl; // cout << " Nombre de valeurs profil (par MEDprofilInfo) : " << nvalprofil << endl; // cout << " Nombre de valeurs profil (par MEDnValProfil) : " << nvalprofil2 << endl; // } // if (nvalprofil != nvalprofil2) // ERREUR("Discordance nvalprofil (entre MEDprofilInfo et MEDnValProfil)"); // pflval = (med_int*) malloc(sizeof(med_int) * nvalprofil); // if (MEDprofilLire(fid, pflval, nomprofil) < 0) // ERREUR("ERREUR MEDprofilLire"); // //cout << " Affichage des 100 premières valeurs:" << endl; // //for (ival=0;ival 0) // { // // for (ichamp = 1; ichamp <= nChamps; ichamp++) // { // //for (ichamp=4; ichamp<=4; ichamp++ ) { // cout << endl << endl; // cout << endl << endl << " ====================================================================" << endl; // cout << endl << endl << " CHAMP " << ichamp << endl; // cout << endl << endl << " ====================================================================" << endl; // cout << endl << endl; // // nCompChamp = MEDnChamp(fid, ichamp); // if (nCompChamp < 0) // ERREUR("Erreur Ncomposantes champ"); // cout << "Nombre de composantes du champ " << ichamp << " : " << (int) nCompChamp << endl; // // nomChamp = (char*) malloc(MED_NAME_SIZE + 1); // compChamp = (char*) malloc(nCompChamp * MED_SNAME_SIZE + 1); // unitChamp = (char*) malloc(nCompChamp * MED_SNAME_SIZE + 1); // // if (MEDchampInfo(fid, ichamp, nomChamp, &typeChamp, compChamp, unitChamp, nCompChamp) < 0) // ERREUR("Erreur MEDchampInfo"); // // cout << "Infos sur le champ " << ichamp << " : " << endl; // cout << " Nom: " << (string) nomChamp << endl; // cout << " Type: " << typeChamp << endl; // cout << " Noms des composantes: " << (string) compChamp << endl; // cout << " Unités des composantes: " << (string) unitChamp << endl; // // infoChamps((string) "NOEUDS", MED_NODE, MED_NONE, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "POI1", MED_CELL, MED_POINT1, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "SEG2", MED_CELL, MED_SEG2, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "SEG3", MED_CELL, MED_SEG3, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "TRIA3", MED_CELL, MED_TRIA3, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "TRIA6", MED_CELL, MED_TRIA6, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "QUAD4", MED_CELL, MED_QUAD4, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "QUAD8", MED_CELL, MED_QUAD8, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "TETRA4", MED_CELL, MED_TETRA4, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "TETRA10", MED_CELL, MED_TETRA10, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "PYRAM5", MED_CELL, MED_PYRA5, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "PYRAM13", MED_CELL, MED_PYRA13, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "PENTA6", MED_CELL, MED_PENTA6, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "PENTA15", MED_CELL, MED_PENTA15, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "HEXA8", MED_CELL, MED_HEXA8, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // infoChamps((string) "HEXA20", MED_CELL, MED_HEXA20, fid, maa, nomChamp, typeChamp, nCompChamp, REFGAUSS); // // } // // cout << endl << "Rappel des codes de géométries: " << endl; // cout << " TETRA4 = " << MED_TETRA4 << endl; // cout << " PENTA6 = " << MED_PENTA6 << endl; // cout << " HEXA8 = " << MED_HEXA8 << endl; // // } // else // cout << "Pas de champs dans ce maillage" << endl; // ################################################################################################## // ################################################################################################## // // A C Q U I S I T I O N D E S F A M I L L E S // // ################################################################################################## // ################################################################################################## med_int nFamilles; char nomGroupeChar[MED_LNAME_SIZE + 1]; if ((nFamilles = MEDnFamily(fid, maa)) < 0) ERREUR("ERROR MEDnFamily"); // Initialisation des tailles: tailleFAMILLES et tailleGROUPES // for (int i = 0; i < nFamilles; i++) // { // char nomfam[MED_NAME_SIZE + 1]; // char *attdes, *gro; // med_int numfam, *attide, *attval, natt, ngro; // // if ((ngro = MEDnFamilyGroup(fid, maa, i + 1)) < 0) // ERREUR("ERREUR MEDnFamilyGroup"); // if ((natt = MEDnFamily23Attribute(fid, maa, i + 1)) < 0) // ERREUR("ERREUR MEDnFamily23Attribute"); // // attide = (med_int *) malloc(sizeof(med_int) * natt); // attval = (med_int *) malloc(sizeof(med_int) * natt); // attdes = (char *) malloc(MED_COMMENT_SIZE * natt + 1); // gro = (char *) malloc(MED_LNAME_SIZE * ngro + 1); // // if (MEDfamilyInfo(fid, maa, (med_int)(i + 1), nomfam, &numfam, attide, attval, attdes, &natt, gro, &ngro) < 0) // ERREUR("ERREUR MEDfamilyInfo"); // // free(attide); // free(attval); // free(attdes); // free(gro); // } for (int i = 0; i < nFamilles; i++) { char nomfam[MED_NAME_SIZE + 1]; char *attdes, *gro; med_int numfam, *attide, *attval, natt, ngro; if ((ngro = MEDnFamilyGroup(fid, maa, i + 1)) < 0) ERREUR("ERROR MEDnFamilyGroup"); if ((natt = MEDnFamily23Attribute(fid, maa, i + 1)) < 0) ERREUR("ERROR MEDnFamily23Attribute"); attide = (med_int *) malloc(sizeof(med_int) * natt); attval = (med_int *) malloc(sizeof(med_int) * natt); attdes = (char *) malloc(MED_COMMENT_SIZE * natt + 1); gro = (char *) malloc(MED_LNAME_SIZE * ngro + 1); if (MEDfamilyInfo(fid, maa, (med_int) (i + 1), nomfam, &numfam, gro) < 0) ERREUR("ERROR MEDfamilyInfo"); for (int ig = 1; ig <= ngro; ig++) { for (j = 0; j < MED_LNAME_SIZE; j++) nomGroupeChar[j] = gro[(ig - 1) * MED_LNAME_SIZE + j]; nomGroupeChar[MED_LNAME_SIZE] = '\0'; //cout << "Groupe lu : " << (string)nomGroupeChar << endl; tailleGROUPES[strip((string) nomGroupeChar)]++; if (numfam > 0) GROUPES_NOEUDS[strip((string) nomGroupeChar)].push_back((int) numfam); else if (numfam < 0) GROUPES_MAILLES[strip((string) nomGroupeChar)].push_back((int) numfam); } free(attide); free(attval); free(attdes); free(gro); } // ################################################################################################## // ################################################################################################## // // A C Q U I S I T I O N D E S N O E U D S // // ################################################################################################## // ################################################################################################## // class Noeud *n; // list listeNoeuds; // float x, y, z, rx, ry, rz, tx, ty, tz; string line, IDnoeud; float x0, x1, y0, y1, z0, z1; vector RESIDU_NOEUDS; // Table de vérité du résidu des noeuds ostringstream OSCOORD; med_int nnoe = 0; // Nbre de noeuds med_float *coo1; // Table des coordonnées // char nomcoo[mdim * MED_SNAME_SIZE + 1]; // Table des noms des coordonnées // char unicoo[mdim * MED_SNAME_SIZE + 1]; // Table des unités des coordonnées char *nomnoe; med_int *numnoe; med_int *nufano; // med_grid_type rep; // med_bool inonoe, inunoe; // med_int profil[2] = { 2, 3 }; med_bool coordinatechangement; med_bool geotransformation; // Combien de noeuds a lire ? nnoe = MEDmeshnEntity(fid, maa, MED_NO_DT, MED_NO_IT, MED_NODE, MED_NO_GEOTYPE, MED_COORDINATE, MED_NO_CMODE, &coordinatechangement, &geotransformation); if (nnoe < 0) ERREUR("Error while reading number of nodes"); nombreNoeudsMaillage = nnoe; // Lecture des familles des noeuds med_int *famNoeuds = (med_int*) malloc(sizeof(med_int) * nnoe); if (nnoe > 0) { if (MEDmeshEntityFamilyNumberRd(fid, maa, MED_NO_DT, MED_NO_IT, MED_NODE, MED_NONE, famNoeuds) < 0) ERREUR("Error while reading family node number (MEDmeshEntityFamilyNumberRd)"); } /* Allocations memoires */ if (nnoe > 0) { // table des coordonnees - profil : (dimension * nombre de noeuds ) coo1 = (med_float*) calloc(nnoe * mdim, sizeof(med_float)); // table des des numeros, des numeros de familles des noeuds - profil : (nombre de noeuds) numnoe = (med_int*) malloc(sizeof(med_int) * nnoe); nufano = (med_int*) malloc(sizeof(med_int) * nnoe); // table des noms des noeuds - profil : (nnoe*MED_SNAME_SIZE+1) nomnoe = (char*) malloc(MED_SNAME_SIZE * nnoe + 1); } // Lecture des composantes des coordonnees des noeuds if (nnoe > 0) if (MEDmeshNodeCoordinateRd(fid, maa, MED_NO_DT, MED_NO_IT, MED_FULL_INTERLACE, coo1) < 0) ERREUR("Error while reading nodes coordinates"); // // Les noeuds ont-ils un nom? un numéro? // if (nnoe > 0) // { // if (MEDnomLire(fid, maa, nomnoe, nnoe, MED_NODE, (med_geometry_type) 0) < 0) // inonoe = MED_FALSE; // else // inonoe = MED_TRUE; // if (MEDnumLire(fid, maa, numnoe, nnoe, MED_NODE, (med_geometry_type) 0) < 0) // inunoe = MED_FALSE; // else // inunoe = MED_TRUE; // } // // if (inonoe) // cout << "WARNING input MED : les noms des noeuds sont ignorés" << endl; // if (inunoe) // cout << "WARNING input MED : les numéros des noeuds sont ignorés" << endl; // // if (inonoe) // { // char str[MED_SNAME_SIZE + 1]; // for (int inoeud = 0; inoeud < nnoe; inoeud++) // { // strncpy(str, nomnoe + inoeud * MED_SNAME_SIZE, MED_SNAME_SIZE); // str[MED_SNAME_SIZE] = '\0'; // IDS_NOEUDS.push_back((string) str); // } // } // else if (inunoe) // { // for (int inoeud = 0; inoeud < nnoe; inoeud++) // { // int numnoeud = *(numnoe + inoeud); // IDS_NOEUDS.push_back((string) "N" + int2string(numnoeud)); // } // } // else // for (int inoeud = 0; inoeud < nnoe; inoeud++) // IDS_NOEUDS.push_back((string) "N" + int2string(inoeud + 1)); // IDS_NOEUDS.resize(nnoe); /* ====================================================================== */ /* BOUCLE SUR LES NOEUDS LUS DANS LE FICHIER MED */ /* ====================================================================== */ // X.resize(nnoe); // Y.resize(nnoe); // Z.resize(nnoe); // Initialisation de l'enveloppe x0 = coo1[0]; x1 = coo1[0]; y0 = coo1[1]; y1 = coo1[1]; if (mdim == 3) { z0 = coo1[2]; z1 = coo1[2]; } else { z0 = 0.0; z1 = 0.0; } // Allocation mémoire pour les coordonnées XX YY ZZ XX = (float*) malloc(sizeof(float) * nombreNoeudsMaillage); if (mdim > 1) YY = (float*) malloc(sizeof(float) * nombreNoeudsMaillage); if (mdim > 2) ZZ = (float*) malloc(sizeof(float) * nombreNoeudsMaillage); for (int i = 0; i < nnoe; i++) { // Chargement des coordonnées X, Y et Z // Calcul de l'enveloppe du maillage FAMILLES_NOEUDS[*(famNoeuds + i)].push_back(i + 1); // ATTENTION! Les num. de noeuds commencent à 1 tailleFAMILLES[*(famNoeuds + i)]++; // IDnoeud = "N"+int2string(i+1); float * XXi = XX + i; float * YYi = YY + i; float * ZZi = ZZ + i; if (mdim == 3) { *XXi = (float) coo1[3 * i]; *YYi = (float) coo1[3 * i + 1]; *ZZi = (float) coo1[3 * i + 2]; if (*XXi < x0) x0 = *XXi; else if (*XXi > x1) x1 = *XXi; if (*YYi < y0) y0 = *YYi; else if (*YYi > y1) y1 = *YYi; if (*ZZi < z0) z0 = *ZZi; else if (*ZZi > z1) z1 = *ZZi; } else if (mdim == 2) { *XXi = (float) coo1[2 * i]; *YYi = (float) coo1[2 * i + 1]; if (*XXi < x0) x0 = *XXi; else if (*XXi > x1) x1 = *XXi; if (*YYi < y0) y0 = *YYi; else if (*YYi > y1) y1 = *YYi; } else if (mdim == 1) { *XXi = (float) coo1[1 * i]; if (*XXi < x0) x0 = *XXi; else if (*XXi > x1) x1 = *XXi; } // Chargement des numéros de noeuds // if (inunoe) // NUM_NOEUDS.push_back(*(numnoe + i)); // else // NUM_NOEUDS.push_back(i + 1); } // boucle sur les noeuds // NUM_NOEUDS.resize(nnoe); // Enveloppe du maillage enveloppeMaillage = new Cube(x0, x1, y0, y1, z0, z1); // Libération mémoire if (nnoe > 0) { free(coo1); free(nomnoe); free(numnoe); free(nufano); } // ################################################################################################## // ################################################################################################## // // A C Q U I S I T I O N D E S M A I L L E S // // ################################################################################################## // ################################################################################################## for (int itm = (int) POI1; itm <= (int) HEXA20; itm++) { TYPE_MAILLE tm = (TYPE_MAILLE) itm; EFFECTIFS_TYPES[tm] = MEDmeshnEntity(fid, maa, MED_NO_DT, MED_NO_IT, MED_CELL, InstanceMGE(tm), MED_CONNECTIVITY, MED_NODAL, &coordinatechangement, &geotransformation); if (EFFECTIFS_TYPES[tm]) acquisitionTYPE_inputMED(tm, EFFECTIFS_TYPES[tm], fid, maa, mdim); } // Resize des vecteurs des maps FAMILLES et FAM_TYPES map >::iterator IF; for (IF = FAMILLES.begin(); IF != FAMILLES.end(); IF++) { IF->second.resize(tailleFAMILLES[IF->first]); FAM_TYPES[IF->first].resize(tailleFAMILLES[IF->first]); } for (int itm = (int) POI1; itm <= (int) HEXA20; itm++) nombreMaillesMaillage += EFFECTIFS_TYPES[(TYPE_MAILLE) itm]; // ################################################################################################## // ################################################################################################## // // A C Q U I S I T I O N D E S G R O U P E S // D E M A I L L E S E T D E N O E U D S // // ################################################################################################## // ################################################################################################## // ============================================================================================= // Chargement des groupes dans GM et GN // ============================================================================================= string nomGM; vector vfam; map >::iterator iterGRO; int cptGM = 0; for (iterGRO = GROUPES_MAILLES.begin(); iterGRO != GROUPES_MAILLES.end(); iterGRO++) { nomGM = iterGRO->first; vfam = iterGRO->second; cptGM++; map effectifGroupeType; for (unsigned int i = 0; i < vfam.size(); i++) { int numf = vfam[i]; // Parcours simultané des vecteurs FAMILLES[numf] et FAM_TYPES[numfam] pour obtention du num local // et du type des mailles de la famille numf for (unsigned int imaille = 0; imaille < FAMILLES[numf].size(); imaille++) { TYPE_MAILLE tm = FAM_TYPES[numf][imaille]; int nl = FAMILLES[numf][imaille]; GM[nomGM][tm].push_back(nl); effectifGroupeType[tm]++; } } // Resize d'un GM for (map >::iterator I = GM[nomGM].begin(); I != GM[nomGM].end(); I++) { TYPE_MAILLE tm = I->first; GM[nomGM][tm].resize(effectifGroupeType[tm]); sort(GM[nomGM][tm].begin(), GM[nomGM][tm].end()); } } int cptGN = 0; for (iterGRO = GROUPES_NOEUDS.begin(); iterGRO != GROUPES_NOEUDS.end(); iterGRO++) { nomGM = iterGRO->first; vfam = iterGRO->second; cptGN++; int cptNoeudsGN = 0; for (unsigned int i = 0; i < vfam.size(); i++) { int numf = vfam[i]; // Parcours vecteurs FAMILLES_NOEUDS[numf] for (unsigned int inoeud = 0; inoeud < FAMILLES_NOEUDS[numf].size(); inoeud++) { GN[nomGM].push_back(FAMILLES_NOEUDS[numf][inoeud]); cptNoeudsGN++; } } GN[nomGM].resize(cptNoeudsGN); sort(GN[nomGM].begin(), GN[nomGM].end()); } MEDfileClose(fid); // cout << "Fin procédure inputMED" << endl << endl; } void Maillage::acquisitionTYPE_inputMED(TYPE_MAILLE TYPE, int nTYPE, med_idt fid, char maa[MED_NAME_SIZE + 1], med_int mdim) { // int taille, numeromaille, numeroFamille; int numeroFamille; string line, IDmaille, IDnoeud, typeMaille; // char str[MED_SNAME_SIZE + 1]; // Conteneur pour un nom de maille // bool rejetMaille; med_int tTYPE = (med_int) Nnoeuds(TYPE); char *nomTYPE = (char*) malloc(MED_SNAME_SIZE * nTYPE + 1); med_int *numTYPE = (med_int*) malloc(sizeof(med_int) * nTYPE); med_int *famTYPE = (med_int*) malloc(sizeof(med_int) * nTYPE); //med_int *conTYPE = (med_int*) malloc(sizeof(med_int)*tTYPE*nTYPE); CNX[TYPE] = (int*) malloc(sizeof(int) * tTYPE * nTYPE); med_bool inomTYPE, inumTYPE, ifamTYPE; med_geometry_type typeBanaliseMED = InstanceMGE(TYPE); if (MEDmeshElementRd(fid, maa, MED_NO_DT, MED_NO_IT, MED_CELL, typeBanaliseMED, MED_NODAL, MED_FULL_INTERLACE, CNX[TYPE], &inomTYPE, nomTYPE, &inumTYPE, numTYPE, &ifamTYPE, famTYPE) < 0) ERREUR("Error while reading elements"); // Conversion HL conversionCNX(CNX[TYPE], TYPE, nTYPE); // CON[TYPE].resize(tTYPE * nTYPE); // for (int i = 0; i < tTYPE * nTYPE; i++) // CON[TYPE][i] = (int) *(conTYPE + i); // CNX[TYPE] = (int*) malloc(sizeof(int) * tTYPE * nTYPE); // for (int i = 0; i < tTYPE * nTYPE; i++) // *(CNX[TYPE] + i) = (int) *(conTYPE + i); for (int i = 0; i < nTYPE; i++) { numeroFamille = (int) *(famTYPE + i); FAMILLES[numeroFamille].push_back(i); tailleFAMILLES[numeroFamille]++; FAM_TYPES[numeroFamille].push_back(TYPE); // Chargement des numéros de mailles // if (inumTYPE) // NUM_MAILLES[TYPE].push_back(*(numTYPE + i)); // else // NUM_MAILLES[TYPE].push_back(NGLOBAL(TYPE, i)); } // NUM_MAILLES[TYPE].resize(nTYPE); // if (inomTYPE) // { // char str[MED_SNAME_SIZE + 1]; // for (int imaille = 0; imaille < nTYPE; imaille++) // { // strncpy(str, nomTYPE + imaille * MED_SNAME_SIZE, MED_SNAME_SIZE); // str[MED_SNAME_SIZE] = '\0'; // IDS_MAILLES[TYPE].push_back((string) str); // } // } // else if (inumTYPE) // { // for (int imaille = 0; imaille < nTYPE; imaille++) // { // int nummaille = *(numTYPE + imaille); // IDS_MAILLES[TYPE].push_back((string) "M" + int2string(nummaille)); // } // } // else // { // for (int imaille = 0; imaille < nTYPE; imaille++) // { // IDS_MAILLES[TYPE].push_back((string) "M" + int2string(imaille + 1)); // } // } // IDS_MAILLES[TYPE].resize(nTYPE); } void Maillage::outputMED(std::string fichierMED) { // int i, j, k; int nTYPE, tTYPE; string line, s, stype, nomnoeud; // med_err ret = 0; // Code retour // int ig, jg; // cout << endl << endl << "Début procédure outputMED, fichier " << fichierMED << endl; // Sortie sur erreur en cas de maillage sans noeuds if (nombreNoeudsMaillage <= 0) { ERREUR("This mesh does not contain any node\n"); /* cout << "Maillage sans noeuds" << endl; */ } // ######################################################################## // Ouverture du fichier MED et création du maillage // ######################################################################## // Ouverture du fichier MED en création med_idt fid = MEDfileOpen(string2char(fichierMED), MED_ACC_CREAT); if (fid < 0) { ERREUR("Error MEDfileOpen\n"); cout << "Error MEDfileOpen" << endl; } // Création du maillage char maa[MED_NAME_SIZE + 1]; // Nom du maillage de longueur maxi MED_NAME_SIZE strcpy(maa, string2char(ID)); med_int mdim; // Dimension du maillage if (dimensionMaillage == 0) { mdim = 3; cout << "ATTENTION, dimension 3 attribuée par défaut!" << endl; } else mdim = dimensionMaillage; med_int spacedim = 3; if (dimensionEspace) spacedim = dimensionEspace; //med_int profil[2] = { 2, 3 }; char desc[MED_COMMENT_SIZE + 1]; // Description du maillage strcpy(desc, string2char(ID)); med_mesh_type type = MED_UNSTRUCTURED_MESH; // cerr << "maa=" << maa << endl; // cerr << "spacedim=" << spacedim << endl; // cerr << "mdim=" << mdim << endl; // cerr << "type=" << type << endl; // cerr << "axisname=" << axisname << endl; // cerr << "unitname=" << unitname << endl; if (MEDmeshCr(fid, maa, spacedim, mdim, type, desc, "s", MED_SORT_DTIT, MED_CARTESIAN, axisname, unitname) < 0) { ERREUR("Error MEDmeshCr"); cout << "Error MEDmeshCr" << endl; } // ============================= CREATION FAMILLE ZERO char nomfam[MED_NAME_SIZE + 1]; med_int numfam; // char attdes[MED_COMMENT_SIZE + 1]; // med_int natt, attide, attval; int ngro; // char gro[MED_LNAME_SIZE + 1]; strcpy(nomfam, "FAMILLE_0"); numfam = 0; if (MEDfamilyCr(fid, maa, nomfam, numfam, 0, MED_NO_GROUP) < 0) ERREUR("Error MEDfamilyCr (create family 0)"); // ######################################################################## // GROUPES DE NOEUDS // ######################################################################## int nGroupesNoeuds = GN.size(); vector > ETIQUETTES_N; ETIQUETTES_N.resize(nombreNoeudsMaillage); vector INDEX_N; INDEX_N.resize(GN.size()); vector NOMSFAM; vector > ETIQFAM; int cptNOMFAM = 0; map NUMFAMETIQ; // clé = étiquette - valeur = numéros de familles if (nGroupesNoeuds) { // Pérennisation d'un ordre sur les GM dans le vecteur NOMS_GROUPES_MAILLES vector NOMS_GROUPES_NOEUDS; for (map >::iterator ITGN = GN.begin(); ITGN != GN.end(); ITGN++) { string nomGN = ITGN->first; NOMS_GROUPES_NOEUDS.push_back(nomGN); } NOMS_GROUPES_NOEUDS.resize(GN.size()); // Tri des vecteurs de noeuds de GN for (unsigned int ig = 0; ig < NOMS_GROUPES_NOEUDS.size(); ig++) sort(GN[NOMS_GROUPES_NOEUDS[ig]].begin(), GN[NOMS_GROUPES_NOEUDS[ig]].end()); // Construction des étiquettes (familles) // Initialisation des index de groupes for (unsigned int ig = 0; ig < NOMS_GROUPES_NOEUDS.size(); ig++) INDEX_N[ig] = 0; for (int k = 1; k <= nombreNoeudsMaillage; k++) { // k: num. global de noeud int tailleEtiquette = 0; string etiq = (string) ""; // Boucle sur les groupes for (unsigned int ig = 0; ig < NOMS_GROUPES_NOEUDS.size(); ig++) { if (INDEX_N[ig] < GN[NOMS_GROUPES_NOEUDS[ig]].size()) { string nomgroupe = NOMS_GROUPES_NOEUDS[ig]; if (k == GN[nomgroupe][INDEX_N[ig]]) { // Attention: l'indice 0 dans le vecteur ETIQUETTES correspond // à l'élément (noeud ou maille) de num. global 1 // Par ailleurs, le numéro de groupe dans l'étiquette commence à 0 ETIQUETTES_N[k - 1].push_back(ig); tailleEtiquette++; etiq += int2string(ig); INDEX_N[ig]++; } } } ETIQUETTES_N[k - 1].resize(tailleEtiquette); // Stockage de l'étiquette dans NOMSFAM ETIQFAM, si pas déjà stockée // bool trouve = false; // for (int i = 0; i < NOMSFAM.size(); i++) // if (NOMSFAM[i] == ((string) "ETIQUETTE_" + etiq)) // { // trouve = true; // break; // } if (!NUMFAMETIQ[etiq] && etiq != (string) "") { NOMSFAM.push_back((string) "ETIQN_" + etiq); ETIQFAM.push_back(ETIQUETTES_N[k - 1]); NUMFAMETIQ[etiq] = cptNOMFAM + 1; // Famille de noeuds, num>0 cptNOMFAM++; } } NOMSFAM.resize(cptNOMFAM); ETIQFAM.resize(cptNOMFAM); // Création des familles de noeuds for (unsigned int ifam = 0; ifam < NOMSFAM.size(); ifam++) { strcpy(nomfam, string2char(NOMSFAM[ifam])); // Numéro de famille: ifam+1 (positif pour les noeuds + non nul) numfam = ifam + 1; ngro = ETIQFAM[ifam].size(); // Noms des groupes de la famille: variable nomsGN char gro[ngro * MED_LNAME_SIZE + 1]; int cptGN = 0; for (unsigned int ign = 0; ign < ETIQFAM[ifam].size(); ign++) { string nomGNcourant = NOMS_GROUPES_NOEUDS[ETIQFAM[ifam][ign]]; // ATTENTION! Il faut mettre à la fin de chaque segment un \0 qui est ensuite écrasé // par le premier caractère du champ suivant dans le strcat !!!! if (ign == 0) { // Premier groupe strcpy(gro, string2char(nomGNcourant)); for (int jg = nomGNcourant.size(); jg < MED_LNAME_SIZE; jg++) gro[jg] = ' '; gro[MED_LNAME_SIZE] = '\0'; } else { strcat(gro, string2char(nomGNcourant)); for (int jg = nomGNcourant.size(); jg < MED_LNAME_SIZE; jg++) gro[cptGN * MED_LNAME_SIZE + jg] = ' '; gro[(cptGN + 1) * MED_LNAME_SIZE] = '\0'; } cptGN++; } // Création de la famille if (MEDfamilyCr(fid, maa, nomfam, numfam, 0, MED_NO_GROUP) < 0) ERREUR("Error MEDfamilyCr"); } } // ######################################################################## // NOEUDS // ######################################################################## // float x, y, z; med_int nnoe = nombreNoeudsMaillage; // Nombre de noeuds med_float *coo; // Table des coordonnées // Noms des coordonnées (variable nomcoo) char nomcoo[mdim * MED_SNAME_SIZE + 1]; string strX = (string) "X"; while (strX.size() < MED_SNAME_SIZE) strX += (string) " "; string strY = (string) "Y"; while (strY.size() < MED_SNAME_SIZE) strY += (string) " "; string strZ = (string) "Z"; while (strZ.size() < MED_SNAME_SIZE) strZ += (string) " "; if (mdim == 3) strcpy(nomcoo, string2char(strX + strY + strZ)); else if (mdim == 2) strcpy(nomcoo, string2char(strX + strY)); else strcpy(nomcoo, string2char(strX)); nomcoo[mdim * MED_SNAME_SIZE] = '\0'; // Unités des coordonnées (variable unicoo) char unicoo[mdim * MED_SNAME_SIZE + 1]; string strmesure = (string) "SI"; while (strmesure.size() < MED_SNAME_SIZE) strmesure += (string) " "; if (mdim == 3) strcpy(unicoo, string2char(strmesure + strmesure + strmesure)); else if (mdim == 2) strcpy(unicoo, string2char(strmesure + strmesure)); else strcpy(unicoo, string2char(strmesure)); unicoo[mdim * MED_SNAME_SIZE] = '\0'; // Tables des noms, numeros, numeros de familles des noeuds // autant d'elements que de noeuds - les noms ont pout longueur MED_SNAME_SIZE char *nomnoe; med_int *numnoe = NULL; med_int *nufano; med_bool inonoe = MED_FALSE; med_bool inunoe = MED_FALSE; // Allocations memoire if (nnoe > 0) { // table des coordonnees - profil : (dimension * nombre de noeuds ) coo = (med_float*) calloc(nnoe * mdim, sizeof(med_float)); // table des des numeros, des numeros de familles des noeuds - profil : (nombre de noeuds) // numnoe = (med_int*) malloc(sizeof(med_int) * nnoe); nufano = (med_int*) malloc(sizeof(med_int) * nnoe); // table des noms des noeuds - profil : (nnoe*MED_SNAME_SIZE+1) nomnoe = (char*) ""; // ATTENTION! // nomnoe = (char*) malloc(MED_SNAME_SIZE * nnoe + 1); // for (int inoeud = 0; inoeud < IDS_NOEUDS.size(); inoeud++) // { // string nomNoeud = IDS_NOEUDS[inoeud]; // if (inoeud == 0) // { // // Premier groupe // strcpy(nomnoe, string2char(nomNoeud)); // for (int jg = nomNoeud.size(); jg < MED_SNAME_SIZE; jg++) // nomnoe[jg] = ' '; // nomnoe[MED_SNAME_SIZE] = '\0'; // } // else // { // strcat(nomnoe, string2char(nomNoeud)); // for (int jg = nomNoeud.size(); jg < MED_SNAME_SIZE; jg++) // nomnoe[inoeud * MED_SNAME_SIZE + jg] = ' '; // nomnoe[(inoeud + 1) * MED_SNAME_SIZE] = '\0'; // } // } } // Chargement des coordonnées, numéros de familles et numéros de noeuds if (dimensionMaillage == 3) { int i3 = 0; for (int i = 0; i < nnoe; i++) { // coo[i3] = X[i]; // coo[i3 + 1] = Y[i]; // coo[i3 + 2] = Z[i]; // i3 = i3 + 3; coo[i3] = *(XX + i); coo[i3 + 1] = *(YY + i); coo[i3 + 2] = *(ZZ + i); i3 = i3 + 3; // Numéros de familles - Le num. global de noeud est i+1 if (nGroupesNoeuds) { vector v = ETIQUETTES_N[i]; string sv = (string) ""; for (unsigned int j = 0; j < v.size(); j++) sv += int2string(v[j]); // Etiquette du noeud au format string // cout << "Noeud " << i + 1 << " : sv=" << sv << endl; *(nufano + i) = (med_int) NUMFAMETIQ[sv]; } else *(nufano + i) = (med_int) 0; // Numéros de noeuds // *(numnoe + i) = (med_int) NUM_NOEUDS[i]; } } else /* dimension 2 */ { int i2 = 0; for (int i = 0; i < nnoe; i++) { coo[i2] = *(XX + i); coo[i2 + 1] = *(YY + i); i2 = i2 + 2; // Numéros de familles - Le num. global de noeud est i+1 if (nGroupesNoeuds) { vector v = ETIQUETTES_N[i]; string sv = (string) ""; for (unsigned int j = 0; j < v.size(); j++) sv += int2string(v[j]); // Etiquette du noeud au format string // cout << "Noeud " << i + 1 << " : sv=" << sv << endl; *(nufano + i) = (med_int) NUMFAMETIQ[sv]; } else *(nufano + i) = (med_int) 0; // Numéros de noeuds // *(numnoe + i) = (med_int) NUM_NOEUDS[i]; } } // // Restitution coo // int i3 = 0; // for (int i = 0; i < nnoe; i++) // { // cout << "Noeud " << i << " : " << coo[i3] << " " << coo[i3 + 1] << " " << coo[i3 + 2] << endl; // i3 = i3 + 3; // } if (MEDmeshNodeWr(fid, maa, MED_NO_DT, MED_NO_IT, MED_UNDEF_DT, MED_FULL_INTERLACE, nnoe, coo, inonoe, nomnoe, inunoe, numnoe, MED_TRUE, nufano) < 0) { ERREUR("Error MEDmeshNodeWr"); cout << "Error MEDmeshNodeWr" << endl; } // ######################################################################## // GROUPES DE MAILLES // ######################################################################## int nGroupesMailles = GM.size(); map > > ETIQUETTES_M; // [ tm => [ nl => [ig1, ig2, ... ] ] ] // INDEX_M : // Clé : tm // Valeur : vect. des compteurs par indice de GM dans NOMS_GROUPES_MAILLES map > INDEX_M; NOMSFAM.clear(); ETIQFAM.clear(); NUMFAMETIQ.clear(); // clé = étiquette - valeur = numéros de familles cptNOMFAM = 0; if (nGroupesMailles) { // Pérennisation d'un ordre sur les GM dans le vecteur NOMS_GROUPES_MAILLES vector NOMS_GROUPES_MAILLES; for (map > >::iterator ITGM = GM.begin(); ITGM != GM.end(); ITGM++) { string nomGM = ITGM->first; NOMS_GROUPES_MAILLES.push_back(nomGM); } NOMS_GROUPES_MAILLES.resize(GM.size()); // Tri des vecteurs d'entiers de GM for (unsigned int ig = 0; ig < NOMS_GROUPES_MAILLES.size(); ig++) { string nomGM = NOMS_GROUPES_MAILLES[ig]; for (map >::iterator I = GM[nomGM].begin(); I != GM[nomGM].end(); I++) { TYPE_MAILLE tm = I->first; sort(GM[nomGM][tm].begin(), GM[nomGM][tm].end()); } } // Construction des étiquettes (familles) // Initialisation 0 des index de groupes, et resize ETIQUETTES_M[tm] for (int itm = (int) POI1; itm <= (int) HEXA20; itm++) { TYPE_MAILLE tm = (TYPE_MAILLE) itm; if (EFFECTIFS_TYPES[tm]) { for (unsigned int ig = 0; ig < NOMS_GROUPES_MAILLES.size(); ig++) INDEX_M[tm].push_back(0); ETIQUETTES_M[tm].resize(EFFECTIFS_TYPES[tm]); } } for (int itm = (int) POI1; itm <= (int) HEXA20; itm++) { TYPE_MAILLE tm = (TYPE_MAILLE) itm; int efftm = EFFECTIFS_TYPES[tm]; // cout << endl << "*************** coucou ***************" << endl; // cout << "*************** Type " << TM2string(tm) << " effectif = " << efftm << endl; if (efftm) { // cout << "Traitement du type " << TM2string(tm) << endl; for (int nl = 0; nl < efftm; nl++) { // nl = num. local de la maille dans son type // cout << "\tMaille " << TM2string(tm) << " n° " << nl << endl; int tailleEtiquette = 0; string etiq = (string) ""; // Boucle sur les groupes for (unsigned int ig = 0; ig < NOMS_GROUPES_MAILLES.size(); ig++) { string nomGM = NOMS_GROUPES_MAILLES[ig]; // cout << "\t\t" << "Groupe " << nomGM << endl; if (INDEX_M[tm][ig] < GM[nomGM][tm].size()) { if (nl == GM[nomGM][tm][INDEX_M[tm][ig]]) { // Attention: l'indice 0 dans le vecteur ETIQUETTES correspond // à l'élément (noeud ou maille) de num. global 1 // Par ailleurs, le numéro de groupe dans l'étiquette commence à 0 // cout << "\t\t\t" << "La maille est dans le groupe " << nomGM << endl; ETIQUETTES_M[tm][nl].push_back(ig); tailleEtiquette++; etiq += int2string(ig); INDEX_M[tm][ig]++; // cout << "\t\t\t OK" << endl; } } } ETIQUETTES_M[tm][nl].resize(tailleEtiquette); // Stockage de l'étiquette dans NOMSFAM ETIQFAM, si pas déjà stockée // bool trouve = false; // for (int i = 0; i < NOMSFAM.size(); i++) // if (NOMSFAM[i] == ((string) "ETIQUETTE_" + etiq)) // { // trouve = true; // break; // } if (!NUMFAMETIQ[etiq] && etiq != (string) "") { NOMSFAM.push_back((string) "ETIQM_" + etiq); ETIQFAM.push_back(ETIQUETTES_M[tm][nl]); NUMFAMETIQ[etiq] = -cptNOMFAM - 1; // Famille de mailles, num<0 cptNOMFAM++; } } } // if (efftm) } NOMSFAM.resize(cptNOMFAM); ETIQFAM.resize(cptNOMFAM); // Création des familles de mailles for (unsigned int ifam = 0; ifam < NOMSFAM.size(); ifam++) { strcpy(nomfam, string2char(NOMSFAM[ifam])); // Numéro de famille: -ifam-1 (négatif pour les mailles, et non nul) numfam = -ifam - 1; ngro = ETIQFAM[ifam].size(); // Noms des groupes de la famille char gro[ngro * MED_LNAME_SIZE + 1]; int cptGM = 0; for (unsigned int ign = 0; ign < ETIQFAM[ifam].size(); ign++) { string nomGMcourant = NOMS_GROUPES_MAILLES[ETIQFAM[ifam][ign]]; // ATTENTION! Il faut mettre à la fin de chaque segment un \0 qui est ensuite écrasé // par le premier caractère du champ suivant dans le strcat !!!! if (ign == 0) { // Premier groupe strcpy(gro, string2char(nomGMcourant)); for (int jg = nomGMcourant.size(); jg < MED_LNAME_SIZE; jg++) gro[jg] = ' '; gro[MED_LNAME_SIZE] = '\0'; } else { strcat(gro, string2char(nomGMcourant)); for (int jg = nomGMcourant.size(); jg < MED_LNAME_SIZE; jg++) gro[cptGM * MED_LNAME_SIZE + jg] = ' '; gro[(cptGM + 1) * MED_LNAME_SIZE] = '\0'; } cptGM++; } // Création de la famille if (MEDfamilyCr(fid, maa, nomfam, numfam, 1, gro) < 0) ERREUR("Error MEDfamilyCr"); } } // ######################################################################## // MAILLES // ######################################################################## // Appel de la routine ecritureTypeNew med_bool inomTYPE = MED_FALSE; med_bool inumTYPE = MED_FALSE; med_geometry_type MGE; for (int itm = (int) POI1; itm <= (int) HEXA20; itm++) { TYPE_MAILLE tm = (TYPE_MAILLE) itm; if (EFFECTIFS_TYPES[tm]) { nTYPE = EFFECTIFS_TYPES[tm]; tTYPE = Nnoeuds(tm); MGE = InstanceMGE(tm); stype = TM2string(tm); // Noms des mailles // char *nomTYPE = (char*) malloc(MED_SNAME_SIZE * nTYPE + 1); // strcpy(nomTYPE, ""); // ATTENTION! char *nomTYPE = (char*)""; // Attention! Ne pas faire strcpy ! // for (int imaille = 0; imaille < IDS_MAILLES[tm].size(); imaille++) // { // string nomMaille = IDS_MAILLES[tm][imaille]; // if (imaille == 0) // { // // Premier groupe // strcpy(nomTYPE, string2char(nomMaille)); // for (int jg = nomMaille.size(); jg < MED_SNAME_SIZE; jg++) // nomTYPE[jg] = ' '; // nomTYPE[MED_SNAME_SIZE] = '\0'; // } // else // { // strcat(nomTYPE, string2char(nomMaille)); // for (int jg = nomMaille.size(); jg < MED_SNAME_SIZE; jg++) // nomTYPE[imaille * MED_SNAME_SIZE + jg] = ' '; // nomTYPE[(imaille + 1) * MED_SNAME_SIZE] = '\0'; // } // } med_int *numTYPE = NULL; // (med_int*) malloc(sizeof(med_int)*nTYPE); med_int *famTYPE = (med_int*) malloc(sizeof(med_int) * nTYPE); // med_int *conTYPE = (med_int*) malloc(sizeof(med_int) * tTYPE * nTYPE); // for (int i = 0; i < nTYPE * tTYPE; i++) // *(conTYPE + i) = (med_int) CON[tm][i]; // Chargement famTYPE if (nGroupesMailles) { // Boucle sur les mailles du type (indice = num. local) for (int nl = 0; nl < nTYPE; nl++) { // Construction de l'étiquette de la maille au format string vector v = ETIQUETTES_M[tm][nl]; string sv = (string) ""; for (unsigned int j = 0; j < v.size(); j++) sv += int2string(v[j]); // Accès au num. de la famille *(famTYPE + nl) = (med_int) NUMFAMETIQ[sv]; } // Boucle sur les mailles du type } // if (nGroupesMailles) else for (int nl = 0; nl < nTYPE; nl++) *(famTYPE + nl) = (med_int) 0; // Formatage MED des CNX conversionCNX(CNX[tm], tm, nTYPE); // Chargement numTYPE //for (int nl=0; nl listeMaillesSuppr) { map TABLE_NL; // Table des num. locaux dans le type tm cout << "Method eliminationMailles, listeMaillesSuppr.size()=" << listeMaillesSuppr.size() << endl; // ************* Modification de la connectivité du type concerné int* CNX2; int nNoeudsType = Nnoeuds(tm); int tailleCNX2 = nNoeudsType * (EFFECTIFS_TYPES[tm] - listeMaillesSuppr.size()); CNX2 = (int*) malloc(sizeof(int) * tailleCNX2); // Recopie sélective des connectivités int isuppr = 0; // indice dans listeMaillesSuppr int ih2 = 0; // nouveau numéro local ( remarque: ih2 = ih1 - isuppr ) for (int ih1 = 0; ih1 < EFFECTIFS_TYPES[tm]; ih1++) { if (listeMaillesSuppr[isuppr] != ih1) { for (int jh1 = 0; jh1 < nNoeudsType; jh1++) *(CNX2 + nNoeudsType * ih2 + jh1) = *(CNX[tm] + nNoeudsType * ih1 + jh1); ih2++; } else isuppr++; } free(CNX[tm]); CNX[tm] = CNX2; // ************* Construction de la table de correspondance des NL dans le type concerné unsigned int offset = 0; for (int i = 0; i < EFFECTIFS_TYPES[tm]; i++) { if (offset < listeMaillesSuppr.size()) { if (i < listeMaillesSuppr[offset]) TABLE_NL[i] = i - offset; else if (i == listeMaillesSuppr[offset]) { TABLE_NL[i] = -1; // Element à supprimer offset++; } } else TABLE_NL[i] = i - offset; } // Contrôle if (offset != listeMaillesSuppr.size()) { ERREUR("Incoherent offset, method eliminationMailles"); exit(0); } // ************* Mise à jour du type concerné dans les GM for (map > >::iterator I = GM.begin(); I != GM.end(); I++) { string nomGM = I->first; if (GM[nomGM][tm].size()) { //cout << "GM[" << nomGM <<"][" << tm << "].size()=" << GM[nomGM][tm].size() << endl; vector mailles = GM[nomGM][tm]; vector mailles2; //mailles2.resize(mailles.size()-listeMaillesSuppr.size()); unsigned int cptMailles = 0; for (unsigned int i = 0; i < mailles.size(); i++) { int nl2 = TABLE_NL[mailles[i]]; if (nl2 != -1) { mailles2.push_back(nl2); cptMailles++; } } GM[nomGM][tm].clear(); mailles2.resize(cptMailles); GM[nomGM][tm] = mailles2; } } // ************* Mise à jour des effectifs EFFECTIFS_TYPES[tm] = EFFECTIFS_TYPES[tm] - listeMaillesSuppr.size(); nombreMaillesMaillage = nombreMaillesMaillage - listeMaillesSuppr.size(); TABLE_NL.clear(); }