]> SALOME platform Git repositories - plugins/netgenplugin.git/commitdiff
Salome HOME
Initial version
authorsmh <smh@opencascade.com>
Mon, 22 Mar 2004 12:40:16 +0000 (12:40 +0000)
committersmh <smh@opencascade.com>
Mon, 22 Mar 2004 12:40:16 +0000 (12:40 +0000)
adm_local/unix/config_files/check_Geom.m4 [new file with mode: 0644]
adm_local/unix/config_files/check_SMESH.m4 [new file with mode: 0644]
build_configure [new file with mode: 0755]
src/NETGENPlugin_NETGEN_3D.cxx [new file with mode: 0644]
src/NETGENPlugin_NETGEN_3D.hxx [new file with mode: 0644]
src/NETGENPlugin_NETGEN_3D_i.cxx [new file with mode: 0644]
src/NETGENPlugin_icons.po [new file with mode: 0644]
src/ReadMeForNgUsers [new file with mode: 0644]
src/netgen43ForSalome.patch [new file with mode: 0644]

diff --git a/adm_local/unix/config_files/check_Geom.m4 b/adm_local/unix/config_files/check_Geom.m4
new file mode 100644 (file)
index 0000000..803ca75
--- /dev/null
@@ -0,0 +1,54 @@
+# Check availability of Geom binary distribution
+#
+# Author : Nicolas REJNERI (OPEN CASCADE, 2003)
+#
+
+AC_DEFUN([CHECK_GEOM],[
+
+AC_CHECKING(for Geom)
+
+Geom_ok=no
+
+AC_ARG_WITH(geom,
+           [  --with-geom=DIR root directory path of GEOM installation ],
+           GEOM_DIR="$withval",GEOM_DIR="")
+
+if test "x$GEOM_DIR" == "x" ; then
+
+# no --with-geom-dir option used
+
+   if test "x$GEOM_ROOT_DIR" != "x" ; then
+
+    # GEOM_ROOT_DIR environment variable defined
+      GEOM_DIR=$GEOM_ROOT_DIR
+
+   else
+
+    # search Geom binaries in PATH variable
+      AC_PATH_PROG(TEMP, libGEOM_Swig.py)
+      if test "x$TEMP" != "x" ; then
+         GEOM_BIN_DIR=`dirname $TEMP`
+         GEOM_DIR=`dirname $GEOM_BIN_DIR`
+      fi
+      
+   fi
+# 
+fi
+
+if test -f ${GEOM_DIR}/bin/salome/libGEOM_Swig.py ; then
+   Geom_ok=yes
+   AC_MSG_RESULT(Using Geom module distribution in ${GEOM_DIR})
+
+   if test "x$GEOM_ROOT_DIR" == "x" ; then
+      GEOM_ROOT_DIR=${GEOM_DIR}
+   fi
+   AC_SUBST(GEOM_ROOT_DIR)
+
+else
+   AC_MSG_WARN("Cannot find compiled Geom module distribution")
+fi
+
+AC_MSG_RESULT(for Geom: $Geom_ok)
+])dnl
diff --git a/adm_local/unix/config_files/check_SMESH.m4 b/adm_local/unix/config_files/check_SMESH.m4
new file mode 100644 (file)
index 0000000..86a8264
--- /dev/null
@@ -0,0 +1,54 @@
+# Check availability of SMesh binary distribution
+#
+# Author : Nicolas REJNERI (OPEN CASCADE, 2003)
+#
+
+AC_DEFUN([CHECK_SMESH],[
+
+AC_CHECKING(for SMesh)
+
+SMesh_ok=no
+
+AC_ARG_WITH(smesh,
+           [  --with-smesh=DIR root directory path of SMESH installation ],
+           SMESH_DIR="$withval",SMESH_DIR="")
+
+if test "x$SMESH_DIR" == "x" ; then
+
+# no --with-smesh option used
+
+   if test "x$SMESH_ROOT_DIR" != "x" ; then
+
+    # SMESH_ROOT_DIR environment variable defined
+      SMESH_DIR=$SMESH_ROOT_DIR
+
+   else
+
+    # search SMESH binaries in PATH variable
+      AC_PATH_PROG(TEMP, libSMESH_Swig.py)
+      if test "x$TEMP" != "x" ; then
+         SMESH_BIN_DIR=`dirname $TEMP`
+         SMESH_DIR=`dirname $SMESH_BIN_DIR`
+      fi
+      
+   fi
+# 
+fi
+
+if test -f ${SMESH_DIR}/bin/salome/libSMESH_Swig.py ; then
+   SMesh_ok=yes
+   AC_MSG_RESULT(Using SMesh module distribution in ${SMESH_DIR})
+
+   if test "x$SMESH_ROOT_DIR" == "x" ; then
+      SMESH_ROOT_DIR=${SMESH_DIR}
+   fi
+   AC_SUBST(SMESH_ROOT_DIR)
+
+else
+   AC_MSG_WARN("Cannot find compiled SMesh module distribution")
+fi
+
+AC_MSG_RESULT(for SMesh: $SMesh_ok)
+])dnl
diff --git a/build_configure b/build_configure
new file mode 100755 (executable)
index 0000000..163b463
--- /dev/null
@@ -0,0 +1,216 @@
+#!/bin/bash
+
+#
+# Tool for updating list of .in file for the SALOME project 
+# and regenerating configure script
+#
+# Author : Marc Tajchman - CEA
+# Date : 10/10/2002
+# $Header$
+#
+
+ORIG_DIR=`pwd`
+CONF_DIR=`echo $0 | sed -e "s,[^/]*$,,;s,/$,,;s,^$,.,"`
+
+########################################################################
+# Test if the KERNEL_ROOT_DIR is set correctly
+
+if test ! -d "${KERNEL_ROOT_DIR}"; then
+    echo "failed : KERNEL_ROOT_DIR variable is not correct !"
+    exit
+fi
+
+# Test if the KERNEL_SRC is set correctly
+
+#if test ! -d "${KERNEL_SRC}"; then
+#    echo "failed : KERNEL_SRC variable is not correct !"
+#    exit
+#fi
+########################################################################
+# find_in - utility function
+#
+# usage :  
+#    find_in directory filename 
+#
+# Finds files following the *.in pattern, recursively in the
+# directory (first argument).
+# Results are appended into the file (second argument)
+#
+# Difference from the standard unix find is that files are tested
+# before directories
+# 
+
+find_in()
+{
+  local i
+  local f=$2
+
+# if the first argument is not a directory, returns
+
+  if [ ! -d "$1" ] ; then 
+     return 
+  fi
+
+# dont look in the CVS directories
+
+  case $1 in
+    */CVS) return ;;
+       */adm_local/*) return ;;
+    *) ;;
+  esac
+
+# for each regular file contained in the directory
+# test if it's a .in file
+
+  for i in "$1"/*
+  do
+     if [ -f "$i" ] ; then
+       case $i in 
+         *.in) echo "  "$i" \\" >> $f;;
+         *) ;;
+        esac
+     fi
+  done
+
+# for each subdirectory of the first argument, proceeds recursively
+
+  for i in "$1"/*
+  do
+     if [ -d "$i" ] ; then
+        find_in "$i" "$f"
+     fi
+  done
+}
+
+
+#######################################################################
+# Generate list of .in files (Makefile.in, config.h.in, etc)
+# appending it in file configure.in
+
+cd ${CONF_DIR}
+ABS_CONF_DIR=`pwd`
+
+#
+# Common part of the configure.in file
+#
+chmod u+w configure.in.base
+if ! \cp -f configure.in.base configure.in_tmp1 
+then
+       echo
+       echo "error : can't create files in" ${CONF_DIR}
+       echo "aborting ..."
+        chmod u-w configure.in.base 
+       exit
+fi
+chmod u-w configure.in.base 
+
+if [ -e "${CONF_DIR}/salome_adm" ] ; then
+    \rm -f ${CONF_DIR}/salome_adm
+fi
+
+# make a link allowing AC_OUTPUT to find the salome_adm/.../*.in  files
+echo "" >> configure.in_tmp1
+echo 'ln -fs ${KERNEL_ROOT_DIR}/salome_adm ${ROOT_SRCDIR}/salome_adm' >> configure.in_tmp1
+
+echo  "" >> configure.in_tmp1
+echo "AC_OUTPUT([ \\" >> configure.in_tmp1
+
+#
+# List of .in files in the adm/unix directory
+# These files MUST be on top of AC_OUTPUT list so we
+# put them "manually"
+#
+
+echo " ./salome_adm/unix/SALOMEconfig.h \\" >> configure.in_tmp1
+echo " ./salome_adm/unix/F77config.h \\" >> configure.in_tmp1
+echo " ./salome_adm/unix/sstream \\" >> configure.in_tmp1
+echo " ./salome_adm/unix/depend \\" >> configure.in_tmp1
+echo " ./adm_local/unix/make_omniorb \\" >> configure.in_tmp1
+echo " ./salome_adm/unix/envScript \\" >> configure.in_tmp1
+echo " ./adm_local/unix/make_commence \\" >> configure.in_tmp1
+echo " ./salome_adm/unix/make_conclude \\" >> configure.in_tmp1
+echo " ./salome_adm/unix/make_module \\" >> configure.in_tmp1
+
+\rm -f configure.in_tmp2 configure.in_tmp3
+touch configure.in_tmp2
+find_in . configure.in_tmp2
+sed -e '/^...salome_adm/d' configure.in_tmp2 >  configure.in_tmp3
+sed -e '/^...adm_local.unix.make_omniorb/d' configure.in_tmp3 configure.in_tmp2
+sed -e '/^...adm_local.unix.make_commence/d' configure.in_tmp2 > configure.in_tmp3
+sed -e '/configure.in/d' configure.in_tmp3 >  configure.in_tmp2
+sed -e 's/.in / /' configure.in_tmp2 >>  configure.in_tmp1
+#sed '/^.salome_adm/d' configure.in_tmp2 >  configure.in_tmp3
+#sed '/configure.in/d' configure.in_tmp3 >  configure.in_tmp2
+#sed 's/.in / /' configure.in_tmp2 >> configure.in_tmp1
+
+echo  "])" >> configure.in_tmp1
+
+# delete the link created for AC_OUTPUT
+echo "" >> configure.in_tmp1
+#echo 'rm -f ${ROOT_SRCDIR}/salome_adm' >> configure.in_tmp1
+\mv configure.in_tmp1 configure.in_new
+\rm  -f configure.in_tmp2 configure.in_tmp3
+
+
+########################################################################
+# Create new (or replace old) configure.in file
+# Print a message if the file is write protected
+#
+
+echo
+if test ! -f configure.in
+then
+       echo -n "Creating new file 'configure.in' ... "
+       if \mv configure.in_new configure.in >& /dev/null
+       then
+               echo "done"
+       else
+               echo "error, check your file permissions"
+       fi
+else
+       echo -n "Updating 'configure.in' file ... "
+       if ! \cp configure.in configure.in_old >& /dev/null
+       then
+               echo
+               echo
+               echo "Can't backup previous configure.in"
+               echo -n "Continue (you will not be able to revert) - (Y/N) ? "
+               read R
+                case "x$R" in
+                   xn*) exit;;
+                   xN*) exit;;
+               esac
+               echo
+               echo -n "                                 "
+       fi
+       if \cp configure.in_new configure.in >& /dev/null
+       then
+               echo "done"
+       else
+               echo
+               echo "error, can't update previous configure.in"
+       fi
+fi
+
+########################################################################
+# Use autoconf to rebuild the configure script
+#
+
+if test -f configure
+then
+       echo -n "Updating 'configure' script ...  "
+else
+       echo -n "Creating 'configure' script ...  "
+fi
+
+aclocal --acdir=adm_local/unix/config_files -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files
+if autoconf
+then
+       echo "done"
+else
+       echo "failed (check file permissions and/or user quotas ...)"
+fi
+
+cd ${ORIG_DIR}
+
+echo
diff --git a/src/NETGENPlugin_NETGEN_3D.cxx b/src/NETGENPlugin_NETGEN_3D.cxx
new file mode 100644 (file)
index 0000000..98b1e66
--- /dev/null
@@ -0,0 +1,1064 @@
+//=============================================================================
+// File      : NETGENPlugin_NETGEN_3D.cxx
+//             Moved here from SMESH_NETGEN_3D.cxx
+// Created   : lundi 27 Janvier 2003
+// Author    : Nadir BOUHAMOU (CEA)
+// Project   : SALOME
+// Copyright : CEA 2003
+// $Header$
+//=============================================================================
+using namespace std;
+
+#include "NETGENPlugin_NETGEN_3D.hxx"
+#include "SMESH_Gen.hxx"
+#include "SMESH_Mesh.hxx"
+
+#include "SMDS_MeshElement.hxx"
+#include "SMDS_MeshNode.hxx"
+#include "SMDS_FacePosition.hxx"
+
+#include <TopExp.hxx>
+#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TColStd_ListIteratorOfListOfInteger.hxx>
+
+#include <BRep_Tool.hxx>
+#include <Geom_Surface.hxx>
+#include <Geom_Curve.hxx>
+#include <Geom2d_Curve.hxx>
+
+#include "utilities.h"
+
+/*
+  Netgen include files
+*/
+
+#include "nglib.h"
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D(int hypId, int studyId,
+                            SMESH_Gen* gen)
+  : SMESH_3D_Algo(hypId, studyId, gen)
+{
+  MESSAGE("NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D");
+  _name = "NETGEN_3D";
+//   _shapeType = TopAbs_SOLID;
+  _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID);// 1 bit /shape type
+//   MESSAGE("_shapeType octal " << oct << _shapeType);
+  _compatibleHypothesis.push_back("MaxElementVolume");
+
+  _maxElementVolume = 0.;
+
+  _hypMaxElementVolume = NULL;
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+NETGENPlugin_NETGEN_3D::~NETGENPlugin_NETGEN_3D()
+{
+  MESSAGE("NETGENPlugin_NETGEN_3D::~NETGENPlugin_NETGEN_3D");
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+bool NETGENPlugin_NETGEN_3D::CheckHypothesis
+                         (SMESH_Mesh& aMesh,
+                          const TopoDS_Shape& aShape,
+                          SMESH_Hypothesis::Hypothesis_Status& aStatus)
+{
+  MESSAGE("NETGENPlugin_NETGEN_3D::CheckHypothesis");
+
+  _hypMaxElementVolume = NULL;
+
+  list<const SMESHDS_Hypothesis*>::const_iterator itl;
+  const SMESHDS_Hypothesis* theHyp;
+
+  const list<const SMESHDS_Hypothesis*>& hyps = GetUsedHypothesis(aMesh, aShape);
+  int nbHyp = hyps.size();
+  if (!nbHyp)
+  {
+    aStatus = SMESH_Hypothesis::HYP_MISSING;
+    return false;  // can't work with no hypothesis
+  }
+
+  itl = hyps.begin();
+  theHyp = (*itl); // use only the first hypothesis
+
+  string hypName = theHyp->GetName();
+  int hypId = theHyp->GetID();
+  SCRUTE(hypName);
+
+  bool isOk = false;
+
+  if (hypName == "MaxElementVolume")
+  {
+    _hypMaxElementVolume = static_cast<const StdMeshers_MaxElementVolume*> (theHyp);
+    ASSERT(_hypMaxElementVolume);
+    _maxElementVolume = _hypMaxElementVolume->GetMaxVolume();
+    isOk =true;
+    aStatus = SMESH_Hypothesis::HYP_OK;
+  }
+  else
+    aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE;
+
+  return isOk;
+}
+
+//=============================================================================
+/*!
+ *Here we are going to use the NETGEN mesher
+ */
+//=============================================================================
+
+bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
+                            const TopoDS_Shape& aShape)
+{
+  MESSAGE("NETGENPlugin_NETGEN_3D::Compute with maxElmentsize = " << _maxElementVolume);
+
+  bool isOk = false;
+  SMESHDS_Mesh* meshDS = aMesh.GetMeshDS();
+  SMESH_subMesh* theSubMesh = aMesh.GetSubMesh(aShape);
+  //const Handle(SMESHDS_SubMesh)& subMeshDS = theSubMesh->GetSubMeshDS();
+
+  map<int, const SMDS_MeshNode*> netgenToDS;
+
+  MESSAGE("NETGENPlugin_NETGEN_3D::Compute Checking the mesh Faces");
+
+  // check if all faces were meshed by a triangle mesher (here MESFISTO_2D)
+
+  vector<SMESH_subMesh*> meshFaces;
+  vector<TopoDS_Shape> shapeFaces;
+
+  for (TopExp_Explorer exp(aShape,TopAbs_FACE);exp.More();exp.Next())
+    {
+      TopoDS_Shape aShapeFace = exp.Current();
+      SMESH_subMesh* aSubMesh = aMesh.GetSubMeshContaining(exp.Current());
+      ASSERT (aSubMesh);
+      int internal_size = meshFaces.size();
+      int index = 0;
+      for (int i = 0;i<internal_size;i++)
+       {
+         if (aSubMesh == meshFaces[i]) index = 1;
+       }
+      if (index == 0) meshFaces.push_back(aSubMesh);
+
+      internal_size = shapeFaces.size();
+      index = 0;
+      for (int i = 0;i<internal_size;i++)
+       {
+         if (aShapeFace == shapeFaces[i]) index = 1;
+       }
+      if (index == 0) shapeFaces.push_back(aShapeFace);
+    }
+
+  int numberOfFaces = meshFaces.size();
+  int numberOfShapeFaces = shapeFaces.size();
+
+  SCRUTE(numberOfFaces);
+  SCRUTE(numberOfShapeFaces);
+
+  MESSAGE("---");
+
+  int NbTotOfTria = 0;
+  int NbTotOfNodesFaces = 0;
+
+  for (int i=0; i<numberOfFaces; i++)
+    {
+      TopoDS_Shape aShapeFace = meshFaces[i]->GetSubShape();
+      TopoDS_Shape aFace = shapeFaces[i];
+      SMESH_Algo* algoFace = _gen->GetAlgo(aMesh, aShapeFace);
+      string algoFaceName = algoFace->GetName();
+      SCRUTE(algoFaceName);
+      if (algoFaceName != "MEFISTO_2D")
+       {
+         SCRUTE(algoFaceName);
+         ASSERT(0);
+         return false;
+       }
+
+      bool orientationMeshFace = (aFace.Orientation() == aShapeFace.Orientation());
+
+      const SMESHDS_SubMesh* aSubMeshDSFace = meshFaces[i]->GetSubMeshDS();
+      SCRUTE(aSubMeshDSFace);
+
+      int nbNodes = aSubMeshDSFace->NbNodes();
+      NbTotOfNodesFaces += nbNodes;
+      int nbTria = aSubMeshDSFace->NbElements();
+      NbTotOfTria += nbTria;
+      int index = 0;
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute The mesh Face " << (i+1) << " has " << nbNodes << " face internal Nodes, " << nbTria << " triangles");
+
+      SCRUTE(orientationMeshFace);
+
+      if (orientationMeshFace)
+       {
+         MESSAGE("The mesh and face have the same orientation");
+       }
+      else
+       {
+         MESSAGE("The mesh and face have different orientations");
+       }
+
+      SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSFace->GetNodes();
+      SCRUTE(nbNodes);
+      index = 0;
+      while(iteratorNodes->more())
+       {
+         index++;
+         const SMDS_MeshNode * node = iteratorNodes->next();
+//       int nodeId = node->GetID();
+//       double nodeX = node->X();
+//       double nodeY = node->Y();
+//       double nodeZ = node->Z();
+//       MESSAGE("NODE -> ID = " << nodeId << " X = " << nodeX << " Y = " << nodeY << " Z = " << nodeZ);
+       }
+
+      SCRUTE(index);
+
+      SMDS_ElemIteratorPtr iteratorTriangle = aSubMeshDSFace->GetElements();
+
+      SCRUTE(nbTria);
+      index = 0;
+      int numberOfDegeneratedTriangle = 0;
+      while(iteratorTriangle->more())
+       {
+         index++;
+         const SMDS_MeshElement * triangle = iteratorTriangle->next();
+         int triangleId = triangle->GetID();
+
+         SMDS_ElemIteratorPtr triangleNodesIt = triangle->nodesIterator();
+
+         const SMDS_MeshNode * node1 = static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
+         double node1X = node1->X();
+         double node1Y = node1->Y();
+         double node1Z = node1->Z();
+
+         const SMDS_MeshNode * node2 = static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
+         double node2X = node2->X();
+         double node2Y = node2->Y();
+         double node2Z = node2->Z();
+
+         const SMDS_MeshNode * node3 = static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
+         double node3X = node3->X();
+         double node3Y = node3->Y();
+         double node3Z = node3->Z();
+
+         int triangleNode1 = node1->GetID();
+         int triangleNode2 = node2->GetID();
+         int triangleNode3 = node3->GetID();
+
+         // Compute the triangle surface
+
+         double vect1 = ((node2Y - node1Y)*(node3Z - node1Z) - (node2Z - node1Z)*(node3Y - node1Y));
+         double vect2 = - ((node2X - node1X)*(node3Z - node1Z) - (node2Z - node1Z)*(node3X - node1X));
+         double vect3 = ((node2X - node1X)*(node3Y - node1Y) - (node2Y - node1Y)*(node3X - node1X));
+         double epsilon = 1.0e-6;
+
+         bool triangleIsDegenerated = ((abs(vect1)<epsilon) && (abs(vect2)<epsilon) && (abs(vect3)<epsilon));
+
+         if (triangleIsDegenerated)
+           {
+//           MESSAGE("TRIANGLE -> ID = " << triangleId << " N1 = " << triangleNode1 << " N2 = " << triangleNode2 << " N3 = " << triangleNode3 << " is degenerated");
+//           MESSAGE("NODE -> ID = " << triangleNode1 << " X = " << node1X << " Y = " << node1Y << " Z = " << node1Z);
+//           MESSAGE("NODE -> ID = " << triangleNode2 << " X = " << node2X << " Y = " << node2Y << " Z = " << node2Z);
+//           MESSAGE("NODE -> ID = " << triangleNode3 << " X = " << node3X << " Y = " << node3Y << " Z = " << node3Z);
+             numberOfDegeneratedTriangle++;
+           }
+         else
+           {
+//           MESSAGE("TRIANGLE -> ID = " << triangleId << " N1 = " << triangleNode1 << " N2 = " << triangleNode2 << " N3 = " << triangleNode3 << " is normal");
+           }
+       }
+
+      if (numberOfDegeneratedTriangle > 0)
+       MESSAGE("WARNING THERE IS(ARE) " << numberOfDegeneratedTriangle << " degenerated triangle on this face");
+
+      SCRUTE(index);
+    }
+
+
+
+  SCRUTE(NbTotOfTria);
+  SCRUTE(NbTotOfNodesFaces);
+
+  MESSAGE("NETGENPlugin_NETGEN_3D::Compute Checking the mesh Edges");
+
+  // check if all edges were meshed by a edge mesher (here Regular_1D)
+
+  vector<SMESH_subMesh*> meshEdges;
+  for (TopExp_Explorer exp(aShape,TopAbs_EDGE);exp.More();exp.Next())
+    {
+      SMESH_subMesh* aSubMesh = aMesh.GetSubMeshContaining(exp.Current());
+      ASSERT (aSubMesh);
+      int internal_size = meshEdges.size();
+      int index = 0;
+      for (int i = 0;i<internal_size;i++)
+       {
+         if (aSubMesh == meshEdges[i]) index = 1;
+       }
+      if (index == 0) meshEdges.push_back(aSubMesh);
+    }
+
+  int numberOfEdges = meshEdges.size();
+  SCRUTE(numberOfEdges);
+
+  MESSAGE("---");
+
+  int NbTotOfNodesEdges = 0;
+  int NbTotOfSegs = 0;
+
+  for (int i=0; i<numberOfEdges; i++)
+    {
+      TopoDS_Shape aShapeEdge = meshEdges[i]->GetSubShape();
+      SMESH_Algo* algoEdge = _gen->GetAlgo(aMesh, aShapeEdge);
+      string algoEdgeName = algoEdge->GetName();
+      SCRUTE(algoEdgeName);
+      if (algoEdgeName != "Regular_1D")
+       {
+         SCRUTE(algoEdgeName);
+         ASSERT(0);
+         return false;
+       }
+
+      const SMESHDS_SubMesh* aSubMeshDSEdge = meshEdges[i]->GetSubMeshDS();
+      SCRUTE(aSubMeshDSEdge);
+
+      int nbNodes = aSubMeshDSEdge->NbNodes();
+      NbTotOfNodesEdges += nbNodes;
+      int nbSegs = aSubMeshDSEdge->NbElements();
+      NbTotOfSegs += nbSegs;
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute The mesh Edge " << (i+1) << " has " << nbNodes << " edge internal Nodes, " << nbSegs << " segments");
+
+      SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSEdge->GetNodes();
+      SCRUTE(nbNodes);
+      int index = 0;
+      while(iteratorNodes->more())
+       {
+         index++;
+         const SMDS_MeshNode * node = iteratorNodes->next();
+//       int nodeId = node->GetID();
+//       double nodeX = node->X();
+//       double nodeY = node->Y();
+//       double nodeZ = node->Z();
+//       MESSAGE("NODE -> ID = " << nodeId << " X = " << nodeX << " Y = " << nodeY << " Z = " << nodeZ);
+       }
+
+      SCRUTE(index);
+    }
+
+  SCRUTE(NbTotOfNodesEdges);
+  SCRUTE(NbTotOfSegs);
+
+  MESSAGE("NETGENPlugin_NETGEN_3D::Compute Checking the mesh Vertices");
+
+  vector<SMESH_subMesh*> meshVertices;
+  for (TopExp_Explorer exp(aShape,TopAbs_VERTEX);exp.More();exp.Next())
+    {
+      SMESH_subMesh* aSubMesh = aMesh.GetSubMeshContaining(exp.Current());
+      ASSERT (aSubMesh);
+      int internal_size = meshVertices.size();
+      int index = 0;
+      for (int i = 0;i<internal_size;i++)
+       {
+         if (aSubMesh == meshVertices[i]) index = 1;
+       }
+      if (index == 0) meshVertices.push_back(aSubMesh);
+    }
+
+  int numberOfVertices = meshVertices.size();
+  SCRUTE(numberOfVertices);
+
+  MESSAGE("---");
+
+  int NbTotOfNodesVertices = 0;
+
+  for (int i=0; i<numberOfVertices; i++)
+    {
+      TopoDS_Shape aShapeVertex = meshVertices[i]->GetSubShape();
+
+      const SMESHDS_SubMesh * aSubMeshDSVertex = meshVertices[i]->GetSubMeshDS();
+      SCRUTE(aSubMeshDSVertex);
+
+      int nbNodes = aSubMeshDSVertex->NbNodes();
+      NbTotOfNodesVertices += nbNodes;
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute The mesh Vertex " << (i+1) << " has " << nbNodes << " Nodes");
+
+      SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSVertex->GetNodes();
+      SCRUTE(nbNodes);
+      int index = 0;
+      while(iteratorNodes->more())
+       {
+         index++;
+         const SMDS_MeshNode * node = iteratorNodes->next();
+//       int nodeId = node->GetID();
+//       double nodeX = node->X();
+//       double nodeY = node->Y();
+//       double nodeZ = node->Z();
+//       MESSAGE("NODE -> ID = " << nodeId << " X = " << nodeX << " Y = " << nodeY << " Z = " << nodeZ);
+       }
+
+      SCRUTE(index);
+    }
+
+  SCRUTE(NbTotOfNodesVertices);
+
+  MESSAGE("NETGENPlugin_NETGEN_3D::Compute --> Analysis of all shell mesh");
+
+  vector<SMESH_subMesh*> meshShells;
+  TopoDS_Shell aShell;
+
+  for (TopExp_Explorer exp(aShape,TopAbs_SHELL);exp.More();exp.Next())
+    {
+      SMESH_subMesh* aSubMesh = aMesh.GetSubMesh(exp.Current());
+      ASSERT(aSubMesh);
+      SCRUTE(aSubMesh);
+      aShell = TopoDS::Shell(exp.Current());
+      meshShells.push_back(aSubMesh);
+    }
+
+  int numberOfShells = meshShells.size();
+  SCRUTE(numberOfShells);
+
+  if (numberOfShells == 1)
+    {
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute Only one shell --> generation of the mesh using directly Netgen");
+
+      /*
+       Prepare the Netgen surface mesh from the SMESHDS
+      */
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute Prepare the Netgen surface mesh from the SMESHDS");
+
+      int spaceDimension = 3;
+      int nbNodesByTri = 3;
+      int nbNodesByTetra = 4;
+
+      int Netgen_NbOfNodes = NbTotOfNodesFaces +
+                            NbTotOfNodesEdges +
+                            NbTotOfNodesVertices;
+      int Netgen_NbOfTria = NbTotOfTria;
+      int Netgen_param2ndOrder = 0;
+      double Netgen_paramFine = 1.;
+      double Netgen_paramSize = _maxElementVolume;
+
+      SCRUTE(Netgen_NbOfNodes);
+      SCRUTE(Netgen_NbOfTria);
+
+      double * Netgen_Coordinates = new double [spaceDimension*
+                                               Netgen_NbOfNodes];
+      int * listNodeCoresNetgenSmesh = new int [Netgen_NbOfNodes];
+      int * Netgen_Connectivity = new int [nbNodesByTri*Netgen_NbOfTria];
+      double * Netgen_point = new double [spaceDimension];
+      int * Netgen_triangle = new int [nbNodesByTri];
+      int * Netgen_tetrahedron = new int [nbNodesByTetra];
+
+      for (int i=0; i<Netgen_NbOfTria; i++)
+       {
+         for (int j=0; j<nbNodesByTri; j++)
+           Netgen_Connectivity[i*nbNodesByTri+j] = 0;
+       }
+
+      double bigNumber = 1.e20;
+
+      for (int i=0; i<Netgen_NbOfNodes; i++)
+       {
+         listNodeCoresNetgenSmesh[i] = 0;
+         for (int j=0; j<spaceDimension; j++)
+           Netgen_Coordinates[i*spaceDimension+j] = bigNumber;
+       }
+
+      int indexNodes = 0;
+      for (int i=0; i<numberOfVertices; i++)
+       {
+         const SMESHDS_SubMesh * aSubMeshDSVertex =
+           meshVertices[i]->GetSubMeshDS();
+
+         SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSVertex->GetNodes();
+
+         while(iteratorNodes->more())
+           {
+             const SMDS_MeshNode * node = iteratorNodes->next();
+             int nodeId = node->GetID();
+             double nodeX = node->X();
+             double nodeY = node->Y();
+             double nodeZ = node->Z();
+//           MESSAGE("NODE -> ID = " << nodeId << " X = " << nodeX << " Y = " << nodeY << " Z = " << nodeZ);
+             listNodeCoresNetgenSmesh[indexNodes] = nodeId;
+             int index = indexNodes*spaceDimension;
+             Netgen_Coordinates[index] = nodeX;
+             Netgen_Coordinates[index+1] = nodeY;
+             Netgen_Coordinates[index+2] = nodeZ;
+             netgenToDS[indexNodes] = node;
+             indexNodes++;
+           }
+       }
+
+      for (int i=0; i<numberOfEdges; i++)
+       {
+         const SMESHDS_SubMesh *  aSubMeshDSEdge =
+           meshEdges[i]->GetSubMeshDS();
+
+         SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSEdge->GetNodes();
+
+         while(iteratorNodes->more())
+           {
+             const SMDS_MeshNode * node = iteratorNodes->next();
+             int nodeId = node->GetID();
+             double nodeX = node->X();
+             double nodeY = node->Y();
+             double nodeZ = node->Z();
+//           MESSAGE("NODE -> ID = " << nodeId << " X = " << nodeX << " Y = " << nodeY << " Z = " << nodeZ);
+             listNodeCoresNetgenSmesh[indexNodes] = node->GetID();
+             int index = indexNodes*spaceDimension;
+             Netgen_Coordinates[index] = node->X();
+             Netgen_Coordinates[index+1] = node->Y();
+             Netgen_Coordinates[index+2] = node->Z();
+             netgenToDS[indexNodes] = node;
+             indexNodes++;
+           }
+       }
+
+      for (int i=0; i<numberOfFaces; i++)
+       {
+         const SMESHDS_SubMesh * aSubMeshDSFace =
+           meshFaces[i]->GetSubMeshDS();
+
+         SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSFace->GetNodes();
+
+         while(iteratorNodes->more())
+           {
+             const SMDS_MeshNode * node = iteratorNodes->next();
+             int nodeId = node->GetID();
+             double nodeX = node->X();
+             double nodeY = node->Y();
+             double nodeZ = node->Z();
+//           MESSAGE("NODE -> ID = " << nodeId << " X = " << nodeX << " Y = " << nodeY << " Z = " << nodeZ);
+             listNodeCoresNetgenSmesh[indexNodes] = nodeId;
+             int index = indexNodes*spaceDimension;
+             Netgen_Coordinates[index] = nodeX;
+             Netgen_Coordinates[index+1] = nodeY;
+             Netgen_Coordinates[index+2] = nodeZ;
+             netgenToDS[indexNodes] = node;
+             indexNodes++;
+           }
+       }
+
+      SCRUTE(indexNodes);
+
+      for (int i=0; i<Netgen_NbOfNodes; i++)
+       {
+         ASSERT(listNodeCoresNetgenSmesh[i] != 0);
+
+         for (int j=0; j<Netgen_NbOfNodes && j!=i; j++)
+           ASSERT(listNodeCoresNetgenSmesh[i] != listNodeCoresNetgenSmesh[j]);
+
+         for (int j=0; j<spaceDimension; j++)
+           ASSERT(Netgen_Coordinates[i*spaceDimension+j] != bigNumber);
+       }
+
+      int indexTrias = 0;
+      for (int i=0; i<numberOfFaces; i++)
+       {
+         const SMESHDS_SubMesh * aSubMeshDSFace =
+           meshFaces[i]->GetSubMeshDS();
+
+         TopoDS_Shape aFace = shapeFaces[i];
+
+         SMDS_ElemIteratorPtr iteratorTriangle = aSubMeshDSFace->GetElements();
+
+         TopoDS_Shape aShapeFace = meshFaces[i]->GetSubShape();
+
+         bool orientationMeshFace = (aFace.Orientation() == aShapeFace.Orientation());
+
+         SCRUTE(orientationMeshFace);
+
+         if (orientationMeshFace)
+           {
+             MESSAGE("The mesh and face have the same orientation");
+
+             while(iteratorTriangle->more())
+               {
+                 const SMDS_MeshElement * triangle = iteratorTriangle->next();
+                 int triangleId = triangle->GetID();
+
+                 SMDS_ElemIteratorPtr triangleNodesIt = triangle->nodesIterator();
+
+                 int triangleNode1 = (triangleNodesIt->next())->GetID();
+                 int triangleNode2 = (triangleNodesIt->next())->GetID();
+                 int triangleNode3 = (triangleNodesIt->next())->GetID();
+
+//               MESSAGE("TRIANGLE -> ID = " << triangleId << " N1 = " << triangleNode1 << " N2 = " << triangleNode2 << " N3 = " << triangleNode3);
+
+                 int N1New = 0;
+                 int N2New = 0;
+                 int N3New = 0;
+                 int index = indexTrias*nbNodesByTri;
+
+                 for (int j=0; j<Netgen_NbOfNodes; j++)
+                   {
+                     int jp1 = j+1;
+
+                     if (triangleNode1 == listNodeCoresNetgenSmesh[j])
+                       N1New = jp1;
+                     else if (triangleNode2 == listNodeCoresNetgenSmesh[j])
+                       N2New = jp1;
+                     else if (triangleNode3 == listNodeCoresNetgenSmesh[j])
+                       N3New = jp1;
+                   }
+
+                 triangleNode1 = N1New;
+                 triangleNode2 = N2New;
+                 triangleNode3 = N3New;
+
+                 Netgen_Connectivity[index] = triangleNode1;
+                 Netgen_Connectivity[index+1] = triangleNode2;
+                 Netgen_Connectivity[index+2] = triangleNode3;
+
+                 indexTrias++;
+               }
+           }
+         else
+           {
+             MESSAGE("The mesh and face have different orientations");
+
+             while(iteratorTriangle->more())
+               {
+                 const SMDS_MeshElement * triangle = iteratorTriangle->next();
+                 int triangleId = triangle->GetID();
+
+                 SMDS_ElemIteratorPtr triangleNodesIt = triangle->nodesIterator();
+
+                 int triangleNode1 = (triangleNodesIt->next())->GetID();
+                 int triangleNode3 = (triangleNodesIt->next())->GetID();
+                 int triangleNode2 = (triangleNodesIt->next())->GetID();
+
+//               MESSAGE("TRIANGLE -> ID = " << triangleId << " N1 = " << triangleNode1 << " N2 = " << triangleNode2 << " N3 = " << triangleNode3);
+
+                 int N1New = 0;
+                 int N2New = 0;
+                 int N3New = 0;
+                 int index = indexTrias*nbNodesByTri;
+
+                 for (int j=0; j<Netgen_NbOfNodes; j++)
+                   {
+                     int jp1 = j+1;
+
+                     if (triangleNode1 == listNodeCoresNetgenSmesh[j])
+                       N1New = jp1;
+                     else if (triangleNode2 == listNodeCoresNetgenSmesh[j])
+                       N2New = jp1;
+                     else if (triangleNode3 == listNodeCoresNetgenSmesh[j])
+                       N3New = jp1;
+                   }
+
+                 triangleNode1 = N1New;
+                 triangleNode2 = N2New;
+                 triangleNode3 = N3New;
+
+                 Netgen_Connectivity[index] = triangleNode1;
+                 Netgen_Connectivity[index+1] = triangleNode2;
+                 Netgen_Connectivity[index+2] = triangleNode3;
+
+                 indexTrias++;
+               }
+           }
+       }
+
+      SCRUTE(indexTrias);
+
+      int * nodesUsed = new int[Netgen_NbOfNodes];
+
+      for (int i=0; i<Netgen_NbOfNodes; i++) nodesUsed[i] = 0;
+
+      for (int i=0; i<Netgen_NbOfTria; i++)
+       for (int j=0; j<nbNodesByTri; j++)
+         {
+           int Nij = Netgen_Connectivity[i*nbNodesByTri+j];
+
+           ASSERT((Nij>=1) && (Nij<=Netgen_NbOfNodes));
+
+           nodesUsed[Nij-1] = 1;
+           Netgen_Connectivity[i*nbNodesByTri+j] = Nij;
+         }
+
+      for (int i=0; i<Netgen_NbOfNodes; i++)
+       {
+         ASSERT(nodesUsed[i] != 0);
+       }
+
+      delete [] nodesUsed;
+
+      /*
+       Feed the Netgen surface mesh
+      */
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute Feed the Netgen surface mesh");
+
+      Ng_Mesh * Netgen_mesh;
+
+      Ng_Init();
+
+      Netgen_mesh = Ng_NewMesh();
+
+      Ng_Meshing_Parameters Netgen_param;
+
+      for (int i=0; i<Netgen_NbOfNodes; i++)
+       {
+         for (int j=0; j<spaceDimension; j++)
+           Netgen_point[j] = Netgen_Coordinates[i*spaceDimension+j];
+
+         Ng_AddPoint(Netgen_mesh, Netgen_point);
+       }
+
+      for (int i=0; i<Netgen_NbOfTria; i++)
+       {
+         for (int j=0; j<nbNodesByTri; j++)
+           Netgen_triangle[j] = Netgen_Connectivity[i*nbNodesByTri+j];
+
+         Ng_AddSurfaceElement(Netgen_mesh, NG_TRIG, Netgen_triangle);
+       }
+
+      SCRUTE(Netgen_paramSize);
+
+      Netgen_param.secondorder = Netgen_param2ndOrder;
+      Netgen_param.fineness = Netgen_paramFine;
+      Netgen_param.maxh = Netgen_paramSize;
+
+      /*
+       Generate the volume mesh
+      */
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute Generate the volume mesh");
+
+      SCRUTE(Netgen_NbOfNodes);
+      SCRUTE(Netgen_NbOfTria);
+
+      SCRUTE(Ng_GetNP(Netgen_mesh));
+      SCRUTE(Ng_GetNE(Netgen_mesh));
+      SCRUTE(Ng_GetNSE(Netgen_mesh));
+
+      ASSERT(Netgen_NbOfNodes == Ng_GetNP(Netgen_mesh));
+      ASSERT(Ng_GetNE(Netgen_mesh) == 0);
+      ASSERT(Netgen_NbOfTria == Ng_GetNSE(Netgen_mesh));
+
+      Ng_Result status;
+
+      status = Ng_GenerateVolumeMesh(Netgen_mesh, &Netgen_param);
+
+      SCRUTE(status);
+
+      int Netgen_NbOfNodesNew = Ng_GetNP(Netgen_mesh);
+
+      int Netgen_NbOfTetra = Ng_GetNE(Netgen_mesh);
+
+      SCRUTE(Netgen_NbOfNodesNew);
+
+      SCRUTE(Netgen_NbOfTetra);
+
+      if ((status != NG_OK) ||
+         (Netgen_NbOfNodesNew <= Netgen_NbOfNodes) ||
+         (Netgen_NbOfTetra <= 0))
+       {
+         MESSAGE("NETGENPlugin_NETGEN_3D::Compute The Volume Mesh Generation has failed ...");
+         SCRUTE(status);
+
+         /*
+           Free the memory needed by to generate the Netgen Mesh
+         */
+
+         MESSAGE("NETGENPlugin_NETGEN_3D::Compute Free the memory needed by to generate the Netgen Mesh");
+
+         delete [] Netgen_Coordinates;
+         delete [] Netgen_Connectivity;
+         delete [] Netgen_point;
+         delete [] Netgen_triangle;
+         delete [] Netgen_tetrahedron;
+
+         delete [] listNodeCoresNetgenSmesh;
+
+         Ng_DeleteMesh(Netgen_mesh);
+         Ng_Exit();
+
+         return false;
+       }
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute End of Volume Mesh Generation");
+      SCRUTE(status);
+
+      double * Netgen_CoordinatesNew = new double [spaceDimension*Netgen_NbOfNodesNew];
+      int * Netgen_ConnectivityNew = new int [nbNodesByTetra*Netgen_NbOfTetra];
+
+      for (int i=0; i<Netgen_NbOfNodesNew; i++)
+       {
+         Ng_GetPoint(Netgen_mesh, (i+1), Netgen_point);
+
+         for (int j=0; j<spaceDimension; j++)
+           Netgen_CoordinatesNew[i*spaceDimension+j] = Netgen_point[j];
+       }
+
+      for (int i=0; i<Netgen_NbOfNodes; i++)
+       for (int j=0; j<spaceDimension; j++)
+         ASSERT(Netgen_CoordinatesNew[i*spaceDimension+j] == Netgen_Coordinates[i*spaceDimension+j])
+
+      for (int i=0; i<Netgen_NbOfTetra; i++)
+       {
+         Ng_GetVolumeElement(Netgen_mesh, (i+1), Netgen_tetrahedron);
+
+         for (int j=0; j<nbNodesByTetra; j++)
+           Netgen_ConnectivityNew[i*nbNodesByTetra+j] = Netgen_tetrahedron[j];
+       }
+
+      /*
+       Feed back the SMESHDS with the generated Nodes and Volume Elements
+      */
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute Feed back the SMESHDS with the generated Nodes and Volume Elements");
+
+      int NbTotOfNodesShell = Netgen_NbOfNodesNew - Netgen_NbOfNodes;
+
+      SCRUTE(NbTotOfNodesShell);
+
+      int * listNodeShellCoresNetgenSmesh = new int [NbTotOfNodesShell];
+
+      for (int i=0; i<NbTotOfNodesShell; i++)
+       listNodeShellCoresNetgenSmesh[i] = 0;
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute --> Adding the New Nodes to SMESHDS");
+
+      for (int i=0; i<NbTotOfNodesShell; i++)
+       {
+         int index = (i+Netgen_NbOfNodes)*spaceDimension;
+
+         SMDS_MeshNode * node =
+           meshDS->AddNode(Netgen_CoordinatesNew[index],
+                           Netgen_CoordinatesNew[index+1],
+                           Netgen_CoordinatesNew[index+2]);
+
+         meshDS->SetNodeInVolume(node, aShell);
+
+         index = i+Netgen_NbOfNodes;
+         netgenToDS[index] = node;
+
+         listNodeShellCoresNetgenSmesh[i] = node->GetID();
+       }
+
+      SCRUTE(Netgen_NbOfNodesNew);
+      
+      SCRUTE(netgenToDS.size());
+
+      for (int i=0; i<NbTotOfNodesShell; i++)
+       {
+         ASSERT(listNodeShellCoresNetgenSmesh[i] != 0);
+
+         for (int j=0; j<NbTotOfNodesShell && j!=i; j++)
+           ASSERT(listNodeShellCoresNetgenSmesh[i] != listNodeShellCoresNetgenSmesh[j]);
+       }
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute --> Adding the New elements (Tetrahedrons) to the SMESHDS");
+
+      for (int i=0; i<Netgen_NbOfTetra; i++)
+       {
+         int index = i*nbNodesByTetra;
+         int tetraNode1 = Netgen_ConnectivityNew[index];
+         int tetraNode2 = Netgen_ConnectivityNew[index+1];
+         int tetraNode3 = Netgen_ConnectivityNew[index+2];
+         int tetraNode4 = Netgen_ConnectivityNew[index+3];
+
+         const SMDS_MeshNode * node1 = netgenToDS[tetraNode1-1];
+         const SMDS_MeshNode * node2 = netgenToDS[tetraNode2-1];
+         const SMDS_MeshNode * node3 = netgenToDS[tetraNode3-1];
+         const SMDS_MeshNode * node4 = netgenToDS[tetraNode4-1];
+
+         index = tetraNode1;
+         if (index <= Netgen_NbOfNodes)
+           tetraNode1 = listNodeCoresNetgenSmesh[index-1];
+         else
+           tetraNode1 = listNodeShellCoresNetgenSmesh[index-Netgen_NbOfNodes-1];
+
+         index = tetraNode2;
+         if (index <= Netgen_NbOfNodes)
+           tetraNode2 = listNodeCoresNetgenSmesh[index-1];
+         else
+           tetraNode2 = listNodeShellCoresNetgenSmesh[index-Netgen_NbOfNodes-1];
+
+         index = tetraNode3;
+         if (index <= Netgen_NbOfNodes)
+           tetraNode3 = listNodeCoresNetgenSmesh[index-1];
+         else
+           tetraNode3 = listNodeShellCoresNetgenSmesh[index-Netgen_NbOfNodes-1];
+
+         index = tetraNode4;
+         if (index <= Netgen_NbOfNodes)
+           tetraNode4 = listNodeCoresNetgenSmesh[index-1];
+         else
+           tetraNode4 = listNodeShellCoresNetgenSmesh[index-Netgen_NbOfNodes-1];
+
+         SMDS_MeshVolume * elt =
+           meshDS->AddVolume(node1,node2,node3,node4);
+
+         meshDS->SetMeshElementOnShape(elt, aShell);
+       }
+
+      /*
+       Free the memory needed by to generate the Netgen Mesh
+      */
+
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute Free the memory needed by to generate the Netgen Mesh");
+
+      delete [] Netgen_Coordinates;
+      delete [] Netgen_Connectivity;
+      delete [] Netgen_CoordinatesNew;
+      delete [] Netgen_ConnectivityNew;
+      delete [] Netgen_point;
+      delete [] Netgen_triangle;
+      delete [] Netgen_tetrahedron;
+
+      delete [] listNodeCoresNetgenSmesh;
+      delete [] listNodeShellCoresNetgenSmesh;
+
+      Ng_DeleteMesh(Netgen_mesh);
+      Ng_Exit();
+
+      /*
+       Verification
+      */
+
+      {
+       MESSAGE("NETGENPlugin_NETGEN_3D::Compute Verification of the Shell mesh");
+
+       TopoDS_Shape aShapeShell = meshShells[0]->GetSubShape();
+       SMESH_Algo* algoShell = _gen->GetAlgo(aMesh, aShapeShell);
+       string algoShellName = algoShell->GetName();
+       SCRUTE(algoShellName);
+       if (algoShellName != "NETGEN_3D")
+         {
+           SCRUTE(algoShellName);
+           ASSERT(0);
+           return false;
+         }
+
+       const SMESHDS_SubMesh * aSubMeshDSShell = meshShells[0]->GetSubMeshDS();
+       SCRUTE(&aSubMeshDSShell);
+
+       int nbNodes = aSubMeshDSShell->NbNodes();
+       int nbTetra = aSubMeshDSShell->NbElements();
+
+       MESSAGE("NETGENPlugin_NETGEN_3D::Compute The mesh Shell has " << nbNodes << " shell internal Nodes, " << nbTetra << " tetrahedrons");
+
+       SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSShell->GetNodes();
+
+       SCRUTE(nbNodes);
+
+       int index;
+
+       index = 0;
+
+       while(iteratorNodes->more())
+         {
+           index++;
+           const SMDS_MeshNode * node = iteratorNodes->next();
+           int nodeId = node->GetID();
+           double nodeX = node->X();
+           double nodeY = node->Y();
+           double nodeZ = node->Z();
+//         MESSAGE("NODE -> ID = " << nodeId << " X = " << nodeX << " Y = " << nodeY << " Z = " << nodeZ);
+         }
+
+       SCRUTE(index);
+
+       SMDS_ElemIteratorPtr iteratorTetra = aSubMeshDSShell->GetElements();
+
+       SCRUTE(nbTetra);
+
+       index = 0;
+       while(iteratorTetra->more())
+         {
+           index++;
+           const SMDS_MeshElement * tetra = iteratorTetra->next();
+           int tetraId = tetra->GetID();
+
+           SMDS_ElemIteratorPtr tetraNodesIt = tetra->nodesIterator();
+
+           int tetraNode1 = (tetraNodesIt->next())->GetID();
+           int tetraNode2 = (tetraNodesIt->next())->GetID();
+           int tetraNode3 = (tetraNodesIt->next())->GetID();
+           int tetraNode4 = (tetraNodesIt->next())->GetID();
+
+//         MESSAGE("TETRAHEDRON -> ID = " << tetraId << " N1 = " << tetraNode1 << " N2 = " << tetraNode2 << " N3 = " << tetraNode3 << " N4 = " << tetraNode4);
+
+         }
+
+       SCRUTE(index);
+      }
+    }
+  else
+    {
+      SCRUTE(numberOfShells);
+      MESSAGE("NETGENPlugin_NETGEN_3D::Compute ERROR More than one shell ????? ");
+      return false;
+    }
+
+  return true;
+}
+
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+ostream & NETGENPlugin_NETGEN_3D::SaveTo(ostream & save)
+{
+  return save;
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+istream & NETGENPlugin_NETGEN_3D::LoadFrom(istream & load)
+{
+  return load;
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+ostream & operator << (ostream & save, NETGENPlugin_NETGEN_3D & hyp)
+{
+  return hyp.SaveTo( save );
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+istream & operator >> (istream & load, NETGENPlugin_NETGEN_3D & hyp)
+{
+  return hyp.LoadFrom( load );
+}
diff --git a/src/NETGENPlugin_NETGEN_3D.hxx b/src/NETGENPlugin_NETGEN_3D.hxx
new file mode 100644 (file)
index 0000000..b085880
--- /dev/null
@@ -0,0 +1,43 @@
+//=============================================================================
+// File      : NETGENPlugin_NETGEN_3D.hxx
+//             Moved here from SMESH_NETGEN_3D.hxx
+// Created   : lundi 27 Janvier 2003
+// Author    : Nadir BOUHAMOU (CEA)
+// Project   : SALOME
+// Copyright : CEA 2003
+// $Header$
+//=============================================================================
+
+#ifndef _NETGENPlugin_NETGEN_3D_HXX_
+#define _NETGENPlugin_NETGEN_3D_HXX_
+
+#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Mesh.hxx"
+#include "StdMeshers_MaxElementVolume.hxx"
+#include "Utils_SALOME_Exception.hxx"
+
+class NETGENPlugin_NETGEN_3D: public SMESH_3D_Algo
+{
+public:
+  NETGENPlugin_NETGEN_3D(int hypId, int studyId, SMESH_Gen* gen);
+  virtual ~NETGENPlugin_NETGEN_3D();
+
+  virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
+                               const TopoDS_Shape& aShape,
+                               SMESH_Hypothesis::Hypothesis_Status& aStatus);
+
+  virtual bool Compute(SMESH_Mesh& aMesh,
+                      const TopoDS_Shape& aShape);
+
+  ostream & SaveTo(ostream & save);
+  istream & LoadFrom(istream & load);
+  friend ostream & operator << (ostream & save, NETGENPlugin_NETGEN_3D & hyp);
+  friend istream & operator >> (istream & load, NETGENPlugin_NETGEN_3D & hyp);
+
+protected:
+  double _maxElementVolume;
+
+  const StdMeshers_MaxElementVolume* _hypMaxElementVolume;
+};
+
+#endif
diff --git a/src/NETGENPlugin_NETGEN_3D_i.cxx b/src/NETGENPlugin_NETGEN_3D_i.cxx
new file mode 100644 (file)
index 0000000..489d682
--- /dev/null
@@ -0,0 +1,85 @@
+//  SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
+//
+//  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 
+//
+//
+//
+//  File   : NETGENPlugin_NETGEN_3D_i.cxx
+//           Moved here from SMESH_NETGEN_3D_i.cxx
+//  Author : Nadir Bouhamou CEA
+//  Module : SMESH
+//  $Header$
+
+using namespace std;
+#include "NETGENPlugin_NETGEN_3D_i.hxx"
+#include "SMESH_Gen.hxx"
+
+#include "Utils_CorbaException.hxx"
+#include "utilities.h"
+
+//=============================================================================
+/*!
+ *  NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i
+ *
+ *  Constructor
+ */
+//=============================================================================
+
+NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA,
+                                     int                     theStudyId,
+                                     ::SMESH_Gen*            theGenImpl )
+     : SALOME::GenericObj_i( thePOA ), 
+       SMESH_Hypothesis_i( thePOA ), 
+       SMESH_Algo_i( thePOA ),
+       SMESH_3D_Algo_i( thePOA )
+{
+  MESSAGE( "NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i" );
+  myBaseImpl = new ::NETGENPlugin_NETGEN_3D( theGenImpl->GetANewId(),
+                                     theStudyId,
+                                     theGenImpl );
+}
+
+//=============================================================================
+/*!
+ *  NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i
+ *
+ *  Destructor
+ */
+//=============================================================================
+
+NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i()
+{
+  MESSAGE( "NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i" );
+}
+
+//=============================================================================
+/*!
+ *  NETGENPlugin_NETGEN_3D_i::GetImpl
+ *
+ *  Get implementation
+ */
+//=============================================================================
+
+::NETGENPlugin_NETGEN_3D* NETGENPlugin_NETGEN_3D_i::GetImpl()
+{
+  MESSAGE( "NETGENPlugin_NETGEN_3D_i::GetImpl" );
+  return ( ::NETGENPlugin_NETGEN_3D* )myBaseImpl;
+}
+
diff --git a/src/NETGENPlugin_icons.po b/src/NETGENPlugin_icons.po
new file mode 100644 (file)
index 0000000..a3f6297
--- /dev/null
@@ -0,0 +1,20 @@
+# This is a Qt message file in .po format.  Each msgid starts with
+# a scope.  This scope should *NOT* be translated - eg. "Foo::Bar"
+# would be translated to "Pub", not "Foo::Pub".
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n"
+"PO-Revision-Date: YYYY-MM-DD\n"
+"Last-Translator: FULLNAME <EMAIL@ADDRESS>\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+
+
+#-----------------------------------------------------------
+# ObjectBrowser
+#-----------------------------------------------------------
+
+#mesh_tree_algo_netgen
+msgid "ICON_SMESH_TREE_ALGO_NETGEN_3D"
+msgstr "mesh_tree_algo_tetra.png"
+#msgstr "mesh_tree_algo_netgen.png"
diff --git a/src/ReadMeForNgUsers b/src/ReadMeForNgUsers
new file mode 100644 (file)
index 0000000..555eb97
--- /dev/null
@@ -0,0 +1,102 @@
+The Netgen 4.3 from the web location : http://www.hpfem.jku.at/netgen/ is used
+in the SMESH Module of Salome2 distribution.
+
+How to build Netgen for Salome
+------------------------------
+
+Patch the official netgen 4.3 distribution:
+
+$ cd netgen43
+$ patch -p1 < patch_directory/netgen43ForSalome.patch
+
+Then run makeForSalome.sh:
+$ sh makeForSalome.sh
+
+
+Additional information for maintainers
+--------------------------------------
+
+The SMESH Engine of SALOME2 (particularly the m4 file check_Netgen.m4) assume
+that Netgen is installed in the directory <netgen_installation_path> as follow:
+
+prompt> ls <netgen_installation_path>
+
+bin/  cshrc_for_netgen  doc/  include/  lib/  tutorials/
+
+prompt> ls <netgen_installation_path>/bin
+
+LINUX/
+
+prompt> ls <netgen_installation_path>/bin/LINUX/
+
+demoapp/  ng  ng.tcl  ngtcltk/  startup.tcl
+
+prompt> ls <netgen_installation_path>/bin/LINUX/demoapp/
+
+demoapp.tcl
+
+prompt> ls <netgen_installation_path>/bin/LINUX/ngtcltk/
+
+dialog.tcl   menustat.tcl  ngicon.tcl    parameters.tcl
+drawing.tcl  nghelp.tcl    ngvisual.tcl  variables.tcl
+
+prompt> ls <netgen_installation_path>/doc/
+
+ng4.pdf  usenetgen.ps
+
+prompt> ls <netgen_installation_path>/include/
+
+nglib.h
+
+prompt> ls <netgen_installation_path>/lib/
+
+LINUX/
+
+prompt> ls <netgen_installation_path>/lib/LINUX/
+
+libcsg.a  libgeom2d.a  libla.a    libnginterface.a  libstlgeom.a
+libgen.a  libgprim.a   libmesh.a  libopti.a         libvis.a
+
+prompt> ls <netgen_installation_path>/tutorials/
+
+boxcyl.geo          cylinder.geo     ficherea.geo   part1.stl         square.in2d
+cone.geo            cylsphere.geo    hinge.stl      sculpture.geo     trafo.geo
+cubeandspheres.geo  demo2d.in2d      lshape3d.geo   shaft.geo         twobricks.geo
+cube.geo            ellipsoid.geo    manyholes.geo  sphere.geo        twocubes.geo
+cubemcyl.geo        ellipticcyl.geo  matrix.geo     sphereincube.geo  twocyl.geo
+cubemsphere.geo
+
+All *.tcl files are needed to control and initiate the Netgen mesher throughout its
+MHI (Machine Human Interface).<netgen_installation_path>/bin/LINUX/ng is the Netgen
+executable with its embarked MHI. All the libraries *.a should be compiled without
+the option -DOPENGL which is only needed for the Netgen MHI. netgen43 is assumed to
+be the directory downloaded from the above web location archive of Netgen. The library
+<netgen_installation_path>/lib/LINUX/libnginterface.a should contain the objects
+nglib.o (from netgen43/libsrc/interface/nglib.cpp) and ngnewdelete.o
+(from netgen43/ngtcltk/ngnewdelete.cpp).
+
+To have that kind of distribution from the version in the above web location you
+should first compile Netgen as suggested in the netgen43/README.INSTALL file. It will
+then produce the executable ng linked statically with the libraries *.a. Then modify
+the Makefiles to remove -DOPENGL from compiler flags list, add the objects nglib.o
+and ngnewdelete.o to the library libnginterface.a and recompile the libraries only.
+
+From the above web location perhaps, you will have to alter some Netgen sources to
+compile them; if you find any difficulties to do that, just ask me.
+
+Nadir
+
+********************************
+* Dr Nadir Bouhamou            *
+* Ingénieur-chercheur          *
+* Engineer-Researcher          *
+*                              *
+* CEA Saclay                   *
+* DEN/DM2S/SFME/LGLS           *
+* Bat 454 Pièce 5A             *
+* 91191 Gif-Sur-Yvette cédex   *
+*                              *
+* Tél: +33 (0)1 69 08 73 07    *
+* Fax: +33 (0)1 69 08 96 96    *
+* email: nadir.bouhamou@cea.fr *
+********************************
diff --git a/src/netgen43ForSalome.patch b/src/netgen43ForSalome.patch
new file mode 100644 (file)
index 0000000..5e08d88
--- /dev/null
@@ -0,0 +1,221 @@
+diff -N -r -u netgen43/libsrc/include/spline2d.hpp /tmp/netgen43/libsrc/include/spline2d.hpp
+--- netgen43/libsrc/include/spline2d.hpp       1970-01-01 01:00:00.000000000 +0100
++++ /tmp/netgen43/libsrc/include/spline2d.hpp  2003-12-10 16:28:12.000000000 +0100
+@@ -0,0 +1 @@
++#include "../geom2d/spline2d.hpp"
+diff -N -r -u netgen43/libsrc/include/splinegeometry2.hpp /tmp/netgen43/libsrc/include/splinegeometry2.hpp
+--- netgen43/libsrc/include/splinegeometry2.hpp        1970-01-01 01:00:00.000000000 +0100
++++ /tmp/netgen43/libsrc/include/splinegeometry2.hpp   2003-12-10 16:28:23.000000000 +0100
+@@ -0,0 +1 @@
++#include "../geom2d/splinegeometry2.hpp"
+diff -N -r -u netgen43/libsrc/interface/Makefile /tmp/netgen43/libsrc/interface/Makefile
+--- netgen43/libsrc/interface/Makefile 2003-05-07 16:01:43.000000000 +0200
++++ /tmp/netgen43/libsrc/interface/Makefile    2003-12-10 15:59:47.000000000 +0100
+@@ -1,4 +1,4 @@
+-src = nginterface.cpp writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp readuser.cpp importsolution.cpp
++src = writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp readuser.cpp importsolution.cpp nglib.cpp ngnewdelete.cpp
+ #
+ lib = nginterface
+ libpath = libsrc/interface
+diff -N -r -u netgen43/libsrc/interface/nglib.cpp /tmp/netgen43/libsrc/interface/nglib.cpp
+--- netgen43/libsrc/interface/nglib.cpp        2003-05-07 16:01:43.000000000 +0200
++++ /tmp/netgen43/libsrc/interface/nglib.cpp   2003-12-10 16:32:54.000000000 +0100
+@@ -23,6 +23,20 @@
+ #include "nglib.h"
++namespace netgen
++{
++  char geomfilename [100];
++
++  //Destination for messages, errors, ...
++  void Ng_PrintDest(const char * s)
++  {
++    (*mycout) << s << flush;
++  }
++
++#include <spline2d.hpp>
++#include <splinegeometry2.hpp>
++}
++
+ using namespace netgen;
+ // constants and types:
+@@ -171,8 +185,6 @@
+ // CSG Geometry
+ // FlexLexer * lexer;
+-char geomfilename [100];
+-
+ // 2D Meshing Functions:
+@@ -362,7 +374,18 @@
+         cout << "e(" << readedges.Get(i) << "," << readedges.Get(i+1) << ")" << endl;
+       }
+       */
+-      geo->AddEdges(readedges);
++
++      ARRAY< Point<3> > readedges1;
++
++      for (i = 1; i <= readedges.Size(); i++)
++      {
++        Point3d readedgesData = readedges.Get(i);
++        Point <3> readedges1Data = Point<3>(readedgesData.X(),readedgesData.Y(),readedgesData.Z());
++
++        readedges1.Append(readedges1Data);
++      }
++
++      geo->AddEdges(readedges1);
+     }
+   if (geo->GetStatus() == STLTopology::STL_GOOD || geo->GetStatus() == STLTopology::STL_WARNING) return NG_OK;
+@@ -472,7 +495,14 @@
+     n = Vec3d(nv[0],nv[1],nv[2]);
+   }
+-  readtrias.Append(STLReadTriangle(apts,n));
++  Point<3> apts1[3];
++  apts1[0] = Point<3>(p1[0],p1[1],p1[2]);
++  apts1[1] = Point<3>(p2[0],p2[1],p2[2]);
++  apts1[2] = Point<3>(p3[0],p3[1],p3[2]);
++
++  Vec<3> n1 = Vec<3>(n.X(),n.Y(),n.Z());
++
++  readtrias.Append(STLReadTriangle(apts1,n1));
+ }
+   // add (optional) edges:
+@@ -487,30 +517,29 @@
+ // compatibility functions:
+-void MyError (const char * ch)
++void netgen::MyError (const char * ch)
+ {
+   cerr << ch;
+ }
+-//Destination for messages, errors, ...
+-void Ng_PrintDest(const char * s)
+-{
+-  (*mycout) << s << flush;
+-}
+-
+-
+-double GetTime ()
++double netgen::GetTime ()
+ {
+   return 0;
+ }
+-void ResetTime ()
++void netgen::ResetTime ()
+ {
+   ;
+ }
+-void MyBeep (int i)
++void netgen::MyBeep (int i)
+ {
+   ;
+ }
++void MeshFromSpline2D (SplineGeometry2d & geometry,
++                     Mesh *& mesh, 
++                     MeshingParameters & mp)
++{
++  MeshFromSpline2D (geometry, mesh,  mp);
++}
+diff -N -r -u netgen43/libsrc/makefile.mach.LINUX /tmp/netgen43/libsrc/makefile.mach.LINUX
+--- netgen43/libsrc/makefile.mach.LINUX        2003-05-07 16:01:43.000000000 +0200
++++ /tmp/netgen43/libsrc/makefile.mach.LINUX   2003-12-10 15:12:18.000000000 +0100
+@@ -14,7 +14,8 @@
+ #
+ CFLAGS2 =
+ # pg stands for profiling - also in linkflags2
+-CPLUSPLUSFLAGS2 =  -O2 -I/usr/X11R6/include -DLINUX -DOPENGL
++#CPLUSPLUSFLAGS2 =  -O2 -I/usr/X11R6/include -DLINUX -DOPENGL
++CPLUSPLUSFLAGS2 =  -O2 -I/usr/X11R6/include -DLINUX
+ # -fomit-frame-pointer
+ # -ffast-math
+ #
+diff -N -r -u netgen43/libsrc/meshing/improve2.cpp /tmp/netgen43/libsrc/meshing/improve2.cpp
+--- netgen43/libsrc/meshing/improve2.cpp       2003-05-07 16:01:43.000000000 +0200
++++ /tmp/netgen43/libsrc/meshing/improve2.cpp  2003-12-10 15:42:00.000000000 +0100
+@@ -3,7 +3,7 @@
+ #include "meshing.hpp"
+ #include <opti.hpp>
+-#include <visual.hpp>
++/*#include <visual.hpp>*/
+ namespace netgen
+diff -N -r -u netgen43/libsrc/meshing/meshing2.cpp /tmp/netgen43/libsrc/meshing/meshing2.cpp
+--- netgen43/libsrc/meshing/meshing2.cpp       2003-05-07 16:01:43.000000000 +0200
++++ /tmp/netgen43/libsrc/meshing/meshing2.cpp  2003-12-10 15:34:35.000000000 +0100
+@@ -1785,7 +1785,7 @@
+ #else
+-void glrender (int wait)
++void netgen::glrender (int wait)
+ {
+   ;
+ } 
+diff -N -r -u netgen43/libsrc/visualization/stlmeshing.cpp /tmp/netgen43/libsrc/visualization/stlmeshing.cpp
+--- netgen43/libsrc/visualization/stlmeshing.cpp       2003-05-07 16:01:43.000000000 +0200
++++ /tmp/netgen43/libsrc/visualization/stlmeshing.cpp  2003-12-10 15:52:53.000000000 +0100
+@@ -5,7 +5,7 @@
+ #include <stlgeom.hpp>
+ #include <meshing.hpp>
+-#include <visual.hpp>
++/*#include <visual.hpp>*/
+ namespace netgen
+ {
+diff -N -r -u netgen43/Makefile /tmp/netgen43/Makefile
+--- netgen43/Makefile  2003-05-07 16:01:43.000000000 +0200
++++ /tmp/netgen43/Makefile     2003-12-10 15:11:41.000000000 +0100
+@@ -35,7 +35,8 @@
+ .SUFFIXES: .cpp .o
+ #
+ #
+-CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include  -DOPENGL
++#CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include  -DOPENGL
++CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include
+ LINKFLAGS1 =   -lGL -lGLU -lX11 -lXext -lXmu
+ #
+ CPLUSPLUSFLAGS = $(CPLUSPLUSFLAGS1) $(CPLUSPLUSFLAGS2) $(CPLUSPLUSFLAGS3)
+diff -N -r -u netgen43/makeForSalome.sh /tmp/netgen43/makeForSalome.sh
+--- netgen43/makeForSalome.sh  1970-01-01 01:00:00.000000000 +0100
++++ /tmp/netgen43/makeForSalome.sh     2004-01-05 12:33:59.000000000 +0100
+@@ -0,0 +1,26 @@
++#! /bin/sh
++cp ngtcltk/ngnewdelete.* libsrc/interface/
++
++MACHINE=LINUX
++export MACHINE
++make -C libsrc/csg
++make -C libsrc/general
++make -C libsrc/geom2d
++make -C libsrc/gprim
++make -C libsrc/interface
++make -C libsrc/linalg
++make -C libsrc/meshing
++make -C libsrc/opti
++make -C libsrc/stlgeom
++
++if [ ! -d install ] ; then
++      mkdir install
++fi
++
++cp -r lib install/
++
++if [ ! -d install/include ] ; then
++      mkdir install/include
++fi
++
++cp libsrc/interface/nglib.h install/include