X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDLoader%2FMEDFileMeshLL.cxx;h=d3e93c4412a2434b3cdff2fdd52c203984ed282d;hb=b3e28553eab4c76446ec4214ad4a8d71528905ab;hp=16fef5d9db152d182d5a78316cd32dc0e2e2bf92;hpb=95cadd9b5d549b9eb20de896f2f4526ba65a1e1a;p=tools%2Fmedcoupling.git diff --git a/src/MEDLoader/MEDFileMeshLL.cxx b/src/MEDLoader/MEDFileMeshLL.cxx index 16fef5d9d..d3e93c441 100644 --- a/src/MEDLoader/MEDFileMeshLL.cxx +++ b/src/MEDLoader/MEDFileMeshLL.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// Copyright (C) 2007-2016 CEA/DEN, 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 @@ -23,6 +23,8 @@ #include "MEDLoaderBase.hxx" #include "MEDFileSafeCaller.txx" #include "MEDFileMeshReadSelector.hxx" +#include "MEDFileStructureElement.hxx" +#include "MEDFileMeshSupport.hxx" #include "MEDCouplingUMesh.hxx" @@ -30,63 +32,34 @@ #include "CellModel.hxx" #include +#include extern med_geometry_type typmai[MED_N_CELL_FIXED_GEO]; extern INTERP_KERNEL::NormalizedCellType typmai2[MED_N_CELL_FIXED_GEO]; extern med_geometry_type typmainoeud[1]; -using namespace ParaMEDMEM; +using namespace MEDCoupling; -MEDFileMeshL2::MEDFileMeshL2():_name(MED_NAME_SIZE),_description(MED_COMMENT_SIZE),_univ_name(MED_LNAME_SIZE),_dt_unit(MED_LNAME_SIZE) -{ -} +const char MEDFileMeshL2::ZE_SEP_FOR_FAMILY_KILLERS[]="!/__\\!";//important start by - because ord('!')==33 the smallest (!=' ') to preserve orders at most. -std::size_t MEDFileMeshL2::getHeapMemorySizeWithoutChildren() const -{ - return 0; -} +int MEDFileMeshL2::ZE_SEP2_FOR_FAMILY_KILLERS=4; -std::vector MEDFileMeshL2::getDirectChildrenWithNull() const -{ - return std::vector(); -} - -int MEDFileMeshL2::GetMeshIdFromName(med_idt fid, const std::string& mname, ParaMEDMEM::MEDCouplingMeshType& meshType, int& dt, int& it, std::string& dtunit1) +std::vector MeshCls::getAxisInfoOnMesh(med_idt fid, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& nstep, int& Mdim, MEDFileString& description, MEDFileString& dtunit, MEDFileString& univName) const { med_mesh_type type_maillage; - char maillage_description[MED_COMMENT_SIZE+1]; - char dtunit[MED_LNAME_SIZE+1]; - med_int spaceDim,dim; - char nommaa[MED_NAME_SIZE+1]; - med_int n=MEDnMesh(fid); - bool found=false; - int ret=-1; + med_int spaceDim; med_sorting_type stype; - std::vector ms; - int nstep; med_axis_type axistype; - for(int i=0;i axisname=MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE); - INTERP_KERNEL::AutoPtr axisunit=MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE); - MEDFILESAFECALLERRD0(MEDmeshInfo,(fid,i+1,nommaa,&spaceDim,&dim,&type_maillage,maillage_description,dtunit,&stype,&nstep,&axistype,axisname,axisunit)); - dtunit1=MEDLoaderBase::buildStringFromFortran(dtunit,sizeof(dtunit)); - std::string cur=MEDLoaderBase::buildStringFromFortran(nommaa,sizeof(nommaa)); - ms.push_back(cur); - if(cur==mname) - { - found=true; - ret=i+1; - } - } - if(!found) - { - std::ostringstream oss; - oss << "No such meshname (" << mname << ") in file ! Must be in : "; - std::copy(ms.begin(),ms.end(),std::ostream_iterator(oss,", ")); - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } + int naxis(MEDmeshnAxis(fid,getID())); + INTERP_KERNEL::AutoPtr nameTmp(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE)); + INTERP_KERNEL::AutoPtr axisname(MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE)); + INTERP_KERNEL::AutoPtr axisunit(MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE)); + INTERP_KERNEL::AutoPtr univTmp(MEDLoaderBase::buildEmptyString(MED_LNAME_SIZE)); + if(MEDmeshInfo(fid,getID(),nameTmp,&spaceDim,&Mdim,&type_maillage,description.getPointer(),dtunit.getPointer(), + &stype,&nstep,&axistype,axisname,axisunit)!=0) + throw INTERP_KERNEL::Exception("A problem has been detected when trying to get info on mesh !"); + MEDmeshUniversalNameRd(fid,nameTmp,univName.getPointer());// do not protect MEDFILESAFECALLERRD0 call : Thanks to fra.med. + axType=MEDFileMeshL2::TraduceAxisType(axistype); switch(type_maillage) { case MED_UNSTRUCTURED_MESH: @@ -95,7 +68,7 @@ int MEDFileMeshL2::GetMeshIdFromName(med_idt fid, const std::string& mname, Para case MED_STRUCTURED_MESH: { med_grid_type gt; - MEDFILESAFECALLERRD0(MEDmeshGridTypeRd,(fid,mname.c_str(),>)); + MEDFILESAFECALLERRD0(MEDmeshGridTypeRd,(fid,mName.c_str(),>)); switch(gt) { case MED_CARTESIAN_GRID: @@ -104,22 +77,28 @@ int MEDFileMeshL2::GetMeshIdFromName(med_idt fid, const std::string& mname, Para case MED_CURVILINEAR_GRID: meshType=CURVE_LINEAR; break; + case MED_POLAR_GRID:// this is not a bug. A MED file POLAR_GRID is deal by CARTESIAN MEDLoader + meshType=CARTESIAN; + break; default: - throw INTERP_KERNEL::Exception("MEDFileUMeshL2::getMeshIdFromName : unrecognized structured mesh type ! Supported are :\n - cartesian\n - curve linear\n"); + throw INTERP_KERNEL::Exception("MEDFileMeshL2::getAxisInfoOnMesh : unrecognized structured mesh type ! Supported are :\n - cartesian\n - curve linear\n"); } break; } default: - throw INTERP_KERNEL::Exception("MEDFileUMeshL2::getMeshIdFromName : unrecognized mesh type !"); + throw INTERP_KERNEL::Exception("MEDFileMeshL2::getMeshIdFromName : unrecognized mesh type !"); } - med_int numdt,numit; - med_float dtt; - MEDFILESAFECALLERRD0(MEDmeshComputationStepInfo,(fid,mname.c_str(),1,&numdt,&numit,&dtt)); - dt=numdt; it=numit; - return ret; + // + std::vector infosOnComp(naxis); + for(int i=0;i(numdt,numit); - found=(numdt==dt) && (numit==numit); + p[i]=std::make_pair((int)numdt,(int)numit); + found=(numdt==dt) && (numit==it); + if (found) break; } if(!found) { @@ -142,54 +122,160 @@ double MEDFileMeshL2::CheckMeshTimeStep(med_idt fid, const std::string& mName, i return dtt; } -std::vector MEDFileMeshL2::getAxisInfoOnMesh(med_idt fid, int mId, const std::string& mName, ParaMEDMEM::MEDCouplingMeshType& meshType, int& nstep, int& Mdim) +std::vector StructMeshCls::getAxisInfoOnMesh(med_idt fid, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& nstep, int& Mdim, MEDFileString& description, MEDFileString& dtunit, MEDFileString& univName) const +{ + INTERP_KERNEL::AutoPtr msn(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE)); + INTERP_KERNEL::AutoPtr zeDescription(MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE)); + med_axis_type medAxType; + int nAxis(MEDsupportMeshnAxis(fid,getID())); + INTERP_KERNEL::AutoPtr axisName(new char[MED_SNAME_SIZE*nAxis+1]),axisUnit(new char[MED_SNAME_SIZE*nAxis+1]); + int spaceDim(0),meshDim(0); + MEDFILESAFECALLERRD0(MEDsupportMeshInfo,(fid,getID(),msn,&spaceDim,&meshDim,zeDescription,&medAxType,axisName,axisUnit)); + std::string descriptionCpp(MEDLoaderBase::buildStringFromFortran(zeDescription,MED_COMMENT_SIZE)); + description.set(descriptionCpp.c_str()); + dtunit.clear(); univName.clear(); meshType=UNSTRUCTURED; nstep=1; + axType=MEDFileMeshL2::TraduceAxisType(medAxType); + //int nmodels(0); + //med_bool chgt=MED_FALSE,trsf=MED_FALSE; + //nmodels=MEDmeshnEntity(fid,_name.c_str(),MED_NO_DT,MED_NO_IT,MED_STRUCT_ELEMENT,MED_GEO_ALL,MED_CONNECTIVITY,MED_NODAL,&chgt,&trsf); + std::vector ret; + for(int i=0;i MEDFileMeshL2::getDirectChildrenWithNull() const +{ + return std::vector(); +} + +INTERP_KERNEL::AutoCppPtr MEDFileMeshL2::GetMeshIdFromName(med_idt fid, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& dt, int& it, std::string& dtunit1) { med_mesh_type type_maillage; - med_int spaceDim; + char maillage_description[MED_COMMENT_SIZE+1]; + char dtunit[MED_LNAME_SIZE+1]; + med_int spaceDim,dim; + char nommaa[MED_NAME_SIZE+1]; + med_int n=MEDnMesh(fid); + char found(0); + int ret=-1; med_sorting_type stype; + std::vector ms; + int nstep; med_axis_type axistype; - int naxis(MEDmeshnAxis(fid,mId)); - INTERP_KERNEL::AutoPtr nameTmp=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE); - INTERP_KERNEL::AutoPtr axisname=MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE); - INTERP_KERNEL::AutoPtr axisunit=MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE); - INTERP_KERNEL::AutoPtr univTmp=MEDLoaderBase::buildEmptyString(MED_LNAME_SIZE); - if(MEDmeshInfo(fid,mId,nameTmp,&spaceDim,&Mdim,&type_maillage,_description.getPointer(),_dt_unit.getPointer(), - &stype,&nstep,&axistype,axisname,axisunit)!=0) - throw INTERP_KERNEL::Exception("A problem has been detected when trying to get info on mesh !"); - MEDmeshUniversalNameRd(fid,nameTmp,_univ_name.getPointer());// do not protect MEDFILESAFECALLERRD0 call : Thanks to fra.med. - switch(type_maillage) - { - case MED_UNSTRUCTURED_MESH: - meshType=UNSTRUCTURED; - break; - case MED_STRUCTURED_MESH: - { - med_grid_type gt; - MEDFILESAFECALLERRD0(MEDmeshGridTypeRd,(fid,mName.c_str(),>)); - switch(gt) + for(int i=0;i axisname(MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE)),axisunit(MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE)); + MEDFILESAFECALLERRD0(MEDmeshInfo,(fid,i+1,nommaa,&spaceDim,&dim,&type_maillage,maillage_description,dtunit,&stype,&nstep,&axistype,axisname,axisunit)); + dtunit1=MEDLoaderBase::buildStringFromFortran(dtunit,sizeof(dtunit)); + std::string cur(MEDLoaderBase::buildStringFromFortran(nommaa,sizeof(nommaa))); + ms.push_back(cur); + if(cur==mName) { - case MED_CARTESIAN_GRID: - meshType=CARTESIAN; - break; - case MED_CURVILINEAR_GRID: - meshType=CURVE_LINEAR; + found=1; + ret=i+1; + } + } + if(found==0) + {//last chance ! Is it a support mesh ? + int nbSM(MEDnSupportMesh(fid)); + for(int i=0;i axisname(MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE)),axisunit(MEDLoaderBase::buildEmptyString(naxis*MED_SNAME_SIZE)); + MEDFILESAFECALLERRD0(MEDsupportMeshInfo,(fid,i+1,nommaa,&spaceDim,&dim,maillage_description,&axistype,axisname,axisunit)); + std::string cur(MEDLoaderBase::buildStringFromFortran(nommaa,sizeof(nommaa))); + ms.push_back(cur); + if(cur==mName) + { + found=2; + ret=i+1; + } + } + } + //////////////////////// + switch(found) + { + case 1: + { + axType=TraduceAxisType(axistype); + switch(type_maillage) + { + case MED_UNSTRUCTURED_MESH: + meshType=UNSTRUCTURED; break; + case MED_STRUCTURED_MESH: + { + med_grid_type gt; + MEDFILESAFECALLERRD0(MEDmeshGridTypeRd,(fid,mName.c_str(),>)); + switch(gt) + { + case MED_CARTESIAN_GRID: + meshType=CARTESIAN; + break; + case MED_CURVILINEAR_GRID: + meshType=CURVE_LINEAR; + break; + case MED_POLAR_GRID:// this is not a bug. A MED file POLAR_GRID is deal by CARTESIAN MEDLoader + meshType=CARTESIAN; + break; + default: + throw INTERP_KERNEL::Exception("MEDFileMeshL2::getMeshIdFromName : unrecognized structured mesh type ! Supported are :\n - cartesian\n - curve linear\n"); + } + break; + } default: - throw INTERP_KERNEL::Exception("MEDFileUMeshL2::getAxisInfoOnMesh : unrecognized structured mesh type ! Supported are :\n - cartesian\n - curve linear\n"); - } - break; + throw INTERP_KERNEL::Exception("MEDFileMeshL2::getMeshIdFromName : unrecognized mesh type !"); + } + med_int numdt,numit; + med_float dtt; + MEDFILESAFECALLERRD0(MEDmeshComputationStepInfo,(fid,mName.c_str(),1,&numdt,&numit,&dtt)); + dt=numdt; it=numit; + return new MeshCls(ret); + } + case 2: + { + meshType=UNSTRUCTURED; + dt=MED_NO_DT; it=MED_NO_IT; dtunit1.clear(); + axType=axType=TraduceAxisType(axistype); + return new StructMeshCls(ret); } default: - throw INTERP_KERNEL::Exception("MEDFileUMeshL2::getMeshIdFromName : unrecognized mesh type !"); - } - // - std::vector infosOnComp(naxis); - for(int i=0;i(oss,", ")); + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } } - return infosOnComp; + +} + +/*! + * non static and non const method because _description, _dt_unit... are set in this method. + */ +std::vector MEDFileMeshL2::getAxisInfoOnMesh(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& nstep, int& Mdim) +{ + return mId->getAxisInfoOnMesh(fid,mName,meshType,axType,nstep,Mdim,_description,_dt_unit,_univ_name); } void MEDFileMeshL2::ReadFamiliesAndGrps(med_idt fid, const std::string& meshName, std::map& fams, std::map >& grps, MEDFileMeshReadSelector *mrs) @@ -199,6 +285,7 @@ void MEDFileMeshL2::ReadFamiliesAndGrps(med_idt fid, const std::string& meshName char nomfam[MED_NAME_SIZE+1]; med_int numfam; int nfam=MEDnFamily(fid,meshName.c_str()); + std::vector< std::pair > > > crudeFams(nfam); for(int i=0;i attdes=new char[MED_COMMENT_SIZE*natt+1]; INTERP_KERNEL::AutoPtr gro=new char[MED_LNAME_SIZE*ngro+1]; MEDfamily23Info(fid,meshName.c_str(),i+1,nomfam,attide,attval,attdes,&numfam,gro); - std::string famName=MEDLoaderBase::buildStringFromFortran(nomfam,MED_NAME_SIZE); - fams[famName]=numfam; + std::string famName(MEDLoaderBase::buildStringFromFortran(nomfam,MED_NAME_SIZE)); + std::vector grps(ngro); for(int j=0;j > >(famName,std::pair >(numfam,grps)); + } + RenameFamiliesFromFileToMemInternal(crudeFams); + for(std::vector< std::pair > > >::const_iterator it0=crudeFams.begin();it0!=crudeFams.end();it0++) + { + fams[(*it0).first]=(*it0).second.first; + for(std::vector::const_iterator it1=(*it0).second.second.begin();it1!=(*it0).second.second.end();it1++) + grps[*it1].push_back((*it0).first); } } void MEDFileMeshL2::WriteFamiliesAndGrps(med_idt fid, const std::string& mname, const std::map& fams, const std::map >& grps, int tooLongStrPol) { - for(std::map::const_iterator it=fams.begin();it!=fams.end();it++) + std::vector< std::pair > > > crudeFams(fams.size()); + std::size_t ii(0); + for(std::map::const_iterator it=fams.begin();it!=fams.end();it++,ii++) { std::vector grpsOfFam; for(std::map >::const_iterator it1=grps.begin();it1!=grps.end();it1++) @@ -228,29 +322,205 @@ void MEDFileMeshL2::WriteFamiliesAndGrps(med_idt fid, const std::string& mname, if(std::find((*it1).second.begin(),(*it1).second.end(),(*it).first)!=(*it1).second.end()) grpsOfFam.push_back((*it1).first); } - int ngro=grpsOfFam.size(); + crudeFams[ii]=std::pair > >((*it).first,std::pair >((*it).second,grpsOfFam)); + } + RenameFamiliesFromMemToFileInternal(crudeFams); + for(std::vector< std::pair > > >::const_iterator it=crudeFams.begin();it!=crudeFams.end();it++) + { + int ngro((*it).second.second.size()); INTERP_KERNEL::AutoPtr groName=MEDLoaderBase::buildEmptyString(MED_LNAME_SIZE*ngro); int i=0; - for(std::vector::const_iterator it2=grpsOfFam.begin();it2!=grpsOfFam.end();it2++,i++) + for(std::vector::const_iterator it2=(*it).second.second.begin();it2!=(*it).second.second.end();it2++,i++) MEDLoaderBase::safeStrCpy2((*it2).c_str(),MED_LNAME_SIZE-1,groName+i*MED_LNAME_SIZE,tooLongStrPol); INTERP_KERNEL::AutoPtr famName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE); MEDLoaderBase::safeStrCpy((*it).first.c_str(),MED_NAME_SIZE,famName,tooLongStrPol); - int ret=MEDfamilyCr(fid,mname.c_str(),famName,(*it).second,ngro,groName); + int ret=MEDfamilyCr(fid,mname.c_str(),famName,(*it).second.first,ngro,groName); ret++; } } +void MEDFileMeshL2::RenameFamiliesPatternInternal(std::vector< std::pair > > >& crudeFams, RenameFamiliesPatternFunc func) +{ + std::size_t ii(0); + std::vector fams(crudeFams.size()); + for(std::vector< std::pair > > >::const_iterator it=crudeFams.begin();it!=crudeFams.end();it++,ii++) + fams[ii]=(*it).first; + if(!func(fams)) + return ; + ii=0; + for(std::vector< std::pair > > >::iterator it=crudeFams.begin();it!=crudeFams.end();it++,ii++) + (*it).first=fams[ii]; +} + +/*! + * This method is dedicated to the killers that use a same family name to store different family ids. MED file API authorizes it. + * So this method renames families (if needed generaly not !) in order to have a discriminant name for families. + */ +void MEDFileMeshL2::RenameFamiliesFromFileToMemInternal(std::vector< std::pair > > >& crudeFams) +{ + RenameFamiliesPatternInternal(crudeFams,RenameFamiliesFromFileToMem); +} + +bool MEDFileMeshL2::RenameFamiliesFromFileToMem(std::vector< std::string >& famNames) +{ + std::map m; + std::set s; + for(std::vector< std::string >::const_iterator it=famNames.begin();it!=famNames.end();it++) + { + if(s.find(*it)!=s.end()) + m[*it]=0; + s.insert(*it); + } + if(m.empty()) + return false;// the general case ! + for(std::vector< std::string >::iterator it=famNames.begin();it!=famNames.end();it++) + { + std::map::iterator it2(m.find(*it)); + if(it2!=m.end()) + { + std::ostringstream oss; oss << *it << ZE_SEP_FOR_FAMILY_KILLERS << std::setfill('0') << std::setw(ZE_SEP2_FOR_FAMILY_KILLERS) << (*it2).second++; + *it=oss.str(); + } + } + return true; +} + +/*! + * This method is dedicated to the killers that use a same family name to store different family ids. MED file API authorizes it. + * So this method renames families (if needed generaly not !) in order to have a discriminant name for families. + */ +void MEDFileMeshL2::RenameFamiliesFromMemToFileInternal(std::vector< std::pair > > >& crudeFams) +{ + RenameFamiliesPatternInternal(crudeFams,RenameFamiliesFromMemToFile); +} + +bool MEDFileMeshL2::RenameFamiliesFromMemToFile(std::vector< std::string >& famNames) +{ + bool isSmthingStrange(false); + for(std::vector< std::string >::const_iterator it=famNames.begin();it!=famNames.end();it++) + { + std::size_t found((*it).find(ZE_SEP_FOR_FAMILY_KILLERS)); + if(found!=std::string::npos) + isSmthingStrange=true; + } + if(!isSmthingStrange) + return false; + // pattern matching + std::map< std::string, std::vector > m; + for(std::vector< std::string >::const_iterator it=famNames.begin();it!=famNames.end();it++) + { + std::size_t found((*it).find(ZE_SEP_FOR_FAMILY_KILLERS)); + if(found!=std::string::npos && found>=1) + { + std::string s1((*it).substr(found+sizeof(ZE_SEP_FOR_FAMILY_KILLERS)-1)); + if(s1.size()!=ZE_SEP2_FOR_FAMILY_KILLERS) + continue; + int k(-1); + std::istringstream iss(s1); + iss >> k; + bool isOK((iss.rdstate() & ( std::istream::failbit | std::istream::eofbit)) == std::istream::eofbit); + if(isOK && k>=0) + { + std::string s0((*it).substr(0,found)); + m[s0].push_back(*it); + } + } + } + if(m.empty()) + return false; + // filtering + std::map zeMap; + for(std::map< std::string, std::vector >::const_iterator it=m.begin();it!=m.end();it++) + { + if((*it).second.size()==1) + continue; + for(std::vector::const_iterator it1=(*it).second.begin();it1!=(*it).second.end();it1++) + zeMap[*it1]=(*it).first; + } + if(zeMap.empty()) + return false; + // traduce + for(std::vector< std::string >::iterator it=famNames.begin();it!=famNames.end();it++) + { + std::map::iterator it1(zeMap.find(*it)); + if(it1!=zeMap.end()) + *it=(*it1).second; + } + return true; +} + +MEDCoupling::MEDCouplingAxisType MEDFileMeshL2::TraduceAxisType(med_axis_type at) +{ + switch(at) + { + case MED_CARTESIAN: + return AX_CART; + case MED_CYLINDRICAL: + return AX_CYL; + case MED_SPHERICAL: + return AX_SPHER; + case MED_UNDEF_AXIS_TYPE: + return AX_CART; + default: + throw INTERP_KERNEL::Exception("MEDFileMeshL2::TraduceAxisType : unrecognized axis type !"); + } +} + +MEDCoupling::MEDCouplingAxisType MEDFileMeshL2::TraduceAxisTypeStruct(med_grid_type gt) +{ + switch(gt) + { + case MED_CARTESIAN_GRID: + return AX_CART; + case MED_POLAR_GRID: + return AX_CYL; + default: + throw INTERP_KERNEL::Exception("MEDFileMeshL2::TraduceAxisTypeStruct : only Cartesian and Cylindrical supported by MED file !"); + } +} + +med_axis_type MEDFileMeshL2::TraduceAxisTypeRev(MEDCoupling::MEDCouplingAxisType at) +{ + switch(at) + { + case AX_CART: + return MED_CARTESIAN; + case AX_CYL: + return MED_CYLINDRICAL; + case AX_SPHER: + return MED_SPHERICAL; + default: + throw INTERP_KERNEL::Exception("MEDFileMeshL2::TraduceAxisTypeRev : unrecognized axis type !"); + } +} + +med_grid_type MEDFileMeshL2::TraduceAxisTypeRevStruct(MEDCoupling::MEDCouplingAxisType at) +{ + switch(at) + { + case AX_CART: + return MED_CARTESIAN_GRID; + case AX_CYL: + return MED_POLAR_GRID; + case AX_SPHER: + return MED_POLAR_GRID; + default: + throw INTERP_KERNEL::Exception("MEDFileMeshL2::TraduceAxisTypeRevStruct : unrecognized axis type !"); + } +} + MEDFileUMeshL2::MEDFileUMeshL2() { } -std::vector MEDFileUMeshL2::loadCommonPart(med_idt fid, int mId, const std::string& mName, int dt, int it, int& Mdim) +std::vector MEDFileUMeshL2::loadCommonPart(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, int dt, int it, int& Mdim) { Mdim=-3; _name.set(mName.c_str()); int nstep; - ParaMEDMEM::MEDCouplingMeshType meshType; - std::vector ret(getAxisInfoOnMesh(fid,mId,mName.c_str(),meshType,nstep,Mdim)); + MEDCoupling::MEDCouplingMeshType meshType; + MEDCoupling::MEDCouplingAxisType dummy3; + std::vector ret(getAxisInfoOnMesh(fid,mId,mName.c_str(),meshType,dummy3,nstep,Mdim)); if(nstep==0) { Mdim=-4; @@ -258,23 +528,23 @@ std::vector MEDFileUMeshL2::loadCommonPart(med_idt fid, int mId, co } if(meshType!=UNSTRUCTURED) throw INTERP_KERNEL::Exception("Invalid mesh type ! You are expected an unstructured one whereas in file it is not an unstructured !"); - _time=CheckMeshTimeStep(fid,mName,nstep,dt,it); + _time=mId->checkMeshTimeStep(fid,mName,nstep,dt,it); _iteration=dt; _order=it; return ret; } -void MEDFileUMeshL2::loadAll(med_idt fid, int mId, const std::string& mName, int dt, int it, MEDFileMeshReadSelector *mrs) +void MEDFileUMeshL2::loadAll(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, int dt, int it, MEDFileMeshReadSelector *mrs) { int Mdim; std::vector infosOnComp(loadCommonPart(fid,mId,mName,dt,it,Mdim)); if(Mdim==-4) return ; loadConnectivity(fid,Mdim,mName,dt,it,mrs);//to improve check (dt,it) coherency - loadCoords(fid,mId,infosOnComp,mName,dt,it); + loadCoords(fid,infosOnComp,mName,dt,it); } -void MEDFileUMeshL2::loadPart(med_idt fid, int mId, const std::string& mName, const std::vector& types, const std::vector& slicPerTyp, int dt, int it, MEDFileMeshReadSelector *mrs) +void MEDFileUMeshL2::loadPart(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, const std::vector& types, const std::vector& slicPerTyp, int dt, int it, MEDFileMeshReadSelector *mrs) { int Mdim; std::vector infosOnComp(loadCommonPart(fid,mId,mName,dt,it,Mdim)); @@ -284,16 +554,16 @@ void MEDFileUMeshL2::loadPart(med_idt fid, int mId, const std::string& mName, co med_bool changement,transformation; int nCoords(MEDmeshnEntity(fid,mName.c_str(),dt,it,MED_NODE,MED_NONE,MED_COORDINATE,MED_NO_CMODE,&changement,&transformation)); std::vector fetchedNodeIds(nCoords,false); - for(std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr > >::const_iterator it0=_per_type_mesh.begin();it0!=_per_type_mesh.end();it0++) - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++) + for(std::vector< std::vector< MCAuto > >::const_iterator it0=_per_type_mesh.begin();it0!=_per_type_mesh.end();it0++) + for(std::vector< MCAuto >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++) (*it1)->getMesh()->computeNodeIdsAlg(fetchedNodeIds); int nMin(std::distance(fetchedNodeIds.begin(),std::find(fetchedNodeIds.begin(),fetchedNodeIds.end(),true))); int nMax(std::distance(fetchedNodeIds.rbegin(),std::find(fetchedNodeIds.rbegin(),fetchedNodeIds.rend(),true))); nMax=nCoords-nMax; - for(std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr > >::const_iterator it0=_per_type_mesh.begin();it0!=_per_type_mesh.end();it0++) - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++) + for(std::vector< std::vector< MCAuto > >::const_iterator it0=_per_type_mesh.begin();it0!=_per_type_mesh.end();it0++) + for(std::vector< MCAuto >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++) (*it1)->getMesh()->renumberNodesWithOffsetInConn(-nMin); - loadPartCoords(fid,mId,infosOnComp,mName,dt,it,nMin,nMax); + loadPartCoords(fid,infosOnComp,mName,dt,it,nMin,nMax); } void MEDFileUMeshL2::loadConnectivity(med_idt fid, int mdim, const std::string& mName, int dt, int it, MEDFileMeshReadSelector *mrs) @@ -322,13 +592,13 @@ void MEDFileUMeshL2::loadPartOfConnectivity(med_idt fid, int mdim, const std::st for(std::size_t ii=0;ii tmp(MEDFileUMeshPerType::NewPart(fid,mName.c_str(),dt,it,mdim,types[ii],strt,stp,step,mrs)); + MCAuto tmp(MEDFileUMeshPerType::NewPart(fid,mName.c_str(),dt,it,mdim,types[ii],strt,stp,step,mrs)); _per_type_mesh[0].push_back(tmp); } sortTypes(); } -void MEDFileUMeshL2::loadCoords(med_idt fid, int mId, const std::vector& infosOnComp, const std::string& mName, int dt, int it) +void MEDFileUMeshL2::loadCoords(med_idt fid, const std::vector& infosOnComp, const std::string& mName, int dt, int it) { int spaceDim((int)infosOnComp.size()); med_bool changement,transformation; @@ -336,7 +606,8 @@ void MEDFileUMeshL2::loadCoords(med_idt fid, int mId, const std::vectoralloc(nCoords,spaceDim); double *coordsPtr(_coords->getPointer()); - MEDFILESAFECALLERRD0(MEDmeshNodeCoordinateRd,(fid,mName.c_str(),dt,it,MED_FULL_INTERLACE,coordsPtr)); + if (nCoords) + MEDFILESAFECALLERRD0(MEDmeshNodeCoordinateRd,(fid,mName.c_str(),dt,it,MED_FULL_INTERLACE,coordsPtr)); if(MEDmeshnEntity(fid,mName.c_str(),dt,it,MED_NODE,MED_NO_GEOTYPE,MED_FAMILY_NUMBER,MED_NODAL,&changement,&transformation)>0) { _fam_coords=DataArrayInt::New(); @@ -366,7 +637,7 @@ void MEDFileUMeshL2::loadCoords(med_idt fid, int mId, const std::vectorsetInfoOnComponent(i,infosOnComp[i]); } -void MEDFileUMeshL2::loadPartCoords(med_idt fid, int mId, const std::vector& infosOnComp, const std::string& mName, int dt, int it, int nMin, int nMax) +void MEDFileUMeshL2::loadPartCoords(med_idt fid, const std::vector& infosOnComp, const std::string& mName, int dt, int it, int nMin, int nMax) { med_bool changement,transformation; int spaceDim((int)infosOnComp.size()),nCoords(MEDmeshnEntity(fid,mName.c_str(),dt,it,MED_NODE,MED_NONE,MED_COORDINATE,MED_NO_CMODE,&changement,&transformation)); @@ -415,9 +686,9 @@ void MEDFileUMeshL2::loadPartCoords(med_idt fid, int mId, const std::vector mdims; - std::vector< MEDCouplingAutoRefCountObjectPtr > tmp(_per_type_mesh[0]); + std::vector< MCAuto > tmp(_per_type_mesh[0]); _per_type_mesh.clear(); - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=tmp.begin();it!=tmp.end();it++) + for(std::vector< MCAuto >::const_iterator it=tmp.begin();it!=tmp.end();it++) mdims.insert((*it)->getDim()); if(mdims.empty()) return; @@ -425,15 +696,15 @@ void MEDFileUMeshL2::sortTypes() _per_type_mesh.resize(mdim+1); for(int dim=mdim+1;dim!=0;dim--) { - std::vector< MEDCouplingAutoRefCountObjectPtr >& elt=_per_type_mesh[mdim+1-dim]; - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=tmp.begin();it!=tmp.end();it++) + std::vector< MCAuto >& elt=_per_type_mesh[mdim+1-dim]; + for(std::vector< MCAuto >::const_iterator it=tmp.begin();it!=tmp.end();it++) if((*it)->getDim()==dim-1) elt.push_back(*it); } // suppression of contiguous empty levels at the end of _per_type_mesh. int nbOfUselessLev=0; bool isFirst=true; - for(std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr > >::reverse_iterator it2=_per_type_mesh.rbegin();it2!=_per_type_mesh.rend();it2++) + for(std::vector< std::vector< MCAuto > >::reverse_iterator it2=_per_type_mesh.rbegin();it2!=_per_type_mesh.rend();it2++) { if((*it2).empty() && isFirst) { @@ -468,7 +739,7 @@ void MEDFileUMeshL2::WriteCoords(med_idt fid, const std::string& mname, int dt, bool MEDFileUMeshL2::isFamDefinedOnLev(int levId) const { - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_per_type_mesh[levId].begin();it!=_per_type_mesh[levId].end();it++) + for(std::vector< MCAuto >::const_iterator it=_per_type_mesh[levId].begin();it!=_per_type_mesh[levId].end();it++) if((*it)->getFam()==0) return false; return true; @@ -476,7 +747,7 @@ bool MEDFileUMeshL2::isFamDefinedOnLev(int levId) const bool MEDFileUMeshL2::isNumDefinedOnLev(int levId) const { - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_per_type_mesh[levId].begin();it!=_per_type_mesh[levId].end();it++) + for(std::vector< MCAuto >::const_iterator it=_per_type_mesh[levId].begin();it!=_per_type_mesh[levId].end();it++) if((*it)->getNum()==0) return false; return true; @@ -484,40 +755,42 @@ bool MEDFileUMeshL2::isNumDefinedOnLev(int levId) const bool MEDFileUMeshL2::isNamesDefinedOnLev(int levId) const { - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_per_type_mesh[levId].begin();it!=_per_type_mesh[levId].end();it++) + for(std::vector< MCAuto >::const_iterator it=_per_type_mesh[levId].begin();it!=_per_type_mesh[levId].end();it++) if((*it)->getNames()==0) return false; return true; } -MEDFileCMeshL2::MEDFileCMeshL2() +MEDFileCMeshL2::MEDFileCMeshL2():_ax_type(AX_CART) { } -void MEDFileCMeshL2::loadAll(med_idt fid, int mId, const std::string& mName, int dt, int it) +void MEDFileCMeshL2::loadAll(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, int dt, int it) { _name.set(mName.c_str()); int nstep; int Mdim; - ParaMEDMEM::MEDCouplingMeshType meshType; - std::vector infosOnComp=getAxisInfoOnMesh(fid,mId,mName.c_str(),meshType,nstep,Mdim); + MEDCoupling::MEDCouplingMeshType meshType; + MEDCoupling::MEDCouplingAxisType dummy3; + std::vector infosOnComp(getAxisInfoOnMesh(fid,mId,mName.c_str(),meshType,dummy3,nstep,Mdim)); if(meshType!=CARTESIAN) throw INTERP_KERNEL::Exception("Invalid mesh type ! You are expected a structured one whereas in file it is not a structured !"); - _time=CheckMeshTimeStep(fid,mName,nstep,dt,it); + _time=mId->checkMeshTimeStep(fid,mName,nstep,dt,it); _iteration=dt; _order=it; // med_grid_type gridtype; MEDFILESAFECALLERRD0(MEDmeshGridTypeRd,(fid,mName.c_str(),&gridtype)); - if(gridtype!=MED_CARTESIAN_GRID) - throw INTERP_KERNEL::Exception("Invalid structured mesh ! Expected cartesian mesh type !"); + if(gridtype!=MED_CARTESIAN_GRID && gridtype!=MED_POLAR_GRID) + throw INTERP_KERNEL::Exception("Invalid rectilinear mesh ! Only cartesian and polar are supported !"); + _ax_type=TraduceAxisTypeStruct(gridtype); _cmesh=MEDCouplingCMesh::New(); for(int i=0;i da=DataArrayDouble::New(); + MCAuto da=DataArrayDouble::New(); da->alloc(nbOfElt,1); da->setInfoOnComponent(0,infosOnComp[i]); MEDFILESAFECALLERRD0(MEDmeshGridIndexCoordinateRd,(fid,mName.c_str(),dt,it,i+1,da->getPointer())); @@ -544,16 +817,17 @@ MEDFileCLMeshL2::MEDFileCLMeshL2() { } -void MEDFileCLMeshL2::loadAll(med_idt fid, int mId, const std::string& mName, int dt, int it) +void MEDFileCLMeshL2::loadAll(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, int dt, int it) { _name.set(mName.c_str()); int nstep; int Mdim; - ParaMEDMEM::MEDCouplingMeshType meshType; - std::vector infosOnComp=getAxisInfoOnMesh(fid,mId,mName,meshType,nstep,Mdim); + MEDCoupling::MEDCouplingMeshType meshType; + MEDCoupling::MEDCouplingAxisType dummy3; + std::vector infosOnComp(getAxisInfoOnMesh(fid,mId,mName,meshType,dummy3,nstep,Mdim)); if(meshType!=CURVE_LINEAR) throw INTERP_KERNEL::Exception("Invalid mesh type ! You are expected a structured one whereas in file it is not a structured !"); - _time=CheckMeshTimeStep(fid,mName,nstep,dt,it); + _time=mId->checkMeshTimeStep(fid,mName,nstep,dt,it); _iteration=dt; _order=it; // @@ -563,7 +837,7 @@ void MEDFileCLMeshL2::loadAll(med_idt fid, int mId, const std::string& mName, in _clmesh->setNodeGridStructure(stGrid,((int *)stGrid)+Mdim); med_bool chgt=MED_FALSE,trsf=MED_FALSE; int nbNodes(MEDmeshnEntity(fid,mName.c_str(),dt,it,MED_NODE,MED_NONE,MED_COORDINATE,MED_NO_CMODE,&chgt,&trsf)); - MEDCouplingAutoRefCountObjectPtr da=DataArrayDouble::New(); + MCAuto da=DataArrayDouble::New(); da->alloc(nbNodes,infosOnComp.size()); da->setInfoOnComponents(infosOnComp); MEDFILESAFECALLERRD0(MEDmeshNodeCoordinateRd,(fid,mName.c_str(),dt,it,MED_FULL_INTERLACE,da->getPointer())); @@ -583,7 +857,7 @@ MEDFileUMeshPermCompute::operator MEDCouplingUMesh *() const if((MEDCouplingUMesh *)_m==0) { updateTime(); - _m=static_cast(_st->_m_by_types.getUmesh()->deepCpy()); + _m=static_cast(_st->_m_by_types.getUmesh()->deepCopy()); _m->renumberCells(_st->_num->getConstPointer(),true); return _m.retn(); } @@ -594,7 +868,7 @@ MEDFileUMeshPermCompute::operator MEDCouplingUMesh *() const else { updateTime(); - _m=static_cast(_st->_m_by_types.getUmesh()->deepCpy()); + _m=static_cast(_st->_m_by_types.getUmesh()->deepCopy()); _m->renumberCells(_st->_num->getConstPointer(),true); return _m.retn(); } @@ -630,7 +904,7 @@ MEDFileUMeshSplitL1::MEDFileUMeshSplitL1(const MEDFileUMeshSplitL1& other):RefCo MEDFileUMeshSplitL1::MEDFileUMeshSplitL1(const MEDFileUMeshL2& l2, const std::string& mName, int id):_m(this) { - const std::vector< MEDCouplingAutoRefCountObjectPtr >& v=l2.getLev(id); + const std::vector< MCAuto >& v=l2.getLev(id); if(v.empty()) return; int sz=v.size(); @@ -641,7 +915,7 @@ MEDFileUMeshSplitL1::MEDFileUMeshSplitL1(const MEDFileUMeshL2& l2, const std::st for(int i=0;igetMesh()); - MEDCouplingAutoRefCountObjectPtr tmp2=l2.getCoords(); + MCAuto tmp2=l2.getCoords(); elt->setCoords(tmp2); ms[i]=elt; pds[i]=v[i]->getPartDef(); @@ -720,21 +994,52 @@ std::vector MEDFileUMeshSplitL1::getDirectChildrenWithN return ret; } -MEDFileUMeshSplitL1 *MEDFileUMeshSplitL1::deepCpy(DataArrayDouble *coords) const +MEDFileUMeshSplitL1 *MEDFileUMeshSplitL1::shallowCpyUsingCoords(DataArrayDouble *coords) const { - MEDCouplingAutoRefCountObjectPtr ret=new MEDFileUMeshSplitL1(*this); - ret->_m_by_types=_m_by_types.deepCpy(coords); + MCAuto ret(new MEDFileUMeshSplitL1(*this)); + ret->_m_by_types.shallowCpyMeshes(); + ret->_m_by_types.setCoords(coords); + return ret.retn(); +} + +MEDFileUMeshSplitL1 *MEDFileUMeshSplitL1::deepCopy(DataArrayDouble *coords) const +{ + MCAuto ret(new MEDFileUMeshSplitL1(*this)); + ret->_m_by_types=_m_by_types.deepCopy(coords); if((const DataArrayInt *)_fam) - ret->_fam=_fam->deepCpy(); + ret->_fam=_fam->deepCopy(); if((const DataArrayInt *)_num) - ret->_num=_num->deepCpy(); + ret->_num=_num->deepCopy(); if((const DataArrayInt *)_rev_num) - ret->_rev_num=_rev_num->deepCpy(); + ret->_rev_num=_rev_num->deepCopy(); if((const DataArrayAsciiChar *)_names) - ret->_names=_names->deepCpy(); + ret->_names=_names->deepCopy(); return ret.retn(); } +void MEDFileUMeshSplitL1::checkConsistency() const +{ + if (!_fam || _fam->getNumberOfTuples() != getSize()) + throw INTERP_KERNEL::Exception("MEDFileUMeshSplitL1::checkConsistency(): internal family array has an invalid size!"); + int nbCells = getSize(); + if (_num) + { + _num->checkNbOfTuplesAndComp(nbCells,1,"MEDFileUMeshSplitL1::checkConsistency(): inconsistent internal node numbering array!"); + int pos; + int maxValue=_num->getMaxValue(pos); + if (!_rev_num || _rev_num->getNumberOfTuples() != (maxValue+1)) + throw INTERP_KERNEL::Exception("MEDFileUMeshSplitL1::checkConsistency(): inconsistent internal revert node numbering array!"); + } + if ((_num && !_rev_num) || (!_num && _rev_num)) + throw INTERP_KERNEL::Exception("MEDFileUMeshSplitL1::checkConsistency(): inconsistent internal numbering arrays (one is null)!"); + if (_num && !_num->hasUniqueValues()) + throw INTERP_KERNEL::Exception("MEDFileUMeshSplitL1::checkConsistency(): inconsistent internal node numbering array: duplicates found!"); + if (_names) + _names->checkNbOfTuplesAndComp(nbCells,1,"MEDFileUMeshSplitL1::checkConsistency(): internal cell naming array has an invalid size!"); + + _m_by_types.checkConsistency(); +} + bool MEDFileUMeshSplitL1::isEqual(const MEDFileUMeshSplitL1 *other, double eps, std::string& what) const { if(!_m_by_types.isEqual(other->_m_by_types,eps,what)) @@ -812,9 +1117,9 @@ void MEDFileUMeshSplitL1::assignMesh(MEDCouplingUMesh *m, bool newOrOld) { m->incrRef(); _m=m; - _m_by_types.assignUMesh(dynamic_cast(m->deepCpy())); - MEDCouplingAutoRefCountObjectPtr da=_m_by_types.getUmesh()->getRenumArrForConsecutiveCellTypesSpec(typmai2,typmai2+MED_N_CELL_FIXED_GEO); - if(!da->isIdentity()) + _m_by_types.assignUMesh(dynamic_cast(m->deepCopy())); + MCAuto da=_m_by_types.getUmesh()->getRenumArrForConsecutiveCellTypesSpec(typmai2,typmai2+MED_N_CELL_FIXED_GEO); + if(!da->isIota(m->getNumberOfCells())) { _num=da->invertArrayO2N2N2O(m->getNumberOfCells()); _m.updateTime(); @@ -825,7 +1130,7 @@ void MEDFileUMeshSplitL1::assignMesh(MEDCouplingUMesh *m, bool newOrOld) else { if(!m->checkConsecutiveCellTypesAndOrder(typmai2,typmai2+MED_N_CELL_FIXED_GEO)) - throw INTERP_KERNEL::Exception("MEDFileUMeshSplitL1::assignMesh : the mode of mesh setting expects to follow the MED file numbering convention ! it is not the case !"); + throw INTERP_KERNEL::Exception("MEDFileUMeshSplitL1::assignMesh(): the mesh does not follow the MED file numbering convention! Invoke sortCellsInMEDFileFrmt() first!"); m->incrRef(); _m_by_types.assignUMesh(m); } @@ -890,7 +1195,7 @@ int MEDFileUMeshSplitL1::getSize() const MEDCouplingUMesh *MEDFileUMeshSplitL1::getFamilyPart(const int *idsBg, const int *idsEnd, bool renum) const { - MEDCouplingAutoRefCountObjectPtr eltsToKeep=_fam->getIdsEqualList(idsBg,idsEnd); + MCAuto eltsToKeep=_fam->findIdsEqualList(idsBg,idsEnd); MEDCouplingUMesh *m=(MEDCouplingUMesh *)_m_by_types.getUmesh()->buildPartOfMySelf(eltsToKeep->getConstPointer(),eltsToKeep->getConstPointer()+eltsToKeep->getNumberOfTuples(),true); if(renum) return renumIfNeeded(m,eltsToKeep->getConstPointer()); @@ -899,7 +1204,7 @@ MEDCouplingUMesh *MEDFileUMeshSplitL1::getFamilyPart(const int *idsBg, const int DataArrayInt *MEDFileUMeshSplitL1::getFamilyPartArr(const int *idsBg, const int *idsEnd, bool renum) const { - MEDCouplingAutoRefCountObjectPtr da=_fam->getIdsEqualList(idsBg,idsEnd); + MCAuto da=_fam->findIdsEqualList(idsBg,idsEnd); if(renum) return renumIfNeededArr(da); return da.retn(); @@ -910,9 +1215,14 @@ std::vector MEDFileUMeshSplitL1::getGeoTypes( return _m_by_types.getGeoTypes(); } +int MEDFileUMeshSplitL1::getNumberOfCellsWithType(INTERP_KERNEL::NormalizedCellType ct) const +{ + return _m_by_types.getNumberOfCellsWithType(ct); +} + MEDCouplingUMesh *MEDFileUMeshSplitL1::getWholeMesh(bool renum) const { - MEDCouplingAutoRefCountObjectPtr tmp; + MCAuto tmp; if(renum && ((const DataArrayInt *)_num)) tmp=_m; else @@ -932,7 +1242,7 @@ DataArrayInt *MEDFileUMeshSplitL1::extractFamilyFieldOnGeoType(INTERP_KERNEL::No return 0; int start(0),stop(0); _m_by_types.getStartStopOfGeoTypeWithoutComputation(gt,start,stop); - return fam->selectByTupleId2(start,stop,1); + return fam->selectByTupleIdSafeSlice(start,stop,1); } DataArrayInt *MEDFileUMeshSplitL1::extractNumberFieldOnGeoType(INTERP_KERNEL::NormalizedCellType gt) const @@ -942,7 +1252,7 @@ DataArrayInt *MEDFileUMeshSplitL1::extractNumberFieldOnGeoType(INTERP_KERNEL::No return 0; int start(0),stop(0); _m_by_types.getStartStopOfGeoTypeWithoutComputation(gt,start,stop); - return num->selectByTupleId2(start,stop,1); + return num->selectByTupleIdSafeSlice(start,stop,1); } DataArrayInt *MEDFileUMeshSplitL1::getOrCreateAndGetFamilyField() @@ -992,7 +1302,7 @@ void MEDFileUMeshSplitL1::setGroupsFromScratch(const std::vector corr; _m=MEDCouplingUMesh::FuseUMeshesOnSameCoords(ms,0,corr); - std::vector< MEDCouplingAutoRefCountObjectPtr > corrMSafe(corr.begin(),corr.end()); + std::vector< MCAuto > corrMSafe(corr.begin(),corr.end()); std::vector< std::vector > fidsOfGroups; std::vector< const DataArrayInt * > corr2(corr.begin(),corr.end()); _fam=DataArrayInt::MakePartition(corr2,((MEDCouplingUMesh *)_m)->getNumberOfCells(),fidsOfGroups); @@ -1013,14 +1323,14 @@ void MEDFileUMeshSplitL1::write(med_idt fid, const std::string& mName, int mdim) { int nbCells=(*it)->getNumberOfCells(); int end=start+nbCells; - MEDCouplingAutoRefCountObjectPtr fam,num; - MEDCouplingAutoRefCountObjectPtr names; + MCAuto fam,num; + MCAuto names; if((const DataArrayInt *)_fam) - fam=_fam->substr(start,end); + fam=_fam->subArray(start,end); if((const DataArrayInt *)_num) - num=_num->substr(start,end); + num=_num->subArray(start,end); if((const DataArrayAsciiChar *)_names) - names=static_cast(_names->substr(start,end)); + names=static_cast(_names->subArray(start,end)); MEDFileUMeshPerType::Write(fid,mName,mdim,(*it),fam,num,names); start=end; } @@ -1031,14 +1341,14 @@ void MEDFileUMeshSplitL1::renumberNodesInConn(const int *newNodeNumbersO2N) _m_by_types.renumberNodesInConnWithoutComputation(newNodeNumbersO2N); } -void MEDFileUMeshSplitL1::serialize(std::vector& tinyInt, std::vector< MEDCouplingAutoRefCountObjectPtr >& bigArraysI) const +void MEDFileUMeshSplitL1::serialize(std::vector& tinyInt, std::vector< MCAuto >& bigArraysI) const { bigArraysI.push_back(_fam); bigArraysI.push_back(_num); _m_by_types.serialize(tinyInt,bigArraysI); } -void MEDFileUMeshSplitL1::unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MEDCouplingAutoRefCountObjectPtr >& bigArraysI) +void MEDFileUMeshSplitL1::unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MCAuto >& bigArraysI) { _fam=bigArraysI.back(); bigArraysI.pop_back(); _num=bigArraysI.back(); bigArraysI.pop_back(); @@ -1106,15 +1416,15 @@ MEDCouplingUMesh *MEDFileUMeshSplitL1::Renumber2(const DataArrayInt *renum, MEDC m->renumberCells(renum->getConstPointer(),true); else { - MEDCouplingAutoRefCountObjectPtr locnum=renum->selectByTupleId(cellIds,cellIds+m->getNumberOfCells()); + MCAuto locnum=renum->selectByTupleId(cellIds,cellIds+m->getNumberOfCells()); m->renumberCells(locnum->getConstPointer(),true); } return m; } -MEDFileUMeshSplitL1 *MEDFileUMeshSplitL1::Unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MEDCouplingAutoRefCountObjectPtr >& bigArraysI) +MEDFileUMeshSplitL1 *MEDFileUMeshSplitL1::Unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MCAuto >& bigArraysI) { - MEDCouplingAutoRefCountObjectPtr ret(new MEDFileUMeshSplitL1); + MCAuto ret(new MEDFileUMeshSplitL1); ret->unserialize(name,coo,tinyInt,bigArraysI); return ret.retn(); } @@ -1182,7 +1492,7 @@ void MEDFileUMeshAggregateCompute::setName(const std::string& name) } if(_mp_time>=_m_time) { - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::iterator it=_m_parts.begin();it!=_m_parts.end();it++) { MEDCoupling1GTUMesh *tmp(*it); if(tmp) @@ -1194,7 +1504,7 @@ void MEDFileUMeshAggregateCompute::setName(const std::string& name) void MEDFileUMeshAggregateCompute::assignParts(const std::vector< const MEDCoupling1GTUMesh * >& mParts) { std::size_t sz(mParts.size()); - std::vector< MEDCouplingAutoRefCountObjectPtr > ret(sz); + std::vector< MCAuto > ret(sz); for(std::size_t i=0;igetNumberOfCells(); int ret(0); - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) ret+=(*it)->getNumberOfCells(); return ret; } @@ -1267,6 +1577,22 @@ std::vector MEDFileUMeshAggregateCompute::get return _m->getAllGeoTypesSorted(); } +int MEDFileUMeshAggregateCompute::getNumberOfCellsWithType(INTERP_KERNEL::NormalizedCellType ct) const +{ + if(_mp_time>=_m_time) + { + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) + { + const MEDCoupling1GTUMesh *elt(*it); + if(elt && elt->getCellModelEnum()==ct) + return elt->getNumberOfCells(); + } + return 0; + } + else + return _m->getNumberOfCellsWithType(ct); +} + std::vector MEDFileUMeshAggregateCompute::retrievePartsWithoutComputation() const { if(_mp_time<_m_time) @@ -1274,7 +1600,7 @@ std::vector MEDFileUMeshAggregateCompute::retrievePartsWi // std::vector ret(_m_parts.size()); std::size_t i(0); - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++,i++) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++,i++) { const MEDCoupling1GTUMesh *elt(*it); ret[i]=const_cast(elt); @@ -1327,7 +1653,7 @@ void MEDFileUMeshAggregateCompute::renumberNodesInConnWithoutComputation(const i { if(_mp_time>_m_time) { - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::iterator it=_m_parts.begin();it!=_m_parts.end();it++) { MEDCoupling1GTUMesh *m(*it); if(m) @@ -1347,9 +1673,14 @@ void MEDFileUMeshAggregateCompute::forceComputationOfPartsFromUMesh() const { const MEDCouplingUMesh *m(_m); if(!m) - throw INTERP_KERNEL::Exception("MEDFileUMeshAggregateCompute::forceComputationOfPartsFromUMesh : null UMesh !"); + { + if(_m_parts.empty()) + throw INTERP_KERNEL::Exception("MEDFileUMeshAggregateCompute::forceComputationOfPartsFromUMesh : null UMesh !"); + else + return ;// no needs to compte parts they are already here ! + } std::vector ms(m->splitByType()); - std::vector< MEDCouplingAutoRefCountObjectPtr > msMSafe(ms.begin(),ms.end()); + std::vector< MCAuto > msMSafe(ms.begin(),ms.end()); std::size_t sz(msMSafe.size()); _m_parts.resize(sz); for(std::size_t i=0;i& tinyInt, std::vector< MEDCouplingAutoRefCountObjectPtr >& bigArraysI) const +void MEDFileUMeshAggregateCompute::serialize(std::vector& tinyInt, std::vector< MCAuto >& bigArraysI) const { if(_mp_time<_m_time) throw INTERP_KERNEL::Exception("MEDFileUMeshAggregateCompute::serialize : the parts require a computation !"); @@ -1395,7 +1726,7 @@ void MEDFileUMeshAggregateCompute::serialize(std::vector& tinyInt, std::vec DataArrayInt *elt(mesh1->getNodalConnectivity()); if(elt) elt->incrRef(); - MEDCouplingAutoRefCountObjectPtr elt1(elt); + MCAuto elt1(elt); bigArraysI.push_back(elt1); } else if(mesh2) @@ -1405,7 +1736,7 @@ void MEDFileUMeshAggregateCompute::serialize(std::vector& tinyInt, std::vec elt1->incrRef(); if(elt2) elt2->incrRef(); - MEDCouplingAutoRefCountObjectPtr elt11(elt1),elt22(elt2); + MCAuto elt11(elt1),elt22(elt2); bigArraysI.push_back(elt11); bigArraysI.push_back(elt22); } else @@ -1423,7 +1754,7 @@ void MEDFileUMeshAggregateCompute::serialize(std::vector& tinyInt, std::vec } } -void MEDFileUMeshAggregateCompute::unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MEDCouplingAutoRefCountObjectPtr >& bigArraysI) +void MEDFileUMeshAggregateCompute::unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MCAuto >& bigArraysI) { int nbParts(tinyInt.back()); tinyInt.pop_back(); _part_def.clear(); _part_def.resize(nbParts); @@ -1431,7 +1762,7 @@ void MEDFileUMeshAggregateCompute::unserialize(const std::string& name, DataArra for(int i=0;i mesh(MEDCoupling1GTUMesh::New(name,tp)); + MCAuto mesh(MEDCoupling1GTUMesh::New(name,tp)); mesh->setCoords(coo); MEDCoupling1SGTUMesh *mesh1(dynamic_cast((MEDCoupling1GTUMesh *) mesh)); MEDCoupling1DGTUMesh *mesh2(dynamic_cast((MEDCoupling1GTUMesh *) mesh)); @@ -1441,7 +1772,7 @@ void MEDFileUMeshAggregateCompute::unserialize(const std::string& name, DataArra } else if(mesh2) { - MEDCouplingAutoRefCountObjectPtr elt0,elt1; + MCAuto elt0,elt1; elt0=bigArraysI.back(); bigArraysI.pop_back(); elt1=bigArraysI.back(); bigArraysI.pop_back(); mesh2->setNodalConnectivity(elt0,elt1); @@ -1476,7 +1807,7 @@ std::size_t MEDFileUMeshAggregateCompute::getTimeOfThis() const std::size_t MEDFileUMeshAggregateCompute::getTimeOfParts() const { std::size_t ret(0); - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) { const MEDCoupling1GTUMesh *elt(*it); if(!elt) @@ -1498,20 +1829,20 @@ std::size_t MEDFileUMeshAggregateCompute::getTimeOfUMesh() const std::size_t MEDFileUMeshAggregateCompute::getHeapMemorySizeWithoutChildren() const { - std::size_t ret(_m_parts.size()*sizeof(MEDCouplingAutoRefCountObjectPtr)); + std::size_t ret(_m_parts.size()*sizeof(MCAuto)); return ret; } std::vector MEDFileUMeshAggregateCompute::getDirectChildrenWithNull() const { std::vector ret; - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) ret.push_back((const MEDCoupling1GTUMesh *)*it); ret.push_back((const MEDCouplingUMesh *)_m); return ret; } -MEDFileUMeshAggregateCompute MEDFileUMeshAggregateCompute::deepCpy(DataArrayDouble *coords) const +MEDFileUMeshAggregateCompute MEDFileUMeshAggregateCompute::deepCopy(DataArrayDouble *coords) const { MEDFileUMeshAggregateCompute ret; ret._m_parts.resize(_m_parts.size()); @@ -1520,14 +1851,14 @@ MEDFileUMeshAggregateCompute MEDFileUMeshAggregateCompute::deepCpy(DataArrayDoub const MEDCoupling1GTUMesh *elt(_m_parts[i]); if(elt) { - ret._m_parts[i]=static_cast(elt->deepCpy()); + ret._m_parts[i]=static_cast(elt->deepCopy()); ret._m_parts[i]->setCoords(coords); } } ret._mp_time=_mp_time; ret._m_time=_m_time; if((const MEDCouplingUMesh *)_m) { - ret._m=static_cast(_m->deepCpy()); + ret._m=static_cast(_m->deepCopy()); ret._m->setCoords(coords); } std::size_t sz(_part_def.size()); @@ -1536,11 +1867,27 @@ MEDFileUMeshAggregateCompute MEDFileUMeshAggregateCompute::deepCpy(DataArrayDoub { const PartDefinition *elt(_part_def[i]); if(elt) - ret._part_def[i]=elt->deepCpy(); + ret._part_def[i]=elt->deepCopy(); } return ret; } +void MEDFileUMeshAggregateCompute::shallowCpyMeshes() +{ + for(std::vector< MCAuto >::iterator it=_m_parts.begin();it!=_m_parts.end();it++) + { + const MEDCoupling1GTUMesh *elt(*it); + if(elt) + { + MCAuto elt2(elt->clone(false)); + *it=DynamicCastSafe(elt2); + } + } + const MEDCouplingUMesh *m(_m); + if(m) + _m=m->clone(false); +} + bool MEDFileUMeshAggregateCompute::isEqual(const MEDFileUMeshAggregateCompute& other, double eps, std::string& what) const { const MEDCouplingUMesh *m1(getUmesh()); @@ -1582,16 +1929,26 @@ bool MEDFileUMeshAggregateCompute::isEqual(const MEDFileUMeshAggregateCompute& o return true; } +void MEDFileUMeshAggregateCompute::checkConsistency() const +{ + if(_mp_time >= _m_time) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin(); + it!=_m_parts.end(); it++) + (*it)->checkConsistency(); + else + _m->checkConsistency(); +} + void MEDFileUMeshAggregateCompute::clearNonDiscrAttributes() const { - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) MEDFileUMeshSplitL1::ClearNonDiscrAttributes(*it); MEDFileUMeshSplitL1::ClearNonDiscrAttributes(_m); } void MEDFileUMeshAggregateCompute::synchronizeTinyInfo(const MEDFileMesh& master) const { - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) { const MEDCoupling1GTUMesh *tmp(*it); if(tmp) @@ -1652,7 +2009,7 @@ std::vector MEDFileUMeshAggregateCompute::getDistributionOfTypes() const else { std::vector ret; - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) { const MEDCoupling1GTUMesh *tmp(*it); if(!tmp) @@ -1676,7 +2033,7 @@ int MEDFileUMeshAggregateCompute::getSize() const else { int ret=0; - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::const_iterator it=_m_parts.begin();it!=_m_parts.end();it++) { const MEDCoupling1GTUMesh *m(*it); if(!m) @@ -1689,7 +2046,7 @@ int MEDFileUMeshAggregateCompute::getSize() const void MEDFileUMeshAggregateCompute::setCoords(DataArrayDouble *coords) { - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::iterator it=_m_parts.begin();it!=_m_parts.end();it++) + for(std::vector< MCAuto >::iterator it=_m_parts.begin();it!=_m_parts.end();it++) { MEDCoupling1GTUMesh *tmp(*it); if(tmp) @@ -1699,3 +2056,56 @@ void MEDFileUMeshAggregateCompute::setCoords(DataArrayDouble *coords) if(m) m->setCoords(coords); } + +MEDFileEltStruct4Mesh *MEDFileEltStruct4Mesh::New(med_idt fid, const std::string& mName, int dt, int it, int iterOnStEltOfMesh, MEDFileMeshReadSelector *mrs) +{ + return new MEDFileEltStruct4Mesh(fid,mName,dt,it,iterOnStEltOfMesh,mrs); +} + +std::size_t MEDFileEltStruct4Mesh::getHeapMemorySizeWithoutChildren() const +{ + return _geo_type_name.capacity()+_vars.capacity()*sizeof(MCAuto); +} + +std::vector MEDFileEltStruct4Mesh::getDirectChildrenWithNull() const +{ + std::vector ret; + ret.push_back(_conn); + ret.push_back(_common); + for(std::vector< MCAuto >::const_iterator it=_vars.begin();it!=_vars.end();it++) + ret.push_back(*it); + return ret; +} + +MEDFileEltStruct4Mesh::MEDFileEltStruct4Mesh(med_idt fid, const std::string& mName, int dt, int it, int iterOnStEltOfMesh, MEDFileMeshReadSelector *mrs) +{ + med_geometry_type geoType; + INTERP_KERNEL::AutoPtr geoTypeName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE)); + MEDFILESAFECALLERRD0(MEDmeshEntityInfo,(fid,mName.c_str(),dt,it,MED_STRUCT_ELEMENT,iterOnStEltOfMesh+1,geoTypeName,&geoType)); + _geo_type=geoType; + _geo_type_name=MEDLoaderBase::buildStringFromFortran(geoTypeName,MED_NAME_SIZE); + int nCells(0); + { + med_bool chgt=MED_FALSE,trsf=MED_FALSE; + nCells=MEDmeshnEntity(fid,mName.c_str(),dt,it,MED_STRUCT_ELEMENT,geoType,MED_CONNECTIVITY,MED_NODAL,&chgt,&trsf); + } + MCAuto mss(MEDFileMeshSupports::New(fid)); + MCAuto mse(MEDFileStructureElements::New(fid,mss)); + int nbEntities(mse->getNumberOfNodesPerSE(_geo_type_name)); + _conn=DataArrayInt::New(); _conn->alloc(nCells,nbEntities); + MEDFILESAFECALLERRD0(MEDmeshElementConnectivityRd,(fid,mName.c_str(),dt,it,MED_STRUCT_ELEMENT,_geo_type,MED_NODAL,MED_FULL_INTERLACE,_conn->getPointer())); + _common=MEDFileUMeshPerTypeCommon::New(); + _common->loadCommonPart(fid,mName.c_str(),dt,it,nCells,geoType,MED_STRUCT_ELEMENT,mrs); + std::vector vns(mse->getVarAttsOf(_geo_type_name)); + std::size_t sz(vns.size()); + _vars.resize(sz); + for(std::size_t i=0;igetVarAttOf(_geo_type_name,vns[i])); + MCAuto gen(var->getGenerator()); + MCAuto arr(gen->buildNewEmptyInstance()); + arr->alloc(nCells,var->getNbOfComponents()); + arr->setName(vns[i]); + MEDFILESAFECALLERRD0(MEDmeshStructElementVarAttRd,(fid,mName.c_str(),dt,it,_geo_type,vns[i].c_str(),arr->getVoidStarPointer())); + } +}