X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Distribution.cxx;h=bd94993539ece756f0903a017597835786539205;hp=93858296b6bce1a77ea6492b0a75843bc5ae4d6b;hb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce;hpb=6b471bcc54cbeb90f0d977323db8c76d3d2cce09 diff --git a/src/StdMeshers/StdMeshers_Distribution.cxx b/src/StdMeshers/StdMeshers_Distribution.cxx index 93858296b..bd9499353 100644 --- a/src/StdMeshers/StdMeshers_Distribution.cxx +++ b/src/StdMeshers/StdMeshers_Distribution.cxx @@ -1,39 +1,48 @@ -// SMESH StdMeshers : implementaion of point distribution algorithm +// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// SMESH StdMeshers : implementaion of point distribution algorithm // File : StdMeshers_Distribution.cxx // Author : Alexandre SOLOVYOV // Module : SMESH // $Header$ - +// #include "StdMeshers_Distribution.hxx" -#include -#include -#include -#include + #include #include +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 +#define NO_CAS_CATCH +#endif + +#include + +#ifdef NO_CAS_CATCH +#include +#endif + +using namespace std; + Function::Function( const int conv ) : myConv( conv ) { @@ -45,20 +54,15 @@ Function::~Function() bool Function::value( const double, double& f ) const { - CASCatch_CatchSignals aCatchSignals; - aCatchSignals.Activate(); - bool ok = true; - if( myConv==0 ) - { - CASCatch_TRY - { - f = pow( 10, f ); - } - CASCatch_CATCH(CASCatch_Failure) - { - aCatchSignals.Deactivate(); - Handle(CASCatch_Failure) aFail = CASCatch_Failure::Caught(); + if (myConv == 0) { + try { +#ifdef NO_CAS_CATCH + OCC_CATCH_SIGNALS; +#endif + f = pow( 10., f ); + } catch(Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); f = 0.0; ok = false; } @@ -107,6 +111,12 @@ bool FunctionTable::value( const double t, double& f ) const if( !findBounds( t, i1, i2 ) ) return false; + if( i1==i2 ) { + f = myData[ 2*i1+1 ]; + Function::value( t, f ); + return true; + } + double x1 = myData[2*i1], y1 = myData[2*i1+1], x2 = myData[2*i2], y2 = myData[2*i2+1]; @@ -128,10 +138,13 @@ double FunctionTable::integral( const int i ) const double FunctionTable::integral( const int i, const double d ) const { - double f, res = 0.0; - if( value( myData[2*i]+d, f ) ) - res = ( myData[2*i+1] + f ) / 2.0 * d; - + double f1,f2, res = 0.0; + if( value( myData[2*i]+d, f1 ) ) + if(!value(myData[2*i], f2)) { + f2 = myData[2*i+1]; + Function::value( 1, f2 ); + } + res = (f2+f1) * d / 2.0; return res; } @@ -150,7 +163,7 @@ double FunctionTable::integral( const double a, const double b ) const bool FunctionTable::findBounds( const double x, int& x_ind_1, int& x_ind_2 ) const { - int n = myData.size(); + int n = myData.size() / 2; if( n==0 || xProcess( ( Standard_CString )str ); - } - CASCatch_CATCH(CASCatch_Failure) - { - aCatchSignals.Deactivate(); - Handle(CASCatch_Failure) aFail = CASCatch_Failure::Caught(); + } catch(Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); ok = false; } - aCatchSignals.Deactivate(); if( !ok || !myExpr->IsDone() ) myExpr.Nullify(); @@ -201,7 +209,7 @@ FunctionExpr::~FunctionExpr() { } -Standard_Boolean FunctionExpr::Value( Standard_Real T, Standard_Real& F ) +Standard_Boolean FunctionExpr::Value( const Standard_Real T, Standard_Real& F ) { double f; Standard_Boolean res = value( T, f ); @@ -214,23 +222,19 @@ bool FunctionExpr::value( const double t, double& f ) const if( myExpr.IsNull() ) return false; - OSD::SetSignal( true ); - CASCatch_CatchSignals aCatchSignals; - aCatchSignals.Activate(); - ( ( TColStd_Array1OfReal& )myValues ).ChangeValue( 1 ) = t; bool ok = true; - CASCatch_TRY { + try { +#ifdef NO_CAS_CATCH + OCC_CATCH_SIGNALS; +#endif f = myExpr->Expression()->Evaluate( myVars, myValues ); - } - CASCatch_CATCH(CASCatch_Failure) { - aCatchSignals.Deactivate(); - Handle(CASCatch_Failure) aFail = CASCatch_Failure::Caught(); + } catch(Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); f = 0.0; ok = false; } - aCatchSignals.Deactivate(); ok = Function::value( t, f ) && ok; return ok; } @@ -238,14 +242,15 @@ bool FunctionExpr::value( const double t, double& f ) const double FunctionExpr::integral( const double a, const double b ) const { double res = 0.0; - CASCatch_TRY - { - math_GaussSingleIntegration _int( ( math_Function& )*this, a, b, 20 ); + try { +#ifdef NO_CAS_CATCH + OCC_CATCH_SIGNALS; +#endif + math_GaussSingleIntegration _int + ( *static_cast( const_cast (this) ), a, b, 20 ); if( _int.IsDone() ) res = _int.Value(); - } - CASCatch_CATCH(CASCatch_Failure) - { + } catch(Standard_Failure) { res = 0.0; MESSAGE( "Exception in integral calculating" ); } @@ -299,21 +304,21 @@ double dihotomySolve( Function& f, const double val, const double _start, const } bool buildDistribution( const TCollection_AsciiString& f, const int conv, const double start, const double end, - const int nbSeg, vector& data, const double eps ) + const int nbSeg, vector& data, const double eps ) { FunctionExpr F( f.ToCString(), conv ); return buildDistribution( F, start, end, nbSeg, data, eps ); } bool buildDistribution( const std::vector& f, const int conv, const double start, const double end, - const int nbSeg, vector& data, const double eps ) + const int nbSeg, vector& data, const double eps ) { FunctionTable F( f, conv ); return buildDistribution( F, start, end, nbSeg, data, eps ); } bool buildDistribution( const Function& func, const double start, const double end, const int nbSeg, - vector& data, const double eps ) + vector& data, const double eps ) { if( nbSeg<=0 ) return false;