X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling%2FMEDCouplingExtrudedMesh.cxx;h=fb36cb7c8ff3e9e2ac4508db0c6ae86d77c53767;hb=378cb2ebe08f8f4543ef632b2bd5f77fe180f978;hp=a76eea12873b2166609e7cde45f911ff71a430f0;hpb=aa8d1b9212088e2f0564f0a20ceac81d0e0c9518;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling/MEDCouplingExtrudedMesh.cxx b/src/MEDCoupling/MEDCouplingExtrudedMesh.cxx old mode 100644 new mode 100755 index a76eea128..fb36cb7c8 --- a/src/MEDCoupling/MEDCouplingExtrudedMesh.cxx +++ b/src/MEDCoupling/MEDCouplingExtrudedMesh.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D +// Copyright (C) 2007-2014 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 // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -69,15 +69,12 @@ std::size_t MEDCouplingExtrudedMesh::getHeapMemorySizeWithoutChildren() const return MEDCouplingMesh::getHeapMemorySizeWithoutChildren(); } -std::vector MEDCouplingExtrudedMesh::getDirectChildren() const +std::vector MEDCouplingExtrudedMesh::getDirectChildrenWithNull() const { std::vector ret; - if(_mesh2D) - ret.push_back(_mesh2D); - if(_mesh1D) - ret.push_back(_mesh1D); - if(_mesh3D_ids) - ret.push_back(_mesh3D_ids); + ret.push_back(_mesh2D); + ret.push_back(_mesh1D); + ret.push_back(_mesh3D_ids); return ret; } @@ -101,10 +98,10 @@ try:_mesh2D(const_cast(mesh2D)),_mesh1D(MEDCouplingUMesh::Ne if(_mesh2D!=0) _mesh2D->incrRef(); computeExtrusion(mesh3D); - setName(mesh3D->getName().c_str()); + setName(mesh3D->getName()); } catch(INTERP_KERNEL::Exception& e) - { +{ if(_mesh2D) _mesh2D->decrRef(); if(_mesh1D) @@ -112,7 +109,7 @@ catch(INTERP_KERNEL::Exception& e) if(_mesh3D_ids) _mesh3D_ids->decrRef(); throw e; - } +} MEDCouplingExtrudedMesh::MEDCouplingExtrudedMesh():_mesh2D(0),_mesh1D(0),_mesh3D_ids(0),_cell_2D_id(-1) { @@ -224,13 +221,13 @@ bool MEDCouplingExtrudedMesh::isEqualWithoutConsideringStr(const MEDCouplingMesh } void MEDCouplingExtrudedMesh::checkDeepEquivalWith(const MEDCouplingMesh *other, int cellCompPol, double prec, - DataArrayInt *&cellCor, DataArrayInt *&nodeCor) const throw(INTERP_KERNEL::Exception) + DataArrayInt *&cellCor, DataArrayInt *&nodeCor) const { throw INTERP_KERNEL::Exception("MEDCouplingExtrudedMesh::checkDeepEquivalWith : not implemented yet !"); } void MEDCouplingExtrudedMesh::checkDeepEquivalOnSameNodesWith(const MEDCouplingMesh *other, int cellCompPol, double prec, - DataArrayInt *&cellCor) const throw(INTERP_KERNEL::Exception) + DataArrayInt *&cellCor) const { throw INTERP_KERNEL::Exception("MEDCouplingExtrudedMesh::checkDeepEquivalOnSameNodesWith : not implemented yet !"); } @@ -250,7 +247,7 @@ INTERP_KERNEL::NormalizedCellType MEDCouplingExtrudedMesh::getTypeOfCell(int cel std::set MEDCouplingExtrudedMesh::getAllGeoTypes() const { - const std::set& ret2D=_mesh2D->getAllTypes(); + std::set ret2D(_mesh2D->getAllGeoTypes()); std::set ret; for(std::set::const_iterator it=ret2D.begin();it!=ret2D.end();it++) ret.insert(INTERP_KERNEL::CellModel::GetCellModel(*it).getExtrudedType()); @@ -288,7 +285,7 @@ DataArrayInt *MEDCouplingExtrudedMesh::computeNbOfNodesPerCell() const MEDCouplingAutoRefCountObjectPtr ret3D=DataArrayInt::New(); ret3D->alloc(nbOfLevs*nbOfCells2D,1); int *pt=ret3D->getPointer(); for(int i=0;ibegin(),ret2D->end(),pt); + std::copy(ret2D->begin(),ret2D->end(),pt); ret3D->applyLin(2,0,0); return ret3D->renumberR(_mesh3D_ids->begin()); } @@ -301,7 +298,7 @@ DataArrayInt *MEDCouplingExtrudedMesh::computeNbOfFacesPerCell() const MEDCouplingAutoRefCountObjectPtr ret3D=DataArrayInt::New(); ret3D->alloc(nbOfLevs*nbOfCells2D,1); int *pt=ret3D->getPointer(); for(int i=0;ibegin(),ret2D->end(),pt); + std::copy(ret2D->begin(),ret2D->end(),pt); ret3D->applyLin(2,2,0); return ret3D->renumberR(_mesh3D_ids->begin()); } @@ -390,7 +387,7 @@ std::string MEDCouplingExtrudedMesh::advancedRepr() const return ret.str(); } -void MEDCouplingExtrudedMesh::checkCoherency() const throw (INTERP_KERNEL::Exception) +void MEDCouplingExtrudedMesh::checkCoherency() const { } @@ -448,7 +445,7 @@ MEDCouplingUMesh *MEDCouplingExtrudedMesh::build3DUnstructuredMesh() const MEDCouplingUMesh *ret=_mesh2D->buildExtrudedMesh(_mesh1D,0); const int *renum=_mesh3D_ids->getConstPointer(); ret->renumberCells(renum,false); - ret->setName(getName().c_str()); + ret->setName(getName()); return ret; } @@ -480,7 +477,7 @@ MEDCouplingFieldDouble *MEDCouplingExtrudedMesh::getMeasureField(bool) const retPtr[renum[i*nbOf2DCells+j]]=ret2DPtr[j]*ret1DPtr[i]; ret->setArray(da); da->decrRef(); - ret->setName(name.c_str()); + ret->setName(name); ret2D->decrRef(); ret1D->decrRef(); return ret; @@ -533,7 +530,7 @@ void MEDCouplingExtrudedMesh::computeExtrusion(const MEDCouplingUMesh *mesh3D) void MEDCouplingExtrudedMesh::build1DExtrusion(int idIn3DDesc, int newId, int nbOf1DLev, MEDCouplingUMesh *subMesh, const int *desc3D, const int *descIndx3D, const int *revDesc3D, const int *revDescIndx3D, - bool computeMesh1D) throw(INTERP_KERNEL::Exception) + bool computeMesh1D) { int nbOf2DCells=_mesh2D->getNumberOfCells(); int start=revDescIndx3D[idIn3DDesc]; @@ -557,7 +554,7 @@ void MEDCouplingExtrudedMesh::build1DExtrusion(int idIn3DDesc, int newId, int nb if(computeMesh1D) computeBaryCenterOfFace(conn,i-1); current2DCell=findOppositeFaceOf(current2DCell,current3DCell,conn, - desc3D,descIndx3D,conn2D,conn2DIndx); + desc3D,descIndx3D,conn2D,conn2DIndx); start=revDescIndx3D[current2DCell]; end=revDescIndx3D[current2DCell+1]; if(end-start!=2) @@ -578,7 +575,7 @@ void MEDCouplingExtrudedMesh::build1DExtrusion(int idIn3DDesc, int newId, int nb std::sort(conn.begin(),conn.end()); computeBaryCenterOfFace(conn,nbOf1DLev-1); current2DCell=findOppositeFaceOf(current2DCell,current3DCell,conn, - desc3D,descIndx3D,conn2D,conn2DIndx); + desc3D,descIndx3D,conn2D,conn2DIndx); conn.clear(); conn.insert(conn.end(),conn2D+conn2DIndx[current2DCell]+1,conn2D+conn2DIndx[current2DCell+1]); std::sort(conn.begin(),conn.end()); @@ -588,7 +585,7 @@ void MEDCouplingExtrudedMesh::build1DExtrusion(int idIn3DDesc, int newId, int nb int MEDCouplingExtrudedMesh::findOppositeFaceOf(int current2DCell, int current3DCell, const std::vector& connSorted, const int *desc3D, const int *descIndx3D, - const int *conn2D, const int *conn2DIndx) throw(INTERP_KERNEL::Exception) + const int *conn2D, const int *conn2DIndx) { int start=descIndx3D[current3DCell]; int end=descIndx3D[current3DCell+1]; @@ -621,7 +618,7 @@ void MEDCouplingExtrudedMesh::computeBaryCenterOfFace(const std::vector& no std::transform(zoneToUpdate,zoneToUpdate+3,zoneToUpdate,std::bind2nd(std::multiplies(),(double)(1./(int)nodalConnec.size()))); } -int MEDCouplingExtrudedMesh::FindCorrespCellByNodalConn(const std::vector& nodalConnec, const int *revNodalPtr, const int *revNodalIndxPtr) throw(INTERP_KERNEL::Exception) +int MEDCouplingExtrudedMesh::FindCorrespCellByNodalConn(const std::vector& nodalConnec, const int *revNodalPtr, const int *revNodalIndxPtr) { std::vector::const_iterator iter=nodalConnec.begin(); std::set s1(revNodalPtr+revNodalIndxPtr[*iter],revNodalPtr+revNodalIndxPtr[*iter+1]); @@ -656,7 +653,7 @@ int MEDCouplingExtrudedMesh::FindCorrespCellByNodalConn(const std::vector& * @throw in case that m1 and m2 are not compatible each other. */ void MEDCouplingExtrudedMesh::Project1DMeshes(const MEDCouplingUMesh *m1, const MEDCouplingUMesh *m2, double eps, - MEDCouplingUMesh *&m1r, MEDCouplingUMesh *&m2r, double *v) throw(INTERP_KERNEL::Exception) + MEDCouplingUMesh *&m1r, MEDCouplingUMesh *&m2r, double *v) { if(m1->getSpaceDimension()!=3 || m1->getSpaceDimension()!=3) throw INTERP_KERNEL::Exception("Input meshes are expected to have a spaceDim==3 for Projec1D !"); @@ -674,7 +671,6 @@ void MEDCouplingExtrudedMesh::Project1DMeshes(const MEDCouplingUMesh *m1, const std::transform(v,v+3,v,std::bind2nd(std::multiplies(),1/n)); m1->project1D(&ref[0],v,eps,m1r->getCoords()->getPointer()); m2->project1D(&ref[0],v,eps,m2r->getCoords()->getPointer()); - } void MEDCouplingExtrudedMesh::rotate(const double *center, const double *vector, double angle) @@ -766,6 +762,12 @@ DataArrayDouble *MEDCouplingExtrudedMesh::computeIsoBarycenterOfNodesPerCell() c throw INTERP_KERNEL::Exception("MEDCouplingExtrudedMesh::computeIsoBarycenterOfNodesPerCell: not yet implemented !"); } +void MEDCouplingExtrudedMesh::getReverseNodalConnectivity(DataArrayInt *revNodal, DataArrayInt *revNodalIndx) const +{ + MEDCouplingAutoRefCountObjectPtr m(buildUnstructured()); + m->getReverseNodalConnectivity(revNodal,revNodalIndx); +} + void MEDCouplingExtrudedMesh::computeExtrusionAlg(const MEDCouplingUMesh *mesh3D) { _mesh3D_ids->alloc(mesh3D->getNumberOfCells(),1); @@ -803,18 +805,18 @@ void MEDCouplingExtrudedMesh::computeExtrusionAlg(const MEDCouplingUMesh *mesh3D for(int i=0;i nodalConnec(nodal2D+nodal2DIndx[i]+1,nodal2D+nodal2DIndx[i+1]); - try - { + std::vector nodalConnec(nodal2D+nodal2DIndx[i]+1,nodal2D+nodal2DIndx[i+1]); + try + { idInSubMesh=FindCorrespCellByNodalConn(nodalConnec,revNodal2DPtr,revNodalIndx2DPtr); - } - catch(INTERP_KERNEL::Exception& e) - { - std::ostringstream ostr; ostr << "mesh2D cell # " << i << " is not part of any cell of 3D mesh !\n"; - ostr << e.what(); - throw INTERP_KERNEL::Exception(ostr.str().c_str()); - } - build1DExtrusion(idInSubMesh,i,nbOf1DLev,subMesh,descP,descIndxP,revDescP,revDescIndxP,i==_cell_2D_id); + } + catch(INTERP_KERNEL::Exception& e) + { + std::ostringstream ostr; ostr << "mesh2D cell # " << i << " is not part of any cell of 3D mesh !\n"; + ostr << e.what(); + throw INTERP_KERNEL::Exception(ostr.str().c_str()); + } + build1DExtrusion(idInSubMesh,i,nbOf1DLev,subMesh,descP,descIndxP,revDescP,revDescIndxP,i==_cell_2D_id); } // revNodal2D->decrRef(); @@ -897,8 +899,8 @@ void MEDCouplingExtrudedMesh::serialize(DataArrayInt *&a1, DataArrayDouble *&a2) void MEDCouplingExtrudedMesh::unserialization(const std::vector& tinyInfoD, const std::vector& tinyInfo, const DataArrayInt *a1, DataArrayDouble *a2, const std::vector& littleStrings) { - setName(littleStrings[littleStrings.size()-2].c_str()); - setDescription(littleStrings.back().c_str()); + setName(littleStrings[littleStrings.size()-2]); + setDescription(littleStrings.back()); std::size_t sz=tinyInfo.size(); int sz1=tinyInfo[sz-2]; _cell_2D_id=tinyInfo[sz-3]; @@ -948,6 +950,11 @@ void MEDCouplingExtrudedMesh::reprQuickOverview(std::ostream& stream) const stream << "MEDCouplingExtrudedMesh C++ instance at " << this << ". Name : \"" << getName() << "\"."; } +std::string MEDCouplingExtrudedMesh::getVTKFileExtension() const +{ + return _mesh2D->getVTKFileExtension(); +} + std::string MEDCouplingExtrudedMesh::getVTKDataSetType() const { return _mesh2D->getVTKDataSetType();