Salome HOME
Update copyright information
[modules/smesh.git] / src / StdMeshers / StdMeshers_Distribution.cxx
index 6cfb7559784da6f7d36561980c09c3a634ecea29..f2e591f342928e4b2cb4d414d94a0a1f88956e8c 100644 (file)
@@ -1,31 +1,30 @@
-//  SMESH StdMeshers : implementaion of point distribution algorithm
+//  Copyright (C) 2007-2008  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//  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 <math_GaussSingleIntegration.hxx>
 
 #ifdef NO_CAS_CATCH
 #include <Standard_ErrorHandler.hxx>
-#else
-#include "CASCatch.hxx"
 #endif
 
+using namespace std;
+
 Function::Function( const int conv )
 : myConv( conv )
 {
@@ -56,18 +55,12 @@ bool Function::value( const double, double& f ) const
 {
   bool ok = true;
   if (myConv == 0) {
-#ifdef NO_CAS_CATCH
     try {
+#ifdef NO_CAS_CATCH
       OCC_CATCH_SIGNALS;
-#else
-    CASCatch_TRY {
 #endif
       f = pow( 10., f );
-#ifdef NO_CAS_CATCH
     } catch(Standard_Failure) {
-#else
-    } CASCatch_CATCH(Standard_Failure) {
-#endif
       Handle(Standard_Failure) aFail = Standard_Failure::Caught();
       f = 0.0;
       ok = false;
@@ -117,6 +110,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];
@@ -140,8 +139,10 @@ double FunctionTable::integral( const int i, const double d ) const
 {
   double f1,f2, res = 0.0;
   if( value( myData[2*i]+d, f1 ) )
-    if(!value(myData[2*i], f2))
+    if(!value(myData[2*i], f2)) {
       f2 = myData[2*i+1];
+      Function::value( 1, f2 );
+    }
   res = (f2+f1) * d / 2.0;
   return res;
 }
@@ -169,7 +170,7 @@ bool FunctionTable::findBounds( const double x, int& x_ind_1, int& x_ind_2 ) con
   }
 
   for( int i=0; i<n-1; i++ )
-    if( myData[2*i]<=x && x<=myData[2*(i+1)] )
+    if( myData[2*i]<=x && x<myData[2*(i+1)] )
     {
       x_ind_1 = i;
       x_ind_2 = i+1;
@@ -177,7 +178,7 @@ bool FunctionTable::findBounds( const double x, int& x_ind_1, int& x_ind_2 ) con
     }
   x_ind_1 = n-1;
   x_ind_2 = n-1;
-  return false;
+  return ( fabs( x - myData[2*x_ind_2] ) < 1.e-10 );
 }
 
 FunctionExpr::FunctionExpr( const char* str, const int conv )
@@ -186,19 +187,13 @@ FunctionExpr::FunctionExpr( const char* str, const int conv )
   myValues( 1, 1 )
 {
   bool ok = true;
-#ifdef NO_CAS_CATCH
   try {
+#ifdef NO_CAS_CATCH
     OCC_CATCH_SIGNALS;
-#else
-  CASCatch_TRY {
 #endif
     myExpr = ExprIntrp_GenExp::Create();
     myExpr->Process( ( Standard_CString )str );
-#ifdef NO_CAS_CATCH
   } catch(Standard_Failure) {
-#else
-  } CASCatch_CATCH(Standard_Failure) {
-#endif
     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
     ok = false;
   }
@@ -228,18 +223,12 @@ bool FunctionExpr::value( const double t, double& f ) const
 
   ( ( TColStd_Array1OfReal& )myValues ).ChangeValue( 1 ) = t;
   bool ok = true;
-#ifdef NO_CAS_CATCH
   try {
+#ifdef NO_CAS_CATCH
     OCC_CATCH_SIGNALS;
-#else
-  CASCatch_TRY {
 #endif
     f = myExpr->Expression()->Evaluate( myVars, myValues );
-#ifdef NO_CAS_CATCH
   } catch(Standard_Failure) {
-#else
-  } CASCatch_CATCH(Standard_Failure) {
-#endif
     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
     f = 0.0;
     ok = false;
@@ -252,21 +241,15 @@ bool FunctionExpr::value( const double t, double& f ) const
 double FunctionExpr::integral( const double a, const double b ) const
 {
   double res = 0.0;
-#ifdef NO_CAS_CATCH
   try {
+#ifdef NO_CAS_CATCH
     OCC_CATCH_SIGNALS;
-#else
-  CASCatch_TRY {
 #endif
     math_GaussSingleIntegration _int
       ( *static_cast<math_Function*>( const_cast<FunctionExpr*> (this) ), a, b, 20 );
     if( _int.IsDone() )
       res = _int.Value();
-#ifdef NO_CAS_CATCH
   } catch(Standard_Failure) {
-#else
-  } CASCatch_CATCH(Standard_Failure) {
-#endif
     res = 0.0;
     MESSAGE( "Exception in integral calculating" );
   }