X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2Ftepal2med%2Fghs3dprl_mesh_wrap.cxx;h=bb4731fd75e010e5b54cb121e22def36be95083a;hb=874ee72249d97d14ad9eccdb0c88c0780af1ebae;hp=1ed2e55aa3211530f5eab7b4e2c42b3c50014f91;hpb=787fe19230a94ff4b08710dd02138a1028ddec17;p=plugins%2Fghs3dprlplugin.git diff --git a/src/tepal2med/ghs3dprl_mesh_wrap.cxx b/src/tepal2med/ghs3dprl_mesh_wrap.cxx old mode 100755 new mode 100644 index 1ed2e55..bb4731f --- a/src/tepal2med/ghs3dprl_mesh_wrap.cxx +++ b/src/tepal2med/ghs3dprl_mesh_wrap.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D +// Copyright (C) 2007-2024 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -49,12 +49,10 @@ #include #include -extern "C" { #include //#include //#include //#include -} //utils procedures @@ -240,7 +238,7 @@ bool familles::get_number_of_new_family(int sign, med_int *ires, QString *tmp) //std::cout<<"no family found!!! - groups of "<add(tmp,(*it).first); @@ -255,9 +253,9 @@ bool familles::get_number_of_new_family(int sign, med_int *ires, QString *tmp) { QString nom1,nom2; fagr::iterator it1,it2; - nom1=nom1.sprintf("%d",fam1); + nom1=nom1.sprintf("%d",(int)fam1); it1=fam.find(nom1); - nom2=nom2.sprintf("%d",fam2); + nom2=nom2.sprintf("%d",(int)fam2); it2=fam.find(nom2); if ( (it1==fam.end())||(it2==fam.end()) ) { std::cerr<<"***fuse_goups*** non existing family "<filename<CVWtab_deallocate(); + /*ok=*/this->CVWtab_deallocate(); //remove temporary file if (this->filename!="_NO_FILE") { @@ -346,8 +344,8 @@ bool CVWtab::CVWtab_deallocate() memoryuse=memoryuse-sizeof(med_float)*size; size=-size; //precaution } - if (memoryuse<0) std::cout<<"***WARNING*** memoryuse <0 "<=maxline) + { + std::cerr<<"Problem line '"<nofile<<"="<nofile,ineighbour); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); } if (!CVW_FindString("nofile,ineighbour); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); } if (!CVW_FindString("nofile,ineighbour); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); } if (!CVW_FindString("nofile,ineighbour); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); } } @@ -519,6 +551,33 @@ bool ghs3dprl_mesh_wrap::ReadFileMSGnew(const QString FileName) return true; } +//************************************ +bool ghs3dprl_mesh_wrap::TestExistingFileMESHnew(const QString FileName) +//read file .glo with no parser xml because big file (volume) +//no read of for speed (and so no test) +{ + QString tmp; + std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); + std::string line; + long maxline; + + if (!Ff.is_open()) + { + std::cerr<<"Problem File '"<2) std::cout<<"MeshVersionFormatted_"<nofile<<" ok"<nbfiles++; + return true; +} + ///************************************ bool ghs3dprl_mesh_wrap::ReadFileGLO(const QString FileName) //read file .glo with no parser xml because big file (volume) @@ -527,7 +586,7 @@ bool ghs3dprl_mesh_wrap::ReadFileGLO(const QString FileName) std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); std::string line; long count; - bool ok; + //bool ok; if (!Ff.is_open()) { @@ -535,7 +594,7 @@ bool ghs3dprl_mesh_wrap::ReadFileGLO(const QString FileName) return false; } - //Lit les donn�s : + //Lit les donnees : if (!CVW_FindString("nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); } if (!CVW_FindString("nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); } if (!CVW_FindString("nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); } if (!CVW_FindString("nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); + } + //Ferme le fichier : + Ff.close(); + this->nbfiles++; + return true; +} + +///************************************ +bool ghs3dprl_mesh_wrap::ReadFileGLOBAL(const QString FileName) +//read file .global ascii (no xml) +//first line: Vertices Edges Triangles Tetrahedra +{ + std::string line(" "); + QString tmp; + std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); + long vert=0,edge=0,tria=0,tetr=0,count=0; + med_int *tmint; + CVWtab *montab; + //bool ok; + + if (verbose>=6) std::cout<<"Read file '"<>vert>>edge>>tria>>tetr; + std::cout<<"Global numerotation nb verts "<>tmint[i]; + if (verbose>4) std::cout<<"Vertices ("<nofile); + /*ok=*/this->insert_key(tmp,montab); + + count=edge; + tmint=new med_int[count]; + for (long i=0; i>tmint[i]; + if (verbose>4) std::cout<<"Edges ("<nofile); + /*ok=*/this->insert_key(tmp,montab); + + count=tria; + tmint=new med_int[count]; + for (long i=0; i>tmint[i]; + if (verbose>4) std::cout<<"Triangles ("<nofile); + /*ok=*/this->insert_key(tmp,montab); + + count=tetr; + tmint=new med_int[count]; + for (long i=0; i>tmint[i]; + if (verbose>4) std::cout<<"Tetrahedra ("<nofile); + /*ok=*/this->insert_key(tmp,montab); + //Ferme le fichier : Ff.close(); this->nbfiles++; return true; } +///************************************ +bool ghs3dprl_mesh_wrap::ReadFileDefaultGLOBAL(long vert, long edge, long tria, long tetr) +//default like read file .global ascii (no xml) when inexisting when multithread +{ + QString tmp; + long count=0; + med_int *tmint; + CVWtab *montab; + //bool ok; + + //Simule les donnees : + std::cout<<"Default Global numerotation nb verts "<4) std::cout<<"Default Vertices ("<nofile); + /*ok=*/this->insert_key(tmp,montab); + + count=edge; + tmint=new med_int[count]; + for (long i=0; i4) std::cout<<"Default Edges ("<nofile); + /*ok=*/this->insert_key(tmp,montab); + + count=tria; + tmint=new med_int[count]; + for (long i=0; i4) std::cout<<"Default Triangles ("<nofile); + /*ok=*/this->insert_key(tmp,montab); + + count=tetr; + tmint=new med_int[count]; + for (long i=0; i4) std::cout<<"Default Tetrahedra ("<nofile); + /*ok=*/this->insert_key(tmp,montab); + + return true; +} + //************************************ bool ghs3dprl_mesh_wrap::ReadFileFACES(const QString FileName) //read file .faces (wrap) @@ -609,8 +813,8 @@ bool ghs3dprl_mesh_wrap::ReadFileFACES(const QString FileName) return false; } - //Lit les donn�s : - //Replace le pointeur de fichier au d�ut :f.seekg(0); + //Lit les donnees : + //Replace le pointeur de fichier au debut :f.seekg(0); if (getline(Ff,line)) { tmp=line.c_str(); @@ -645,6 +849,216 @@ bool ghs3dprl_mesh_wrap::ReadFileFACES(const QString FileName) return true; } +//************************************ +bool ghs3dprl_mesh_wrap::ReadFileMESH(const QString FileName) +//read file .mesh from tetra_hpc (with volume) +{ + std::string line(" "); + QString tmp; + std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); + long Mversion=0,Mdim=0,Mvert=0,Mtria=0,Medge=0,Mtetra=0,count=0; + med_int garbage; + med_int *tmint; + bool ok; + + if (verbose>=6)std::cout<<"Read file '"<>tmflo[i]>>tmflo[i+1]>>tmflo[i+2]>>garbage; + if (verbose>4) std::cout<<"Vertices ("<nofile); + ok=this->insert_key(tmp,montab); + + getline(Ff,line); + getline(Ff,line); + + getline(Ff,line); // get Edges or Triangle, because sometimes Edges absent + + if (!line.find("Edges")==0) + { + std::cerr<<"absent line 'Edges' of file '"<>tmint[i]>>tmint[i+1]>>garbage; + } + if (verbose>4) std::cout<<"Edges ("<nofile); //TODO see if it could serve + ok=this->insert_key(tmp,montab); + + getline(Ff,line); + getline(Ff,line); + getline(Ff,line); + } + + if (!line.find("Triangles")==0) + { + std::cerr<<"Problem on line 'Triangles' of file '"<>tmint[i]>>tmint[i+1]>>tmint[i+2]>>garbage; + } + if (verbose>4) std::cout<<"Triangles ("<nofile); + ok=this->insert_key(tmp,montab); + + getline(Ff,line); + getline(Ff,line); + + if (!(getline(Ff,line) && (line.find("Tetrahedra")==0))) + { + std::cerr<<"Problem on line 'Tetrahedra' of file: not found"<=2) + { + std::cout<<"MeshVersionFormatted="<nofile); + ok=this->insert_key(tmp,montab); + + //swap on file if too big for memory in one cpu + //default 1GOctet/8(for double)/10(for arrays in memory at the same time) + if (Mvert*3>this->nbelem_limit_swap) + this->SwapOutOfMemory_key_mesh_wrap(QRegExp("NB",Qt::CaseSensitive,QRegExp::RegExp)); + //beware record 6 lenght 1 + //ferme le fichier : + Ff.close(); + this->nbfiles++; + return true; +} + //************************************ bool ghs3dprl_mesh_wrap::ReadFileNOBOITE(const QString FileName) //read file .noboite (volume) @@ -654,14 +1068,14 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITE(const QString FileName) QString tmp; std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); long ne,np,npfixe,subnumber,reste; - bool ok; + //bool ok; if (!Ff.is_open()){ std::cerr<<"Problem File '"<>ne>>np>>npfixe; if (verbose>3){ std::cout<<"NoboiteNumberOfElements="<nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); med_float *tmflo=new med_float[np*3]; for (int i=0; i>tmflo[i]; @@ -685,7 +1099,7 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITE(const QString FileName) montab=new CVWtab(np*3,tmflo); tmp=tmp.sprintf("NB%ld VC",this->nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); Ff>>subnumber; if (verbose>2) std::cout<<"NumberOfSubdomains="<nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); //swap on file if too big for memory in one cpu //default 1GOctet/8(for double)/10(for arrays in memory at the same time) @@ -734,7 +1148,7 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITEB(const QString FileName) //but NOT parameter option of tepal //idem ReadFileNOBOITE with read unformatted { - bool ok; + //bool ok; QString tmp; std::cerr<<"Problem function ReadFileNOBOITEB\n" <<"(no FORTRAN binary format files in tepal)\n\n"; @@ -778,7 +1192,7 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITEB(const QString FileName) CVWtab *montab=new CVWtab(ne*4,tmint); tmp=tmp.sprintf("NB%ld EV",this->nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); fread(&reste,sizeof(long),1,Ff); //std::cout<<"info "<nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); fread(&reste,sizeof(long),1,Ff); fread(&subnumber,sizeof(long),1,Ff); @@ -809,7 +1223,7 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITEB(const QString FileName) delete tlong; montab=new CVWtab(subnumber*3,tmint); tmp=tmp.sprintf("NB%ld SN",this->nofile); - ok=this->insert_key(tmp,montab); + /*ok=*/this->insert_key(tmp,montab); //swap on file if too big for memory in one cpu //default 1GOctet/8(for double)/10(for arrays in memory at the same time) @@ -832,7 +1246,7 @@ bool ghs3dprl_mesh_wrap::ReadFilePOINTS(const QString FileName) long maxlen=128; bool ok=true; - //Lit les donn�s : + //Lit les donnees : QFile Ff(FileName); //NOT Raw because Raw=non-buffered file access //qt3 ok=Ff.open(IO_ReadOnly|IO_Translate); @@ -986,7 +1400,7 @@ long ghs3dprl_mesh_wrap::SwapOutOfMemory_key_mesh_wrap(const QRegExp &rxp, //swap on file if not yet and if size greater than ifgreaterthan { long nb=0; - bool ok; + //bool ok; QHashIterator it(this->mestab); while ( it.hasNext() ) { it.next(); @@ -998,7 +1412,7 @@ long ghs3dprl_mesh_wrap::SwapOutOfMemory_key_mesh_wrap(const QRegExp &rxp, it.key().toLatin1().constData()<< " size "<size<<">"<path,it.value(),this->verbose); + /*ok=*/SwapOnFile(it.key(),this->path,it.value(),this->verbose); } } } @@ -1025,11 +1439,11 @@ bool ghs3dprl_mesh_wrap::list_onekey_mesh_wrap(const QString &key) //************************************ bool ghs3dprl_mesh_wrap::insert_key(const QString &key,CVWtab *tab) -//insertion conditionn� par limite this->nbelem_limit_swap +//insertion conditionnee par limite this->nbelem_limit_swap //si tableaux contenus on dimension superieure //alors swap disque dans getenv(tmp) fichier temporaire binaire { - bool ok; + //bool ok; if (verbose>4) std::cout<<"insert key "<path,tab,this->verbose); + /*ok=*/SwapOnFile(key,this->path,tab,this->verbose); } this->mestab.insert(key,tab); return true; } //************************************ CVWtab* ghs3dprl_mesh_wrap::restore_key(const QString &key) -//retauration conditionn� par limite nbelem +//retauration conditionnee par limite nbelem //si tableaux contenus on dimension superieure a nbelem //alors swap disque dans getenv(tmp) fichier temporaire //alors lecture du fichier (et reallocate memory) @@ -1201,6 +1615,7 @@ bool ghs3dprl_mesh_wrap::test_vertices_wrap() //for (int ifile=1; ifile <= this->nbfiles; ifile++) //for (int ineig=ifile+1; ineig <= this->nbfiles; ineig++) bool swap=false; + if (verbose>4)std::cout<<"test_vertices_wrap on nb files "<nbfiles<nbfiles; ifile >= 1; ifile--) for (int ineig=this->nbfiles; ineig >= ifile+1; ineig--) { @@ -1294,7 +1709,7 @@ bool ghs3dprl_mesh_wrap::Find_VerticesDomainToVerticesSkin() if (!cooskin) return false; if (verbose>4)std::cout<<"NumberVerticesSKIN="<size/3<nbfiles; ifile++) + for (long ifile=1; ifile<=this->nbfiles; ifile++) { key1=key1.sprintf("NB%ld VC",ifile); coodom=this->restore_key(key1); @@ -1353,7 +1768,7 @@ bool ghs3dprl_mesh_wrap::Write_masterxmlMEDfile() { QString tmp; - //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!first call + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!first call create xml doc node if (idom==1) { //define master file (.xml) in memory @@ -1370,9 +1785,9 @@ bool ghs3dprl_mesh_wrap::Write_masterxmlMEDfile() //Creating child nodes //Version tag med_int majeur,mineur,release; - //Quelle version de MED est utilis� + //Quelle version de MED est utilisee MEDlibraryNumVersion(&majeur,&mineur,&release); - if (verbose>0) fprintf(stdout,"Files write with MED V%d.%d.%d\n",majeur,mineur,release); + if (verbose>0) fprintf(stdout,"File write %s with MED V%d.%d.%d\n",filemaster.c_str(),(int)majeur,(int)mineur,(int)release); node = xmlNewChild(root_node, 0, BAD_CAST "version",0); //xmlNewProp(node, BAD_CAST "maj", BAD_CAST int2string2(majeur).c_str()); xmlNewProp(node, BAD_CAST "maj", BAD_CAST i2a(majeur).c_str()); @@ -1381,7 +1796,8 @@ bool ghs3dprl_mesh_wrap::Write_masterxmlMEDfile() //Description tag node = xmlNewChild(root_node,0, BAD_CAST "description",0); - xmlNewProp(node, BAD_CAST "what", BAD_CAST "tetrahedral mesh by tepal"); + // .../INSTALL/MeshGems/include/meshgems/meshgems.h:11:#define MESHGEMS_VERSION_LONG "2.9-6" + xmlNewProp(node, BAD_CAST "what", BAD_CAST "tetrahedral mesh by MeshGems-Tetra-hpc 2.9-6 2019"); #ifdef WIN32 SYSTEMTIME present; GetLocalTime ( &present ); @@ -1421,12 +1837,14 @@ bool ghs3dprl_mesh_wrap::Write_masterxmlMEDfile() xmlNewProp(mesh_node, BAD_CAST "name", BAD_CAST domainname.c_str()); } - //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!all calls + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!all calls add xml idom node { + fprintf(stdout,"Xml node write %s idom %d\n",filemaster.c_str(), (int)idom); char *hostname = getenv("HOSTNAME"); node = xmlNewChild(files_node,0,BAD_CAST "subfile",0); xmlNewProp(node, BAD_CAST "id", BAD_CAST i2a(idom).c_str()); node2 = xmlNewChild(node, 0, BAD_CAST "name", BAD_CAST distfilename); + if (hostname == NULL) node2 = xmlNewChild(node, 0, BAD_CAST "machine",BAD_CAST "localhost"); else @@ -1452,14 +1870,17 @@ bool ghs3dprl_mesh_wrap::Write_masterxmlMEDfile() //xmlNewProp(node2, BAD_CAST "number", BAD_CAST i2a(nbtetra4).c_str()); //tepal2med_info about joints of one subdomain - xmlAddChild(node,joints_node); + fprintf(stdout,"MeshGems 2.9-6 tetra-hpc joints are not implemented\n"); //MeshGems 2.9-6 Salome 9.5.0 jan 2020 + // not implemented ... empty joints ... does NOT work ... xmlAddChild(node,joints_node); //tepal2med_info about groups and families of one subdomain xmlAddChild(node,families.xml_groups()); } //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!last call + fprintf(stdout,"xml node idom %d/%ld nb tetras total %ld\n", (int)idom, nbfilestot, nbtetrastotal); if (idom==nbfilestot) { + fprintf(stdout,"File write %s as last idom nb tetras total %ld\n",filemaster.c_str(), nbtetrastotal); node2 = xmlNewChild(info_node, 0, BAD_CAST "global",0); xmlNewProp(node2, BAD_CAST "tetrahedra_number", BAD_CAST i2a(nbtetrastotal).c_str()); //save masterfile @@ -1472,10 +1893,10 @@ bool ghs3dprl_mesh_wrap::Write_masterxmlMEDfile() //************************************ -bool ghs3dprl_mesh_wrap::Write_MEDfiles_v2(bool deletekeys) +bool ghs3dprl_mesh_wrap::Write_MEDfiles_v2(bool /*deletekeys*/) //deletekeys=true to delete non utils keys and arrays "au fur et a mesure" { - bool ok=true,oktmp; + bool ok=true/*,oktmp*/; QString tmp,cmd; char description[MED_COMMENT_SIZE]; char dtunit[MED_SNAME_SIZE+1]="_NO_UNIT"; @@ -1497,11 +1918,14 @@ bool ghs3dprl_mesh_wrap::Write_MEDfiles_v2(bool deletekeys) } //create file resume DOMAIN.joints.med of all joints for quick display (...may be...) - tmp=path+medname+tmp.sprintf("_joints.med",idom); - charendnull(distfilename,tmp,MED_COMMENT_SIZE); - fidjoint=MEDfileOpen(distfilename,MED_ACC_CREAT); - if (fidjoint<0) std::cerr<<"Problem MEDfileOpen "<0) std::cout<<"CreateMEDFile for all joints <"<\n"; + if (! for_multithread) + { + tmp=path+medname+tmp.sprintf("_joints.med"); + charendnull(distfilename,tmp,MED_COMMENT_SIZE); + fidjoint=MEDfileOpen(distfilename,MED_ACC_CREAT); + if (fidjoint<0) std::cerr<<"Problem MEDfileOpen "<0) std::cout<<"CreateMEDFile for all joints <"<\n"; + } //copy file source/GHS3DPRL_skin.med as destination/DOMAIN.skin.med tmp=path+medname+"_skin.med"; @@ -1522,79 +1946,93 @@ bool ghs3dprl_mesh_wrap::Write_MEDfiles_v2(bool deletekeys) cmd.toLatin1().constData()<<"> does not exist\n"; } //define family 0 if not existing, no groups - families.add("0",""); + //La famille FAMILLE_ZERO n'a pas été trouvée, elle est obligatoire + families.add("0","FAMILLE_ZERO"); //define family Group_of_New_Nodes (which not exists before tetrahedra) famallnodes=0; if (QString("All_Nodes").contains(deletegroups)==0){ - oktmp=families.get_number_of_new_family(1,&famallnodes,&tmp); + /*oktmp=*/families.get_number_of_new_family(1,&famallnodes,&tmp); families.add(tmp,"All_Nodes"); } else if (verbose>3) std::cout<<"--deletegroups matches \"All_Nodes\"\n"; famalltria3=0; if (QString("All_Faces").contains(deletegroups)==0){ - oktmp=families.get_number_of_new_family(-1,&famalltria3,&tmp); + /*oktmp=*/families.get_number_of_new_family(-1,&famalltria3,&tmp); families.add(tmp,"All_Faces"); } else if (verbose>3) std::cout<<"--deletegroups matches \"All_Faces\"\n"; famalltetra4=0; if (QString("All_Tetrahedra").contains(deletegroups)==0){ - oktmp=families.get_number_of_new_family(-1,&famalltetra4,&tmp); + /*oktmp=*/families.get_number_of_new_family(-1,&famalltetra4,&tmp); families.add(tmp,"All_Tetrahedra"); } else if (verbose>3) std::cout<<"--deletegroups matches \"All_Tetrahedra\"\n"; famnewnodes=0; if (QString("New_Nodes").contains(deletegroups)==0){ - oktmp=families.get_number_of_new_family(1,&famnewnodes,&tmp); + /*oktmp=*/families.get_number_of_new_family(1,&famnewnodes,&tmp); families.add(tmp,"New_Nodes"); } else if (verbose>3) std::cout<<"--deletegroups matches \"New_Nodes\"\n"; famnewtria3=0; if (QString("New_Faces").contains(deletegroups)==0){ - oktmp=families.get_number_of_new_family(-1,&famnewtria3,&tmp); + /*oktmp=*/families.get_number_of_new_family(-1,&famnewtria3,&tmp); families.add(tmp,"New_Faces"); } else if (verbose>3) std::cout<<"--deletegroups matches \"New_Faces\"\n"; famnewtetra4=0; if (QString("New_Tetrahedra").contains(deletegroups)==0){ - oktmp=families.get_number_of_new_family(-1,&famnewtetra4,&tmp); + /*oktmp=*/families.get_number_of_new_family(-1,&famnewtetra4,&tmp); families.add(tmp,"New_Tetrahedra"); } else if (verbose>3) std::cout<<"--deletegroups matches \"New_Tetrahedra\"\n"; if (verbose>6){std::cout<<"\nIntermediatesFamilies\n"; families.write();} - if (verbose>6) std::cout<<"\nNumber0fFiles="<6) std::cout<<"\nNumber0fFiles="<"<0){ - if (verbose>2) std::cout<2) { + std::cout<\n"; } //create mesh - tmp=medname+tmp.sprintf("_%d",idom); + tmp=medname+tmp.sprintf("_%d",(int)idom); charendnull(nomfinal,tmp,MED_NAME_SIZE); - tmp=tmp.sprintf("domain %d among %d",idom,nbfilestot); + tmp=tmp.sprintf("domain %d among %ld",(int)idom,nbfilestot); charendnull(description,tmp,MED_COMMENT_SIZE); if (verbose>4) std::cout<<"Description : "<4) std::cout<<"\nEnd of Nodes ***\n"<4) std::cout<<"\nEnd of Edges ***\n"<4) std::cout<<"\nEnd of Faces ***\n"<6){std::cout<<"\nFinalsFamilies\n"; families.write();} - //for nodes families - nb=create_families(fid,1); - if (verbose>5)std::cout<<"NumberOfFamiliesNodes="<8) - std::cout<<"MEDmeshEntityFamilyNumberWr nodes "<5)std::cout<<"NumberOfFamiliesFacesAndEdgesEtc="<8) - std::cout<<"MEDmeshEntityFamilyNumberWr tria3 "<8) - std::cout<<"MEDmeshEntityFamilyNumberWr tetra4 "<4) std::cout<<"\nEnd of Tetrahedra ***\n"<6){std::cout<<"\nFinalsFamilies\n"; families.write();} + //for nodes families + nb=create_families(fid,1); + if (verbose>5)std::cout<<"NumberOfFamiliesNodes="<8) + std::cout<<"MEDmeshEntityFamilyNumberWr nodes "<5)std::cout<<"NumberOfFamiliesFacesAndEdgesEtc="<8) + std::cout<<"MEDmeshEntityFamilyNumberWr tria3 "<8) + std::cout<<"MEDmeshEntityFamilyNumberWr tetra4 "<0)std::cout<<"\nTotalNumberOftetrahedra="<restore_key(key); //tab1=this->mestab[key1]; if (!tab) { - tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".noboite"; - ok=this->ReadFileNOBOITE(tmp); + if (!for_tetrahpc) { + tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".noboite"; + ok=this->ReadFileNOBOITE(tmp); + } + if (for_tetrahpc) { + tmp=pathini+casename+"_out"+tmp.sprintf(format_tetra.toLatin1().constData(),idom)+".mesh"; + ok=this->ReadFileMESH(tmp); + if (for_multithread) { // inexisting file GHS3DPRL_out.000001.global + this->ReadFileDefaultGLOBAL(this->nbvert, this->nbedge, this->nbtria, this->nbtetr); + } + } tab=this->restore_key(key); //tab1=this->mestab[key1]; if (!tab) return false; } - tmp=tmp.sprintf("NB%d SN",idom); + tmp=tmp.sprintf("NB%d SN",(int)idom); //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); - xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); - nbnodes=tab->size/3; + /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + nbnodes=this->nbvert; // for current idom + err=MEDmeshNodeCoordinateWr(fid,nomfinal,MED_NO_DT,MED_NO_IT,0.,MED_FULL_INTERLACE,nbnodes,tab->tmflo); if (err<0) {std::cerr<<"Problem MEDmeshNodeCoordinateWr"<4)std::cout<<"NumberOfNodes="<4) std::cout<<"NumberOfNodes="<restore_key(key1); //tab1=this->mestab[key1]; if (!tab1) { - tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".glo"; - ok=this->ReadFileGLO(tmp); + if (!for_tetrahpc) { + tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".glo"; + ok=this->ReadFileGLO(tmp); + } + if (for_tetrahpc) { + tmp=pathini+casename+"_out"+tmp.sprintf(format_tetra.toLatin1().constData(),idom)+".global"; + ok=this->ReadFileGLOBAL(tmp); + } if (!ok) {std::cerr<<"Problem file "<restore_key(key1); //tab1=this->mestab[key1]; if (!tab1) return false; } if (nbnodes!=tab1->size){std::cerr<<"Problem size GLi VE!=nbnodes!"<restore_key(key2); //tab1=this->mestab[key1]; med_int nbskin=0; - if (tab2) med_int nbskin=tab2->size; + if (tab2) nbskin=tab2->size; //for (i=0; itmint[i]<tmint); if (err<0){std::cerr<<"Problem MEDmeshGlobalNumberWr nodes"<nbedge=0; return ok; } @@ -1836,12 +2309,12 @@ bool ghs3dprl_mesh_wrap::idom_faces() { bool ok=true; QString tmp,key,key1,key2,key3; - CVWtab *tab,*tab1,*tab2,*tab3; - med_int ii,i,j,*arrayi; - int xx; + CVWtab *tab1,*tab2; + med_int /*ii,*/i,j,*arrayi; + //int xx; //writing connectivity of faces triangles of wrap by nodes - key1=key1.sprintf("FC%d",idom); //files.FaCes faces (wrap and triangles only) + key1=key1.sprintf("FC%d",(int)idom); //files.FaCes faces (wrap and triangles only) tab1=this->restore_key(key1); //tab1=this->mestab[key1]; if (!tab1) { tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".faces"; @@ -1849,18 +2322,21 @@ bool ghs3dprl_mesh_wrap::idom_faces() tab1=this->restore_key(key1); if (!tab1) return false; } - nbtria3=tab1->size/7; + nbtria3=tab1->size/3; + this->nbtria=nbtria3; // for current idom + if (verbose>4) std::cout<<"NumberOfTriangles="<tmint[i]; ii++; - arrayi[ii]=tab1->tmint[i+1]; ii++; - arrayi[ii]=tab1->tmint[i+2]; ii++; - i=i+7; - } - err=MEDmeshElementConnectivityWr(fid,nomfinal,MED_NO_DT,MED_NO_IT,0.,MED_CELL,MED_TRIA3,MED_NODAL,MED_FULL_INTERLACE,nbtria3,arrayi); - delete[] arrayi; //need immediately more little array + //arrayi=new med_int[nbtria3*3]; + //ii=0,i=0 ; + //for (j=0; jtmint[i]; ii++; + // arrayi[ii]=tab1->tmint[i+1]; ii++; + // arrayi[ii]=tab1->tmint[i+2]; ii++; + // i=i+7; + //} + //err=MEDmeshElementConnectivityWr(fid,nomfinal,MED_NO_DT,MED_NO_IT,0.,MED_CELL,MED_TRIA3,MED_NODAL,MED_FULL_INTERLACE,nbtria3,arrayi); + err=MEDmeshElementConnectivityWr(fid,nomfinal,MED_NO_DT,MED_NO_IT,0.,MED_CELL,MED_TRIA3,MED_NODAL,MED_FULL_INTERLACE,nbtria3,tab1->tmint); + //delete[] arrayi; //need immediately more little array if (err<0){std::cerr<<"Problem MEDmeshElementConnectivityWr for triangles connectivity"<restore_key(key1); //tab1=this->mestab[key1]; - if (nbtria3!=tab1->size){std::cerr<<"Problem size GLi FA!=nbtria3!"<restore_key(key2); //tab1=this->mestab[key1]; - med_int nbskin=0; - if (tab2) nbskin=tab2->size; + // if (!for_multithread) + { + key1=key1.sprintf("GL%d FA",(int)idom); + tab1=this->restore_key(key1); //tab1=this->mestab[key1]; + if (nbtria3!=tab1->size){std::cerr<<"Problem size GLi FA!=nbtria3!"<tmint[i]-1; // - if (jtmint[j]; - } - } - ok=set_one_more_family(famtria3,fammore,nb); - delete[] fammore; - //writing faces(triangles) global numbering - if (verbose>2) - std::cout<<"CreateMEDglobalNumerotation_Faces "<size<size,tab1->tmint); - if (err<0){std::cerr<<"Problem MEDmeshGlobalNumberWr faces"<remove_key_mesh_wrap(QRegExp("FC*",true,true)); - tmp=tmp.sprintf("GL%d FA",idom); - //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); - xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); - tmp=tmp.sprintf("GL%d VE",idom); - //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); - xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + key2=key2.sprintf("SKIN_TRIA3_FAMILIES"); //on global numerotation + tab2=this->restore_key(key2); //tab1=this->mestab[key1]; + med_int nbskin=0; + if (tab2) nbskin=tab2->size; + + //set families of faces existing in GHS3DPRL_skin.med + med_int nb=nbtria3; + famtria3=new med_int[nb]; + for (i=0; itmint[i]-1; // + if (jtmint[j]; + } + } + ok=set_one_more_family(famtria3,fammore,nb); + delete[] fammore; + + //writing faces(triangles) global numbering + if (verbose>2) + std::cout<<"CreateMEDglobalNumerotation_Faces "<size<size,tab1->tmint); + if (err<0){std::cerr<<"Problem MEDmeshGlobalNumberWr faces"<remove_key_mesh_wrap(QRegExp("FC*",true,true)); + tmp=tmp.sprintf("GL%d FA",(int)idom); + //qt3 /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); + /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + tmp=tmp.sprintf("GL%d VE",(int)idom); + //qt3 /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); + /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + } return ok; } @@ -1923,36 +2403,33 @@ bool ghs3dprl_mesh_wrap::idom_joints() bool ok=true; QString tmp,namejoint,key,key1,key2; CVWtab *tab,*tab1,*tab2; - med_int ineig,ii,jj,i,j,k,*arrayi,nb,famjoint,*fammore,*inodes,*arrayfaces; + med_int ineig,ii,jj,i,j,k,*arrayi,nb,famjoint,*inodes,*arrayfaces; med_float *arraynodes; char namejnt[MED_NAME_SIZE+1]; //no more 32 char namedist[MED_NAME_SIZE+1]; char descjnt[MED_COMMENT_SIZE+1]; - med_int numfam_ini_wrap=100; + //med_int numfam_ini_wrap=100; joints_node=xmlNewNode(NULL, BAD_CAST "joints"); //masterfile.xml med_int nbjoints=0,nbnodesneig,nbtria3neig; std::string sjoints=""; //which domains are neighbourg - int xx; + //int xx; char dtunit[MED_SNAME_SIZE+1]="_NO_UNIT"; char axisname[MED_SNAME_SIZE*3+1]="x y z "; char axisunit[MED_SNAME_SIZE*3+1]="_NO_UNIT _NO_UNIT _NO_UNIT "; - tmp=tmp.sprintf("MS%d *",idom); + tmp=tmp.sprintf("MS%d *",(int)idom); //read file .msg if not done //qt3 if (this->nb_key_mesh_wrap(QRegExp(tmp,true,true))<=0) { if (this->nb_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp))<=0) { this->nofile=idom; - /*old version with xml parser too slow - ghs3dprl_msg_parser handler; - handler.mailw=this; - QXmlSimpleReader reader; - reader.setContentHandler(&handler); - tmp=pathini+casename+tmp.sprintf(format,nbfilestot,idom)+".msg"; - QFile File(tmp); - QXmlInputSource source(&File); - reader.parse(source); - File.close();*/ - tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".msg"; + + if (!for_tetrahpc) { + tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".msg"; + } + if (for_tetrahpc) { + tmp=pathini+casename+tmp.sprintf(format_tetra.toLatin1().constData(),idom)+".msg"; + } + ok=this->ReadFileMSGnew(tmp); if (!ok) { std::cerr<<"Problem in file "<no joints - key1=key1.sprintf("MS%d NE%d VE SE",ineig,idom); //SE or RE identicals + key1=key1.sprintf("MS%d NE%d VE SE",(int)ineig,(int)idom); //SE or RE identicals tab2=this->restore_key(key1); //if not yet loaded (first time) try to load necessary file msg of neighbourg if (!tab2) { - tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,ineig)+".msg"; + + if (!for_tetrahpc) { + tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,ineig)+".msg"; + } + if (for_tetrahpc) { + tmp=pathini+casename+tmp.sprintf(format_tetra.toLatin1().constData(),ineig)+".msg"; + } + this->nofile=ineig; //neighbourg file ok=this->ReadFileMSGnew(tmp); this->nofile=idom; //restaure initial domain @@ -1996,11 +2480,11 @@ bool ghs3dprl_mesh_wrap::idom_joints() sjoints=sjoints+" "+i2a(ineig); if (verbose>4) std::cout<<"NumberOfNodesOfJoint_"<restore_key(key); //tab1=this->mestab[key1]; - //nbnodes=tab->size/3; + nbnodes=tab->size/3; //writing correspondence nodes-nodes //two indices for one correspondence arrayi=new med_int[nb*2]; arraynodes=new med_float[nbnodesneig*3]; //for file DOMAIN_join.med - inodes=new med_int[nbnodes]; //for file DOMAIN_join.med + inodes=new med_int[nbnodes]; //for file DOMAIN_join.med med_int * fammore=new med_int[nbnodes]; - for (i=0; i equals tab1->tmint[i]==tab2->tmint[i] - j=tab1->tmint[i]-1; //contents of tab1 1 to nb - inodes[j]=k; k++; //indices 0->n-1 of nodes of joint from nodes of domain + j=tab1->tmint[i]-1; //contents of tab1 1->nb, j 0->nb-1 + inodes[j]=k; k++; //contents of inodes 1->n ,nodes of joint from nodes of domain arraynodes[jj]=tab->tmflo[j*3]; jj++; arraynodes[jj]=tab->tmflo[j*3+1]; jj++; arraynodes[jj]=tab->tmflo[j*3+2]; jj++; @@ -2049,7 +2533,7 @@ bool ghs3dprl_mesh_wrap::idom_joints() //writing correspondence triangles-triangles //std::cout<<"\n faces joints\n"; nbtria3neig=0; - key1=key1.sprintf("MS%d NE%d FA SE",idom,ineig); //SE or RE identicals + key1=key1.sprintf("MS%d NE%d FA SE",(int)idom,(int)ineig); //SE or RE identicals tab1=this->restore_key(key1); //tab1=this->mestab[key1]; if (!tab1){ if (verbose>4) @@ -2058,17 +2542,17 @@ bool ghs3dprl_mesh_wrap::idom_joints() } else //have to set xml may be no faces but nodes in a joint! { - key1=key1.sprintf("MS%d NE%d FA SE",ineig,idom); //SE or RE identicals + key1=key1.sprintf("MS%d NE%d FA SE",(int)ineig,(int)idom); //SE or RE identicals tab2=this->restore_key(key1); if (!tab2) std::cerr<<"Problem existing triangles of joint in domain "<size; nbtria3neig=tab2->size; if (nb!=nbtria3neig) { std::cerr<<"Problem in file "<"<restore_key(key); //tab1=this->mestab[key1]; med_int nb=tab1->size; nbtria3neig=nb; - if (verbose>4) - std::cout<<"NumberOfTrianglesOfJoint_"<=0) std::cout<<"NumberOfTrianglesOfJoint_"<tmint[i]; ii++; + arrayi[ii]=tab2->tmint[i]; ii++; //correspondance indices triangles in 2 domains + fammore[tab1->tmint[i]-1]=famjoint; //famtria3[tab1->tmint[i]-1]=famjoint; - arrayi[ii]=tab2->tmint[i]; ii++; - //std::cout<tmint[i]-1)*7; //indice of node connectivity - arrayfaces[jj]=inodes[tab->tmint[k]-1]+1; jj++; - arrayfaces[jj]=inodes[tab->tmint[k+1]-1]+1; jj++; - arrayfaces[jj]=inodes[tab->tmint[k+2]-1]+1; jj++; + + k=tab1->tmint[i]-1; //indice of node connectivity + //std::cout<<"k="<tmint[k]-1]; jj++; + arrayfaces[jj]=inodes[tab->tmint[k+1]-1]; jj++; + arrayfaces[jj]=inodes[tab->tmint[k+2]-1]; jj++; + } + //int happens=0; + for (i=0; isize ; i++) std::cout<<"triangle i "<tmint[i]<size ; i=i+7) std::cout<<"conn i "<tmint[i]<<" "<tmint[i+1]<<" "<tmint[i+2]<0) { //for (i=0; i0) delete[] arrayfaces; + if (nbtria3neig>0) delete[] arrayfaces; // todo: arrayfaces may be used uninitialized delete[] inodes; //!masterfile.xml @@ -2162,18 +2668,18 @@ bool ghs3dprl_mesh_wrap::idom_joints() xmlNewProp(joints_node, BAD_CAST "number", BAD_CAST i2a(nbjoints).c_str()); xmlNewChild(joints_node, 0, BAD_CAST "id_neighbours", BAD_CAST sjoints.substr(1).c_str()); - tmp=tmp.sprintf("NB%d VC",idom); + tmp=tmp.sprintf("NB%d VC",(int)idom); //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); - xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); //tmp=tmp.sprintf("MS%d NE*",idom); //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); - //xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); - tmp=tmp.sprintf("FC%d",idom); + ///*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + tmp=tmp.sprintf("FC%d",(int)idom); //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); - xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); - tmp=tmp.sprintf("GL%d *",idom); + /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + tmp=tmp.sprintf("GL%d *",(int)idom); //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); - xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); return ok; } @@ -2184,12 +2690,14 @@ bool ghs3dprl_mesh_wrap::idom_tetras() QString tmp,key1; CVWtab *tab1; med_int i,*arrayi; - int xx; + //int xx; //writing connectivity of tetrahedra by nodes - key1=key1.sprintf("NB%d EV",idom); //files.NoBoite Elements Vertices (tetra only) + key1=key1.sprintf("NB%d EV",(int)idom); //files.NoBoite Elements Vertices (tetra only) tab1=this->restore_key(key1); //tab1=this->mestab[key1]; nbtetra4=tab1->size/4; + this->nbtetr=nbtetra4; // for current idom + nbtetrastotal=nbtetrastotal + nbtetra4; if (verbose>5)std::cout<<"NumberOftetrahedra="<tmint); @@ -2206,27 +2714,42 @@ bool ghs3dprl_mesh_wrap::idom_tetras() famtetra4=new med_int[nbtetra4]; for (i=0; irestore_key(key1); //tab1=this->mestab[key1]; - if (!tab1) { - tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".glo"; - ok=this->ReadFileGLO(tmp); - tab1=this->restore_key(key1); - if (!tab1) return false; - } + // if (!for_multithread) + { + //writing tetrahedra global numbering + //GLx EL=files.GLo ELements + key1=key1.sprintf("GL%d EL",(int)idom); + tab1=this->restore_key(key1); //tab1=this->mestab[key1]; + if (!tab1) { + //tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".glo"; + //ok=this->ReadFileGLO(tmp); + //tab1=this->restore_key(key1); + //if (!tab1) return false; + + if (!for_tetrahpc) { + tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".glo"; + ok=this->ReadFileGLO(tmp); + } + if (for_tetrahpc) { + tmp=pathini+casename+"_out"+tmp.sprintf(format_tetra.toLatin1().constData(),idom)+".global"; + ok=this->ReadFileGLOBAL(tmp); + } + tab1=this->restore_key(key1); + if (!tab1) return false; - if (tab1->size!=nbtetra4){ - std::cerr<<"Problem incorrect size of tetrahedra global numbering"<2) - std::cout<<"CreateMEDglobalNumerotation_tetrahedra "<size<size,tab1->tmint); - if (err<0){std::cerr<<"Problem MEDmeshGlobalNumberWr tetrahedra"<size!=nbtetra4){ + std::cerr<<"Problem incorrect size of tetrahedra global numbering"<2) + std::cout<<"CreateMEDglobalNumerotation_tetrahedra "<size<size,tab1->tmint); + if (err<0){std::cerr<<"Problem MEDmeshGlobalNumberWr tetrahedra"<remove_key_mesh_wrap(QRegExp(tmp,true,true)); - xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + /*xx=*/this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); return ok; } @@ -2237,9 +2760,9 @@ med_int ghs3dprl_mesh_wrap::create_families(med_idt fid, int sign) { med_int pas,ires; char nomfam[MED_NAME_SIZE+1]; //it.current()->name; - char attdes[MED_COMMENT_SIZE+1]="_NO_DESCRIPTION"; + //char attdes[MED_COMMENT_SIZE+1]="_NO_DESCRIPTION"; char *gro; - med_int i,attide=1,attval=1,natt=1,num,ngro; + med_int i,/*attide=1,*//*attval=1,*//*natt=1,*/num,ngro; if (sign>=0) pas=1; else pas=-1; ires=0; @@ -2266,10 +2789,29 @@ med_int ghs3dprl_mesh_wrap::create_families(med_idt fid, int sign) } if (verbose>5)std::cout<name; + //char attdes[MED_COMMENT_SIZE+1]="_NO_DESCRIPTION"; + + char *gro; + med_int /*attide=1,*//*attval=1,*//*natt=1,*/num=0,ngro=0; + + gro=new char[MED_LNAME_SIZE*ngro+2]; + if (verbose>3)std::cout<<"\ncreate_family_ZERO "<