diff --git a/contrib/Netgen/Makefile b/contrib/Netgen/Makefile
index 1bf956cbd3fed1825db8cea782cc29907dd2773d..0ac3e23432c950e85044804e61e8832ba862b105 100644
--- a/contrib/Netgen/Makefile
+++ b/contrib/Netgen/Makefile
@@ -9,8 +9,7 @@ LIB = ../../lib/libGmshNetgen${LIBEXT}
 
 INC = ${DASH}I../../Common ${DASH}Ilibsrc/include ${DASH}Ilibsrc/interface
 
-CFLAGS = ${OPTIM} ${FLAGS} ${INC} ${SYSINCLUDE}\
-         ${DASH}DNO_PARALLEL_THREADS ${DASH}UWIN32
+CFLAGS = ${OPTIM} ${FLAGS} ${INC} ${SYSINCLUDE} ${DASH}DNO_PARALLEL_THREADS
 
 ${LIB}: recur nglib_addon${OBJEXT}
 ifneq (${UNAME},WIN32MSVC)
diff --git a/contrib/Netgen/README b/contrib/Netgen/README
index e4c737c81530711ac10a1755804fc3a22942ee80..37fb85051bd29845e57c8149554c2805a6d80d33 100644
--- a/contrib/Netgen/README
+++ b/contrib/Netgen/README
@@ -1,14 +1,17 @@
 
-This directory contains a slightly modified version of Joachim
+This directory contains a (very) slightly modified version of Joachim
 Sch\"oberl's NETGEN mesh generator:
 
 - only the libsrc directory was kept from the original distribution
 
-- the file meshing/improve2.cpp was slightly modified to fix build
-  problems on machines without TCL/TK
+- libsrc/makefile.inc was replaced
 
-- the file meshing/meshtype.hpp was slightly modified so that it
-  compiles with ISO-C++ complient compilers
+- libsrc/meshing/makefile was changed (removed some files from src)
+
+- parts of interface/nglib.cpp were #ifdef'd to remove the dependency
+  towards netgen's CAD engine
+
+All changed are marked with "MODIFIED FOR GMSH" in the source code
 
 See COPYING.LIB for license information
 
diff --git a/contrib/Netgen/VERSION b/contrib/Netgen/VERSION
index f56504b6db386468c46877585a075c83034c4220..c910f26a991e177c33fe74f3198505fc87df5866 100644
--- a/contrib/Netgen/VERSION
+++ b/contrib/Netgen/VERSION
@@ -1 +1 @@
-NG Version 4.4
\ No newline at end of file
+NG Version 4.5-development
diff --git a/contrib/Netgen/libsrc/general/Makefile b/contrib/Netgen/libsrc/general/Makefile
deleted file mode 100644
index 65a387a844db3516237ed782f0c8c302dd0dc292..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# Makefile for general purpose data types
-#
-src = array.cpp bitarray.cpp hashtabl.cpp symbolta.cpp table.cpp flags.cpp \
-	spbita2d.cpp seti.cpp optmem.cpp sort.cpp mystring.cpp parthreads.cpp \
-	moveablemem.cpp dynamicmem.cpp ngexception.cpp
-#	
-lib = gen
-libpath = libsrc/general
-#
-include ../makefile.inc
-
diff --git a/contrib/Netgen/libsrc/general/array.cpp b/contrib/Netgen/libsrc/general/array.cpp
deleted file mode 100644
index e3bc3e6fdf331c18335aa7f684b8088b0923b194..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/array.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef FILE_NGSTD_ARRAYCPP
-#define FILE_NGSTD_ARRAYCPP
-// necessary for SGI ????
-
-/**************************************************************************/
-/* File:   array.cpp                                                       */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/* 
-   Abstract data type ARRAY
-*/
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-#include <assert.h>
-
-
-namespace netgen
-{
-  using namespace netgen;
-
-#ifdef NONE  
-  void BASE_ARRAY :: ReSize (int minsize, int elementsize)
-  {
-    cout << "resize, minsize = " << minsize << endl;
-
-    if (inc == -1)
-      throw Exception ("Try to resize fixed size array");
-
-    
-    void * p;
-    int nsize = (inc) ? allocsize + inc : 2 * allocsize;
-    if (nsize < minsize) nsize = minsize;
-
-    if (data)
-      {
-	p = new char [nsize * elementsize];
-	
-	int mins = (nsize < actsize) ? nsize : actsize; 
-	memcpy (p, data, mins * elementsize);
-	
-	delete [] static_cast<char*> (data);
-	data = p;
-      }
-    else
-      {
-	data = new char[nsize * elementsize];
-      }
-    
-    allocsize = nsize;
-    cout << "resize done" << endl;
-  }
-  
-  
-  
-  void BASE_ARRAY :: RangeCheck (int i) const
-  {
-    if (i < 0 || i >= actsize)
-      throw ArrayRangeException ();
-  }
-  
-  void BASE_ARRAY :: CheckNonEmpty () const
-  {
-    if (!actsize)
-      {
-	throw Exception ("Array should not be empty");
-	//      cerr << "Array souldn't be empty";
-      }
-  }
-#endif
-}
-#endif
-
diff --git a/contrib/Netgen/libsrc/general/array.hpp b/contrib/Netgen/libsrc/general/array.hpp
deleted file mode 100644
index c953cedeffa7878be5ad4873e3f82f18e50bb7c4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/array.hpp
+++ /dev/null
@@ -1,478 +0,0 @@
-#ifndef FILE_ARRAY
-#define FILE_ARRAY
-
-/**************************************************************************/
-/* File:   array.hpp                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-
-/**
-   A simple array container.
-   Array represented by size and data-pointer.
-   No memory allocation and deallocation, must be provided by user.
-   Helper functions for printing. 
-   Optional range check by macro RANGE_CHECK
- */
-
-template <class T, int BASE = 0>
-class FlatArray
-{
-protected:
-  /// the size
-  int size;
-  /// the data
-  T * data;
-public:
-
-  /// provide size and memory
-  inline FlatArray (int asize, T * adata) 
-    : size(asize), data(adata) { ; }
-
-  /// the size
-  inline int Size() const { return size; }
-
-
-  /// access array. 
-  inline T & operator[] (int i) 
-  { 
-#ifdef DEBUG
-    if (i-BASE < 0 || i-BASE >= size)
-      cout << "array<" << typeid(T).name() << "> out of range, i = " << i << ", s = " << size << endl;
-#endif
-
-    return data[i-BASE]; 
-  }
-
-
-  /// Access array. 
-  inline const T & operator[] (int i) const
-  {
-#ifdef DEBUG
-    if (i-BASE < 0 || i-BASE >= size)
-      cout << "array<" << typeid(T).name() << "> out of range, i = " << i << ", s = " << size << endl;
-#endif
-
-    return data[i-BASE]; 
-  }
-
-  ///
-  T & Elem (int i)
-  {
-#ifdef DEBUG
-    if (i < 1 || i > size)
-      cout << "ARRAY<" << typeid(T).name() 
-	   << ">::Elem out of range, i = " << i
-	   << ", s = " << size << endl;
-#endif
-
-    return ((T*)data)[i-1]; 
-  }
-  
-  ///
-  const T & Get (int i) const 
-  {
-#ifdef DEBUG
-    if (i < 1 || i > size)
-      cout << "ARRAY<" << typeid(T).name() << ">::Get out of range, i = " << i
-	   << ", s = " << size << endl;
-#endif
-
-    return ((const T*)data)[i-1]; 
-  }
-
-  ///
-  void Set (int i, const T & el)
-  { 
-#ifdef DEBUG
-    if (i < 1 || i > size)
-      cout << "ARRAY<" << typeid(T).name() << ">::Set out of range, i = " << i
-	   << ", s = " << size << endl;
-#endif
-
-    ((T*)data)[i-1] = el; 
-  }
-
-
-  /// access last element. check by macro CHECK_RANGE
-  T & Last ()
-  {
-    return data[size-1];
-  }
-
-  /// access last element. check by macro CHECK_RANGE
-  const T & Last () const
-  {
-    return data[size-1];
-  }
-
-  /// Fill array with value val
-  FlatArray & operator= (const T & val)
-  {
-    for (int i = 0; i < size; i++)
-      data[i] = val;
-    return *this;
-  }
-};
-
-
-
-
-// print array
-template <class T, int BASE>
-inline ostream & operator<< (ostream & s, const FlatArray<T,BASE> & a)
-{
-  for (int i = BASE; i < a.Size()+BASE; i++)
-    s << i << ": " << a[i] << endl;
-  return s;
-}
-
-
-
-
-/** 
-   Dynamic array container.
-   
-   ARRAY<T> is an automatically increasing array container.
-   The allocated memory doubles on overflow. 
-   Either the container takes care of memory allocation and deallocation,
-   or the user provides one block of data.
-*/
-template <class T, int BASE = 0> 
-class ARRAY : public FlatArray<T, BASE>
-{
-protected:
-  /// physical size of array
-  int allocsize;
-  /// memory is responsibility of container
-  bool ownmem;
-
-public:
-
-  /// Generate array of logical and physical size asize
-  explicit ARRAY(int asize = 0)
-    : FlatArray<T, BASE> (asize, asize ? new T[asize] : 0)
-  {
-    allocsize = asize; 
-    ownmem = 1;
-  }
-
-  /// Generate array in user data
-  ARRAY(int asize, T* adata)
-    : FlatArray<T, BASE> (asize, adata)
-  {
-    allocsize = asize; 
-    ownmem = 0;
-  }
-
-  /// array copy 
-  explicit ARRAY (const ARRAY<T> & a2)
-    : FlatArray<T, BASE> (a2.Size(), a2.Size() ? new T[a2.Size()] : 0)
-  {
-    allocsize = this->size;
-    ownmem = 1;
-    for (int i = BASE; i < this->size+BASE; i++)
-      (*this)[i] = a2[i];
-  }
-
-
-
-  /// if responsible, deletes memory
-  ~ARRAY()
-  {
-    if (ownmem)
-      delete [] this->data;
-  }
-
-  /// Change logical size. If necessary, do reallocation. Keeps contents.
-  void SetSize(int nsize)
-  {
-    if (nsize > allocsize) 
-      ReSize (nsize);
-    this->size = nsize; 
-  }
-
-  /// Change physical size. Keeps logical size. Keeps contents.
-  void SetAllocSize (int nallocsize)
-  {
-    if (nallocsize > allocsize)
-      ReSize (nallocsize);
-  }
-
-
-  /// Add element at end of array. reallocation if necessary.
-  int Append (const T & el)
-  {
-    if (this->size == allocsize) 
-      ReSize (this->size+1);
-    this->data[this->size] = el;
-    this->size++;
-    return this->size;
-  }
-
-
-  /// Delete element i (0-based). Move last element to position i.
-  void Delete (int i)
-  {
-#ifdef CHECK_ARRAY_RANGE
-    RangeCheck (i+1);
-#endif
-
-    this->data[i] = this->data[this->size-1];
-    this->size--;
-    //    DeleteElement (i+1);
-  }
-
-
-  /// Delete element i (1-based). Move last element to position i.
-  void DeleteElement (int i)
-  {
-#ifdef CHECK_ARRAY_RANGE
-    RangeCheck (i);
-#endif
-
-    this->data[i-1] = this->data[this->size-1];
-    this->size--;
-  }
-
-  /// Delete last element. 
-  void DeleteLast ()
-  {
-    this->size--;
-  }
-
-  /// Deallocate memory
-  void DeleteAll ()
-  {
-    if (ownmem)
-      delete [] this->data;
-    this->data = 0;
-    this->size = allocsize = 0;
-  }
-
-  /// Fill array with val
-  ARRAY & operator= (const T & val)
-  {
-    FlatArray<T, BASE>::operator= (val);
-    return *this;
-  }
-
-  /// array copy
-  ARRAY & operator= (const ARRAY & a2)
-  {
-    SetSize (a2.Size());
-    for (int i = BASE; i < this->size+BASE; i++)
-      (*this)[i] = a2[i];
-    return *this;
-  }
-
-private:
-
-  /// resize array, at least to size minsize. copy contents
-  void ReSize (int minsize)
-  {
-    int nsize = 2 * allocsize;
-    if (nsize < minsize) nsize = minsize;
-
-    if (this->data)
-      {
-	T * p = new T[nsize];
-	
-	int mins = (nsize < this->size) ? nsize : this->size; 
-	memcpy (p, this->data, mins * sizeof(T));
-
-	if (ownmem)
-	  delete [] this->data;
-	ownmem = 1;
-	this->data = p;
-      }
-    else
-      {
-	this->data = new T[nsize];
-	ownmem = 1;
-      }
-    
-    allocsize = nsize;
-  }
-};
-
-
-
-template <class T, int S> 
-class ArrayMem : public ARRAY<T>
-{
-  // T mem[S];
-  // char mem[S*sizeof(T)];
-  double mem[(S*sizeof(T)+7) / 8];
-public:
-  /// Generate array of logical and physical size asize
-  explicit ArrayMem(int asize = 0)
-    : ARRAY<T> (S, static_cast<T*> (static_cast<void*>(&mem[0])))
-  {
-    this->SetSize (asize);
-  }
-
-  ArrayMem & operator= (const T & val)  
-  {
-    ARRAY<T>::operator= (val);
-    return *this;
-  }
-};
-
-
-
-
-
-
-
-
-
-
-
-///
-template <class T> class MoveableArray 
-{
-  int size;
-  int allocsize;
-  MoveableMem<T> data;
-
-public:
-
-  MoveableArray()
-  { 
-    size = allocsize = 0; 
-    data.SetName ("MoveableArray");
-  }
-
-  MoveableArray(int asize)
-    : size(asize), allocsize(asize), data(asize)
-  { ; }
-  
-  ~MoveableArray () { ; }
-
-  int Size() const { return size; }
-
-  void SetSize(int nsize)
-  {
-    if (nsize > allocsize) 
-      {
-	data.ReAlloc (nsize);
-	allocsize = nsize;
-      }
-    size = nsize;
-  }
-
-  void SetAllocSize (int nallocsize)
-  {
-    data.ReAlloc (nallocsize);
-    allocsize = nallocsize;
-  }
-
-  ///
-  T & operator[] (int i)
-  { return ((T*)data)[i]; }
-
-  ///
-  const T & operator[] (int i) const
-  { return ((const T*)data)[i]; }
-
-  ///
-  T & Elem (int i)
-  { return ((T*)data)[i-1]; }
-  
-  ///
-  const T & Get (int i) const 
-  { return ((const T*)data)[i-1]; }
-
-  ///
-  void Set (int i, const T & el)
-  { ((T*)data)[i-1] = el; }
-
-  ///
-  T & Last ()
-  { return ((T*)data)[size-1]; }
-  
-  ///
-  const T & Last () const
-  { return ((const T*)data)[size-1]; }
-  
-  ///
-  int Append (const T & el)
-  {
-    if (size == allocsize) 
-      {
-	SetAllocSize (2*allocsize+1);
-      }
-    ((T*)data)[size] = el;
-    size++;
-    return size;
-  }
-  
-  ///
-  void Delete (int i)
-  {
-    DeleteElement (i+1);
-  }
-
-  ///
-  void DeleteElement (int i)
-  {
-    ((T*)data)[i-1] = ((T*)data)[size-1];
-    size--;
-  }
-  
-  ///
-  void DeleteLast ()
-  { size--; }
-
-  ///
-  void DeleteAll ()
-  {
-    size = allocsize = 0;
-    data.Free();
-  }
-
-  ///
-  void PrintMemInfo (ostream & ost) const
-  {
-    ost << Size() << " elements of size " << sizeof(T) << " = " 
-	<< Size() * sizeof(T) << endl;
-  }
-
-  MoveableArray & operator= (const T & el)
-  {
-    for (int i = 0; i < size; i++)
-      ((T*)data)[i] = el;
-    return *this;
-  }
-
-  void SetName (char * aname)
-  {
-    data.SetName(aname);
-  }
-private:
-  ///
-  MoveableArray & operator= (MoveableArray &);
-  ///
-  MoveableArray (const MoveableArray &);
-};
-
-
-template <class T>
-inline ostream & operator<< (ostream & ost, MoveableArray<T> & a)
-{
-  for (int i = 0; i < a.Size(); i++)
-    ost << i << ": " << a[i] << endl;
-  return ost;
-}
-
-
-
-
-
-
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/general/autoptr.hpp b/contrib/Netgen/libsrc/general/autoptr.hpp
deleted file mode 100644
index b90841408bcd5e8d597e10bee5473b1956ddfa85..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/autoptr.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef FILE_AUTOPTR
-#define FILE_AUTOPTR
-
-/**************************************************************************/
-/* File:   autoptr.hpp                                                    */
-/* Author: STL, Joachim Schoeberl                                         */
-/* Date:   29. Dec. 02                                                    */
-/**************************************************************************/
-
-template <typename T>
-class AutoPtr
-{
-private:
-  T * ptr;
-public:
-  typedef T* pT;
-  explicit AutoPtr (T * p = 0)  { ptr = p; }
-  ~AutoPtr () { delete ptr; }
-  
-  T & operator*() const { return *ptr; }
-  T* operator->() const { return ptr; }
-  T *& Ptr() { return ptr; }
-  T * Ptr() const { return ptr; }
-  void Reset(T * p = 0) { if (p != ptr) { delete ptr; ptr = p; } }
-  operator bool () { return ptr != 0; }
-private:
-  AutoPtr (AutoPtr &) { ; }
-  AutoPtr & operator= (AutoPtr &) { ; }
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/bitarray.cpp b/contrib/Netgen/libsrc/general/bitarray.cpp
deleted file mode 100644
index 0d03fd5c455ac661a3927b336b7fe84fcbae546e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/bitarray.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/**************************************************************************/
-/* File:   bitarray.cc                                                    */
-/* Autho: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/* 
-   data type BitArray
-*/
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-
-namespace netgen
-{
-  using namespace netgen;
-
-  BitArray :: BitArray ()
-  {
-    size = 0;
-    data = NULL;
-  }
-
-  BitArray :: BitArray (int asize)
-  {
-    size = 0;
-    data = NULL;
-    SetSize (asize);
-  }
-
-  BitArray :: ~BitArray ()
-  {
-    delete [] data;
-  }
-
-  void BitArray :: SetSize (int asize)
-  {
-    if (size == asize) return;
-    delete [] data;
-
-    size = asize;
-    data = new unsigned char [Addr (size)+1];
-  }
-
-  void BitArray :: Set ()
-  {
-    if (!size) return;
-    for (int i = 0; i <= Addr (size); i++)
-      data[i] = UCHAR_MAX;
-  }
-
-  void BitArray :: Clear ()
-  {
-    if (!size) return;
-    for (int i = 0; i <= Addr (size); i++)
-      data[i] = 0;
-  }
-
-
-
-  void BitArray :: Invert ()
-  {
-    if (!size) return;
-    for (int i = 0; i <= Addr (size); i++)
-      data[i] ^= 255;
-  }
-
-  void BitArray :: And (const BitArray & ba2)
-  {
-    if (!size) return;
-    for (int i = 0; i <= Addr (size); i++)
-      data[i] &= ba2.data[i];
-  }
-
-
-  void BitArray :: Or (const BitArray & ba2)
-  {
-    if (!size) return;
-    for (int i = 0; i <= Addr (size); i++)
-      data[i] |= ba2.data[i];
-  }
-
-
-
-
-
-
-
-
-
-
-
-  template <int BASE>
-  void BitArrayChar<BASE> :: Set ()
-  {
-    data = 1;
-  }
-
-  template <int BASE>
-  void BitArrayChar<BASE> :: Clear ()
-  {
-    data = 0;
-  }
-
-
-  template <int BASE>
-  void BitArrayChar<BASE> :: Invert ()
-  {
-    for (int i = BASE; i < data.Size()+BASE; i++)
-      data[i] = 1 - data[i];
-  }
-
-  template <int BASE>
-  void BitArrayChar<BASE> :: And (const BitArrayChar & ba2)
-  {
-    for (int i = BASE; i < data.Size()+BASE; i++)
-      data[i] &= ba2.data[i];
-  }
-  
-
-  template <int BASE>
-  void BitArrayChar<BASE> :: Or (const BitArrayChar & ba2)
-  {
-    for (int i = BASE; i < data.Size()+BASE; i++)
-      data[i] |= ba2.data[i];
-  }
-  
-
-  template class BitArrayChar<0>;
-  template class BitArrayChar<1>;
-}
diff --git a/contrib/Netgen/libsrc/general/bitarray.hpp b/contrib/Netgen/libsrc/general/bitarray.hpp
deleted file mode 100644
index 1b7042fa5ac646337e2fd439b137aea7c3f9a3c7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/bitarray.hpp
+++ /dev/null
@@ -1,207 +0,0 @@
-#ifndef FILE_BitArray
-#define FILE_BitArray
-
-/**************************************************************************/
-/* File:   bitarray.hpp                                                   */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-#include <limits.h>
-
-/**
-   data type BitArray
-   
-   BitArray is a compressed array of Boolean information. By Set and Clear
-   the whole array or one bit can be set or reset, respectively. 
-   Test returns the state of the accoring bit.
-   No range checking is done.
-
-   index ranges from 0 to size-1
-*/
-class BitArray
-{
-  ///
-  INDEX size;
-  ///
-  unsigned char * data;
-
-public:
-  ///
-  BitArray ();
-  ///
-  BitArray (INDEX asize);
-  ///
-  ~BitArray ();
-
-  ///
-  void SetSize (INDEX asize);
-  ///
-  inline INDEX Size () const;
-
-  ///
-  void Set ();
-  ///
-  inline void Set (INDEX i);
-  ///
-  void Clear ();
-  ///
-  inline void Clear (INDEX i);
-  ///
-  inline int Test (INDEX i) const;
-  ///
-  void Invert ();
-  ///
-  void And (const BitArray & ba2);
-  ///
-  void Or (const BitArray & ba2);
-private:
-  ///
-  inline unsigned char Mask (INDEX i) const;
-  ///
-  inline INDEX Addr (INDEX i) const;
-
-  ///
-  BitArray & operator= (BitArray &);
-  ///
-  BitArray (const BitArray &);
-};
-
-
-
-
-
-// print bitarray
-inline ostream & operator<< (ostream & s, const BitArray & a)
-{
-  for (int i = 1; i <= a.Size(); i++)
-    {
-      s << a.Test(i);
-      if (i % 40 == 0) s << "\n";
-    }
-  if (a.Size() % 40 != 0) s << "\n";
-  return s;
-}
-
-
-
-inline
-INDEX BitArray :: Size () const
-  {
-  return size;
-  }
-
-inline
-unsigned char BitArray :: Mask (INDEX i) const
-  {
-  return char(1) << (i % CHAR_BIT);
-  }
-
-inline
-INDEX BitArray :: Addr (INDEX i) const
-  {
-  return (i / CHAR_BIT);
-  }
-
-inline
-void BitArray :: Set (INDEX i)
-  {
-  data[Addr(i)] |= Mask(i);
-  }
-
-inline
-void BitArray :: Clear (INDEX i)
-  {
-  data[Addr(i)] &= ~Mask(i);
-  }
-
-inline
-int BitArray :: Test (INDEX i) const
-  {
-  return (data[i / CHAR_BIT] & (char(1) << (i % CHAR_BIT) ) ) ? 1 : 0;
-  }
-
-
-
-
-
-
-
-
-/**
-   data type BitArrayChar
-   
-   BitArray is an array of Boolean information. By Set and Clear
-   the whole array or one bit can be set or reset, respectively. 
-   Test returns the state of the accoring bit.
-   No range checking is done.
-*/
-template <int BASE = 1>
-class BitArrayChar
-{
-  ///
-  ARRAY<char,BASE> data;
-
-public:
-  ///
-  BitArrayChar ()
-  { ; }
-  ///
-  BitArrayChar (int asize)
-    : data(asize)
-  { ; }
-  ///
-  ~BitArrayChar ()
-  { ; }
-
-  ///
-  void SetSize (int asize)
-  { data.SetSize(asize); }
-
-  ///
-  inline int Size () const
-  { return data.Size(); }
-
-  ///
-  void Set ();
-  ///
-  inline void Set (int i)
-  { data[i] = 1; }
-  ///
-  void Clear ();
-  ///
-  inline void Clear (int i)
-  { data[i] = 0; }
-  ///
-  inline int Test (int i) const
-  { return data[i]; }
-  ///
-  void Invert ();
-  ///
-  void And (const BitArrayChar & ba2);
-  ///
-  void Or (const BitArrayChar & ba2);
-private:
-  ///  copy bitarray is not supported
-  BitArrayChar & operator= (BitArrayChar &) { return *this; }
-  ///  copy bitarray is not supported
-  BitArrayChar (const BitArrayChar &) { ; }
-};
-
-
-
-
-template <int BASE>
-inline ostream & operator<< (ostream & s, const BitArrayChar<BASE> & a)
-{
-  for (int i = BASE; i < a.Size()+BASE; i++)
-    {
-      s << a.Test(i);
-      if ( (i-BASE) % 40 == 39) s << "\n";
-    }
-  if (a.Size() % 40 != 0) s << "\n";
-  return s;
-}
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/dynamicmem.cpp b/contrib/Netgen/libsrc/general/dynamicmem.cpp
deleted file mode 100644
index 66b22cb4a7f492e7a6a08c59a2767d51d7323c6c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/dynamicmem.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#include <iostream>
-#include <iomanip>
-
-#include <myadt.hpp>
-using namespace std;
-
-namespace netgen
-{
-
-BaseDynamicMem * BaseDynamicMem::first = 0;
-BaseDynamicMem * BaseDynamicMem::last = 0;
-
-
-BaseDynamicMem :: BaseDynamicMem ()
-{
-  prev = last;
-  next = 0;
-
-  if (last) last->next = this;
-  last = this;
-  if (!first) first = this;
-
-  size = 0;
-  ptr = 0;
-  name = 0;
-}
- 
-BaseDynamicMem :: ~BaseDynamicMem ()
-{
-  Free();
-
-  if (next) next->prev = prev;
-  else last = prev;
-  if (prev) prev->next = next;
-  else first = next;
-
-  delete [] name;
-}
-
-void BaseDynamicMem :: SetName (const char * aname)
-{
-  delete [] name;
-  if (aname)
-    {
-      name = new char[strlen(aname)+1];
-      strcpy (name, aname);
-    }
-}
-
-
-void BaseDynamicMem :: Alloc (size_t s)
-{
-  size = s;
-  // ptr = new char[s];
-  ptr = (char*)malloc (s);
-}
-
-void BaseDynamicMem :: ReAlloc (size_t s)
-{
-  if (size == s) return;
-
-  char * old = ptr;
-  // ptr = new char[s];
-  ptr = (char*)malloc(s);
-  memmove (ptr, old, (s < size) ? s : size);
-  // delete old;
-  free (old);
-  size = s;
-}
-
-void BaseDynamicMem :: Free ()
-{
-  // delete ptr;
-  free (ptr);
-  ptr = 0;
-}
-
-void BaseDynamicMem :: Swap (BaseDynamicMem & m2)
-{
-  int hi;
-  char * cp;
-  hi = size; size  = m2.size; m2.size = hi;
-  cp = ptr; ptr = m2.ptr; m2.ptr = cp;
-  cp = name; name = m2.name; m2.name = cp;
-}
-
-
-void BaseDynamicMem :: Print ()
-{
-  cout << "****************** Dynamic Mem Report ****************" << endl;
-  BaseDynamicMem * p = first;
-  int mem = 0;
-  int cnt = 0;
-  while (p)
-    {
-      mem += p->size;
-      cnt++;
-
-      cout << setw(10) << p->size << " Bytes";
-      if (p->name)
-	cout << " in block " << p->name;
-      cout << endl;
-
-      p = p->next;
-    }
-
-  if (mem > 100000000)
-    cout << "memory in dynamic memory: " << mem/1048576 << " MB" << endl;
-  else if (mem > 100000)
-    cout << "memory in dynamic memory: " << mem/1024 << " kB" << endl;
-  else
-    cout << "memory in dynamic memory: " << mem << " Bytes" << endl;
-    cout << "number of blocks:         " << cnt << endl;
-  //  cout << "******************************************************" << endl;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/general/dynamicmem.hpp b/contrib/Netgen/libsrc/general/dynamicmem.hpp
deleted file mode 100644
index 501020988e93a9cae218bff6f53ba7e00812bf59..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/dynamicmem.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef FILE_DYNAMICMEM
-#define FILE_DYNAMICMEM
-
-/**************************************************************************/
-/* File:   dynamicmem.hpp                                                 */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   12. Feb. 2003                                                  */
-/**************************************************************************/
-
-
-
-
-class BaseDynamicMem
-{
-private:
-  static BaseDynamicMem *first, *last;
-
-  BaseDynamicMem *prev, *next;
-  size_t size;
-  char * ptr;
-  char * name;
-
-protected:
-  BaseDynamicMem ();
-  ~BaseDynamicMem ();
-  void Alloc (size_t s);
-  void ReAlloc (size_t s);
-  void Free ();
-  char * Ptr() { return ptr; }
-  const char * Ptr() const { return ptr; }
-  void Swap (BaseDynamicMem & m2);
-public:
-  void SetName (const char * aname);
-  static void Print ();
-};
-
-
-template <typename T>
-class DynamicMem : public BaseDynamicMem
-{
-public:
-  DynamicMem ()
-    : BaseDynamicMem () 
-  {
-    ;
-  }
-  DynamicMem (size_t s)
-    : BaseDynamicMem () 
-  {
-    Alloc (s);
-  }
-  void Alloc (size_t s)
-  {
-    BaseDynamicMem::Alloc (sizeof(T) * s);
-  }
-  void ReAlloc (size_t s)
-  {
-    BaseDynamicMem::ReAlloc (sizeof(T) * s);
-  }
-  void Free ()
-  {
-    BaseDynamicMem::Free ();
-  }
-
-  const T * Ptr() const
-  {
-    return reinterpret_cast<const T*> (BaseDynamicMem::Ptr());
-  }
-
-  T * Ptr()
-  {
-    return reinterpret_cast<T*> (BaseDynamicMem::Ptr());
-  }
-
-  operator const T* () const
-  {
-    return reinterpret_cast<const T*> (BaseDynamicMem::Ptr());
-  }
-
-  operator T* () 
-  {
-    return reinterpret_cast<T*> (BaseDynamicMem::Ptr());
-  }
-
-  void Swap (DynamicMem<T> & m2)
-  {
-    BaseDynamicMem::Swap (m2);
-  }
-protected:
-  DynamicMem (const DynamicMem & m);
-  DynamicMem & operator= (const DynamicMem & m);
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/flags.cpp b/contrib/Netgen/libsrc/general/flags.cpp
deleted file mode 100644
index 9cce0cef2f62b26598d488fc4f85d820fedab2b9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/flags.cpp
+++ /dev/null
@@ -1,330 +0,0 @@
-/**************************************************************************/
-/* File:   flags.cc                                                       */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   10. Oct. 96                                                    */
-/**************************************************************************/
-
-/* 
-   Datatype Flags
-*/
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-namespace netgen
-{
-  using namespace netgen;
-
-  Flags :: Flags ()
-  {
-    ;
-  }
-  
-  Flags :: ~Flags ()
-  {
-    DeleteFlags ();
-  }
-  
-  void Flags :: DeleteFlags ()
-  {
-    for (int i = 0; i < strflags.Size(); i++)
-      delete [] strflags[i];
-    for (int i = 0; i < numlistflags.Size(); i++)
-      delete numlistflags[i];
-    strflags.DeleteAll();
-    numflags.DeleteAll();
-    defflags.DeleteAll();
-    strlistflags.DeleteAll();
-    numlistflags.DeleteAll();
-  }
-  
-  void Flags :: SetFlag (const char * name, const char * val)
-  {
-    char * hval = new char[strlen (val) + 1];
-    strcpy (hval, val);
-    strflags.Set (name, hval);
-  }
-  
-  void Flags :: SetFlag (const char * name, double val)
-  {
-    numflags.Set (name, val);
-  }
-  
-  void Flags :: SetFlag (const char * name)
-  {
-    defflags.Set (name, 1);
-  }
-
-
-  void Flags :: SetFlag (const char * name, const ARRAY<char*> & val)
-  {
-    ARRAY<char*> * strarray = new ARRAY<char*>;
-    for (int i = 1; i <= val.Size(); i++)
-      {
-	strarray->Append (new char[strlen(val.Get(i))+1]);
-	strcpy (strarray->Last(), val.Get(i));
-      }
-    strlistflags.Set (name, strarray);
-  }
-
-  void Flags :: SetFlag (const char * name, const ARRAY<double> & val)
-  {
-    ARRAY<double> * numarray = new ARRAY<double>;
-    for (int i = 1; i <= val.Size(); i++)
-      numarray->Append (val.Get(i));
-    numlistflags.Set (name, numarray);
-  }
-
-
-
-
-  
-  const char * 
-  Flags :: GetStringFlag (const char * name, const char * def) const
-  {
-    if (strflags.Used (name))
-      return strflags.Get(name);
-    else
-      return def;
-  }
-
-  double Flags :: GetNumFlag (const char * name, double def) const
-  {
-    if (numflags.Used (name))
-      return numflags.Get(name);
-    else
-      return def;
-  }
-  
-  const double * Flags :: GetNumFlagPtr (const char * name) const
-  {
-    if (numflags.Used (name))
-      return & ((SYMBOLTABLE<double>&)numflags).Elem(name);
-    else
-      return NULL;
-  }
-  
-  double * Flags :: GetNumFlagPtr (const char * name) 
-  {
-    if (numflags.Used (name))
-      return & ((SYMBOLTABLE<double>&)numflags).Elem(name);
-    else
-      return NULL;
-  }
-  
-  int Flags :: GetDefineFlag (const char * name) const
-  {
-    return defflags.Used (name);
-  }
-
-
-  const ARRAY<char*> & 
-  Flags :: GetStringListFlag (const char * name) const
-  {
-    if (strlistflags.Used (name))
-      return *strlistflags.Get(name);
-    else
-      {
-	static ARRAY<char*> hstra(0);
-	return hstra;
-      }
-  }
-
-  const ARRAY<double> & 
-  Flags ::GetNumListFlag (const char * name) const
-  {
-    if (numlistflags.Used (name))
-      return *numlistflags.Get(name);
-    else
-      {
-	static ARRAY<double> hnuma(0);
-	return hnuma;
-      }
-  }
-
-
-  int Flags :: StringFlagDefined (const char * name) const
-  {
-    return strflags.Used (name);
-  }
-
-  int Flags :: NumFlagDefined (const char * name) const
-  {
-    return numflags.Used (name);
-  }
-
-  int Flags :: StringListFlagDefined (const char * name) const
-  {
-    return strlistflags.Used (name);
-  }
-
-  int Flags :: NumListFlagDefined (const char * name) const
-  {
-    return numlistflags.Used (name);
-  }
-
-
-  void Flags :: SaveFlags (const char * filename) const 
-  {
-    int i;
-    ofstream outfile (filename);
-  
-    for (i = 1; i <= strflags.Size(); i++)
-      outfile << strflags.GetName(i) << " = " << strflags.Get(i) << endl;
-    for (i = 1; i <= numflags.Size(); i++)
-      outfile << numflags.GetName(i) << " = " << numflags.Get(i) << endl;
-    for (i = 1; i <= defflags.Size(); i++)
-      outfile << defflags.GetName(i) << endl;
-  }
- 
-
-
-  void Flags :: PrintFlags (ostream & ost) const 
-  {
-    int i;
-  
-    for (i = 1; i <= strflags.Size(); i++)
-      ost << strflags.GetName(i) << " = " << strflags.Get(i) << endl;
-    for (i = 1; i <= numflags.Size(); i++)
-      ost << numflags.GetName(i) << " = " << numflags.Get(i) << endl;
-    for (i = 1; i <= defflags.Size(); i++)
-      ost << defflags.GetName(i) << endl;
-  }
- 
-
-  void Flags :: LoadFlags (const char * filename) 
-  {
-    char name[100], str[100];
-    char ch;
-    double val;
-    ifstream infile(filename);
-
-    //  (*logout) << "Load flags from " << filename << endl << endl;
-    while (infile.good())
-      {
-	infile >> name;
-	if (strlen (name) == 0) break;
-
-	if (name[0] == '/' && name[1] == '/')
-	  {
-	    //	  (*logout) << "comment: ";
-	    ch = 0;
-	    while (ch != '\n' && infile.good())
-	      {
-		ch = infile.get();
-		//	      (*logout) << ch;
-	      }
-	    continue;
-	  }
-
-	//      (*logout)  << name;
-	ch = 0;
-	infile >> ch;
-	if (ch != '=')
-	  {
-	    //	  (*logout) << endl;
-	    infile.putback (ch);
-	    SetFlag (name);
-	  }
-	else
-	  {
-	    infile >> val;
-	    if (!infile.good())
-	      {
-		infile.clear();
-		infile >> str;
-		SetFlag (name, str);
-		//	      (*logout) << " = " << str << endl;
-	      }
-	    else
-	      {
-		SetFlag (name, val);
-		//	      (*logout) << " = " << val << endl;
-	      }
-	  }
-      }
-    //  (*logout) << endl;
-  }
-
-
-  void Flags :: SetCommandLineFlag (const char * st)
-  {
-    //  cout << "clflag = " << st << endl;
-    istringstream inst( (char *)st);
-    // istrstream defined with char *  (not const char *  ?????)
-
-    char name[100];
-    double val;
-
-
-    if (st[0] != '-')
-      {
-	cerr << "flag must start with '-'" << endl;
-	return;
-      }
-  
-    const char * pos = strchr (st, '=');
-  
-    if (!pos)
-      {
-	//      (cout) << "Add def flag: " << st+1 << endl;
-	SetFlag (st+1);
-      }
-    else
-      {
-	//      cout << "pos = " << pos << endl;
-
-	strncpy (name, st+1, (pos-st)-1);
-	name[pos-st-1] = 0;
-
-	//      cout << "name = " << name << endl;
-
-	pos++;
-	char * endptr = NULL;
-
-	val = strtod (pos, &endptr);
-
-	//      cout << "val = " << val << endl;
-
-	if (endptr == pos)
-	  {
-	    //	  (cout) << "Add String Flag: " << name << " = " << pos << endl;
-	    SetFlag (name, pos);
-	  }
-	else
-	  {
-	    //	  (cout) << "Add Num Flag: " << name << " = " << val << endl;
-	    SetFlag (name, val);
-	  }
-      }
-
-
-    /*
-      inst >> name;
-      (*mycout) << "name = " << name << endl;
-
-      ch = 0;
-      inst >> ch;
-      if (ch != '=')
-      {
-      SetFlag (name);
-      }
-      else
-      {
-      inst >> val;
-      if (!inst.good())
-      {
-      inst.clear();
-      inst >> str;
-      SetFlag (name, str);
-      (*mycout) << "str = " << str << endl;
-      }
-      else
-      {
-      SetFlag (name, val);
-      (*mycout) << "val = " << val << endl;
-      }
-      }
-    */
-  }
-}
diff --git a/contrib/Netgen/libsrc/general/flags.hpp b/contrib/Netgen/libsrc/general/flags.hpp
deleted file mode 100644
index 7c62f7815b2e7c34ae1a49c4aefaa3eafbee1cb3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/flags.hpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef FILE_FLAGS
-#define FILE_FLAGS
-
-
-/**************************************************************************/
-/* File:   flags.hh                                                       */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   10. Oct. 96                                                   */
-/**************************************************************************/
-
-/** 
-   Flag - Table.
-   A flag table maintains string variables, numerical 
-   variables and boolean flags.
-*/
-class Flags 
-{
-  ///
-  SYMBOLTABLE<char *> strflags;
-  ///
-  SYMBOLTABLE<double> numflags;
-  ///
-  SYMBOLTABLE<int> defflags;
-  ///
-  SYMBOLTABLE<ARRAY<char*>*> strlistflags;
-  ///
-  SYMBOLTABLE<ARRAY<double>*> numlistflags;
-public:
-  ///
-  Flags ();
-  ///
-  ~Flags ();
-  
-  /// Deletes all flags
-  void DeleteFlags ();
-  /// Sets string flag, overwrite if exists
-  void SetFlag (const char * name, const char * val);
-  /// Sets numerical flag, overwrite if exists
-  void SetFlag (const char * name, double val);
-  /// Sets boolean flag
-  void SetFlag (const char * name);
-  /// Sets string arary falg
-  void SetFlag (const char * name, const ARRAY<char*> & val);
-  /// Sets double array flag
-  void SetFlag (const char * name, const ARRAY<double> & val);
-  
-  /// Save flags to file
-  void SaveFlags (const char * filename) const;
-  /// write flags to stream
-  void PrintFlags (ostream & ost) const;
-  /// Load flags from file
-  void LoadFlags (const char * filename);
-  /// set flag of form -name=hello -val=0.5 -defined
-  void SetCommandLineFlag (const char * st);
-
-  /// Returns string flag, default value if not exists
-  const char * GetStringFlag (const char * name, const char * def) const;
-  /// Returns numerical flag, default value if not exists
-  double GetNumFlag (const char * name, double def) const;
-  /// Returns address of numerical flag, null if not exists
-  const double * GetNumFlagPtr (const char * name) const;
-  /// Returns address of numerical flag, null if not exists
-  double * GetNumFlagPtr (const char * name);
-  /// Returns boolean flag
-  int GetDefineFlag (const char * name) const;
-  /// Returns string list flag, empty array if not exist
-  const ARRAY<char*> & GetStringListFlag (const char * name) const;
-  /// Returns num list flag, empty array if not exist
-  const ARRAY<double> & GetNumListFlag (const char * name) const;
-
-
-  /// Test, if string flag is defined
-  int StringFlagDefined (const char * name) const;
-  /// Test, if num flag is defined
-  int NumFlagDefined (const char * name) const;
-  /// Test, if string list flag is defined
-  int StringListFlagDefined (const char * name) const;
-  /// Test, if num list flag is defined
-  int NumListFlagDefined (const char * name) const;
-};
-  
-#endif
-
diff --git a/contrib/Netgen/libsrc/general/hashtabl.cpp b/contrib/Netgen/libsrc/general/hashtabl.cpp
deleted file mode 100644
index 0485ab60454f9e171cd51a2b1e6d781d46f89789..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/hashtabl.cpp
+++ /dev/null
@@ -1,294 +0,0 @@
-/**************************************************************************/
-/* File:   hashtabl.cpp                                                   */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/* 
-   Abstract data type HASHTABLE
-*/
-
-#include <algorithm>
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-namespace netgen
-{
-  using namespace netgen;
-
-  void INDEX_4 :: Sort ()
-  {
-    if (i[0] > i[1]) Swap (i[0], i[1]);
-    if (i[2] > i[3]) Swap (i[2], i[3]);
-    if (i[0] > i[2]) Swap (i[0], i[2]);
-    if (i[1] > i[3]) Swap (i[1], i[3]);
-    if (i[1] > i[2]) Swap (i[1], i[2]);
-  }
-
-
-
-  void INDEX_4Q :: Sort ()
-  {
-    if (min2 (i[1], i[2]) < min2 (i[0], i[3]))
-      { Swap (i[0], i[1]); Swap (i[2], i[3]);}
-    if (i[3] < i[0])
-      { Swap (i[0], i[3]); Swap (i[1], i[2]);}
-    if (i[3] < i[1])
-      { Swap (i[1], i[3]); }
-  }
-
-
-  ostream & operator<<(ostream  & s, const INDEX_2 & i2)
-  {
-    return s << i2.I1() << ", " << i2.I2();
-  }
-
-  ostream & operator<<(ostream  & s, const INDEX_3 & i3)
-  {
-    return s << i3.I1() << ", " << i3.I2() << ", " << i3.I3();
-  }
-
-  ostream & operator<<(ostream  & s, const INDEX_4 & i4)
-  {
-    return s << i4.I1() << ", " << i4.I2() << ", " << i4.I3() << ", " << i4.I4();
-  }
-
-  ostream & operator<<(ostream  & s, const INDEX_4Q & i4)
-  {
-    return s << i4.I1() << ", " << i4.I2() << ", " << i4.I3() << ", " << i4.I4();
-  }
-
-
-  int BASE_INDEX_HASHTABLE :: Position (int bnr, const INDEX & ind) const
-  {
-    int i;
-    for (i = 1; i <= hash.EntrySize (bnr); i++)
-      if (hash.Get(bnr, i) == ind)
-	return i;
-    return 0;
-  }
-
-
-
-  /*
-  int BASE_INDEX_2_HASHTABLE :: Position (int bnr, const INDEX_2 & ind) const
-  {
-    int i;
-    for (i = 1; i <= hash.EntrySize (bnr); i++)
-      if (hash.Get(bnr, i) == ind)
-	return i;
-    return 0;
-  }
-  */  
-
-  void BASE_INDEX_2_HASHTABLE :: PrintStat (ostream & ost) const
-  {
-    int n = hash.Size();
-    int i;
-    int sumn = 0, sumnn = 0;
-
-    for (i = 1; i <= n; i++)
-      {
-	sumn += hash.EntrySize(i);
-	sumnn += sqr (hash.EntrySize(i));
-      }
-
-    ost << "Hashtable: " << endl
-	<< "size             : " << n << endl
-	<< "elements per row : " << (double(sumn) / double(n)) << endl
-	<< "av. acces time   : " 
-	<< (sumn ? (double (sumnn) / double(sumn)) : 0) << endl;
-  }
-
-
-  /*
-    int BASE_INDEX_3_HASHTABLE :: Position (int bnr, const INDEX_3 & ind) const
-    {
-    int i;
-    const INDEX_3 * pi = &hash.Get(bnr, 1);
-    int n = hash.EntrySize(bnr);
-    for (i = 1; i <= n; ++i, ++pi)
-    {
-    if (*pi == ind)
-    return i;
-    }
-
-    return 0;
-    }
-  */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  BASE_INDEX_2_CLOSED_HASHTABLE ::
-  BASE_INDEX_2_CLOSED_HASHTABLE (int size)
-    : hash(size)
-  {
-    hash.SetName ("i2-hashtable, hash");
-
-    invalid = -1;
-    int i;
-    for (i = 1; i <= size; i++)
-      hash.Elem(i).I1() = invalid;
-  }
-
-  void BASE_INDEX_2_CLOSED_HASHTABLE ::
-  BaseSetSize (int size)
-  {
-    int i;
-    hash.SetSize(size);
-    for (i = 1; i <= size; i++)
-      hash.Elem(i).I1() = invalid;
-  }
-
-
-  int BASE_INDEX_2_CLOSED_HASHTABLE ::
-  Position2 (const INDEX_2 & ind) const
-  {
-    int i;
-
-    i = HashValue(ind);
-    while (1)
-      {
-	i++;
-	if (i > hash.Size()) i = 1;
-	if (hash.Get(i) == ind) return i;
-	if (hash.Get(i).I1() == invalid) return 0;
-      }
-  }
-
-
-
-  int BASE_INDEX_2_CLOSED_HASHTABLE ::
-  PositionCreate2 (const INDEX_2 & ind, int & apos) 
-  {
-    int i;
-
-    i = HashValue(ind);
-    while (1)
-      {
-	i++;
-	if (i > hash.Size()) i = 1;
-	if (hash.Get(i) == ind) 
-	  {
-	    apos = i;
-	    return 0;
-	  }
-	if (hash.Get(i).I1() == invalid) 
-	  {
-	    hash.Elem(i) = ind;
-	    apos = i;
-	    return 1;
-	  }
-      }
-  }
-
-  int BASE_INDEX_2_CLOSED_HASHTABLE :: UsedElements () const
-  {
-    int i, n = hash.Size();
-    int cnt = 0;
-    for (i = 1; i <= n; i++)
-      if (hash.Get(i).I1() != invalid)
-	cnt++;
-    return cnt;
-  }
-
-
-
-
-
-
-
-
-
-
-
-  BASE_INDEX_3_CLOSED_HASHTABLE ::
-  BASE_INDEX_3_CLOSED_HASHTABLE (int size)
-    : hash(size)
-  {
-    hash.SetName ("i3-hashtable, hash");
-
-    invalid = -1;
-    int i;
-    for (i = 1; i <= size; i++)
-      hash.Elem(i).I1() = invalid;
-  }
-
-  void BASE_INDEX_3_CLOSED_HASHTABLE ::
-  BaseSetSize (int size)
-  {
-    int i;
-    hash.SetSize(size);
-    for (i = 1; i <= size; i++)
-      hash.Elem(i).I1() = invalid;
-  }
-
-
-  int BASE_INDEX_3_CLOSED_HASHTABLE ::
-  Position2 (const INDEX_3 & ind) const
-  {
-    int i;
-
-    i = HashValue(ind);
-    while (1)
-      {
-	i++;
-	if (i > hash.Size()) i = 1;
-	if (hash.Get(i) == ind) return i;
-	if (hash.Get(i).I1() == invalid) return 0;
-      }
-  }
-
-
-
-  int BASE_INDEX_3_CLOSED_HASHTABLE ::
-  PositionCreate2 (const INDEX_3 & ind, int & apos) 
-  {
-    int i;
-
-    i = HashValue(ind);
-    while (1)
-      {
-	i++;
-	if (i > hash.Size()) i = 1;
-	if (hash.Get(i) == ind) 
-	  {
-	    apos = i;
-	    return 0;
-	  }
-	if (hash.Get(i).I1() == invalid) 
-	  {
-	    hash.Elem(i) = ind;
-	    apos = i;
-	    return 1;
-	  }
-      }
-  }
-
-  int BASE_INDEX_3_CLOSED_HASHTABLE :: UsedElements () const
-  {
-    int i, n = hash.Size();
-    int cnt = 0;
-    for (i = 1; i <= n; i++)
-      if (hash.Get(i).I1() != invalid)
-	cnt++;
-    return cnt;
-  }
-
-
-}
-
diff --git a/contrib/Netgen/libsrc/general/hashtabl.hpp b/contrib/Netgen/libsrc/general/hashtabl.hpp
deleted file mode 100644
index b3e0e93f7e0ca5800eb93d8cbf69dae21263063d..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/hashtabl.hpp
+++ /dev/null
@@ -1,1000 +0,0 @@
-#ifndef FILE_HASHTABL
-#define FILE_HASHTABL
-
-/**************************************************************************/
-/* File:   hashtabl.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/**
-   Abstract data type HASHTABLE.
-   Hash is done by one INDEX
-*/
-class BASE_INDEX_HASHTABLE
-{
-protected:
-  /// keys are stored in this table
-  TABLE<INDEX> hash;
-  
-public:
-  ///
-  BASE_INDEX_HASHTABLE (int size)
-    : hash (size) { };
-  
-protected:
-  ///
-  int HashValue (const INDEX & ind) const
-    {
-      return ind % hash.Size() + 1;
-    }
-
-  ///
-  int Position (int bnr, const INDEX & ind) const;
-};
-
-///
-template <class T>
-class INDEX_HASHTABLE : private BASE_INDEX_HASHTABLE
-{
-  ///
-  TABLE<T> cont;
-  
-public:
-  ///
-  inline INDEX_HASHTABLE (int size);
-  ///
-  inline void Set (const INDEX & hash, const T & acont);
-  ///
-  inline const T & Get (const INDEX & ahash) const;
-  ///
-  inline bool Used (const INDEX & ahash) const;
-  ///
-  inline int GetNBags () const;
-  ///
-  inline int GetBagSize (int bnr) const;
-  ///
-  inline void GetData (int bnr, int colnr, INDEX & ahash, T & acont) const;
-
-  ///
-  inline void PrintMemInfo (ostream & ost) const;
-};
-
-
-
-
-
-
-
-
-
-
-
-///
-class BASE_INDEX_2_HASHTABLE
-{
-protected:
-  ///
-  TABLE<INDEX_2> hash;
-  
-public:
-  ///
-  BASE_INDEX_2_HASHTABLE (int size)
-    : hash (size) { };
-
-  ///
-  void PrintStat (ostream & ost) const;
-  void BaseSetSize(int s) {hash.SetSize(s);}
-protected:
-  ///
-  int HashValue (const INDEX_2 & ind) const
-    {
-      return (ind.I1() + ind.I2()) % hash.Size() + 1;
-    }
-  ///
-  int Position (int bnr, const INDEX_2 & ind) const
-  {
-    int i;
-    for (i = 1; i <= hash.EntrySize (bnr); i++)
-      if (hash.Get(bnr, i) == ind)
-	return i;
-    return 0;
-  }
-};
-
-
-///
-template <class T>
-class INDEX_2_HASHTABLE : public BASE_INDEX_2_HASHTABLE
-{
-  ///
-  TABLE<T> cont;
-  
-public:
-  ///
- INDEX_2_HASHTABLE (int size)
-   : BASE_INDEX_2_HASHTABLE (size), cont(size)
-  { ; }  
-
-  ///
-  void SetSize(int s) 
-  { 
-    cont.SetSize(s); 
-    BaseSetSize(s);
-  }
-
-  ///
-  void Set (const INDEX_2 & ahash, const T & acont)
-  {
-    int bnr = HashValue (ahash);
-      int pos = Position (bnr, ahash);
-      if (pos)
-	cont.Set (bnr, pos, acont);
-      else
-	{
-	  hash.Add1 (bnr, ahash);
-	  cont.Add1 (bnr, acont);
-	}    
-  }
-  
-  ///
-  const T & Get (const INDEX_2 & ahash) const
-  {
-    int bnr = HashValue (ahash);
-    int pos = Position (bnr, ahash);
-    return cont.Get (bnr, pos);
-  }
-  
-  ///
-  bool Used (const INDEX_2 & ahash) const
-  {
-    return (Position (HashValue (ahash), ahash)) ? 1 : 0;
-  }
-
-  ///
-  int GetNBags () const
-  {
-    return cont.Size();
-  }
-  
-  ///
-  int GetBagSize (int bnr) const
-  {
-    return cont.EntrySize (bnr);
-  }
-    
-  ///
-  void GetData (int bnr, int colnr, 
-		INDEX_2 & ahash, T & acont) const
-  {
-    ahash = hash.Get(bnr, colnr);
-    acont = cont.Get(bnr, colnr);
-  }
-
-  ///
-  void SetData (int bnr, int colnr, 
-		const INDEX_2 & ahash, const T & acont) 
-  {
-    hash.Set(bnr, colnr, ahash);
-    cont.Set(bnr, colnr, acont);
-  }
-  
-  ///
-  void PrintMemInfo (ostream & ost) const
-  {
-    ost << "Hash: " << endl;
-    hash.PrintMemInfo (ost);
-    ost << "Cont: " << endl;
-    cont.PrintMemInfo (ost);
-  }
-
-
-
-  class Iterator
-  {
-    const INDEX_2_HASHTABLE & ht;    
-    int bagnr, pos;
-  public:
-    Iterator (const INDEX_2_HASHTABLE & aht,
-	      int abagnr, int apos)
-      : ht(aht), bagnr(abagnr), pos(apos)
-    { ; }
-
-    int BagNr() const { return bagnr; }
-    int Pos() const { return pos; }
-
-    void operator++ (int)
-    {
-      // cout << "begin Operator ++: bagnr = " << bagnr << " -  pos = " << pos << endl;
-      pos++;
-      while (bagnr < ht.GetNBags() && 
-	     pos == ht.GetBagSize(bagnr+1))
-	{
-	  pos = 0;
-	  bagnr++;
-	}
-      // cout << "end Operator ++: bagnr = " << bagnr << " - pos = " << pos << endl;
-    }
-
-    bool operator != (int i) const
-    {
-      return bagnr != i;
-    }
-
-  };
-  
-  Iterator Begin () const
-  {
-    Iterator it(*this, 0, -1);
-    it++;
-    return it;
-  }
-
-  int End() const
-  {
-    return GetNBags();
-  }
-
-  void GetData (const Iterator & it,
-		INDEX_2 & ahash, T & acont) const
-  {
-    ahash = hash[it.BagNr()][it.Pos()];
-    acont = cont[it.BagNr()][it.Pos()];
-  }
-
-  const INDEX_2 & GetHash (const Iterator & it) const
-  { return hash[it.BagNr()][it.Pos()]; }
-
-  const T & GetData (const Iterator & it) const
-  { return cont[it.BagNr()][it.Pos()]; }
-};
-
-
-
-template <typename T> 
-inline ostream & operator<< (ostream & ost, const INDEX_2_HASHTABLE<T> & ht)
-{
-  for (typename INDEX_2_HASHTABLE<T>::Iterator it = ht.Begin();
-       it != ht.End(); it++)
-    {
-      ost << ht.GetHash(it) << ": " << ht.GetData(it) << endl;
-    }
-
-  return ost;
-}
-
-
-
-
-
-
-
-///
-class BASE_INDEX_3_HASHTABLE
-{
-protected:
-  ///
-  TABLE<INDEX_3> hash;
-
-public:
-  ///
-  BASE_INDEX_3_HASHTABLE (int size)
-    : hash (size) { };
-
-protected:
-  ///
-  int HashValue (const INDEX_3 & ind) const
-    {
-      return (ind.I1() + ind.I2() + ind.I3()) % hash.Size() + 1;
-    }
-
-  ///
-  int Position (int bnr, const INDEX_3 & ind) const
-  {
-    const INDEX_3 * pi = &hash.Get(bnr, 1);
-    int n = hash.EntrySize(bnr);
-    for (int i = 1; i <= n; ++i, ++pi)
-      {
-	if (*pi == ind)
-	return i;
-      }
-    
-    return 0;
-  }
-
-
-};
-
-
-///
-template <class T>
-class INDEX_3_HASHTABLE : private BASE_INDEX_3_HASHTABLE
-{
-  ///
-  TABLE<T> cont;
-
-public:
-  ///
-  inline INDEX_3_HASHTABLE (int size);
-  ///
-  inline void Set (const INDEX_3 & ahash, const T & acont);
-  ///
-  inline const T & Get (const INDEX_3 & ahash) const;
-  ///
-  inline bool Used (const INDEX_3 & ahash) const;
-  ///
-  inline int GetNBags () const;
-  ///
-  inline int GetBagSize (int bnr) const;
-  ///
-  inline void SetData (int bnr, int colnr, const INDEX_3 & ahash, const T & acont);
-  ///
-  inline void GetData (int bnr, int colnr, INDEX_3 & ahash, T & acont) const;
-  /// returns position, if not existing, will create (create == return 1)
-  inline int PositionCreate (const INDEX_3 & ahash, int & bnr, int & colnr);
-  ///
-  inline void SetSize (int size);
-
-  ///
-  inline void PrepareSet (const INDEX_3 & ahash);
-  ///
-  inline void AllocateElements ();
-
-  ///
-  inline void PrintMemInfo (ostream & ost) const;
-  ///
-  inline void DeleteData ();
-};
-
-
-
-
-
-
-
-
-/// Closed Hashing HT
-
-class BASE_INDEX_2_CLOSED_HASHTABLE
-{
-protected:
-  ///
-  MoveableArray<INDEX_2> hash;
-  ///
-  int invalid;
-public:
-  ///
-  BASE_INDEX_2_CLOSED_HASHTABLE (int size);
-
-  int Size() const { return hash.Size(); }
-  int UsedPos (int pos) const { return ! (hash.Get(pos).I1() == invalid); }
-  int UsedElements () const;
-
-  ///
-  int HashValue (const INDEX_2 & ind) const
-    {
-      return (ind.I1() + 71 * ind.I2()) % hash.Size() + 1;
-    }
-
-
-  int Position (const INDEX_2 & ind) const
-  {
-    int i = HashValue(ind);
-    while (1)
-      {
-	if (hash.Get(i) == ind) return i;
-	if (hash.Get(i).I1() == invalid) return 0;
-	i++;
-	if (i > hash.Size()) i = 1;
-      }
-    /*
-    int pos = HashValue (ind);
-    if (hash.Get(pos) == ind) return pos;
-    return Position2 (ind);
-    */
-  }
-
-  // returns 1, if new postion is created
-  int PositionCreate (const INDEX_2 & ind, int & apos)
-  {
-    int i = HashValue (ind);
-    if (hash.Get(i) == ind) 
-      {
-	apos = i;
-	return 0;
-      }
-    if (hash.Get(i).I1() == invalid)
-      {
-	hash.Elem(i) = ind; 
-	apos = i;
-	return 1;
-      }
-    return PositionCreate2 (ind, apos);    
-  }
-
-protected:
-  ///
-
-  int Position2 (const INDEX_2 & ind) const;
-  int PositionCreate2 (const INDEX_2 & ind, int & apos);
-  void BaseSetSize (int asize);
-};
-
-
-template <class T>
-class INDEX_2_CLOSED_HASHTABLE : public BASE_INDEX_2_CLOSED_HASHTABLE
-{
-  ///
-  MoveableArray<T> cont;
-
-public:
-  ///
-  inline INDEX_2_CLOSED_HASHTABLE (int size);
-  ///
-  inline void Set (const INDEX_2 & ahash, const T & acont);
-  ///
-  inline const T & Get (const INDEX_2 & ahash) const;
-  ///
-  inline bool Used (const INDEX_2 & ahash) const;
-  ///
-  inline void SetData (int pos, const INDEX_2 & ahash, const T & acont);
-  ///
-  inline void GetData (int pos, INDEX_2 & ahash, T & acont) const;
-  ///
-  inline void SetData (int pos, const T & acont);
-  ///
-  inline void GetData (int pos, T & acont) const;
-  ///
-  const T & GetData (int pos) { return cont.Get(pos); }
-  ///
-  inline void SetSize (int size);
-  ///
-  inline void PrintMemInfo (ostream & ost) const;
-  ///
-  inline void DeleteData ()
-  { SetSize (cont.Size()); }
-
-  void SetName (const char * aname)
-  {
-    cont.SetName(aname);
-    hash.SetName(aname);
-  }
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-class BASE_INDEX_3_CLOSED_HASHTABLE
-{
-protected:
-  ///
-  MoveableArray<INDEX_3> hash;
-  ///
-  int invalid;
-public:
-  ///
-  BASE_INDEX_3_CLOSED_HASHTABLE (int size);
-
-  int Size() const { return hash.Size(); }
-  bool UsedPos (int pos) const { return ! (hash.Get(pos).I1() == invalid); }
-  int UsedElements () const;
-
-  ///
-  int HashValue (const INDEX_3 & ind) const
-  {
-    return (ind.I1() + 15 * ind.I2() + 41 * ind.I3()) % hash.Size() + 1;
-  }
-  
-  int Position (const INDEX_3 & ind) const
-  {
-    int i = HashValue(ind);
-    while (1)
-      {
-	if (hash.Get(i) == ind) return i;
-	if (hash.Get(i).I1() == invalid) return 0;
-	i++;
-	if (i > hash.Size()) i = 1;
-      }
-    /*
-    int pos = HashValue (ind);
-    if (hash.Get(pos) == ind) return pos;
-    return Position2 (ind);
-    */
-  }
-
-  // returns 1, if new postion is created
-  int PositionCreate (const INDEX_3 & ind, int & apos)
-  {
-    int i = HashValue (ind);
-    if (hash.Get(i) == ind) 
-      {
-	apos = i;
-	return 0;
-      }
-    if (hash.Get(i).I1() == invalid)
-      {
-	hash.Elem(i) = ind; 
-	apos = i;
-	return 1;
-      }
-    return PositionCreate2 (ind, apos);    
-  }
-
-
-protected:
-  ///
-
-  int Position2 (const INDEX_3 & ind) const;
-  int PositionCreate2 (const INDEX_3 & ind, int & apos);
-  void BaseSetSize (int asize);
-};
-
-
-template <class T>
-class INDEX_3_CLOSED_HASHTABLE : public BASE_INDEX_3_CLOSED_HASHTABLE
-{
-  ///
-  MoveableArray<T> cont;
-
-public:
-  ///
-  inline INDEX_3_CLOSED_HASHTABLE (int size);
-  ///
-  inline void Set (const INDEX_3 & ahash, const T & acont);
-  ///
-  inline const T & Get (const INDEX_3 & ahash) const;
-  ///
-  inline bool Used (const INDEX_3 & ahash) const;
-  ///
-  inline void SetData (int pos, const INDEX_3 & ahash, const T & acont);
-  ///
-  inline void GetData (int pos, INDEX_3 & ahash, T & acont) const;
-  ///
-  inline void SetData (int pos, const T & acont);
-  ///
-  inline void GetData (int pos, T & acont) const;
-  ///
-  inline const T & GetData (int pos) const;
-  ///
-  inline void SetSize (int size);
-  ///
-  inline void PrintMemInfo (ostream & ost) const;
-  ///
-  inline void DeleteData ()
-  { SetSize (cont.Size()); }
-
-  void SetName (const char * aname)
-  {
-    cont.SetName(aname);
-    hash.SetName(aname);
-  }
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template<class T>
-inline INDEX_3_HASHTABLE<T> :: INDEX_3_HASHTABLE (int size)
-  : BASE_INDEX_3_HASHTABLE (size), cont(size)
-{
-  ;
-}
-
-template<class T>	
-inline int INDEX_3_HASHTABLE<T> :: PositionCreate (const INDEX_3 & ahash, int & bnr, int & colnr)
-{
-  bnr = HashValue (ahash);
-  colnr = Position (bnr, ahash);
-  if (!colnr)
-    {
-      hash.Add (bnr, ahash);
-      cont.AddEmpty (bnr);
-      colnr = cont.EntrySize (bnr);
-      return 1;
-    }
-  return 0;
-}
-
-
-template<class T>
-inline void INDEX_3_HASHTABLE<T> :: Set (const INDEX_3 & ahash, const T & acont)
-{
-  int bnr = HashValue (ahash);
-  int pos = Position (bnr, ahash);
-  if (pos)
-    cont.Set (bnr, pos, acont);
-  else
-    {
-      hash.Add1 (bnr, ahash);
-      cont.Add1 (bnr, acont);
-    }
-}
-
-template<class T>
-inline const T & INDEX_3_HASHTABLE<T> :: Get (const INDEX_3 & ahash) const
-{
-  int bnr = HashValue (ahash);
-  int pos = Position (bnr, ahash);
-  return cont.Get (bnr, pos);
-}
-
-template<class T>
-inline bool INDEX_3_HASHTABLE<T> :: Used (const INDEX_3 & ahash) const
-{
-  return (Position (HashValue (ahash), ahash)) ? 1 : 0;
-}
-
-template<class T>
-inline int INDEX_3_HASHTABLE<T> :: GetNBags () const
-{
-  return cont.Size();
-}
-
-template<class T>
-inline int INDEX_3_HASHTABLE<T> :: GetBagSize (int bnr) const
-{
-  return cont.EntrySize (bnr);
-}
-
-template<class T>
-inline void INDEX_3_HASHTABLE<T> :: GetData (int bnr, int colnr, INDEX_3 & ahash, T & acont) const
-{
-  ahash = hash.Get(bnr, colnr);
-  acont = cont.Get(bnr, colnr);
-}    
-
-template<class T>
-inline void INDEX_3_HASHTABLE<T> :: SetData (int bnr, int colnr, const INDEX_3 & ahash, const T & acont)
-{
-  hash.Set(bnr, colnr, ahash);
-  cont.Set(bnr, colnr, acont);
-}    
-
-template<class T>
-inline void INDEX_3_HASHTABLE<T> :: SetSize (int size)
-{
-  hash.SetSize (size);
-  cont.SetSize (size);
-}
-
-template<class T>
-inline void INDEX_3_HASHTABLE<T> :: DeleteData ()
-{
-  int n = hash.Size();
-  hash.SetSize (n);
-  cont.SetSize (n);
-}
-
-template<class T>
-inline void INDEX_3_HASHTABLE<T> :: PrepareSet (const INDEX_3 & ahash)
-{
-  int bnr = HashValue (ahash);
-  hash.IncSizePrepare (bnr-1);
-  cont.IncSizePrepare (bnr-1);
-}
-
-
-template<class T>
-inline void INDEX_3_HASHTABLE<T> :: AllocateElements ()
-{
-  hash.AllocateElementsOneBlock();
-  cont.AllocateElementsOneBlock();
-}
-
-
-
-template<class T>
-inline void INDEX_3_HASHTABLE<T> :: PrintMemInfo (ostream & ost) const
-  {
-    ost << "Hash: " << endl;
-    hash.PrintMemInfo (ost);
-    ost << "Cont: " << endl;
-    cont.PrintMemInfo (ost);
-  }
-
-
-
-
-
-template<class T>
-inline INDEX_HASHTABLE<T> :: INDEX_HASHTABLE (int size)
-  : BASE_INDEX_HASHTABLE (size), cont(size)
-  {
-    ;
-  }
-	
-template<class T>
-inline void INDEX_HASHTABLE<T> :: Set (const INDEX & ahash, const T & acont)
-    {
-    int bnr = HashValue (ahash);
-    int pos = Position (bnr, ahash);
-    if (pos)
-      cont.Set (bnr, pos, acont);
-    else
-      {
-      hash.Add (bnr, ahash);
-      cont.Add (bnr, acont);
-      }
-    }
-
-template<class T>
-inline const T & INDEX_HASHTABLE<T> :: Get (const INDEX & ahash) const
-    {
-    int bnr = HashValue (ahash);
-    int pos = Position (bnr, ahash);
-    return cont.Get (bnr, pos);
-    }
-
-template<class T>
-inline bool INDEX_HASHTABLE<T> :: Used (const INDEX & ahash) const
-    {
-    return (Position (HashValue (ahash), ahash)) ? 1 : 0;
-    }
-
-template<class T>
-inline int INDEX_HASHTABLE<T> :: GetNBags () const
-    {
-    return hash.Size();
-    }
-
-template<class T>
-inline int INDEX_HASHTABLE<T> :: GetBagSize (int bnr) const
-    {
-    return hash.EntrySize(bnr);
-    }
-
-template<class T>
-inline void INDEX_HASHTABLE<T> :: GetData (int bnr, int colnr, INDEX & ahash, T & acont) const
-    {
-    ahash = hash.Get(bnr, colnr);   
-    acont = cont.Get(bnr, colnr);
-    }
-    
-template<class T>
-inline void INDEX_HASHTABLE<T> :: PrintMemInfo (ostream & ost) const
-  {
-    ost << "Hash: " << endl;
-    hash.PrintMemInfo (ost);
-    ost << "Cont: " << endl;
-    cont.PrintMemInfo (ost);
-  }
-
-
-    
-    
-    
-    
-    
-
-
-
-
-
-
-
-
-/* *********** Closed Hashing ************************* */
-
-
-
-
-template<class T>
-inline INDEX_2_CLOSED_HASHTABLE<T> :: 
-INDEX_2_CLOSED_HASHTABLE (int size)
-  : BASE_INDEX_2_CLOSED_HASHTABLE(size), cont(size)
-{
-  cont.SetName ("i2-hashtable, contents");
-}
-
-template<class T>
-inline void INDEX_2_CLOSED_HASHTABLE<T> :: 
-Set (const INDEX_2 & ahash, const T & acont)
-{
-  int pos;
-  PositionCreate (ahash, pos);
-  hash.Elem(pos) = ahash;
-  cont.Elem(pos) = acont;
-}
-
-template<class T>
-inline const T & INDEX_2_CLOSED_HASHTABLE<T> :: 
-Get (const INDEX_2 & ahash) const
-{
-  int pos = Position (ahash);
-  return cont.Get(pos);
-}
-
-template<class T>
-inline bool INDEX_2_CLOSED_HASHTABLE<T> :: 
-Used (const INDEX_2 & ahash) const
-{
-  int pos = Position (ahash);
-  return (pos != 0);
-}
-
-template<class T>
-inline void INDEX_2_CLOSED_HASHTABLE<T> :: 
-SetData (int pos, const INDEX_2 & ahash, const T & acont)
-{
-  hash.Elem(pos) = ahash;
-  cont.Elem(pos) = acont;
-}
-  
-template<class T>
-inline void INDEX_2_CLOSED_HASHTABLE<T> :: 
-GetData (int pos, INDEX_2 & ahash, T & acont) const
-{
-  ahash = hash.Get(pos);
-  acont = cont.Get(pos);
-}
-
-template<class T>
-inline void INDEX_2_CLOSED_HASHTABLE<T> :: 
-SetData (int pos, const T & acont)
-{
-  cont.Elem(pos) = acont;
-}
-  
-template<class T>
-inline void INDEX_2_CLOSED_HASHTABLE<T> :: 
-GetData (int pos, T & acont) const
-{
-  acont = cont.Get(pos);
-}
-
-
-template<class T>
-inline void INDEX_2_CLOSED_HASHTABLE<T> :: 
-SetSize (int size)
-{
-  BaseSetSize(size);
-  cont.SetSize(size);
-}
-
-
-  
-template<class T>
-inline void INDEX_2_CLOSED_HASHTABLE<T> :: 
-PrintMemInfo (ostream & ost) const
-{
-  cout << "Hashtable: " << Size() 
-       << " entries of size " << sizeof(INDEX_2) << " + " << sizeof(T) 
-       << " = " << Size() * (sizeof(INDEX_2) + sizeof(T)) << " bytes." 
-       << " Used els: " << UsedElements() 
-       << endl;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template<class T>
-inline INDEX_3_CLOSED_HASHTABLE<T> :: 
-INDEX_3_CLOSED_HASHTABLE (int size)
-  : BASE_INDEX_3_CLOSED_HASHTABLE(size), cont(size)
-{
-  cont.SetName ("i3-hashtable, contents");
-}
-
-template<class T>
-inline void INDEX_3_CLOSED_HASHTABLE<T> :: 
-Set (const INDEX_3 & ahash, const T & acont)
-{
-  int pos;
-  PositionCreate (ahash, pos);
-  hash.Elem(pos) = ahash;
-  cont.Elem(pos) = acont;
-}
-
-template<class T>
-inline const T & INDEX_3_CLOSED_HASHTABLE<T> :: 
-Get (const INDEX_3 & ahash) const
-{
-  int pos = Position (ahash);
-  return cont.Get(pos);
-}
-
-template<class T>
-inline bool INDEX_3_CLOSED_HASHTABLE<T> :: 
-Used (const INDEX_3 & ahash) const
-{
-  int pos = Position (ahash);
-  return (pos != 0);
-}
-
-template<class T>
-inline void INDEX_3_CLOSED_HASHTABLE<T> :: 
-SetData (int pos, const INDEX_3 & ahash, const T & acont)
-{
-  hash.Elem(pos) = ahash;
-  cont.Elem(pos) = acont;
-}
-  
-template<class T>
-inline void INDEX_3_CLOSED_HASHTABLE<T> :: 
-GetData (int pos, INDEX_3 & ahash, T & acont) const
-{
-  ahash = hash.Get(pos);
-  acont = cont.Get(pos);
-}
-
-template<class T>
-inline void INDEX_3_CLOSED_HASHTABLE<T> :: 
-SetData (int pos, const T & acont)
-{
-  cont.Elem(pos) = acont;
-}
-  
-template<class T>
-inline void INDEX_3_CLOSED_HASHTABLE<T> :: 
-GetData (int pos, T & acont) const
-{
-  acont = cont.Get(pos);
-}
-
-template<class T>
-inline const T & INDEX_3_CLOSED_HASHTABLE<T> :: 
-GetData (int pos) const
-{
-  return cont.Get(pos);
-}
-
-
-template<class T>
-inline void INDEX_3_CLOSED_HASHTABLE<T> :: 
-SetSize (int size)
-{
-  BaseSetSize(size);
-  cont.SetSize(size);
-}
-
-
-  
-template<class T>
-inline void INDEX_3_CLOSED_HASHTABLE<T> :: 
-PrintMemInfo (ostream & ost) const
-{
-  cout << "Hashtable: " << Size() 
-       << " entries of size " << sizeof(INDEX_3) << " + " << sizeof(T) 
-       << " = " << Size() * (sizeof(INDEX_3) + sizeof(T)) << " bytes" << endl;
-}
-
-
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/moveablemem.cpp b/contrib/Netgen/libsrc/general/moveablemem.cpp
deleted file mode 100644
index cdfac0e7b8b60db5146f2378100ac35c19bbcb16..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/moveablemem.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-#include <iostream>
-#include <iomanip>
-
-#include <myadt.hpp>
-using namespace std;
-namespace netgen
-{
-  
-  NgMutex mem_mutex;
-  
-  size_t BaseMoveableMem::totalsize = 0; // 500000000;
-  size_t BaseMoveableMem::used = 0;
-  char * BaseMoveableMem::largeblock = 0;
-  
-  BaseMoveableMem * BaseMoveableMem::first = 0;
-  BaseMoveableMem * BaseMoveableMem::last = 0;
-  
-
-  BaseMoveableMem :: BaseMoveableMem (size_t s)
-  {
-    // cout << "Construct object begin" << endl;
-    //   Print ();
-
-  prev = last;
-  next = 0;
-
-  if (last) last->next = this;
-  last = this;
-  if (!first) first = this;
-
-  size = 0;
-
-  if (prev)
-    pos = prev->pos + prev->size;
-  else
-    pos = 0;
-
-  ptr = 0;
-  name = NULL;
-
-  if (s) Alloc(s);
-}
- 
-BaseMoveableMem :: ~BaseMoveableMem () throw()
-{
-  Free();
-
-  if (next) next->prev = prev;
-  else last = prev;
-  if (prev) prev->next = next;
-  else first = next;
-
-  if(name != NULL)
-    {
-      delete [] name;
-      name = NULL;
-    }
-}
-
-void BaseMoveableMem :: SetName (const char * aname)
-{
-  if(name != NULL)
-    {
-      delete [] name;
-      name = NULL;
-    }
-  if (aname)
-    {
-      name = new char[strlen(aname)+1];
-      strcpy (name, aname);
-    }
-}
-
-
-void BaseMoveableMem :: Alloc (size_t s)
-{
-  if (totalsize == 0)
-    {
-      size = s;
-      ptr = (char*) malloc(s);
-      return;
-    }
-
-
-  used += s - size;
-
-  int r = s % 8;
-  if (r) s += 8-r;
-  if (prev)
-    pos = prev->pos + prev->size;
-  else
-    pos = 0;
-  size = s;
-  
-  if (next)
-    {
-      NgLock lock(mem_mutex);
-      lock.Lock();
-      try
-	{
-	  next->MoveTo (pos+size);
-	}
-      catch (NgException e)
-      {
-	lock.UnLock();
-	throw NgException ("MoveableMem overflow");
-      }
-      lock.UnLock();
-    }
-
-  if (size)
-    {
-      if (!largeblock)
-	{
-	  cout << "moveable memory: allocate large block of "
-	       << totalsize / 1048576  << " MB" << endl; 
-	  // largeblock = new char[totalsize];
-	  largeblock = (char*)malloc (totalsize);
-	}
-      ptr = largeblock+pos;
-
-      if (pos + size > totalsize)
-	throw NgException ("MoveableMem overflow");
-    }
-  else
-    ptr = 0;
-}
-
-void BaseMoveableMem :: ReAlloc (size_t s)
-{
-  if (totalsize == 0)
-    {
-      if (size == s) return;
-      
-      char * old = ptr;
-      ptr = (char*)malloc(s);
-      memmove (ptr, old, (s < size) ? s : size);
-      free (old);
-      size = s;
-      return;
-    }
-
-  Alloc (s);
-}
-
-void BaseMoveableMem :: MoveTo (size_t newpos)
-{
-  //  cout << "move block, oldpos = " << pos << "; newpos = " << newpos
-  // << ", size = " << size << endl;
-  static int move = 0;
-
-  if (newpos + size > totalsize)
-    throw NgException ("MoveableMem overflow");
-  if (newpos > pos)
-    {
-      if (next) next->MoveTo (newpos+size);
-      memmove (largeblock+newpos, largeblock+pos, size);
-      move += size;
-    }
-  else if (newpos < pos)
-    {
-      // cout << "move down: " << size << endl;
-      memmove (largeblock+newpos, largeblock+pos, size);
-      if (next) next->MoveTo (newpos+size);
-      move += size;
-    }
-  pos = newpos;
-  ptr = largeblock+pos;
-  //  cout << "total move: " << move << endl;
-}
-
-void BaseMoveableMem :: Free () throw()
-{
-  if (totalsize == 0)
-    {
-      free (ptr);
-      ptr = 0;
-      return;
-    }
-
-  /*
-    cout << "free block, pos = " << pos << "size = " << size << endl;
-    cout << "before: " << endl;
-    Print();
-  */
-  used -= size;
-  if (next) 
-    {
-      NgLock lock(mem_mutex);
-      lock.Lock();
-      next->MoveTo (pos);
-      lock.UnLock();
-    }
-  
-  size = 0;
-  ptr = 0;
-  // pos = 0;
-}
-
-void BaseMoveableMem :: Swap (BaseMoveableMem & m2) throw()
-{
-  int hi;
-  // BaseMoveableMem * hp;
-  char * cp;
-  hi = size; size  = m2.size; m2.size = hi;
-  hi = pos; pos = m2.pos; m2.pos = hi;
-  /*
-  hp = prev; prev = m2.prev; m2.prev = hp;
-  hp = next; next = m2.next; m2.next = hp;
-  */
-  cp = ptr; ptr = m2.ptr; m2.ptr = cp;
-  cp = name; name = m2.name; m2.name = cp;
-}
-
-
-void BaseMoveableMem :: Print ()
-{
-  cout << "****************** Moveable Mem Report ****************" << endl;
-  BaseMoveableMem * p = first;
-  int mem = 0;
-  int cnt = 0;
-  while (p)
-    {
-      mem += p->size;
-      cnt++;
-
-      cout << setw(10) << p->size << " Bytes";
-      cout << ", pos = " << p->pos;
-      //      cout << ", addr = " << p->ptr;
-      if (p->name)
-	cout << " in block " << p->name;
-      cout << endl;
-
-      p = p->next;
-    }
-
-  if (mem > 100000000)
-    cout << "memory in moveable arena: " << mem/1048576 << " MB" << endl;
-  else if (mem > 100000)
-    cout << "memory in moveable arena: " << mem/1024 << " kB" << endl;
-  else
-    cout << "memory in moveable arena: " << mem << " Bytes" << endl;
-  cout << "number of blocks:         " << cnt << endl;
-  
-  cout << " used  = " << used << endl;
-  //  cout << "******************************************************" << endl;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/general/moveablemem.hpp b/contrib/Netgen/libsrc/general/moveablemem.hpp
deleted file mode 100644
index 92a67ad6dab2b703a06920aeb84a93a6fd0748e2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/moveablemem.hpp
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef FILE_MOVEABLEMEM
-#define FILE_MOVEABLEMEM
-
-/**************************************************************************/
-/* File:   moveablemem.hpp                                                */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   12. Feb. 2003                                                  */
-/**************************************************************************/
-
-
-extern NgMutex mem_mutex;
-
-class BaseMoveableMem
-{
-public:
-  static size_t totalsize;
-  static size_t used;
-
-private:
-  static char * largeblock;
-  static BaseMoveableMem *first, *last;
-
-  BaseMoveableMem *prev, *next;
-  size_t size, pos;
-  char * ptr;
-  char * name;
-
-protected:
-  BaseMoveableMem (size_t s = 0);
-  ~BaseMoveableMem () throw();
-  void Alloc (size_t s);
-  void ReAlloc (size_t s);
-  void MoveTo (size_t newpos);
-  void Free () throw(); 
-  char * Ptr() { return ptr; }
-  const char * Ptr() const { return ptr; }
-  void Swap (BaseMoveableMem & m2) throw(); 
-public:
-  void SetName (const char * aname);
-  static void Print ();
-};
-
-
-
-
-template <typename T>
-class MoveableMem : public BaseMoveableMem
-{
-public:
-  MoveableMem (size_t s = 0)
-    : BaseMoveableMem (sizeof(T) * s) 
-  {
-    ;
-  }
-  void Alloc (size_t s)
-  {
-    BaseMoveableMem::Alloc (sizeof(T) * s);
-  }
-  void ReAlloc (size_t s)
-  {
-    BaseMoveableMem::ReAlloc (sizeof(T) * s);
-  }
-  void Free ()
-  {
-    BaseMoveableMem::Free ();
-  }
-
-  const T * Ptr() const
-  {
-    return reinterpret_cast<const T*> (BaseMoveableMem::Ptr());
-  }
-
-  T * Ptr()
-  {
-    return reinterpret_cast<T*> (BaseMoveableMem::Ptr());
-  }
-
-  operator const T* () const
-  {
-    return reinterpret_cast<const T*> (BaseMoveableMem::Ptr());
-  }
-
-  operator T* () 
-  {
-    return reinterpret_cast<T*> (BaseMoveableMem::Ptr());
-  }
-
-  void Swap (MoveableMem<T> & m2)
-  {
-    BaseMoveableMem::Swap (m2);
-  }
-protected:
-  MoveableMem (const MoveableMem & m) { ; }
-  MoveableMem & operator= (const MoveableMem & m) { ; }
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/myadt.hpp b/contrib/Netgen/libsrc/general/myadt.hpp
deleted file mode 100644
index f74976d51f1604b984b254a3ad293839d6f4b9ce..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/myadt.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef FILE_MYADT
-#define FILE_MYADT
-
-/**************************************************************************/
-/* File:   myadt.hpp                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/* 
-   include for all abstract data types
-*/
-
-
-
-#include <mystdlib.h>
-#include <mydefs.hpp>
-
-
-namespace netgen
-{
-#include "ngexception.hpp"
-#include "parthreads.hpp"
-#include "moveablemem.hpp"
-#include "dynamicmem.hpp"
-
-#include "template.hpp"
-#include "array.hpp"
-#include "table.hpp"
-#include "hashtabl.hpp"
-#include "symbolta.hpp"
-#include "bitarray.hpp"
-#include "flags.hpp"
-#include "spbita2d.hpp"
-#include "seti.hpp"
-#include "optmem.hpp"
-#include "autoptr.hpp"
-#include "sort.hpp"
-#include "stack.hpp"
-#include "mystring.hpp"
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/mystring.cpp b/contrib/Netgen/libsrc/general/mystring.cpp
deleted file mode 100644
index 6b0f0cee74cf7c9af7c056ca988fc8a711847062..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/mystring.cpp
+++ /dev/null
@@ -1,386 +0,0 @@
-
-//**************************************************************
-//
-// filename:             mystring.cpp
-//
-// project:              doctoral thesis
-//
-// autor:                Dipl.-Ing. Gerstmayr Johannes
-//
-// generated:            20.12.98
-// last change:          20.12.98
-// description:          implementation for strings
-// remarks:
-//
-//**************************************************************
-
-// string class
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-/*
-#include <iostream.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <math.h>
-#include <fstream.h>
-#include "mystring.hh"
-
- */
-
-namespace netgen
-{
-
-void DefaultStringErrHandler()
-{
-  cerr << "Fehler : Bereichsüberschreitung bei Stringoperation\n" << flush;
-}
-
-void (*MyStr::ErrHandler)() = DefaultStringErrHandler;
-
-  /*     
-MyStr::MyStr()
-{
-  length = 0;
-  str = shortstr;
-  str[0] = 0;
-}
-  */
-
-MyStr::MyStr(const char *s)
-{
-  length = strlen(s);
-
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, s);
-}
-
-/*
-MyStr::MyStr(char s)
-{
-  length = 1;
-  str = shortstr;
-  str[0] = s;
-  str[1] = (char)0;
-}
-*/
-
-MyStr::MyStr(const MyStr& s)
-{
-  length = s.length;
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, s.str);
-}
-
-MyStr::MyStr(int i)
-{
-  char buffer[32];
-  sprintf(buffer, "%d", i);
-  length = strlen(buffer);
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, buffer);
-}
-
-MyStr::MyStr(long l)
-{
-  char buffer[32];
-  sprintf(buffer, "%ld", l);
-  length = strlen(buffer);
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, buffer);
-}
-
-MyStr::MyStr(double d)
-{
-  char buffer[32];
-  //if (fabs(d) < 1E-100) {d = 0;}
-  sprintf(buffer, "%g", d);
-  length = strlen(buffer);
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, buffer);
-}
-
-MyStr::MyStr(const Point3d& p)
-{
-  char buffer[80];
-  //if (fabs(d) < 1E-100) {d = 0;}
-  sprintf(buffer, "[%g, %g, %g]", p.X(), p.Y(), p.Z());
-  length = strlen(buffer);
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, buffer);
-}
-
-MyStr::MyStr(const Vec3d& p)
-{
-  char buffer[80];
-  //if (fabs(d) < 1E-100) {d = 0;}
-  sprintf(buffer, "[%g, %g, %g]", p.X(), p.Y(), p.Z());
-  length = strlen(buffer);
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, buffer);
-}
-
-MyStr::MyStr(unsigned n, int)
-{
-  length = n;
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  str[n] = 0;
-}
-
-MyStr::MyStr(const std::string & st)
-{
-  length = st.length();
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy (str, st.c_str());
-}
-
-
-
-MyStr MyStr::Left(unsigned r)
-{
-  if(r > length)
-    {
-      MyStr::ErrHandler();
-      MyStr s;
-      return s;
-    }
-  else
-    {
-      MyStr tmp(r, 0);
-      strncpy(tmp.str, str, r);
-      return tmp;
-    }
-}
-
-MyStr MyStr::Right(unsigned l)
-{
-  if(l > length)
-    {
-      MyStr::ErrHandler();
-      MyStr s;
-      return s;
-    }
-  else
-    {
-      MyStr tmp(l, 0);
-      strncpy(tmp.str, str + length - l, l);
-      return tmp;
-    }
-}
-
-MyStr& MyStr::InsertAt(unsigned pos, const MyStr& s)
-{
-  if(pos > length)
-    {
-      MyStr::ErrHandler();
-      return *this;
-    }
-  int newLength = length + s.length;
-  char *tmp = new char[newLength + 1];
-  strncpy(tmp, str, pos);
-  strcpy(tmp + pos, s.str);
-  strcpy(tmp + pos + s.length, str + pos);
-
-  if (length > SHORTLEN) delete str;
-  length = newLength;
-  if (length > SHORTLEN)
-    str = tmp;
-  else
-    {
-      strcpy (shortstr, tmp);
-      delete tmp;
-      str = shortstr;
-    }
-  return *this;
-}
-
-MyStr &MyStr::WriteAt(unsigned pos, const MyStr& s)
-{
-  if(pos > length)
-  {
-    MyStr::ErrHandler();
-    return *this;
-  }
-  int n = length - pos;
-  if(s.length < n)
-    n = s.length;
-  strncpy(str + pos, s.str, n);
-  return *this;
-}
-
-void MyStr::ConvertTextToExcel()
-{
-  /*
-  for (int i = 0; i < Length(); i++)
-    {
-      if ((*this)[i]==',') {(*this)[i] = ';';}
-      else if ((*this)[i]=='.') {(*this)[i] = ',';}
-    }
-  */
-}
-
-void MyStr::ConvertExcelToText()
-{
-  /*
-  for (int i = 0; i < Length(); i++)
-    {
-      if ((*this)[i]==',') {(*this)[i] = '.';}
-      else if ((*this)[i]==';') {(*this)[i] = ',';}
-    }
-  */
-}
-
-MyStr& MyStr::operator = (const MyStr& s)
-{
-  if (length > SHORTLEN) delete str;
-  length = s.length;
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, s.str);
-  return *this;
-}
-
-MyStr operator + (const MyStr& s1, const MyStr& s2)
-{
-  MyStr tmp(s1.length + s2.length, 0);
-  if (s1.length != 0) strcpy(tmp.str, s1.str);
-  if (s2.length != 0) strcpy(tmp.str + s1.length, s2.str);
-  return tmp;
-}
-
-void MyStr::operator += (const MyStr& s)
-{
-  if (length+s.length <= SHORTLEN)
-    {
-      if (s.length != 0) strcpy(shortstr + length, s.str);
-    }
-  else
-    {
-      char *tmp = new char[length + s.length + 1];
-      if (length != 0) strcpy(tmp, str);
-      if (s.length != 0) strcpy(tmp + length, s.str);
-      if (length > SHORTLEN) delete str;
-      length += s.length;
-      str = tmp;
-    }
-}
-
-char& MyStr::operator [] (unsigned n)
-{
-  static char dummy;
-  if(n < length)
-    return str[n];
-  else
-  {
-    MyStr::ErrHandler();
-    return dummy;
-  }
-}
-
-char MyStr::operator [] (unsigned n) const
-{
-  static char dummy;
-  if(n < length)
-    return str[n];
-  else
-  {
-    MyStr::ErrHandler();
-    return dummy;
-  }
-}
-
-MyStr MyStr::operator () (unsigned l, unsigned r)
-{
-  if((l > r) || (r > length))
-  {
-    MyStr::ErrHandler();
-    MyStr s;
-    return s;
-  }
-  else
-  {
-    int n = r - l + 1;
-    MyStr tmp(n, 0);
-    strncpy(tmp.str, str + 1, n);
-    return tmp;
-  }
-}
-
-istream& operator >> (istream& is, MyStr& s)
-{
-  const int buflen = 1000;
-  char buffer[buflen+1];
-
-  int end = 0;
-  s = "";
-  MyStr str;
-
-  while (!end)
-  {
-    is.get(buffer, buflen);
-    str = MyStr(buffer);
-    s += str;
-    if (is.peek() == EOF) {end = 1;}
-  }
-
-  return is;
-}
-
-/*
-#ifdef __borland
-::ifstream& operator >> (::ifstream& is, MyStr& s)       // wb
-{                                                        // wb
-  const int buflen = 1000;                               // wb
-  char buffer[buflen+1];                                 // wb
-                                                         // wb
-  int end = 0;                                           // wb
-  s = "";                                                // wb
-  MyStr str;                                             // wb
-                                                         // wb
-  while (!end)                                           // wb
-  {                                                      // wb
-    is.get(buffer, buflen);                              // wb
-    str = MyStr(buffer);                                 // wb
-    s += str;                                            // wb
-    if (is.peek() == EOF) {end = 1;}                     // wb
-  }                                                      // wb
-                                                         // wb
-  return is;                                             // wb
-}          
-
-#endif
-*/
-}
diff --git a/contrib/Netgen/libsrc/general/mystring.hpp b/contrib/Netgen/libsrc/general/mystring.hpp
deleted file mode 100644
index cd6639552c587be270ac33fb69b96782b75c64d0..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/mystring.hpp
+++ /dev/null
@@ -1,209 +0,0 @@
-
-//**************************************************************
-//
-// filename:             mystring.h
-//
-// project:              doctoral thesis, program smart
-//
-// autor:                Dipl.-Ing. Gerstmayr Johannes
-//
-// generated:            20.12.98
-// last change:          20.12.98
-// description:          base class for strings
-// remarks:              string with n characters has
-//                       0..n-1 characters and at pos n a 0
-//
-//**************************************************************
-
-
-#ifndef MYSTRING__H
-#define MYSTRING__H
-
-class Point3d;
-class Vec3d;
-
-class MyStr;
-
-MyStr operator + (const MyStr &, const MyStr &);
-int operator == (const MyStr &, const MyStr &);
-int operator < (const MyStr &, const MyStr &);
-int operator <= (const MyStr &, const MyStr &);
-int operator > (const MyStr &, const MyStr &);
-int operator >= (const MyStr &, const MyStr &);
-int operator != (const MyStr &, const MyStr &);
-ostream& operator << (ostream &, const MyStr &);
-istream& operator >> (istream &, MyStr &);
-
-class MyStr
-{
-public:
-  MyStr();
-  MyStr(const char *);
-  MyStr(char);
-  MyStr(const MyStr &);
-  MyStr(int);
-  MyStr(long);
-  MyStr(double);
-  MyStr(const Point3d& p);
-  MyStr(const Vec3d& p);
-  MyStr(const std::string & st);
-
-  ~MyStr();
-  MyStr Left(unsigned);
-  MyStr Right(unsigned);
-  MyStr& InsertAt(unsigned, const MyStr &);
-  MyStr& WriteAt(unsigned, const MyStr &);
-  unsigned Length() const;
-  int Find(const char);
-  int Find(const char *);
-  int Find(const MyStr &);
-  MyStr& operator = (const MyStr &);
-  friend MyStr operator + (const MyStr &, const MyStr &);
-  void operator += (const MyStr &);
-  char* c_str();
-
-  //change every ',' -> ';', '.' -> ','
-  void ConvertTextToExcel();
-  //change every ','->'.', ';'->','
-  void ConvertExcelToText();
-
-  MyStr operator () (unsigned, unsigned);
-  operator int();
-  operator double();
-  operator long();
-  operator char *();
-  char& operator [] (unsigned int);
-  char operator [] (unsigned int) const;
-
-  friend int operator == (const MyStr &, const MyStr &);
-  friend int operator < (const MyStr &, const MyStr &);
-  friend int operator <= (const MyStr &, const MyStr &);
-  friend int operator > (const MyStr &, const MyStr &);
-  friend int operator >= (const MyStr &, const MyStr &);
-  friend int operator != (const MyStr &, const MyStr &);
-  friend ostream& operator << (ostream &, const MyStr &);
-  friend istream& operator >> (istream &, MyStr &);
-  static void SetToErrHandler(void (*)());
-private:
-  MyStr(unsigned, int);
-  char *str;
-  unsigned length;
-  enum { SHORTLEN = 24 };
-  char shortstr[SHORTLEN+1];
-  static void(*ErrHandler)();
-};
-
-
-inline MyStr::MyStr()
-{
-  length = 0;
-  str = shortstr;
-  str[0] = 0;
-}
-
-inline MyStr::MyStr(char s)
-{
-  length = 1;
-  str = shortstr;
-  str[0] = s;
-  str[1] = (char)0;
-}
-
-inline MyStr::~MyStr()
-{
-  if (length > SHORTLEN)
-    delete [] str;
-}
-
-inline unsigned MyStr::Length() const
-{
-  return length;
-}
-
-inline int MyStr::Find(const char c)
-{
-  char *pos = strchr(str, int(c));
-  return pos ? int(pos - str) : -1;
-}
-
-inline int MyStr::Find(const MyStr &s)
-{
-  char *pos = strstr(str, s.str);
-  return pos ? int(pos - str) : -1;
-}
-
-inline int MyStr::Find(const char *s)
-{
-  char *pos = strstr(str, s);
-  return pos ? int(pos - str) : -1;
-}
-
-inline MyStr::operator int()
-{
-  return atoi(str);
-}
-
-inline MyStr::operator double()
-{
-  return atof(str);
-}
-
-inline MyStr::operator long()
-{
-  return atol(str);
-}
-
-inline MyStr::operator char *()
-{
-  return str;
-}
-
-inline char* MyStr::c_str()
-{
-  return str;
-}
-
-
-inline int operator == (const MyStr &s1, const MyStr& s2)
-{
-  return strcmp(s1.str, s2.str) == 0;
-}
-
-inline int operator < (const MyStr &s1, const MyStr& s2)
-{
-  return strcmp(s1.str, s2.str) < 0;
-}
-
-inline int operator <= (const MyStr &s1, const MyStr& s2)
-{
-  return strcmp(s1.str, s2.str) <= 0;
-}
-
-inline int operator > (const MyStr &s1, const MyStr& s2)
-{
-  return strcmp(s1.str, s2.str) > 0;
-}
-
-inline int operator >= (const MyStr &s1, const MyStr& s2)
-{
-  return strcmp(s1.str, s2.str) >= 0;
-}
-
-inline int operator != (const MyStr &s1, const MyStr& s2)
-{
-  return !(s1 == s2);
-}
-
-inline ostream& operator << (ostream& os, const MyStr& s)
-{
-  return os << s.str;
-}
-
-inline void MyStr::SetToErrHandler(void (*Handler)())
-{
-  ErrHandler = Handler;
-}
-
-#endif
-
-   
diff --git a/contrib/Netgen/libsrc/general/ngexception.cpp b/contrib/Netgen/libsrc/general/ngexception.cpp
deleted file mode 100644
index 6746dd25213d3e893da795fd401a7f60baa91d19..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/ngexception.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/**************************************************************************/
-/* File:   ngexception.cpp                                                */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   16. Jan. 02                                                    */
-/**************************************************************************/
-
-#include <myadt.hpp>
-
-namespace netgen
-{
-  using namespace netgen;
-
-
-
-  NgException :: NgException (const string & s) 
-    : what(s)
-  {
-    ; 
-  }
-
-
-  NgException :: ~NgException () 
-  {
-    ;
-  }
-
-  /// append string to description
-  void NgException :: Append (const string & s)
-  { 
-    what += s; 
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/general/ngexception.hpp b/contrib/Netgen/libsrc/general/ngexception.hpp
deleted file mode 100644
index 56c561aa8cdd14eb038d9e728d114140cdbfb304..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/ngexception.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef FILE_NGEXCEPTION
-#define FILE_NGEXCEPTION
-
-/**************************************************************************/
-/* File:   ngexception.hpp                                                */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   16. Jan. 2002                                                  */
-/**************************************************************************/
-
-
-/// Base class for all ng exceptions
-class NgException 
-{
-  /// verbal description of exception
-  string what;
-public:
-  ///
-  NgException (const string & s);
-  ///
-  virtual ~NgException ();
-
-  /// append string to description
-  void Append (const string & s);
-  //  void Append (const char * s);
-  
-  /// verbal description of exception
-  const string & What() const { return what; }
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/optmem.cpp b/contrib/Netgen/libsrc/general/optmem.cpp
deleted file mode 100644
index c8f961b12a1a4c451d1a79684223826d3a999e63..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/optmem.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/**************************************************************************/
-/* File:   optmem.cc                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   04. Apr. 97                                                    */
-/**************************************************************************/
-
-/* 
-   Abstract data type ARRAY
-*/
-
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-namespace netgen
-{
-  using namespace netgen;
-
-  BlockAllocator :: BlockAllocator (unsigned asize, unsigned ablocks)
-    : bablocks (0)
-  {
-    if (asize < sizeof(void*))
-      asize = sizeof(void*);
-    size = asize;
-    blocks = ablocks;
-    freelist = NULL;
-  }
-
-  BlockAllocator :: ~BlockAllocator ()
-  {
-    for (unsigned i = 0; i < bablocks.Size(); i++)
-      delete [] bablocks[i];
-  }
-
-  void BlockAllocator :: Alloc2 ()
-  {
-    //  return new char[size];
-    //    if (!freelist)
-      {
-	// cout << "BlockAlloc: " << size*blocks << endl;
-	char * hcp = new char [size * blocks];
-	bablocks.Append (hcp);
-	bablocks.Last() = hcp;
-	for (unsigned i = 0; i < blocks-1; i++)
-	  *(void**)&(hcp[i * size]) = &(hcp[ (i+1) * size]);
-	*(void**)&(hcp[(blocks-1)*size]) = NULL;
-	freelist = hcp;
-      }
-      /*
-    void * p = freelist;
-    freelist = *(void**)freelist;
-    return p;
-      */
-  }
-
-  /*
-  void BlockAllocator :: Free (void * p)
-  {
-    *(void**)p = freelist;
-    freelist = p;
-  }
-  */
-}
diff --git a/contrib/Netgen/libsrc/general/optmem.hpp b/contrib/Netgen/libsrc/general/optmem.hpp
deleted file mode 100644
index d9e5e2137e0c9c3d970b03522a1ff3bf046f2728..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/optmem.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef FILE_OPTMEM
-#define FILE_OPTMEM
-
-/**************************************************************************/
-/* File:   optmem.hh                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   04. Apr. 97                                                    */
-/**************************************************************************/
-
-/** 
-    Optimized Memory allocation classes
-*/
-
-class BlockAllocator
-{
-private:
-  ///
-  unsigned size, blocks;
-  ///
-  void * freelist;
-  ///
-  ARRAY<char*> bablocks;
-public:
-  ///
-  BlockAllocator (unsigned asize, unsigned ablocks = 100);
-  ///
-  ~BlockAllocator ();
-  ///
-  void * Alloc ()
-  {
-    if (!freelist)
-      Alloc2();
-
-    void * p = freelist;
-    freelist = *(void**)freelist;
-    return p;
-  }
-  ///
-  void Free (void * p)
-  {
-    *(void**)p = freelist;
-    freelist = p;
-  }
-  
-
-private:
-  void Alloc2 ();
-};
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/parthreads.cpp b/contrib/Netgen/libsrc/general/parthreads.cpp
deleted file mode 100644
index 9cbf42c8abcb1ce4e994e508adf5a889b204b14b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/parthreads.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/**************************************************************************/
-/* File:   parthreads.cpp                                                 */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-/*
-
-namespace netgen
-{
-  using namespace netgen;
-
-#ifdef WIN32
-
-  NgLock :: NgLock (NgMutex & mut)
-    : sl(&mut.cs)
-  {
-    ;
-  }
-
-  void NgLock :: Lock ()
-  {
-    sl.Lock();
-  }
-  void NgLock :: UnLock ()
-  {
-    sl.Unlock();
-  }
-
-
-#else
-
-#endif
-}
-
-*/
diff --git a/contrib/Netgen/libsrc/general/parthreads.hpp b/contrib/Netgen/libsrc/general/parthreads.hpp
deleted file mode 100644
index 98a2246d472c40cc1fcf258d7cb861aba695af48..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/parthreads.hpp
+++ /dev/null
@@ -1,126 +0,0 @@
-#ifndef FILE_PARTHREADS
-#define FILE_PARTHREADS
-
-/**************************************************************************/
-/* File:   parthreads.hh                                                  */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   22. Nov. 2000                                                  */
-/**************************************************************************/
-
-/*
-  Parallel thread, Mutex, 
-*/
-
-#ifdef NO_PARALLEL_THREADS
-
-class NgMutex { };
-
-class NgLock
-{
-public:	
-  NgLock (NgMutex & mut, bool lock = 0) { ; }
-  void Lock () { ; }
-  void UnLock () { ; }
-};
-
-
-#else
-
-#ifdef WIN32
-
-class NgMutex
-{
-  CCriticalSection cs;
-  
-public:
-  NgMutex () 
-  { ; }
-  friend class NgLock;
-};
-
-class NgLock
-{
-  CSingleLock sl;
-  bool locked;
-public:	
-  NgLock (NgMutex & mut, bool lock = 0)
-    : sl(&mut.cs)
-  {
-    if (lock) sl.Lock();
-    locked = lock;
-  }
-
-  ~NgLock ()
-  {
-    if (locked) sl.Unlock();
-  }
-
-  void Lock ()
-  {
-    sl.Lock(); 
-    locked = 1;
-  }
-
-  void UnLock ()
-  { 
-    sl.Unlock(); 
-    locked = 0;
-  }
-};
-
-#else
-
-
-#include <pthread.h>
-
-class NgMutex
-{
-  pthread_mutex_t mut;
-public:
-  NgMutex ()
-  {
-    pthread_mutex_init (&mut, NULL);
-  }
-  friend class NgLock;
-};
-
-class NgLock 
-{
-  pthread_mutex_t & mut;
-  bool locked;
-public:
-  NgLock (NgMutex & ngmut, bool lock = 0)
-    : mut (ngmut.mut)
-  { 
-    if (lock) pthread_mutex_lock (&mut); 
-    locked = lock;
-  };
-
-  ~NgLock()
-  {
-    if (locked) pthread_mutex_unlock (&mut); 
-  }
-  
-  void Lock ()
-  { 
-    pthread_mutex_lock (&mut); 
-    locked = 1;
-  }
-  void UnLock ()
-  { 
-    pthread_mutex_unlock (&mut); 
-    locked = 0;
-  }
-  /*
-  int TryLock ()
-  { 
-    return pthread_mutex_trylock (&mut); 
-  }
-  */
-};
-
-#endif
-
-#endif
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/seti.cpp b/contrib/Netgen/libsrc/general/seti.cpp
deleted file mode 100644
index 702337f076637a7839c6f6bd8abde32c0ac92e88..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/seti.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-
-namespace netgen
-{
-  using namespace netgen;
-
-  IndexSet :: IndexSet (int maxind)
-  {
-    SetMaxIndex (maxind);
-  }
-
-  IndexSet :: ~IndexSet ()
-  {
-    Clear();
-  }
-
-
-  void IndexSet :: SetMaxIndex (int maxind)
-  {
-    if (maxind > flags.Size())
-      {
-	flags.SetSize (2 * maxind);
-	flags.Clear();
-      }
-  }
-
-  /*
-    int IndexSet :: IsIn (int ind) const
-    {
-    return flags.Test (ind);
-    }
-  */
-
-  /*
-    void IndexSet :: Add (int ind)
-    {
-    if (ind > flags.Size())
-    {
-    cerr << "out of range" << endl;
-    exit (1);
-    }
-
-    if (!flags.Test(ind))
-    {
-    set.Append (ind);
-    flags.Set (ind);
-    }
-    }
-  */
-
-  void IndexSet :: Del (int ind)
-  {
-    for (int i = 1; i <= set.Size(); i++)
-      if (set.Get(i) == ind)
-	{
-	  set.DeleteElement (ind);
-	  break;
-	}
-    flags.Clear (ind);
-  }
-
-  void IndexSet :: Clear ()
-  {
-    for (int i = 1; i <= set.Size(); i++)
-      flags.Clear (set.Get(i));
-    set.SetSize (0);
-  }
-}
diff --git a/contrib/Netgen/libsrc/general/seti.hpp b/contrib/Netgen/libsrc/general/seti.hpp
deleted file mode 100644
index 4ca0b8eb4ef2e25fec2e9c4a27bd5cd6731cf4a2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/seti.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef FILE_SETI
-#define FILE_SETI
-
-
-/**************************************************************************/
-/* File:   seti.hh                                                        */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   20. Mar. 98                                                    */
-/**************************************************************************/
-
-/**
-  Set of Integers
-  */
-class IndexSet
-{
-  ARRAY<int> set;
-  BitArray flags;
-public:
-  IndexSet (int maxind);
-  
-  ~IndexSet ();
-  /// increase range to maxind
-  void SetMaxIndex (int maxind);
-  int IsIn (int ind) const
-  { 
-    return flags.Test (ind); 
-  }
-
-  void Add (int ind)
-  {
-    if (!flags.Test(ind))
-      {
-	set.Append (ind);
-	flags.Set (ind);
-      }
-  }
-
-  void Del (int ind);
-  void Clear ();
-  
-  const ARRAY<int> & Array() { return set; }
-};
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/general/sort.cpp b/contrib/Netgen/libsrc/general/sort.cpp
deleted file mode 100644
index 264a132a748c4cd4be406ffa1d85b5f75ad0f1b7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/sort.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/**************************************************************************/
-/* File:   sort.cc                                                        */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   07. Jan. 00                                                    */
-/**************************************************************************/
-
-/* 
-   Sorting
-*/
-
-
-#include <algorithm>
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-namespace netgen
-{
-
-void Sort (const ARRAY<double> & values,
-	   ARRAY<int> & order)
-{
-  int n = values.Size();
-  int i, j;
-
-  order.SetSize (n);
-
-  for (i = 1; i <= n; i++)
-    order.Elem(i) = i;
-  for (i = 1; i <= n-1; i++)
-    for (j = 1; j <= n-1; j++)
-      if (values.Get(order.Elem(j)) > values.Get(order.Elem(j+1)))
-	{
-	  Swap (order.Elem(j), order.Elem(j+1));
-	}
-}
-
-
-void QickSortRec (const ARRAY<double> & values,
-		  ARRAY<int> & order, 
-		  int left, int right)
-{
-  int i, j;
-  double midval;
-
-  i = left;
-  j = right;
-  midval = values.Get(order.Get((i+j)/2));
-  
-  do
-    {
-      while (values.Get(order.Get(i)) < midval) i++;
-      while (midval < values.Get(order.Get(j))) j--;
-      
-      if (i <= j)
-	{
-	  Swap (order.Elem(i), order.Elem(j));
-	  i++; j--;
-	}
-    }
-  while (i <= j);
-  if (left < j) QickSortRec (values, order, left, j);
-  if (i < right) QickSortRec (values, order, i, right);
-}
-
-void QickSort (const ARRAY<double> & values,
-	       ARRAY<int> & order)
-{
-  int i, n = values.Size();
-  order.SetSize (n);
-  for (i = 1; i <= n; i++)
-    order.Elem(i) = i;
-
-  QickSortRec (values, order, 1, order.Size());
-}
-}
diff --git a/contrib/Netgen/libsrc/general/sort.hpp b/contrib/Netgen/libsrc/general/sort.hpp
deleted file mode 100644
index 99c32910006d67dd88abcbcaf5a3983b4677390b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/sort.hpp
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef FILE_SORT
-#define FILE_SORT
-
-/**************************************************************************/
-/* File:   sort.hh                                                        */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   07. Jan. 00                                                    */
-/**************************************************************************/
-
-
-// order(i) is sorted index of element i
-extern void Sort (const ARRAY<double> & values,
-		  ARRAY<int> & order);
-
-extern void QickSort (const ARRAY<double> & values,
-		      ARRAY<int> & order);
-
-		  
-#endif
diff --git a/contrib/Netgen/libsrc/general/spbita2d.cpp b/contrib/Netgen/libsrc/general/spbita2d.cpp
deleted file mode 100644
index e1e80e2cadd50cf39c10f77d5c756871562f75f0..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/spbita2d.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/**************************************************************************/
-/* File:   spbita2d.cpp                                                   */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/* 
-   Implementation of sparse 2 dimensional bitarray
-*/
-
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-namespace netgen
-{
-  using namespace netgen;
-
-  SPARSE_BIT_ARRAY_2D :: SPARSE_BIT_ARRAY_2D (int ah, int aw)
-  {
-    lines = NULL;
-    SetSize (ah, aw);
-  }
-
-  SPARSE_BIT_ARRAY_2D :: ~SPARSE_BIT_ARRAY_2D ()
-  {
-    DeleteElements ();
-    delete lines;
-  }
-
-
-  void SPARSE_BIT_ARRAY_2D :: SetSize (int ah, int aw)
-  {
-    DeleteElements();
-    if (lines)
-      {
-	delete lines;
-	lines = NULL;
-      }
-
-    if (!aw) aw = ah;
-
-    height = ah;
-    width = aw;
-
-    if (!ah) return;
-    lines = new linestruct[ah];
-
-    if (lines)
-      {
-	for (int i = 0; i < ah; i++)
-	  {
-	    lines[i].size = 0;
-	    lines[i].maxsize = 0;
-	    lines[i].col = NULL;
-	  }
-      }
-    else
-      {
-	height = width = 0;
-	MyError ("SPARSE_ARRAY::SetSize: Out of memory");
-      }
-  }
-
-
-
-  void SPARSE_BIT_ARRAY_2D :: DeleteElements ()
-  {
-    if (lines)
-      {
-	for (int i = 0; i < height; i++)
-	  {
-	    if (lines[i].col)
-	      {
-		delete [] lines[i].col;
-		lines[i].col = NULL;
-		lines[i].size = 0;
-		lines[i].maxsize = 0;
-	      }
-	  }
-      }
-  }
-
-
-  int SPARSE_BIT_ARRAY_2D :: Test (int i, int j) const
-  {
-    int k, max, *col;
-
-    if (!lines) return 0;
-    if (i < 1 || i > height) return 0;
-
-    col = lines[i-1].col;
-    max = lines[i-1].size;
-
-    for (k = 0; k < max; k++, col++)
-      if (*col == j) return 1;
-
-    return 0;
-  }
-
-
-
-  void SPARSE_BIT_ARRAY_2D :: Set(int i, int j)
-  {
-    int k, max, *col;
-
-    i--;
-    col = lines[i].col;
-    max = lines[i].size;
-
-    for (k = 0; k < max; k++, col++)
-      if (*col == j)
-	return;
-
-    if (lines[i].size)
-      {
-	if (lines[i].size == lines[i].maxsize)
-	  {
-	    col = new int[lines[i].maxsize+2];
-	    if (col)
-	      {
-		lines[i].maxsize += 2;
-		memcpy (col, lines[i].col, sizeof (int) * lines[i].size);
-		delete [] lines[i].col;
-		lines[i].col = col;
-	      }
-	    else
-	      {
-		MyError ("SPARSE_BIT_ARRAY::Set: Out of mem 1");
-		return;
-	      }
-	  }
-	else
-	  col = lines[i].col;
-
-	if (col)
-	  {
-	    k = lines[i].size-1;
-	    while (k >= 0 && col[k] > j)
-	      {
-		col[k+1] = col[k];
-		k--;
-	      }
-
-	    k++;
-	    lines[i].size++;
-	    col[k] = j;
-	    return;
-	  }
-	else
-	  {
-	    MyError ("SPARSE_ARRAY::Set: Out of memory 2");
-	  }
-      }
-    else
-      {
-	lines[i].col = new int[4];
-	if (lines[i].col)
-	  {
-	    lines[i].maxsize = 4;
-	    lines[i].size = 1;
-	    lines[i].col[0] = j;
-	    return;
-	  }
-	else
-	  {
-	    MyError ("SparseMatrix::Elem: Out of memory 3");
-	  }
-      }
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/general/spbita2d.hpp b/contrib/Netgen/libsrc/general/spbita2d.hpp
deleted file mode 100644
index db656653b1799e747be24cc50d8ac3352f5b1381..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/spbita2d.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef FILE_SPBITA2D
-#define FILE_SPBITA2D
-
-/**************************************************************************/
-/* File:   spbita2d.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/** 
-   Implementation of sparse 2 dimensional bitarray
-*/
-
-
-class SPARSE_BIT_ARRAY_2D
-  {
-  class linestruct { public: INDEX size; INDEX maxsize; INDEX * col; };
-
-  ///
-  linestruct * lines;
-  ///
-  INDEX height, width;
-
-  public:
-
-  ///
-  SPARSE_BIT_ARRAY_2D (INDEX ah = 0, INDEX aw = 0);
-  ///
-  ~SPARSE_BIT_ARRAY_2D ();
-
-  ///
-  void SetSize (INDEX ah, INDEX aw = 0);
-  ///
-  void DeleteElements ();
-
-  ///
-  int Get (INDEX i, INDEX j) const;
-
-  ///
-  INDEX Height () const { return height; }
-  ///
-  INDEX Width () const { return width; }
-
-  ///
-  void Set (INDEX i, INDEX j);
-  ///
-  int Test (INDEX i, INDEX j) const;
-
-  ///
-  INDEX BitsInLine (INDEX i) const { return lines[i-1].size; }
-  ///
-  INDEX GetIndex (INDEX i, INDEX nr) const { return lines[i-1].col[nr-1]; }
-  };
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/stack.hpp b/contrib/Netgen/libsrc/general/stack.hpp
deleted file mode 100644
index db8dfad2666817a7694a0edfcceafdf3fdd68f1b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/stack.hpp
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef FILE_STACK
-#define FILE_STACK
-
-/*****************************************************************************/
-/*  File: stack.hh                                                           */
-/*  Author: Wolfram Muehlhuber                                               */
-/*  Date: September 98                                                       */
-/*****************************************************************************/
-
-/*
-  
-  Stack class, based on a resizable array
-
- */
-
-
-#include "array.hpp"
-
-
-///
-template <class T> class STACK
-{
-public:
-  ///
-  inline STACK (INDEX asize = 0, INDEX ainc = 0);
-  ///
-  inline ~STACK ();
-
-  ///
-  inline void Push (const T & el);
-  ///
-  inline T & Pop ();
-  ///
-  const inline T & Top () const;
-  ///
-  inline int IsEmpty () const;
-  ///
-  inline void MakeEmpty ();
-
-private:
-  ///
-  ARRAY<T> elems;
-  ///
-  INDEX size;
-};
-
-
-
-
-/*
-  
-  Stack class, based on a resizable array
-
- */
-
-template <class T>
-inline STACK<T> :: STACK (INDEX asize, INDEX ainc)
-  : elems(asize, ainc)
-{
-  size = 0;
-}
-
-
-template <class T>
-inline STACK<T> :: ~STACK ()
-{
-  ;
-}
-
-
-template <class T> 
-inline void STACK<T> :: Push (const T & el)
-{
-  if (size < elems.Size())
-    elems.Elem(++size) = el;
-  else
-    {
-      elems.Append(el);
-      size++;
-    }
-}
-
-
-template <class T> 
-inline T & STACK<T> :: Pop ()
-{
-  return elems.Elem(size--);
-}
-
-
-template <class T>
-const inline T & STACK<T> :: Top () const
-{
-  return elems.Get(size);
-}
-
-template <class T>
-inline int STACK<T> :: IsEmpty () const
-{
-  return (size == 0);
-}
-
-
-template <class T>
-inline void STACK<T> :: MakeEmpty ()
-{
-  size = 0;
-}
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/stack.icc b/contrib/Netgen/libsrc/general/stack.icc
deleted file mode 100644
index c0182a564b73ca334e9ec60a7d73e3635e82a3fc..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/stack.icc
+++ /dev/null
@@ -1,67 +0,0 @@
-/*****************************************************************************/
-/*  File: stack.hh                                                           */
-/*  Author: Wolfram Muehlhuber                                               */
-/*  Date: September 98                                                       */
-/*****************************************************************************/
-
-/*
-  
-  Stack class, based on a resizable array
-
- */
-
-template <class T>
-inline STACK<T> :: STACK (INDEX asize, INDEX ainc)
-  : elems(asize, ainc)
-{
-  size = 0;
-}
-
-
-template <class T>
-inline STACK<T> :: ~STACK ()
-{
-  ;
-}
-
-
-template <class T> 
-inline void STACK<T> :: Push (const T & el)
-{
-  if (size < elems.Size())
-    elems.Elem(++size) = el;
-  else
-    {
-      elems.Append(el);
-      size++;
-    }
-}
-
-
-template <class T> 
-inline T & STACK<T> :: Pop ()
-{
-  return elems.Elem(size--);
-}
-
-
-template <class T>
-const inline T & STACK<T> :: Top () const
-{
-  return elems.Get(size);
-}
-
-template <class T>
-inline int STACK<T> :: IsEmpty () const
-{
-  return (size == 0);
-}
-
-
-template <class T>
-inline void STACK<T> :: MakeEmpty ()
-{
-  size = 0;
-}
-
-
diff --git a/contrib/Netgen/libsrc/general/symbolta.cpp b/contrib/Netgen/libsrc/general/symbolta.cpp
deleted file mode 100644
index b02daa65dc904f78c9a21c1d2f087b9ad38376af..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/symbolta.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/**************************************************************************/
-/* File:   symbolta.cc                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/* 
-   Abstract data type Symbol Table
-*/
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-
-#ifndef FILE_SYMBOLTABLECC
-#define FILE_SYMBOLTABLECC
-// necessary for SGI ????
-
-
-namespace netgen
-{
-  using namespace netgen;
-
-  BASE_SYMBOLTABLE :: BASE_SYMBOLTABLE ()
-  {
-    ;
-  }
-
-
-  BASE_SYMBOLTABLE :: ~BASE_SYMBOLTABLE()
-  {
-    DelNames();
-  }
-
-
-  void BASE_SYMBOLTABLE :: DelNames()
-  {
-    for (int i = 0; i < names.Size(); i++)
-      delete [] names[i];
-    names.SetSize (0);
-  }
-
-  int BASE_SYMBOLTABLE :: Index (const char * name) const
-  {
-    if (!name) return 0;
-    for (int i = 0; i < names.Size(); i++)
-      if (strcmp (names[i], name) == 0) return i+1;
-    return 0;
-  }
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/symbolta.hpp b/contrib/Netgen/libsrc/general/symbolta.hpp
deleted file mode 100644
index 1b74a8f9421d813276227e22507233300b3d8e49..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/symbolta.hpp
+++ /dev/null
@@ -1,159 +0,0 @@
-#ifndef FILE_SYMBOLTA
-#define FILE_SYMBOLTA
-
-
-/**************************************************************************/
-/* File:   symbolta.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-#include <string.h>
-
-/**
-   Base class for the generic SYMBOLTABLE.
-   An array of identifiers is maintained.
-*/
-class BASE_SYMBOLTABLE
-{
-protected:
-  /// identifiers
-  ARRAY <char*> names;
-  
-public:
-  /// Constructor
-  BASE_SYMBOLTABLE ();
-  ///
-  ~BASE_SYMBOLTABLE ();
-  ///
-  void DelNames ();
-  /// Index of symbol name, returns 0 if not used.
-  int Index (const char * name) const;
-};
-
-
-/** 
-    Abstract data type Symbol Table.
-   
-    To a string an value of the generic type T is associated.
-    The string is not copied into the symbol table class!
-*/
-template <class T>
-class SYMBOLTABLE : public BASE_SYMBOLTABLE
-{
-private:
-  /// Associated data
-  ARRAY <T> data;
-  
-public:
-  /// Creates a symboltable
-  inline SYMBOLTABLE ();
-  /// Returns size of symboltable
-  inline INDEX Size() const;
-  /// Returns reference to element, error if not used
-  inline T & Elem (const char * name);
-  /// Returns reference to i-th element
-  inline T & Elem (int i) 
-  { return data.Elem(i); }
-  /// Returns element, error if not used
-  inline const T & Get (const char * name) const;
-  /// Returns i-th element
-  inline const T & Get (int i) const;
-  /// Returns name of i-th element
-  inline const char* GetName (int i) const;
-  /// Associates el to the string name, overrides if name is used
-  inline void Set (const char * name, const T & el);
-  /// Checks whether name is used
-  inline int Used (const char * name) const;
-  /// Deletes symboltable
-  inline void DeleteAll ();
-
-  inline T & operator[] (int i) 
-  { return data[i]; }
-  inline const T & operator[] (int i) const
-  { return data[i]; }
-
-private:
-  /// Prevents from copying symboltable by pointer assignment
-  SYMBOLTABLE<T> & operator= (SYMBOLTABLE<T> &);
-};
-
-
-
-
-template <class T>
-inline SYMBOLTABLE<T> :: SYMBOLTABLE () 
-{ 
-  ;
-}
-
-
-template <class T>
-inline INDEX SYMBOLTABLE<T> :: Size() const
-{
-  return data.Size();
-}
-
-template <class T>
-inline T & SYMBOLTABLE<T> :: Elem (const char * name)
-{
-  int i = Index (name);
-  if (i) 
-    return data.Elem (i);
-  else 
-    return data.Elem(1);
-}
-
-template <class T>
-inline const T & SYMBOLTABLE<T> :: Get (const char * name) const
-{
-  int i;
-  i = Index (name);
-  if (i) 
-    return data.Get(i);
-  else 
-    return data.Get(1);
-}
-
-template <class T>
-inline const T & SYMBOLTABLE<T> :: Get (int i) const
-{
-  return data.Get(i);
-}
-
-template <class T>
-inline const char* SYMBOLTABLE<T> :: GetName (int i) const
-{
-  return names.Get(i);
-}
-
-template <class T>
-inline void SYMBOLTABLE<T> :: Set (const char * name, const T & el)
-{
-  int i;
-  i = Index (name);
-  if (i) 
-    data.Set(i, el);
-  else
-    {
-      data.Append (el);
-      char * hname = new char [strlen (name) + 1];
-      strcpy (hname, name);
-      names.Append (hname);
-    }
-}
-
-template <class T>
-inline int SYMBOLTABLE<T> :: Used (const char * name) const
-{
-  return (Index(name)) ? 1 : 0;
-}
-
-template <class T>
-inline void SYMBOLTABLE<T> :: DeleteAll () 
-{	
-  DelNames();
-  data.DeleteAll();
-}
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/table.cpp b/contrib/Netgen/libsrc/general/table.cpp
deleted file mode 100644
index ed84789bf9da2d381430612e8f69aab2f7fde632..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/table.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/**************************************************************************/
-/* File:   table.cpp                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/* 
-   Abstract data type TABLE
-*/
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-namespace netgen
-{
-  using namespace netgen;
-
-  BASE_TABLE :: BASE_TABLE (int size)
-    : data(size)
-  {
-    for (int i = 0; i < size; i++)
-      {
-	data[i].maxsize = 0;
-	data[i].size = 0;
-	data[i].col = NULL;
-      }
-    oneblock = NULL;
-  }
-
-  BASE_TABLE :: BASE_TABLE (const FlatArray<int> & entrysizes, int elemsize)
-    : data(entrysizes.Size())
-  {
-    int i, cnt = 0;
-    int n = entrysizes.Size();
-
-    for (i = 0; i < n; i++)
-      cnt += entrysizes[i];
-    oneblock = new char[elemsize * cnt];
-    // mem_total_alloc_table += elemsize * cnt;
-
-    cnt = 0;
-    for (i = 0; i < n; i++)
-      {
-	data[i].maxsize = entrysizes[i];
-	data[i].size = 0;
-
-	data[i].col = &oneblock[elemsize * cnt];
-	cnt += entrysizes[i];
-      }
-  }
-
-  BASE_TABLE :: ~BASE_TABLE ()
-  {
-    if (oneblock)
-      delete [] oneblock;
-    else
-      {
-	for (int i = 0; i < data.Size(); i++)
-	  delete [] (char*)data[i].col;
-      }
-  }
-  
-  void BASE_TABLE :: SetSize (int size)
-  {
-    for (int i = 0; i < data.Size(); i++)
-      delete [] (char*)data[i].col;
-    
-    data.SetSize(size);
-    for (int i = 0; i < size; i++)
-      {
-	data[i].maxsize = 0;
-	data[i].size = 0;
-	data[i].col = NULL;
-      }    
-  }
-
-  void BASE_TABLE :: IncSize2 (int i, int elsize)
-  {
-#ifdef DEBUG
-    if (i < 0 || i >= data.Size())
-      {
-	MyError ("BASE_TABLE::Inc: Out of range");
-	return;
-      }
-#endif
-    
-    linestruct & line = data[i];
-    if (line.size == line.maxsize)
-      {
-	void * p = new char [(line.maxsize+5) * elsize];
-      
-	memcpy (p, line.col, line.maxsize * elsize);
-	delete [] (char*)line.col;
-
-	line.col = p;
-	line.maxsize += 5;
-      }
-  
-    line.size++;
-  }
-
-
-
-  /*
-  void BASE_TABLE :: DecSize (int i)
-  {
-#ifdef DEBUG
-    if (i < 0 || i >= data.Size())
-      {
-	MyError ("BASE_TABLE::Dec: Out of range");
-	return;
-      }
-#endif
-
-    linestruct & line = data[i];
-  
-#ifdef DEBUG
-    if (line.size == 0)
-      {
-	MyError ("BASE_TABLE::Dec: EntrySize < 0");
-	return;      
-      }
-#endif
-  
-    line.size--;
-  }
-  */
-
-
-
-  void BASE_TABLE :: AllocateElementsOneBlock (int elemsize)
-  {
-    int cnt = 0;
-    int n = data.Size();
-
-    for (int i = 0; i < n; i++)
-      cnt += data[i].maxsize;
-    oneblock = new char[elemsize * cnt];
-
-    cnt = 0;
-    for (int i = 0; i < n; i++)
-      {
-	data[i].size = 0;
-	data[i].col = &oneblock[elemsize * cnt];
-	cnt += data[i].maxsize;
-      }
-  }
-
-
-
-  int BASE_TABLE :: AllocatedElements () const
-  {
-    int els = 0;
-    for (int i = 0; i < data.Size(); i++)
-      els += data[i].maxsize;
-    return els;
-  }
-  
-  int BASE_TABLE :: UsedElements () const
-  {
-    int els = 0;
-    for (int i = 0; i < data.Size(); i++)
-      els += data[i].size;
-    return els;
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/general/table.hpp b/contrib/Netgen/libsrc/general/table.hpp
deleted file mode 100644
index b986049b00a0bab7f94795eeccb91f9dfbded5d2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/table.hpp
+++ /dev/null
@@ -1,212 +0,0 @@
-#ifndef FILE_TABLE
-#define FILE_TABLE
-
-/**************************************************************************/
-/* File:   table.hpp                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/// Base class to generic class TABLE.
-class BASE_TABLE
-{
-protected:
-  
-  ///
-  class linestruct
-  {
-  public:
-    ///
-    int size;
-    /// 
-    int maxsize;
-    ///
-    void * col;
-  };
-  
-  ///
-  ARRAY<linestruct> data;
-  char * oneblock;
-
-public:
-  ///
-  BASE_TABLE (int size);
-  ///
-  BASE_TABLE (const FlatArray<int> & entrysizes, int elemsize);
-  ///
-  ~BASE_TABLE ();
-  ///
-  void SetSize (int size);
-
-  /// increment size of entry i by one, i is 0-based
-  void IncSize (int i, int elsize)
-  {
-    if (data[i].size < data[i].maxsize)
-      data[i].size++;
-    else
-      IncSize2 (i, elsize);
-  }
-  ///
-  void IncSize2 (int i, int elsize);
-
-  //  void DecSize (int i);
-
-  ///
-  void AllocateElementsOneBlock (int elemsize);
-
-  int AllocatedElements () const;
-  int UsedElements () const;
-};
-
-
-
-
-
-
-
-/** 
-   Abstract data type TABLE.
-   
-   To an integer i in the range from 1 to size a set of elements of the
-   generic type T is associated. 
-*/
-template <class T, int BASE = 0>
-class TABLE : public BASE_TABLE
-{
-public:
-  /// Creates table.
-  inline TABLE () : BASE_TABLE(0) { ; }
-
-  /// Creates table of size size
-  inline TABLE (int size) : BASE_TABLE (size) { ; }
-
-  /// Creates fixed element size table
-  inline TABLE (const FlatArray<int,BASE> & entrysizes)
-    : BASE_TABLE (FlatArray<int> (entrysizes.Size(), const_cast<int*>(&entrysizes[BASE])), 
-		  sizeof(T))
-  { ; }
-  
-  /// Changes Size of table to size, deletes data
-  inline void SetSize (int size)
-  {
-    BASE_TABLE::SetSize (size);
-  }
-
-
-  /// Inserts element acont into row i, BASE-based. Does not test if already used.
-  inline void Add (int i, const T & acont)
-  {
-    IncSize (i-BASE, sizeof (T));
-    ((T*)data[i-BASE].col)[data[i-BASE].size-1] = acont;
-  }
-
-
-  /// Inserts element acont into row i, 1-based. Does not test if already used.
-  inline void Add1 (int i, const T & acont)
-  {
-    IncSize (i-1, sizeof (T));
-    ((T*)data.Elem(i).col)[data.Elem(i).size-1] = acont;
-  }
-  
-  ///
-  void IncSizePrepare (int i)
-  {
-    data[i-BASE].maxsize++;
-  }
-
-
-  /// Inserts element acont into row i. BASE-based. Does not test if already used, assumes to have mem
-  inline void AddSave (int i, const T & acont)
-    {
-      ((T*)data[i-BASE].col)[data[i-BASE].size] = acont;
-      data[i-BASE].size++;
-    }
-
-  /// Inserts element acont into row i. 1-based. Does not test if already used, assumes to have mem
-  inline void AddSave1 (int i, const T & acont)
-    {
-      ((T*)data.Elem(i).col)[data.Elem(i).size] = acont;
-      data.Elem(i).size++;
-    }
-
-  /// Inserts element acont into row i. Does not test if already used.
-  inline void AddEmpty (int i)
-  {
-    IncSize (i-BASE, sizeof (T));
-  }
-
-  /** Set the nr-th element in the i-th row to acont.
-    Does not check for overflow. */
-  inline void Set (int i, int nr, const T & acont)
-    { ((T*)data.Get(i).col)[nr-1] = acont; }
-  /** Returns the nr-th element in the i-th row.
-    Does not check for overflow. */
-  inline const T & Get (int i, int nr) const
-    { return ((T*)data.Get(i).col)[nr-1]; }
-
-
-  /** Returns pointer to the first element in row i. */
-  inline const T * GetLine (int i) const
-  {
-    return ((const T*)data.Get(i).col);
-  }
-
-
-  /// Returns size of the table.
-  inline int Size () const
-  {
-    return data.Size();
-  }
-
-  /// Returns size of the i-th row.
-  inline int EntrySize (int i) const
-    { return data.Get(i).size; }
-
-  /*
-  inline void DecEntrySize (int i)
-    { DecSize(i); }
-  */
-  void AllocateElementsOneBlock ()
-    { BASE_TABLE::AllocateElementsOneBlock (sizeof(T)); }
-
-
-  inline void PrintMemInfo (ostream & ost) const
-  {
-    int els = AllocatedElements(); 
-    ost << "table: allocaed " << els 
-	<< " a " << sizeof(T) << " Byts = " 
-	<< els * sizeof(T) 
-	<< " bytes in " << Size() << " bags."
-	<< " used: " << UsedElements()
-	<< endl;
-  }
-
-  /// Access entry.
-  FlatArray<T> operator[] (int i) const
-  { 
-#ifdef DEBUG
-    if (i-BASE < 0 || i-BASE >= data.Size())
-      cout << "table out of range, i = " << i << ", s = " << data.Size() << endl;
-#endif
-
-    return FlatArray<T> (data[i-BASE].size, (T*)data[i-BASE].col);
-  }
-};
-
-
-template <class T, int BASE>
-inline ostream & operator<< (ostream & ost, TABLE<T,BASE> & table)
-{
-  for (int i = BASE; i < table.Size()+BASE; i++)
-    {
-      ost << i << ": ";
-      FlatArray<T> row = table[i];
-      for (int j = 0; j < row.Size(); j++)
-	ost << row[j] << " ";
-      ost << endl;
-    }
-  return ost;
-}
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/general/template.hpp b/contrib/Netgen/libsrc/general/template.hpp
deleted file mode 100644
index 4bf983c06b3837a132698d436bcf6183b0b45f2f..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/template.hpp
+++ /dev/null
@@ -1,448 +0,0 @@
-#ifndef FILE_TEMPLATE
-#define FILE_TEMPLATE
-
-/**************************************************************************/
-/* File:   template.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/*
-   templates, global types, defines and variables
-*/
-
-///	The following value may be adapted to the hardware !
-#ifndef CLOCKS_PER_SEC
-#define CLOCKS_PER_SEC 1000000
-#endif
-
-
-// #include <iostream>
-/** output stream for testing.
-  testout is opened by main */
-extern ostream * testout;
-
-/** use instead of cout */
-extern ostream * mycout;
-
-/** error output stream */
-extern ostream * myerr;
-
-/** Error messages display.
-  Error messages are displayed by this function */
-extern void MyError (const char * ch);
-
-
-/** Rings the bell.
-  Produces nr beeps. */
-extern void MyBeep (int nr = 1);
-
-
-template <class T>
-inline void Swap (T & a, T & b)
-{
-  T temp = a;
-  a = b;
-  b = temp;
-}
-
-/*
-template <class T>
-inline void swap (T & a, T & b)
-{
-  T temp = a;
-  a = b;
-  b = temp;
-}
-*/
-
-
-
-/**
-  INDEX is a typedef for (at least) 4-byte integer
- */
-typedef int INDEX;
-
-/**
-  BOOL is a typedef for boolean variables
-  */
-// typedef int BOOL;
-
-typedef int ELIND;
-typedef int PIND;
-
-
-class twoint 
-{ 
-public: ///
-  int i1, i2; ///
-  twoint() {};
-  ///
-  twoint(int ii1, int ii2) {i1 = ii1; i2 = ii2;}
-  friend int operator== (const twoint& t1, const twoint& t2);
-  ///
-  void Swap() {int x = i1; i1 = i2; i2 = x;}
-  void Sort() {if (i1 > i2) {Swap();}}
-};
-
-inline int operator== (const twoint& t1, const twoint& t2) 
-{
-  return t1.i1 == t2.i1 && t1.i2 == t2.i2;
-}
-
-class threeint 
-{ 
-public: /// 
-  int i1, i2, i3; ///
-  threeint() {}; 
-  ///
-  threeint(int ii1, int ii2, int ii3) {i1 = ii1; i2 = ii2; i3 = ii3;}
-};
-
-///
-class twodouble
-{
-public:
-  ///
-  double d1, d2;
-  ///
-  twodouble() {d1 = 0; d2 = 0;};
-  ///
-  twodouble(double id1, double id2) {d1 = id1; d2 = id2;}
-  ///
-  void Swap() {double x = d1; d1 = d2; d2 = x;}
-};
-
-class fourint { public: int i1, i2, i3, i4; fourint() {}; };
-
-
-///
-class INDEX_2;
-ostream & operator<<(ostream  & s, const INDEX_2 & i2);
-
-
-class INDEX_2
-{
-  ///
-  INDEX i[2];
-
-public:
-  ///
-  INDEX_2 () { }
-  ///
-  INDEX_2 (INDEX ai1, INDEX ai2)
-    { i[0] = ai1; i[1] = ai2; }
-
-  ///
-  INDEX_2 (const INDEX_2 & in2)
-    { i[0] = in2.i[0]; i[1] = in2.i[1]; }
-
-  ///
-  int operator== (const INDEX_2 & in2) const
-    { return i[0] == in2.i[0] && i[1] == in2.i[1]; }
-
-  ///
-
-
-  INDEX_2 Sort ()
-  {
-    if (i[0] > i[1]) 
-      {
-	INDEX hi = i[0];
-	i[0] = i[1];
-	i[1] = hi;
-      }
-    return *this;
-  }
-
-  static INDEX_2 Sort (int i1, int i2)
-  {
-    if (i1 > i2)
-      return INDEX_2 (i2,i1);
-    else
-      return INDEX_2 (i1,i2);
-  }
-
-
-  ///
-  INDEX & I1 () { return i[0]; }
-  ///
-  INDEX & I2 () { return i[1]; }
-  ///
-  INDEX & I (int j) { return i[j-1]; }
-  ///
-  const INDEX & I1 () const { return i[0]; }
-  ///
-  const INDEX & I2 () const { return i[1]; }
-  ///
-  const INDEX & I (int j) const { return i[j-1]; }
-  ///
-  int & operator[] (int j) { return i[j]; }
-  ///
-  const int & operator[] (int j) const { return i[j]; }
-  ///
-  friend ostream & operator<<(ostream  & s, const INDEX_2 & i2);
-};
-
-
-///
-class INDEX_3
-{
-  ///
-  INDEX i[3];
-
-public:
-  ///
-  INDEX_3 () { }
-  ///
-  INDEX_3 (INDEX ai1, INDEX ai2, INDEX ai3)
-    { i[0] = ai1; i[1] = ai2; i[2] = ai3; }
-
-  ///
-  INDEX_3 (const INDEX_3 & in2)
-    { i[0] = in2.i[0]; i[1] = in2.i[1]; i[2] = in2.i[2]; }
-
-
-  static INDEX_3 Sort (INDEX_3 i3)
-  {
-    return i3.Sort();
-  }
-
-  static INDEX_3 Sort (int i1, int i2, int i3)
-  {
-    INDEX_3 i(i1, i2, i3);
-    return i.Sort();
-  }
-
-  ///
-  INDEX_3 Sort ()
-  {
-    if (i[0] > i[1]) Swap (i[0], i[1]);
-    if (i[1] > i[2]) Swap (i[1], i[2]);
-    if (i[0] > i[1]) Swap (i[0], i[1]);
-    return *this;
-  }
-
-  ///
-  int operator== (const INDEX_3 & in2) const
-    { return i[0] == in2.i[0] && i[1] == in2.i[1] && i[2] == in2.i[2];}
-
-  ///
-  INDEX & I1 () { return i[0]; }
-  ///
-  INDEX & I2 () { return i[1]; }
-  ///
-  INDEX & I3 () { return i[2]; }
-  ///
-  INDEX & I (int j) { return i[j-1]; }
-  ///
-  const INDEX & I1 () const { return i[0]; }
-  ///
-  const INDEX & I2 () const { return i[1]; }
-  ///
-  const INDEX & I3 () const { return i[2]; }
-  ///
-  const INDEX & I (int j) const { return i[j-1]; }
-  ///
-  int & operator[] (int j) { return i[j]; }
-  ///
-  const int & operator[] (int j) const { return i[j]; }
-
-  ///
-  friend ostream & operator<<(ostream  & s, const INDEX_3 & i3);
-};
-
-
-
-///
-class INDEX_4
-{
-  ///
-  INDEX i[4];
-
-public:
-  ///
-  INDEX_4 () { }
-  ///
-  INDEX_4 (INDEX ai1, INDEX ai2, INDEX ai3, INDEX ai4)
-    { i[0] = ai1; i[1] = ai2; i[2] = ai3; i[3] = ai4; }
-
-  ///
-  INDEX_4 (const INDEX_4 & in2)
-    { i[0] = in2.i[0]; i[1] = in2.i[1]; i[2] = in2.i[2]; i[3] = in2.i[3]; }
-
-  ///
-  void Sort ();
-
-  ///
-  int operator== (const INDEX_4 & in2) const
-    { return 
-	i[0] == in2.i[0] && i[1] == in2.i[1] && 
-	i[2] == in2.i[2] && i[3] == in2.i[3]; }
-
-  ///
-  INDEX & I1 () { return i[0]; }
-  ///
-  INDEX & I2 () { return i[1]; }
-  ///
-  INDEX & I3 () { return i[2]; }
-  ///
-  INDEX & I4 () { return i[3]; }
-  ///
-  INDEX & I (int j) { return i[j-1]; }
-  ///
-  const INDEX & I1 () const { return i[0]; }
-  ///
-  const INDEX & I2 () const { return i[1]; }
-  ///
-  const INDEX & I3 () const { return i[2]; }
-  ///
-  const INDEX & I4 () const { return i[3]; }
-  ///
-  const INDEX & I (int j) const { return i[j-1]; }
-  ///
-  int & operator[] (int j) { return i[j]; }
-  ///
-  const int & operator[] (int j) const { return i[j]; }
-
-  ///
-  friend ostream & operator<<(ostream  & s, const INDEX_4 & i4);
-};
-
-
-
-
-
-
-
-
-/// The sort preserves quads !!!
-class INDEX_4Q
-{
-  ///
-  INDEX i[4];
-
-public:
-  ///
-  INDEX_4Q () { }
-  ///
-  INDEX_4Q (INDEX ai1, INDEX ai2, INDEX ai3, INDEX ai4)
-    { i[0] = ai1; i[1] = ai2; i[2] = ai3; i[3] = ai4; }
-
-  ///
-  INDEX_4Q (const INDEX_4Q & in2)
-    { i[0] = in2.i[0]; i[1] = in2.i[1]; i[2] = in2.i[2]; i[3] = in2.i[3]; }
-
-  ///
-  void Sort ();
-
-  ///
-  int operator== (const INDEX_4Q & in2) const
-    { return 
-	i[0] == in2.i[0] && i[1] == in2.i[1] && 
-	i[2] == in2.i[2] && i[3] == in2.i[3]; }
-
-  ///
-  INDEX & I1 () { return i[0]; }
-  ///
-  INDEX & I2 () { return i[1]; }
-  ///
-  INDEX & I3 () { return i[2]; }
-  ///
-  INDEX & I4 () { return i[3]; }
-  ///
-  INDEX & I (int j) { return i[j-1]; }
-  ///
-  const INDEX & I1 () const { return i[0]; }
-  ///
-  const INDEX & I2 () const { return i[1]; }
-  ///
-  const INDEX & I3 () const { return i[2]; }
-  ///
-  const INDEX & I4 () const { return i[3]; }
-  ///
-  const INDEX & I (int j) const { return i[j-1]; }
-  ///
-  friend ostream & operator<<(ostream  & s, const INDEX_4Q & i4);
-};
-
-
-
-
-
-
-
-
-
-
-
-
-///
-template <class T>
-inline T min2 (T a, T b)
-{
-  ///
-  return (a < b) ? a : b;
-}
-///
-template <class T>
-inline T max2 (T a, T b)
-{
-  ///
-  return (a > b) ? a : b;
-}
-///
-template <class T>
-inline T min3 (T a, T b, T c)
-{
-  ///
-  return (a < b) ? (a < c) ? a : c
-    : (b < c) ? b : c;
-}
-///
-template <class T>
-inline T max3 (T a, T b, T c)
-{
-  ///
-  return (a > b) ? ((a > c) ? a : c)
-    : ((b > c) ? b : c);
-}
-
-///
-
-///
-template <class T>
-inline int sgn (T a)
-{
-  return (a > 0) ? 1 : (   ( a < 0) ? -1 : 0 );
-}
-
-///
-template <class T>
-inline T sqr (const T a)
-{
-  return a * a; 
-}
-
-///
-template <class T>
-inline T pow3 (const T a)
-{
-  return a * a * a; 
-}
-
-
-
-/*
-template <class T>
-void BubbleSort (int size, T * data);
-
-template <class T>
-void MergeSort (int size, T * data, T * help);
-*/
-
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/Makefile b/contrib/Netgen/libsrc/gprim/Makefile
deleted file mode 100644
index 608e522844a6a48099c593d915f4e11aa34df466..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# Makefile for geometric library
-#
-src =  geom2d.cpp geom3d.cpp  \
-	geomtest3d.cpp adtree.cpp transform3d.cpp geomfuncs.cpp
-
-# reftrans.cpp rot3d.cpp
-#
-lib = gprim
-libpath = libsrc/gprim
-#
-#
-include ../makefile.inc
-#
diff --git a/contrib/Netgen/libsrc/gprim/adtree.cpp b/contrib/Netgen/libsrc/gprim/adtree.cpp
deleted file mode 100644
index 25f46183e2a2693e1bbd48e7a6d2f650d5984152..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/adtree.cpp
+++ /dev/null
@@ -1,2245 +0,0 @@
-#include <mystdlib.h>
-
-
-#include <myadt.hpp>
-// class DenseMatrix;
-#include <gprim.hpp>
-
-namespace netgen
-{
-
-
-  /* ******************************* ADTree ******************************* */
-
-
-  ADTreeNode :: ADTreeNode(int adim)
-  {
-    pi = -1;
-
-    left = NULL;
-    right = NULL;
-    father = NULL;
-    nchilds = 0;
-    dim = adim;
-    data = new float [dim];
-    boxmin = NULL;
-    boxmax = NULL;
-  }
-
-
-
-
-  ADTreeNode :: ~ADTreeNode()
-  {
-    delete data;
-  }
-
-
-  ADTree :: ADTree (int adim, const float * acmin, 
-		    const float * acmax)
-    : ela(0), stack(1000), stackdir(1000)
-  {
-    dim = adim;
-    cmin = new float [dim];
-    cmax = new float [dim];
-    memcpy (cmin, acmin, dim * sizeof(float));
-    memcpy (cmax, acmax, dim * sizeof(float));
-
-    root = new ADTreeNode (dim);
-    root->sep = (cmin[0] + cmax[0]) / 2;
-    root->boxmin = new float [dim];
-    root->boxmax = new float [dim];
-    memcpy (root->boxmin, cmin, dim * sizeof(float));
-    memcpy (root->boxmax, cmax, dim * sizeof(float));
-  }
-
-  ADTree :: ~ADTree ()
-  {
-    ;
-  }
-
-  void ADTree :: Insert (const float * p, int pi)
-  {
-    ADTreeNode *node;
-    ADTreeNode *next;
-    int dir;
-    int lr;
-
-    float * bmin = new float [dim];
-    float * bmax = new float [dim];
-  
-    memcpy (bmin, cmin, dim * sizeof(float));
-    memcpy (bmax, cmax, dim * sizeof(float));
-
-
-    next = root;
-    dir = 0;
-    while (next)
-      {
-	node = next;
-
-	if (node->pi == -1)
-	  {    
-	    memcpy (node->data, p, dim * sizeof(float));
-	    node->pi = pi;
-
-	    if (ela.Size() < pi+1)
-	      ela.SetSize (pi+1);
-	    ela[pi] = node;
-
-	    return;
-	  }
-
-	if (node->sep > p[dir])
-	  {
-	    next = node->left;
-	    bmax[dir] = node->sep;
-	    lr = 0;
-	  }
-	else
-	  {
-	    next = node->right;
-	    bmin[dir] = node->sep;
-	    lr = 1;
-	  }
-
-	dir++;
-	if (dir == dim)
-	  dir = 0;
-      }
-
-
-    next = new ADTreeNode(dim);
-    memcpy (next->data, p, dim * sizeof(float));
-    next->pi = pi;
-    next->sep = (bmin[dir] + bmax[dir]) / 2;
-    next->boxmin = bmin;
-    next->boxmax = bmax;
-
-    if (ela.Size() < pi+1)
-      ela.SetSize (pi+1);
-    ela[pi] = next;
-
-
-    if (lr)
-      node->right = next;
-    else
-      node->left = next;
-    next -> father = node;
-
-    while (node)
-      {
-	node->nchilds++;
-	node = node->father;
-      }
-  }
-
-  void ADTree :: DeleteElement (int pi)
-  {
-    ADTreeNode * node = ela[pi];
-
-    node->pi = -1;
-
-    node = node->father;
-    while (node)
-      {
-	node->nchilds--;
-	node = node->father;
-      }
-  }
-
-
-  void ADTree :: SetCriterion (ADTreeCriterion & acriterion)
-  {
-    criterion = & acriterion;
-  }
-
-
-  void ADTree :: Reset ()
-  {
-    stack.Elem(1) = root;
-    stackdir.Elem(1) = 0;
-    stackindex = 1;
-  }
-
-
-  int ADTree:: Next ()
-  {
-    ADTreeNode *node;
-    int dir;
-
-    if (stackindex == 0)
-      return -1;
-
-    do 
-      {
-	node = stack.Get(stackindex);
-	dir = stackdir.Get(stackindex);
-	stackindex --;
-
-	if (criterion -> Eval(node))
-	  {
-	    int ndir = dir + 1;
-	    if (ndir == dim)
-	      ndir = 0;
-
-	    if (node -> left && criterion -> Eval (node->left))
-	      {
-		stackindex ++;
-		stack.Elem(stackindex) = node -> left;
-		stackdir.Elem(stackindex) = ndir;
-	      }
-	    if (node->right && criterion -> Eval (node -> right))
-	      {
-		stackindex++;
-		stack.Elem(stackindex) = node->right;
-		stackdir.Elem(stackindex) = ndir;
-	      }
-	  
-	    if (node -> pi != -1)
-	      return node->pi;
-	  }
-      }
-    while (stackindex > 0);
-
-    return -1;
-  }
-
-
-  void ADTree :: GetMatch (ARRAY <int> & matches)
-  {
-    int nodenr;
-
-    Reset();
-
-    while ( (nodenr = Next()) != -1)
-      matches.Append (nodenr);
-  }
-
-
-  void ADTree :: PrintRec (ostream & ost, const ADTreeNode * node) const
-  {
-  
-    if (node->data)
-      {
-	ost << node->pi << ": ";
-	ost << node->nchilds << " childs, ";
-	for (int i = 0; i < dim; i++)
-	  ost << node->data[i] << " ";
-	ost << endl;
-      }
-    if (node->left)
-      {
-	ost << "l ";
-	PrintRec (ost, node->left);
-      }
-    if (node->right)
-      {
-	ost << "r ";
-	PrintRec (ost, node->right);
-      }
-  }
-
-
-  /* ******************************* ADTree3 ******************************* */
-
-
-  ADTreeNode3 :: ADTreeNode3()
-  {
-    pi = -1;
-
-    left = NULL;
-    right = NULL;
-    father = NULL;
-    nchilds = 0;
-  }
-
-  void ADTreeNode3 :: DeleteChilds ()
-  {
-    if (left)
-      {
-	left->DeleteChilds();
-	delete left;
-	left = NULL;
-      }
-    if (right)
-      {
-	right->DeleteChilds();
-	delete right;
-	right = NULL;
-      }
-  }
-
-
-  BlockAllocator ADTreeNode3 :: ball(sizeof (ADTreeNode3));
-
-
-  void * ADTreeNode3 :: operator new(size_t s)
-  {
-    return ball.Alloc();
-  }
-
-  void ADTreeNode3 :: operator delete (void * p)
-  {
-    ball.Free (p);
-  }
-
-
-
-
-
-
-
-  ADTree3 :: ADTree3 (const float * acmin, 
-		      const float * acmax)
-    : ela(0)
-  {
-    memcpy (cmin, acmin, 3 * sizeof(float));
-    memcpy (cmax, acmax, 3 * sizeof(float));
-
-    root = new ADTreeNode3;
-    root->sep = (cmin[0] + cmax[0]) / 2;
-  }
-
-  ADTree3 :: ~ADTree3 ()
-  {
-    root->DeleteChilds();
-    delete root;
-  }
-
-
-  void ADTree3 :: Insert (const float * p, int pi)
-  {
-    ADTreeNode3 *node;
-    ADTreeNode3 *next;
-    int dir;
-    int lr;
-
-    float bmin[3];
-    float bmax[3];
-  
-    memcpy (bmin, cmin, 3 * sizeof(float));
-    memcpy (bmax, cmax, 3 * sizeof(float));
-
-    next = root;
-    dir = 0;
-    while (next)
-      {
-	node = next;
-
-	if (node->pi == -1)
-	  {    
-	    memcpy (node->data, p, 3 * sizeof(float));
-	    node->pi = pi;
-
-	    if (ela.Size() < pi+1)
-	      ela.SetSize (pi+1);
-	    ela[pi] = node;
-
-	    return;
-	  }
-
-	if (node->sep > p[dir])
-	  {
-	    next = node->left;
-	    bmax[dir] = node->sep;
-	    lr = 0;
-	  }
-	else
-	  {
-	    next = node->right;
-	    bmin[dir] = node->sep;
-	    lr = 1;
-	  }
-
-	dir++;
-	if (dir == 3)
-	  dir = 0;
-      }
-
-
-    next = new ADTreeNode3;
-    memcpy (next->data, p, 3 * sizeof(float));
-    next->pi = pi;
-    next->sep = (bmin[dir] + bmax[dir]) / 2;
-
-
-    if (ela.Size() < pi+1)
-      ela.SetSize (pi+1);
-    ela[pi] = next;		
-
-
-    if (lr)
-      node->right = next;
-    else
-      node->left = next;
-    next -> father = node;
-
-    while (node)
-      {
-	node->nchilds++;
-	node = node->father;
-      }
-  }
-
-  void ADTree3 :: DeleteElement (int pi)
-  {
-    ADTreeNode3 * node = ela[pi];
-
-    node->pi = -1;
-
-    node = node->father;
-    while (node)
-      {
-	node->nchilds--;
-	node = node->father;
-      }
-  }
-
-  void ADTree3 :: GetIntersecting (const float * bmin, 
-				   const float * bmax,
-				   ARRAY<int> & pis) const
-  {
-    static ARRAY<ADTreeNode3*> stack(1000);
-    static ARRAY<int> stackdir(1000);
-    ADTreeNode3 * node;
-    int dir, stacks;
-
-    stack.SetSize (1000);
-    stackdir.SetSize(1000);
-    pis.SetSize(0);
-
-    stack.Elem(1) = root;
-    stackdir.Elem(1) = 0;
-    stacks = 1;
-
-    while (stacks)
-      {
-	node = stack.Get(stacks);
-	dir = stackdir.Get(stacks); 
-	stacks--;
-
-	if (node->pi != -1)
-	  {
-	    if (node->data[0] >= bmin[0] && node->data[0] <= bmax[0] &&
-		node->data[1] >= bmin[1] && node->data[1] <= bmax[1] &&
-		node->data[2] >= bmin[2] && node->data[2] <= bmax[2])
-
-	      pis.Append (node->pi);
-	  }
-
-
-	int ndir = dir+1;
-	if (ndir == 3)
-	  ndir = 0;
-
-	if (node->left && bmin[dir] <= node->sep)
-	  {
-	    stacks++;
-	    stack.Elem(stacks) = node->left;
-	    stackdir.Elem(stacks) = ndir;
-	  }
-	if (node->right && bmax[dir] >= node->sep)
-	  {
-	    stacks++;
-	    stack.Elem(stacks) = node->right;
-	    stackdir.Elem(stacks) = ndir;
-	  }
-      }
-  }
-
-  void ADTree3 :: PrintRec (ostream & ost, const ADTreeNode3 * node) const
-  {
-  
-    if (node->data)
-      {
-	ost << node->pi << ": ";
-	ost << node->nchilds << " childs, ";
-	for (int i = 0; i < 3; i++)
-	  ost << node->data[i] << " ";
-	ost << endl;
-      }
-    if (node->left)
-      PrintRec (ost, node->left);
-    if (node->right)
-      PrintRec (ost, node->right);
-  }
-
-
-
-
-
-
-
-
-#ifdef ABC
-
-  /* ******************************* ADTree3Div ******************************* */
-
-
-  ADTreeNode3Div :: ADTreeNode3Div()
-  {
-    pi = 0;
-  
-    int i;
-    for (i = 0; i < ADTN_DIV; i++)
-      childs[i] = NULL;
-
-    father = NULL;
-    nchilds = 0;
-    minx = 0;
-    dist = 1;
-  }
-
-  void ADTreeNode3Div :: DeleteChilds ()
-  {
-    int i;
-    for (i = 0; i < ADTN_DIV; i++)
-      if (childs[i])
-	{
-	  childs[i]->DeleteChilds();
-	  delete childs[i];
-	  childs[i] = NULL;
-	}
-  }
-
-
-  BlockAllocator ADTreeNode3Div :: ball(sizeof (ADTreeNode3Div));
-
-  void * ADTreeNode3Div :: operator new(size_t)
-  {
-    return ball.Alloc();
-  }
-
-  void ADTreeNode3Div :: operator delete (void * p)
-  {
-    ball.Free (p);
-  }
-
-
-
-
-
-
-
-  ADTree3Div :: ADTree3Div (const float * acmin, 
-			    const float * acmax)
-    : ela(0)
-  {
-    memcpy (cmin, acmin, 3 * sizeof(float));
-    memcpy (cmax, acmax, 3 * sizeof(float));
-
-    root = new ADTreeNode3Div;
-
-    root->minx = cmin[0];
-    root->dist = (cmax[0] - cmin[0]) / ADTN_DIV;
-
-    //  root->sep = (cmin[0] + cmax[0]) / 2;
-  }
-
-  ADTree3Div :: ~ADTree3Div ()
-  {
-    root->DeleteChilds();
-    delete root;
-  }
-
-
-  void ADTree3Div :: Insert (const float * p, int pi)
-  {
-    ADTreeNode3Div *node;
-    ADTreeNode3Div *next;
-    int dir;
-    int bag;
-  
-    float bmin[3];
-    float bmax[3];
-  
-    memcpy (bmin, cmin, 3 * sizeof(float));
-    memcpy (bmax, cmax, 3 * sizeof(float));
-
-
-    next = root;
-    dir = 0;
-    while (next)
-      {
-	node = next;
-
-	if (!node->pi)
-	  {    
-	    memcpy (node->data, p, 3 * sizeof(float));
-	    node->pi = pi;
-
-	    if (ela.Size() < pi)
-	      ela.SetSize (pi);
-	    ela.Elem(pi) = node;
-
-	    return;
-	  }
-
-	double dx = (bmax[dir] - bmin[dir]) / ADTN_DIV;
-	bag = int ((p[dir]-bmin[dir]) / dx);
-
-	//      (*testout) << "insert, bag = " << bag << endl;
-
-	if (bag < 0) bag = 0;
-	if (bag >= ADTN_DIV) bag = ADTN_DIV-1;
-      
-	double nbmin = bmin[dir] + bag * dx;
-	double nbmax = bmin[dir] + (bag+1) * dx;
-
-	/*      
-		(*testout) << "bmin, max = " << bmin[dir] << "-" << bmax[dir]
-		<< " p = " << p[dir];
-	*/
-	next = node->childs[bag];
-	bmin[dir] = nbmin;
-	bmax[dir] = nbmax;
-
-	//      (*testout) << "new bmin, max = " << bmin[dir] << "-" << bmax[dir] << endl;
-
-      
-	/*      
-		if (node->sep > p[dir])
-		{
-		next = node->left;
-		bmax[dir] = node->sep;
-		lr = 0;
-		}
-		else
-		{
-		next = node->right;
-		bmin[dir] = node->sep;
-		lr = 1;
-		}
-	*/
-
-	dir++;
-	if (dir == 3)
-	  dir = 0;
-      }
-
-
-    next = new ADTreeNode3Div;
-    memcpy (next->data, p, 3 * sizeof(float));
-    next->pi = pi;
-
-    next->minx = bmin[dir];
-    next->dist = (bmax[dir] - bmin[dir]) / ADTN_DIV;
-    //  next->sep = (bmin[dir] + bmax[dir]) / 2;
-
-
-    if (ela.Size() < pi)
-      ela.SetSize (pi);
-    ela.Elem(pi) = next;
-
-    node->childs[bag] = next;
-    next -> father = node;
-
-    while (node)
-      {
-	node->nchilds++;
-	node = node->father;
-      }
-  }
-
-  void ADTree3Div :: DeleteElement (int pi)
-  {
-    ADTreeNode3Div * node = ela.Get(pi);
-
-    node->pi = 0;
-
-    node = node->father;
-    while (node)
-      {
-	node->nchilds--;
-	node = node->father;
-      }
-  }
-
-  void ADTree3Div :: GetIntersecting (const float * bmin, 
-				      const float * bmax,
-				      ARRAY<int> & pis) const
-  {
-    static ARRAY<ADTreeNode3Div*> stack(1000);
-    static ARRAY<int> stackdir(1000);
-    ADTreeNode3Div * node;
-    int dir, i, stacks;
-
-    stack.SetSize (1000);
-    stackdir.SetSize(1000);
-    pis.SetSize(0);
-
-    stack.Elem(1) = root;
-    stackdir.Elem(1) = 0;
-    stacks = 1;
-
-    while (stacks)
-      {
-	node = stack.Get(stacks);
-	dir = stackdir.Get(stacks); 
-	stacks--;
-
-	if (node->pi)
-	  {
-	    if (node->data[0] >= bmin[0] && node->data[0] <= bmax[0] &&
-		node->data[1] >= bmin[1] && node->data[1] <= bmax[1] &&
-		node->data[2] >= bmin[2] && node->data[2] <= bmax[2])
-
-	      pis.Append (node->pi);
-	  }
-
-
-	int ndir = dir+1;
-	if (ndir == 3)
-	  ndir = 0;
-
-	int mini = int ( (bmin[dir] - node->minx) / node->dist );
-	int maxi = int ( (bmax[dir] - node->minx) / node->dist );
-      
-	//      (*testout) << "get int, mini, maxi = " << mini << ", " << maxi << endl;
-	if (mini < 0) mini = 0;
-	if (maxi >= ADTN_DIV) maxi = ADTN_DIV-1;
-
-	for (i = mini; i <= maxi; i++)
-	  if (node->childs[i])
-	    {
-	      stacks++;
-	      stack.Elem(stacks) = node->childs[i];
-	      stackdir.Elem(stacks) = ndir;
-	    }
-
-
-	/*
-	  if (node->left && bmin[dir] <= node->sep)
-	  {
-	  stacks++;
-	  stack.Elem(stacks) = node->left;
-	  stackdir.Elem(stacks) = ndir;
-	  }
-	  if (node->right && bmax[dir] >= node->sep)
-	  {
-	  stacks++;
-	  stack.Elem(stacks) = node->right;
-	  stackdir.Elem(stacks) = ndir;
-	  }
-	*/
-      }
-  }
-
-  void ADTree3Div :: PrintRec (ostream & ost, const ADTreeNode3Div * node) const
-  {
-  
-    if (node->data)
-      {
-	ost << node->pi << ": ";
-	ost << node->nchilds << " childs, ";
-	ost << " from " << node->minx << " - " << node->minx + node->dist*ADTN_DIV << "  ";
-	for (int i = 0; i < 3; i++)
-	  ost << node->data[i] << " ";
-	ost << endl;
-      }
-    int i;
-    for (i = 0; i < ADTN_DIV; i++)
-      if (node->childs[i])
-	PrintRec (ost, node->childs[i]);
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-  /* ******************************* ADTree3M ******************************* */
-
-
-  ADTreeNode3M :: ADTreeNode3M()
-  {
-    int i;
-    for (i = 0; i < ADTN_SIZE; i++)
-      pi[i] = 0;
-
-    left = NULL;
-    right = NULL;
-    father = NULL;
-    nchilds = 0;
-  }
-
-  void ADTreeNode3M :: DeleteChilds ()
-  {
-    if (left)
-      {
-	left->DeleteChilds();
-	delete left;
-	left = NULL;
-      }
-    if (right)
-      {
-	right->DeleteChilds();
-	delete right;
-	right = NULL;
-      }
-  }
-
-
-  BlockAllocator ADTreeNode3M :: ball(sizeof (ADTreeNode3M));
-
-  void * ADTreeNode3M :: operator new(size_t)
-  {
-    return ball.Alloc();
-  }
-
-  void ADTreeNode3M :: operator delete (void * p)
-  {
-    ball.Free (p);
-  }
-
-
-
-
-
-
-
-  ADTree3M :: ADTree3M (const float * acmin, 
-			const float * acmax)
-    : ela(0)
-  {
-    memcpy (cmin, acmin, 3 * sizeof(float));
-    memcpy (cmax, acmax, 3 * sizeof(float));
-
-    root = new ADTreeNode3M;
-    root->sep = (cmin[0] + cmax[0]) / 2;
-  }
-
-  ADTree3M :: ~ADTree3M ()
-  {
-    root->DeleteChilds();
-    delete root;
-  }
-
-
-  void ADTree3M :: Insert (const float * p, int pi)
-  {
-    ADTreeNode3M *node;
-    ADTreeNode3M *next;
-    int dir;
-    int lr;
-    int i;
-    float bmin[3];
-    float bmax[3];
-  
-    memcpy (bmin, cmin, 3 * sizeof(float));
-    memcpy (bmax, cmax, 3 * sizeof(float));
-
-    next = root;
-    dir = 0;
-    while (next)
-      {
-	node = next;
-
-	for (i = 0; i < ADTN_SIZE; i++)
-	  if (!node->pi[i])
-	    {    
-	      memcpy (node->data[i], p, 3 * sizeof(float));
-	      node->pi[i] = pi;
-	    
-	      if (ela.Size() < pi)
-		ela.SetSize (pi);
-	      ela.Elem(pi) = node;
-	    
-	      return;
-	    }
-
-	if (node->sep > p[dir])
-	  {
-	    next = node->left;
-	    bmax[dir] = node->sep;
-	    lr = 0;
-	  }
-	else
-	  {
-	    next = node->right;
-	    bmin[dir] = node->sep;
-	    lr = 1;
-	  }
-
-	dir++;
-	if (dir == 3)
-	  dir = 0;
-      }
-
-
-    next = new ADTreeNode3M;
-    memcpy (next->data[0], p, 3 * sizeof(float));
-    next->pi[0] = pi;
-    next->sep = (bmin[dir] + bmax[dir]) / 2;
-
-
-    if (ela.Size() < pi)
-      ela.SetSize (pi);
-    ela.Elem(pi) = next;
-
-
-    if (lr)
-      node->right = next;
-    else
-      node->left = next;
-    next -> father = node;
-
-    while (node)
-      {
-	node->nchilds++;
-	node = node->father;
-      }
-  }
-
-  void ADTree3M :: DeleteElement (int pi)
-  {
-    ADTreeNode3M * node = ela.Get(pi);
-
-    int i;
-    for (i = 0; i < ADTN_SIZE; i++)
-      if (node->pi[i] == pi)
-	node->pi[i] = 0;
-
-    node = node->father;
-    while (node)
-      {
-	node->nchilds--;
-	node = node->father;
-      }
-  }
-
-  void ADTree3M :: GetIntersecting (const float * bmin, 
-				    const float * bmax,
-				    ARRAY<int> & pis) const
-  {
-    static ARRAY<ADTreeNode3M*> stack(1000);
-    static ARRAY<int> stackdir(1000);
-    ADTreeNode3M * node;
-    int dir, i, stacks;
-
-    stack.SetSize (1000);
-    stackdir.SetSize(1000);
-    pis.SetSize(0);
-
-    stack.Elem(1) = root;
-    stackdir.Elem(1) = 0;
-    stacks = 1;
-
-    while (stacks)
-      {
-	node = stack.Get(stacks);
-	dir = stackdir.Get(stacks); 
-	stacks--;
-
-	int * hpi = node->pi;
-	for (i = 0; i < ADTN_SIZE; i++)
-	  if (hpi[i])
-	    {
-	      float * datai = &node->data[i][0];
-	      if (datai[0] >= bmin[0] && datai[0] <= bmax[0] &&
-		  datai[1] >= bmin[1] && datai[1] <= bmax[1] &&
-		  datai[2] >= bmin[2] && datai[2] <= bmax[2])
-	      
-		pis.Append (node->pi[i]);
-	    }
-
-
-	int ndir = dir+1;
-	if (ndir == 3)
-	  ndir = 0;
-
-	if (node->left && bmin[dir] <= node->sep)
-	  {
-	    stacks++;
-	    stack.Elem(stacks) = node->left;
-	    stackdir.Elem(stacks) = ndir;
-	  }
-	if (node->right && bmax[dir] >= node->sep)
-	  {
-	    stacks++;
-	    stack.Elem(stacks) = node->right;
-	    stackdir.Elem(stacks) = ndir;
-	  }
-      }
-  }
-
-  void ADTree3M :: PrintRec (ostream & ost, const ADTreeNode3M * node) const
-  {
-  
-    if (node->data)
-      {
-	//      ost << node->pi << ": ";
-	ost << node->nchilds << " childs, ";
-	for (int i = 0; i < 3; i++)
-	  ost << node->data[i] << " ";
-	ost << endl;
-      }
-    if (node->left)
-      PrintRec (ost, node->left);
-    if (node->right)
-      PrintRec (ost, node->right);
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-  /* ******************************* ADTree3F ******************************* */
-
-
-  ADTreeNode3F :: ADTreeNode3F()
-  {
-    pi = 0;
-    father = NULL;
-    nchilds = 0;
-    int i;
-    for (i = 0; i < 8; i++)
-      childs[i] = NULL;
-  }
-
-  void ADTreeNode3F :: DeleteChilds ()
-  {
-    int i;
-
-    for (i = 0; i < 8; i++)
-      {
-	if (childs[i])
-	  childs[i]->DeleteChilds();
-	delete childs[i];
-	childs[i] = NULL;
-      }
-  }
-
-
-  BlockAllocator ADTreeNode3F :: ball(sizeof (ADTreeNode3F));
-
-  void * ADTreeNode3F :: operator new(size_t)
-  {
-    return ball.Alloc();
-  }
-
-  void ADTreeNode3F :: operator delete (void * p)
-  {
-    ball.Free (p);
-  }
-
-
-
-
-
-
-
-  ADTree3F :: ADTree3F (const float * acmin, 
-			const float * acmax)
-    : ela(0)
-  {
-    memcpy (cmin, acmin, 3 * sizeof(float));
-    memcpy (cmax, acmax, 3 * sizeof(float));
-
-    root = new ADTreeNode3F;
-    for (int i = 0; i < 3; i++)
-      root->sep[i] = (cmin[i] + cmax[i]) / 2;
-  }
-
-  ADTree3F :: ~ADTree3F ()
-  {
-    root->DeleteChilds();
-    delete root;
-  }
-
-
-  void ADTree3F :: Insert (const float * p, int pi)
-  {
-    ADTreeNode3F *node;
-    ADTreeNode3F *next;
-    int lr;
-
-    float bmin[3];
-    float bmax[3];
-    int i, dir;
-  
-    memcpy (bmin, cmin, 3 * sizeof(float));
-    memcpy (bmax, cmax, 3 * sizeof(float));
-
-
-    next = root;
-    while (next)
-      {
-	node = next;
-      
-	if (!node->pi)
-	  {    
-	    memcpy (node->data, p, 3 * sizeof(float));
-	    node->pi = pi;
-
-	    if (ela.Size() < pi)
-	      ela.SetSize (pi);
-	    ela.Elem(pi) = node;
-
-	    return;
-	  }
-
-	dir = 0;
-	for (i = 0; i < 3; i++)
-	  {
-	    if (node->sep[i] > p[i])
-	      {
-		bmax[i] = node->sep[i];
-	      }
-	    else
-	      {
-		bmin[i] = node->sep[i];
-		dir += (1 << i);
-	      }
-	  }
-	next = node->childs[dir];
-
-	/*
-	  if (node->sep > p[dir])
-	  {
-	  next = node->left;
-	  bmax[dir] = node->sep;
-	  lr = 0;
-	  }
-	  else
-	  {
-	  next = node->right;
-	  bmin[dir] = node->sep;
-	  lr = 1;
-	  }
-	*/
-      }
-
-
-    next = new ADTreeNode3F;
-    memcpy (next->data, p, 3 * sizeof(float));
-    next->pi = pi;
-
-    for (i = 0; i < 3; i++)
-      next->sep[i] = (bmin[i] + bmax[i]) / 2;
-  
-
-    if (ela.Size() < pi)
-      ela.SetSize (pi);
-    ela.Elem(pi) = next;
-
-    node->childs[dir] = next;
-    next->father = node;
-
-    while (node)
-      {
-	node->nchilds++;
-	node = node->father;
-      }
-  }
-
-  void ADTree3F :: DeleteElement (int pi)
-  {
-    ADTreeNode3F * node = ela.Get(pi);
-
-    node->pi = 0;
-
-    node = node->father;
-    while (node)
-      {
-	node->nchilds--;
-	node = node->father;
-      }
-  }
-
-  void ADTree3F :: GetIntersecting (const float * bmin, 
-				    const float * bmax,
-				    ARRAY<int> & pis) const
-  {
-    static ARRAY<ADTreeNode3F*> stack(1000);
-    ADTreeNode3F * node;
-    int dir, i, stacks;
-
-    stack.SetSize (1000);
-    pis.SetSize(0);
-
-    stack.Elem(1) = root;
-    stacks = 1;
-
-    while (stacks)
-      {
-	node = stack.Get(stacks);
-	stacks--;
-
-	if (node->pi)
-	  {
-	    if (node->data[0] >= bmin[0] && node->data[0] <= bmax[0] &&
-		node->data[1] >= bmin[1] && node->data[1] <= bmax[1] &&
-		node->data[2] >= bmin[2] && node->data[2] <= bmax[2])
-
-	      pis.Append (node->pi);
-	  }
-
-      
-	int i1min = (bmin[0] <= node->sep[0]) ? 0 : 1;
-	int i1max = (bmax[0] < node->sep[0]) ? 0 : 1;
-	int i2min = (bmin[1] <= node->sep[1]) ? 0 : 1;
-	int i2max = (bmax[1] < node->sep[1]) ? 0 : 1;
-	int i3min = (bmin[2] <= node->sep[2]) ? 0 : 1;
-	int i3max = (bmax[2] < node->sep[2]) ? 0 : 1;
-
-	int i1, i2, i3;
-	for (i1 = i1min; i1 <= i1max; i1++)
-	  for (i2 = i2min; i2 <= i2max; i2++)
-	    for (i3 = i3min; i3 <= i3max; i3++)
-	      {
-		i = i1+2*i2+4*i3;
-		if (node->childs[i])
-		  {
-		    stacks++;
-		    stack.Elem(stacks) = node->childs[i];
-		  }
-	      }
-      
-	/*
-	  if (node->left && bmin[dir] <= node->sep)
-	  {
-	  stacks++;
-	  stack.Elem(stacks) = node->left;
-	  stackdir.Elem(stacks) = ndir;
-	  }
-	  if (node->right && bmax[dir] >= node->sep)
-	  {
-	  stacks++;
-	  stack.Elem(stacks) = node->right;
-	  stackdir.Elem(stacks) = ndir;
-	  }
-	*/
-      }
-  }
-
-  void ADTree3F :: PrintRec (ostream & ost, const ADTreeNode3F * node) const
-  {
-    int i;
-    if (node->data)
-      {
-	ost << node->pi << ": ";
-	ost << node->nchilds << " childs, ";
-	for (i = 0; i < 3; i++)
-	  ost << node->data[i] << " ";
-	ost << endl;
-      }
-
-    for (i = 0; i < 8; i++)
-      if (node->childs[i])
-	PrintRec (ost, node->childs[i]);
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-
-  /* ******************************* ADTree3FM ******************************* */
-
-
-  ADTreeNode3FM :: ADTreeNode3FM()
-  {
-    father = NULL;
-    nchilds = 0;
-    int i;
-
-    for (i = 0; i < ADTN_SIZE; i++)
-      pi[i] = 0;
-
-    for (i = 0; i < 8; i++)
-      childs[i] = NULL;
-  }
-
-  void ADTreeNode3FM :: DeleteChilds ()
-  {
-    int i;
-
-    for (i = 0; i < 8; i++)
-      {
-	if (childs[i])
-	  childs[i]->DeleteChilds();
-	delete childs[i];
-	childs[i] = NULL;
-      }
-  }
-
-
-  BlockAllocator ADTreeNode3FM :: ball(sizeof (ADTreeNode3FM));
-
-  void * ADTreeNode3FM :: operator new(size_t)
-  {
-    return ball.Alloc();
-  }
-
-  void ADTreeNode3FM :: operator delete (void * p)
-  {
-    ball.Free (p);
-  }
-
-
-
-
-
-
-
-  ADTree3FM :: ADTree3FM (const float * acmin, 
-			  const float * acmax)
-    : ela(0)
-  {
-    memcpy (cmin, acmin, 3 * sizeof(float));
-    memcpy (cmax, acmax, 3 * sizeof(float));
-
-    root = new ADTreeNode3FM;
-    for (int i = 0; i < 3; i++)
-      root->sep[i] = (cmin[i] + cmax[i]) / 2;
-  }
-
-  ADTree3FM :: ~ADTree3FM ()
-  {
-    root->DeleteChilds();
-    delete root;
-  }
-
-
-  void ADTree3FM :: Insert (const float * p, int pi)
-  {
-    ADTreeNode3FM *node;
-    ADTreeNode3FM *next;
-    int lr;
-
-    float bmin[3];
-    float bmax[3];
-    int i, dir;
-  
-    memcpy (bmin, cmin, 3 * sizeof(float));
-    memcpy (bmax, cmax, 3 * sizeof(float));
-
-    next = root;
-    while (next)
-      {
-	node = next;
-      
-	for (i = 0; i < ADTN_SIZE; i++)
-	  if (!node->pi[i])
-	    {    
-	      memcpy (node->data[i], p, 3 * sizeof(float));
-	      node->pi[i] = pi;
-	    
-	      if (ela.Size() < pi)
-		ela.SetSize (pi);
-	      ela.Elem(pi) = node;
-	    
-	      return;
-	    }
-
-	dir = 0;
-	for (i = 0; i < 3; i++)
-	  {
-	    if (node->sep[i] > p[i])
-	      {
-		bmax[i] = node->sep[i];
-	      }
-	    else
-	      {
-		bmin[i] = node->sep[i];
-		dir += (1 << i);
-	      }
-	  }
-	next = node->childs[dir];
-
-	/*
-	  if (node->sep > p[dir])
-	  {
-	  next = node->left;
-	  bmax[dir] = node->sep;
-	  lr = 0;
-	  }
-	  else
-	  {
-	  next = node->right;
-	  bmin[dir] = node->sep;
-	  lr = 1;
-	  }
-	*/
-      }
-
-
-    next = new ADTreeNode3FM;
-    memcpy (next->data[0], p, 3 * sizeof(float));
-    next->pi[0] = pi;
-
-    for (i = 0; i < 3; i++)
-      next->sep[i] = (bmin[i] + bmax[i]) / 2;
-  
-
-    if (ela.Size() < pi)
-      ela.SetSize (pi);
-    ela.Elem(pi) = next;
-
-    node->childs[dir] = next;
-    next->father = node;
-
-    while (node)
-      {
-	node->nchilds++;
-	node = node->father;
-      }
-  }
-
-  void ADTree3FM :: DeleteElement (int pi)
-  {
-    ADTreeNode3FM * node = ela.Get(pi);
-
-    int i;
-    for (i = 0; i < ADTN_SIZE; i++)
-      if (node->pi[i] == pi)
-	node->pi[i] = 0;
-
-    node = node->father;
-    while (node)
-      {
-	node->nchilds--;
-	node = node->father;
-      }
-  }
-
-  void ADTree3FM :: GetIntersecting (const float * bmin, 
-				     const float * bmax,
-				     ARRAY<int> & pis) const
-  {
-    static ARRAY<ADTreeNode3FM*> stack(1000);
-    ADTreeNode3FM * node;
-    int dir, i, stacks;
-
-    stack.SetSize (1000);
-    pis.SetSize(0);
-
-    stack.Elem(1) = root;
-    stacks = 1;
-
-    while (stacks)
-      {
-	node = stack.Get(stacks);
-	stacks--;
-
-	int * hpi = node->pi;
-	for (i = 0; i < ADTN_SIZE; i++)
-	  if (hpi[i])
-	    {
-	      float * datai = &node->data[i][0];
-	      if (datai[0] >= bmin[0] && datai[0] <= bmax[0] &&
-		  datai[1] >= bmin[1] && datai[1] <= bmax[1] &&
-		  datai[2] >= bmin[2] && datai[2] <= bmax[2])
-	      
-		pis.Append (node->pi[i]);
-	    }
-
-	/*
-	  if (node->pi)
-	  {
-	  if (node->data[0] >= bmin[0] && node->data[0] <= bmax[0] &&
-	  node->data[1] >= bmin[1] && node->data[1] <= bmax[1] &&
-	  node->data[2] >= bmin[2] && node->data[2] <= bmax[2])
-
-	  pis.Append (node->pi);
-	  }
-	*/
-      
-	int i1min = (bmin[0] <= node->sep[0]) ? 0 : 1;
-	int i1max = (bmax[0] < node->sep[0]) ? 0 : 1;
-	int i2min = (bmin[1] <= node->sep[1]) ? 0 : 1;
-	int i2max = (bmax[1] < node->sep[1]) ? 0 : 1;
-	int i3min = (bmin[2] <= node->sep[2]) ? 0 : 1;
-	int i3max = (bmax[2] < node->sep[2]) ? 0 : 1;
-
-	int i1, i2, i3;
-	for (i1 = i1min; i1 <= i1max; i1++)
-	  for (i2 = i2min; i2 <= i2max; i2++)
-	    for (i3 = i3min; i3 <= i3max; i3++)
-	      {
-		i = i1+2*i2+4*i3;
-		if (node->childs[i])
-		  {
-		    stacks++;
-		    stack.Elem(stacks) = node->childs[i];
-		  }
-	      }
-      
-	/*
-	  if (node->left && bmin[dir] <= node->sep)
-	  {
-	  stacks++;
-	  stack.Elem(stacks) = node->left;
-	  stackdir.Elem(stacks) = ndir;
-	  }
-	  if (node->right && bmax[dir] >= node->sep)
-	  {
-	  stacks++;
-	  stack.Elem(stacks) = node->right;
-	  stackdir.Elem(stacks) = ndir;
-	  }
-	*/
-      }
-  }
-
-  void ADTree3FM :: PrintRec (ostream & ost, const ADTreeNode3FM * node) const
-  {
-    int i;
-    if (node->data)
-      {
-	ost << node->pi << ": ";
-	ost << node->nchilds << " childs, ";
-	for (i = 0; i < 3; i++)
-	  ost << node->data[i] << " ";
-	ost << endl;
-      }
-
-    for (i = 0; i < 8; i++)
-      if (node->childs[i])
-	PrintRec (ost, node->childs[i]);
-  }
-
-
-
-
-#endif
-
-
-
-
-
-
-  /* ******************************* ADTree6 ******************************* */
-
-
-  ADTreeNode6 :: ADTreeNode6()
-  {
-    pi = -1;
-
-    left = NULL;
-    right = NULL;
-    father = NULL;
-    nchilds = 0;
-  }
-
-  void ADTreeNode6 :: DeleteChilds ()
-  {
-    if (left)
-      {
-	left->DeleteChilds();
-	delete left;
-	left = NULL;
-      }
-    if (right)
-      {
-	right->DeleteChilds();
-	delete right;
-	right = NULL;
-      }
-  }
-
-
-  BlockAllocator ADTreeNode6 :: ball (sizeof (ADTreeNode6));
-  void * ADTreeNode6 :: operator new(size_t)
-  {
-    return ball.Alloc();
-  }
-
-  void ADTreeNode6 :: operator delete (void * p)
-  {
-    ball.Free (p);
-  }
-
-
-
-
-
-  ADTree6 :: ADTree6 (const float * acmin, 
-		      const float * acmax)
-    : ela(0)
-  {
-    memcpy (cmin, acmin, 6 * sizeof(float));
-    memcpy (cmax, acmax, 6 * sizeof(float));
-
-    root = new ADTreeNode6;
-    root->sep = (cmin[0] + cmax[0]) / 2;
-  }
-
-  ADTree6 :: ~ADTree6 ()
-  {
-    root->DeleteChilds();
-    delete root;
-  }
-
-  void ADTree6 :: Insert (const float * p, int pi)
-  {
-    ADTreeNode6 *node;
-    ADTreeNode6 *next;
-    int dir;
-    int lr;
-
-    float bmin[6];
-    float bmax[6];
-
-  
-    memcpy (bmin, cmin, 6 * sizeof(float));
-    memcpy (bmax, cmax, 6 * sizeof(float));
-
-    next = root;
-    dir = 0;
-    while (next)
-      {
-	node = next;
-
-	if (node->pi == -1)
-	  {    
-	    memcpy (node->data, p, 6 * sizeof(float));
-	    node->pi = pi;
-
-	    if (ela.Size() < pi+1)
-	      ela.SetSize (pi+1);
-	    ela[pi] = node;
-
-	    return;
-	  }
-
-	if (node->sep > p[dir])
-	  {
-	    next = node->left;
-	    bmax[dir] = node->sep;
-	    lr = 0;
-	  }
-	else
-	  {
-	    next = node->right;
-	    bmin[dir] = node->sep;
-	    lr = 1;
-	  }
-
-	dir++;
-	if (dir == 6)
-	  dir = 0;
-      }
-
-
-    next = new ADTreeNode6;
-    memcpy (next->data, p, 6 * sizeof(float));
-    next->pi = pi;
-    next->sep = (bmin[dir] + bmax[dir]) / 2;
-
-
-    if (ela.Size() < pi+1)
-      ela.SetSize (pi+1);
-    ela[pi] = next;
-
-
-    if (lr)
-      node->right = next;
-    else
-      node->left = next;
-    next -> father = node;
-
-    while (node)
-      {
-	node->nchilds++;
-	node = node->father;
-      }
-  }
-
-  void ADTree6 :: DeleteElement (int pi)
-  {
-    ADTreeNode6 * node = ela[pi];
-
-    node->pi = -1;
-
-    node = node->father;
-    while (node)
-      {
-	node->nchilds--;
-	node = node->father;
-      }
-  }
-
-  void ADTree6 :: PrintMemInfo (ostream & ost) const
-  {
-    ost << Elements() << " elements a " << sizeof(ADTreeNode6) 
-	<< " Bytes = "
-	<< Elements() * sizeof(ADTreeNode6) << endl;
-    ost << "maxind = " << ela.Size() << " = " << sizeof(ADTreeNode6*) * ela.Size() << " Bytes" << endl;
-  }
-
-
-
-  class inttn6 {
-  public:
-    int dir;
-    ADTreeNode6 * node;
-  };
-
-
-
-
-  void ADTree6 :: GetIntersecting (const float * bmin, 
-				   const float * bmax,
-				   ARRAY<int> & pis) const
-  {
-    static ARRAY<inttn6> stack(10000);
-    ADTreeNode6 * node;
-    int dir, stacks;
-
-    stack.SetSize (10000);
-    pis.SetSize(0);
-
-    stack.Elem(1).node = root;
-    stack.Elem(1).dir = 0;
-    stacks = 1;
-
-    while (stacks)
-      {
-	node = stack.Get(stacks).node;
-	dir = stack.Get(stacks).dir; 
-	stacks--;
-
-	if (node->pi != -1)
-	  {
-	  
-	    // 	  int in = 1;
-	    // 	  for (i = 0; i < 3; i++)
-	    // 	    if (/* node->data[i] < bmin[i]  || */ node->data[i] > bmax[i] || 
-	    // 		node->data[i+3] < bmin[i+3] /* || node->data[i+3] > bmax[i+3] */ )
-	    // 	      {
-	    // 		in = 0;
-	    // 		break;
-	    // 	      }
-
-	    // 	  if (in)
-	    // 	    pis.Append (node->pi);
-
-	    if (node->data[0] > bmax[0] || 
-		node->data[1] > bmax[1] || 
-		node->data[2] > bmax[2] || 
-		node->data[3] < bmin[3] || 
-		node->data[4] < bmin[4] || 
-		node->data[5] < bmin[5])
-	      ;
-	    else
-	      pis.Append (node->pi);
-	  }
-
-
-	int ndir = dir+1;
-	if (ndir == 6)
-	  ndir = 0;
-
-	if (node->left && bmin[dir] <= node->sep)
-	  {
-	    stacks++;
-	    stack.Elem(stacks).node = node->left;
-	    stack.Elem(stacks).dir = ndir;
-	  }
-	if (node->right && bmax[dir] >= node->sep)
-	  {
-	    stacks++;
-	    stack.Elem(stacks).node = node->right;
-	    stack.Elem(stacks).dir = ndir;
-	  }
-      }
-  }
-
-  /*
-    void ADTree6 :: GetIntersecting (const float * bmin, 
-    const float * bmax,
-    ARRAY<int> & pis) const
-    {
-    static ARRAY<ADTreeNode6*> stack(10000);
-    static ARRAY<int> stackdir(10000);
-    ADTreeNode6 * node;
-    int dir, stacks;
-
-    stack.SetSize (10000);
-    stackdir.SetSize(10000);
-    pis.SetSize(0);
-
-    stack.Elem(1) = root;
-    stackdir.Elem(1) = 0;
-    stacks = 1;
-
-    while (stacks)
-    {
-    node = stack.Get(stacks);
-    dir = stackdir.Get(stacks); 
-    stacks--;
-
-    if (node->pi)
-    {
-	  
-    if (node->data[0] > bmax[0] || 
-    node->data[1] > bmax[1] || 
-    node->data[2] > bmax[2] || 
-    node->data[3] < bmin[3] || 
-    node->data[4] < bmin[4] || 
-    node->data[5] < bmin[5])
-    ;
-    else
-    pis.Append (node->pi);
-    }
-
-
-    int ndir = dir+1;
-    if (ndir == 6)
-    ndir = 0;
-
-    if (node->left && bmin[dir] <= node->sep)
-    {
-    stacks++;
-    stack.Elem(stacks) = node->left;
-    stackdir.Elem(stacks) = ndir;
-    }
-    if (node->right && bmax[dir] >= node->sep)
-    {
-    stacks++;
-    stack.Elem(stacks) = node->right;
-    stackdir.Elem(stacks) = ndir;
-    }
-    }
-    }
-  */
-
-
-  void ADTree6 :: PrintRec (ostream & ost, const ADTreeNode6 * node) const
-  {
-  
-    if (node->data)
-      {
-	ost << node->pi << ": ";
-	ost << node->nchilds << " childs, ";
-	for (int i = 0; i < 6; i++)
-	  ost << node->data[i] << " ";
-	ost << endl;
-      }
-    if (node->left)
-      PrintRec (ost, node->left);
-    if (node->right)
-      PrintRec (ost, node->right);
-  }
-
-
-  int ADTree6 :: DepthRec (const ADTreeNode6 * node) const
-  {
-    int ldepth = 0;
-    int rdepth = 0;
-
-    if (node->left)
-      ldepth = DepthRec(node->left);
-    if (node->right)
-      rdepth = DepthRec(node->right);
-    return 1 + max2 (ldepth, rdepth);
-  }
-
-  int ADTree6 :: ElementsRec (const ADTreeNode6 * node) const
-  {
-    int els = 1;
-    if (node->left)
-      els += ElementsRec(node->left);
-    if (node->right)
-      els += ElementsRec(node->right);
-    return els;
-  }
-
-
-
-
-
-
-#ifdef ABC
-
-  /* ******************************* ADTree6F ******************************* */
-
-
-  ADTreeNode6F :: ADTreeNode6F()
-  {
-    pi = 0;
-    father = NULL;
-    nchilds = 0;
-    int i;
-    for (i = 0; i < 64; i++)
-      childs[i] = NULL;
-  }
-
-  void ADTreeNode6F :: DeleteChilds ()
-  {
-    int i;
-
-    for (i = 0; i < 64; i++)
-      {
-	if (childs[i])
-	  childs[i]->DeleteChilds();
-	delete childs[i];
-	childs[i] = NULL;
-      }
-  }
-
-
-  BlockAllocator ADTreeNode6F :: ball(sizeof (ADTreeNode6F));
-
-  void * ADTreeNode6F :: operator new(size_t)
-  {
-    return ball.Alloc();
-  }
-
-  void ADTreeNode6F :: operator delete (void * p)
-  {
-    ball.Free (p);
-  }
-
-
-
-
-
-
-
-  ADTree6F :: ADTree6F (const float * acmin, 
-			const float * acmax)
-    : ela(0)
-  {
-    memcpy (cmin, acmin, 6 * sizeof(float));
-    memcpy (cmax, acmax, 6 * sizeof(float));
-
-    root = new ADTreeNode6F;
-    for (int i = 0; i < 6; i++)
-      root->sep[i] = (cmin[i] + cmax[i]) / 2;
-  }
-
-  ADTree6F :: ~ADTree6F ()
-  {
-    root->DeleteChilds();
-    delete root;
-  }
-
-
-  void ADTree6F :: Insert (const float * p, int pi)
-  {
-    ADTreeNode6F *node;
-    ADTreeNode6F *next;
-    int lr;
-
-    float bmin[6];
-    float bmax[6];
-    int i, dir;
-  
-    memcpy (bmin, cmin, 6 * sizeof(float));
-    memcpy (bmax, cmax, 6 * sizeof(float));
-
-    next = root;
-    while (next)
-      {
-	node = next;
-      
-	if (!node->pi)
-	  {    
-	    memcpy (node->data, p, 6 * sizeof(float));
-	    node->pi = pi;
-
-	    if (ela.Size() < pi)
-	      ela.SetSize (pi);
-	    ela.Elem(pi) = node;
-
-	    return;
-	  }
-
-	dir = 0;
-	for (i = 0; i < 6; i++)
-	  {
-	    if (node->sep[i] > p[i])
-	      {
-		bmax[i] = node->sep[i];
-	      }
-	    else
-	      {
-		bmin[i] = node->sep[i];
-		dir += (1 << i);
-	      }
-	  }
-	next = node->childs[dir];
-
-	/*
-	  if (node->sep > p[dir])
-	  {
-	  next = node->left;
-	  bmax[dir] = node->sep;
-	  lr = 0;
-	  }
-	  else
-	  {
-	  next = node->right;
-	  bmin[dir] = node->sep;
-	  lr = 1;
-	  }
-	*/
-      }
-
-
-    next = new ADTreeNode6F;
-    memcpy (next->data, p, 6 * sizeof(float));
-    next->pi = pi;
-
-    for (i = 0; i < 6; i++)
-      next->sep[i] = (bmin[i] + bmax[i]) / 2;
-  
-
-    if (ela.Size() < pi)
-      ela.SetSize (pi);
-    ela.Elem(pi) = next;
-
-    node->childs[dir] = next;
-    next->father = node;
-
-    while (node)
-      {
-	node->nchilds++;
-	node = node->father;
-      }
-  }
-
-  void ADTree6F :: DeleteElement (int pi)
-  {
-    ADTreeNode6F * node = ela.Get(pi);
-
-    node->pi = 0;
-
-    node = node->father;
-    while (node)
-      {
-	node->nchilds--;
-	node = node->father;
-      }
-  }
-
-  void ADTree6F :: GetIntersecting (const float * bmin, 
-				    const float * bmax,
-				    ARRAY<int> & pis) const
-  {
-    static ARRAY<ADTreeNode6F*> stack(1000);
-    ADTreeNode6F * node;
-    int dir, i, stacks;
-
-    stack.SetSize (1000);
-    pis.SetSize(0);
-
-    stack.Elem(1) = root;
-    stacks = 1;
-
-    while (stacks)
-      {
-	node = stack.Get(stacks);
-	stacks--;
-
-	if (node->pi)
-	  {
-	    if (
-		node->data[0] >= bmin[0] && node->data[0] <= bmax[0] &&
-		node->data[1] >= bmin[1] && node->data[1] <= bmax[1] &&
-		node->data[2] >= bmin[2] && node->data[2] <= bmax[2] &&
-		node->data[3] >= bmin[3] && node->data[3] <= bmax[3] &&
-		node->data[4] >= bmin[4] && node->data[4] <= bmax[4] &&
-		node->data[5] >= bmin[5] && node->data[5] <= bmax[5]
-		)
-
-	      pis.Append (node->pi);
-	  }
-
-      
-	int i1min = (bmin[0] <= node->sep[0]) ? 0 : 1;
-	int i1max = (bmax[0] < node->sep[0]) ? 0 : 1;
-	int i2min = (bmin[1] <= node->sep[1]) ? 0 : 1;
-	int i2max = (bmax[1] < node->sep[1]) ? 0 : 1;
-	int i3min = (bmin[2] <= node->sep[2]) ? 0 : 1;
-	int i3max = (bmax[2] < node->sep[2]) ? 0 : 1;
-
-	int i4min = (bmin[3] <= node->sep[3]) ? 0 : 1;
-	int i4max = (bmax[3] <  node->sep[3]) ? 0 : 1;
-	int i5min = (bmin[4] <= node->sep[4]) ? 0 : 1;
-	int i5max = (bmax[4] <  node->sep[4]) ? 0 : 1;
-	int i6min = (bmin[5] <= node->sep[5]) ? 0 : 1;
-	int i6max = (bmax[5] <  node->sep[5]) ? 0 : 1;
-
-	int i1, i2, i3, i4, i5, i6;
-	for (i1 = i1min; i1 <= i1max; i1++)
-	  for (i2 = i2min; i2 <= i2max; i2++)
-	    for (i3 = i3min; i3 <= i3max; i3++)
-	      for (i4 = i4min; i4 <= i4max; i4++)
-		for (i5 = i5min; i5 <= i5max; i5++)
-		  for (i6 = i6min; i6 <= i6max; i6++)
-		    {
-		      i = i1 + 2*i2 + 4*i3 + 8*i4 + 16*i5 +32*i6;
-		      if (node->childs[i])
-			{
-			  stacks++;
-			  stack.Elem(stacks) = node->childs[i];
-			}
-		    }
-      
-	/*
-	  if (node->left && bmin[dir] <= node->sep)
-	  {
-	  stacks++;
-	  stack.Elem(stacks) = node->left;
-	  stackdir.Elem(stacks) = ndir;
-	  }
-	  if (node->right && bmax[dir] >= node->sep)
-	  {
-	  stacks++;
-	  stack.Elem(stacks) = node->right;
-	  stackdir.Elem(stacks) = ndir;
-	  }
-	*/
-      }
-  }
-
-  void ADTree6F :: PrintRec (ostream & ost, const ADTreeNode6F * node) const
-  {
-    int i;
-    if (node->data)
-      {
-	ost << node->pi << ": ";
-	ost << node->nchilds << " childs, ";
-	for (i = 0; i < 6; i++)
-	  ost << node->data[i] << " ";
-	ost << endl;
-      }
-
-    for (i = 0; i < 64; i++)
-      if (node->childs[i])
-	PrintRec (ost, node->childs[i]);
-  }
-
-
-
-#endif
-
-
-
-  /* ************************************* Point3dTree ********************** */
-
-
-
-  Point3dTree :: Point3dTree (const Point3d & pmin, const Point3d & pmax)
-  {
-    float pmi[3], pma[3];
-    for (int i = 0; i < 3; i++)
-      {
-	pmi[i] = pmin.X(i+1);
-	pma[i] = pmax.X(i+1);
-      }
-    tree = new ADTree3 (pmi, pma);
-  }
-
-  Point3dTree :: ~Point3dTree ()
-  {
-    delete tree;
-  }
-
-
-
-  void Point3dTree :: Insert (const Point3d & p, int pi)
-  {
-    static float pd[3];
-    pd[0] = p.X();
-    pd[1] = p.Y();
-    pd[2] = p.Z();
-    tree->Insert (pd, pi);
-  }
-
-  void Point3dTree :: GetIntersecting (const Point3d & pmin, const Point3d & pmax, 
-				       ARRAY<int> & pis) const
-  {
-    float pmi[3], pma[3];
-    for (int i = 0; i < 3; i++)
-      {
-	pmi[i] = pmin.X(i+1);
-	pma[i] = pmax.X(i+1);
-      }
-    tree->GetIntersecting (pmi, pma, pis);
-  }
-
-
-
-
-
-
-
-
-
-
-  Box3dTree :: Box3dTree (const Point3d & apmin, const Point3d & apmax)
-  {
-    boxpmin = apmin;
-    boxpmax = apmax;
-    float tpmin[6], tpmax[6];
-    for (int i = 0; i < 3; i++)
-      {
-	tpmin[i] = tpmin[i+3] = boxpmin.X(i+1);
-	tpmax[i] = tpmax[i+3] = boxpmax.X(i+1);
-      }
-    tree = new ADTree6 (tpmin, tpmax);
-  }
-
-  Box3dTree :: ~Box3dTree ()
-  {
-    delete tree;
-  }
-
-  void Box3dTree :: Insert (const Point3d & bmin, const Point3d & bmax, int pi)
-  {
-    static float tp[6];
-
-    for (int i = 0; i < 3; i++)
-      {
-	tp[i] = bmin.X(i+1);
-	tp[i+3] = bmax.X(i+1);
-      }
-
-    tree->Insert (tp, pi);
-  }
-
-  void Box3dTree ::GetIntersecting (const Point3d & pmin, const Point3d & pmax, 
-				    ARRAY<int> & pis) const
-  {
-    float tpmin[6];
-    float tpmax[6];
-
-    for (int i = 0; i < 3; i++)
-      {
-	tpmin[i] = boxpmin.X(i+1);
-	tpmax[i] = pmax.X(i+1);
-      
-	tpmin[i+3] = pmin.X(i+1);
-	tpmax[i+3] = boxpmax.X(i+1);
-      }
-
-    tree->GetIntersecting (tpmin, tpmax, pis);
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/gprim/adtree.hpp b/contrib/Netgen/libsrc/gprim/adtree.hpp
deleted file mode 100644
index 64f3509e1ad97da0a29db01bc79c32cc7885ff4b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/adtree.hpp
+++ /dev/null
@@ -1,477 +0,0 @@
-#ifndef FILE_ADTREE
-#define FILE_ADTREE
-
-/* *************************************************************************/
-/* File:   adtree.hh                                                       */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   16. Feb. 98                                                     */
-/* Redesigned by Wolfram Muehlhuber, May 1998                              */
-/* *************************************************************************/
-
-
-
-/**
-  Alternating Digital Tree
- */
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-class ADTreeNode
-{
-public:
-  ADTreeNode *left, *right, *father;
-  int dim;
-  float sep;
-  float *data;
-  float *boxmin;
-  float *boxmax;
-  int pi;
-  int nchilds;
-
-  ADTreeNode (int adim);
-  ~ADTreeNode ();
-
-  friend class ADTree;
-};
-
-
-class ADTreeCriterion
-{
-public:
-  ADTreeCriterion() { }
-  virtual int Eval (const ADTreeNode * node) const = 0;
-};
-
-
-class ADTree
-{
-  int dim;
-  ADTreeNode * root;
-  float *cmin, *cmax;
-  ARRAY<ADTreeNode*> ela;
-  const ADTreeCriterion * criterion; 
-
-  ARRAY<ADTreeNode*> stack;
-  ARRAY<int> stackdir;
-  int stackindex;
-
-public:
-  ADTree (int adim, const float * acmin, 
-	   const float * acmax);
-  ~ADTree ();
-
-  void Insert (const float * p, int pi);
-  // void GetIntersecting (const float * bmin, const float * bmax,
-  //			ARRAY<int> & pis) const;
-  void SetCriterion (ADTreeCriterion & acriterion);
-  void Reset ();
-  int Next ();
-  void GetMatch (ARRAY<int> & matches);
-
-  void DeleteElement (int pi);
-
-
-  void Print (ostream & ost) const
-    { PrintRec (ost, root); }
-
-  void PrintRec (ostream & ost, const ADTreeNode * node) const;
-};
-
-
-
-class ADTreeNode3
-{
-public:
-  ADTreeNode3 *left, *right, *father;
-  float sep;
-  float data[3];
-  int pi;
-  int nchilds;
-
-  ADTreeNode3 ();
-  void DeleteChilds ();
-  friend class ADTree3;
-
-  static BlockAllocator ball;
-  void * operator new(size_t);
-  void operator delete (void *);
-};
-
-
-class ADTree3
-{
-  ADTreeNode3 * root;
-  float cmin[3], cmax[3];
-  ARRAY<ADTreeNode3*> ela;
-
-public:
-  ADTree3 (const float * acmin, 
-	   const float * acmax);
-  ~ADTree3 ();
-
-  void Insert (const float * p, int pi);
-  void GetIntersecting (const float * bmin, const float * bmax,
-			ARRAY<int> & pis) const;
-  
-  void DeleteElement (int pi);
-
-
-  void Print (ostream & ost) const
-    { PrintRec (ost, root); }
-
-  void PrintRec (ostream & ost, const ADTreeNode3 * node) const;
-};
-
-
-/*
-
-// divide each direction
-#define ADTN_DIV 10
-class ADTreeNode3Div
-{
-public:
-  ADTreeNode3Div *father;
-  ADTreeNode3Div *childs[ADTN_DIV];
-
-  float minx, dist;
-  float data[3];
-  int pi;
-  int nchilds;
-
-  ADTreeNode3Div ();
-  void DeleteChilds ();
-  friend class ADTree3Div;
-
-  static BlockAllocator ball;
-  void * operator new(size_t);
-  void operator delete (void *);
-};
-
-
-class ADTree3Div
-{
-  ADTreeNode3Div * root;
-  float cmin[3], cmax[3];
-  ARRAY<ADTreeNode3Div*> ela;
-
-public:
-  ADTree3Div (const float * acmin, 
-	   const float * acmax);
-  ~ADTree3Div ();
-
-  void Insert (const float * p, int pi);
-  void GetIntersecting (const float * bmin, const float * bmax,
-			ARRAY<int> & pis) const;
-  
-  void DeleteElement (int pi);
-
-
-  void Print (ostream & ost) const
-    { PrintRec (ost, root); }
-
-  void PrintRec (ostream & ost, const ADTreeNode3Div * node) const;
-};
-
-
-
-
-#define ADTN_SIZE 10
-
-// multiple entries
-class ADTreeNode3M
-{
-public:
-  ADTreeNode3M *left, *right, *father;
-  float sep;
-  float data[ADTN_SIZE][3];
-  int pi[ADTN_SIZE];
-  int nchilds;
-
-  ADTreeNode3M ();
-  void DeleteChilds ();
-  friend class ADTree3M;
-
-  static BlockAllocator ball;
-  void * operator new(size_t);
-  void operator delete (void *);
-};
-
-
-class ADTree3M
-{
-  ADTreeNode3M * root;
-  float cmin[3], cmax[3];
-  ARRAY<ADTreeNode3M*> ela;
-
-public:
-  ADTree3M (const float * acmin, 
-	   const float * acmax);
-  ~ADTree3M ();
-
-  void Insert (const float * p, int pi);
-  void GetIntersecting (const float * bmin, const float * bmax,
-			ARRAY<int> & pis) const;
-  
-  void DeleteElement (int pi);
-
-
-  void Print (ostream & ost) const
-    { PrintRec (ost, root); }
-
-  void PrintRec (ostream & ost, const ADTreeNode3M * node) const;
-};
-
-
-
-
-
-
-class ADTreeNode3F
-{
-public:
-  ADTreeNode3F *father;
-  ADTreeNode3F *childs[8];
-  float sep[3];
-  float data[3];
-  int pi;
-  int nchilds;
-
-  ADTreeNode3F ();
-  void DeleteChilds ();
-  friend class ADTree3F;
-
-  static BlockAllocator ball;
-  void * operator new(size_t);
-  void operator delete (void *);
-};
-
-// fat tree
-class ADTree3F
-{
-  ADTreeNode3F * root;
-  float cmin[3], cmax[3];
-  ARRAY<ADTreeNode3F*> ela;
-
-public:
-  ADTree3F (const float * acmin, 
-	   const float * acmax);
-  ~ADTree3F ();
-
-  void Insert (const float * p, int pi);
-  void GetIntersecting (const float * bmin, const float * bmax,
-			ARRAY<int> & pis) const;
-  
-  void DeleteElement (int pi);
-
-
-  void Print (ostream & ost) const
-    { PrintRec (ost, root); }
-
-  void PrintRec (ostream & ost, const ADTreeNode3F * node) const;
-};
-
-
-
-
-class ADTreeNode3FM
-{
-public:
-  ADTreeNode3FM *father;
-  ADTreeNode3FM *childs[8];
-  float sep[3];
-  float data[ADTN_SIZE][3];
-  int pi[ADTN_SIZE];
-  int nchilds;
-
-  ADTreeNode3FM ();
-  void DeleteChilds ();
-  friend class ADTree3FM;
-
-  static BlockAllocator ball;
-  void * operator new(size_t);
-  void operator delete (void *);
-};
-
-// fat tree
-class ADTree3FM
-{
-  ADTreeNode3FM * root;
-  float cmin[3], cmax[3];
-  ARRAY<ADTreeNode3FM*> ela;
-
-public:
-  ADTree3FM (const float * acmin, 
-	   const float * acmax);
-  ~ADTree3FM ();
-
-  void Insert (const float * p, int pi);
-  void GetIntersecting (const float * bmin, const float * bmax,
-			ARRAY<int> & pis) const;
-  
-  void DeleteElement (int pi);
-
-
-  void Print (ostream & ost) const
-    { PrintRec (ost, root); }
-
-  void PrintRec (ostream & ost, const ADTreeNode3FM * node) const;
-};
-
-
-
-*/
-
-
-
-
-
-class ADTreeNode6
-{
-public:
-  ADTreeNode6 *left, *right, *father;
-  float sep;
-  float data[6];
-  int pi;
-  int nchilds;
-
-  ADTreeNode6 ();
-  void DeleteChilds ();
-  friend class ADTree6;
-
-  static BlockAllocator ball;
-  void * operator new(size_t);
-  void operator delete (void *);
-};
-
-
-class ADTree6
-{
-  ADTreeNode6 * root;
-  float cmin[6], cmax[6];
-  ARRAY<ADTreeNode6*> ela;
-
-public:
-  ADTree6 (const float * acmin, 
-	   const float * acmax);
-  ~ADTree6 ();
-
-  void Insert (const float * p, int pi);
-  void GetIntersecting (const float * bmin, const float * bmax,
-			ARRAY<int> & pis) const;
-  
-  void DeleteElement (int pi);
-
-  
-  void Print (ostream & ost) const
-  { PrintRec (ost, root); }
-  int Depth () const
-  { return DepthRec (root); }
-  int Elements () const
-  { return ElementsRec (root); }
-
-  void PrintRec (ostream & ost, const ADTreeNode6 * node) const;
-  int DepthRec (const ADTreeNode6 * node) const;
-  int ElementsRec (const ADTreeNode6 * node) const;
-
-  void PrintMemInfo (ostream & ost) const;
-};
-
-
-
-
-/*
-
-class ADTreeNode6F
-{
-public:
-  ADTreeNode6F * father;
-  ADTreeNode6F * childs[64];
-  
-  float sep[6];
-  float data[6];
-  int pi;
-  int nchilds;
-
-  ADTreeNode6F ();
-  void DeleteChilds ();
-  friend class ADTree6F;
-
-  static BlockAllocator ball;
-  void * operator new(size_t);
-  void operator delete (void *);
-};
-
-
-class ADTree6F
-{
-  ADTreeNode6F * root;
-  float cmin[6], cmax[6];
-  ARRAY<ADTreeNode6F*> ela;
-
-public:
-  ADTree6F (const float * acmin, 
-	   const float * acmax);
-  ~ADTree6F ();
-
-  void Insert (const float * p, int pi);
-  void GetIntersecting (const float * bmin, const float * bmax,
-			ARRAY<int> & pis) const;
-  
-  void DeleteElement (int pi);
-
-
-  void Print (ostream & ost) const
-    { PrintRec (ost, root); }
-  int Depth () const
-    { return DepthRec (root); }
-
-  void PrintRec (ostream & ost, const ADTreeNode6F * node) const;
-  int DepthRec (const ADTreeNode6F * node) const;
-};
-
-
-
-
-
-
-
-*/
-
-
-
-
-
-class Point3dTree 
-{
-  ADTree3 * tree;
-
-public:
-  Point3dTree (const Point3d & pmin, const Point3d & pmax);
-  ~Point3dTree ();
-  void Insert (const Point3d & p, int pi);
-  void DeleteElement (int pi) 
-    { tree->DeleteElement(pi); }
-  void GetIntersecting (const Point3d & pmin, const Point3d & pmax, 
-			ARRAY<int> & pis) const;
-  const ADTree3 & Tree() const { return *tree; };
-};
-
-
-
-class Box3dTree
-{
-  ADTree6 * tree;
-  Point3d boxpmin, boxpmax;
-public:
-  Box3dTree (const Point3d & apmin, const Point3d & apmax);
-  ~Box3dTree ();
-  void Insert (const Point3d & bmin, const Point3d & bmax, int pi);
-  void DeleteElement (int pi) 
-    { tree->DeleteElement(pi); }
-  void GetIntersecting (const Point3d & pmin, const Point3d & pmax, 
-			ARRAY<int> & pis) const;
-
-  const ADTree6 & Tree() const { return *tree; };
-};
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/geom2d.cpp b/contrib/Netgen/libsrc/gprim/geom2d.cpp
deleted file mode 100644
index 01463d02552139233f48055db42630578c008879..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geom2d.cpp
+++ /dev/null
@@ -1,485 +0,0 @@
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <gprim.hpp>
-
-#ifndef M_PI
-#define M_PI        3.14159265358979323846
-#endif
-
-namespace netgen
-{
-
-ostream & operator<<(ostream  & s, const Point2d & p)
-{
-  return s << "(" << p.px << ", " << p.py << ")";
-}
-
-ostream & operator<<(ostream  & s, const Vec2d & v)
-{
-  return s << "(" << v.vx << ", " << v.vy << ")";
-}
-
-#ifdef none
-ostream & operator<<(ostream  & s, const Line2d & l)
-  {
-  return s << l.p1 << "-" << l.p2;
-}
-
-ostream & operator<<(ostream  & s, const TRIANGLE2D & t)
-{
-  return s << t.p1 << "-" << t.p2 << "-" << t.p3;
-}
-#endif
-
-
-double Fastatan2 (double x, double y)
-{
-  if (y > 0)
-    {
-      if (x > 0)
-	return y / (x+y);
-      else
-	return 1 - x / (y-x);
-    }
-  else if (y < 0)
-    {
-      if (x < 0)
-	return 2 + y / (x+y);
-      else
-	return 3 - x / (y-x);
-    }
-  else 
-    {
-      if (x >= 0)
-	return 0;
-      else
-	return 2;
-    }
-}
-
-
-double Angle (const Vec2d & v)
-{
-  if (v.X() == 0 && v.Y() == 0) return 0;
-  double ang = atan2 (v.Y(), v.X());
-  if (ang < 0) ang+= 2 * M_PI;
-  return ang;
-}
-
-double FastAngle (const Vec2d & v)
-{
-  return Fastatan2 (v.X(), v.Y());
-}
-
-double Angle (const Vec2d & v1, const Vec2d & v2)
-{
-  double ang = Angle(v2) - Angle(v1);
-  if (ang < 0) ang += 2 * M_PI;
-  return ang;
-}
-
-double FastAngle (const Vec2d & v1, const Vec2d & v2)
-{
-  double ang = FastAngle(v2) - FastAngle(v1);
-  if (ang < 0) ang += 4;
-  return ang;
-}
-
-/*
-int CW (const Point2d & p1,const Point2d & p2,const Point2d & p3)
-{
-  return Cross (p2 - p1, p3 - p2) < 0;
-}
-
-int CCW (const Point2d & p1,const Point2d & p2,const Point2d & p3)
-{
-  return Cross (p2 - p1, p3 - p2) > 0;
-}
-*/
-
-double  Dist2(const Line2d & g, const Line2d & h )
-  {
-  double   dd = 0.0, d1,d2,d3,d4;
-  Point2d  cp = CrossPoint(g,h);
-  
-  if ( Parallel(g,h) || !IsOnLine(g,cp) || !IsOnLine(h,cp) )
-    {
-      d1 = Dist2(g.P1(),h.P1());
-      d2 = Dist2(g.P1(),h.P2());
-      d3 = Dist2(g.P2(),h.P1());
-      d4 = Dist2(g.P2(),h.P2());
-      if (d1<d2)  d2 = d1;
-      if (d3<d4)  d4 = d3;
-      dd = ( d2 < d4 ) ? d2 : d4;
-    }
-  return dd;
-}
-
-
-Point2d CrossPoint (const Line2d & l1, const Line2d & l2)
-  {
-  double den = Cross (l1.Delta(), l2.Delta());
-  double num = Cross ( (l2.P1() - l1.P1()), l2.Delta());
-
-  if (den == 0) return l1.P1();
-  else
-    return l1.P1() + (num/den) * l1.Delta();
-}
-
-
-int CrossPointBarycentric (const Line2d & l1, const Line2d & l2,
-			   double & lam1, double & lam2)
-{
-  // p = l1.1 + lam1 (l1.2-l1.1) = l2.1 + lam2 (l2.2-l2.1)
-  double a11 = l1.p2.X() - l1.p1.X();
-  double a21 = l1.p2.Y() - l1.p1.Y();
-  double a12 = -(l2.p2.X() - l2.p1.X());
-  double a22 = -(l2.p2.Y() - l2.p1.Y());
-
-  double b1 = l2.p1.X() - l1.p1.X();
-  double b2 = l2.p1.Y() - l1.p1.Y();
-  
-  double det = a11*a22 - a12 * a21;
-  if (det == 0) return 1;
-
-  lam1 = (a22 * b1 - a12 * b2) / det;
-  lam2 = (a11 * b2 - a21 * b1) / det;
-  return 0;
-}
-
-
-
-
-int Parallel (const Line2d & l1, const Line2d & l2, double peps)
-  {
-  double p = fabs (Cross (l1.Delta(), l2.Delta()));
-  //  (*mycout) << endl << p << "  " <<  l1.Length() << "  " << l2.Length() << endl;
-  return p <= peps * l1.Length() * l2.Length();
-}
-
-int IsOnLine (const Line2d & l, const Point2d & p, double heps)
-  {
-  double c1 = (p - l.P1()) * l.Delta();
-  double c2 = (p - l.P2()) * l.Delta();
-  double d = fabs (Cross ( (p - l.P1()), l.Delta()));
-  double len2 = l.Length2();
-
-  return c1 >= -heps * len2 && c2 <= heps * len2 && d <= heps * len2;
-}
-
-#ifdef none
-int IsOnLine (const PLine2d & l, const Point2d & p, double heps)
-  {
-  double c1 = (p - l.P1()) * l.Delta();
-  double c2 = (p - l.P2()) * l.Delta();
-  double d = fabs (Cross ( (p - l.P1()), l.Delta()));
-  double len2 = l.Length2();
-
-  return c1 >= -heps * len2 && c2 <= heps * len2 && d <= heps * len2;
-}
-
-int IsOnLongLine (const Line2d & l, const Point2d & p)
-  {
-  double d = fabs (Cross ( (p - l.P1()), l.Delta()));
-  return d <= EPSGEOM * l.Length();
-}
-
-int Hit (const Line2d & l1, const Line2d & l2, double heps)
-  {
-  double den =  Cross ( (l1.P2() - l1.P1()), (l2.P1() - l2.P2()));
-  double num1 = Cross ( (l2.P1() - l1.P1()), (l2.P1() - l2.P2()));
-  double num2 = Cross ( (l1.P2() - l1.P1()), (l2.P1() - l1.P1()));
-  num1 *= sgn (den);
-  num2 *= sgn (den);
-  den = fabs (den);
-
-  int ch = (-den * heps <= num1 && num1 <= den * (1 + heps) &&
-	    -den * heps <= num2 && num2 <= den * (1 + heps));
-  return ch;
-}
-
-
-void Line2d :: GetNormal (Line2d & n) const
-{
-  double 	ax  = P2().X()-P1().X(),
-    ay  = P2().Y()-P1().Y();
-  Point2d 	mid(P1().X()+.5*ax, P1().Y()+.5*ay);
- 
- n=Line2d(mid,Point2d(mid.X()+ay,mid.Y()-ax)) ;
-}
-
-Vec2d Line2d :: NormalDelta () const
-{
- Line2d tmp;
- GetNormal(tmp);
- return tmp.Delta();
-}
-
-int TRIANGLE2D :: IsOn (const Point2d & p) const
-  {
-  return IsOnLine (Line2d (p1, p2), p) ||
-         IsOnLine (Line2d (p1, p3), p) ||
-         IsOnLine (Line2d (p2, p3), p);
-  }
-
-
-int TRIANGLE2D :: IsIn (const Point2d & p) const
-{
-  return ::CW(p, p1, p2) == ::CW(p, p2, p3) &&
-         ::CW(p, p1, p2) == ::CW(p, p3, p1);
-}
-
-
-
-int PTRIANGLE2D :: IsOn (const Point2d & p) const
-{
-  return IsOnLine (Line2d (*p1, *p2), p) ||
-         IsOnLine (Line2d (*p1, *p3), p) ||
-         IsOnLine (Line2d (*p2, *p3), p);
-}
-
-
-int PTRIANGLE2D :: IsIn (const Point2d & p) const
-{
-  return ::CW(p, *p1, *p2) == ::CW(p, *p2, *p3) &&
-         ::CW(p, *p1, *p2) == ::CW(p, *p3, *p1);
-}
-
-#endif
-
-
-
-
-
-
-Polygon2d :: Polygon2d ()
-{
-  ;
-}
-
-Polygon2d :: ~Polygon2d ()
-{
-  ;
-}
-
-void Polygon2d :: AddPoint (const Point2d & p)
-{ 
-  points.Append(p); 
-}
-
-
-double Polygon2d :: HArea () const
-{
-  int i;
-  double ar = 0;
-  for (i = 1; i <= points.Size(); i++)
-    {
-      const Point2d & p1 = points.Get(i);
-      const Point2d & p2 = points.Get(i%points.Size()+1);
-      ar += 
-	(p2.X()-p1.X()) * p1.Y() -
-	(p2.Y()-p1.Y()) * p1.X();
-    }
-  return ar/2;
-  /*
-  CURSOR c;
-  double ar = 0;
-  Point2d * p1, * p2, p0 = Point2d(0, 0);
-  Vec2d v1, v2 = Vec2d(1, 0);
-
-  p2 = points[points.Last()];
-  for (c = points.First(); c != points.Head(); c++)
-    {
-    p1 = p2;
-    p2 = points[c];
-    ar += Cross ( (*p2-*p1), (*p1 - p0));
-    }
-  return ar / 2;
-  */
-}
-
-
-int Polygon2d :: IsOn (const Point2d & p) const
-{
-  int i;
-  for (i = 1; i <= points.Size(); i++)
-    {
-      const Point2d & p1 = points.Get(i);
-      const Point2d & p2 = points.Get(i%points.Size()+1);
-      if (IsOnLine (Line2d(p1, p2), p)) return 1;
-    }
-  return 0;
-  /*
-  CURSOR c;
-  Point2d * p1, * p2;
-  
-  p2 = points[points.Last()];
-  for (c = points.First(); c != points.Head(); c++)
-    {
-      p1 = p2;
-      p2 = points[c];
-      if (IsOnLine (Line2d(*p1, *p2), p)) return 1;
-    }
-  return 0;
-  */
-}
-
-
-int Polygon2d :: IsIn (const Point2d & p) const
-{
-  int i;
-  double sum = 0, ang;
-  for (i = 1; i <= points.Size(); i++)
-    {
-      const Point2d & p1 = points.Get(i);
-      const Point2d & p2 = points.Get(i%points.Size()+1);
-      ang = Angle ( (p1 - p), (p2 - p) );
-      if (ang > M_PI) ang -= 2 * M_PI;
-      sum += ang;
-    }
-  return fabs(sum) > M_PI;
-  /*
-  CURSOR c;
-  Point2d * p1, * p2;
-  double sum = 0, ang;
-
-  p2 = points[points.Last()];
-  for (c = points.First(); c != points.Head(); c++)
-    {
-    p1 = p2;
-    p2 = points[c];
-    ang = Angle ( (*p1 - p), (*p2 - p) );
-    if (ang > M_PI) ang -= 2 * M_PI;
-    sum += ang;
-    }
-
-  return fabs(sum) > M_PI;
-  */
-}
-
-int Polygon2d :: IsConvex () const
-  {
-    /*
-  Point2d *p, *pold, *pnew;
-  char cw;
-  CURSOR c;
-
-  if (points.Length() < 3) return 0;
-
-  c = points.Last();
-  p = points[c];
-  c--;
-  pold = points[c];
-  pnew = points[points.First()];
-  cw = ::CW (*pold, *p, *pnew);
-
-  for (c = points.First(); c != points.Head(); c++)
-    {
-    pnew = points[c];
-    if (cw != ::CW (*pold, *p, *pnew))
-      return 0;
-    pold = p;
-    p = pnew;
-    }
-    */
-    return 0;
-  }
-
-
-int Polygon2d :: IsStarPoint (const Point2d & p) const
-  {
-    /*
-  Point2d *pnew, *pold;
-  char cw;
-  CURSOR c;
-
-  if (points.Length() < 3) return 0;
-
-  pold = points[points.Last()];
-  pnew = points[points.First()];
-
-  cw = ::CW (p, *pold, *pnew);
-
-  for (c = points.First(); c != points.Head(); c++)
-    {
-    pnew = points[c];
-    if (cw != ::CW (p, *pold, *pnew))
-      return 0;
-    pold = pnew;
-    }
-  return 1;
-    */
-    return 0;
-  }
-
-
-Point2d Polygon2d :: Center () const
-  {
-    /*
-  double ai, a = 0, x = 0, y = 0;
-  Point2d * p, *p2;
-  Point2d p0 = Point2d(0, 0);
-  CURSOR c;
-
-  p2 = points[points.Last()];
-
-  for (c = points.First(); c != points.Head(); c++)
-    {
-    p = points[c];
-    ai = Cross (*p2 - p0, *p - p0);
-    x += ai / 3 * (p2->X() + p->X());
-    y += ai / 3 * (p2->Y() + p->Y());
-    a+= ai;
-    p2 = p;
-    }
-  if (a != 0)
-    return Point2d (x / a, y / a);
-  else
-    return Point2d (0, 0);
-    */
-    return Point2d (0, 0);
-  }
-
-
-
-Point2d Polygon2d :: EqualAreaPoint () const
-  {
-    /*
-  double a11 = 0, a12 = 0, a21= 0, a22 = 0;
-  double b1 = 0, b2 = 0, dx, dy;
-  double det;
-  Point2d * p, *p2;
-  CURSOR c;
-
-  p = points[points.Last()];
-
-  for (c = points.First(); c != points.Head(); c++)
-    {
-    p2 = p;
-    p = points[c];
-
-    dx = p->X() - p2->X();
-    dy = p->Y() - p2->Y();
-
-    a11 += sqr (dy);
-    a12 -= dx * dy;
-    a21 -= dx * dy;
-    a22 += sqr (dx);
-    b1 -= dy * (p->X() * p2->Y() - p2->X() * p->Y());
-    b2 -= dx * (p->Y() * p2->X() - p2->Y() * p->X());
-    }
-
-  det = a11 * a22 - a21 * a12;
-
-  if (det != 0)
-    return Point2d ( (b1 * a22 - b2 * a12) / det,
-                     (a11 * b2 - a21 * b1) / det);
-  else
-    return Point2d (0, 0);
-*/
-    return Point2d (0, 0);
-  }
-
-
-}
diff --git a/contrib/Netgen/libsrc/gprim/geom2d.hpp b/contrib/Netgen/libsrc/gprim/geom2d.hpp
deleted file mode 100644
index 48b5eda71daf5c8887b92fb44230ad23c1a72f18..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geom2d.hpp
+++ /dev/null
@@ -1,870 +0,0 @@
-#ifndef FILE_GEOM2D
-#define FILE_GEOM2D
-
-/* *************************************************************************/
-/* File:   geom2d.hh                                                       */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   5. Aug. 95                                                      */
-/* *************************************************************************/
-
-
-
-/* Geometric Algorithms */
-
-#define EPSGEOM 1E-5
-
-
-// extern void MyError (const char * ch);
-
-class Point2d;
-class Vec2d;
-
-class LINE2D;
-class Line2d;
-class PLine2d;
-class TRIANGLE2D;
-class PTRIANGLE2D;
-
-
-inline Vec2d operator- (const Point2d & p1, const Point2d & p2);
-inline Point2d operator- (const Point2d & p1, const Vec2d & v);
-inline Point2d operator+ (const Point2d & p1, const Vec2d & v);
-inline Point2d Center (const Point2d & p1, const Point2d & p2);
-
-inline void PpSmV (const Point2d & p1, double s, const Vec2d & v, Point2d & p2);
-inline void PmP (const Point2d & p1, const Point2d & p2, Vec2d & v);
-ostream & operator<<(ostream  & s, const Point2d & p);
-inline Vec2d operator- (const Point2d & p1, const Point2d & p2);
-inline Point2d operator- (const Point2d & p1, const Vec2d & v);
-inline Point2d operator+ (const Point2d & p1, const Vec2d & v);
-inline Vec2d operator- (const Vec2d & p1, const Vec2d & v);
-inline Vec2d operator+ (const Vec2d & p1, const Vec2d & v);
-inline Vec2d operator* (double scal, const Vec2d & v);
-double Angle (const Vec2d & v);
-double FastAngle (const Vec2d & v);
-double Angle (const Vec2d & v1, const Vec2d & v2);
-double FastAngle (const Vec2d & v1, const Vec2d & v2);
-ostream & operator<<(ostream  & s, const Vec2d & v);
-double Dist2(const Line2d & g, const Line2d & h );		// GH
-int Near (const Point2d & p1, const Point2d & p2, const double eps);
-
-int Parallel (const Line2d & l1, const Line2d & l2, double peps = EPSGEOM);
-int IsOnLine (const Line2d & l, const Point2d & p, double heps = EPSGEOM);
-int IsOnLongLine (const Line2d & l, const Point2d & p);
-int Hit (const Line2d & l1, const Line2d & l2, double heps = EPSGEOM);
-ostream & operator<<(ostream  & s, const Line2d & l);
-Point2d CrossPoint (const PLine2d & l1, const PLine2d & l2);
-int Parallel (const PLine2d & l1, const PLine2d & l2, double peps = EPSGEOM);
-int IsOnLine (const PLine2d & l, const Point2d & p, double heps = EPSGEOM);
-int IsOnLongLine (const PLine2d & l, const Point2d & p);
-int Hit (const PLine2d & l1, const Line2d & l2, double heps = EPSGEOM);
-ostream & operator<<(ostream  & s, const Line2d & l);
-ostream & operator<<(ostream  & s, const TRIANGLE2D & t); 
-ostream & operator<<(ostream & s, const PTRIANGLE2D & t);
-
-///
-class Point2d
-{
-  ///
-  friend class Vec2d;
-
-protected:
-  ///
-  double px, py;
-
-public:
-  ///
-  Point2d() { /* px = py = 0; */ }
-  ///
-  Point2d(double ax, double ay) { px = ax; py = ay; }
-  ///
-  Point2d(const Point2d & p2) { px = p2.px; py = p2.py; }
-
-  Point2d (const Point<2> & p2)
-  {
-    px = p2(0);
-    py = p2(1);
-  }
-  ///
-  Point2d & operator= (const Point2d & p2)
-    { px = p2.px; py = p2.py; return *this; }
-    
-  ///
-  int operator== (const Point2d & p2) const			// GH
-    { return (px == p2.px  &&  py == p2.py) ; }
-
-  ///
-  double & X() { return px; }
-  ///
-  double & Y() { return py; }
-  ///
-  double X() const { return px; }
-  ///
-  double Y() const { return py; }
-
-  operator Point<2> () const
-  {
-    return Point<2> (px, py);
-  }
-
-
-  ///
-  friend inline Vec2d operator- (const Point2d & p1, const Point2d & p2);
-  ///
-  friend inline Point2d operator- (const Point2d & p1, const Vec2d & v);
-  ///
-  friend inline Point2d operator+ (const Point2d & p1, const Vec2d & v);
-
-  ///
-  friend inline Point2d Center (const Point2d & p1, const Point2d & p2);
-
-  const Point2d & SetToMin (const Point2d & p2)
-    {
-      if (p2.px < px) px = p2.px;
-      if (p2.py < py) py = p2.py;
-      return *this;
-    }
-
-
-  ///
-  const Point2d & SetToMax (const Point2d & p2)
-    {
-      if (p2.px > px) px = p2.px;
-      if (p2.py > py) py = p2.py;
-      return *this;
-    }
-
-  ///
-  friend double Dist (const Point2d & p1, const Point2d & p2)
-    { return sqrt ( (p1.px - p2.px) * (p1.px - p2.px) +
-		    (p1.py - p2.py) * (p1.py - p2.py) ); }
-  //    { return sqrt ( sqr (p1.X()-p2.X()) + sqr (p1.Y()-p2.Y()) ); }
-
-  ///
-  friend double Dist2 (const Point2d & p1, const Point2d & p2)
-    { return ( (p1.px - p2.px) * (p1.px - p2.px) +
-	       (p1.py - p2.py) * (p1.py - p2.py) ); }
-  //    { return sqr (p1.X()-p2.X()) + sqr (p1.Y()-p2.Y()) ; }
-
-
-  /**
-    Points clock-wise ?
-    Are the points (p1, p2, p3) clock-wise ?
-    */
-  friend inline int CW (const Point2d & p1, const Point2d & p2, const Point2d & p3)
-    {
-      //      return Cross (p2 - p1, p3 - p2) < 0;      
-      return
-	(p2.px - p1.px) * (p3.py - p2.py) - 
-	(p2.py - p1.py) * (p3.px - p2.px) < 0;
-    }
-  /**
-    Points counter-clock-wise ?
-    Are the points (p1, p2, p3) counter-clock-wise ?
-    */
-  friend inline int CCW (const Point2d & p1, const Point2d & p2, const Point2d & p3)
-    {
-      //      return Cross (p2 - p1, p3 - p2) > 0;
-      return
-	(p2.px - p1.px) * (p3.py - p2.py) - 
-	(p2.py - p1.py) * (p3.px - p2.px) > 0;
-    }
-
-  ///
-  friend inline void PpSmV (const Point2d & p1, double s, const Vec2d & v, Point2d & p2);
-  ///
-  friend inline void PmP (const Point2d & p1, const Point2d & p2, Vec2d & v);
-
-  ///
-  friend ostream & operator<<(ostream  & s, const Point2d & p);
-};
-
-
-inline int Near (const Point2d & p1, const Point2d & p2, 
-	  const double eps = 1e-4 )
-{ 
-  return  Dist2(p1,p2) <= eps*eps; 
-}
-
-
-
-
-
-
-///
-class Vec2d
-  {
-protected:
-  ///
-  double vx, vy;
-
-public:
-  ///
-    Vec2d() { /* vx = vy = 0; */ }
-    ///
-    Vec2d(double ax, double ay)
-    { vx = ax; vy = ay; }
-    ///
-    Vec2d(const Vec2d & v2) { vx = v2.vx; vy = v2.vy; }
-
-    ///
-    explicit Vec2d(const Vec<2> & v2) { vx = v2(0); vy = v2(1); }
-
-    ///
-    Vec2d(const Point2d & p1, const Point2d & p2)
-    { vx = p2.px - p1.px; vy = p2.py - p1.py; }
-    
-  ///
-  Vec2d & operator= (const Vec2d & p2)
-    { vx = p2.vx; vy = p2.vy; return *this; }
-
-  ///
-  double & X() { return vx; }
-  ///
-  double & Y() { return vy; }
-  ///
-  double X() const { return vx; }
-  ///
-  double Y() const { return vy; }
-
-  ///
-  double Length() const { return sqrt (vx * vx + vy * vy); }
-  ///
-  double Length2() const { return vx * vx + vy * vy; }
-
-  void GetNormal (Vec2d & n) const { n.vx=-vy; n.vy=vx; }		// GH
-
-  ///
-  inline Vec2d & operator+= (const Vec2d & v2);
-  ///
-  inline Vec2d & operator-= (const Vec2d & v2);
-  ///
-  inline Vec2d & operator*= (double s);
-  ///
-  inline Vec2d & operator/= (double s);
-
-  ///
-  friend inline Vec2d operator- (const Point2d & p1, const Point2d & p2);
-  ///
-  friend inline Point2d operator- (const Point2d & p1, const Vec2d & v);
-  ///
-  friend inline Point2d operator+ (const Point2d & p1, const Vec2d & v);
-  ///
-  friend inline Vec2d operator- (const Vec2d & p1, const Vec2d & v);
-  ///
-  friend inline Vec2d operator+ (const Vec2d & p1, const Vec2d & v);
-  ///
-  friend inline Vec2d operator* (double scal, const Vec2d & v);
-
-  ///
-  friend double operator* (const Vec2d & v1, const Vec2d & v2)
-    { return v1.X() * v2.X() + v1.Y() * v2.Y(); }
-
-
-  ///
-  friend double Cross (const Vec2d & v1, const Vec2d & v2)
-    { return double(v1.X()) * double(v2.Y()) -
-             double(v1.Y()) * double(v2.X()); }
-
-  ///
-  friend inline void PpSmV (const Point2d & p1, double s, const Vec2d & v, Point2d & p2);
-  ///
-  friend inline void PmP (const Point2d & p1, const Point2d & p2, Vec2d & v);
-
-///						Angle in [0,2*PI)
-
-  ///
-  friend double Angle (const Vec2d & v);
-  ///
-  friend double FastAngle (const Vec2d & v);
-  ///
-  friend double Angle (const Vec2d & v1, const Vec2d & v2);
-  ///
-  friend double FastAngle (const Vec2d & v1, const Vec2d & v2);
-
-  ///
-  friend ostream & operator<<(ostream  & s, const Vec2d & v);
-  };
-
-
-
-///
-class Line2d
-  {
-protected:
-  ///
-  Point2d p1, p2;
-
-public:
-  ///
-  Line2d() : p1(), p2() { };
-  ///
-  Line2d(const Point2d & ap1, const Point2d & ap2)
-    { p1 = ap1; p2 = ap2; }
-
-  ///
-  Line2d & operator= (const Line2d & l2)
-    { p1 = l2.p1; p2 = l2.p2; return *this;}
-
-  ///
-  Point2d & P1() { return p1; }
-  ///
-  Point2d & P2() { return p2; }
-  ///
-  const Point2d & P1() const { return p1; }
-  ///
-  const Point2d & P2() const { return p2; }
-
-  ///
-  double XMax() const { return max2 (p1.X(), p2.X()); }
-  ///
-  double YMax() const { return max2 (p1.Y(), p2.Y()); }
-  ///
-  double XMin() const { return min2 (p1.X(), p2.X()); }
-  ///
-  double YMin() const { return min2 (p1.Y(), p2.Y()); }
-
-  ///
-  Vec2d Delta () const { return Vec2d (p2.X()-p1.X(), p2.Y()-p1.Y()); }
-  ///
-  double Length () const { return Delta().Length(); }
-  ///
-  double Length2 () const
-        { return sqr (p1.X() - p2.X()) +
-                 sqr (p1.Y() - p2.Y()); }
-
-  void GetNormal (Line2d & n) const;					// GH
-  Vec2d NormalDelta () const;						// GH
-
-  /// square of the distance between two 2d-lines.
-  friend double Dist2(const Line2d & g, const Line2d & h );		// GH
-
-  ///
-  friend Point2d CrossPoint (const Line2d & l1, const Line2d & l2);
-    /// returns 1 iff parallel
-    friend int CrossPointBarycentric (const Line2d & l1, const Line2d & l2,
-				      double & lam1, double & lam2);
-
-  ///
-  friend int Parallel (const Line2d & l1, const Line2d & l2, double peps);
-  ///
-  friend int IsOnLine (const Line2d & l, const Point2d & p, double heps);
-  ///
-  friend int IsOnLongLine (const Line2d & l, const Point2d & p);
-  ///
-  friend int Hit (const Line2d & l1, const Line2d & l2, double heps);
-
-  ///
-  friend ostream & operator<<(ostream  & s, const Line2d & l);
-  };
-
-
-#ifdef NONE
-///
-class PLine2d
-  {
-protected:
-  ///
-  Point2d const * p1, *p2;
-
-public:
-  ///
-  PLine2d() { };
-  ///
-  PLine2d(Point2d const * ap1, Point2d const * ap2)
-    { p1 = ap1; p2 = ap2; }
-
-  ///
-  PLine2d & operator= (const PLine2d & l2)
-    { p1 = l2.p1; p2 = l2.p2; return *this;}
-
-  ///
-  const Point2d *& P1() { return p1; }
-  ///
-  const Point2d *& P2() { return p2; }
-  ///
-  const Point2d & P1() const { return *p1; }
-  ///
-  const Point2d & P2() const { return *p2; }
-
-  ///
-  double XMax() const { return max2 (p1->X(), p2->X()); }
-  ///
-  double YMax() const { return max2 (p1->Y(), p2->Y()); }
-  ///
-  double XMin() const { return min2 (p1->X(), p2->X()); }
-  ///
-  double YMin() const { return min2 (p1->Y(), p2->Y()); }
-
-
-  ///
-  Vec2d Delta () const { return Vec2d (p2->X()-p1->X(), p2->Y()-p1->Y()); }
-  ///
-  double Length () const { return Delta().Length(); }
-  ///
-  double Length2 () const
-        { return sqr (p1->X() - p2->X()) +
-                 sqr (p1->Y() - p2->Y()); }
-
-
-    
-  ///
-  friend Point2d CrossPoint (const PLine2d & l1, const PLine2d & l2);
-  ///
-  friend int Parallel (const PLine2d & l1, const PLine2d & l2, double peps);
-  ///
-  friend int IsOnLine (const PLine2d & l, const Point2d & p, double heps);
-  ///
-  friend int IsOnLongLine (const PLine2d & l, const Point2d & p);
-  ///
-  friend int Hit (const PLine2d & l1, const Line2d & l2, double heps);
-
-  ///
-  friend ostream & operator<<(ostream  & s, const Line2d & l);
-  };
-
-
-
-///
-class ILINE
-  {
-  ///
-  INDEX i[2];
-
-  public:
-  ///
-  ILINE() {};
-  ///
-  ILINE(INDEX i1, INDEX i2) { i[0] = i1; i[1] = i2; }
-  ///
-  ILINE(const ILINE & l) { i[0] = l.i[0]; i[1] = l.i[1]; }
-
-  ///
-  ILINE & operator= (const ILINE & l)
-    { i[0] = l.i[0]; i[1] = l.i[1]; return *this; }
-
-  ///
-  const INDEX & I(int ai) const { return i[ai-1]; }
-  ///
-  const INDEX & X() const { return i[0]; }
-  ///
-  const INDEX & Y() const { return i[1]; }
-  ///
-  const INDEX & I1() const { return i[0]; }
-  ///
-  const INDEX & I2() const { return i[1]; }
-
-  ///
-  INDEX & I(int ai) { return i[ai-1]; }
-  ///
-  INDEX & X() { return i[0]; }
-  ///
-  INDEX & Y() { return i[1]; }
-  ///
-  INDEX & I1() { return i[0]; }
-  ///
-  INDEX & I2() { return i[1]; }
-  };
-
-
-
-
-///
-class TRIANGLE2D
-  {
-private:
-  ///
-  Point2d p1, p2, p3;
-
-public:
-  ///
-  TRIANGLE2D() { };
-  ///
-  TRIANGLE2D (const Point2d & ap1, const Point2d & ap2,
-              const Point2d & ap3)
-    { p1 = ap1; p2 = ap2; p3 = ap3;}
-
-  ///
-  TRIANGLE2D & operator= (const TRIANGLE2D & t2)
-    { p1 = t2.p1; p2 = t2.p2; p3 = t2.p3; return *this; }
-
-  ///
-  Point2d & P1() { return p1; }
-  ///
-  Point2d & P2() { return p2; }
-  ///
-  Point2d & P3() { return p3; }
-  ///
-  const Point2d & P1() const { return p1; }
-  ///
-  const Point2d & P2() const { return p2; }
-  ///
-  const Point2d & P3() const { return p3; }
-
-  ///
-  double XMax() const { return max3 (p1.X(), p2.X(), p3.X()); }
-  ///
-  double YMax() const { return max3 (p1.Y(), p2.Y(), p3.Y()); }
-  ///
-  double XMin() const { return min3 (p1.X(), p2.X(), p3.X()); }
-  ///
-  double YMin() const { return min3 (p1.Y(), p2.Y(), p3.Y()); }
-
-  ///
-  inline Point2d Center () const
-   { return Point2d( (p1.X()+p2.X()+p3.X())/3, (p1.Y()+p2.Y()+p3.Y())/3); }
-
-  ///
-  int Regular() const;
-  /// 
-  int CW () const;
-  ///
-  int CCW () const;
-
-  ///
-  int IsOn (const Point2d & p) const;
-  ///
-  int IsIn (const Point2d & p) const;
-  ///
-  friend ostream & operator<<(ostream  & s, const TRIANGLE2D & t);
-  };
-
-
-///
-class PTRIANGLE2D
-  {
-private:
-  ///
-  Point2d const *p1, *p2, *p3;
-
-public:
-  ///
-  PTRIANGLE2D() { };
-  ///
-  PTRIANGLE2D (const Point2d * ap1, const Point2d * ap2,
-              const Point2d * ap3)
-    { p1 = ap1; p2 = ap2; p3 = ap3;}
-
-  ///
-  PTRIANGLE2D & operator= (const PTRIANGLE2D & t2)
-    { p1 = t2.p1; p2 = t2.p2; p3 = t2.p3; return *this; }
-
-  ///
-  const Point2d *& P1() { return p1; }
-  ///
-  const Point2d *& P2() { return p2; }
-  ///
-  const Point2d *& P3() { return p3; }
-  ///
-  const Point2d * P1() const { return p1; }
-  ///
-  const Point2d * P2() const { return p2; }
-  ///
-  const Point2d * P3() const { return p3; }
-
-  ///
-  double XMax() const { return max3 (p1->X(), p2->X(), p3->X()); }
-  ///
-  double YMax() const { return max3 (p1->Y(), p2->Y(), p3->Y()); }
-  ///
-  double XMin() const { return min3 (p1->X(), p2->X(), p3->X()); }
-  ///
-  double YMin() const { return min3 (p1->Y(), p2->Y(), p3->Y()); }
-
-  ///
-  Point2d Center () const
-   { return Point2d( (p1->X()+p2->X()+p3->X())/3, (p1->Y()+p2->Y()+p3->Y())/3); }
-
-
-  ///
-  int Regular() const;
-  ///
-  int CW () const;
-  ///
-  int CCW () const;
-
-  ///
-  int IsOn (const Point2d & p) const;
-  ///
-  int IsIn (const Point2d & p) const;
-  ///
-  friend ostream & operator<<(ostream & s, const PTRIANGLE2D & t);
-  };
-#endif
-
-
-
-class Polygon2d
-{
-protected:
-  ARRAY<Point2d> points;
-  
-public:
-  Polygon2d ();
-  ~Polygon2d ();
-  
-  void AddPoint (const Point2d & p);
-  int GetNP() const { return points.Size(); }
-  void GetPoint (int i, Point2d & p) const
-  { p = points.Get(i); }
-  void GetLine (int i, Point2d & p1, Point2d & p2) const
-  { p1 = points.Get(i); p2 = points.Get(i%points.Size()+1); }
-
-  double Area () const { return fabs (HArea()); }
-  int CW () const { return HArea() > 0; }
-  int CCW () const { return HArea() < 0; }
-  
-  int IsOn (const Point2d & p) const;
-  int IsIn (const Point2d & p) const;
-
-  int IsConvex () const;
-
-  int IsStarPoint (const Point2d & p) const;
-  Point2d Center() const;
-  Point2d EqualAreaPoint () const;
-private:
-  double HArea () const;
-};
-
-
-/** Cheap approximation to atan2.
-  A monotone function of atan2(x,y) is computed.
- */
-extern double Fastatan2 (double x, double y);
-
-
-inline Vec2d & Vec2d :: operator+= (const Vec2d & v2)
-  {
-  vx += v2.vx;
-  vy += v2.vy;
-  return *this;
-  }
-
-inline Vec2d & Vec2d :: operator-= (const Vec2d & v2)
-  {
-  vx -= v2.vx;
-  vy -= v2.vy;
-  return *this;
-  }
-
-inline Vec2d & Vec2d :: operator*= (double s)
-  {
-  vx *= s;
-  vy *= s;
-  return *this;
-  }
-
-
-inline Vec2d & Vec2d :: operator/= (double s)
-{
-  if (s != 0)
-    {
-      vx /= s;
-      vy /= s;
-    }
-  else
-    {
-      MyError ("Vec2d::operator /=: Division by zero");
-    }
-  return *this;
-}
-
-
-
-inline Vec2d operator- (const Point2d & p1, const Point2d & p2)
-  {
-  return Vec2d (p1.X() - p2.X(), p1.Y() - p2.Y());
-  }
-
-
-inline Point2d operator- (const Point2d & p1, const Vec2d & v)
-  {
-  return Point2d (p1.X() - v.X(), p1.Y() - v.Y());
-  }
-
-
-inline Point2d operator+ (const Point2d & p1, const Vec2d & v)
-  {
-  return Point2d (p1.X() + v.X(), p1.Y() + v.Y());
-  }
-
-
-inline Point2d Center (const Point2d & p1, const Point2d & p2)
-  {
-  return Point2d ((p1.X() + p2.X()) / 2, (p1.Y() + p2.Y()) / 2);
-  }
-
-
-inline Vec2d operator- (const Vec2d & v1, const Vec2d & v2)
-  {
-  return Vec2d (v1.X() - v2.X(), v1.Y() - v2.Y());
-  }
-
-
-inline Vec2d operator+ (const Vec2d & v1, const Vec2d & v2)
-  {
-  return Vec2d (v1.X() + v2.X(), v1.Y() + v2.Y());
-  }
-
-
-inline Vec2d operator* (double scal, const Vec2d & v)
-  {
-  return Vec2d (scal * v.X(), scal * v.Y());
-  }
-
-
-inline void PpSmV (const Point2d & p1, double s,
-                   const Vec2d & v, Point2d & p2)
-  {
-  p2.X() = p1.X() + s * v.X();
-  p2.Y() = p1.Y() + s * v.Y();
-  }
-
-
-inline void PmP (const Point2d & p1, const Point2d & p2, Vec2d & v)
-  {
-  v.X() = p1.X() - p2.X();
-  v.Y() = p1.Y() - p2.Y();
-  }
-
-
-
-
-
-#ifdef none
-inline int TRIANGLE2D :: Regular() const
-    {
-    return fabs(Cross ( p2 - p1, p3 - p2)) > EPSGEOM;
-    }
-
-
-inline int TRIANGLE2D :: CW () const
-    {
-    return Cross ( p2 - p1, p3 - p2) < 0;
-    }
-
-
-inline int TRIANGLE2D :: CCW () const
-    {
-    return Cross ( p2 - p1, p3 - p2) > 0;
-    }
-
-
-
-
-inline int PTRIANGLE2D :: Regular() const
-    {
-    return fabs(Cross ( *p2 - *p1, *p3 - *p2)) > EPSGEOM;
-    }
-
-
-inline int PTRIANGLE2D :: CW () const
-    {
-    return Cross ( *p2 - *p1, *p3 - *p2) < 0;
-    }
-
-
-inline int PTRIANGLE2D :: CCW () const
-    {
-    return Cross ( *p2 - *p1, *p3 - *p2) > 0;
-    }
-
-
-#endif
-
-
-///
-class Mat2d
-{
-protected:
-  ///
-  double coeff[4];
-
-public:
-  ///
-  Mat2d() { coeff[0] = coeff[1] = coeff[2] = coeff[3] = 0; }
-  ///
-  Mat2d(double a11, double a12, double a21, double a22)
-    { coeff[0] = a11; coeff[1] = a12; coeff[2] = a21; coeff[3] = a22; }
-  ///
-  Mat2d(const Mat2d & m2)
-    { for (int i = 0; i < 4; i++) coeff[i] = m2.Get(i); }
-
-  ///
-  double & Elem (INDEX i, INDEX j) { return coeff[2*(i-1)+j-1]; }
-  ///
-  double & Elem (INDEX i) {return coeff[i]; }
-  ///
-  double Get (INDEX i, INDEX j) const { return coeff[2*(i-1)+j-1]; }
-  ///
-  double Get (INDEX i) const {return coeff[i]; }
-
-  ///  
-  double Det () const { return coeff[0] * coeff[3] - coeff[1] * coeff[2]; }
-
-  ///
-  void Mult (const Vec2d & v, Vec2d & prod) const;
-  ///
-  void MultTrans (const Vec2d & v , Vec2d & prod) const;
-  ///
-  void Solve (const Vec2d & rhs, Vec2d & x) const;
-  /// Solves mat * x = rhs, but using a positive definite matrix instead of mat
-  void SolvePositiveDefinite (const Vec2d & rhs, Vec2d & x) const;
-  /// add a term \alpha * v * v^T
-  void AddDiadicProduct (double alpha, Vec2d & v);
-};
-
-
-
-inline void Mat2d :: Mult (const Vec2d & v, Vec2d & prod) const
-{
-  prod.X() = coeff[0] * v.X() + coeff[1] * v.Y();
-  prod.Y() = coeff[2] * v.X() + coeff[3] * v.Y();
-}
-
-
-inline  void Mat2d :: MultTrans (const Vec2d & v, Vec2d & prod) const
-{
-  prod.X() = coeff[0] * v.X() + coeff[2] * v.Y();
-  prod.Y() = coeff[1] * v.X() + coeff[3] * v.Y();
-}
-
-
-
-inline void Mat2d :: Solve (const Vec2d & rhs, Vec2d & x) const
-{
-  double det = Det();
-  
-  if (det == 0)
-    MyError ("Mat2d::Solve: zero determinant");
-  else
-    {
-      x.X() = (coeff[3] * rhs.X() - coeff[1] * rhs.Y()) / det;
-      x.Y() = (-coeff[2] * rhs.X() + coeff[0] * rhs.Y()) / det;
-    }
-}
-
-
-inline void Mat2d :: SolvePositiveDefinite (const Vec2d & rhs, Vec2d & x) const
-{
-  double a = max2(coeff[0], 1e-8);
-  double b = coeff[1] / a;
-  double c = coeff[2] / a;
-  double d = max2(coeff[3] - a *b * c, 1e-8);
-
-  x.X() = (rhs.X() - b * rhs.Y()) / a;
-  x.Y() = rhs.Y() / d - c * x.X();
-}
-
-
-inline void Mat2d :: AddDiadicProduct (double alpha, Vec2d & v)
-{
-  coeff[0] += alpha * v.X() * v.X();
-  coeff[1] += alpha * v.X() * v.Y();
-  coeff[2] += alpha * v.Y() * v.X();
-  coeff[3] += alpha * v.Y() * v.Y();
-}
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/geom3d.cpp b/contrib/Netgen/libsrc/gprim/geom3d.cpp
deleted file mode 100644
index eaee77677855bbd5b7b3183812a5fe2736c32427..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geom3d.cpp
+++ /dev/null
@@ -1,650 +0,0 @@
-#include <algorithm>
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <gprim.hpp>
-
-namespace netgen
-{
-ostream & operator<<(ostream  & s, const Point3d & p)
-  {
-  return s << "(" << p.x[0] << ", " << p.x[1] << ", " << p.x[2] << ")";
-  }
-
-ostream & operator<<(ostream  & s, const Vec3d & v)
-  {
-  return s << "(" << v.x[0] << ", " << v.x[1] << ", " << v.x[2] << ")";
-  }
-
-double Angle (const Vec3d & v1, const Vec3d & v2)
-{
-  double co = (v1 * v2) / (v1.Length() * v2.Length());
-  if (co > 1) co = 1;
-  if (co < -1) co = -1;
-  return acos ( co );
-}
-
-
-void Vec3d :: GetNormal (Vec3d & n) const
-  {
-  if (fabs (X()) > fabs (Z()))
-    {
-    n.X() = -Y();
-    n.Y() = X();
-    n.Z() = 0;
-    }
-  else
-    {
-    n.X() = 0;
-    n.Y() = Z();
-    n.Z() = -Y();
-    }
-  double len = n.Length();
-  if (len == 0)
-    {
-    n.X() = 1;
-    n.Y() = n.Z() = 0;
-    }
-  else
-    n /= len;
-  }
-
-/*
-ostream & operator<<(ostream  & s, const ROTDenseMatrix3D & r)
-  {
-  return s << "{ (" << r.txx << ", " << r.txy << ", " << r.txz << ") , ("
-                    << r.tyx << ", " << r.tyy << ", " << r.tyz << ") , ("
-                    << r.tzx << ", " << r.tzy << ", " << r.tzz << ") }";
-  }
-*/
-
-/*
-Vec3d operator- (const Point3d & p1, const Point3d & p2)
-  {
-  return Vec3d (p1.X() - p2.X(), p1.Y() - p2.Y(),p1.Z() - p2.Z());
-  }
-
-Point3d operator- (const Point3d & p1, const Vec3d & v)
-  {
-  return Point3d (p1.X() - v.X(), p1.Y() - v.Y(),p1.Z() - v.Z());
-  }
-
-Point3d operator+ (const Point3d & p1, const Vec3d & v)
-  {
-  return Point3d (p1.X() + v.X(), p1.Y() + v.Y(),p1.Z() + v.Z());
-  }
-
-Vec3d operator- (const Vec3d & v1, const Vec3d & v2)
-  {
-  return Vec3d (v1.X() - v2.X(), v1.Y() - v2.Y(),v1.Z() - v2.Z());
-  }
-
-Vec3d operator+ (const Vec3d & v1, const Vec3d & v2)
-  {
-  return Vec3d (v1.X() + v2.X(), v1.Y() + v2.Y(),v1.Z() + v2.Z());
-  }
-
-Vec3d operator* (double scal, const Vec3d & v)
-  {
-  return Vec3d (scal * v.X(), scal * v.Y(), scal * v.Z());
-  }
-*/
-/*
-double operator* (const Vec3d & v1, const Vec3d & v2)
-  {
-  return v1.X() * v2.X() + v1.Y() * v2.Y() + v1.Z() * v2.Z();
-  }
-
-double Cross (const Vec3d & v1, const Vec3d & v2)
-  {
-  return v1.X() * v2.Y() - v1.Y() * v2.X();
-  }
-*/
-
-/*
-void ROTDenseMatrix3D :: CalcRotMat(double ag, double bg, double lg, double size2, Vec3d r)
-  {
-  size = size2;
-  txx=size * ( cos(bg) * cos(lg) );
-  txy=size * ( cos(bg) * sin(lg) );
-  txz=size * (-sin(bg)           );
-
-  tyx=size * ( sin(ag) * sin(bg) * cos(lg) - cos(ag) * sin(lg) );
-  tyy=size * ( sin(ag) * sin(bg) * sin(lg) + cos(ag) * cos(lg) );
-  tyz=size * ( sin(ag) * cos(bg)                               );
-
-  tzx=size * ( cos(ag) * sin(bg) * cos(lg) + sin(ag) * sin(lg) );
-  tzy=size * ( cos(ag) * sin(bg) * sin(lg) - sin(ag) * cos(lg) );
-  tzz=size * ( cos(ag) * cos(bg)                               );
-
-  deltaR=r;
-  }
-ROTDenseMatrix3D :: ROTDenseMatrix3D(double ag, double bg, double lg, double size2, Vec3d r)
-  {CalcRotMat(ag, bg, lg, size2, r); }
-
-ROTDenseMatrix3D :: ROTDenseMatrix3D(Vec3d rot2)
-  {
-  Vec3d r2(0,0,0);
-  CalcRotMat(rot2.X(), rot2.Y(), rot2.Z(), 1, r2);
-  }
-
-ROTDenseMatrix3D ROTDenseMatrix3D :: INV()
-  {
-  ROTDenseMatrix3D rinv(txx/sqr(size),tyx/sqr(size),tzx/sqr(size),
-                   txy/sqr(size),tyy/sqr(size),tzy/sqr(size),
-                   txz/sqr(size),tyz/sqr(size),tzz/sqr(size),
-                   1/size,deltaR);
-  return rinv;
-  }
-
-Vec3d operator* (const ROTDenseMatrix3D & r, const Vec3d & v)
-  {
-  return Vec3d (r.XX() * v.X() + r.XY() * v.Y() + r.XZ() * v.Z(),
-                r.YX() * v.X() + r.YY() * v.Y() + r.YZ() * v.Z(),
-                r.ZX() * v.X() + r.ZY() * v.Y() + r.ZZ() * v.Z() );
-  }
-
-Point3d operator* (const ROTDenseMatrix3D & r, const Point3d & p)
-  {
-  return Point3d (r.XX() * p.X() + r.XY() * p.Y() + r.XZ() * p.Z(),
-                  r.YX() * p.X() + r.YY() * p.Y() + r.YZ() * p.Z(),
-                  r.ZX() * p.X() + r.ZY() * p.Y() + r.ZZ() * p.Z() );
-  }
-*/
-
-
-
-
-
-
-
-Box3d :: Box3d ( double aminx, double amaxx,
-                 double aminy, double amaxy,
-                 double aminz, double amaxz )
-{
-  minx[0] = aminx; maxx[0] = amaxx;
-  minx[1] = aminy; maxx[1] = amaxy;
-  minx[2] = aminz; maxx[2] = amaxz;
-}
-
-Box3d :: Box3d ( const Box3d & b2 )
-{
-  for (int i = 0; i < 3; i++)
-    {
-      minx[i] = b2.minx[i];
-      maxx[i] = b2.maxx[i];
-    }
-}
-
-Box3d :: Box3d ( const Box<3> & b2 )
-{
-  for (int i = 0; i < 3; i++)
-    {
-      minx[i] = b2.PMin()(i);
-      maxx[i] = b2.PMax()(i);
-    }
-}
-
-
-/*
-int Box3d :: Intersect (const Box3d & box2) const
-{
-  int i;
-  for (i = 0; i <= 2; i++)
-    if (minx[i] > box2.maxx[i] || maxx[i] < box2.minx[i])
-      return 0;
-  return 1;
-}
-*/
-
-/*
-void Box3d :: SetPoint (const Point3d & p)
-{
-  minx[0] = maxx[0] = p.X();
-  minx[1] = maxx[1] = p.Y();
-  minx[2] = maxx[2] = p.Z();
-}
-
-void Box3d :: AddPoint (const Point3d & p)
-{
-  if (p.X() < minx[0]) minx[0] = p.X();
-  if (p.X() > maxx[0]) maxx[0] = p.X();
-  if (p.Y() < minx[1]) minx[1] = p.Y();
-  if (p.Y() > maxx[1]) maxx[1] = p.Y();
-  if (p.Z() < minx[2]) minx[2] = p.Z();
-  if (p.Z() > maxx[2]) maxx[2] = p.Z();
-}
-*/
-
-void Box3d :: GetPointNr (int i, Point3d & point) const
-{
-  i--;
-  point.X() = (i & 1) ? maxx[0] : minx[0];
-  point.Y() = (i & 2) ? maxx[1] : minx[1];
-  point.Z() = (i & 4) ? maxx[2] : minx[2];
-}
-
-
-void Box3d :: Increase (double d)
-{
-  for (int i = 0; i <= 2; i++)
-    {
-      minx[i] -= d;
-      maxx[i] += d;
-    }
-}
-
-void Box3d :: IncreaseRel (double /* rel */)
-{
-  for (int i = 0; i <= 2; i++)
-    {
-      double d = 0.5 * (maxx[i] - minx[i]);
-      minx[i] -= d;
-      maxx[i] += d;
-    }
-}
-
-
-Box3d :: Box3d (const Point3d& p1, const Point3d& p2)
-{
-  minx[0] = min2 (p1.X(), p2.X());
-  minx[1] = min2 (p1.Y(), p2.Y());
-  minx[2] = min2 (p1.Z(), p2.Z());
-  maxx[0] = max2 (p1.X(), p2.X());
-  maxx[1] = max2 (p1.Y(), p2.Y());
-  maxx[2] = max2 (p1.Z(), p2.Z());
-}
-
-const Box3d& Box3d :: operator+=(const Box3d& b)
-{
-  minx[0] = min2 (minx[0], b.minx[0]);
-  minx[1] = min2 (minx[1], b.minx[1]);
-  minx[2] = min2 (minx[2], b.minx[2]);
-  maxx[0] = max2 (maxx[0], b.maxx[0]);
-  maxx[1] = max2 (maxx[1], b.maxx[1]);
-  maxx[2] = max2 (maxx[2], b.maxx[2]);
-
-  return *this;
-}
-
-Point3d Box3d :: MaxCoords() const
-{
-  return Point3d(maxx[0], maxx[1], maxx[2]);
-}
-
-Point3d Box3d :: MinCoords() const
-{
-  return Point3d(minx[0], minx[1], minx[2]);
-}
-
-/*
-void Box3d :: CreateNegMinMaxBox()
-{
-  minx[0] = MAXDOUBLE;
-  minx[1] = MAXDOUBLE;
-  minx[2] = MAXDOUBLE;
-  maxx[0] = MINDOUBLE;
-  maxx[1] = MINDOUBLE;
-  maxx[2] = MINDOUBLE;
-
-}
-*/
-
-void Box3d :: WriteData(ofstream& fout) const
-{
-  for(int i = 0; i < 3; i++)
-    {
-      fout << minx[i] << " " << maxx[i] << " ";
-    }
-  fout << "\n";
-}
-
-void Box3d :: ReadData(ifstream& fin)
-{
-  for(int i = 0; i < 3; i++)
-    {
-      fin >> minx[i];
-      fin >> maxx[i];
-    }
-}
-
-
-
-
-Box3dSphere :: Box3dSphere ( double aminx, double amaxx,
-			     double aminy, double amaxy,
-			     double aminz, double amaxz )
-  : Box3d (aminx, amaxx, aminy, amaxy, aminz, amaxz)
-{
-  CalcDiamCenter ();
-}
-
-
-void Box3dSphere :: CalcDiamCenter ()
-{
-  diam = sqrt( sqr (maxx[0] - minx[0]) +
-	       sqr (maxx[1] - minx[1]) + 
-	       sqr (maxx[2] - minx[2]));
-  
-  c.X() = 0.5 * (minx[0] + maxx[0]);
-  c.Y() = 0.5 * (minx[1] + maxx[1]);
-  c.Z() = 0.5 * (minx[2] + maxx[2]);
-  
-  inner = min2 ( min2 (maxx[0] - minx[0], maxx[1] - minx[1]), maxx[2] - minx[2]) / 2;
-}
-
-
-void Box3dSphere :: GetSubBox (int i, Box3dSphere & sbox) const
-{
-  i--;
-  if (i & 1)
-    {
-      sbox.minx[0] = c.X();
-      sbox.maxx[0] = maxx[0];
-    }
-  else
-    {
-      sbox.minx[0] = minx[0];
-      sbox.maxx[0] = c.X();
-    }
-  if (i & 2)
-    {
-      sbox.minx[1] = c.Y();
-      sbox.maxx[1] = maxx[1];
-    }
-  else
-    {
-      sbox.minx[1] = minx[1];
-      sbox.maxx[1] = c.Y();
-    }
-  if (i & 4)
-    {
-      sbox.minx[2] = c.Z();
-      sbox.maxx[2] = maxx[2];
-    }
-  else
-    {
-      sbox.minx[2] = minx[2];
-      sbox.maxx[2] = c.Z();
-    }
-  
-  //  sbox.CalcDiamCenter ();
-
-  sbox.c.X() = 0.5 * (sbox.minx[0] + sbox.maxx[0]);
-  sbox.c.Y() = 0.5 * (sbox.minx[1] + sbox.maxx[1]);
-  sbox.c.Z() = 0.5 * (sbox.minx[2] + sbox.maxx[2]);
-  sbox.diam = 0.5 * diam;
-  sbox.inner = 0.5 * inner;
-}
-
-
-
-
-/*
-double Determinant (const Vec3d & col1,
-		    const Vec3d & col2,
-		    const Vec3d & col3)
-{
-  return
-    col1.x[0] * ( col2.x[1] * col3.x[2] - col2.x[2] * col3.x[1]) +
-    col1.x[1] * ( col2.x[2] * col3.x[0] - col2.x[0] * col3.x[2]) +
-    col1.x[2] * ( col2.x[0] * col3.x[1] - col2.x[1] * col3.x[0]);
-}
-*/
-
-void Transpose (Vec3d & v1, Vec3d & v2, Vec3d & v3)
-{
-  Swap (v1.Y(), v2.X());
-  Swap (v1.Z(), v3.X());
-  Swap (v2.Z(), v3.Y());
-}
-
-
-int SolveLinearSystem (const Vec3d & col1, const Vec3d & col2,
-		       const Vec3d & col3, const Vec3d & rhs,
-		       Vec3d & sol)
-{
-  Vec3d cr;
-  Cross (col1, col2, cr);
-  double det = cr * col3;
-
-  if (fabs (det) < 1e-40)
-    return 1;
-
-  if (fabs(cr.Z()) > 1e-12)
-    {
-      // solve for 3. component
-      sol.Z() = (cr * rhs) / det;
-      
-      // 2x2 system for 1. and 2. component
-      double res1 = rhs.X() - sol.Z() * col3.X();
-      double res2 = rhs.Y() - sol.Z() * col3.Y();
-      
-      sol.X() = (col2.Y() * res1 - col2.X() * res2) / cr.Z();
-      sol.Y() = (col1.X() * res2 - col1.Y() * res1) / cr.Z();
-  
-    }
-  else
-    {
-      det = Determinant (col1, col2, col3);
-      if (fabs (det) < 1e-40)
-	return 1;
-      
-      sol.X() = Determinant (rhs, col2, col3) / det;
-      sol.Y() = Determinant (col1, rhs, col3) / det;
-      sol.Z() = Determinant (col1, col2, rhs) / det;
-    }
-
-  return 0;
-}
-
-
-int SolveLinearSystemLS (const Vec3d & col1,
-			 const Vec3d & col2,
-			 const Vec2d & rhs,
-			 Vec3d & sol)
-{
-  double a11 = col1 * col1;
-  double a12 = col1 * col2;
-  double a22 = col2 * col2;
-  
-  double det = a11 * a22 - a12 * a12;
-
-  if (det*det <= 1e-24 * a11 * a22)
-    {
-      sol = Vec3d (0, 0, 0);
-      return 1;
-    }
-  
-  Vec2d invrhs;
-  invrhs.X() = ( a22 * rhs.X() - a12 * rhs.Y()) / det;
-  invrhs.Y() = (-a12 * rhs.X() + a11 * rhs.Y()) / det;
-
-  sol.X() = invrhs.X() * col1.X() + invrhs.Y() * col2.X();
-  sol.Y() = invrhs.X() * col1.Y() + invrhs.Y() * col2.Y();
-  sol.Z() = invrhs.X() * col1.Z() + invrhs.Y() * col2.Z();
-
-  return 0;
-
-  /*
-  Vec3d inv1, inv2;
-  int err = 
-    PseudoInverse (col1, col2, inv1, inv2);
-
-   sol = rhs.X() * inv1 + rhs.Y() * inv2;
-   return err;
-  */
-}
-
-int SolveLinearSystemLS2 (const Vec3d & col1,
-			 const Vec3d & col2,
-			 const Vec2d & rhs,
-			 Vec3d & sol, double & x, double & y)
-{
-  double a11 = col1 * col1;
-  double a12 = col1 * col2;
-  double a22 = col2 * col2;
-  
-  double det = a11 * a22 - a12 * a12;
-
-  if (fabs (det) <= 1e-12 * col1.Length() * col2.Length() || 
-      col1.Length2() == 0 || col2.Length2() == 0)
-    {
-      sol = Vec3d (0, 0, 0);
-      x = 0; y = 0;
-      return 1;
-    }
-  
-  Vec2d invrhs;
-  invrhs.X() = ( a22 * rhs.X() - a12 * rhs.Y()) / det;
-  invrhs.Y() = (-a12 * rhs.X() + a11 * rhs.Y()) / det;
-
-  sol.X() = invrhs.X() * col1.X() + invrhs.Y() * col2.X();
-  sol.Y() = invrhs.X() * col1.Y() + invrhs.Y() * col2.Y();
-  sol.Z() = invrhs.X() * col1.Z() + invrhs.Y() * col2.Z();
-
-  x = invrhs.X();
-  y = invrhs.Y();
-
-  return 0;
-
-  /*
-  Vec3d inv1, inv2;
-  int err = 
-    PseudoInverse (col1, col2, inv1, inv2);
-
-   sol = rhs.X() * inv1 + rhs.Y() * inv2;
-   return err;
-  */
-}
-
-int PseudoInverse (const Vec3d & col1,
-		   const Vec3d & col2,
-		   Vec3d & inv1,
-		   Vec3d & inv2)
-{
-  double a11 = col1 * col1;
-  double a12 = col1 * col2;
-  double a22 = col2 * col2;
-  
-  double det = a11 * a22 - a12 * a12;
-
-  if (fabs (det) < 1e-12 * col1.Length() * col2.Length())
-    {
-      inv1 = Vec3d (0, 0, 0);
-      inv2 = Vec3d (0, 0, 0);
-      return 1;
-    }
-
-  double ia11 = a22 / det;
-  double ia12 = -a12 / det;
-  double ia22 = a11 / det;
-
-  inv1 = ia11 * col1 + ia12 * col2;
-  inv2 = ia12 * col1 + ia22 * col2;
-
-  return 0;
-}
-
-
-
-
-QuadraticFunction3d :: 
-QuadraticFunction3d (const Point3d & p, const Vec3d & v)
-{
-  Vec3d hv(v);
-  hv /= (hv.Length() + 1e-12);
-  Vec3d t1, t2;
-  hv.GetNormal (t1);
-  Cross (hv, t1, t2);
-  
-  double t1p = t1.X() * p.X() + t1.Y() * p.Y() + t1.Z() * p.Z();
-  double t2p = t2.X() * p.X() + t2.Y() * p.Y() + t2.Z() * p.Z();
-  c0 = sqr (t1p) + sqr (t2p);
-  cx = -2 * (t1p * t1.X() + t2p * t2.X());
-  cy = -2 * (t1p * t1.Y() + t2p * t2.Y());
-  cz = -2 * (t1p * t1.Z() + t2p * t2.Z());
-
-  cxx = t1.X() * t1.X() + t2.X() * t2.X();
-  cyy = t1.Y() * t1.Y() + t2.Y() * t2.Y();
-  czz = t1.Z() * t1.Z() + t2.Z() * t2.Z();
-
-  cxy = 2 * t1.X() * t1.Y() + 2 * t2.X() * t2.Y();
-  cxz = 2 * t1.X() * t1.Z() + 2 * t2.X() * t2.Z();
-  cyz = 2 * t1.Y() * t1.Z() + 2 * t2.Y() * t2.Z();
-
-  /*
-  (*testout) << "c0 = " << c0
-	     << " clin = " << cx << " " << cy << " " << cz 
-	     << " cq = " << cxx << " " << cyy << " " << czz
-	     << cxy << " " << cyz << " " << cyz << endl;
-  */
-}
-
-// QuadraticFunction3d gqf (Point3d (0,0,0), Vec3d (1, 0, 0));
-
-
-
-
-
-void referencetransform :: Set (const Point3d & p1, const Point3d & p2,
-                                const Point3d & p3, double ah)
-{
-  ex = p2 - p1;
-  ex /= ex.Length();
-  ey = p3 - p1;
-  ey -= (ex * ey) * ex;
-  ey /= ey.Length();
-  ez = Cross (ex, ey);
-  rp = p1;
-  h = ah;
-
-  exh = ah * ex;
-  eyh = ah * ey;
-  ezh = ah * ez;
-  ah = 1 / ah;
-  ex_h = ah * ex;
-  ey_h = ah * ey;
-  ez_h = ah * ez;
-}
-
-void referencetransform :: ToPlain (const Point3d & p, Point3d & pp) const
-{
-  Vec3d v;
-  v = p - rp;
-  pp.X() = (ex_h * v);
-  pp.Y() = (ey_h * v);
-  pp.Z() = (ez_h * v);
-}
-
-void referencetransform :: ToPlain (const ARRAY<Point3d> & p,
-                                    ARRAY<Point3d> & pp) const
-{
-  Vec3d v;
-  int i;
-
-  pp.SetSize (p.Size());
-  for (i = 1; i <= p.Size(); i++)
-    {
-      v = p.Get(i) - rp;
-      pp.Elem(i).X() = (ex_h * v);
-      pp.Elem(i).Y() = (ey_h * v);
-      pp.Elem(i).Z() = (ez_h * v);
-    }
-}
-
-void referencetransform :: FromPlain (const Point3d & pp, Point3d & p) const
-{
-  Vec3d v;
-  //  v = (h * pp.X()) * ex + (h * pp.Y()) * ey + (h * pp.Z()) * ez;
-  //  p = rp + v;
-  v.X() = pp.X() * exh.X() + pp.Y() * eyh.X() + pp.Z() * ezh.X();
-  v.Y() = pp.X() * exh.Y() + pp.Y() * eyh.Y() + pp.Z() * ezh.Y();
-  v.Z() = pp.X() * exh.Z() + pp.Y() * eyh.Z() + pp.Z() * ezh.Z();
-  p.X() = rp.X() + v.X();
-  p.Y() = rp.Y() + v.Y();
-  p.Z() = rp.Z() + v.Z();
-}
-
-
-}
diff --git a/contrib/Netgen/libsrc/gprim/geom3d.hpp b/contrib/Netgen/libsrc/gprim/geom3d.hpp
deleted file mode 100644
index 56bff4ad6b2cf3a94790953b2ad391d7175ae480..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geom3d.hpp
+++ /dev/null
@@ -1,732 +0,0 @@
-#ifndef FILE_GEOM3D
-#define FILE_GEOM3D
-
-/* *************************************************************************/
-/* File:   geom3d.hh                                                       */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   5. Aug. 95                                                      */
-/* *************************************************************************/
-
-
-
-
-extern void MyError (const char * ch);
-
-class Point3d;
-class Vec3d;
-
-inline Vec3d operator- (const Point3d & p1, const Point3d & p2);
-inline Point3d operator- (const Point3d & p1, const Vec3d & v);
-inline Point3d operator+ (const Point3d & p1, const Vec3d & v);
-Point3d & Add (double d, const Vec3d & v);
-Point3d & Add2 (double d, const Vec3d & v,
-			 double d2, const Vec3d & v2);
-inline Point3d Center (const Point3d & p1, const Point3d & p2);
-inline Point3d Center (const Point3d & p1, const Point3d & p2, const Point3d & p3);
-inline Point3d Center (const Point3d & p1, const Point3d & p2, 
-				const Point3d & p3, const Point3d & p4);
-ostream & operator<<(ostream  & s, const Point3d & p);
-inline Vec3d operator- (const Vec3d & p1, const Vec3d & v);
-inline Vec3d operator+ (const Vec3d & p1, const Vec3d & v);
-inline Vec3d operator* (double scal, const Vec3d & v);
-inline double operator* (const Vec3d & v1, const Vec3d & v2);
-inline Vec3d Cross (const Vec3d & v1, const Vec3d & v2);
-inline void Cross (const Vec3d & v1, const Vec3d & v2, Vec3d & prod);
-double Angle (const Vec3d & v);
-double FastAngle (const Vec3d & v);
-double Angle (const Vec3d & v1, const Vec3d & v2);
-double FastAngle (const Vec3d & v1, const Vec3d & v2);
-ostream & operator<<(ostream  & s, const Vec3d & v);
-void Transpose (Vec3d & v1, Vec3d & v2, Vec3d & v3);
-int SolveLinearSystem (const Vec3d & col1,
-		       const Vec3d & col2,
-		       const Vec3d & col3,
-		       const Vec3d & rhs,
-		       Vec3d & sol);
-int SolveLinearSystemLS (const Vec3d & col1,
-			 const Vec3d & col2,
-			 const Vec2d & rhs,
-			 Vec3d & sol);
-int SolveLinearSystemLS2 (const Vec3d & col1,
-			  const Vec3d & col2,
-			  const Vec2d & rhs, 
-			  Vec3d & sol,
-			  double & x, double & y);
-int PseudoInverse (const Vec3d & col1,
-		   const Vec3d & col2,
-		   Vec3d & inv1,
-		   Vec3d & inv2);
-double Determinant (const Vec3d & col1,
-		    const Vec3d & col2,
-		    const Vec3d & col3);
-
-/// Point in R3
-class Point3d
-{
-protected:
-  ///
-  double x[3];
-  
-public:
-  ///
-  Point3d () { x[0] = x[1] = x[2] = 0; }
-  ///
-  Point3d(double ax, double ay, double az) 
-    { x[0] = ax; x[1] = ay; x[2] = az; }
-  ///
-  Point3d(double ax[3])
-    { x[0] = ax[0]; x[1] = ax[1]; x[2] = ax[2]; }
-
-  ///
-  Point3d(const Point3d & p2) 
-    { x[0] = p2.x[0]; x[1] = p2.x[1]; x[2] = p2.x[2]; }
-
-  Point3d (const Point<3> & p2)
-  {
-    for (int i = 0; i < 3; i++)
-      x[i] = p2(i);
-  }
-  
-  ///
-  Point3d & operator= (const Point3d & p2)
-    { x[0] = p2.x[0]; x[1] = p2.x[1]; x[2] = p2.x[2]; return *this; }
-  
-  ///
-  int operator== (const Point3d& p) const
-    { return (x[0] == p.x[0] && x[1] == p.x[1] && x[2] == p.x[2]); }
-  
-  ///
-  double & X() { return x[0]; }
-  ///
-  double & Y() { return x[1]; }
-  ///
-  double & Z() { return x[2]; }
-  ///
-  double X() const { return x[0]; }
-  ///
-  double Y() const { return x[1]; }
-  ///
-  double Z() const { return x[2]; }
-  ///
-  double & X(int i) { return x[i-1]; }
-  ///
-  double X(int i) const { return x[i-1]; }
-  ///
-  const Point3d & SetToMin (const Point3d & p2)
-    {
-      if (p2.x[0] < x[0]) x[0] = p2.x[0];
-      if (p2.x[1] < x[1]) x[1] = p2.x[1];
-      if (p2.x[2] < x[2]) x[2] = p2.x[2];
-      return *this;
-    }
-
-  ///
-  const Point3d & SetToMax (const Point3d & p2)
-    {
-      if (p2.x[0] > x[0]) x[0] = p2.x[0];
-      if (p2.x[1] > x[1]) x[1] = p2.x[1];
-      if (p2.x[2] > x[2]) x[2] = p2.x[2];
-      return *this;
-    }
-
-  ///
-  friend inline Vec3d operator- (const Point3d & p1, const Point3d & p2);
-  ///
-  friend inline Point3d operator- (const Point3d & p1, const Vec3d & v);
-  ///
-  friend inline Point3d operator+ (const Point3d & p1, const Vec3d & v);
-  ///
-  inline Point3d & operator+= (const Vec3d & v);
-  inline Point3d & operator-= (const Vec3d & v);
-  ///
-  inline Point3d & Add (double d, const Vec3d & v);
-  ///
-  inline Point3d & Add2 (double d, const Vec3d & v,
-			 double d2, const Vec3d & v2);
-  ///
-  friend inline double Dist (const Point3d & p1, const Point3d & p2)
-    { return sqrt (  (p1.x[0]-p2.x[0]) * (p1.x[0]-p2.x[0]) + 
-		     (p1.x[1]-p2.x[1]) * (p1.x[1]-p2.x[1]) +
-                     (p1.x[2]-p2.x[2]) * (p1.x[2]-p2.x[2])); }
-  ///
-  inline friend double Dist2 (const Point3d & p1, const Point3d & p2)
-    { return  (  (p1.x[0]-p2.x[0]) * (p1.x[0]-p2.x[0]) + 
-		 (p1.x[1]-p2.x[1]) * (p1.x[1]-p2.x[1]) +
-		 (p1.x[2]-p2.x[2]) * (p1.x[2]-p2.x[2])); }
-
-  ///
-  friend inline Point3d Center (const Point3d & p1, const Point3d & p2);
-  ///
-  friend inline Point3d Center (const Point3d & p1, const Point3d & p2, const Point3d & p3);
-  ///
-  friend inline Point3d Center (const Point3d & p1, const Point3d & p2, 
-				const Point3d & p3, const Point3d & p4);
-  ///
-  friend ostream & operator<<(ostream  & s, const Point3d & p);
-  
-  ///
-  friend class Vec3d;
-  ///
-  friend class Box3d;
-
-
-  operator Point<3> () const
-  {
-    return Point<3> (x[0], x[1], x[2]);
-  }
-};
-
-
-///
-class Vec3d
-{
-protected:
-  ///
-  double x[3];
-
-public:
-  ///
-  inline Vec3d() { x[0] = x[1] = x[2] = 0; }
-  ///
-  inline Vec3d(double ax, double ay, double az)
-    { x[0] = ax; x[1] = ay; x[2] = az; }
-  ///
-  Vec3d(double ax[3])
-    { x[0] = ax[0]; x[1] = ax[1]; x[2] = ax[2]; }
-  ///
-  inline Vec3d(const Vec3d & v2) 
-    { x[0] = v2.x[0]; x[1] = v2.x[1]; x[2] = v2.x[2]; }
-  ///
-  inline Vec3d(const Point3d & p1, const Point3d & p2)
-    { 
-      x[0] = p2.x[0] - p1.x[0];
-      x[1] = p2.x[1] - p1.x[1];
-      x[2] = p2.x[2] - p1.x[2]; 
-    }
-  ///
-  inline Vec3d(const Point3d & p1)
-    { 
-      x[0] = p1.x[0];
-      x[1] = p1.x[1];
-      x[2] = p1.x[2];
-    }
-  
-  Vec3d (const Vec<3> & v2)
-  {
-    for (int i = 0; i < 3; i++)
-      x[i] = v2(i);
-  }
-
-  operator Vec<3> () const
-  {
-    return Vec<3> (x[0], x[1], x[2]);
-  }
-
-
-  Vec3d & operator= (const Vec3d & v2)
-    { x[0] = v2.x[0]; x[1] = v2.x[1]; x[2] = v2.x[2]; return *this; }
-  ///
-  Vec3d & operator= (double val)
-    { x[0] = x[1] = x[2] = val; return *this; }
-  ///
-  double & X() { return x[0]; }
-  ///
-  double & Y() { return x[1]; }
-  ///
-  double & Z() { return x[2]; }
-  ///
-  double & X(int i) { return x[i-1]; }
-
-  ///
-  double X() const { return x[0]; }
-  ///
-  double Y() const { return x[1]; }
-  ///
-  double Z() const { return x[2]; }
-  ///
-  double X(int i) const { return x[i-1]; }
-
-  ///
-  double Length() const 
-    { return sqrt (x[0] * x[0] + x[1] * x[1] + x[2] * x[2]); }
-  ///
-  double Length2() const 
-    { return x[0] * x[0] + x[1] * x[1] + x[2] * x[2]; }
-
-  ///
-  Vec3d & operator+= (const Vec3d & v2);
-  ///
-  Vec3d & operator-= (const Vec3d & v2);
-  ///
-  Vec3d & operator*= (double s);
-  ///
-  Vec3d & operator/= (double s);
-  ///
-  inline Vec3d & Add (double d, const Vec3d & v);
-  ///
-  inline Vec3d & Add2 (double d, const Vec3d & v,
-			 double d2, const Vec3d & v2);
-
-  ///
-  friend inline Vec3d operator- (const Point3d & p1, const Point3d & p2);
-  ///
-  friend inline Point3d operator- (const Point3d & p1, const Vec3d & v);
-  ///
-  friend inline Point3d operator+ (const Point3d & p1, const Vec3d & v);
-  ///
-  friend inline Vec3d operator- (const Vec3d & p1, const Vec3d & v);
-  ///
-  friend inline Vec3d operator+ (const Vec3d & p1, const Vec3d & v);
-  ///
-  friend inline Vec3d operator* (double scal, const Vec3d & v);
-
-  ///
-  friend inline double operator* (const Vec3d & v1, const Vec3d & v2);
-  ///
-  friend inline Vec3d Cross (const Vec3d & v1, const Vec3d & v2);
-  ///
-  friend inline void Cross (const Vec3d & v1, const Vec3d & v2, Vec3d & prod);
-
-  /// Returns one normal-vector to n
-  void GetNormal (Vec3d & n) const;
-  ///
-  friend double Angle (const Vec3d & v);
-  ///
-  friend double FastAngle (const Vec3d & v);
-  ///
-  friend double Angle (const Vec3d & v1, const Vec3d & v2);
-  ///
-  friend double FastAngle (const Vec3d & v1, const Vec3d & v2);
-
-  void Normalize() 
-  {
-    double len = (x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
-    if (len == 0) return;
-    len = sqrt (len);
-    x[0] /= len; x[1] /= len; x[2] /= len;
-  }
-
-  ///
-  friend ostream & operator<<(ostream  & s, const Vec3d & v);
-
-  ///
-  friend class Point3d;
-  friend void Transpose (Vec3d & v1, Vec3d & v2, Vec3d & v3);
-  friend int SolveLinearSystem (const Vec3d & col1,
-				const Vec3d & col2,
-				const Vec3d & col3,
-				const Vec3d & rhs,
-				Vec3d & sol);
-  friend int SolveLinearSystemLS (const Vec3d & col1,
-				  const Vec3d & col2,
-				  const Vec2d & rhs,
-				  Vec3d & sol);
-  friend int SolveLinearSystemLS2 (const Vec3d & col1,
-				   const Vec3d & col2,
-				   const Vec2d & rhs, 
-				   Vec3d & sol,
-				   double & x, double & y);
-  friend int PseudoInverse (const Vec3d & col1,
-			    const Vec3d & col2,
-			    Vec3d & inv1,
-			    Vec3d & inv2);
-  friend double Determinant (const Vec3d & col1,
-			     const Vec3d & col2,
-			     const Vec3d & col3);
-};
-
-
-
-
-class QuadraticFunction3d
-{
-  double c0, cx, cy, cz;
-  double cxx, cyy, czz, cxy, cxz, cyz;
-
-public:
-  QuadraticFunction3d (const Point3d & p, const Vec3d & v);
-  double Eval (const Point3d & p)
-    {
-      return 
-	c0 
-	+ p.X() * (cx + cxx * p.X() + cxy * p.Y() + cxz * p.Z())
-	+ p.Y() * (cy + cyy * p.Y() + cyz * p.Z())
-	+ p.Z() * (cz + czz * p.Z());
-    }
-};
-
-
-
-inline Point3d Center (const Point3d & p1, const Point3d & p2)
-{
-  return Point3d (0.5 * (p1.x[0] + p2.x[0]),
-		  0.5 * (p1.x[1] + p2.x[1]),
-		  0.5 * (p1.x[2] + p2.x[2]));
-}
-
-
-inline Point3d Center (const Point3d & p1, const Point3d & p2,
-                       const Point3d & p3)
-{
-  return Point3d (1.0/3.0 * (p1.x[0] + p2.x[0] + p3.x[0]),
-		  1.0/3.0 * (p1.x[1] + p2.x[1] + p3.x[1]),
-		  1.0/3.0 * (p1.x[2] + p2.x[2] + p3.x[2]));
-}
-
-inline Point3d Center (const Point3d & p1, const Point3d & p2,
-                       const Point3d & p3, const Point3d & p4)
-{
-  return Point3d (0.25 * (p1.x[0] + p2.x[0] + p3.x[0] + p4.x[0]),
-		  0.25 * (p1.x[1] + p2.x[1] + p3.x[1] + p4.x[1]),
-		  0.25 * (p1.x[2] + p2.x[2] + p3.x[2] + p4.x[2]));
-}
-
-
-
-inline Vec3d & Vec3d :: operator+= (const Vec3d & v2)
-{
-  x[0] += v2.x[0];
-  x[1] += v2.x[1];
-  x[2] += v2.x[2];
-  return *this;
-}
-
-inline Vec3d & Vec3d :: operator-= (const Vec3d & v2)
-{
-  x[0] -= v2.x[0];
-  x[1] -= v2.x[1];
-  x[2] -= v2.x[2];
-  return *this;
-}
-
-
-inline Vec3d & Vec3d :: operator*= (double s)
-{
-  x[0] *= s;
-  x[1] *= s;
-  x[2] *= s;
-  return *this;
-}
-
-
-inline Vec3d & Vec3d :: operator/= (double s)
-{
-  if (s != 0)
-    {
-      x[0] /= s;
-      x[1] /= s;
-      x[2] /= s;
-    }
-#ifdef DEBUG
-  else
-    {
-      cerr << "Vec div by 0, v = " << (*this) << endl;
-      //      MyError ("Vec3d::operator /=: Divisioin by zero");
-    }
-#endif
-  return *this;
-}
-
-inline Vec3d & Vec3d::Add (double d, const Vec3d & v)
-{
-  x[0] += d * v.x[0]; 
-  x[1] += d * v.x[1]; 
-  x[2] += d * v.x[2];
-  return *this;
-}
-
-inline Vec3d & Vec3d::Add2 (double d, const Vec3d & v,
-			    double d2, const Vec3d & v2)
-{
-  x[0] += d * v.x[0] + d2 * v2.x[0]; 
-  x[1] += d * v.x[1] + d2 * v2.x[1]; 
-  x[2] += d * v.x[2] + d2 * v2.x[2]; 
-  return *this;
-}
-
-
-
-
-
-
-
-
-inline Vec3d operator- (const Point3d & p1, const Point3d & p2)
-{
-  return Vec3d (p1.x[0] - p2.x[0], p1.x[1] - p2.x[1],p1.x[2] - p2.x[2]);
-}
-
-
-inline Point3d operator- (const Point3d & p1, const Vec3d & v)
-{
-  return Point3d (p1.x[0] - v.x[0], p1.x[1] - v.x[1],p1.x[2] - v.x[2]);
-}
-
-
-inline Point3d operator+ (const Point3d & p1, const Vec3d & v)
-{
-  return Point3d (p1.x[0] + v.x[0], p1.x[1] + v.x[1],p1.x[2] + v.x[2]);
-}
-
-inline Point3d & Point3d::operator+= (const Vec3d & v) 
-{
-  x[0] += v.x[0]; 
-  x[1] += v.x[1]; 
-  x[2] += v.x[2];
-  return *this;
-}
-
-inline Point3d & Point3d::operator-= (const Vec3d & v) 
-{
-  x[0] -= v.x[0]; 
-  x[1] -= v.x[1]; 
-  x[2] -= v.x[2];
-  return *this;
-}
-
-inline Point3d & Point3d::Add (double d, const Vec3d & v)
-{
-  x[0] += d * v.x[0]; 
-  x[1] += d * v.x[1]; 
-  x[2] += d * v.x[2];
-  return *this;
-}
-
-inline Point3d & Point3d::Add2 (double d, const Vec3d & v,
-				double d2, const Vec3d & v2)
-{
-  x[0] += d * v.x[0] + d2 * v2.x[0]; 
-  x[1] += d * v.x[1] + d2 * v2.x[1]; 
-  x[2] += d * v.x[2] + d2 * v2.x[2]; 
-  return *this;
-}
-
-
-inline Vec3d operator- (const Vec3d & v1, const Vec3d & v2)
-{
-  return Vec3d (v1.x[0] - v2.x[0], v1.x[1] - v2.x[1],v1.x[2] - v2.x[2]);
-}
-
-
-inline Vec3d operator+ (const Vec3d & v1, const Vec3d & v2)
-{
-  return Vec3d (v1.x[0] + v2.x[0], v1.x[1] + v2.x[1],v1.x[2] + v2.x[2]);
-}
-
-
-inline Vec3d operator* (double scal, const Vec3d & v)
-{
-  return Vec3d (scal * v.x[0], scal * v.x[1], scal * v.x[2]);
-}
-
-
-
-inline double operator* (const Vec3d & v1, const Vec3d & v2)
-{
-  return v1.x[0] * v2.x[0] + v1.x[1] * v2.x[1] + v1.x[2] * v2.x[2];
-}
-
-
-
-inline Vec3d Cross (const Vec3d & v1, const Vec3d & v2)
-{
-  return Vec3d
-    ( v1.x[1] * v2.x[2] - v1.x[2] * v2.x[1],
-      v1.x[2] * v2.x[0] - v1.x[0] * v2.x[2],
-      v1.x[0] * v2.x[1] - v1.x[1] * v2.x[0]);
-}
-
-inline void Cross (const Vec3d & v1, const Vec3d & v2, Vec3d & prod)
-{
-  prod.x[0] = v1.x[1] * v2.x[2] - v1.x[2] * v2.x[1];
-  prod.x[1] = v1.x[2] * v2.x[0] - v1.x[0] * v2.x[2];
-  prod.x[2] = v1.x[0] * v2.x[1] - v1.x[1] * v2.x[0];
-}
-
-inline double Determinant (const Vec3d & col1,
-			   const Vec3d & col2,
-			   const Vec3d & col3)
-{
-  return
-    col1.x[0] * ( col2.x[1] * col3.x[2] - col2.x[2] * col3.x[1]) +
-    col1.x[1] * ( col2.x[2] * col3.x[0] - col2.x[0] * col3.x[2]) +
-    col1.x[2] * ( col2.x[0] * col3.x[1] - col2.x[1] * col3.x[0]);
-}
-
-
-///
-class Box3d
-{
-protected:
-  ///
-  double minx[3], maxx[3];
-
-public:
-  ///
-  Box3d () { };
-  ///
-  Box3d ( double aminx, double amaxx,
-          double aminy, double amaxy,
-          double aminz, double amaxz );
-  ///
-  Box3d ( const Box3d & b2 );
-  ///
-  Box3d (const Point3d& p1, const Point3d& p2);
-  ///
-  Box3d (const Box<3> & b2);
-  ///
-  double MinX () const { return minx[0]; }
-  ///
-  double MaxX () const { return maxx[0]; }
-  ///
-  double MinY () const { return minx[1]; }
-  ///
-  double MaxY () const { return maxx[1]; }
-  ///
-  double MinZ () const { return minx[2]; }
-  ///
-  double MaxZ () const { return maxx[2]; }
-
-  ///
-  double Mini (int i) const { return minx[i-1]; }
-  ///
-  double Maxi (int i) const { return maxx[i-1]; }
-
-  ///
-  Point3d PMin () const { return Point3d(minx[0], minx[1], minx[2]); }
-  ///
-  Point3d PMax () const { return Point3d(maxx[0], maxx[1], maxx[2]); }
-
-  ///
-  void GetPointNr (int i, Point3d & point) const;
-  /// increase Box at each side with dist 
-  void Increase (double dist);
-  /// increase Box by factor rel
-  void IncreaseRel (double rel);
-  /// return 1 if closures are intersecting
-  int Intersect (const Box3d & box2) const
-  {
-    if (minx[0] > box2.maxx[0] || maxx[0] < box2.minx[0] ||
-	minx[1] > box2.maxx[1] || maxx[1] < box2.minx[1] ||
-	minx[2] > box2.maxx[2] || maxx[2] < box2.minx[2])
-      return 0;
-    return 1;
-  }
-  /// return 1 if point p in closure
-  int IsIn (const Point3d & p) const
-    {
-      if (minx[0] <= p.x[0] && maxx[0] >= p.x[0] &&
-	  minx[1] <= p.x[1] && maxx[1] >= p.x[1] &&
-	  minx[2] <= p.x[2] && maxx[2] >= p.x[2])
-	return 1;
-      return 0;
-    }
-  ///
-  inline void SetPoint (const Point3d & p)
-    {
-      minx[0] = maxx[0] = p.X();
-      minx[1] = maxx[1] = p.Y();
-      minx[2] = maxx[2] = p.Z();    
-    }
-
-  ///
-  inline void AddPoint (const Point3d & p)
-    {
-      if (p.x[0] < minx[0]) minx[0] = p.x[0];
-      if (p.x[0] > maxx[0]) maxx[0] = p.x[0];
-      if (p.x[1] < minx[1]) minx[1] = p.x[1];
-      if (p.x[1] > maxx[1]) maxx[1] = p.x[1];
-      if (p.x[2] < minx[2]) minx[2] = p.x[2];
-      if (p.x[2] > maxx[2]) maxx[2] = p.x[2];
-    }
-
-  ///
-  const Box3d& operator+=(const Box3d& b);
-
-  ///
-  Point3d MaxCoords() const;
-  ///
-  Point3d MinCoords() const;
-
-  /// Make a negative sized box;
-  //  void CreateNegMinMaxBox();
-  
-  ///
-  Point3d CalcCenter () const { return Point3d(0.5*(minx[0] + maxx[0]),
-					       0.5*(minx[1] + maxx[1]),
-					       0.5*(minx[2] + maxx[2])); }
-  ///
-  double CalcDiam () const { return sqrt(sqr(maxx[0]-minx[0])+
-					 sqr(maxx[1]-minx[1])+
-					 sqr(maxx[2]-minx[2])); }
-
-  ///
-  void WriteData(ofstream& fout) const;
-  ///
-  void ReadData(ifstream& fin);
-};
-
-
-class Box3dSphere : public Box3d
-{
-protected:
-  ///
-  double diam, inner;
-  ///
-  Point3d c;
-public:
-  ///
-  Box3dSphere () { };
-  ///
-  Box3dSphere ( double aminx, double amaxx,
-		double aminy, double amaxy,
-		double aminz, double amaxz);
-  ///
-  const Point3d & Center () const { return c; }
-
-  ///
-  double Diam () const { return diam; }
-  ///
-  double Inner () const { return inner; }
-  ///
-  void GetSubBox (int i, Box3dSphere & sbox) const;
-
-  // private:
-  ///
-  void CalcDiamCenter ();
-};
-
-
-
-
-///
-class referencetransform
-{
-  ///
-  Vec3d ex, ey, ez;
-  ///
-  Vec3d exh, eyh, ezh;
-  ///
-  Vec3d ex_h, ey_h, ez_h;
-  ///
-  Point3d rp;
-  ///
-  double h;
-
-public:
-
-  ///
-  void Set (const Point3d & p1, const Point3d & p2,
-            const Point3d & p3, double ah);
-
-  ///
-  void ToPlain (const Point3d & p, Point3d & pp) const;
-  ///
-  void ToPlain (const ARRAY<Point3d> & p, ARRAY<Point3d> & pp) const;
-  ///
-  void FromPlain (const Point3d & pp, Point3d & p) const;
-};
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/geomfuncs.cpp b/contrib/Netgen/libsrc/gprim/geomfuncs.cpp
deleted file mode 100644
index b2ac83824a8908e1e2a5be3417ad5e79057f3f72..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomfuncs.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <gprim.hpp>
-
-namespace netgen
-{
-
-  /*
-  // template <>
-inline void CalcInverse (const Mat<2,2> & m, Mat<2,2> & inv)
-{
-  double det = m(0,0) * m(1,1) - m(0,1) * m(1,0);
-  if (det == 0) 
-    {
-      inv = 0;
-      return;
-    }
-
-  double idet = 1.0 / det;
-  inv(0,0) =  idet * m(1,1);
-  inv(0,1) = -idet * m(0,1);
-  inv(1,0) = -idet * m(1,0);
-  inv(1,1) =  idet * m(0,0);
-}
-  */
-
-
-
-  // template <>
-void CalcInverse (const Mat<3,3> & m, Mat<3,3> & inv)
-{
-  double det = Det (m);
-  if (det == 0) 
-    {
-      inv = 0;
-      return;
-    }
-
-  double idet = 1.0 / det;
-  inv(0,0) =  idet * (m(1,1) * m(2,2) - m(1,2) * m(2,1));
-  inv(1,0) = -idet * (m(1,0) * m(2,2) - m(1,2) * m(2,0));
-  inv(2,0) =  idet * (m(1,0) * m(2,1) - m(1,1) * m(2,0));
-
-  inv(0,1) = -idet * (m(0,1) * m(2,2) - m(0,2) * m(2,1));
-  inv(1,1) =  idet * (m(0,0) * m(2,2) - m(0,2) * m(2,0));
-  inv(2,1) = -idet * (m(0,0) * m(2,1) - m(0,1) * m(2,0));
-
-  inv(0,2) =  idet * (m(0,1) * m(1,2) - m(0,2) * m(1,1));
-  inv(1,2) = -idet * (m(0,0) * m(1,2) - m(0,2) * m(1,0));
-  inv(2,2) =  idet * (m(0,0) * m(1,1) - m(0,1) * m(1,0));
-}
-
-/*
-// template <>
-void CalcInverse (const Mat<2,3> & m, Mat<3,2> & inv)
-{
-  Mat<2,2> a = m * Trans (m);
-  Mat<2,2> ainv;
-  CalcInverse (a, ainv);
-  inv = Trans (m) * ainv;
-}
-*/
-
-
-
-double Det (const Mat<2,2> & m) 
-{
-  return  m(0,0) * m(1,1) - m(0,1) * m(1,0);
-}
-
-double Det (const Mat<3,3> & m) 
-{
-  return 
-    m(0,0) * m(1,1) * m(2,2)
-    + m(1,0) * m(2,1) * m(0,2)
-    + m(2,0) * m(0,1) * m(1,2)
-    - m(0,0) * m(2,1) * m(1,2)
-    - m(1,0) * m(0,1) * m(2,2)
-    - m(2,0) * m(1,1) * m(0,2);
-}
-
-
-void EigenValues (const Mat<3,3> & m, Vec<3> & ev)
-{
-  const double pi = 3.141592;
-  double a, b, c, d;
-  double p, q;
-  double arg;
-
-  a = -1.;
-  b = m(0,0) + m(1,1) + m(2,2);
-  c = -( m(0,0)*m(2,2) + m(1,1)*m(2,2) + m(0,0)*m(1,1) - sqr(m(0,1)) - sqr(m(0,2)) - sqr(m(1,2)) );
-  d = Det (m);
-  p = 3.*a*c - sqr(b);
-  q = 27.*sqr(a)*d - 9.*a*b*c + 2.*sqr(b)*b;
-
-
-  arg = acos((-q/2)/sqrt(-(p*p*p)));
-
-
-  ev(0) = (2. * sqrt(-p) * cos(arg/3.) - b) / 3.*a;
-  ev(1) = (-2. * sqrt(-p) * cos(arg/3.+pi/3) - b) / 3.*a;
-  ev(2) = (-2. * sqrt(-p) * cos(arg/3.-pi/3)- b) / 3.*a;
-
-
-
-}
-
-
-}
diff --git a/contrib/Netgen/libsrc/gprim/geomfuncs.hpp b/contrib/Netgen/libsrc/gprim/geomfuncs.hpp
deleted file mode 100644
index b9228c8583b6c2b28deb6910d851a8770305a542..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomfuncs.hpp
+++ /dev/null
@@ -1,136 +0,0 @@
-#ifndef FILE_GEOMFUNCS
-#define FILE_GEOMFUNCS
-
-/* *************************************************************************/
-/* File:   geomfuncs.hpp                                                   */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   20. Jul. 02                                                     */
-/* *************************************************************************/
-
-
-template <int D>
-inline double Abs (const Vec<D> & v)
-{
-  double sum = 0;
-  for (int i = 0; i < D; i++)
-    sum += v(i) * v(i);
-  return sqrt (sum);
-}
-
-
-template <int D>
-inline double Abs2 (const Vec<D> & v)
-{
-  double sum = 0;
-  for (int i = 0; i < D; i++)
-    sum += v(i) * v(i);
-  return sum;
-}
-
-
-
-template <int D>
-inline double Dist (const Point<D> & a, const Point<D> & b)
-{
-  return Abs (a-b);
-}
-
-template <int D>
-inline double Dist2 (const Point<D> & a, const Point<D> & b)
-{
-  return Abs2 (a-b);
-}
-
-
-template <int D>
-inline Point<D> Center (const Point<D> & a, const Point<D> & b)
-{
-  Point<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = 0.5 * (a(i) + b(i));
-  return res;
-}
-
-template <int D>
-inline Point<D> Center (const Point<D> & a, const Point<D> & b, const Point<D> & c)
-{
-  Point<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = (1.0/3.0) * (a(i) + b(i) + c(i));
-  return res;
-}
-
-
-
-inline Vec<3> Cross (const Vec<3> & v1, const Vec<3> & v2)
-{
-  return Vec<3> 
-    ( v1(1) * v2(2) - v1(2) * v2(1),
-      v1(2) * v2(0) - v1(0) * v2(2),
-      v1(0) * v2(1) - v1(1) * v2(0) );
-}
-
-
-template <>
-inline  Vec<2> Vec<2> :: GetNormal () const
-{
-  return Vec<2> (-x[1], x[0]);
-}
-
-template <>
-inline  Vec<3> Vec<3> :: GetNormal () const
-{
-  if (fabs (x[0]) > fabs (x[2]))
-    return Vec<3> (-x[1], x[0], 0);
-  else
-    return Vec<3> (0, x[2], -x[1]);
-}
-
-
-
-// template <int H, int W>
-inline void CalcInverse (const Mat<2,2> & m, Mat<2,2> & inv)
-{
-  double det = m(0,0) * m(1,1) - m(0,1) * m(1,0);
-  if (det == 0) 
-    {
-      inv = 0;
-      return;
-    }
-
-  double idet = 1.0 / det;
-  inv(0,0) =  idet * m(1,1);
-  inv(0,1) = -idet * m(0,1);
-  inv(1,0) = -idet * m(1,0);
-  inv(1,1) =  idet * m(0,0);
-}
-
-void CalcInverse (const Mat<3,3> & m, Mat<3,3> & inv);
-
-inline void CalcInverse (const Mat<2,3> & m, Mat<3,2> & inv)
-{
-  Mat<2,2> a = m * Trans (m);
-  Mat<2,2> ainv;
-  CalcInverse (a, ainv);
-  inv = Trans (m) * ainv;
-}
-
-void CalcInverse (const Mat<3,2> & m, Mat<2,3> & inv);
-
-inline void CalcInverse (const Mat<3,2> & m, Mat<2,3> & inv)
-{
-  Mat<2,2> a = Trans (m) * m;
-  Mat<2,2> ainv;
-  CalcInverse (a, ainv);
-  inv = ainv * Trans (m);
-}
-
-
-double Det (const Mat<2,2> & m);
-double Det (const Mat<3,3> & m);
-
-// eigenvalues of a symmetric matrix
-void EigenValues (const Mat<3,3> & m, Vec<3> & ev);
-void EigenValues (const Mat<2,2> & m, Vec<3> & ev);
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/geomobjects.hpp b/contrib/Netgen/libsrc/gprim/geomobjects.hpp
deleted file mode 100644
index 2db82cf9e938ae0f32a9ddb51b9c277e34799b22..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomobjects.hpp
+++ /dev/null
@@ -1,346 +0,0 @@
-#ifndef FILE_OBJECTS
-#define FILE_OBJECTS
-
-/* *************************************************************************/
-/* File:   geomobjects.hpp                                                 */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   20. Jul. 02                                                     */
-/* *************************************************************************/
-
-
-
-template <int D> class Vec;
-template <int D> class Point;
-
-
-template <int D>
-class Point
-{
-
-protected:
-  double x[D];
-
-public:
-  Point () { ; }
-  Point (double ax) { x[0] = ax; }
-  Point (double ax, double ay) { x[0] = ax; x[1] = ay; }
-  Point (double ax, double ay, double az)
-  { x[0] = ax; x[1] = ay; x[2] = az; }
-  Point (double ax, double ay, double az, double au)
-  { x[0] = ax; x[1] = ay; x[2] = az; x[3] = au;}
-
-  Point (const Point<D> & p2)
-  { for (int i = 0; i < D; i++) x[i] = p2.x[i]; }
-
-  explicit Point (const Vec<D> & v)
-  { for (int i = 0; i < D; i++) x[i] = v(i); }
-
-
-  Point & operator= (const Point<D> & p2)
-  {
-    for (int i = 0; i < D; i++) x[i] = p2.x[i]; 
-    return *this;
-  }
-
-  double & operator() (int i) { return x[i]; }
-  const double & operator() (int i) const { return x[i]; }
-
-  operator const double* () const { return x; }
-};
-
-
-
-
-
-template <int D>
-class Vec
-{
-
-protected:
-  double x[D];
-
-public:
-  Vec () { ; }
-  Vec (double ax) { for (int i = 0; i < D; i++) x[i] = ax; }
-  Vec (double ax, double ay) { x[0] = ax; x[1] = ay; }
-  Vec (double ax, double ay, double az)
-  { x[0] = ax; x[1] = ay; x[2] = az; }
-  Vec (double ax, double ay, double az, double au)
-  { x[0] = ax; x[1] = ay; x[2] = az; x[3] = au; }
-
-  Vec (const Vec<D> & p2)
-  { for (int i = 0; i < D; i++) x[i] = p2.x[i]; }
-
-  explicit Vec (const Point<D> & p)
-  { for (int i = 0; i < D; i++) x[i] = p(i); }
-
-  Vec (const Vec<D> & p1, const Vec<D> & p2)
-  { for(int i=0; i<D; i++) x[i] = p2(i)-p1(1); }
-  
-
-
-  Vec & operator= (const Vec<D> & p2)
-  {
-    for (int i = 0; i < D; i++) x[i] = p2.x[i]; 
-    return *this;
-  }
-
-  Vec & operator= (double s)
-  {
-    for (int i = 0; i < D; i++) x[i] = s;
-    return *this;
-  }
-
-  double & operator() (int i) { return x[i]; }
-  const double & operator() (int i) const { return x[i]; }
-
-  operator const double* () const { return x; }
-
-  double Length () const
-  {
-    double l = 0;
-    for (int i = 0; i < D; i++)
-      l += x[i] * x[i];
-    return sqrt (l);
-  }
-
-  double Length2 () const
-  {
-    double l = 0;
-    for (int i = 0; i < D; i++)
-      l += x[i] * x[i];
-    return l;
-  }
-
-  const Vec<D> & Normalize ()
-  {
-    double l = Length();
-    if (l != 0)
-      for (int i = 0; i < D; i++)
-	x[i] /= l;
-    return *this;
-  }
-
-  Vec<D> GetNormal () const;
-};
-
-
-
-
-
-template <int H, int W=H>
-class Mat
-{
-
-protected:
-  double x[H*W];
-
-public:
-  Mat () { ; }
-  Mat (const Mat & b)
-  { for (int i = 0; i < H*W; i++) x[i] = b.x[i]; }
-  
-  Mat & operator= (double s)
-  {
-    for (int i = 0; i < H*W; i++) x[i] = s;
-    return *this;
-  }
-
-  Mat & operator= (const Mat & b)
-  {
-    for (int i = 0; i < H*W; i++) x[i] = b.x[i]; 
-    return *this;
-  }
-
-  double & operator() (int i, int j) { return x[i*W+j]; }
-  const double & operator() (int i, int j) const { return x[i*W+j]; }
-  double & operator() (int i) { return x[i]; }
-  const double & operator() (int i) const { return x[i]; }
-
-  Vec<H> Col (int i) const
-  {
-    Vec<H> hv; 
-    for (int j = 0; j < H; j++)
-      hv(j) = x[j*W+i];
-    return hv; 
-  }
-
-  Vec<W> Row (int i) const
-  {
-    Vec<W> hv; 
-    for (int j = 0; j < W; j++)
-      hv(j) = x[i*W+j];
-    return hv; 
-  }
-
-  void Solve (const Vec<H> & rhs, Vec<W> & sol) const
-  {
-    Mat<W,H> inv;
-    CalcInverse (*this, inv);
-    sol = inv * rhs;
-  }
-};
-
-
-
-
-template <int D>
-class Box
-{
-protected:
-  Point<D> pmin, pmax;
-public:
-  Box () { ; }
-  Box ( const Point<D> & p1, const Point<D> & p2)
-  {
-    for (int i = 0; i < D; i++)
-      {
-	pmin(i) = min2(p1(i), p2(i));
-	pmax(i) = max2(p1(i), p2(i));
-      }
-  }
-
-  const Point<D> & PMin () const { return pmin; }
-  const Point<D> & PMax () const { return pmax; }
-  
-  void Set (const Point<D> & p)
-  { pmin = pmax = p; }
-
-  void Add (const Point<D> & p)
-  { 
-    for (int i = 0; i < D; i++)
-      {
-	if (p(i) < pmin(i)) pmin(i) = p(i);
-	else if (p(i) > pmax(i)) pmax(i) = p(i);
-      }
-  }
-
-  Point<D> Center () const 
-  { 
-    Point<D> c;
-    for (int i = 0; i < D; i++)
-      c(i) = 0.5 * (pmin(i)+pmax(i)); 
-    return c;
-  }
-  double Diam () const { return Abs (pmax-pmin); }
-
-  Point<D> GetPointNr (int nr) const
-  {
-    Point<D> p;
-    for (int i = 0; i < D; i++)
-      {
-	p(i) = (nr & 1) ? pmax(i) : pmin(i);
-	nr >>= 1;
-      }
-    return p;
-  }
-
-
-  bool Intersect (const Box<D> & box2) const
-  {
-    for (int i = 0; i < D; i++)
-      if (pmin(i) > box2.pmax(i) ||
-	  pmax(i) < box2.pmin(i)) return 0;
-    return 1;
-  }
-
-
-  bool IsIn (const Point<D> & p) const
-  {
-    for (int i = 0; i < D; i++)
-      if (p(i) < pmin(i) || p(i) > pmax(i)) return 0;
-    return 1;
-  }
-
-
-  void Increase (double dist)
-  {
-    for (int i = 0; i < D; i++)
-      {
-	pmin(i) -= dist;
-	pmax(i) += dist;
-      }
-  }
-};
-
-
-
-
-template <int D>
-class BoxSphere : public Box<D>
-{
-protected:
-  ///
-  Point<D> c;
-  ///
-  double diam;
-  ///
-  double inner;
-public:
-  ///
-  BoxSphere () { };
- ///
-  BoxSphere (const Box<D> & box) 
-  : Box<D> (box) 
-  { 
-    CalcDiamCenter();
-  };
-
-  ///
-  BoxSphere ( Point<D> pmin, Point<D> pmax )
-    : Box<D> (pmin, pmax)
-  {
-    CalcDiamCenter();
-  }
-
-  ///
-  const Point<D> & Center () const { return c; }
-  ///
-  double Diam () const { return diam; }
-  ///
-  double Inner () const { return inner; }
-
-
-  ///
-  void GetSubBox (int nr, BoxSphere & sbox) const
-  {
-    for (int i = 0; i < D; i++)
-      {
-	if (nr & 1)
-	  {
-	    sbox.pmin(i) = c(i);
-	    sbox.pmax(i) = this->pmax(i);
-	  }
-	else
-	  {
-	    sbox.pmin(i) = this->pmin(i);
-	    sbox.pmax(i) = c(i);
-	  }
-	sbox.c(i) = 0.5 * (sbox.pmin(i) + sbox.pmax(i));
-	nr >>= 1;
-      }
-    sbox.diam = 0.5 * diam;
-    sbox.inner = 0.5 * inner;
-  }
-
-
-  ///
-  void CalcDiamCenter ()
-  {
-    c = Box<D>::Center ();
-    diam = Dist (this->pmin, this->pmax);
-
-    inner = this->pmax(0) - this->pmin(0);
-    for (int i = 1; i < D; i++)
-      if (this->pmax(i) - this->pmin(i) < inner)
-	inner = this->pmax(i) - this->pmin(i);
-  }
-
-};
-
-
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/geomobjects2.hpp b/contrib/Netgen/libsrc/gprim/geomobjects2.hpp
deleted file mode 100644
index 014a38525a9dc65d4f63e9f1f970712591220f3b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomobjects2.hpp
+++ /dev/null
@@ -1,366 +0,0 @@
-#ifndef FILE_OBJECTS
-#define FILE_OBJECTS
-
-/* *************************************************************************/
-/* File:   geomobjects.hpp                                                 */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   20. Jul. 02                                                     */
-/* *************************************************************************/
-
-template <typename T>
-class VecExpr
-{
-public:
-  VecExpr () { ; }
-  double operator() (int i) const { return static_cast<const T&> (*this) (i); }
-};
-
-
-template <int D> class Vec;
-template <int D> class Point;
-
-
-template <int D>
-class Point : public VecExpr<Point<D> >
-{
-
-protected:
-  double x[D];
-
-public:
-  Point () { ; }
-  Point (double ax) { x[0] = ax; }
-  Point (double ax, double ay) { x[0] = ax; x[1] = ay; }
-  Point (double ax, double ay, double az)
-  { x[0] = ax; x[1] = ay; x[2] = az; }
-  Point (double ax, double ay, double az, double au)
-  { x[0] = ax; x[1] = ay; x[2] = az; x[3] = au;}
-
-  Point (const Point<D> & p2)
-  { for (int i = 0; i < D; i++) x[i] = p2.x[i]; }
-
-  explicit Point (const Vec<D> & v)
-  { for (int i = 0; i < D; i++) x[i] = v(i); }
-
-
-  template <typename T>
-  explicit Point (const VecExpr<T> & expr)
-  {
-    for (int i = 0; i < D; i++) x[i] = expr(i); 
-  }
-
-  Point & operator= (const Point<D> & p2)
-  {
-    for (int i = 0; i < D; i++) x[i] = p2.x[i]; 
-    return *this;
-  }
-
-  template <typename T>
-  Point & operator= (const VecExpr<T> & expr)
-  {
-    for (int i = 0; i < D; i++) x[i] = expr(i);
-    return *this;
-  }
-
-  double & operator() (int i) { return x[i]; }
-  const double & operator() (int i) const { return x[i]; }
-
-  operator const double* () const { return x; }
-};
-
-
-
-
-
-template <int D>
-class Vec : public VecExpr<Vec<D> >
-{
-
-protected:
-  double x[D];
-
-public:
-  Vec () { ; }
-  Vec (double ax) { for (int i = 0; i < D; i++) x[i] = ax; }
-  Vec (double ax, double ay) { x[0] = ax; x[1] = ay; }
-  Vec (double ax, double ay, double az)
-  { x[0] = ax; x[1] = ay; x[2] = az; }
-  Vec (double ax, double ay, double az, double au)
-  { x[0] = ax; x[1] = ay; x[2] = az; x[3] = au; }
-
-  Vec (const Vec<D> & p2)
-  { for (int i = 0; i < D; i++) x[i] = p2.x[i]; }
-
-  explicit Vec (const Point<D> & p)
-  { for (int i = 0; i < D; i++) x[i] = p(i); }
-
-  template <typename T>
-  explicit Vec (const VecExpr<T> & expr)
-  {
-    for (int i = 0; i < D; i++) x[i] = expr(i); 
-  }
-
-
-  Vec & operator= (const Vec<D> & p2)
-  {
-    for (int i = 0; i < D; i++) x[i] = p2.x[i]; 
-    return *this;
-  }
-
-  template <typename T>
-  Vec & operator= (const VecExpr<T> & expr)
-  {
-    for (int i = 0; i < D; i++) x[i] = expr(i);
-    return *this;
-  }
-
-  Vec & operator= (double s)
-  {
-    for (int i = 0; i < D; i++) x[i] = s;
-    return *this;
-  }
-
-  double & operator() (int i) { return x[i]; }
-  const double & operator() (int i) const { return x[i]; }
-
-  operator const double* () const { return x; }
-
-  double Length () const
-  {
-    double l = 0;
-    for (int i = 0; i < D; i++)
-      l += x[i] * x[i];
-    return sqrt (l);
-  }
-
-  double Length2 () const
-  {
-    double l = 0;
-    for (int i = 0; i < D; i++)
-      l += x[i] * x[i];
-    return l;
-  }
-
-  const Vec<D> & Normalize ()
-  {
-    double l = Length();
-    if (l != 0)
-      for (int i = 0; i < D; i++)
-	x[i] /= l;
-    return *this;
-  }
-
-  Vec<D> GetNormal () const;
-};
-
-
-
-
-
-template <int H, int W=H>
-class Mat
-{
-
-protected:
-  double x[H*W];
-
-public:
-  Mat () { ; }
-  Mat (const Mat & b)
-  { for (int i = 0; i < H*W; i++) x[i] = b.x[i]; }
-  
-  Mat & operator= (double s)
-  {
-    for (int i = 0; i < H*W; i++) x[i] = s;
-    return *this;
-  }
-
-  Mat & operator= (const Mat & b)
-  {
-    for (int i = 0; i < H*W; i++) x[i] = b.x[i]; 
-    return *this;
-  }
-
-  double & operator() (int i, int j) { return x[i*W+j]; }
-  const double & operator() (int i, int j) const { return x[i*W+j]; }
-
-  Vec<H> Col (int i) const
-  {
-    Vec<H> hv; 
-    for (int j = 0; j < H; j++)
-      hv(j) = x[j*W+i];
-    return hv; 
-  }
-
-  Vec<W> Row (int i) const
-  {
-    Vec<W> hv; 
-    for (int j = 0; j < W; j++)
-      hv(j) = x[i*W+j];
-    return hv; 
-  }
-
-  void Solve (const Vec<H> & rhs, Vec<W> & sol) const
-  {
-    Mat<W,H> inv;
-    CalcInverse (*this, inv);
-    sol = inv * rhs;
-  }
-};
-
-
-
-
-template <int D>
-class Box
-{
-protected:
-  Point<D> pmin, pmax;
-public:
-  Box () { ; }
-  Box ( const Point<D> & p1, const Point<D> & p2)
-  {
-    for (int i = 0; i < D; i++)
-      {
-	pmin(i) = min2(p1(i), p2(i));
-	pmax(i) = max2(p1(i), p2(i));
-      }
-  }
-
-  const Point<D> & PMin () const { return pmin; }
-  const Point<D> & PMax () const { return pmax; }
-  
-  void Set (const Point<D> & p)
-  { pmin = pmax = p; }
-
-  void Add (const Point<D> & p)
-  { 
-    for (int i = 0; i < D; i++)
-      {
-	if (p(i) < pmin(i)) pmin(i) = p(i);
-	else if (p(i) > pmax(i)) pmax(i) = p(i);
-      }
-  }
-
-  Point<D> Center () const 
-  { 
-    Point<D> c;
-    for (int i = 0; i < D; i++)
-      c(i) = 0.5 * (pmin(i)+pmax(i)); 
-    return c;
-  }
-  double Diam () const { return Abs (pmax-pmin); }
-
-  Point<D> GetPointNr (int nr) const
-  {
-    Point<D> p;
-    for (int i = 0; i < D; i++)
-      {
-	p(i) = (nr & 1) ? pmax(i) : pmin(i);
-	nr >>= 1;
-      }
-    return p;
-  }
-
-
-  bool Intersect (const Box<D> & box2) const
-  {
-    for (int i = 0; i < D; i++)
-      if (pmin(i) > box2.pmax(i) ||
-	  pmax(i) < box2.pmin(i)) return 0;
-    return 1;
-  }
-
-
-  bool IsIn (const Point<D> & p) const
-  {
-    for (int i = 0; i < D; i++)
-      if (p(i) < pmin(i) || p(i) > pmax(i)) return 0;
-    return 1;
-  }
-
-
-  void Increase (double dist)
-  {
-    for (int i = 0; i < D; i++)
-      {
-	pmin(i) -= dist;
-	pmax(i) += dist;
-      }
-  }
-};
-
-
-
-
-template <int D>
-class BoxSphere : public Box<D>
-{
-protected:
-  ///
-  Point<D> c;
-  ///
-  double diam;
-  ///
-  double inner;
-public:
-  ///
-  BoxSphere () { };
-  ///
-  BoxSphere ( Point<D> pmin, Point<D> pmax )
-    : Box<D> (pmin, pmax)
-  {
-    CalcDiamCenter();
-  }
-
-  ///
-  const Point<D> & Center () const { return c; }
-  ///
-  double Diam () const { return diam; }
-  ///
-  double Inner () const { return inner; }
-
-
-  ///
-  void GetSubBox (int nr, BoxSphere & sbox) const
-  {
-    for (int i = 0; i < D; i++)
-      {
-	if (nr & 1)
-	  {
-	    sbox.pmin(i) = c(i);
-	    sbox.pmax(i) = this->pmax(i);
-	  }
-	else
-	  {
-	    sbox.pmin(i) = this->pmin(i);
-	    sbox.pmax(i) = c(i);
-	  }
-	sbox.c(i) = 0.5 * (sbox.pmin(i) + sbox.pmax(i));
-	nr >>= 1;
-      }
-    sbox.diam = 0.5 * diam;
-    sbox.inner = 0.5 * inner;
-  }
-
-
-  ///
-  void CalcDiamCenter ()
-  {
-    c = Box<D>::Center ();
-    diam = Dist (this->pmin, this->pmax);
-
-    inner = this->pmax(0) - this->pmin(0);
-    for (int i = 1; i < D; i++)
-      if (this->pmax(i) - this->pmin(i) < inner)
-	inner = this->pmax(i) - this->pmin(i);
-  }
-
-};
-
-
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/geomops.hpp b/contrib/Netgen/libsrc/gprim/geomops.hpp
deleted file mode 100644
index 755f35a87886bf237e01893549f4dd5d6cc04aae..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomops.hpp
+++ /dev/null
@@ -1,391 +0,0 @@
-#ifndef FILE_GEOMOPS
-#define FILE_GEOMOPS
-
-/* *************************************************************************/
-/* File:   geomops.hpp                                                     */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   20. Jul. 02                                                     */
-/* *************************************************************************/
-
-
-/*
-
-Point - Vector operations
-
- */
-
-
-template <int D>
-inline Vec<D> operator+ (const Vec<D> & a, const Vec<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) + b(i);
-  return res;
-}
-
-
-
-template <int D>
-inline Point<D> operator+ (const Point<D> & a, const Vec<D> & b)
-{
-  Point<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) + b(i);
-  return res;
-}
-
-
-
-template <int D>
-inline Vec<D> operator- (const Point<D> & a, const Point<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) - b(i);
-  return res;
-}
-
-template <int D>
-inline Point<D> operator- (const Point<D> & a, const Vec<D> & b)
-{
-  Point<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) - b(i);
-  return res;
-}
-
-template <int D>
-inline Vec<D> operator- (const Vec<D> & a, const Vec<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) - b(i);
-  return res;
-}
-
-
-
-template <int D>
-inline Vec<D> operator* (double s, const Vec<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = s * b(i);
-  return res;
-}
-
-
-template <int D>
-inline double operator* (const Vec<D> & a, const Vec<D> & b)
-{
-  double sum = 0;
-  for (int i = 0; i < D; i++)
-    sum += a(i) * b(i);
-  return sum;
-}
-
-
-
-template <int D>
-inline Vec<D> operator- (const Vec<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = -b(i);
-  return res;
-}
-
-
-template <int D>
-inline Point<D> & operator+= (Point<D> & a, const Vec<D> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) += b(i);
-  return a;
-}
-
-template <int D>
-inline Vec<D> & operator+= (Vec<D> & a, const Vec<D> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) += b(i);
-  return a;
-}
-
-
-template <int D>
-inline Point<D> & operator-= (Point<D> & a, const Vec<D> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) -= b(i);
-  return a;
-}
-
-template <int D>
-inline Vec<D> & operator-= (Vec<D> & a, const Vec<D> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) -= b(i);
-  return a;
-}
-
-
-
-template <int D>
-inline Vec<D> & operator*= (Vec<D> & a, double s)
-{
-  for (int i = 0; i < D; i++)
-    a(i) *= s;
-  return a;
-}
-
-
-template <int D>
-inline Vec<D> & operator/= (Vec<D> & a, double s)
-{
-  for (int i = 0; i < D; i++)
-    a(i) /= s;
-  return a;
-}
-
-
-
-
-// Matrix - Vector operations
-
-/*
-template <int H, int W>
-inline Vec<H> operator* (const Mat<H,W> & m, const Vec<W> & v)
-{
-  Vec<H> res;
-  for (int i = 0; i < H; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < W; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-*/
-
-// thanks to VC60 partial template specialization features !!!
-
-inline Vec<2> operator* (const Mat<2,2> & m, const Vec<2> & v)
-{
-  Vec<2> res;
-  for (int i = 0; i < 2; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < 2; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-
-inline Vec<2> operator* (const Mat<2,3> & m, const Vec<3> & v)
-{
-  Vec<2> res;
-  for (int i = 0; i < 2; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < 3; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-
-
-inline Vec<3> operator* (const Mat<3,2> & m, const Vec<2> & v)
-{
-  Vec<3> res;
-  for (int i = 0; i < 3; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < 2; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-
-
-inline Vec<3> operator* (const Mat<3,3> & m, const Vec<3> & v)
-{
-  Vec<3> res;
-  for (int i = 0; i < 3; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < 3; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-
-
-
-
-
-
-
-/*
-template <int H1, int W1, int H2, int W2>
-inline Mat<H1,W2> operator* (const Mat<H1,W1> & a, const Mat<H2,W2> & b)
-{
-  Mat<H1,W2> m;
-  for (int i = 0; i < H1; i++)
-    for (int j = 0; j < W2; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < W1; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-*/
-
-inline Mat<2,2> operator* (const Mat<2,2> & a, const Mat<2,2> & b)
-{
-  Mat<2,2> m;
-  for (int i = 0; i < 2; i++)
-    for (int j = 0; j < 2; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 2; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-inline Mat<2,2> operator* (const Mat<2,3> & a, const Mat<3,2> & b)
-{
-  Mat<2,2> m;
-  for (int i = 0; i < 2; i++)
-    for (int j = 0; j < 2; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 3; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-
-inline Mat<3,2> operator* (const Mat<3,2> & a, const Mat<2,2> & b)
-{
-  Mat<3,2> m;
-  for (int i = 0; i < 3; i++)
-    for (int j = 0; j < 2; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 2; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-
-
-inline Mat<2,3> operator* (const Mat<2,2> & a, const Mat<2,3> & b)
-{
-  Mat<2,3> m;
-  for (int i = 0; i < 2; i++)
-    for (int j = 0; j < 3; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 2; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-
-inline Mat<3,3> operator* (const Mat<3,3> & a, const Mat<3,3> & b)
-{
-  Mat<3,3> m;
-  for (int i = 0; i < 3; i++)
-    for (int j = 0; j < 3; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 3; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-
-
-
-
-
-
-
-template <int H, int W>
-inline Mat<W,H> Trans (const Mat<H,W> & m)
-{
-  Mat<W,H> res;
-  for (int i = 0; i < H; i++)
-    for (int j = 0; j < W; j++)
-      res(j,i) = m(i,j);
-  return res;
-}
-
-
-
-
-
-
-
-
-
-
-
-template <int D>
-inline ostream & operator<< (ostream & ost, const Vec<D> & a)
-{
-  ost << "(";
-  for (int i = 0; i < D-1; i++)
-    ost << a(i) << ", ";
-  ost << a(D-1) << ")";
-  return ost;
-}
-
-template <int D>
-inline ostream & operator<< (ostream & ost, const Point<D> & a)
-{
-  ost << "(";
-  for (int i = 0; i < D-1; i++)
-    ost << a(i) << ", ";
-  ost << a(D-1) << ")";
-  return ost;
-}
-
-template <int D>
-inline ostream & operator<< (ostream & ost, const Box<D> & b)
-{
-  ost << b.PMin() << " - " << b.PMax();
-  return ost;
-}
-
-template <int H, int W>
-inline ostream & operator<< (ostream & ost, const Mat<H,W> & m)
-{
-  ost << "(";
-  for (int i = 0; i < H; i++)
-    {
-      for (int j = 0; j < W; j++)
-	ost << m(i,j) << "   ";
-      ost << endl;
-    }
-  return ost;
-}
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/geomops2.hpp b/contrib/Netgen/libsrc/gprim/geomops2.hpp
deleted file mode 100644
index c615da14ecabbc8ae99598e4e04052085750a0b2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomops2.hpp
+++ /dev/null
@@ -1,428 +0,0 @@
-#ifndef FILE_GEOMOPS
-#define FILE_GEOMOPS
-
-/* *************************************************************************/
-/* File:   geomops.hpp                                                     */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   20. Jul. 02                                                     */
-/* *************************************************************************/
-
-
-/*
-
-Point - Vector operations
-
- */
-
-
-
-
-template <class TA, class TB>
-class SumExpr : public VecExpr<SumExpr<TA, TB> >
-{
-  const TA a;
-  const TB b;
-public:
-  SumExpr (const TA aa, const TB ab) : a(aa), b(ab) { ; }
-  double operator() (int i) const { return a(i) + b(i); }
-};
-
-template <typename TA, typename TB>
-inline SumExpr<TA,TB>
-operator+ (const VecExpr<TA> & a, const VecExpr<TB> & b)
-{
-  return SumExpr<TA,TB> (static_cast <const TA&> (a), static_cast <const TB&> (b));
-}
-
-/*
-template <int D1, int D2>
-inline SumExpr<const Vec<D1>&, const Vec<D2>&>
-operator+ (const Vec<D1> & a, const Vec<D2> & b)
-{
-  return SumExpr<const Vec<D1>&, const Vec<D2>&> (a, b);
-}
-*/
-
-
-
-
-
-/*
-template <int D>
-inline Vec<D> operator+ (const Vec<D> & a, const Vec<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) + b(i);
-  return res;
-}
-*/
-
-template <int D>
-inline Point<D> operator+ (const Point<D> & a, const Vec<D> & b)
-{
-  Point<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) + b(i);
-  return res;
-}
-
-
-template <int D>
-inline Vec<D> operator- (const Point<D> & a, const Point<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) - b(i);
-  return res;
-}
-
-template <int D>
-inline Point<D> operator- (const Point<D> & a, const Vec<D> & b)
-{
-  Point<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) - b(i);
-  return res;
-}
-
-template <int D>
-inline Vec<D> operator- (const Vec<D> & a, const Vec<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = a(i) - b(i);
-  return res;
-}
-
-
-template <int D>
-inline Vec<D> operator* (double s, const Vec<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = s * b(i);
-  return res;
-}
-
-
-template <int D>
-inline double operator* (const Vec<D> & a, const Vec<D> & b)
-{
-  double sum = 0;
-  for (int i = 0; i < D; i++)
-    sum += a(i) * b(i);
-  return sum;
-}
-
-
-
-template <int D>
-inline Vec<D> operator- (const Vec<D> & b)
-{
-  Vec<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = -b(i);
-  return res;
-}
-
-
-template <int D>
-inline Point<D> & operator+= (Point<D> & a, const Vec<D> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) += b(i);
-  return a;
-}
-
-
-template <int D, typename T>
-inline Point<D> & operator+= (Point<D> & a, const VecExpr<T> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) += b(i);
-  return a;
-}
-
-template <int D>
-inline Vec<D> & operator+= (Vec<D> & a, const Vec<D> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) += b(i);
-  return a;
-}
-
-
-
-
-
-template <int D>
-inline Point<D> & operator-= (Point<D> & a, const Vec<D> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) -= b(i);
-  return a;
-}
-
-template <int D, typename T>
-inline Point<D> & operator-= (Point<D> & a, const VecExpr<T> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) -= b(i);
-  return a;
-}
-
-
-
-
-
-template <int D>
-inline Vec<D> & operator-= (Vec<D> & a, const Vec<D> & b)
-{
-  for (int i = 0; i < D; i++)
-    a(i) -= b(i);
-  return a;
-}
-
-
-
-template <int D>
-inline Vec<D> & operator*= (Vec<D> & a, double s)
-{
-  for (int i = 0; i < D; i++)
-    a(i) *= s;
-  return a;
-}
-
-
-template <int D>
-inline Vec<D> & operator/= (Vec<D> & a, double s)
-{
-  for (int i = 0; i < D; i++)
-    a(i) /= s;
-  return a;
-}
-
-
-
-
-// Matrix - Vector operations
-
-/*
-template <int H, int W>
-inline Vec<H> operator* (const Mat<H,W> & m, const Vec<W> & v)
-{
-  Vec<H> res;
-  for (int i = 0; i < H; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < W; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-*/
-
-// thanks to VC60 partial template specialization features !!!
-
-inline Vec<2> operator* (const Mat<2,2> & m, const Vec<2> & v)
-{
-  Vec<2> res;
-  for (int i = 0; i < 2; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < 2; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-
-inline Vec<2> operator* (const Mat<2,3> & m, const Vec<3> & v)
-{
-  Vec<2> res;
-  for (int i = 0; i < 2; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < 3; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-
-
-inline Vec<3> operator* (const Mat<3,2> & m, const Vec<2> & v)
-{
-  Vec<3> res;
-  for (int i = 0; i < 3; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < 2; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-
-
-inline Vec<3> operator* (const Mat<3,3> & m, const Vec<3> & v)
-{
-  Vec<3> res;
-  for (int i = 0; i < 3; i++)
-    {
-      res(i) = 0;
-      for (int j = 0; j < 3; j++)
-	res(i) += m(i,j) * v(j);
-    }
-  return res;
-}
-
-
-
-
-
-
-
-/*
-template <int H1, int W1, int H2, int W2>
-inline Mat<H1,W2> operator* (const Mat<H1,W1> & a, const Mat<H2,W2> & b)
-{
-  Mat<H1,W2> m;
-  for (int i = 0; i < H1; i++)
-    for (int j = 0; j < W2; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < W1; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-*/
-
-inline Mat<2,2> operator* (const Mat<2,2> & a, const Mat<2,2> & b)
-{
-  Mat<2,2> m;
-  for (int i = 0; i < 2; i++)
-    for (int j = 0; j < 2; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 2; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-inline Mat<2,2> operator* (const Mat<2,3> & a, const Mat<3,2> & b)
-{
-  Mat<2,2> m;
-  for (int i = 0; i < 2; i++)
-    for (int j = 0; j < 2; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 3; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-
-inline Mat<3,2> operator* (const Mat<3,2> & a, const Mat<2,2> & b)
-{
-  Mat<3,2> m;
-  for (int i = 0; i < 3; i++)
-    for (int j = 0; j < 2; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 2; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-inline Mat<3,3> operator* (const Mat<3,3> & a, const Mat<3,3> & b)
-{
-  Mat<3,3> m;
-  for (int i = 0; i < 3; i++)
-    for (int j = 0; j < 3; j++)
-      {
-	double sum = 0;
-	for (int k = 0; k < 3; k++)
-	  sum += a(i,k) * b(k, j);
-	m(i,j) = sum; 
-      }
-  return m;
-}
-
-
-
-
-
-
-
-
-template <int H, int W>
-inline Mat<W,H> Trans (const Mat<H,W> & m)
-{
-  Mat<W,H> res;
-  for (int i = 0; i < H; i++)
-    for (int j = 0; j < W; j++)
-      res(j,i) = m(i,j);
-  return res;
-}
-
-
-
-
-
-
-
-
-
-
-
-template <int D>
-inline ostream & operator<< (ostream & ost, const Vec<D> & a)
-{
-  ost << "(";
-  for (int i = 0; i < D-1; i++)
-    ost << a(i) << ", ";
-  ost << a(D-1) << ")";
-  return ost;
-}
-
-template <int D>
-inline ostream & operator<< (ostream & ost, const Point<D> & a)
-{
-  ost << "(";
-  for (int i = 0; i < D-1; i++)
-    ost << a(i) << ", ";
-  ost << a(D-1) << ")";
-  return ost;
-}
-
-template <int D>
-inline ostream & operator<< (ostream & ost, const Box<D> & b)
-{
-  ost << b.PMin() << " - " << b.PMax();
-  return ost;
-}
-
-template <int H, int W>
-inline ostream & operator<< (ostream & ost, const Mat<H,W> & m)
-{
-  ost << "(";
-  for (int i = 0; i < H; i++)
-    {
-      for (int j = 0; j < W; j++)
-	ost << m(i,j) << "   ";
-      ost << endl;
-    }
-  return ost;
-}
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/geomtest3d.cpp b/contrib/Netgen/libsrc/gprim/geomtest3d.cpp
deleted file mode 100644
index 14d1d58bd1a6d4c4e7dc6332c61f196c697c400e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomtest3d.cpp
+++ /dev/null
@@ -1,1223 +0,0 @@
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-namespace netgen
-{
-int
-IntersectTriangleLine (const Point3d ** tri, const Point3d ** line)
-{
-  Vec3d vl(*line[0], *line[1]);
-  Vec3d vt1(*tri[0], *tri[1]);
-  Vec3d vt2(*tri[0], *tri[2]);
-  Vec3d vrs(*tri[0], *line[0]);
-
-  static DenseMatrix a(3), ainv(3);
-  static Vector rs(3), lami(3);
-  int i;
-
-  /*
-  (*testout) << "Tri-Line inters: " << endl
-	     << "tri = " << *tri[0] << ", " << *tri[1] << ", " << *tri[2] << endl
-	     << "line = " << *line[0] << ", " << *line[1] << endl;
-  */
-  for (i = 1; i <= 3; i++)
-    {
-      a.Elem(i, 1) = -vl.X(i);
-      a.Elem(i, 2) = vt1.X(i);
-      a.Elem(i, 3) = vt2.X(i);
-      rs.Elem(i) = vrs.X(i);
-    }
-
-  double det = a.Det();
-
-  double arel = vl.Length() * vt1.Length() * vt2.Length();
-  /*
-  double amax = 0;
-  for (i = 1; i <= 9; i++)
-    if (fabs (a.Get(i)) > amax)
-      amax = fabs(a.Get(i));
-  */
-  // new !!!!
-  if (fabs (det) <= 1e-10 * arel)
-    {
-#ifdef DEVELOP      
-      // line parallel to triangle !
-      // cout << "ERROR: IntersectTriangleLine degenerated" << endl;
-      //      (*testout) << "WARNING: IntersectTriangleLine degenerated\n";
-      /*
-      (*testout) << "lin-tri intersection: " << endl
-		 << "line = " << *line[0] << " - " << *line[1] << endl
-		 << "tri = " << *tri[0] << " - " << *tri[1] << " - " << *tri[2] << endl
-		 << "lami = " << lami << endl
-		 << "pc = " << ( *line[0] + lami.Get(1) * vl ) << endl
-		 << "   = " << ( *tri[0] + lami.Get(2) * vt1 + lami.Get(3) * vt2) << endl
-		 << " a = " << a << endl
-		 << " ainv = " << ainv << endl
-		 << " det(a) = " << det << endl
-		 << " rs = " << rs << endl;
-      */
-#endif
-      return 0;
-    }
-
-  CalcInverse (a, ainv);
-  ainv.Mult (rs, lami);
-
-  //  (*testout) << "lami = " << lami << endl;
-
-  double eps = 1e-6;
-  if (
-      (lami.Get(1) >= -eps && lami.Get(1) <= 1+eps && 
-       lami.Get(2) >= -eps && lami.Get(3) >= -eps && 
-       lami.Get(2) + lami.Get(3) <= 1+eps)  && !
-      (lami.Get(1) >= eps && lami.Get(1) <= 1-eps && 
-       lami.Get(2) >= eps && lami.Get(3) >= eps && 
-       lami.Get(2) + lami.Get(3) <= 1-eps) )
-
-
-     {
-#ifdef DEVELOP
-       //      cout << "WARNING: IntersectTriangleLine degenerated" << endl;
-      (*testout) << "WARNING: IntersectTriangleLine numerical inexact" << endl;
-
-      (*testout) << "lin-tri intersection: " << endl
-		 << "line = " << *line[0] << " - " << *line[1] << endl
-		 << "tri = " << *tri[0] << " - " << *tri[1] << " - " << *tri[2] << endl
-		 << "lami = " << lami << endl
-		 << "pc = " << ( *line[0] + lami.Get(1) * vl ) << endl
-		 << "   = " << ( *tri[0] + lami.Get(2) * vt1 + lami.Get(3) * vt2) << endl
-		 << " a = " << a << endl
-		 << " ainv = " << ainv << endl
-		 << " det(a) = " << det << endl
-		 << " rs = " << rs << endl;
-#endif
-    }
-      
-
-  if (lami.Get(1) >= 0 && lami.Get(1) <= 1 && 
-      lami.Get(2) >= 0 && lami.Get(3) >= 0 && lami.Get(2) + lami.Get(3) <= 1)
-    {
-
-      return 1;
-    }
-
-  return 0;
-}
-
-
-
-
-
-int IntersectTetTriangle (const Point3d ** tet, const Point3d ** tri,
-			  const int * tetpi, const int * tripi)
-{
-  int i, j;
-  double diam = Dist (*tri[0], *tri[1]);
-  double epsrel = 1e-8;
-  double eps = diam * epsrel;
-
-#ifdef MARK
-  MARK (inttettri1);
-#endif
-
-  double eps2 = eps * eps;
-  int loctripi[3], cnt = 0;
-  int loctetpi[4];
-
-  int tetp1 = -1, tetp2 = -1;
-  int trip1 = -1, trip2 = -1;
-  int tetp3, tetp4, trip3;
-
-  /*
-  for (i = 0; i < 4; i++)
-    loctetpi[i] = -1;
-  */
-
-
-  if (!tetpi)
-    {
-      for (i = 0; i <= 2; i++)
-	{
-	  //	  loctripi[i] = -1;
-	  for (j = 0; j <= 3; j++)
-	    {
-	      if (Dist2 (*tet[j], *tri[i]) < eps2)
-		{
-		  //		  loctripi[i] = j;
-		  //		  loctetpi[j] = i;
-		  cnt++;
-		  tetp2 = tetp1;
-		  tetp1 = j;
-		  trip2 = trip1;
-		  trip1 = i;
-		  break;
-		}
-	    }
-	}
-    }
-  else
-    {
-      for (i = 0; i <= 2; i++)
-	{
-	  //	  loctripi[i] = -1;
-	  for (j = 0; j <= 3; j++)
-	    {
-	      if (tetpi[j] == tripi[i])
-		{
-		  //		  loctripi[i] = j;
-		  //		  loctetpi[j] = i;
-		  cnt++;
-		  tetp2 = tetp1;
-		  tetp1 = j;
-		  trip2 = trip1;
-		  trip1 = i;
-		  break;
-		}
-	    }
-	}
-    }  
-  
-  //  (*testout) << "cnt = " << cnt << endl;
-
-#ifdef MARK
-  MARK (inttettri2);
-#endif
-
-
-  //  (*testout) << "tet-trig inters, cnt = " << cnt << endl;
-  
-  // cnt .. number of common points
-  switch (cnt)
-    {
-    case 0:
-      {
-#ifdef MARK
-  MARK (inttettric0);
-#endif
-
-	Vec3d no, n;
-	int inpi[3];
-
-	// check, if some trigpoint is in tet:
-
-	for (j = 0; j < 3; j++)
-	  inpi[j] = 1;
-
-	for (i = 1; i <= 4; i++)
-	  {
-	    int pi1 = i % 4;
-	    int pi2 = (i+1) % 4;
-	    int pi3 = (i+2) % 4;
-	    int pi4 = (i+3) % 4;
-
-	    Vec3d v1 (*tet[pi1], *tet[pi2]);
-	    Vec3d v2 (*tet[pi1], *tet[pi3]);
-	    Vec3d v3 (*tet[pi1], *tet[pi4]);
-	    Cross (v1, v2, n);
-
-	    // n /= n.Length();
-	    double nl = n.Length();
-
-	    if (v3 * n > 0)
-	      n *= -1;
-
-	    int outeri = 1;
-	    for (j = 0; j < 3; j++)
-	      {
-		Vec3d v(*tet[pi1], *tri[j]);
-		if ( v * n < eps * nl)
-		  outeri = 0;
-		else
-		  inpi[j] = 0;
-	      }
-
-	    if (outeri)
-	      return 0;
-	  }
-
-	if (inpi[0] || inpi[1] || inpi[2])
-	  {
-	    return 1;
-	  }
-
-
-	// check, if some tet edge intersects triangle:
-	const Point3d * line[2], *tetf[3];
-	for (i = 0; i <= 2; i++)
-	  for (j = i+1; j <= 3; j++)
-	    {
-	      line[0] = tet[i];
-	      line[1] = tet[j];
-
-	      if (IntersectTriangleLine (tri, &line[0]))
-		return 1;
-	    }
-
-	// check, if triangle line intersects tet face:
-	for (i = 0; i <= 3; i++)
-	  {
-	    for (j = 0; j <= 2; j++)
-	      tetf[j] = tet[(i+j) % 4];
-	    
-	    for (j = 0; j <= 2; j++)
-	      {
-		line[0] = tri[j];
-		line[1] = tri[(j+1) % 3];
-		
-		if (IntersectTriangleLine (&tetf[0], &line[0]))
-		  return 1;
-	      }
-	  }
-
-
-	return 0;
-//GH	break;
-      }
-    case 1:
-      {
-#ifdef MARK
-  MARK (inttettric1);
-#endif
-
-	trip2 = 0;
-	while (trip2 == trip1)
-	  trip2++;
-	trip3 = 3 - trip1 - trip2;
-
-	tetp2 = 0;
-	while (tetp2 == tetp1)
-	  tetp2++;
-	tetp3 = 0;
-	while (tetp3 == tetp1 || tetp3 == tetp2)
-	  tetp3++;
-	tetp4 = 6 - tetp1 - tetp2 - tetp3;
-
-	Vec3d vtri1 = *tri[trip2] - *tri[trip1];
-	Vec3d vtri2 = *tri[trip3] - *tri[trip1];
-	Vec3d ntri;
-	Cross (vtri1, vtri2, ntri);
-
-	// tri durch tet ?
-	// fehlt noch
-
-
-	// test 3 tet-faces:
-	for (i = 1; i <= 3; i++)
-	  {
-	    Vec3d vtet1, vtet2;
-	    switch (i)
-	      {
-	      case 1:
-		{
-		  vtet1 = *tet[tetp2] - *tet[tetp1];
-		  vtet2 = *tet[tetp3] - *tet[tetp1];
-		  break;
-		}
-	      case 2:
-		{
-		  vtet1 = *tet[tetp3] - *tet[tetp1];
-		  vtet2 = *tet[tetp4] - *tet[tetp1];
-		  break;
-		}
-	      case 3:
-		{
-		  vtet1 = *tet[tetp4] - *tet[tetp1];
-		  vtet2 = *tet[tetp2] - *tet[tetp1];
-		  break;
-		}
-	      }
-	    
-	    Vec3d ntet;
-	    Cross (vtet1, vtet2, ntet);
-	    
-	    Vec3d crline = Cross (ntri, ntet);
-
-	    double lcrline = crline.Length();
-
-	    if (lcrline < eps * eps * eps * eps)  // new change !
-	      continue;
-
-	    if (vtri1 * crline + vtri2 * crline < 0)
-	      crline *= -1;
-
-	    crline /= lcrline;
-
-	    double lam1, lam2, lam3, lam4;
-	    LocalCoordinates (vtri1, vtri2, crline, lam1, lam2);
-	    LocalCoordinates (vtet1, vtet2, crline, lam3, lam4);
-	    
-	    if (lam1 > -epsrel && lam2 > -epsrel &&
-		lam3 > -epsrel && lam4 > -epsrel)
-	      {
-		
-		/*
-		(*testout) << "lcrline = " << lcrline 
-			   << " eps = " << eps << " diam = " << diam << endl;
-		 
-		(*testout) << "hit, cnt == 1 " 
-			   << "lam1,2,3,4 = " << lam1 << ", " 
-			   << lam2 << ", " << lam3 << ", " << lam4
-			   << "\n";
-		*/
-		return 1;
-	      }
-	  }
-	return 0;
-//GH	break;
-      }
-    case 2:
-      {
-#ifdef MARK
-  MARK (inttettric2);
-#endif
-
-	// common edge
-	tetp3 = 0;
-	while (tetp3 == tetp1 || tetp3 == tetp2)
-	  tetp3++;
-	tetp4 = 6 - tetp1 - tetp2 - tetp3;
-	trip3 = 3 - trip1 - trip2;
-
-	//	(*testout) << "trip1,2,3 = " << trip1 << ", " << trip2 << ", " << trip3 << endl;
-	//	(*testout) << "tetp1,2,3,4 = " << tetp1 << ", " << tetp2 
-	//		   << ", " << tetp3 << ", " << tetp4 << endl;
-
-	Vec3d vtri = *tri[trip3] - *tri[trip1];
-	Vec3d vtet1 = *tet[tetp3] - *tri[trip1];
-	Vec3d vtet2 = *tet[tetp4] - *tri[trip1];
-
-	Vec3d n = *tri[trip2] - *tri[trip1];
-	n /= n.Length();
-
-	vtet1 -= (n * vtet1) * n;
-	vtet2 -= (n * vtet2) * n;
-
-
-	double lam1, lam2;
-	LocalCoordinates (vtet1, vtet2, vtri, lam1, lam2);
-	
-	if (lam1 < -epsrel || lam2 < -epsrel)
-	  return 0;
-	else
-	  {
-	    /*
-
-	    (*testout) << "vtet1 = " << vtet1 << endl;
-	    (*testout) << "vtet2 = " << vtet2 << endl;
-	    (*testout) << "vtri = " << vtri << endl;
-	    (*testout) << "lam1 = " << lam1 << " lam2 = " << lam2 << endl;
-	    (*testout) << (lam1 * (vtet1 * vtet1) + lam2 * (vtet1 * vtet2))
-		       << " = " << (vtet1 * vtri) << endl;
-	    (*testout) << (lam1 * (vtet1 * vtet2) + lam2 * (vtet2 * vtet2))
-		       << " = " << (vtet2 * vtri) << endl;
-	    
-	    (*testout) << "tet = ";
-	    for (j = 0; j < 4; j++)
-	      (*testout) << (*tet[j]) << " ";
-	    (*testout) << endl;
-	    (*testout) << "tri = ";
-	    for (j = 0; j < 3; j++)
-	      (*testout) << (*tri[j]) << " ";
-	    (*testout) << endl;
-
-	    (*testout) << "hit, cnt == 2" << endl;
-	    */
-	    
-	    return 1;
-	  }
-	  
-	break;
-      }
-    case 3:
-      {
-#ifdef MARK
-  MARK (inttettric3);
-#endif
-
-	// common face
-	return 0;
-      }
-    }
-
-  (*testout) << "hit, cnt = " << cnt << endl;
-  return 1;
-}
-
-
-
-
-
-int IntersectTetTriangleRef (const Point3d ** tri, const int * tripi)
-{
-  int i, j;
-  double eps = 1e-8;
-  double eps2 = eps * eps;
-
-  static Point3d rtetp1(0, 0, 0);
-  static Point3d rtetp2(1, 0, 0);  
-  static Point3d rtetp3(0, 1, 0); 
-  static Point3d rtetp4(0, 0, 1);
-
-  static const Point3d * tet[] = { &rtetp1, &rtetp2, &rtetp3, &rtetp4 };
-  static int tetpi[] = { 1, 2, 3, 4 };
-
-
-  //  return IntersectTetTriangle (tet, tri, tetpi, tripi);
-
-  
-  int cnt = 0;
-
-  int tetp1 = -1, tetp2 = -1;
-  int trip1 = -1, trip2 = -1;
-  int tetp3, tetp4, trip3;
-
-
-  if (!tetpi)
-    {
-      for (i = 0; i <= 2; i++)
-	{
-	  for (j = 0; j <= 3; j++)
-	    {
-	      if (Dist2 (*tet[j], *tri[i]) < eps2)
-		{
-		  cnt++;
-		  tetp2 = tetp1;
-		  tetp1 = j;
-		  trip2 = trip1;
-		  trip1 = i;
-		  break;
-		}
-	    }
-	}
-    }
-  else
-    {
-      for (i = 0; i <= 2; i++)
-	{
-	  for (j = 0; j <= 3; j++)
-	    {
-	      if (tetpi[j] == tripi[i])
-		{
-		  cnt++;
-		  tetp2 = tetp1;
-		  tetp1 = j;
-		  trip2 = trip1;
-		  trip1 = i;
-		  break;
-		}
-	    }
-	}
-    }  
-  
-  //  (*testout) << "cnt = " << cnt << endl;
-
-#ifdef MARK
-  MARK (inttettriref2);
-#endif
-  
-
-  switch (cnt)
-    {
-    case 0:
-      {
-#ifdef MARK
-  MARK (inttettric0ref);
-#endif
-
-	Vec3d no, n;
-	//	int inpi[3];
-	int pside[3][4];
-
-	for (j = 0; j < 3; j++)
-	  {
-	    pside[j][0] = (*tri[j]).X() > -eps;
-	    pside[j][1] = (*tri[j]).Y() > -eps;
-	    pside[j][2] = (*tri[j]).Z() > -eps;
-	    pside[j][3] = (*tri[j]).X() + (*tri[j]).Y() + (*tri[j]).Z() < 1+eps;
-	  }
-
-	
-	for (j = 0; j < 4; j++)
-	  {
-	    if (!pside[0][j] && !pside[1][j] && !pside[2][j])
-	      return 0;
-	  }
-
-	for (j = 0; j < 3; j++)
-	  {
-	    if (pside[j][0] && pside[j][1] && pside[j][2] && pside[j][3])
-	      return 1;
-	  }
-
-
-	const Point3d * line[2], *tetf[3];
-	for (i = 0; i <= 2; i++)
-	  for (j = i+1; j <= 3; j++)
-	    {
-	      line[0] = tet[i];
-	      line[1] = tet[j];
-
-	      if (IntersectTriangleLine (tri, &line[0]))
-		return 1;
-	    }
-
-	for (i = 0; i <= 3; i++)
-	  {
-	    for (j = 0; j <= 2; j++)
-	      tetf[j] = tet[(i+j) % 4];
-	    
-	    for (j = 0; j <= 2; j++)
-	      {
-		line[0] = tri[j];
-		line[1] = tri[(j+1) % 3];
-
-	      if (IntersectTriangleLine (&tetf[0], &line[0]))
-		return 1;
-	      }
-	  }
-
-
-	return 0;
-	break;
-      }
-    case 1:
-      {
-#ifdef MARK
-  MARK (inttettric1ref);
-#endif
-
-	trip2 = 0;
-	if (trip2 == trip1)
-	  trip2++;
-	trip3 = 3 - trip1 - trip2;
-
-	tetp2 = 0;
-	while (tetp2 == tetp1)
-	  tetp2++;
-	tetp3 = 0;
-	while (tetp3 == tetp1 || tetp3 == tetp2)
-	  tetp3++;
-	tetp4 = 6 - tetp1 - tetp2 - tetp3;
-
-	Vec3d vtri1 = *tri[trip2] - *tri[trip1];
-	Vec3d vtri2 = *tri[trip3] - *tri[trip1];
-	Vec3d ntri;
-	Cross (vtri1, vtri2, ntri);
-
-	// tri durch tet ?
-
-	/*
-	Vec3d vtet1(*tet[tetp1], *tet[tetp2]);
-	Vec3d vtet2(*tet[tetp1], *tet[tetp3]);
-	Vec3d vtet3(*tet[tetp1], *tet[tetp4]);
-	Vec3d sol;
-	
-	SolveLinearSystem (vtet1, vtet2, vtet3, vtri1, sol);
-	if (sol.X() > 0 && sol.Y() > 0 && sol.Z() > 0)
-	  return 1;
-
-	SolveLinearSystem (vtet1, vtet2, vtet3, vtri2, sol);
-	if (sol.X() > 0 && sol.Y() > 0 && sol.Z() > 0)
-	  return 1;
-	*/
-
-	// test 3 tet-faces:
-	for (i = 1; i <= 3; i++)
-	  {
-	    Vec3d vtet1, vtet2;
-	    switch (i)
-	      {
-	      case 1:
-		{
-		  vtet1 = *tet[tetp2] - *tet[tetp1];
-		  vtet2 = *tet[tetp3] - *tet[tetp1];
-		  break;
-		}
-	      case 2:
-		{
-		  vtet1 = *tet[tetp3] - *tet[tetp1];
-		  vtet2 = *tet[tetp4] - *tet[tetp1];
-		  break;
-		}
-	      case 3:
-		{
-		  vtet1 = *tet[tetp4] - *tet[tetp1];
-		  vtet2 = *tet[tetp2] - *tet[tetp1];
-		  break;
-		}
-	      }
-	    
-	    Vec3d ntet;
-	    Cross (vtet1, vtet2, ntet);
-	    
-	    Vec3d crline = Cross (ntri, ntet);
-
-	    double lcrline = crline.Length();
-	    if (lcrline < eps * eps)
-	      continue;
-
-
-	    if (vtri1 * crline + vtri2 * crline < 0)
-	      crline *= -1;
-
-	    double lam1, lam2, lam3, lam4;
-	    LocalCoordinates (vtri1, vtri2, crline, lam1, lam2);
-	    LocalCoordinates (vtet1, vtet2, crline, lam3, lam4);
-	    
-	    if (lam1 > -eps && lam2 > -eps &&
-		lam3 > -eps && lam4 > -eps)
-	      {
-		//		(*testout) << "hit, cnt == 1" << "\n";
-		return 1;
-	      }
-	  }
-
-	return 0;
-	break;
-      }
-    case 2:
-      {
-#ifdef MARK
-  MARK (inttettric2ref);
-#endif
-
-	// common edge
-	tetp3 = 0;
-	while (tetp3 == tetp1 || tetp3 == tetp2)
-	  tetp3++;
-	tetp4 = 6 - tetp1 - tetp2 - tetp3;
-	trip3 = 3 - trip1 - trip2;
-
-	//	(*testout) << "trip1,2,3 = " << trip1 << ", " << trip2 << ", " << trip3 << endl;
-	//	(*testout) << "tetp1,2,3,4 = " << tetp1 << ", " << tetp2 
-	//		   << ", " << tetp3 << ", " << tetp4 << endl;
-
-	Vec3d vtri = *tri[trip3] - *tri[trip1];
-	Vec3d vtet1 = *tet[tetp3] - *tri[trip1];
-	Vec3d vtet2 = *tet[tetp4] - *tri[trip1];
-
-	Vec3d n = *tri[trip2] - *tri[trip1];
-	n /= n.Length();
-
-	vtet1 -= (n * vtet1) * n;
-	vtet2 -= (n * vtet2) * n;
-
-
-	double lam1, lam2;
-	LocalCoordinates (vtet1, vtet2, vtri, lam1, lam2);
-	
-	if (lam1 < -eps || lam2 < -eps)
-	  return 0;
-	else
-	  {
-
-// 	    (*testout) << "vtet1 = " << vtet1 << endl;
-// 	    (*testout) << "vtet2 = " << vtet2 << endl;
-// 	    (*testout) << "vtri = " << vtri << endl;
-// 	    (*testout) << "lam1 = " << lam1 << " lam2 = " << lam2 << endl;
-
-// 	    (*testout) << (lam1 * (vtet1 * vtet1) + lam2 * (vtet1 * vtet2))
-// 		       << " = " << (vtet1 * vtri) << endl;
-// 	    (*testout) << (lam1 * (vtet1 * vtet2) + lam2 * (vtet2 * vtet2))
-// 		       << " = " << (vtet2 * vtri) << endl;
-	    
-// 	    (*testout) << "tet = ";
-// 	    for (j = 0; j < 4; j++)
-// 	      (*testout) << (*tet[j]) << " ";
-// 	    (*testout) << endl;
-// 	    (*testout) << "tri = ";
-// 	    for (j = 0; j < 3; j++)
-// 	      (*testout) << (*tri[j]) << " ";
-// 	    (*testout) << endl;
-
-// 	    (*testout) << "hit, cnt == 2" << endl;
-
-	    return 1;
-	  }
-	  
-	break;
-      }
-    case 3:
-      {
-#ifdef MARK
-  MARK (inttettric3ref);
-#endif
-
-	// common face
-	return 0;
-      }
-    }
-
-  (*testout) << "hit, cnt = " << cnt << endl;
-  return 1;
-}
-
-
-
-
-
-
-
-
-
-
-
-int IntersectTriangleTriangle (const Point3d ** tri1, const Point3d ** tri2)
-{
-  int i, j;
-  double diam = Dist (*tri1[0], *tri1[1]);
-  double epsrel = 1e-8;
-  double eps = diam * epsrel;
-  double eps2 = eps * eps;
-
-
-
-  int cnt = 0;
-  /*
-  int tri1pi[3];
-  int tri2pi[3];
-  */
-
-  //  int tri1p1 = -1; 
-  /// int tri1p2 = -1;
-  //  int tri2p1 = -1;
-  //   int tri2p2 = -1;
-  //  int tri1p3, tri2p3;
-
-  /*
-  for (i = 0; i < 3; i++)
-    tri1pi[i] = -1;
-  */
-  for (i = 0; i <= 2; i++)
-    {
-      //      tri2pi[i] = -1;
-      for (j = 0; j <= 2; j++)
-	{
-	  if (Dist2 (*tri1[j], *tri2[i]) < eps2)
-	    {
-	      //	      tri2pi[i] = j;
-	      //	      tri1pi[j] = i;
-	      cnt++;
-	      //	      tri1p2 = tri1p1;
-	      //	      tri1p1 = j;
-	      //	      tri2p2 = tri2p1;
-	      //	      tri2p1 = i;
-	      break;
-	    }
-	}
-    }
-  
-  switch (cnt)
-    {
-    case 0:
-      {
-	const Point3d * line[2];
-	
-	for (i = 0; i <= 2; i++)
-	  {
-	    line[0] = tri2[i];
-	    line[1] = tri2[(i+1)%3];
-
-	    if (IntersectTriangleLine (tri1, &line[0]))
-	      {
-		(*testout) << "int1, line = " << *line[0] << " - " << *line[1] << endl;
-		return 1;
-	      }
-	  }	
-
-	for (i = 0; i <= 2; i++)
-	  {
-	    line[0] = tri1[i];
-	    line[1] = tri1[(i+1)%3];
-
-	    if (IntersectTriangleLine (tri2, &line[0]))
-	      {
-		(*testout) << "int2, line = " << *line[0] << " - " << *line[1] << endl;
-		return 1;
-	      }
-	  }	
-	break;
-      }
-    default:
-      return 0;
-    }
-
-  return 0;
-}
-
-
-
-void
-LocalCoordinates (const Vec3d & e1, const Vec3d & e2,
-		  const Vec3d & v, double & lam1, double & lam2)
-{
-  double m11 = e1 * e1;
-  double m12 = e1 * e2;
-  double m22 = e2 * e2;
-  double rs1 = v * e1;
-  double rs2 = v * e2;
-  
-  double det = m11 * m22 - m12 * m12;
-  lam1 = (rs1 * m22 - rs2 * m12)/det;
-  lam2 = (m11 * rs2 - m12 * rs1)/det;
-}
-
-
-
-
-
-int CalcSphereCenter (const Point3d ** pts, Point3d & c)
-{
-  /*
-  static DenseMatrix a(3), inva(3);
-  static Vector rs(3), sol(3);
-  int i;
-  double h = Dist(*pts[0], *pts[1]);
-
-  for (i = 1; i <= 3; i++)
-    {
-      const Point3d & p1 = *pts[0];
-      const Point3d & p2 = *pts[i];
-      Vec3d v(p1, p2);
-      a.Elem(i,1) = v.X();
-      a.Elem(i,2) = v.Y();
-      a.Elem(i,3) = v.Z();
-
-      rs.Elem(i) = 0.5 * (v * v);
-    }
-
-  if (fabs (a.Det()) <= 1e-12 * h * h * h)
-    {
-      (*testout) << "CalcSphereCenter: degenerated" << endl;
-      return 1;
-    }
-
-  CalcInverse (a, inva);
-  inva.Mult (rs, sol);
-
-  for (i = 1; i <= 3; i++)
-    c.X(i) = pts[0]->X(i) + sol.Elem(i);
-  */
-
-  Vec3d row1 (*pts[0], *pts[1]);
-  Vec3d row2 (*pts[0], *pts[2]);
-  Vec3d row3 (*pts[0], *pts[3]);
-
-  Vec3d rhs(0.5 * (row1*row1),
-	    0.5 * (row2*row2),
-	    0.5 * (row3*row3));
-  Transpose (row1, row2, row3);
-  
-  Vec3d sol;
-  if (SolveLinearSystem (row1, row2, row3, rhs, sol))
-    {
-      (*testout) << "CalcSphereCenter: degenerated" << endl;
-      return 1;
-    }
-
-  c = *pts[0] + sol;
-  return 0;
-}
-
-
-
-
-
-int CalcTriangleCenter (const Point3d ** pts, Point3d & c)
-{
-  static DenseMatrix a(2), inva(2);
-  static Vector rs(2), sol(2);
-  double h = Dist(*pts[0], *pts[1]);
-
-  Vec3d v1(*pts[0], *pts[1]);
-  Vec3d v2(*pts[0], *pts[2]);
-
-  rs.Elem(1) = v1 * v1;
-  rs.Elem(2) = v2 * v2;
-
-  a.Elem(1,1) = 2 * rs.Get(1);
-  a.Elem(1,2) = a.Elem(2,1) = 2 * (v1 * v2);
-  a.Elem(2,2) = 2 * rs.Get(2);
-
-  if (fabs (a.Det()) <= 1e-12 * h * h)
-    {
-      (*testout) << "CalcTriangleCenter: degenerated" << endl;
-      return 1;
-    }
-
-  CalcInverse (a, inva);
-  inva.Mult (rs, sol);
-
-  c = *pts[0];
-  v1 *= sol.Get(1);
-  v2 *= sol.Get(2);
-
-  c += v1;
-  c += v2;
-
-  return 0;
-}
-
-
-
-double ComputeCylinderRadius (const Point3d & p1, 
-			      const Point3d & p2,
-			      const Point3d & p3, 
-			      const Point3d & p4)
-{
-  Vec3d v12(p1, p2);
-  Vec3d v13(p1, p3);
-  Vec3d v14(p1, p4);
-
-  Vec3d n1 = Cross (v12, v13);
-  Vec3d n2 = Cross (v14, v12);
-		
-  double n1l = n1.Length();
-  double n2l = n2.Length();
-  n1 /= n1l;
-  n2 /= n2l;
-
-  double v12len = v12.Length();
-  double h1 = n1l / v12len;
-  double h2 = n2l / v12len;
-  
-  /*
-  (*testout) << "n1 = " << n1 << " n2 = " << n2 
-	     << "h1 = " << h1 << " h2 = " << h2 << endl;
-  */
-  return ComputeCylinderRadius (n1, n2, h1, h2);
-}
-
-
-
-
-/*
-  Two triangles T1 and T2 have normals n1 and n2.
-  The height over the common edge is h1, and h2.
- */
-double ComputeCylinderRadius (const Vec3d & n1, const Vec3d & n2,
-				     double h1, double h2)
-{
-  Vec3d t1, t2;
-  double n11 = n1 * n1;
-  double n12 = n1 * n2;
-  double n22 = n2 * n2;
-  double det = n11 * n22 - n12 * n12;
-  
-  if (fabs (det) < 1e-14 * n11 * n22)
-    return 1e20;
-
-  // a biorthogonal bases   (ti * nj) = delta_ij:
-  t1 = (n22/det) * n1 + (-n12/det) * n2;
-  t2 = (-n12/det) * n1 + (n11/det) * n2;
-
-  // normalize:
-  t1 /= t1.Length();
-  t2 /= t2.Length();
-
-  /*
-    vector to center point has form
-    v = lam1 n1 + lam2 n2
-    and fulfills
-    t2 v = h1/2
-    t1 v = h2/2
-  */
-
-  double lam1 = 0.5 * h2 / (n1 * t1);
-  double lam2 = 0.5 * h1 / (n2 * t2);
-  
-  double rad = (lam1 * n1 + lam2 * n2).Length();
-  /*
-  (*testout) << "n1 = " << n1
-	     << " n2 = " << n2
-	     << " t1 = " << t1
-	     << " t2 = " << t2
-	     << " rad = " << rad << endl;
-  */
-  return rad;
-}
-    
-
-
-
-
-
-double MinDistLP2 (const Point2d & lp1, const Point2d & lp2, const Point2d & p)
-{
-  Vec2d v(lp1, lp2);
-  Vec2d vlp(lp1, p);
-
-  // dist(lam) = \| vlp \|^2 - 2 lam (v1p, v) + lam^2 \| v \|^2
-
-  // lam = (v * vlp) / (v * v);
-  // if (lam < 0) lam = 0;
-  // if (lam > 1) lam = 1;
-
-  double num = v*vlp;
-  double den = v*v;
-
-  if (num <= 0) 
-    return Dist2 (lp1, p);
-
-  if (num >= den) 
-    return Dist2 (lp2, p);
-  
-  if (den > 0)
-    {
-      return vlp.Length2() - num * num /den;
-    }
-  else
-    return vlp.Length2();
-}
-
-
-
-
-double MinDistLP2 (const Point3d & lp1, const Point3d & lp2, const Point3d & p)
-{
-  Vec3d v(lp1, lp2);
-  Vec3d vlp(lp1, p);
-
-  // dist(lam) = \| vlp \|^2 - 2 lam (v1p, v) + lam^2 \| v \|^2
-
-  // lam = (v * vlp) / (v * v);
-  // if (lam < 0) lam = 0;
-  // if (lam > 1) lam = 1;
-
-  double num = v*vlp;
-  double den = v*v;
-
-  if (num <= 0) 
-    return Dist2 (lp1, p);
-
-  if (num >= den) 
-    return Dist2 (lp2, p);
-  
-  if (den > 0)
-    {
-      return vlp.Length2() - num * num /den;
-    }
-  else
-    return vlp.Length2();
-}
-
-
-
-double MinDistTP2 (const Point3d & tp1, const Point3d & tp2, 
-		   const Point3d & tp3, const Point3d & p)
-{
-  double lam1, lam2;
-  double res;
-
-  LocalCoordinates (Vec3d (tp1, tp2), Vec3d (tp1, tp3),
-		    Vec3d (tp1, p), lam1, lam2);
-  int in1 = lam1 >= 0;
-  int in2 = lam2 >= 0;
-  int in3 = lam1+lam2 <= 1;
-  
-  if (in1 && in2 && in3)
-    {
-      Point3d pp = tp1 + lam1 * Vec3d(tp1, tp2) + lam2 *  Vec3d (tp1, tp3);
-      res = Dist2 (p, pp);
-    }
-  else
-    {
-      res = Dist2 (tp1, p);
-      if (!in1)
-	{
-	  double hv = MinDistLP2 (tp1, tp3, p);
-	  if (hv < res) res = hv; 
-	}
-      if (!in2)
-	{
-	  double hv = MinDistLP2 (tp1, tp2, p);
-	  if (hv < res) res = hv; 
-	}
-      if (!in3)
-	{
-	  double hv = MinDistLP2 (tp2, tp3, p);
-	  if (hv < res) res = hv; 
-	}
-      /*
-      double d1 = MinDistLP2 (tp1, tp2, p);
-      double d2 = MinDistLP2 (tp1, tp3, p);
-      double d3 = MinDistLP2 (tp2, tp3, p);
-      res = min3 (d1, d2, d3);
-      */
-    }
-
-  return res;
-
-  Vec3d pp1(tp1, p);
-  Vec3d v1(tp1, tp2), v2(tp1, tp3);
-
-  double c = pp1.Length2();
-  double cx = -2 * (pp1 * v1);
-  double cy = -2 * (pp1 * v2);
-  double cxx = v1.Length2();
-  double cxy = 2 * (v1 * v2);
-  double cyy = v2.Length2();
-
-  QuadraticPolynomial2V pol (-c, -cx, -cy, -cxx, -cxy, -cyy);
-  double res2 =  - pol.MaxUnitTriangle ();
-
-  if (fabs (res - res2) > 1e-8)
-    cout << "res and res2 differ: " << res << " != " << res2 << endl;
-  return res2;
-}
-
-
-// 0 checks !!!
-double MinDistLL2 (const Point3d & l1p1, const Point3d & l1p2,
-		  const Point3d & l2p1, const Point3d & l2p2)
-{
-  // dist(lam1,lam2) = \| l2p1+lam2v2 - (l1p1+lam1 v1) \|
-  // min !
-
-  Vec3d l1l2 (l1p1, l2p1);
-  Vec3d v1 (l1p1, l1p2);
-  Vec3d v2 (l2p1, l2p2);
-
-  double a11, a12, a22, rs1, rs2;
-  double lam1, lam2, det;
-
-  a11 = v1*v1;
-  a12 = -(v1*v2);
-  a22 = v2*v2;
-  rs1 = l1l2 * v1;
-  rs2 = - (l1l2 * v2);
-  
-  det = a11 * a22 - a12 * a12;
-  if (det < 1e-14 * a11 * a22) 
-    det = 1e-14 * a11 * a22;  // regularization should be stable
-
-  if (det < 1e-20)
-    det = 1e-20;
-
-
-  lam1 = (a22 * rs1 - a12 * rs2) / det;
-  lam2 = (-a12 * rs1 + a11 * rs2) / det;
-
-  if (lam1 >= 0 && lam2 >= 0 && lam1 <= 1 && lam2 <= 1)
-    {
-      Vec3d v = l1l2 + (-lam1) * v1 + lam2 * v2;
-      return v.Length2();
-    }
-
-  double minv, hv;
-  minv = MinDistLP2 (l1p1, l1p2, l2p1);
-  hv =  MinDistLP2 (l1p1, l1p2, l2p2);
-  if (hv < minv) minv = hv;
-
-  hv =  MinDistLP2 (l2p1, l2p2, l1p1);
-  if (hv < minv) minv = hv;
-  hv =  MinDistLP2 (l2p1, l2p2, l1p2);
-  if (hv < minv) minv = hv;
-
-  return minv;
-}
-			 
-}
diff --git a/contrib/Netgen/libsrc/gprim/geomtest3d.hpp b/contrib/Netgen/libsrc/gprim/geomtest3d.hpp
deleted file mode 100644
index f801b8cdef9fff866ace968fefdb16fd77429f80..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomtest3d.hpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef FILE_GEOMTEST3D
-#define FILE_GEOMTEST3D
-
-/* *************************************************************************/
-/* File:   geomtest3d.hh                                                   */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   13. Feb. 98                                                     */
-/* *************************************************************************/
-
-
-
-extern int
-IntersectTriangleLine (const Point3d ** tri, const Point3d ** line);
-
-
-
-/**
-  Returns 0, iff
-  closure (tet)  cup  closure (tri)  is empty, one corner point of tet,
-  one edge of tet or one face of tet
- */
-extern int 
-IntersectTetTriangle (const Point3d ** tet, const Point3d ** tri,
-		      const int * tetpi = NULL, const int * tripi = NULL);
-
-/**
-  Same test as above, but tet int reference position (0, ex, ey, ez),
-  tetpi = 1, 2, 4, 5
- */
-extern int 
-IntersectTetTriangleRef (const Point3d ** tri, const int * tripi = NULL);
-
-
-// 1, iff not regular triangulation
-extern int 
-IntersectTriangleTriangle (const Point3d ** tri1, const Point3d ** tri2);
-
-
-extern void
-LocalCoordinates (const Vec3d & e1, const Vec3d & e2,
-		  const Vec3d & v, double & lam1, double & lam2);
-
-/// return 1 = degenerated sphere
-extern int
-CalcSphereCenter (const Point3d ** pts, Point3d & c);
-
-/// return 1 = degenerated triangle
-extern int
-CalcTriangleCenter (const Point3d ** pts, Point3d & c);
-
-
-
-/*
-  Compute radius of cylinder fitting 4 points.
-  cylinder axis is in the direction of p1-p2
-*/
-extern double ComputeCylinderRadius (const Point3d & p1, const Point3d & p2,
-				     const Point3d & p3, const Point3d & p4);
-
-/*
-  Two triangles T1 and T2 have normals n1 and n2.
-  The height over the common edge is h1, and h2.
-  Radius of cylinder fitting both triangles
-*/
-extern double ComputeCylinderRadius (const Vec3d & n1, const Vec3d & n2,
-				     double h1, double h2);
-
-
-extern double MinDistLP2 (const Point2d & lp1, const Point2d & lp2, const Point2d & p);
-
-extern double MinDistLP2 (const Point3d & lp1, const Point3d & lp2, const Point3d & p);
-
-extern double MinDistTP2 (const Point3d & tp1, const Point3d & tp2, 
-			  const Point3d & tp3, const Point3d & p);
-
-extern double MinDistLL2 (const Point3d & l1p1, const Point3d & l1p2,
-			  const Point3d & l2p1, const Point3d & l2p2);
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/gprim.hpp b/contrib/Netgen/libsrc/gprim/gprim.hpp
deleted file mode 100644
index 0f57ebac869366f0bb1eeefe4c65ca93c1ab4526..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/gprim.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef FILE_GPRIM
-#define FILE_GPRIM
-
-/* *************************************************************************/
-/* File:   gprim.hpp                                                        */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   14. Aug. 97                                                     */
-/* *************************************************************************/
-
-
-namespace netgen
-{
-#include "geomobjects.hpp"
-#include "geomops.hpp"
-#include "geomfuncs.hpp"
-
-#include "geom2d.hpp"
-#include "geom3d.hpp"
-#include "geomtest3d.hpp"
-// #include "rot3d.hpp"
-#include "transform3d.hpp"
-// #include "reftrans.hpp"
-#include "adtree.hpp"
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/gprim/testgeom.cpp b/contrib/Netgen/libsrc/gprim/testgeom.cpp
deleted file mode 100644
index 8413f0f2b5f668838547e6de0778f4b0e59b1ef5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/testgeom.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <gprim.hpp>
-
-
-Vec<2> func1 (const Point<2> & a, const Point<2> & b)
-{
-  return a-b;
-}
-
-void func2 (Point<3> & a, Vec<3> & v)
-{
-  a += 3.4 * v;
-}
-
-void func3 (const Mat<2,2> & m, const Vec<2> & vc, Vec<2> & res)
-{
-  res += Trans (m) * vc;
-}
diff --git a/contrib/Netgen/libsrc/gprim/transform3d.cpp b/contrib/Netgen/libsrc/gprim/transform3d.cpp
deleted file mode 100644
index 37c17b220083f6142bf13da2fc26a8399b3f1173..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/transform3d.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <gprim.hpp>
-#include <linalg.hpp>
-
-namespace netgen
-{
-
-Transformation3d :: Transformation3d ()
-{
-  int i, j;
-  for (i = 0; i < 3; i++)
-    {
-      offset[i] = 0;
-      for (j = 0; j < 3; j++)
-	lin[i][j] = 0;
-    }
-}
-
-Transformation3d :: Transformation3d (const Vec3d & translate)
-{
-  int i, j;
-  for (i = 0; i < 3; i++)
-    for (j = 0; j < 3; j++)
-      lin[i][j] = 0;
-  for (i = 0; i < 3; i++)
-    {
-      offset[i] = translate.X(i+1);
-      lin[i][i] = 1;
-    }
-}
-
-void CalcInverse (const DenseMatrix & m1, DenseMatrix & m2);
-
-Transformation3d :: 
-Transformation3d (const Point3d & c, double alpha, 
-		  double beta, double gamma)
-{
-  // total = T_c x Rot_0 x T_c^{-1}
-  // Use Euler angles, see many books from tech mech, e.g. 
-  // Shabana "multibody systems"
-
-  Transformation3d tc(c);
-  Transformation3d tcinv;
-  tc.CalcInverse (tcinv);
-
-  Transformation3d r1, r2, r3, ht, ht2;
-  r1.SetAxisRotation (3, alpha);
-  r2.SetAxisRotation (1, beta);
-  r3.SetAxisRotation (3, gamma);
-
-  ht.Combine (tc, r3);
-  ht2.Combine (ht, r2);
-  ht.Combine (ht2, r1);
-  Combine (ht, tcinv);
-
- cout << "Rotation - Transformation:" << (*this) << endl;
-  //  (*testout) << "Rotation - Transformation:" << (*this) << endl;
-}
-
-
-
-
-Transformation3d :: Transformation3d (const Point3d ** pp)
-{
-  int i, j;
-  for (i = 1; i <= 3; i++)
-    {
-      offset[i-1] = (*pp[0]).X(i);
-      for (j = 1; j <= 3; j++)
-	lin[i-1][j-1] = (*pp[j]).X(i) - (*pp[0]).X(i);
-    }
-}
-
-Transformation3d :: Transformation3d (const Point3d pp[])
-{
-  int i, j;
-  for (i = 1; i <= 3; i++)
-    {
-      offset[i-1] = pp[0].X(i);
-      for (j = 1; j <= 3; j++)
-	lin[i-1][j-1] = pp[j].X(i) - pp[0].X(i);
-    }
-}
-
-
-void Transformation3d :: CalcInverse (Transformation3d & inv) const
-{
-  static DenseMatrix a(3), inva(3);
-  static Vector b(3), sol(3);
-  int i, j;
-  
-  for (i = 1; i <= 3; i++)
-    {
-      b.Elem(i) = offset[i-1];
-      for (j = 1; j <= 3; j++)
-	a.Elem(i, j) = lin[i-1][j-1];
-    }
-
-  ::netgen::CalcInverse (a, inva);
-  inva.Mult (b, sol);
-
-  for (i = 1; i <= 3; i++)
-    {
-      inv.offset[i-1] = -sol.Get(i);
-      for (j = 1; j <= 3; j++)
-	inv.lin[i-1][j-1] = inva.Elem(i, j);
-    }
-}
-
-
-void  Transformation3d:: 
-Combine (const Transformation3d & ta, const Transformation3d & tb)
-{
-  int i, j, k;
-
-  // o = o_a+ m_a o_b
-  // m = m_a m_b
-
-  for (i = 0; i <= 2; i++)
-    {
-      offset[i] = ta.offset[i];
-      for (j = 0; j <= 2; j++)
-	offset[i] += ta.lin[i][j] * tb.offset[j];
-    }
-  
-  for (i = 0; i <= 2; i++)
-    for (j = 0; j <= 2; j++)
-      {
-	lin[i][j] = 0;
-	for (k = 0; k <= 2; k++)
-	  lin[i][j] += ta.lin[i][k] * tb.lin[k][j];
-      }
-}
-void Transformation3d :: SetAxisRotation (int dir, double alpha)
-{
-  double co = cos(alpha);
-  double si = sin(alpha);
-  dir--;
-  int pos1 = (dir+1) % 3;
-  int pos2 = (dir+2) % 3;
-
-  int i, j;
-  for (i = 0; i <= 2; i++)
-    {
-      offset[i] = 0;
-      for (j = 0; j <= 2; j++)
-	lin[i][j] = 0;
-    }
-
-  lin[dir][dir] = 1;
-  lin[pos1][pos1] = co;
-  lin[pos2][pos2] = co;
-  lin[pos1][pos2] = si;
-  lin[pos2][pos1] = -si;
-}
-
-ostream & operator<< (ostream & ost, Transformation3d & trans)
-{
-  int i, j;
-  ost << "offset = ";
-  for (i = 0; i <= 2; i++)
-    ost << trans.offset[i] << " ";
-  ost << endl << "linear = " << endl;
-  for (i = 0; i <= 2; i++)
-    {
-      for (j = 0; j <= 2; j++)
-	ost << trans.lin[i][j] << " ";
-      ost << endl;
-    }
-  return ost;
-}
-}
diff --git a/contrib/Netgen/libsrc/gprim/transform3d.hpp b/contrib/Netgen/libsrc/gprim/transform3d.hpp
deleted file mode 100644
index 7472257297ad1736c7029de7b57a20e6d16c577d..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/transform3d.hpp
+++ /dev/null
@@ -1,174 +0,0 @@
-#ifndef FILE_TRANSFORM3D
-#define FILE_TRANSFORM3D
-
-/* *************************************************************************/
-/* File:   transform3d.hh                                                  */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   22. Mar. 98                                                     */
-/* *************************************************************************/
-
-/*
-  Affine - Linear mapping in 3D space
- */
-
-class Transformation3d;
-ostream & operator<< (ostream & ost, Transformation3d & trans);
-
-class Transformation3d
-{
-  double lin[3][3];
-  double offset[3];
-public:
-  ///
-  Transformation3d ();
-  /// Unit tet is mapped to tet descibed by pp
-  Transformation3d (const Point3d ** pp);
-  /// Unit tet is mapped to tet descibed by pp
-  Transformation3d (const Point3d pp[]);
-  /// translation
-  Transformation3d (const Vec3d & translate);
-  /// rotation with ...
-  Transformation3d (const Point3d & c, double alpha, double beta, double gamma);
-  /// 
-  void CalcInverse (Transformation3d & inv) const;
-  /// this = ta x tb
-  void Combine (const Transformation3d & ta, const Transformation3d & tb);
-  /// dir = 1..3 (== x..z)
-  void SetAxisRotation (int dir, double alpha);
-  ///
-  void Transform (const Point3d & from, Point3d & to) const
-    {
-      for (int i = 1; i <= 3; i++)
-	{
-	  to.X(i) = offset[i-1] + lin[i-1][0] * from.X(1) + 
-	    lin[i-1][1] * from.X(2) + lin[i-1][2] * from.X(3);
-	}
-    }
-  /// transform vector, apply only linear part, not offset
-  void Transform (const Vec3d & from, Vec3d & to) const
-    {
-      for (int i = 1; i <= 3; i++)
-	{
-	  to.X(i) = lin[i-1][0] * from.X(1) + 
-	    lin[i-1][1] * from.X(2) + lin[i-1][2] * from.X(3);
-	}
-    }
-  friend ostream & operator<< (ostream & ost, Transformation3d & trans);
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template <int D>
-class Transformation
-{
-  Mat<D> m;
-  Vec<D> v;
-public:
-  ///
-  Transformation () { m = 0; v = 0; }
-
-  /// Unit tet is mapped to tet descibed by pp
-  Transformation (const Point<D> * pp);
-
-  /// translation
-  Transformation (const Vec<D> & translate)
-  {
-    v = translate;
-    m = 0;
-    for (int i = 0; i < D; i++)
-      m(i,i) = 1;
-  }
-
-  // rotation with ...
-  Transformation (const Point<D> & c, double alpha, double beta, double gamma)
-  {
-    // total = T_c x Rot_0 x T_c^{-1}
-    // Use Euler angles, see many books from tech mech, e.g. 
-    // Shabana "multibody systems"
-    
-    Vec<D> vc(c);
-    Transformation<D> tc(vc);
-    Transformation<D> tcinv(-vc);
-    // tc.CalcInverse (tcinv);
-    
-    Transformation<D> r1, r2, r3, ht, ht2;
-    r1.SetAxisRotation (3, alpha);
-    r2.SetAxisRotation (1, beta);
-    r3.SetAxisRotation (3, gamma);
-    
-    ht.Combine (tc, r3);
-    ht2.Combine (ht, r2);
-    ht.Combine (ht2, r1);
-    Combine (ht, tcinv);
-    
-    // cout << "Rotation - Transformation:" << (*this) << endl;
-    //  (*testout) << "Rotation - Transformation:" << (*this) << endl;
-  }
-
-  /// 
-  void CalcInverse (Transformation & inv) const;
-
-  /// this = ta x tb
-  void Combine (const Transformation & ta, const Transformation & tb)
-  {
-    v = ta.v + ta.m * tb.v;
-    m = ta.m * tb.m;
-  }
-
-
-
-  /// dir = 1..3 (== x..z)
-  void SetAxisRotation (int dir, double alpha)
-  {
-    double co = cos(alpha);
-    double si = sin(alpha);
-    dir--;
-    int pos1 = (dir+1) % 3;
-    int pos2 = (dir+2) % 3;
-    
-    int i, j;
-    for (i = 0; i <= 2; i++)
-    {
-      v(i) = 0;
-      for (j = 0; j <= 2; j++)
-	m(i,j) = 0;
-    }
-    
-    m(dir,dir) = 1;
-    m(pos1, pos1) = co;
-    m(pos2, pos2) = co;
-    m(pos1, pos2) = si;
-    m(pos2, pos1) = -si;
-  }
-
-  ///
-  void Transform (const Point<D> & from, Point<D> & to) const
-  {
-    to = Point<D> (v + m * Vec<D>(from));
-  }
-
-  /// transform vector, apply only linear part, not offset
-  void Transform (const Vec<D> & from, Vec<D> & to) const
-  {
-    to = m * from;
-  }
-};
-
-template <int D>
-ostream & operator<< (ostream & ost, Transformation<D> & trans);
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/include/FlexLexer.h b/contrib/Netgen/libsrc/include/FlexLexer.h
deleted file mode 100644
index e242c836f89fcb674c712e98313d62dce3973653..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/FlexLexer.h
+++ /dev/null
@@ -1,184 +0,0 @@
-// $Header: /cvsroot/gmsh/contrib/Netgen/libsrc/include/FlexLexer.h,v 1.1 2005-09-21 17:29:38 geuzaine Exp $
-
-// FlexLexer.h -- define interfaces for lexical analyzer classes generated
-//		  by flex
-
-// Copyright (c) 1993 The Regents of the University of California.
-// All rights reserved.
-//
-// This code is derived from software contributed to Berkeley by
-// Kent Williams and Tom Epperly.
-//
-// Redistribution and use in source and binary forms are permitted provided
-// that: (1) source distributions retain this entire copyright notice and
-// comment, and (2) distributions including binaries display the following
-// acknowledgement:  ``This product includes software developed by the
-// University of California, Berkeley and its contributors'' in the
-// documentation or other materials provided with the distribution and in
-// all advertising materials mentioning features or use of this software.
-// Neither the name of the University nor the names of its contributors may
-// be used to endorse or promote products derived from this software without
-// specific prior written permission.
-// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
-// This file defines FlexLexer, an abstract class which specifies the
-// external interface provided to flex C++ lexer objects, and yyFlexLexer,
-// which defines a particular lexer class.
-//
-// If you want to create multiple lexer classes, you use the -P flag
-// to rename each yyFlexLexer to some other xxFlexLexer.  You then
-// include <FlexLexer.h> in your other sources once per lexer class:
-//
-//	#undef yyFlexLexer
-//	#define yyFlexLexer xxFlexLexer
-//	#include <FlexLexer.h>
-//
-//	#undef yyFlexLexer
-//	#define yyFlexLexer zzFlexLexer
-//	#include <FlexLexer.h>
-//	...
-
-#ifndef __FLEX_LEXER_H
-// Never included before - need to define base class.
-#define __FLEX_LEXER_H
-
-
-extern "C++" {
-struct yy_buffer_state;
-typedef int yy_state_type;
-
-class FlexLexer {
-public:
-	virtual ~FlexLexer()	{ }
-
-	const char* YYText()	{ return yytext; }
-	int YYLeng()		{ return yyleng; }
-
-	virtual void
-		yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0;
-	virtual struct yy_buffer_state*
-		yy_create_buffer( istream* s, int size ) = 0;
-	virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0;
-	virtual void yyrestart( istream* s ) = 0;
-
-	virtual int yylex() = 0;
-
-	// Call yylex with new input/output sources.
-	int yylex( istream* new_in, ostream* new_out = 0 )
-		{
-		switch_streams( new_in, new_out );
-		return yylex();
-		}
-
-	// Switch to new input/output streams.  A nil stream pointer
-	// indicates "keep the current one".
-	virtual void switch_streams( istream* new_in = 0,
-					ostream* new_out = 0 ) = 0;
-
-	int lineno() const		{ return yylineno; }
-
-	int debug() const		{ return yy_flex_debug; }
-	void set_debug( int flag )	{ yy_flex_debug = flag; }
-
-protected:
-	char* yytext;
-	int yyleng;
-	int yylineno;		// only maintained if you use %option yylineno
-	int yy_flex_debug;	// only has effect with -d or "%option debug"
-};
-
-}
-#endif
-
-#if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce)
-// Either this is the first time through (yyFlexLexerOnce not defined),
-// or this is a repeated include to define a different flavor of
-// yyFlexLexer, as discussed in the flex man page.
-#define yyFlexLexerOnce
-
-class yyFlexLexer : public FlexLexer {
-public:
-	// arg_yyin and arg_yyout default to the cin and cout, but we
-	// only make that assignment when initializing in yylex().
-	yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 );
-
-	virtual ~yyFlexLexer();
-
-	void yy_switch_to_buffer( struct yy_buffer_state* new_buffer );
-	struct yy_buffer_state* yy_create_buffer( istream* s, int size );
-	void yy_delete_buffer( struct yy_buffer_state* b );
-	void yyrestart( istream* s );
-
-	virtual int yylex();
-	virtual void switch_streams( istream* new_in, ostream* new_out );
-
-protected:
-	virtual int LexerInput( char* buf, int max_size );
-	virtual void LexerOutput( const char* buf, int size );
-	virtual void LexerError( const char* msg );
-
-	void yyunput( int c, char* buf_ptr );
-	int yyinput();
-
-	void yy_load_buffer_state();
-	void yy_init_buffer( struct yy_buffer_state* b, istream* s );
-	void yy_flush_buffer( struct yy_buffer_state* b );
-
-	int yy_start_stack_ptr;
-	int yy_start_stack_depth;
-	int* yy_start_stack;
-
-	void yy_push_state( int new_state );
-	void yy_pop_state();
-	int yy_top_state();
-
-	yy_state_type yy_get_previous_state();
-	yy_state_type yy_try_NUL_trans( yy_state_type current_state );
-	int yy_get_next_buffer();
-
-	istream* yyin;	// input source for default LexerInput
-	ostream* yyout;	// output sink for default LexerOutput
-
-	struct yy_buffer_state* yy_current_buffer;
-
-	// yy_hold_char holds the character lost when yytext is formed.
-	char yy_hold_char;
-
-	// Number of characters read into yy_ch_buf.
-	int yy_n_chars;
-
-	// Points to current character in buffer.
-	char* yy_c_buf_p;
-
-	int yy_init;		// whether we need to initialize
-	int yy_start;		// start state number
-
-	// Flag which is used to allow yywrap()'s to do buffer switches
-	// instead of setting up a fresh yyin.  A bit of a hack ...
-	int yy_did_buffer_switch_on_eof;
-
-	// The following are not always needed, but may be depending
-	// on use of certain flex features (like REJECT or yymore()).
-
-	yy_state_type yy_last_accepting_state;
-	char* yy_last_accepting_cpos;
-
-	yy_state_type* yy_state_buf;
-	yy_state_type* yy_state_ptr;
-
-	char* yy_full_match;
-	int* yy_full_state;
-	int yy_full_lp;
-
-	int yy_lp;
-	int yy_looking_for_trail_begin;
-
-	int yy_more_flag;
-	int yy_more_len;
-	int yy_more_offset;
-	int yy_prev_more_offset;
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/include/csg.hpp b/contrib/Netgen/libsrc/include/csg.hpp
deleted file mode 100644
index ffd45ef0bf4fb948a3efd2432eb8e7b6c111900c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/csg.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../csg/csg.hpp"
diff --git a/contrib/Netgen/libsrc/include/geometry2d.hpp b/contrib/Netgen/libsrc/include/geometry2d.hpp
deleted file mode 100644
index bf0965c228fc36935a9c2a539aa8d1ea133ad158..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/geometry2d.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../geom2d/geometry2d.hpp"
diff --git a/contrib/Netgen/libsrc/include/gprim.hpp b/contrib/Netgen/libsrc/include/gprim.hpp
deleted file mode 100644
index 1e827aaf8c01c9b7296876c16309c3462e772ac8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/gprim.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../gprim/gprim.hpp"
diff --git a/contrib/Netgen/libsrc/include/incvis.hpp b/contrib/Netgen/libsrc/include/incvis.hpp
deleted file mode 100644
index a38e9186988cbaedad1c809af15cc7140c7042b1..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/incvis.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// libraries for User interface:
-
-/*
-#include <tcl8.3.h>
-#include <tk8.3.h>
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include "../togl/togl.h"
-
-#include <tix8.1.h>
-*/
-
-
-#include <tcl.h>
-#include <tk.h>
-
-
-#if TK_MAJOR_VERSION==8 && TK_MINOR_VERSION==4
-#define tcl_const const
-#else
-#define tcl_const
-#endif
-
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include "../../togl/togl.h"
-
-
-
-// Just the init-call
-// #include <tix.h>
diff --git a/contrib/Netgen/libsrc/include/linalg.hpp b/contrib/Netgen/libsrc/include/linalg.hpp
deleted file mode 100644
index e96bd036c3ed3606d458b2db3275fb273d27d138..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/linalg.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../linalg/linalg.hpp"
diff --git a/contrib/Netgen/libsrc/include/meshing.hpp b/contrib/Netgen/libsrc/include/meshing.hpp
deleted file mode 100644
index e41a88f9f221c969e56923d95d5dc9c5214b98f3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/meshing.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include <../meshing/meshing.hpp>
diff --git a/contrib/Netgen/libsrc/include/myadt.hpp b/contrib/Netgen/libsrc/include/myadt.hpp
deleted file mode 100644
index d36bef05c12d28b9aa35e9c1de6fcd8df749dcc9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/myadt.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include <../general/myadt.hpp>
diff --git a/contrib/Netgen/libsrc/include/mydefs.hpp b/contrib/Netgen/libsrc/include/mydefs.hpp
deleted file mode 100644
index c34ce56a8e03cd621577d526e57b65ce358346a6..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/mydefs.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef FILE_MYDEFS
-#define FILE_MYDEFS
-
-/**************************************************************************/
-/* File:   mydefs.hh                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   10. Mar. 98                                                    */
-/**************************************************************************/
-
-/*
-  defines for graphics, testmodes, ...
-*/
-
-
-// #define DEBUG
-
-
-#define noDEMOVERSION
-#define noDEVELOP
-#define noSTEP
-#define noSOLIDGEOM
-
-#define noDEMOAPP
-#define noMODELLER
-
-#define noSTAT_STREAM
-#define noLOG_STREAM
-
-#endif
diff --git a/contrib/Netgen/libsrc/include/mystdlib.h b/contrib/Netgen/libsrc/include/mystdlib.h
deleted file mode 100644
index 29ae9f7eb76d622c175174741d6fef6801fba383..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/mystdlib.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef FILE_MYSTDLIB
-#define FILE_MYSTDLIB
-
-
-#include <iostream>
-#include <iomanip>
-#include <fstream>
-#include <sstream>
-
-#ifdef OLDCINCLUDE
-
-// e.g., CC compiler on SGI
-#include <stdlib.h>
-#include <stdio.h>
-#include <math.h>
-#include <malloc.h>
-#include <ctype.h>
-#include <time.h>
-
-#else
- 
-// new standard
-#include <cstdlib>
-#include <cstdio>
-#include <cmath>
-#include <cctype>
-#include <ctime>
-#endif
-
-
-
-#include <new>
-#include <string>
-#include <typeinfo>
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-
-/*** Windows headers ***/
-#ifdef WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <afxwin.h>
-#include <afxmt.h>
-#include <windows.h>
-#undef WIN32_LEAN_AND_MEAN
-#include <winnt.h>
-#endif /* WIN32 */
-
-
-/*
-extern void* operator new(std::size_t) throw (std::bad_alloc);
-extern void* operator new[](std::size_t) throw (std::bad_alloc);
-extern void operator delete(void*) throw();
-extern void operator delete[](void*) throw();
-*/
-
-
-extern int mem_alloc;
-extern int mem_total_alloc;
-extern int mem_max_alloc;
-extern int mem_total_alloc_array;
-extern int mem_total_alloc_table;
-
-
-using namespace std;
-
-#endif
diff --git a/contrib/Netgen/libsrc/include/occgeom.hpp b/contrib/Netgen/libsrc/include/occgeom.hpp
deleted file mode 100644
index af258e0df032193ef448a72102d8c7215ec9d9b0..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/occgeom.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../occ/occgeom.hpp"
diff --git a/contrib/Netgen/libsrc/include/opti.hpp b/contrib/Netgen/libsrc/include/opti.hpp
deleted file mode 100644
index 6b8a0b61c8d1eb081531c9351ab2a7b3ba85fbe8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/opti.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../opti/opti.hpp"
diff --git a/contrib/Netgen/libsrc/include/stepgeom.hpp b/contrib/Netgen/libsrc/include/stepgeom.hpp
deleted file mode 100644
index d2c5c5e41e9683fe5f8537c4fae9337306c1d02a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/stepgeom.hpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "../stepgeom/geomanif.hh"
-#include "../stepgeom/geopac2d.hh"
-#include "../stepgeom/geopac3d.hh"
-#include "../stepgeom/geosplinesurf.hh"
-#include "../stepgeom/algprim.hh"
-#include "../stepgeom/scenery.hh"
-#include "../stepgeom/brep.hh"
-#include "../stepgeom/adtcrit.hh"
-#include "../stepgeom/STEPgeom.hh"
-#include "../stepgeom/visapprox.hh"
diff --git a/contrib/Netgen/libsrc/include/stepreader.hpp b/contrib/Netgen/libsrc/include/stepreader.hpp
deleted file mode 100644
index 0214d58d9dcf3297ee09ef74abd6a03af3e72390..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/stepreader.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../stepgeom/STEPread.hh"
diff --git a/contrib/Netgen/libsrc/include/stlgeom.hpp b/contrib/Netgen/libsrc/include/stlgeom.hpp
deleted file mode 100644
index f1eea264e11281071ae2ae1235bc098ff3352ce6..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/stlgeom.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include <../stlgeom/stlgeom.hpp>
diff --git a/contrib/Netgen/libsrc/include/visual.hpp b/contrib/Netgen/libsrc/include/visual.hpp
deleted file mode 100644
index f026f5a458c6c131b65b0b1d616d42eefae015a5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/visual.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../visualization/visual.hpp"
diff --git a/contrib/Netgen/libsrc/interface/Makefile b/contrib/Netgen/libsrc/interface/Makefile
deleted file mode 100644
index b84b02a8dd90e653d667bd42a50e720266a777a7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-#src = nginterface.cpp writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp writeelmer.cpp  writegmsh.cpp readuser.cpp importsolution.cpp 
-src = nglib.cpp
-#
-lib = nginterface
-libpath = libsrc/interface
-#
-include ../makefile.inc
-#
diff --git a/contrib/Netgen/libsrc/interface/importsolution.cpp b/contrib/Netgen/libsrc/interface/importsolution.cpp
deleted file mode 100644
index 3973d3927e46b79147ac0aa18be8b0a9bc3e20f6..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/importsolution.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-//  Read solution file
-//
-
-
-#include <mystdlib.h>
-
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-#include "nginterface.h"
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-void ImportSolution (const char * filename)
-{
-  ifstream inf (filename);
-  char buf[100], name[1000];
-  int i, j, size, comps, order;
-  bool iscomplex;
-  const char * type;
-  Flags flags;
-
-  while (1)
-    {
-      buf[0] = 0;
-      inf >> buf;
-      if (strcmp (buf, "solution") == 0)
-	{
-	  inf >> name;
-	  
-	  inf >> buf[0];
-	  flags.DeleteFlags ();
-	  while (buf[0] == '-')
-	    {
-	      inf >> buf[1];
-	      inf.putback (buf[1]);
-	      if (!isalpha (buf[1]))
-		{
-		  break;
-		}
-	      inf >> (buf+1);
-	      flags.SetCommandLineFlag (buf);
-	      buf[0] = 0;
-	      inf >> buf[0];
-	    }
-	  inf.putback (buf[0]);
-
-	  (*testout) << "Flags: " << endl;
-	  flags.PrintFlags (*testout);
-	  (*testout) << "done" << endl;
-
-	  size = int(flags.GetNumFlag ("size", Ng_GetNP()));
-	  comps = int(flags.GetNumFlag ("components", 1));
-	  type = flags.GetStringFlag ("type", "nodal");
-	  order = int(flags.GetNumFlag ("order", 1));
-	  iscomplex = flags.GetDefineFlag ("complex");
-
-	  double * sol = new double[size*comps];
-	  
-	  (*testout) << "import solution " << name << " size = " << size << " comps = " << comps << " order = " << order << endl;
-
-	  for (i = 0; i < size*comps; i++)
-	    {
-	      inf >> sol[i];
-	      //	      (*testout) << "sol: " << sol[i] << endl;
-	    }
-	  
-	  Ng_SolutionData soldata;
-	  Ng_InitSolutionData (&soldata);
-	  soldata.name = name;
-	  soldata.data = sol;
-	  soldata.dist = comps;
-	  soldata.components = comps;
-	  soldata.order = order;
-	  soldata.iscomplex = iscomplex;
-	  soldata.soltype = NG_SOLUTION_NODAL;
-	  if (strcmp (type, "element") == 0)
-	    soldata.soltype = NG_SOLUTION_ELEMENT;
-	  if (strcmp (type, "surfaceelement") == 0)
-	    soldata.soltype = NG_SOLUTION_SURFACE_ELEMENT;
-	  if (strcmp (type, "noncontinuous") == 0)
-	    soldata.soltype = NG_SOLUTION_NONCONTINUOUS;
-	  if (strcmp (type, "surfacenoncontinuous") == 0)
-	    soldata.soltype = NG_SOLUTION_SURFACE_NONCONTINUOUS;
-
-	  Ng_SetSolutionData (&soldata);
-	  }
-      else
-	{
-	  //	  cout << "kw = (" << buf << ")" << endl;
-	  (*testout) << "kw = (" << buf << ")" << endl;
-	  break;
-	}
-    }
-  /*
-  struct Ng_SolutionData
-    {
-      char * name;      // name of gridfunction
-      double * data;    // solution values
-      int components;   // used components in solution vector
-      int dist;         // num of doubles per entry (alignment!)
-      Ng_SolutionType soltype;  // type of solution function
-  };
-
-  // initialize solution data with default arguments
-  void Ng_InitSolutionData (Ng_SolutionData * soldata);
-  // set solution data
-  void Ng_SetSolutionData (Ng_SolutionData * soldata);
-  */
-}
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/interface/nginterface.cpp b/contrib/Netgen/libsrc/interface/nginterface.cpp
deleted file mode 100644
index 784be18dc532591192e40621de7fbf1dc36da647..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/nginterface.cpp
+++ /dev/null
@@ -1,1476 +0,0 @@
-#include <mystdlib.h>
-
-
-#include <meshing.hpp>
-#include <csg.hpp>
-#include <geometry2d.hpp>
-#include <stlgeom.hpp>
-
-#ifdef OCCGEOMETRY
-#include <occgeom.hpp>
-#endif
-
-
-#include <visual.hpp>
-
-#include "nginterface.h"
-// #include <FlexLexer.h>
-
-
-// #include <mystdlib.h>
-
-
-namespace netgen
-{
-  extern AutoPtr<Mesh> mesh;
-  extern VisualSceneMesh vsmesh;
-  extern Tcl_Interp * tcl_interp;
-
-  extern AutoPtr<SplineGeometry2d> geometry2d;
-  extern AutoPtr<CSGeometry> geometry;
-  extern STLGeometry * stlgeometry;
-#ifdef OCCGEOMETRY
-  extern OCCGeometry * occgeometry;
-#endif
-
-#ifdef OPENGL
-  extern VisualSceneSolution vssolution;
-#endif
-  extern CSGeometry * ParseCSG (istream & istr);
-}
-
-
-using namespace netgen;
-
-/*
-  extern void * operator new (size_t s);
-  extern void * operator new [] (size_t s);
-  extern void operator delete (void * p);
-  extern void operator delete [] (void * p);
-*/
-
-// extern FlexLexer * lexer;
-
-
-
-void Ng_LoadGeometry (char * filename)
-{
-  ifstream infile (filename);
-
-  geometry.Reset ();
-  geometry2d.Reset ();
-
-#ifdef OCCGEOMETRY
-  delete occgeometry;
-  occgeometry = 0;
-#endif
-
-  if ((strcmp (&filename[strlen(filename)-3], "geo") == 0) ||
-      (strcmp (&filename[strlen(filename)-3], "GEO") == 0) ||
-      (strcmp (&filename[strlen(filename)-3], "Geo") == 0))
-    {
-      geometry.Reset (netgen::ParseCSG (infile));
-
-      if (!geometry)
-	{
-	  geometry.Reset (new CSGeometry ());
-	  throw NgException ("input file not found");
-	}
-
-      geometry -> FindIdenticSurfaces(1e-6);
-
-      double detail = atof (Tcl_GetVar (tcl_interp, "geooptions.detail", 0));
-      double facets = atof (Tcl_GetVar (tcl_interp, "geooptions.facets", 0));
-      Box<3> box (geometry->BoundingBox());
-      
-      if (atoi (Tcl_GetVar (tcl_interp, "geooptions.drawcsg", 0)))
-	geometry->CalcTriangleApproximation(box, detail, facets);
-
-      //      geometry->CalcTriangleApproximation (box, 0.01, 10);
-    }
-
-  else if (strcmp (&filename[strlen(filename)-4], "in2d") == 0)
-    {
-      geometry2d.Reset (new SplineGeometry2d());
-      geometry2d -> Load (filename);
-    }
-
-  else if ((strcmp (&filename[strlen(filename)-3], "stl") == 0) ||
-	   (strcmp (&filename[strlen(filename)-3], "STL") == 0) ||
-	   (strcmp (&filename[strlen(filename)-3], "Stl") == 0))
-    {
-      ifstream infile(filename);
-      stlgeometry = STLGeometry :: Load (infile);
-      stlgeometry->edgesfound = 0;
-      Mesh meshdummy;
-      stlgeometry->Clear();
-      stlgeometry->BuildEdges();
-      stlgeometry->MakeAtlas(meshdummy);
-      stlgeometry->CalcFaceNums();
-      stlgeometry->AddFaceEdges();
-      stlgeometry->LinkEdges();
-    }
-
-#ifdef OCCGEOMETRY
-  else if ((strcmp (&filename[strlen(filename)-4], "iges") == 0) ||
-	   (strcmp (&filename[strlen(filename)-3], "igs") == 0) ||
-	   (strcmp (&filename[strlen(filename)-3], "IGS") == 0) ||
-	   (strcmp (&filename[strlen(filename)-4], "IGES") == 0))
-    {
-      PrintMessage (1, "Load IGES geometry file ", filename);
-      occgeometry = LoadOCC_IGES (filename);
-    }
-  else if ((strcmp (&filename[strlen(filename)-4], "step") == 0) ||
-	   (strcmp (&filename[strlen(filename)-3], "stp") == 0) ||
-	   (strcmp (&filename[strlen(filename)-3], "STP") == 0) ||
-	   (strcmp (&filename[strlen(filename)-4], "STEP") == 0))
-    {
-      PrintMessage (1, "Load STEP geometry file ", filename);
-      occgeometry = LoadOCC_STEP (filename);
-    }
-#endif
-  else
-    {
-      cerr << "Unknown geometry extension!!" << endl;
-    }
-}                          
-
-
-void Ng_LoadMesh (char * filename)
-{
-  mesh.Reset (new Mesh());
-  mesh->Load (filename);
-}
-
-
-
-int Ng_GetDimension ()
-{
-  return mesh->GetDimension();
-}
-
-int Ng_GetNP ()
-{
-  return mesh->GetNP();
-}
-
-int Ng_GetNV ()
-{
-  return mesh->GetNV();
-}
-
-int Ng_GetNE ()
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->GetNE();
-  else
-    return mesh->GetNSE();
-}
-
-int Ng_GetNSE ()
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->GetNSE();
-  else
-    return mesh->GetNSeg();
-}
-
-void Ng_GetPoint (int pi, double * p)
-{
-  const Point3d & hp = mesh->Point (pi);
-  p[0] = hp.X();
-  p[1] = hp.Y();
-  if (mesh->GetDimension() == 3)
-    p[2] = hp.Z();
-}
-
-
-NG_ELEMENT_TYPE Ng_GetElement (int ei, int * epi, int * np)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      int i;
-      const Element & el = mesh->VolumeElement (ei);
-      for (i = 0; i < el.GetNP(); i++)
-	epi[i] = el.PNum(i+1);
-      
-      if (np)
-	*np = el.GetNP();
-
-      if (el.GetType() == PRISM)
-	{
-	  // degenerated prism, (should be obsolete)
-	  const int map1[] = { 3, 2, 5, 6, 1 };
-	  const int map2[] = { 1, 3, 6, 4, 2 };
-	  const int map3[] = { 2, 1, 4, 5, 3 };
-	  
-	  const int * map = NULL;
-	  int deg1 = 0, deg2 = 0, deg3 = 0;
-	  int deg = 0;
-	  if (el.PNum(1) == el.PNum(4)) { map = map1; deg1 = 1; }
-	  if (el.PNum(2) == el.PNum(5)) { map = map2; deg2 = 1; }
-	  if (el.PNum(3) == el.PNum(6)) { map = map3; deg3 = 1; }
-	  
-	  switch (deg1+deg2+deg3)
-	    {
-	      {
-	      case 1:
-		cout << "degenerated prism found, deg = 1" << endl;
-		for (i = 0; i < 5; i++)
-		  epi[i] = el.PNum (map[i]);
-		
-		if (np) *np = 5;
-		return NG_PYRAMID;
-		break;
-	      }
-	    case 2:
-	      {
-		cout << "degenerated prism found, deg = 2" << endl;
-		if (!deg1) epi[3] = el.PNum(4);
-		if (!deg2) epi[3] = el.PNum(5);
-		if (!deg3) epi[3] = el.PNum(6);
-		
-		if (np) *np = 4;
-		return NG_TET;
-		break;
-	      }
-	    default:
-	      ;
-	    }
-	  
-	}
-
-      return NG_ELEMENT_TYPE (el.GetType());
-    }
-  else
-    {
-      int i;
-      const Element2d & el = mesh->SurfaceElement (ei);
-      for (i = 0; i < el.GetNP(); i++)
-	epi[i] = el.PNum(i+1);      
-
-      if (np) *np = el.GetNP();
-      return NG_ELEMENT_TYPE (el.GetType());
-      /*
-      switch (el.GetNP())
-	{
-	case 3: return NG_TRIG; 
-	case 4: return NG_QUAD; 
-	case 6: return NG_TRIG6; 
-	}
-      */
-    }
-
-  // should not occur
-  return NG_TET;
-}
-
-
-NG_ELEMENT_TYPE Ng_GetElementType (int ei)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      return NG_ELEMENT_TYPE (mesh->VolumeElement (ei).GetType());
-    }
-  else
-    {
-      int i;
-      const Element2d & el = mesh->SurfaceElement (ei);
-      switch (el.GetNP())
-	{
-	case 3: return NG_TRIG; 
-	case 4: return NG_QUAD; 
-	case 6: return NG_TRIG6; 
-	}
-    }
-
-  // should not occur
-  return NG_TET;
-}
-
-
-
-int Ng_GetElementIndex (int ei)
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->VolumeElement(ei).GetIndex();
-  else
-    {
-      int ind = mesh->SurfaceElement(ei).GetIndex(); 
-      ind = mesh->GetFaceDescriptor(ind).BCProperty();
-      return ind;
-    }
-}
-
-char * Ng_GetElementMaterial (int ei)
-{
-  static char empty[] = "";
-  if (mesh->GetDimension() == 3)
-    {
-      int ind = mesh->VolumeElement(ei).GetIndex();
-      // cout << "ind = " << ind << endl;
-      const char * mat = mesh->GetMaterial (ind);
-      if (mat)
-	return const_cast<char*> (mat);
-      else 
-	return empty;
-    }
-  return 0;
-}
-
-NG_ELEMENT_TYPE Ng_GetSurfaceElement (int ei, int * epi, int * np)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      const Element2d & el = mesh->SurfaceElement (ei);
-      for (int i = 0; i < el.GetNP(); i++)
-	epi[i] = el[i];
-      
-      if (np) *np = el.GetNP();
-      
-      return NG_ELEMENT_TYPE (el.GetType());
-    }
-  else
-    {
-      const Segment & seg = mesh->LineSegment (ei);
-
-      if (seg.pmid < 0)
-	{
-	  epi[0] = seg.p1;
-	  epi[1] = seg.p2;
-	  
-	  if (np) *np = 2;
-	  return NG_SEGM;
-	}
-      else
-	{
-	  epi[0] = seg.p1;
-	  epi[1] = seg.p2;
-	  epi[2] = seg.pmid;
-
-	  if (np) *np = 3;
-	  return NG_SEGM3;
-	}
-    }
-
-  return NG_TRIG;
-}
-
-int Ng_GetSurfaceElementIndex (int ei)
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->GetFaceDescriptor(mesh->SurfaceElement(ei).GetIndex()).BCProperty();
-  else
-    return mesh->LineSegment(ei).si;
-}
-
-
-void Ng_GetNormalVector (int sei, int locpi, double * nv)
-{
-  nv[0] = 0; 
-  nv[1] = 0;
-  nv[2] = 1;
-
-  (*testout) << "Ng_GetNormalVector (sei = " << sei << ", locpi = " << locpi << ")" << endl;
-  
-  if (mesh->GetDimension() == 3)
-    {
-      Vec<3> n;
-      Point<3> p;
-      p = mesh->Point (mesh->SurfaceElement(sei).PNum(locpi));
-
-      int surfi = mesh->GetFaceDescriptor(mesh->SurfaceElement(sei).GetIndex()).SurfNr();
-
-      (*testout) << "surfi = " << surfi << endl;
-#ifdef OCCGEOMETRY
-      if (occgeometry)
-	{
-	  PointGeomInfo gi = mesh->SurfaceElement(sei).GeomInfoPi(locpi);
-	  occgeometry->GetSurface (surfi).GetNormalVector(p, gi, n);
-	  nv[0] = n(0);
-	  nv[1] = n(1);
-	  nv[2] = n(2);
-	}
-      else
-#endif
-      if (geometry)
-	{
-	  (*testout) << "geometry defined" << endl;
-	  n = geometry->GetSurface (surfi) -> GetNormalVector(p);
-	  (*testout) << "aus is" << endl;
-	  nv[0] = n(0);
-	  nv[1] = n(1);
-	  nv[2] = n(2);
-	}
-    }
-}
-
-
-int Ng_FindElementOfPoint (double * p, double * lami, int build_searchtree, int index)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      Point3d p3d(p[0], p[1], p[2]);
-      int ind = 
-	mesh->GetElementOfPoint(p3d, lami, build_searchtree != 0, index);
-      return ind;
-    }
-  else
-    {
-      double lam3[3];
-      Point3d p2d(p[0], p[1], 0);
-      int ind = 
-	mesh->GetElementOfPoint(p2d, lam3, build_searchtree != 0, index);
-      lami[0] = lam3[0];
-      lami[1] = lam3[1];
-      return ind;
-    }
-}
-
-
-
-void Ng_GetElementTransformation (int ei, const double * xi, 
-				  double * x, double * dxdxi)
-{
-  if (mesh->GetDimension() == 2)
-    {
-      Point<2> xl(xi[0], xi[1]);
-      Point<3> xg;
-      Mat<3,2> dx;
-
-      mesh->GetCurvedElements().CalcSurfaceTransformation (xl, ei-1, xg, dx);
-
-      if (x)
-	{
-	  for (int i = 0; i < 2; i++)
-	    x[i] = xg(i);
-	}
-	  
-      if (dxdxi)
-	{
-	  for (int i=0; i<2; i++)
-	    {
-	      dxdxi[2*i] = dx(i,0);
-	      dxdxi[2*i+1] = dx(i,1);
-	    }
-	}
-    }
-  else
-    {
-      Point<3> xl(xi[0], xi[1], xi[2]);
-  //    (*testout) << "elnr = " << ei << ", eltrans, xl = " << xl << endl;
-      Point<3> xg;
-      Mat<3,3> dx;
-
-      mesh->GetCurvedElements().CalcElementTransformation (xl, ei-1, xg, dx);
-
-      // still 1-based arrays
-      if (x)
-	{
-	  for (int i = 0; i < 3; i++)
-	    x[i] = xg(i);
-	}
-
-      if (dxdxi)
-	{
-	  for (int i=0; i<3; i++)
-	    {
-	      dxdxi[3*i] = dx(i,0);
-	      dxdxi[3*i+1] = dx(i,1);
-              dxdxi[3*i+2] = dx(i,2);
-	    }
-	}
-    }
-}
-
-
-void Ng_GetSurfaceElementTransformation (int sei, const double * xi, 
-					 double * x, double * dxdxi)
-{
-  if (mesh->GetDimension() == 2)
-    {
-      Point<3> xg;
-      Vec<3> dx;
-
-      // still 1-based arrays
-      mesh->GetCurvedElements().CalcSegmentTransformation (xi[0], sei-1, xg, dx);
-
-      if (x)
-        for (int i = 0; i < 2; i++)
-	  x[i] = xg(i);
-	  
-      if (dxdxi)
-        for (int i=0; i<2; i++)
-	  dxdxi[i] = dx(i);
-
-    }
-  else
-    {
-      Point<2> xl(xi[0], xi[1]);
-      Point<3> xg;
-      Mat<3,2> dx;
-      
-      // still 1-based arrays
-      mesh->GetCurvedElements().CalcSurfaceTransformation (xl, sei-1, xg, dx);
-      
-      for (int i=0; i<3; i++)
-	{
-	  if (x)
-	    x[i] = xg(i);
-	  if (dxdxi)
-	    {
-	      dxdxi[2*i] = dx(i,0);
-	      dxdxi[2*i+1] = dx(i,1);
-	    }
-	}
-    }
-}
-
-
-
-void Ng_GetSurfaceElementNeighbouringDomains(const int selnr, int & in, int & out)
-{
-  in = mesh->GetFaceDescriptor((*mesh)[static_cast<SurfaceElementIndex>(selnr)].GetIndex()).DomainIn();
-  out = mesh->GetFaceDescriptor((*mesh)[static_cast<SurfaceElementIndex>(selnr)].GetIndex()).DomainOut();
-}
-
-
-void Ng_SetRefinementFlag (int ei, int flag)
-{
-  if (mesh->GetDimension() == 3)
-    mesh->VolumeElement(ei).SetRefinementFlag (flag != 0);
-  else
-    mesh->SurfaceElement(ei).SetRefinementFlag (flag != 0);
-}
-
-void Ng_SetSurfaceRefinementFlag (int ei, int flag)
-{
-  if (mesh->GetDimension() == 3)
-    mesh->SurfaceElement(ei).SetRefinementFlag (flag != 0);
-}
-
-
-void Ng_Refine (NG_REFINEMENT_TYPE reftype)
-{
-  BisectionOptions biopt;
-  biopt.usemarkedelements = 1;
-  biopt.refine_p = 0;
-  biopt.refine_hp = 0;
-  if (reftype == NG_REFINE_P)
-    biopt.refine_p = 1;
-  if (reftype == NG_REFINE_HP)
-    biopt.refine_hp = 1;
-  Refinement * ref;
-
-  if (geometry2d)
-    ref = new Refinement2d(*geometry2d);
-  else if (stlgeometry)
-    ref = new RefinementSTLGeometry(*stlgeometry);
-#ifdef OCCGEOMETRY
-  else if (occgeometry)
-    ref = new OCCRefinementSurfaces (*occgeometry);
-#endif
-  else if (geometry && mesh->GetDimension() == 3)
-    ref = new RefinementSurfaces(*geometry);
-  else
-    {
-      ref = new Refinement();
-    }
-
-  ref -> Bisect (*mesh, biopt);
-
-  mesh -> UpdateTopology();
-  // mesh -> GetCurvedElements().BuildCurvedElements (ref, mparam.elementorder);
-  delete ref;
-}
-
-void Ng_SecondOrder ()
-{
-  if (stlgeometry)
-    {
-      RefinementSTLGeometry ref (*stlgeometry);
-      ref.MakeSecondOrder (*mesh);
-    }
-
-  else if (geometry2d)
-    {
-      Refinement2d ref (*geometry2d);
-      ref.MakeSecondOrder (*mesh);
-    }
-
-  else if (geometry && mesh->GetDimension() == 3)
-
-    {
-      RefinementSurfaces ref (*geometry);
-      ref.MakeSecondOrder (*mesh);
-    }
-  else
-    {
-      cout << "no geom" << endl;
-      Refinement ref;
-      ref.MakeSecondOrder (*mesh);
-    }
-
-  mesh -> UpdateTopology();
-}
-
-void Ng_HPRefinement (int levels)
-{
-  Refinement * ref;
-
-  if (stlgeometry)
-    ref = new RefinementSTLGeometry (*stlgeometry);
-  else if (geometry2d)
-    ref = new Refinement2d (*geometry2d);
-  else
-    ref = new RefinementSurfaces (*geometry);
-
-
-  HPRefinement (*mesh, ref, levels);
-}
-
-
-void Ng_HighOrder (int order)
-{
-  Refinement * ref;
-
-  if (stlgeometry)
-    ref = new RefinementSTLGeometry (*stlgeometry);
-#ifdef OCCGEOMETRY
-  else if (occgeometry)
-    ref = new OCCRefinementSurfaces (*occgeometry);
-#endif
-  else if (geometry2d)
-    ref = new Refinement2d (*geometry2d);
-  else
-    ref = new RefinementSurfaces (*geometry);
-
-  // cout << "parameter 1: " << argv[1] << " (conversion to int = " << atoi(argv[1]) << ")" << endl;
-
-  mesh -> GetCurvedElements().BuildCurvedElements (ref, order);
-
-  delete ref;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-int Ng_ME_GetNVertices (NG_ELEMENT_TYPE et)
-{
-  switch (et)
-    {
-    case NG_SEGM:
-    case NG_SEGM3:
-      return 2;
-
-    case NG_TRIG:
-    case NG_TRIG6:
-      return 3;
-
-    case NG_QUAD:
-      return 4;
-
-    case NG_TET:
-    case NG_TET10:
-      return 4;
-
-    case NG_PYRAMID:
-      return 5;
-
-    case NG_PRISM:
-    case NG_PRISM12:
-      return 6;
-
-    case NG_HEX:
-      return 8;
-
-    default:
-      cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-int Ng_ME_GetNEdges (NG_ELEMENT_TYPE et)
-{
-  switch (et)
-    {
-    case NG_SEGM:
-    case NG_SEGM3:
-      return 1;
-
-    case NG_TRIG:
-    case NG_TRIG6:
-      return 3;
-
-    case NG_QUAD:
-      return 4;
-
-    case NG_TET:
-    case NG_TET10:
-      return 6;
-
-    case NG_PYRAMID:
-      return 8;
-
-    case NG_PRISM:
-    case NG_PRISM12:
-      return 9;
-
-    case NG_HEX:
-      return 12;
-
-    default:
-      cerr << "Ng_ME_GetNEdges, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-
-int Ng_ME_GetNFaces (NG_ELEMENT_TYPE et)
-{
-  switch (et)
-    {
-    case NG_SEGM:
-    case NG_SEGM3:
-      return 0;
-
-    case NG_TRIG:
-    case NG_TRIG6:
-      return 1;
-
-    case NG_QUAD:
-    case NG_QUAD6:
-      return 1;
-
-    case NG_TET:
-    case NG_TET10:
-      return 4;
-
-    case NG_PYRAMID:
-      return 5;
-
-    case NG_PRISM:
-    case NG_PRISM12:
-      return 5;
-
-    case NG_HEX:
-      return 6;
-
-    default:
-      cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-
-const NG_POINT * Ng_ME_GetVertices (NG_ELEMENT_TYPE et)
-{
-  static double segm_points [][3] = 
-    { { 1, 0, 0 },
-      { 0, 0, 0 } };
-
-  static double trig_points [][3] = 
-    { { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 0 } };
-
-  static double quad_points [][3] = 
-    { { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 1, 1, 0 },
-      { 0, 1, 0 } };
-
-  static double tet_points [][3] = 
-    { { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 },
-      { 0, 0, 0 } };
-
-  static double pyramid_points [][3] =
-    {
-      { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 1, 1, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1-1e-7 },
-    };    
-  
-  static double prism_points[][3] = 
-    {
-      { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 0 },
-      { 1, 0, 1 },
-      { 0, 1, 1 },
-      { 0, 0, 1 }
-    };
-
-  switch (et)
-    {
-    case NG_SEGM:
-    case NG_SEGM3:
-      return segm_points;
-
-    case NG_TRIG:
-    case NG_TRIG6:
-      return trig_points;
-
-    case NG_QUAD:
-    case NG_QUAD6:
-      return quad_points;
-
-    case NG_TET:
-    case NG_TET10:
-      return tet_points;
-
-    case NG_PYRAMID:
-      return pyramid_points;
-
-    case NG_PRISM:
-    case NG_PRISM12:
-      return prism_points;
-
-    case NG_HEX:
-    default:
-      cerr << "Ng_ME_GetVertices, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-
-
-const NG_EDGE * Ng_ME_GetEdges (NG_ELEMENT_TYPE et)
-{
-  static int segm_edges[1][2] =
-    { { 1, 2 }};
-
-  static int trig_edges[3][2] =
-    { { 3, 1 },
-      { 3, 2 },
-      { 1, 2 }};
-
-  static int quad_edges[4][2] =
-    { { 1, 2 },
-      { 4, 3 },
-      { 1, 4 },
-      { 2, 3 }};
-
-
-  static int tet_edges[6][2] =
-    { { 4, 1 },
-      { 4, 2 },
-      { 4, 3 }, 
-      { 1, 2 },
-      { 1, 3 },
-      { 2, 3 }};
-
-  static int prism_edges[9][2] =
-    { { 3, 1 },
-      { 1, 2 },
-      { 3, 2 },
-      { 6, 4 },
-      { 4, 5 },
-      { 6, 5 },
-      { 3, 6 },
-      { 1, 4 },
-      { 2, 5 }};
-
-  static int pyramid_edges[8][2] =
-    { { 1, 2 },
-      { 2, 3 },
-      { 1, 4 },
-      { 4, 3 },
-      { 1, 5 },
-      { 2, 5 },
-      { 3, 5 },
-      { 4, 5 }};
-
-
-
-  switch (et)
-    {
-    case NG_SEGM:
-    case NG_SEGM3:
-      return segm_edges;
-
-    case NG_TRIG:
-    case NG_TRIG6:
-      return trig_edges;
-
-    case NG_QUAD:
-    case NG_QUAD6:
-      return quad_edges;
-
-    case NG_TET:
-    case NG_TET10:
-      return tet_edges;
-
-    case NG_PYRAMID:
-      return pyramid_edges;
-
-    case NG_PRISM:
-    case NG_PRISM12:
-      return prism_edges;
-
-    case NG_HEX:
-    default:
-      cerr << "Ng_ME_GetEdges, illegal element type " << et << endl;
-    }
-  return 0;  
-}
-
-
-const NG_FACE * Ng_ME_GetFaces (NG_ELEMENT_TYPE et)
-{
-  static int tet_faces[4][4] =
-    { { 4, 2, 3, 0 },
-      { 4, 1, 3, 0 },
-      { 4, 1, 2, 0 },
-      { 1, 2, 3, 0 } };
-  
-  static int prism_faces[5][4] =
-    {
-      { 1, 2, 3, 0 },
-      { 4, 5, 6, 0 },
-      { 3, 1, 4, 6 },
-      { 1, 2, 5, 4 },
-      { 2, 3, 6, 5 } 
-    };
-  
-  static int pyramid_faces[5][4] =
-    {
-      { 1, 2, 5, 0 },
-      { 2, 3, 5, 0 },
-      { 3, 4, 5, 0 },
-      { 4, 1, 5, 0 },
-      { 1, 2, 3, 4 } 
-    };
-  
-  static int trig_faces[1][4] = 
-    {
-      { 1, 2, 3, 0 },
-    };
-
-  switch (et)
-    {
-    case NG_TET:
-    case NG_TET10:
-      return tet_faces;
-
-    case NG_PRISM:
-    case NG_PRISM12:
-      return prism_faces;
-
-    case NG_PYRAMID:
-      return pyramid_faces;
-
-
-    case NG_SEGM:
-    case NG_SEGM3:
-
-    case NG_TRIG:
-    case NG_TRIG6:
-      return trig_faces;
-    case NG_QUAD:
-
-
-    case NG_HEX:
-
-    default:
-      cerr << "Ng_ME_GetFaces, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-
-int Ng_GetNEdges()
-{
-  return mesh->GetTopology().GetNEdges();
-}
-int Ng_GetNFaces()
-{
-  return mesh->GetTopology().GetNFaces();
-}
-
-
-
-int Ng_GetElement_Edges (int elnr, int * edges, int * orient)
-{
-  const MeshTopology & topology = mesh->GetTopology();
-  if (mesh->GetDimension() == 3)
-    return topology.GetElementEdges (elnr, edges, orient);
-  else
-    return topology.GetSurfaceElementEdges (elnr, edges, orient);
-}
-
-int Ng_GetElement_Faces (int elnr, int * faces, int * orient)
-{
-  const MeshTopology & topology = mesh->GetTopology();
-  if (mesh->GetDimension() == 3)
-    return topology.GetElementFaces (elnr, faces, orient);
-  else
-    {
-      faces[0] = elnr;
-      if (orient) orient[0] = 0;
-      return 1;
-    }
-}
-
-int Ng_GetSurfaceElement_Edges (int elnr, int * edges, int * orient)
-{
-  const MeshTopology & topology = mesh->GetTopology();
-  if (mesh->GetDimension() == 3)
-    return topology.GetSurfaceElementEdges (elnr, edges, orient);
-  else
-    {
-      if (orient)
-	topology.GetSegmentEdge(elnr, edges[0], orient[0]);
-      else
-	edges[0] = topology.GetSegmentEdge(elnr);
-    }
-  return 1;
-  /*
-    int i, ned;
-    const MeshTopology & topology = mesh->GetTopology();
-    ARRAY<int> ia;
-    topology.GetSurfaceElementEdges (elnr, ia);
-    ned = ia.Size();
-    for (i = 1; i <= ned; i++)
-    edges[i-1] = ia.Get(i);
-
-    if (orient)
-    {
-    topology.GetSurfaceElementEdgeOrientations (elnr, ia);
-    for (i = 1; i <= ned; i++)
-    orient[i-1] = ia.Get(i);
-    }
-    return ned;
-  */
-}
-
-int Ng_GetSurfaceElement_Face (int selnr, int * orient)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      const MeshTopology & topology = mesh->GetTopology();
-      if (orient)
-	*orient = topology.GetSurfaceElementFaceOrientation (selnr);
-      return topology.GetSurfaceElementFace (selnr);
-    }
-  return -1;
-}
-
-int Ng_GetFace_Vertices (int fnr, int * vert)
-{
-  const MeshTopology & topology = mesh->GetTopology();
-  ArrayMem<int,4> ia;
-  topology.GetFaceVertices (fnr, ia);
-  for (int i = 0; i < ia.Size(); i++)
-    vert[i] = ia[i];
-  //  cout << "face verts = " << ia << endl;
-  return ia.Size();
-}
-
-
-int Ng_GetFace_Edges (int fnr, int * edge)
-{
-  const MeshTopology & topology = mesh->GetTopology();
-  ArrayMem<int,4> ia;
-  topology.GetFaceEdges (fnr, ia);
-  for (int i = 0; i < ia.Size(); i++)
-    edge[i] = ia[i];
-  return ia.Size();
-}
-
-void Ng_GetEdge_Vertices (int ednr, int * vert)
-{
-  const MeshTopology & topology = mesh->GetTopology();
-  topology.GetEdgeVertices (ednr, vert[0], vert[1]);
-}
-
-
-int Ng_GetNVertexElements (int vnr)
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->GetTopology().GetVertexElements(vnr).Size();
-  else
-    return mesh->GetTopology().GetVertexSurfaceElements(vnr).Size();
-}
-
-void Ng_GetVertexElements (int vnr, int * els)
-{
-  FlatArray<int> ia(0,0);
-  if (mesh->GetDimension() == 3)
-    ia = mesh->GetTopology().GetVertexElements(vnr);
-  else
-    ia = mesh->GetTopology().GetVertexSurfaceElements(vnr);
-  for (int i = 0; i < ia.Size(); i++)
-    els[i] = ia[i];
-}
-
-
-int Ng_GetElementOrder (int enr)
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->VolumeElement(enr).GetOrder();
-  else
-    return mesh->SurfaceElement(enr).GetOrder();
-}
-
-
-
-int Ng_GetNLevels ()
-{
-  return mesh->mglevels;
-}
-
-
-void Ng_GetParentNodes (int ni, int * parents)
-{
-  if (ni <= mesh->mlbetweennodes.Size())
-    {
-      parents[0] = mesh->mlbetweennodes.Get(ni).I1();
-      parents[1] = mesh->mlbetweennodes.Get(ni).I2();
-    }
-  else
-    parents[0] = parents[1] = 0;
-}
-
-
-int Ng_GetParentElement (int ei)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      if (ei <= mesh->mlparentelement.Size())
-	return mesh->mlparentelement.Get(ei);
-    }
-  else
-    {
-      if (ei <= mesh->mlparentsurfaceelement.Size())
-	return mesh->mlparentsurfaceelement.Get(ei);
-    }
-  return 0;
-}
-
-
-int Ng_GetParentSElement (int ei)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      if (ei <= mesh->mlparentsurfaceelement.Size())
-	return mesh->mlparentsurfaceelement.Get(ei);
-    }
-  else
-    {
-      return 0;
-    }
-  return 0;
-}
-
-
-
-
-
-int Ng_GetClusterRepVertex (int pi)
-{
-  return mesh->GetClusters().GetVertexRepresentant(pi);
-}
-
-int Ng_GetClusterRepEdge (int pi)
-{
-  return mesh->GetClusters().GetEdgeRepresentant(pi);
-}
-
-int Ng_GetClusterRepFace (int pi)
-{
-  return mesh->GetClusters().GetFaceRepresentant(pi);
-}
-
-int Ng_GetClusterRepElement (int pi)
-{
-  return mesh->GetClusters().GetElementRepresentant(pi);
-}
-
-
-
-
-
-
-void Ng_InitSolutionData (Ng_SolutionData * soldata)
-{
-  soldata -> name = NULL;
-  soldata -> data = NULL;
-  soldata -> components = 1;
-  soldata -> dist = 1;
-  soldata -> order = 1;
-  soldata -> iscomplex = 0;
-  soldata -> draw_surface = 1;
-  soldata -> draw_volume = 1;
-  soldata -> soltype = NG_SOLUTION_NODAL;
-  soldata -> solclass = 0;
-}
-
-void Ng_SetSolutionData (Ng_SolutionData * soldata)
-{
-#ifdef OPENGL
-  //   vssolution.ClearSolutionData ();
-  VisualSceneSolution::SolData * vss = new VisualSceneSolution::SolData;
-
-  //  cout << "Add solution " << soldata->name << ", type = " << soldata->soltype << endl;
-
-  vss->name = new char[strlen (soldata->name)+1];
-  strcpy (vss->name, soldata->name);
-
-  vss->data = soldata->data;
-  vss->components = soldata->components;
-  vss->dist = soldata->dist;
-  vss->order = soldata->order;
-  vss->iscomplex = bool(soldata->iscomplex);
-  vss->draw_surface = soldata->draw_surface;
-  vss->draw_volume = soldata->draw_volume;
-  vss->soltype = VisualSceneSolution::SolType (soldata->soltype);
-  vss->solclass = soldata->solclass;
-  vssolution.AddSolutionData (vss);
-#endif
-}
-
-void Ng_ClearSolutionData ()
-{
-  vssolution.ClearSolutionData();
-}
-
-
-
-void Ng_Redraw ()
-{
-#ifdef OPENGL
-  vssolution.UpdateSolutionTimeStamp();
-  Render();
-#endif
-}
-
-
-void Ng_SetVisualizationParameter (const char * name, const char * value)
-{
-#ifdef OPENGL
-  char buf[100];
-  sprintf (buf, "visoptions.%s", name);
-  cout << "name = " << name << ", value = " << value << endl;
-  cout << "set tcl-variable " << buf << " to " << value << endl;
-  Tcl_SetVar (tcl_interp, buf, const_cast<char*> (value), 0);
-  Tcl_Eval (tcl_interp, "Ng_Vis_Set parameters;");
-#endif
-}
-
-
-
-
-int firsttime = 1;
-int animcnt = 0;
-void PlayAnimFile(const char* name, int speed, int maxcnt)
-{
-  //extern Mesh * mesh;
-
-  /*
-  if (mesh.Ptr()) mesh->DeleteMesh();
-  if (!mesh.Ptr()) mesh = new Mesh();
-  */
-  mesh.Reset (new Mesh());
-
-  int ne, np, i, ti;
-
-  char str[80];
-  char str2[80];
-
-  //int tend = 5000;
-  //  for (ti = 1; ti <= tend; ti++)
-  //{
-  int rti = (animcnt%(maxcnt-1)) + 1;
-  animcnt+=speed;
-  
-  sprintf(str2,"%05i.sol",rti);
-  strcpy(str,"mbssol/");
-  strcat(str,name);
-  strcat(str,str2);
-
-  cout << "read file '" << str << "'" << endl;
-  
-  ifstream infile(str);
-  infile >> ne;
-  for (i = 1; i <= ne; i++)
-    {
-      int j;
-      Element2d tri(TRIG);
-      tri.SetIndex(1); //faceind
-      
-      for (j = 1; j <= 3; j++)
-	infile >> tri.PNum(j);
-
-      infile >> np;
-      for (i = 1; i <= np; i++)
-	{
-	  Point3d p;
-	  infile >> p.X() >> p.Y() >> p.Z();
-	  if (firsttime)
-	    mesh->AddPoint (p);
-	  else
-	    mesh->Point(i)=p;
-	}
-
-      //firsttime = 0;
-      Ng_Redraw();
-   }
-}
-
-		
-int Ng_GetNPeriodicVertices ()
-{
-  ARRAY<INDEX_2> apairs;
-  mesh->GetIdentifications().GetPairs (0, apairs);
-  return apairs.Size();
-}
-
-
-// pairs should be an integer array of 2*npairs
-void Ng_GetPeriodicVertices (int * pairs)
-{
-  ARRAY<INDEX_2> apairs;
-  mesh->GetIdentifications().GetPairs (0, apairs);
-  for (int i = 0; i < apairs.Size(); i++)
-    {
-      pairs[2*i] = apairs[i].I1();
-      pairs[2*i+1] = apairs[i].I2();
-    }
-      
-}
-
-
-
-int Ng_GetNPeriodicEdges ()
-{
-  ARRAY<INDEX,PointIndex::BASE> map;
-  const MeshTopology & top = mesh->GetTopology();
-  int nse = mesh->GetNSeg();
-
-  int cnt = 0;
-  //  for (int id = 1; id <= mesh->GetIdentifications().GetMaxNr(); id++)
-    {
-      mesh->GetIdentifications().GetMap(0, map);
-      //(*testout) << "ident-map " << id << ":" << endl << map << endl;
-
-      for (SegmentIndex si = 0; si < nse; si++)
-	{
-	  PointIndex other1 = map[(*mesh)[si].p1];
-	  PointIndex other2 = map[(*mesh)[si].p2];
-	  //  (*testout) << "seg = " << (*mesh)[si] << "; other = " 
-	  //     << other1 << "-" << other2 << endl;
-	  if (other1 && other2 && mesh->IsSegment (other1, other2))
-	    {
-	      cnt++;
-	    }
-	}
-    }
-  return cnt;
-}
-
-void Ng_GetPeriodicEdges (int * pairs)
-{
-  ARRAY<INDEX,PointIndex::BASE> map;
-  const MeshTopology & top = mesh->GetTopology();
-  int nse = mesh->GetNSeg();
-
-  int cnt = 0;
-  //  for (int id = 1; id <= mesh->GetIdentifications().GetMaxNr(); id++)
-    {
-      mesh->GetIdentifications().GetMap(0, map);
-      
-      //(*testout) << "map = " << map << endl;
-
-      for (SegmentIndex si = 0; si < nse; si++)
-	{
-	  PointIndex other1 = map[(*mesh)[si].p1];
-	  PointIndex other2 = map[(*mesh)[si].p2];
-	  if (other1 && other2 && mesh->IsSegment (other1, other2))
-	    {
-	      SegmentIndex otherseg = mesh->SegmentNr (other1, other2);
-	      pairs[cnt++] = top.GetSegmentEdge (si+1);
-	      pairs[cnt++] = top.GetSegmentEdge (otherseg+1);
-	    }
-	}
-    }
-}
-
-
-
-void Ng_PushStatus (const char * str)
-{
-  PushStatus (MyStr (str));
-}
-
-void Ng_PopStatus ()
-{
-  PopStatus ();
-}
-
-void Ng_SetThreadPercentage (double percent)
-{
-  SetThreadPercent (percent);
-}
-
-
-///// Added by Roman Stainko ....
-int Ng_GetVertex_Elements( int vnr, int* elems )
-{
-  const MeshTopology& topology = mesh->GetTopology();
-  ArrayMem<int,4> indexArray;
-  topology.GetVertexElements( vnr, indexArray );
-  
-  for( int i=0; i<indexArray.Size(); i++ )
-    elems[i] = indexArray[i];
-  
-  return indexArray.Size();
-}
-
-///// Added by Roman Stainko ....
-int Ng_GetVertex_SurfaceElements( int vnr, int* elems )
-{
-  const MeshTopology& topology = mesh->GetTopology();
-  ArrayMem<int,4> indexArray;
-  topology.GetVertexSurfaceElements( vnr, indexArray );
-  
-  for( int i=0; i<indexArray.Size(); i++ )
-    elems[i] = indexArray[i];
-  
-  return indexArray.Size();
-}
-
-///// Added by Roman Stainko ....
-int Ng_GetVertex_NElements( int vnr )
-{
-  const MeshTopology& topology = mesh->GetTopology();
-  ArrayMem<int,4> indexArray;
-  topology.GetVertexElements( vnr, indexArray );
-  
-  return indexArray.Size();
-}
-
-///// Added by Roman Stainko ....
-int Ng_GetVertex_NSurfaceElements( int vnr )
-{
-  const MeshTopology& topology = mesh->GetTopology();
-  ArrayMem<int,4> indexArray;
-  topology.GetVertexSurfaceElements( vnr, indexArray );
-
-  return indexArray.Size();
-}
-
-
-
diff --git a/contrib/Netgen/libsrc/interface/nginterface.h b/contrib/Netgen/libsrc/interface/nginterface.h
deleted file mode 100644
index dcb8ddd332a23e85f9f7289b2d90c3ff6c033efa..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/nginterface.h
+++ /dev/null
@@ -1,245 +0,0 @@
-#ifndef NGINTERFACE
-#define NGINTERFACE
-
-/**************************************************************************/
-/* File:   nginterface.hh                                                 */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   20. Nov. 99                                                    */
-/**************************************************************************/
-
-/*
-  
-  Application program interface to Netgen
-  
-
- */
-
-
-// max number of nodes per element
-#define NG_ELEMENT_MAXPOINTS 12
-
-// max number of nodes per surface element
-#define NG_SURFACE_ELEMENT_MAXPOINTS 8
-
-
-
-// implemented element types:
-enum NG_ELEMENT_TYPE { 
-  NG_SEGM = 1, NG_SEGM3 = 2,
-  NG_TRIG = 10, NG_QUAD=11, NG_TRIG6 = 12, NG_QUAD6 = 13,
-  NG_TET = 20, NG_TET10 = 21, 
-  NG_PYRAMID = 22, NG_PRISM = 23, NG_PRISM12 = 24,
-  NG_HEX = 25
-};
-
-typedef double NG_POINT[3];  // coordinates
-typedef int NG_EDGE[2];      // initial point, end point
-typedef int NG_FACE[4];      // points, last one is 0 for trig
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  
-  // load geomtry from file 
-  void Ng_LoadGeometry (char * filename);
-  
-  // load netgen mesh
-  void Ng_LoadMesh (char * filename);
-
-
-  // space dimension (2 or 3)
-  int Ng_GetDimension ();
-
-  // number of mesh points
-  int Ng_GetNP ();
-  
-  // number of mesh vertices (differs from GetNP for 2nd order elements)
-  int Ng_GetNV ();
-  
-  // number of mesh elements
-  int Ng_GetNE ();
-  
-  // number of surface triangles
-  int Ng_GetNSE ();
-  
-  // Get Point coordintes, index from 1 .. np
-  void Ng_GetPoint (int pi, double * p);
-  
-  // Get Element Points
-  NG_ELEMENT_TYPE Ng_GetElement (int ei, int * epi, int * np = 0);
-
-  // Get Element Type
-  NG_ELEMENT_TYPE Ng_GetElementType (int ei);
-
-  // Get sub-domain of element ei
-  int Ng_GetElementIndex (int ei);
-
-  // Get Material of element ei
-  char * Ng_GetElementMaterial (int ei);
-
-  // Get Surface Element Points
-  NG_ELEMENT_TYPE Ng_GetSurfaceElement (int ei, int * epi, int * np = 0);
-
-  // Get Surface Element Index
-  int Ng_GetSurfaceElementIndex (int ei);
-  
-  // Get normal vector of surface element node
-  void Ng_GetNormalVector (int sei, int locpi, double * nv);     
-  
-
-  // Find element of point, returns local coordinates
-  int Ng_FindElementOfPoint (double * p, double * lami,
-			     int build_searchtrees = 0, int index = -1);
-  
-
-  /// Curved Elemens:
-  /// xi..local coordinates
-  /// x ..global coordinates
-  /// dxdxi...D x D Jacobian matrix (row major storage)
-  void Ng_GetElementTransformation (int ei, const double * xi, 
-				    double * x, double * dxdxi);
-
-  /// Curved Elemens:
-  /// xi..local coordinates
-  /// x ..global coordinates
-  /// dxdxi...D x D-1 Jacobian matrix (row major storage)
-  void Ng_GetSurfaceElementTransformation (int sei, const double * xi, double * x, double * dxdxi);
-
-  
-  // Mark element for refinement
-  void Ng_SetRefinementFlag (int ei, int flag);
-  void Ng_SetSurfaceRefinementFlag (int sei, int flag);
-
-  // Do local refinement
-  enum NG_REFINEMENT_TYPE { NG_REFINE_H = 0, NG_REFINE_P = 1, NG_REFINE_HP = 2 };
-  void Ng_Refine (NG_REFINEMENT_TYPE reftype);
-
-  // Use second order elements
-  void Ng_SecondOrder ();
-  void Ng_HighOrder (int order);
-  void Ng_HPRefinement (int levels);
-
-
-  // Topology and coordinate information of master element:
-
-  int Ng_ME_GetNVertices (NG_ELEMENT_TYPE et);
-  int Ng_ME_GetNEdges (NG_ELEMENT_TYPE et);
-  int Ng_ME_GetNFaces (NG_ELEMENT_TYPE et);
-
-  const NG_POINT * Ng_ME_GetVertices (NG_ELEMENT_TYPE et);
-  const NG_EDGE * Ng_ME_GetEdges (NG_ELEMENT_TYPE et);
-  const NG_FACE * Ng_ME_GetFaces (NG_ELEMENT_TYPE et);
-
-  int Ng_GetNEdges();
-  int Ng_GetNFaces();
-
-  
-  int Ng_GetElement_Edges (int elnr, int * edges, int * orient = 0);
-  int Ng_GetElement_Faces (int elnr, int * faces, int * orient = 0);
-
-  int Ng_GetSurfaceElement_Edges (int selnr, int * edges, int * orient = 0);
-  int Ng_GetSurfaceElement_Face (int selnr, int * orient = 0);
-
-  void Ng_GetSurfaceElementNeighbouringDomains(const int selnr, int & in, int & out);
-       
-  int Ng_GetFace_Vertices (int fnr, int * vert);
-  void Ng_GetEdge_Vertices (int ednr, int * vert);
-  int Ng_GetFace_Edges (int fnr, int * edge);
-
-  int Ng_GetNVertexElements (int vnr);
-  void Ng_GetVertexElements (int vnr, int * els);
-
-  int Ng_GetElementOrder (int enr);
-
-  // Multilevel functions:
-
-  // number of levels:
-  int Ng_GetNLevels ();
-  // get two parent nodes of node ni
-  void Ng_GetParentNodes (int ni, int * parents);
-
-  // get parent element (first child has always same number)
-  int Ng_GetParentElement (int ei);
-
-  // get parent surface element (first child has always same number)
-  int Ng_GetParentSElement (int ei);
-
-  // representant of anisotropic cluster
-  int Ng_GetClusterRepVertex (int vi);
-  int Ng_GetClusterRepEdge (int edi);
-  int Ng_GetClusterRepFace (int fai);
-  int Ng_GetClusterRepElement (int eli);
-
-
-  void Ng_SurfaceElementTransformation (int eli, double x, double y, 
-					double * p3d, double * jacobian);
-  
-namespace netgen {
-#include "../visualization/soldata.hpp"
-}
-
-  enum Ng_SolutionType
-  { NG_SOLUTION_NODAL = 1, 
-    NG_SOLUTION_ELEMENT = 2, 
-    NG_SOLUTION_SURFACE_ELEMENT = 3, 
-    NG_SOLUTION_NONCONTINUOUS = 4,
-    NG_SOLUTION_SURFACE_NONCONTINUOUS = 5,
-    NG_SOLUTION_VIRTUAL_FUNCTION = 6,
-    NG_SOLUTION_MARKED_ELEMENTS = 10,
-    NG_SOLUTION_ELEMENT_ORDER = 11
-  };
-  
-  struct Ng_SolutionData
-  {
-    char * name;      // name of gridfunction
-    double * data;    // solution values
-    int components;   // relevant (double) components in solution vector
-    int dist;         // # doubles per entry alignment! 
-    int iscomplex;    // complex vector ? 
-    bool draw_surface;
-    bool draw_volume;
-    int order;        // order of elements, only partially supported 
-    Ng_SolutionType soltype;  // type of solution function
-    netgen::SolutionData * solclass;
-  };
-  
-  // initialize solution data with default arguments
-  void Ng_InitSolutionData (Ng_SolutionData * soldata);
-  // set solution data
-  void Ng_SetSolutionData (Ng_SolutionData * soldata);
-  /// delete gridfunctions
-  void Ng_ClearSolutionData();
-  // redraw 
-  void Ng_Redraw();
-  //
-  void Ng_SetVisualizationParameter (const char * name, 
-				     const char * value);
-
-
-  // number of periodic vertices  
-  int Ng_GetNPeriodicVertices ();
-  // pairs should be an integer array of 2*npairs
-  void Ng_GetPeriodicVertices (int * pairs); 
-
-  // number of periodic edges  
-  int Ng_GetNPeriodicEdges ();
-  // pairs should be an integer array of 2*npairs
-  void Ng_GetPeriodicEdges (int * pairs); 
-
-
-  void Ng_PushStatus (const char * str);
-  void Ng_PopStatus ();
-  void Ng_SetThreadPercentage (double percent);
-  
-  //// added by Roman Stainko ....
-  int Ng_GetVertex_Elements( int vnr, int* elems);
-  int Ng_GetVertex_SurfaceElements( int vnr, int* elems );
-  int Ng_GetVertex_NElements( int vnr );
-  int Ng_GetVertex_NSurfaceElements( int vnr );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/contrib/Netgen/libsrc/interface/nglib.cpp b/contrib/Netgen/libsrc/interface/nglib.cpp
deleted file mode 100644
index e4b1e896473dfdcd9cfb191b3665c4d5535fae93..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/nglib.cpp
+++ /dev/null
@@ -1,571 +0,0 @@
-/**************************************************************************/
-/* File:   nglib.cc                                                       */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   7. May. 2000                                                   */
-/**************************************************************************/
-
-/*
-  
-  Interface to the netgen meshing kernel
-  
-*/
-
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-#include <linalg.hpp>
-#include <csg.hpp>
-//#include <stlgeom.hpp>
-#include <geometry2d.hpp>
-#include <meshing.hpp>
-
-
-
-// #include <FlexLexer.h>
-
-namespace netgen {
-  extern void MeshFromSpline2D (SplineGeometry2d & geometry,
-				Mesh *& mesh, 
-				MeshingParameters & mp);
-}
-
-
-
-
-
-
-
-namespace nglib {
-#include "nglib.h"
-}
-
-using namespace netgen;
-
-// constants and types:
-
-namespace nglib
-{
-// initialize, deconstruct Netgen library:
-void Ng_Init ()
-{
-  mycout = &cout;
-  myerr = &cerr;
-  testout = new ofstream ("test.out");
-}
-
-void Ng_Exit ()
-{
-  ;
-}
-  
-
-
-Ng_Mesh * Ng_NewMesh ()
-{
-  Mesh * mesh = new Mesh;  
-  mesh->AddFaceDescriptor (FaceDescriptor (1, 1, 0, 1));
-  return (Ng_Mesh*)(void*)mesh;
-}
-
-void Ng_DeleteMesh (Ng_Mesh * mesh)
-{
-  delete (Mesh*)mesh;
-}
-
-
-// feeds points, surface elements and volume elements to the mesh
-void Ng_AddPoint (Ng_Mesh * mesh, double * x)
-{
-  Mesh * m = (Mesh*)mesh;
-  m->AddPoint (Point3d (x[0], x[1], x[2]));
-}
-  
-void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et,
-			   int * pi)
-{
-  Mesh * m = (Mesh*)mesh;
-  Element2d el (3);
-  el.SetIndex (1);
-  el.PNum(1) = pi[0];
-  el.PNum(2) = pi[1];
-  el.PNum(3) = pi[2];
-  m->AddSurfaceElement (el);
-}
-
-void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et,
-			  int * pi)
-{
-  Mesh * m = (Mesh*)mesh;
-  Element el (4);
-  el.SetIndex (1);
-  el.PNum(1) = pi[0];
-  el.PNum(2) = pi[1];
-  el.PNum(3) = pi[2];
-  el.PNum(4) = pi[3];
-  m->AddVolumeElement (el);
-}
-
-// ask for number of points, surface and volume elements
-int Ng_GetNP (Ng_Mesh * mesh)
-{
-  return ((Mesh*)mesh) -> GetNP();
-}
-
-int Ng_GetNSE (Ng_Mesh * mesh)
-{
-  return ((Mesh*)mesh) -> GetNSE();
-}
-
-int Ng_GetNE (Ng_Mesh * mesh)
-{
-  return ((Mesh*)mesh) -> GetNE();
-}
-
-
-//  return point coordinates
-void Ng_GetPoint (Ng_Mesh * mesh, int num, double * x)
-{
-  const Point3d & p = ((Mesh*)mesh)->Point(num);
-  x[0] = p.X();
-  x[1] = p.Y();
-  x[2] = p.Z();
-}
-
-// return surface and volume element in pi
-Ng_Surface_Element_Type 
-Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi)
-{
-  const Element2d & el = ((Mesh*)mesh)->SurfaceElement(num);
-  for (int i = 1; i <= el.GetNP(); i++)
-    pi[i-1] = el.PNum(i);
-  Ng_Surface_Element_Type et;
-  switch (el.GetNP())
-    {
-    case 3: et = NG_TRIG; break;
-    case 4: et = NG_QUAD; break;
-    case 6: et = NG_TRIG6; break;
-    }
-  return et;
-}
-
-Ng_Volume_Element_Type
-Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi)
-{
-  const Element & el = ((Mesh*)mesh)->VolumeElement(num);
-  for (int i = 1; i <= el.GetNP(); i++)
-    pi[i-1] = el.PNum(i);
-  Ng_Volume_Element_Type et;
-  switch (el.GetNP())
-    {
-    case 4: et = NG_TET; break;
-    case 5: et = NG_PYRAMID; break;
-    case 6: et = NG_PRISM; break;
-    case 10: et = NG_TET10; break;
-    }
-  return et;
-}
-
-
-
-// generates volume mesh from surface mesh
-Ng_Result Ng_GenerateVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp)
-{
-  Mesh * m = (Mesh*)mesh;
-  
-  
-  MeshingParameters mparam;
-  mparam.maxh = mp->maxh;
-  mparam.meshsizefilename = mp->meshsize_filename;
-
-  m->CalcLocalH();
-
-  MeshVolume (mparam, *m);
-  RemoveIllegalElements (*m);
-  OptimizeVolume (mparam, *m);
-
-  return NG_OK;
-}
-
-
-#if 0 // GMSH
-
-// 2D Meshing Functions:
-
-void Ng_AddPoint_2D (Ng_Mesh * mesh, double * x)
-{
-  Mesh * m = (Mesh*)mesh;
-  
-  m->AddPoint (Point3d (x[0], x[1], 0));
-}
-
-void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2)
-{
-  Mesh * m = (Mesh*)mesh;
-
-  Segment seg;
-  seg.p1 = pi1;
-  seg.p2 = pi2;
-  m->AddSegment (seg);
-}
-  
-
-int Ng_GetNP_2D (Ng_Mesh * mesh)
-{
-  Mesh * m = (Mesh*)mesh;
-  return m->GetNP();
-}
-
-int Ng_GetNE_2D (Ng_Mesh * mesh)
-{
-  Mesh * m = (Mesh*)mesh;
-  return m->GetNSE();
-}
-
-int Ng_GetNSeg_2D (Ng_Mesh * mesh)
-{
-  Mesh * m = (Mesh*)mesh;
-  return m->GetNSeg();
-}
-  
-void Ng_GetPoint_2D (Ng_Mesh * mesh, int num, double * x)
-{
-  Mesh * m = (Mesh*)mesh;
-
-  Point3d & p = m->Point(num);
-  x[0] = p.X();
-  x[1] = p.Y();
-}
-
-void Ng_GetElement_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum)
-{
-  const Element2d & el = ((Mesh*)mesh)->SurfaceElement(num);
-  for (int i = 1; i <= 3; i++)
-    pi[i-1] = el.PNum(i);
-  if (matnum)
-    *matnum = el.GetIndex();
-}
-
-
-void Ng_GetSegment_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum)
-{
-  const Segment & seg = ((Mesh*)mesh)->LineSegment(num);
-  pi[0] = seg.p1;
-  pi[1] = seg.p2;
-
-  if (matnum)
-    *matnum = seg.edgenr;
-}
-
-
-
-
-Ng_Geometry_2D * Ng_LoadGeometry_2D (const char * filename)
-{
-  SplineGeometry2d * geom = new SplineGeometry2d();
-  geom -> Load (filename);
-  return (Ng_Geometry_2D *)geom;
-}
-
-Ng_Result Ng_GenerateMesh_2D (Ng_Geometry_2D * geom,
-			      Ng_Mesh ** mesh,
-			      Ng_Meshing_Parameters * mp)
-{
-  // use global variable mparam
-  //  MeshingParameters mparam;  
-  mparam.maxh = mp->maxh;
-  mparam.meshsizefilename = mp->meshsize_filename;
-  mparam.quad = mp->quad_dominated;
-
-  Mesh * m;
-  MeshFromSpline2D (*(SplineGeometry2d*)geom, m, mparam);
-  
-  cout << m->GetNSE() << " elements, " << m->GetNP() << " points" << endl;
-  
-  *mesh = (Ng_Mesh*)m;
-  return NG_OK;
-}
-
-
-
-void Ng_HP_Refinement (Ng_Geometry_2D * geom,
-		       Ng_Mesh * mesh,
-		       int levels)
-{
-  Refinement2d ref(*(SplineGeometry2d*)geom);
-  HPRefinement (*(Mesh*)mesh, &ref, levels);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-ARRAY<STLReadTriangle> readtrias; //only before initstlgeometry
-ARRAY<Point<3> > readedges; //only before init stlgeometry
- 
-void Ng_SaveMesh(Ng_Mesh * mesh, const char* filename)
-{
-  ((Mesh*)mesh)->Save(filename);
-}
-
-Ng_Mesh * Ng_LoadMesh(const char* filename)
-{
-  Mesh * mesh = new Mesh;
-  mesh->Load(filename);
-  return ( (Ng_Mesh*)mesh );
-}
-
-// loads geometry from STL file
-Ng_STL_Geometry * Ng_STL_LoadGeometry (const char * filename, int binary)
-{
-  int i;
-  STLGeometry geom;
-  STLGeometry* geo;
-  ifstream ist(filename);
-
-  if (binary)
-    {
-      geo = geom.LoadBinary(ist);
-    }
-  else
-    {
-      geo = geom.Load(ist);
-    }
-
-  readtrias.SetSize(0);
-  readedges.SetSize(0);
-
-  Point3d p;
-  Vec3d normal;
-  double p1[3];
-  double p2[3];
-  double p3[3];
-  double n[3];
-
-  Ng_STL_Geometry * geo2 = Ng_STL_NewGeometry();
-
-  for (i = 1; i <= geo->GetNT(); i++)
-    {
-      const STLTriangle& t = geo->GetTriangle(i);
-      p = geo->GetPoint(t.PNum(1));
-      p1[0] = p.X(); p1[1] = p.Y(); p1[2] = p.Z(); 
-      p = geo->GetPoint(t.PNum(2));
-      p2[0] = p.X(); p2[1] = p.Y(); p2[2] = p.Z(); 
-      p = geo->GetPoint(t.PNum(3));
-      p3[0] = p.X(); p3[1] = p.Y(); p3[2] = p.Z();
-      normal = t.Normal();
-      n[0] = normal.X(); n[1] = normal.Y(); n[2] = normal.Z();
-      
-      Ng_STL_AddTriangle(geo2, p1, p2, p3, n);
-    }
-
-  return geo2;
-}
-
-// generate new STL Geometry
-Ng_STL_Geometry * Ng_STL_NewGeometry ()
-{
-  return (Ng_STL_Geometry*)(void*)new STLGeometry;
-} 
-
-// after adding triangles (and edges) initialize
-Ng_Result Ng_STL_InitSTLGeometry (Ng_STL_Geometry * geom)
-{
-  STLGeometry* geo = (STLGeometry*)geom;
-  geo->InitSTLGeometry(readtrias);
-  readtrias.SetSize(0);
-
-  if (readedges.Size() != 0)
-    {
-      int i;
-      /*
-      for (i = 1; i <= readedges.Size(); i+=2)
-	{
-	  cout << "e(" << readedges.Get(i) << "," << readedges.Get(i+1) << ")" << endl;
-	}
-      */
-      geo->AddEdges(readedges);
-    }
-
-  if (geo->GetStatus() == STLTopology::STL_GOOD || geo->GetStatus() == STLTopology::STL_WARNING) return NG_OK;
-  return NG_SURFACE_INPUT_ERROR;
-}
-
-  // automatically generates edges:
-Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom,
-		       Ng_Mesh* mesh,
-		       Ng_Meshing_Parameters * mp)
-{
-  STLGeometry* stlgeometry = (STLGeometry*)geom;
-  Mesh* me = (Mesh*)mesh;
-  
-  MeshingParameters mparam;
-
-  mparam.maxh = mp->maxh;
-  mparam.meshsizefilename = mp->meshsize_filename;
-
-  me -> SetGlobalH (mparam.maxh);
-  me -> SetLocalH (stlgeometry->GetBoundingBox().PMin() - Vec3d(10, 10, 10),
-		   stlgeometry->GetBoundingBox().PMax() + Vec3d(10, 10, 10),
-		   0.3);
-
-  me -> LoadLocalMeshSize (mp->meshsize_filename);
-  /*
-  if (mp->meshsize_filename)
-    {
-      ifstream infile (mp->meshsize_filename);
-      if (!infile.good()) return NG_FILE_NOT_FOUND;
-      me -> LoadLocalMeshSize (infile);
-    }
-  */
-
-  STLMeshing (*stlgeometry, *me);
-  
-  stlgeometry->edgesfound = 1;
-  stlgeometry->surfacemeshed = 0;
-  stlgeometry->surfaceoptimized = 0;
-  stlgeometry->volumemeshed = 0;
-  
-  return NG_OK;
-}
-
-  
-// generates mesh, empty mesh be already created.
-Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom,
-				      Ng_Mesh* mesh,
-				      Ng_Meshing_Parameters * mp)
-{
-  STLGeometry* stlgeometry = (STLGeometry*)geom;
-  Mesh* me = (Mesh*)mesh;
-
-  MeshingParameters mparam;
-
-  mparam.maxh = mp->maxh;
-  mparam.meshsizefilename = mp->meshsize_filename;
-
-  /*
-  me -> SetGlobalH (mparam.maxh);
-  me -> SetLocalH (stlgeometry->GetBoundingBox().PMin() - Vec3d(10, 10, 10),
-		   stlgeometry->GetBoundingBox().PMax() + Vec3d(10, 10, 10),
-		   0.3);
-  */
-  /*
-  STLMeshing (*stlgeometry, *me);
-  
-  stlgeometry->edgesfound = 1;
-  stlgeometry->surfacemeshed = 0;
-  stlgeometry->surfaceoptimized = 0;
-  stlgeometry->volumemeshed = 0;
-  */  
-  int retval = STLSurfaceMeshing (*stlgeometry, *me);
-  if (retval == MESHING3_OK)
-    {
-      (*mycout) << "Success !!!!" << endl;
-      stlgeometry->surfacemeshed = 1;
-      stlgeometry->surfaceoptimized = 0;
-      stlgeometry->volumemeshed = 0;
-    } 
-  else if (retval == MESHING3_OUTERSTEPSEXCEEDED)
-    {
-      (*mycout) << "ERROR: Give up because of too many trials. Meshing aborted!" << endl;
-    }
-  else if (retval == MESHING3_TERMINATE)
-    {
-      (*mycout) << "Meshing Stopped!" << endl;
-    }
-  else
-    {
-      (*mycout) << "ERROR: Surface meshing not successful. Meshing aborted!" << endl;
-    }
-
-
-  STLSurfaceOptimization (*stlgeometry, *me, mparam);
-
-  return NG_OK;
-}
-
-
-  // fills STL Geometry
-  // positive orientation
-  // normal vector may be null-pointer
-void Ng_STL_AddTriangle (Ng_STL_Geometry * geom, 
-			 double * p1, double * p2, double * p3, double * nv)
-{
-  Point<3> apts[3];
-  apts[0] = Point<3>(p1[0],p1[1],p1[2]);
-  apts[1] = Point<3>(p2[0],p2[1],p2[2]);
-  apts[2] = Point<3>(p3[0],p3[1],p3[2]);
-
-  Vec<3> n;
-  if (!nv)
-    n = Cross (apts[0]-apts[1], apts[0]-apts[2]);
-  else
-    n = Vec<3>(nv[0],nv[1],nv[2]);
-
-  readtrias.Append(STLReadTriangle(apts,n));
-}
-
-  // add (optional) edges:
-void Ng_STL_AddEdge (Ng_STL_Geometry * geom, 
-		     double * p1, double * p2)
-{
-  readedges.Append(Point3d(p1[0],p1[1],p1[2]));
-  readedges.Append(Point3d(p2[0],p2[1],p2[2]));
-}
-
-#endif
-
-Ng_Meshing_Parameters :: Ng_Meshing_Parameters()
-{
-  maxh = 1000;
-  fineness = 0.5;
-  secondorder = 0;
-  meshsize_filename = 0;
-  quad_dominated = 0;
-}
-
-
-}
-
-
-// compatibility functions:
-
-namespace netgen 
-{
-
-  char geomfilename[255];
-
-void MyError (const char * ch)
-{
-  cerr << ch;
-}
-
-//Destination for messages, errors, ...
-void Ng_PrintDest(const char * s)
-{
-  (*mycout) << s << flush;
-}
-
-double GetTime ()
-{
-  return 0;
-}
-
-void ResetTime ()
-{
-  ;
-}
-
-void MyBeep (int i)
-{
-  ;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/interface/nglib.h b/contrib/Netgen/libsrc/interface/nglib.h
deleted file mode 100644
index 20d745d4705f52f7c19a127229cd800accfeabe8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/nglib.h
+++ /dev/null
@@ -1,208 +0,0 @@
-#ifndef NGLIB
-#define NGLIB
-
-/**************************************************************************/
-/* File:   nglib.hh                                                       */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   7. May. 2000                                                   */
-/**************************************************************************/
-
-/*
-  
-  Interface to the netgen meshing kernel
-  
-*/
-
-/// Data type for NETGEN mesh
-typedef void * Ng_Mesh;
-
-/// Data type for NETGEN CSG geomty
-typedef void * Ng_CSG_Geometry;
-
-/// Data type for NETGEN 2D geomty
-typedef void * Ng_Geometry_2D;
-
-/// Data type for NETGEN STL geomty
-typedef void * Ng_STL_Geometry;
-
-
-
-// max number of nodes per element
-#define NG_VOLUME_ELEMENT_MAXPOINTS 10
-
-// implemented element types:
-enum Ng_Volume_Element_Type { NG_TET = 1, NG_PYRAMID = 2, NG_PRISM = 3,
-				 NG_TET10 = 4 };
-
-// max number of nodes per surface element
-#define NG_SURFACE_ELEMENT_MAXPOINTS 6
-
-// implemented element types:
-enum Ng_Surface_Element_Type { NG_TRIG = 1, NG_QUAD = 2, 
-			       NG_TRIG6 = 3 };
-
-
-
-class Ng_Meshing_Parameters 
-{
- public:
-
-  double maxh;
-  double fineness;   // 0 .. coarse, 1 .. fine
-  int secondorder;
-  char * meshsize_filename;
-  int quad_dominated;
-
-  Ng_Meshing_Parameters();
-};
-
-
-enum Ng_Result { NG_OK = 0, 
-		 NG_SURFACE_INPUT_ERROR = 1,
-		 NG_VOLUME_FAILURE = 2, 
-		 NG_STL_INPUT_ERROR = 3,
-		 NG_SURFACE_FAILURE = 4,
-		 NG_FILE_NOT_FOUND = 5 };
-
-
-
-
-
-// #ifdef __cplusplus
-// extern "C" 
-// {
-// #endif
-  
-  // initialize, deconstruct Netgen library:
-  void Ng_Init ();
-  void Ng_Exit ();
-  
-
-  // Generates new mesh structure
-  Ng_Mesh * Ng_NewMesh ();
-  void Ng_DeleteMesh (Ng_Mesh * mesh);
-  
-  // feeds points, surface elements and volume elements to the mesh
-  void Ng_AddPoint (Ng_Mesh * mesh, double * x);
-  void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et,
-			     int * pi);
-  void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et,
-			    int * pi);
-  
-  // ask for number of points, surface and volume elements
-  int Ng_GetNP (Ng_Mesh * mesh);
-  int Ng_GetNSE (Ng_Mesh * mesh);
-  int Ng_GetNE (Ng_Mesh * mesh);
-
-  
-  //  return point coordinates
-  void Ng_GetPoint (Ng_Mesh * mesh, int num, double * x);
-
-  // return surface and volume element in pi
-  Ng_Surface_Element_Type 
-  Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi);
-
-  Ng_Volume_Element_Type
-  Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi);
-
-
-  // Defines MeshSize Functions
-  void Ng_RestrictMeshSizeGlobal (Ng_Mesh * mesh, double h);
-  void Ng_RestrictMeshSizePoint (Ng_Mesh * mesh, double * p, double h);
-  void Ng_RestrictMeshSizeBox (Ng_Mesh * mesh, double * pmin, double * pmax, double h);
-  
-  // generates volume mesh from surface mesh
-  Ng_Result Ng_GenerateVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp);
-
-  void Ng_SaveMesh(Ng_Mesh * mesh, const char* filename);
-  Ng_Mesh * Ng_LoadMesh(const char* filename);
-
-
-
-
-
-  // **********************************************************
-  // **   2D Meshing                                         **
-  // **********************************************************
-
-
-  // feeds points and boundary to mesh
-
-  void Ng_AddPoint_2D (Ng_Mesh * mesh, double * x);
-  void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2);
-  
-  // ask for number of points, elements and boundary segments
-  int Ng_GetNP_2D (Ng_Mesh * mesh);
-  int Ng_GetNE_2D (Ng_Mesh * mesh);
-  int Ng_GetNSeg_2D (Ng_Mesh * mesh);
-  
-  //  return point coordinates
-  void Ng_GetPoint_2D (Ng_Mesh * mesh, int num, double * x);
-
-  // return 2d triangles
-  void Ng_GetElement_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = NULL);
-
-  // return 2d boundary segment
-  void Ng_GetSegment_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = NULL);
-
-
-  // load 2d netgen spline geometry
-  Ng_Geometry_2D * Ng_LoadGeometry_2D (const char * filename);
-
-  // generate 2d mesh, mesh is allocated by function
-  Ng_Result Ng_GenerateMesh_2D (Ng_Geometry_2D * geom,
-				Ng_Mesh ** mesh,
-				Ng_Meshing_Parameters * mp);
-  
-  void Ng_HP_Refinement (Ng_Geometry_2D * geom,
-			 Ng_Mesh * mesh,
-			 int levels);
-  
-
-
-
-
-  // **********************************************************
-  // **   STL Meshing                                        **
-  // **********************************************************
-
-
-  // loads geometry from STL file
-  Ng_STL_Geometry * Ng_STL_LoadGeometry (const char * filename, int binary = 0);
-
-
-  // generate new STL Geometry
-  Ng_STL_Geometry * Ng_STL_NewGeometry ();
-  
-
-  // fills STL Geometry
-  // positive orientation
-  // normal vector may be null-pointer
-  void Ng_STL_AddTriangle (Ng_STL_Geometry * geom, 
-			   double * p1, double * p2, double * p3, 
-			   double * nv = NULL);
-
-  // add (optional) edges :
-  void Ng_STL_AddEdge (Ng_STL_Geometry * geom, 
-		       double * p1, double * p2);
-
-  // after adding triangles (and edges) initialize
-  Ng_Result Ng_STL_InitSTLGeometry (Ng_STL_Geometry * geom);
-
-  // automatically generates edges:
-  Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom,
-			      Ng_Mesh* mesh,
-			      Ng_Meshing_Parameters * mp);
-
-  
-  // generates mesh, empty mesh must be already created.
-  Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom,
-					Ng_Mesh * mesh,
-					Ng_Meshing_Parameters * mp);
-
-// #ifdef __cplusplus
-//  }
-// #endif
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/interface/printdest.cpp b/contrib/Netgen/libsrc/interface/printdest.cpp
deleted file mode 100644
index 0db654d94f7f8f26d3314564c00b80431c585e56..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/printdest.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-namespace netgen
-{
-  //Destination for messages, errors, ...
-  void Ng_PrintDest(const char * s)
-  {
-    (*mycout) << s << flush;
-  }
-}
diff --git a/contrib/Netgen/libsrc/interface/readuser.cpp b/contrib/Netgen/libsrc/interface/readuser.cpp
deleted file mode 100644
index f7d4d1eae876b959ffcab7c920415d24d2b90bda..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/readuser.cpp
+++ /dev/null
@@ -1,394 +0,0 @@
-//
-//  Read user dependent output file
-//
-
-
-#include <mystdlib.h>
-
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-void ReadFile (Mesh & mesh,
-	       const string & hfilename)
-{
-  cout << "Read User File" << endl;
-
-  const char * filename = hfilename.c_str();
-
-  int i, j;
-
-  char reco[100];
-  int np, nbe;
-
-
-
-  // ".surf" - mesh
-  
-  if ( (strlen (filename) > 5) &&
-       strcmp (&filename[strlen (filename)-5], ".surf") == 0 )
-    
-    {
-      cout << "Surface file" << endl;
-      
-      ifstream in (filename);
-      
-      in >> reco;
-      in >> np;
-      for (i = 1; i <= np; i++)
-	{
-	  Point3d p;
-	  in >> p.X() >> p.Y() >> p.Z();
-	  mesh.AddPoint (p);
-	}
-      
-      
-      in >> nbe;
-      //      int invert = globflags.GetDefineFlag ("invertsurfacemesh");
-      for (i = 1; i <= nbe; i++)
-	{
-	  Element2d el;
-	  int hi;
-	  
-	  el.SetIndex(1);
-	  
-	  for (j = 1; j <= 3; j++)
-	    {
-	      in >> el.PNum(j);
-	      if (el.PNum(j) < PointIndex(1) || 
-		  el.PNum(j) > PointIndex(np))
-		{
-		  cerr << "Point Number " << el.PNum(j) << " out of range 1..."
-		       << np << endl;
-		  return;
-		}
-	    }
-	  
-	  /*
-	    if (invert)
-	    swap (el.PNum(2), el.PNum(3));
-	  */
-	  
-	  mesh.AddSurfaceElement (el);
-	}
-      
-      mesh.ClearFaceDescriptors();
-      mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-      
-      cout << "points: " << np << " faces: " << nbe << endl;
-    }
-  
-  
-  
-
-  
-  // Universal mesh (AVL)
-  if ( (strlen (filename) > 4) &&
-       strcmp (&filename[strlen (filename)-4], ".unv") == 0 )
-    {  
-      int i, j, k;
-      
-      double h;
-      char reco[100];
-      int np, nbe;
-      int invert;
-      
-      
-      ifstream in(filename);
-
-      invert = 0;    // globflags.GetDefineFlag ("invertsurfacemesh");
-      double scale = 1;  // globflags.GetNumFlag ("scale", 1);
-
-
-      while (in.good())
-	{
-	  in >> reco;
-	  if (strcmp (reco, "NODES") == 0)
-	    {
-	      cout << "nodes found" << endl;
-	      for (j = 1; j <= 4; j++)
-		in >> reco;  // read dummy
-
-	      while (1)
-		{
-		  int pi, hi;
-		  double x, y, z;
-		  Point3d p;
-
-		  in >> pi;
-		  if (pi == -1)
-		    break;
-
-		  in >> hi >> hi >> hi;
-		  in >> p.X() >> p.Y() >> p.Z();
-
-		  p.X() *= scale;
-		  p.Y() *= scale;
-		  p.Z() *= scale;
-
-
-		  mesh.AddPoint (p);
-		}
-	    }
-
-	  if (strcmp (reco, "ELEMENTS") == 0)
-	    {
-	      cout << "elements found" << endl;
-	      for (j = 1; j <= 4; j++)
-		in >> reco;  // read dummy
-
-	      while (1)
-		{
-		  int hi;
-		  in >> hi;
-		  if (hi == -1) break;
-		  for (j = 1; j <= 7; j++)
-		    in >> hi;
-	      
-		  Element2d el;
-		  el.SetIndex(1);
-		  in >> el.PNum(1) >> el.PNum(2) >> el.PNum(3);
-	      
-		  if (invert)
-		    swap (el.PNum(2), el.PNum(3));
-		  mesh.AddSurfaceElement (el);	  
-	      
-		  for (j = 1; j <= 5; j++)
-		    in >> hi;
-		}
-	    }
-	}
-      
-      mesh.ClearFaceDescriptors();
-      mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-
-      Point3d pmin, pmax;
-      mesh.GetBox (pmin, pmax);
-      cout << "bounding-box = " << pmin << "-" << pmax << endl;
-    }
-
-
-
-  // fepp format2d:
-  
-  if ( (strlen (filename) > 7) &&
-       strcmp (&filename[strlen (filename)-7], ".mesh2d") == 0 )
-    {
-      cout << "Reading FEPP2D Mesh" << endl;
-      
-      char buf[100];
-      int np, ne, nseg, i, j;
-
-      ifstream in (filename);
-
-      in >> buf;
-
-      in >> nseg;
-      for (i = 1; i <= nseg; i++)
-	{
-	  int bound, p1, p2;
-	  in >> bound >> p1 >> p2;
-	  // forget them
-	}
-
-      in >> ne;
-      for (i = 1; i <= ne; i++)
-	{
-	  int mat, nelp;
-	  in >> mat >> nelp;
-	  Element2d el (nelp == 3 ? TRIG : QUAD);
-	  el.SetIndex (mat);
-	  for (j = 1; j <= nelp; j++)
-	    in >> el.PNum(j);
-	  mesh.AddSurfaceElement (el);
-	}
-
-      in >> np;
-      for (i = 1; i <= np; i++)
-	{
-	  Point3d p(0,0,0);
-	  in >> p.X() >> p.Y();
-	  mesh.AddPoint (p);
-	}
-    }
-
-  
-  else if ( (strlen (filename) > 5) &&
-	    strcmp (&filename[strlen (filename)-5], ".mesh") == 0 )
-    {
-      cout << "Reading Neutral Format" << endl;
-      
-      int np, ne, nse, i, j;
-
-      ifstream in (filename);
-
-      in >> np;
-
-      if (in.good())
-	{
-	  // file starts with an integer
-
-	  for (i = 1; i <= np; i++)
-	    {
-	      Point3d p(0,0,0);
-	      in >> p.X() >> p.Y() >> p.Z();
-	      mesh.AddPoint (p);
-	    }
-	  
-	  in >> ne;
-	  for (i = 1; i <= ne; i++)
-	    {
-	      int mat;
-	      in >> mat;
-	      Element el (4);
-	      el.SetIndex (mat);
-	      for (j = 1; j <= 4; j++)
-		in >> el.PNum(j);
-	      mesh.AddVolumeElement (el);
-	    }
-	  
-	  in >> nse;
-	  for (i = 1; i <= nse; i++)
-	    {
-	      int mat, nelp;
-	      in >> mat;
-	      Element2d el (TRIG);
-	      el.SetIndex (mat);
-	      for (j = 1; j <= 3; j++)
-		in >> el.PNum(j);
-	      mesh.AddSurfaceElement (el);
-	    }
-	}
-      else
-	{
-	  char buf[100];
-	  in.clear();
-	  do
-	    {
-	      in >> buf;
-	      cout << "buf = " << buf << endl;
-	      if (strcmp (buf, "points") == 0)
-		{
-		  in >> np;
-		  cout << "np = " << np << endl;
-		}
-	    }
-	  while (in.good());
-	}
-    }
-
-
-  if ( (strlen (filename) > 4) &&
-       strcmp (&filename[strlen (filename)-4], ".emt") == 0 )
-    {
-      ifstream inemt (filename);
-      
-      string pktfile = filename;
-      int len = strlen (filename);
-      pktfile[len-3] = 'p';
-      pktfile[len-2] = 'k';
-      pktfile[len-1] = 't';
-      cout << "pktfile = " << pktfile << endl;
-
-      int np, nse, i;
-      int num, bcprop;
-      ifstream inpkt (pktfile.c_str());
-      inpkt >> np;
-      ARRAY<double> values(np);
-      for (i = 1; i <= np; i++)
-	{
-	  Point3d p(0,0,0);
-	  inpkt >> p.X() >> p.Y() >> p.Z()
-		>> bcprop >> values.Elem(i);
-	  mesh.AddPoint (p);
-	}      
-
-      mesh.ClearFaceDescriptors();
-      mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-      mesh.GetFaceDescriptor(1).SetBCProperty (1);
-      mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-      mesh.GetFaceDescriptor(2).SetBCProperty (2);
-      mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-      mesh.GetFaceDescriptor(3).SetBCProperty (3);
-      mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-      mesh.GetFaceDescriptor(4).SetBCProperty (4);
-      mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-      mesh.GetFaceDescriptor(5).SetBCProperty (5);
-
-      int p1, p2, p3;
-      double value;
-      inemt >> nse;
-      for (i = 1; i <= nse; i++)
-	{
-	  inemt >> p1 >> p2 >> p3 >> bcprop >> value;
-
-	  if (bcprop < 1 || bcprop > 4)
-	    cerr << "bcprop out of range, bcprop = " << bcprop << endl;
-	  p1++;
-	  p2++;
-	  p3++;
-	  if (p1 < 1 || p1 > np || p2 < 1 || p2 > np || p3 < 1 || p3 > np)
-	    {
-	      cout << "p1 = " << p1 << " p2 = " << p2 << " p3 = " << p3 << endl;
-	    }
-
-	  if (i > 110354) Swap (p2, p3);
-	  if (mesh.Point(p1).X() < 0.25)
-	    Swap (p2,p3);
-
-	  Element2d el(TRIG);
-
-	  if (bcprop == 1)
-	    {
-	      if (values.Get(p1) < -69999)
-		el.SetIndex(1);
-	      else
-		el.SetIndex(2);
-	    }
-	  else
-	    el.SetIndex(3);
-
-
-	  el.PNum(1) = p1;
-	  el.PNum(2) = p2;
-	  el.PNum(3) = p3;
-	  mesh.AddSurfaceElement (el);
-	}
-
-
-      ifstream incyl ("ngusers/guenter/cylinder.surf");
-      int npcyl, nsecyl; 
-      incyl >> npcyl;
-      cout << "npcyl = " << npcyl << endl;
-      for (i = 1; i <= npcyl; i++)
-	{
-	  Point3d p(0,0,0);
-	  incyl >> p.X() >> p.Y() >> p.Z();
-	  mesh.AddPoint (p);
-	}
-      incyl >> nsecyl;
-      cout << "nsecyl = " << nsecyl << endl;
-      for (i = 1; i <= nsecyl; i++)
-	{
-	  incyl >> p1 >> p2 >> p3;
-	  p1 += np;
-	  p2 += np;
-	  p3 += np;
-	  Element2d el(TRIG);
-	  el.SetIndex(5);
-	  el.PNum(1) = p1;
-	  el.PNum(2) = p2;
-	  el.PNum(3) = p3;
-	  mesh.AddSurfaceElement (el);
-	}
-    }
-
-}
-
-}
diff --git a/contrib/Netgen/libsrc/interface/writeabaqus.cpp b/contrib/Netgen/libsrc/interface/writeabaqus.cpp
deleted file mode 100644
index e9308b14728a58ad55dd09db5512743d7f172a60..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writeabaqus.cpp
+++ /dev/null
@@ -1,237 +0,0 @@
-//
-//  Write Abaqus file
-//
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-
-
-void WriteAbaqusFormat (const Mesh & mesh,
-			const string & filename)
-
-{
-      
-  cout << "\nWrite Abaqus Volume Mesh" << endl;
-
-  ofstream outfile (filename.c_str());
-
-  outfile << "*Heading" << endl;
-  outfile << " " << filename << endl;
-
-  outfile.precision(8);
-
-  outfile << "*Node" << endl;
-
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int i, j, k;
-
-  for (i = 1; i <= np; i++)
-    {
-      outfile << i << ", ";
-      outfile << mesh.Point(i).X() << ", ";
-      outfile << mesh.Point(i).Y() << ", ";
-      outfile << mesh.Point(i).Z() << "\n";
-    }
-
-  int elemcnt = 0; //element counter
-  int finished = 0;
-  int indcnt = 1; //index counter
-
-  while (!finished)
-    {
-      int actcnt = 0;
-      const Element & el1 = mesh.VolumeElement(1);
-      int non = el1.GetNP();
-      if (non == 4)
-	{
-	  outfile << "*Element, type=C3D4, ELSET=PART" << indcnt << endl;
-	} 
-      else if (non == 10)
-	{
-	  outfile << "*Element, type=C3D10, ELSET=PART" << indcnt << endl;
-	} 
-      else
-	{
-	  cout << "unsupported Element type!!!" << endl;	  
-	}
-
-      for (i = 1; i <= ne; i++)
-	{
-	  const Element & el = mesh.VolumeElement(i);
-	      
-	  if (el.GetIndex() == indcnt)
-	    {
-	      actcnt++;
-	      if (el.GetNP() != non) 
-		{
-		  cout << "different element-types in a subdomain are not possible!!!" << endl;
-		  continue;
-		}
-		  
-	      elemcnt++;
-	      outfile << elemcnt << ", ";
-	      if (non == 4)
-		{
-		  outfile << el.PNum(1) << ", ";
-		  outfile << el.PNum(2) << ", ";
-		  outfile << el.PNum(4) << ", ";
-		  outfile << el.PNum(3) << "\n";
-		}
-	      else if (non == 10)
-		{
-		  outfile << el.PNum(1) << ", ";
-		  outfile << el.PNum(2) << ", ";
-		  outfile << el.PNum(4) << ", ";
-		  outfile << el.PNum(3) << ", ";
-		  outfile << el.PNum(5) << ", ";
-		  outfile << el.PNum(9) << ", ";
-		  outfile << el.PNum(7) << ", " << "\n";
-		  outfile << el.PNum(6) << ", ";
-		  outfile << el.PNum(8) << ", ";
-		  outfile << el.PNum(10) << "\n";
-		}
-	      else
-		{
-		  cout << "unsupported Element type!!!" << endl;
-		  for (j = 1; j <= el.GetNP(); j++)
-		    {
-		      outfile << el.PNum(j);
-		      if (j != el.GetNP()) outfile << ", ";
-		    }
-		  outfile << "\n";
-		}
-	    }
-	}	  
-      indcnt++;
-      if (elemcnt == ne) {finished = 1; cout << "all elements found by Index!" << endl;}
-      if (actcnt == 0) {finished = 1;}
-    }
-
-  if (mesh.GetIdentifications().GetMaxNr())
-    {
-      // periodic identification, implementation for
-      // Helmut J. Boehm, TU Vienna
-	  
-      char cfilename[255];
-      strcpy (cfilename, filename.c_str());
-
-      char mpcfilename[255];
-      strcpy (mpcfilename, cfilename);
-      int len = strlen (cfilename);
-      if (len >= 4 && (strcmp (mpcfilename+len-4, ".inp") == 0))
-	strcpy (mpcfilename+len-4, ".mpc");
-      else
-	strcat (mpcfilename, ".mpc");
-	  
-      ofstream mpc (mpcfilename);
-
-      int masternode;
-
-      ARRAY<INDEX_2> pairs;
-      BitArray master(np), help(np);
-      master.Set();
-      for (i = 1; i <= 3; i++)
-	{
-	  mesh.GetIdentifications().GetPairs (i, pairs);
-	  help.Clear();
-	  for (j = 1; j <= pairs.Size(); j++)
-	    {
-	      help.Set (pairs.Get(j).I1());
-	    }
-	  master.And (help);
-	}
-      for (i = 1; i <= np; i++)
-	if (master.Test(i))
-	  masternode = i;
-
-      cout << "masternode = " << masternode << " = "
-	   << mesh.Point(masternode) << endl;
-      ARRAY<int> slaves(3);
-      for (i = 1; i <= 3; i++)
-	{
-	  mesh.GetIdentifications().GetPairs (i, pairs);
-	  for (j = 1; j <= pairs.Size(); j++)
-	    {
-	      if (pairs.Get(j).I1() == masternode)
-		slaves.Elem(i) = pairs.Get(j).I2();
-	    }
-	  cout << "slave(" << i << ") = " << slaves.Get(i)
-	       << " = " << mesh.Point(slaves.Get(i)) << endl;
-	}
-	  
-	  
-      outfile << "**\n"
-	      << "*NSET,NSET=CTENODS\n"
-	      << slaves.Get(1) << ", " 
-	      << slaves.Get(2) << ", " 
-	      << slaves.Get(3) << endl;
-
-	  
-      outfile << "**\n"
-	      << "**POINT_fixed\n"
-	      << "**\n"
-	      << "*BOUNDARY, OP=NEW\n";
-      for (j = 1; j <= 3; j++)
-	outfile << masternode << ", " << j << ",,    0.\n";
-
-      outfile << "**\n"
-	      << "*BOUNDARY, OP=NEW\n";
-      for (j = 1; j <= 3; j++)
-	{
-	  Vec3d v(mesh.Point(masternode), mesh.Point(slaves.Get(j)));
-	  double vlen = v.Length();
-	  int dir = 0;
-	  if (fabs (v.X()) > 0.9 * vlen) dir = 2;
-	  if (fabs (v.Y()) > 0.9 * vlen) dir = 3;
-	  if (fabs (v.Z()) > 0.9 * vlen) dir = 1;
-	  if (!dir)
-	    cout << "ERROR: Problem with rigid body constraints" << endl;
-	  outfile << slaves.Get(j) << ", " << dir << ",,    0.\n";
-	}
-
-      outfile << "**\n"
-	      << "*EQUATION, INPUT=" << mpcfilename << endl;
-	  
-
-      BitArray eliminated(np);
-      eliminated.Clear();
-      for (i = 1; i <= mesh.GetIdentifications().GetMaxNr(); i++)
-	{
-	  mesh.GetIdentifications().GetPairs (i, pairs);
-	  if (!pairs.Size())
-	    continue;
-	      
-	  for (j = 1; j <= pairs.Size(); j++)
-	    if (pairs.Get(j).I1() != masternode && 
-		!eliminated.Test(pairs.Get(j).I2()))
-	      {
-		eliminated.Set (pairs.Get(j).I2());
-		for (k = 1; k <= 3; k++)
-		  {
-		    mpc << "4" << "\n";
-		    mpc << pairs.Get(j).I2() << "," << k << ", -1.0, ";
-		    mpc << pairs.Get(j).I1() << "," << k << ", 1.0, ";
-		    mpc << slaves.Get(i) << "," << k << ", 1.0, ";
-		    mpc << masternode << "," << k << ", -1.0 \n";
-		  }
-	      }
-	}
-    }
-
-
-  cout << "done" << endl;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/interface/writediffpack.cpp b/contrib/Netgen/libsrc/interface/writediffpack.cpp
deleted file mode 100644
index 25f9b2986f31b7872f1a7706e4681f221d68b82c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writediffpack.cpp
+++ /dev/null
@@ -1,296 +0,0 @@
-//
-//  Write diffpack file
-//
-//  by
-//  Bartosz Sawicki <sawickib@ee.pw.edu.pl>
-//  extended by
-//  Jacques Lechelle <jacques.lechelle@wanadoo.fr>
-//
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-void WriteDiffPackFormat (const Mesh & mesh,
-			  const CSGeometry & geom,
-			  const string & filename)
-{
-  //   double scale = globflags.GetNumFlag ("scale", 1);
-  double scale = 1;
-
-  ofstream outfile(filename.c_str());
-
-  if (mesh.GetDimension() == 3)
-
-    {
-      // Output compatible to Diffpack grid format
-      // Bartosz Sawicki <sawickib@ee.pw.edu.pl>
-
-      int np = mesh.GetNP();
-      int ne = mesh.GetNE();
-      int nse = mesh.GetNSE();
-      ARRAY <int> BIname;
-      ARRAY <int> BCsinpoint;
-      int i, j, k, l;
-
-
-      outfile.precision(6);
-      outfile.setf (ios::fixed, ios::floatfield);
-      outfile.setf (ios::showpoint);
-
-      const Element & eldummy = mesh.VolumeElement((int)1);
-      outfile << "\n\n"
-	"Finite element mesh (GridFE):\n\n"
-	"  Number of space dim. =   3\n"
-	"  Number of elements   =  " << ne << "\n"
-	"  Number of nodes      =  " << np << "\n\n"
-	"  All elements are of the same type : dpTRUE\n"
-	"  Max number of nodes in an element: "<< eldummy.GetNP() << "\n"
-	"  Only one subdomain               : dpFALSE\n"
-	"  Lattice data                     ? 0\n\n\n\n";
-      
-      for (i = 1; i <= nse; i++) 
-	{
-	  int BI=mesh.GetFaceDescriptor(mesh.SurfaceElement(i).GetIndex()).BCProperty();
-	  int nbi=BIname.Size();
-	  int found=0;
-	  for (j = 1; j <= nbi; j++)
-	    if(BI == BIname.Get(j)) found = 1;
-	  if( ! found ) BIname.Append(BI);	    	     
-	}
-      
-      outfile << "  " << BIname.Size() <<  " Boundary indicators:  ";
-      for (i =1 ; i <= BIname.Size(); i++)
-	outfile << BIname.Get(i) << " ";
-      outfile << "\n\n\n";
-      
-      outfile << "  Nodal coordinates and nodal boundary indicators,\n"
-	"  the columns contain:\n"
-	"   - node number\n"
-	"   - coordinates\n"
-	"   - no of boundary indicators that are set (ON)\n"
-	"   - the boundary indicators that are set (ON) if any.\n"
-	"#\n";
-
-      for (i = 1; i <= np; i++)
-        {
-          const Point3d & p = mesh.Point(i);
-
-          outfile.width(4);
-          outfile << i << "  (";
-          outfile.width(10);
-          outfile << p.X()/scale << ", ";
-          outfile.width(9);
-          outfile << p.Y()/scale << ", ";
-          outfile.width(9);
-          outfile << p.Z()/scale << ") ";
-	 
-	  if(mesh.PointType(i) != INNERPOINT) 
-	    {
-	      BCsinpoint.DeleteAll();
-	      for (j = 1; j <= nse; j++) 
-		{
-		  for (k = 1; k <= mesh.SurfaceElement(j).GetNP(); k++) 
-		    {
-		      if(mesh.SurfaceElement(j).PNum(k)==i) 
-			{
-			  int BC=mesh.GetFaceDescriptor(mesh.SurfaceElement(j).GetIndex()).BCProperty();
-			  int nbcsp=BCsinpoint.Size();
-			  int found = 0;
-			  for (l = 1; l <= nbcsp; l++)
-			    if(BC == BCsinpoint.Get(l)) found = 1;
-			  if( ! found ) BCsinpoint.Append(BC); 	    	     
-			}
-		    }
-		}
-	      int nbcsp = BCsinpoint.Size();
-	      outfile << "[" << nbcsp << "] ";
-	      for (j = 1; j <= nbcsp; j++)
-		outfile << BCsinpoint.Get(j) << " ";
-	      outfile << "\n";
-            }
-          else outfile << "[0]\n";
-
-        }
-
-      outfile << "\n"
-	"  Element types and connectivity\n"
-	"  the columns contain:\n"
-	"   - element number\n"
-	"   - element type\n"
-	"   - subdomain number\n"
-	"   - the global node numbers of the nodes in the element.\n"
-	"#\n";
-
-      for (i = 1; i <= ne; i++)
-        {
-          const Element & el = mesh.VolumeElement(i);
-          outfile.width(5);
-          if(el.GetNP()==4)
-            outfile << i << "  ElmT4n3D ";
-          else
-            outfile << i << "  ElmT10n3D ";
-          outfile.width(4);
-          outfile << el.GetIndex() << "    ";
-          if(el.GetNP()==10)
-            {
-	      outfile.width(8);
-	      outfile << el.PNum(1);
-	      outfile.width(8);
-	      outfile << el.PNum(3);
-	      outfile.width(8);
-	      outfile << el.PNum(2);
-	      outfile.width(8);
-	      outfile << el.PNum(4);
-	      outfile.width(8);
-	      outfile << el.PNum(6);
-	      outfile.width(8);
-	      outfile << el.PNum(8);
-	      outfile.width(8);
-	      outfile << el.PNum(5);
-	      outfile.width(8);
-	      outfile << el.PNum(7);
-	      outfile.width(8);
-	      outfile << el.PNum(10);
-	      outfile.width(8);
-	      outfile << el.PNum(9);
-            }
-          else
-            {
-	      outfile.width(8);
-	      outfile << el.PNum(1);
-	      outfile.width(8);
-	      outfile << el.PNum(3);
-	      outfile.width(8);
-	      outfile << el.PNum(2);
-	      outfile.width(8);
-	      outfile << el.PNum(4);
-            }
-          outfile << "\n";
-        }
-    } /* Diffpack */
-
-  else
-
-    {
-      // Output compatible to Diffpack grid format 2D
-
-      int np = mesh.GetNP();
-      int ne = mesh.GetNE();
-      int nse = mesh.GetNSE();
-      ARRAY <int> BIname;
-      ARRAY <int> BCsinpoint;
-      int i, j, k, l;
-
-
-      outfile.precision(6);
-      outfile.setf (ios::fixed, ios::floatfield);
-      outfile.setf (ios::showpoint);
-
-      outfile << "\n\n"
-	"Finite element mesh (GridFE):\n\n"
-	"  Number of space dim. =  2\n"
-	"  Number of elements   =  " << nse << "\n"
-	"  Number of nodes      =  " << np << "\n\n"
-	"  All elements are of the same type : dpTRUE\n"
-	"  Max number of nodes in an element: 3\n"
-	"  Only one subdomain               : dpFALSE\n"
-	"  Lattice data                     ? 0\n\n\n\n";
-      
-      for (i = 1; i <= nse; i++) 
-	{
-	  int BI=mesh.GetFaceDescriptor(mesh.SurfaceElement(i).GetIndex()).BCProperty();
-	  int nbi=BIname.Size();
-	  int found=0;
-	  for (j = 1; j <= nbi; j++)
-	    if(BI == BIname.Get(j)) found = 1;
-	  if( ! found ) BIname.Append(BI);	    	     
-	}
-      
-      outfile << "  " << BIname.Size() <<  " Boundary indicators:  ";
-      for (i =1 ; i <= BIname.Size(); i++)
-	outfile << BIname.Get(i) << " ";
-      outfile << "\n\n\n";
-      
-      outfile << "  Nodal coordinates and nodal boundary indicators,\n"
-	"  the columns contain:\n"
-	"   - node number\n"
-	"   - coordinates\n"
-	"   - no of boundary indicators that are set (ON)\n"
-	"   - the boundary indicators that are set (ON) if any.\n"
-	"#\n";
-
-      for (i = 1; i <= np; i++)
-        {
-          const Point3d & p = mesh.Point(i);
-
-          outfile.width(4);
-          outfile << i << "  (";
-          outfile.width(10);
-          outfile << p.X()/scale << ", ";
-          outfile.width(9);
-          outfile << p.Y()/scale << ", ";
-	 
-	  if(mesh.PointType(i) != INNERPOINT) 
-	    {
-	      BCsinpoint.DeleteAll();
-	      for (j = 1; j <= nse; j++) 
-		{
-		  for (k = 1; k <= 2; k++) 
-		    {
-		      if(mesh.SurfaceElement(j).PNum(k)==i) 
-			{
-			  int BC=mesh.GetFaceDescriptor(mesh.SurfaceElement(j).GetIndex()).BCProperty();
-			  int nbcsp=BCsinpoint.Size();
-			  int found = 0;
-			  for (l = 1; l <= nbcsp; l++)
-			    if(BC == BCsinpoint.Get(l)) found = 1;
-			  if( ! found ) BCsinpoint.Append(BC); 	    	     
-			}
-		    }
-		}
-	      int nbcsp = BCsinpoint.Size();
-	      outfile << "[" << nbcsp << "] ";
-	      for (j = 1; j <= nbcsp; j++)
-		outfile << BCsinpoint.Get(j) << " ";
-	      outfile << "\n";
-            }
-          else outfile << "[0]\n";
-
-        }
-
-      outfile << "\n"
-	"  Element types and connectivity\n"
-	"  the columns contain:\n"
-	"   - element number\n"
-	"   - element type\n"
-	"   - subdomain number\n"
-	"   - the global node numbers of the nodes in the element.\n"
-	"#\n";
-
-      for (i = 1; i <= nse; i++)
-        {
-          const Element2d & el = mesh.SurfaceElement(i);
-          outfile.width(5);
-          outfile << i << "  ElmT3n2D ";
-          outfile.width(4);
-          outfile << el.GetIndex() << "    ";
-	  outfile.width(8);
-	  outfile << el.PNum(1);
-	  outfile.width(8);
-	  outfile << el.PNum(3);
-	  outfile.width(8);
-	  outfile << el.PNum(2);
-          outfile << "\n";
-        }
-    }
-}
-}
diff --git a/contrib/Netgen/libsrc/interface/writeelmer.cpp b/contrib/Netgen/libsrc/interface/writeelmer.cpp
deleted file mode 100644
index caf02e2c683fec8c5e185c1c89ca117595aeaad2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writeelmer.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-
-//
-//  Write Elmer file
-//
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-#include <sys/stat.h>
-
-
-void WriteElmerFormat (const Mesh &mesh,
-			 const string &filename)
-{
-  cout << "write elmer mesh files" << endl;
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-  int i, j, rc;
-  char str[200];
-  
-  int inverttets = mparam.inverttets;
-  int invertsurf = mparam.inverttrigs;
-
-#ifdef WIN32
-  cerr << "not yet implemented for Windows platforms." << endl;
-  return;
-#else
-  rc = mkdir(filename.c_str(), S_IRWXU|S_IRWXG);
-#endif
-  sprintf( str, "%s/mesh.header", filename.c_str() );
-  ofstream outfile_h(str);
-  sprintf( str, "%s/mesh.nodes", filename.c_str() );
-  ofstream outfile_n(str);
-  sprintf( str, "%s/mesh.elements", filename.c_str() );
-  ofstream outfile_e(str);
-  sprintf( str, "%s/mesh.boundary", filename.c_str() );
-  ofstream outfile_b(str);
-
-  // fill hashtable
-
-  INDEX_3_HASHTABLE<int> face2volelement(ne);
-
-  for (i = 1; i <= ne; i++)
-    {
-      const Element & el = mesh.VolumeElement(i);
-      INDEX_3 i3;
-      int k, l;
-      for (j = 1; j <= 4; j++)   // loop over faces of tet
-	{
-	  l = 0;
-	  for (k = 1; k <= 4; k++)
-	    if (k != j)
-	      {
-		l++;
-		i3.I(l) = el.PNum(k);
-	      }
-	  i3.Sort();
-	  face2volelement.Set (i3, i);
-	}
-    }
-
-//  outfile.precision(6);
-//  outfile.setf (ios::fixed, ios::floatfield);
-//  outfile.setf (ios::showpoint);
-  
-  outfile_h << np << " " << ne << " " << nse << "\n";
-  outfile_h << "1"     << "\n";
-  outfile_h << "504 1" << "\n";
-  
-  for (i = 1; i <= np; i++)
-    {
-      const Point3d & p = mesh.Point(i);
-      
-      outfile_n << i << " -1 ";
-      outfile_n << p.X() << " ";
-      outfile_n << p.Y() << " ";
-      outfile_n << p.Z() << "\n";
-    }
-
-  for (i = 1; i <= ne; i++)
-    {
-      Element el = mesh.VolumeElement(i);
-      if (inverttets) el.Invert();
-      sprintf( str, "5%02d", (int)el.GetNP() );
-      outfile_e << i << " " << el.GetIndex() << " " << str <<  "  ";
-      for (j = 1; j <= el.GetNP(); j++)
-	{
-	  outfile_e << " ";
-	  outfile_e << el.PNum(j);
-	}
-      outfile_e << "\n";
-    }
-
-  for (i = 1; i <= nse; i++)
-    {
-      Element2d el = mesh.SurfaceElement(i);
-      if (invertsurf) el.Invert();
-      sprintf( str, "3%02d", (int)el.GetNP() );
-      {
-	  INDEX_3 i3;
-	  for (j = 1; j <= 3; j++) i3.I(j) = el.PNum(j);
-	  i3.Sort();
-	  
-	  int elind = face2volelement.Get(i3);
-          outfile_b << i << " " << mesh.GetFaceDescriptor(el.GetIndex()).BCProperty() << 
-         " " << elind << " 0 "  << str << "    ";
-      }
-      for (j = 1; j <= el.GetNP(); j++)
-	{
-	  outfile_b << " ";
-	  outfile_b << el.PNum(j);
-	}
-      outfile_b << "\n";
-    }
-}
-
-}
diff --git a/contrib/Netgen/libsrc/interface/writefeap.cpp b/contrib/Netgen/libsrc/interface/writefeap.cpp
deleted file mode 100644
index 817ee7c5387c9ff3d5c4d70d5cdbd37e6f87cdc1..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writefeap.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-//
-// Write FEAP file
-// FEAP by Bob Taylor, Berkely
-//
-// contact Peter Wriggers or Albrecht Rieger, Hannover
-// rieger@ibnm.uni-hannover.de
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-
-#include "writeuser.hpp"
-
-
-void WriteFEAPFormat (const Mesh & mesh,
-		      const string & filename)
-  
-{
-  // Feap format by A. Rieger 
-  // rieger@ibnm.uni-hannover.de
-
-  int inverttets = mparam.inverttets;
-  int invertsurf = mparam.inverttrigs;
-
-  int i, j, zz, n;
-
-  double scale = 1;   // globflags.GetNumFlag ("scale", 1);
-  
-  ofstream outfile(filename.c_str());
- 
-  outfile << "feap" << "\n";
-  outfile << mesh.GetNP();
-  outfile << ",";
-  outfile << mesh.GetNE();
-  outfile << ",";
-  outfile << "1,3,3,4" << "\n" << "\n"; 
-  outfile << "!numnp,numel,nummat,ndm,ndf,nen";
-  outfile << "\n";
-      
-  outfile << "\n" << "\n";
-  outfile << "!node,,         X           Y           Z" << "\n";
-  outfile << "COOR" << "\n";
-  outfile.precision(4);
-  outfile.setf (ios::fixed, ios::floatfield);
-  outfile.setf (ios::showpoint);
-
-  for (i = 1; i <= mesh.GetNP(); i++)
-    {
-      outfile.width(5);
-      outfile << i;
-      outfile << ",,";
-      outfile.width(10);
-      outfile << mesh.Point(i).X()/scale << "  ";
-      outfile.width(10);
-      outfile << mesh.Point(i).Y()/scale << "  ";
-      outfile.width(10);
-      outfile << mesh.Point(i).Z()/scale << "\n";
-    }   
-      
-  outfile << "\n" << "\n";
-  outfile << "!elm,,mat,     n1      n2      n3      n4" << "\n";
-  outfile << "ELEM" << "\n";
-
-  for (i = 1; i <= mesh.GetNE(); i++)
-    {
-      Element el = mesh.VolumeElement(i);
-      if (inverttets)
-	el.Invert();
-
-
-      outfile.width(5);
-      outfile << i;
-      outfile << ",,";
-      outfile << el.GetIndex();
-      outfile << ",";
-
-
-      for (j = 1; j <= el.NP(); j++)
-	{
-	  outfile.width(8);
-	  outfile << el.PNum(j);
-	}
-      outfile << "\n";
-    }
-      
-  outfile << "\n" << "\n";
-      
-      
-  /*
-
-  //outfile << "SLOA" << "\n";
-  //outfile << "2,3,3" << "\n";
-  //outfile << GetNSE() << "\n";
-  outfile << "selm" << "\n" << GetNSE() << "\n";
-  for (i = 1; i <= GetNSE(); i++)
-  {
-  if (SurfaceElement(i).GetIndex())
-  {
-  outfile.width(8);
-  outfile << facedecoding.Get(SurfaceElement(i).GetIndex ()).surfnr;
-  //outfile.width(8);	  
-  //outfile << facedecoding.Get(SurfaceElement(i).GetIndex ()).domin;
-  //outfile.width(8);	  
-  //outfile << facedecoding.Get(SurfaceElement(i).GetIndex ()).domout;
-  }
-  else
-  outfile << "       0       0       0";
-  
-  
-  Element2d sel = SurfaceElement(i);
-  if (invertsurf)
-  sel.Invert();
-  //outfile.width(8);
-  //outfile << sel.GetNP();
-  //if (facedecoding.Get(SurfaceElement(i).GetIndex ()).surfnr == 4)
-  //{
-  for (j = 1; j <= sel.GetNP(); j++)
-  {
-  outfile.width(8);	  
-  outfile << sel.PNum(j);
-  }
-  //outfile.width(8);	
-  //outfile << "0.0";
-  //outfile.width(8);	
-  //outfile << "0.0";
-  //outfile.width(8);	
-  //outfile << "1.0" << "\n";
-  //}
-  outfile << "\n";
-  //outfile << endl;
-  }
-  */
-
-
-
-  // BEGIN CONTACT OUTPUT
-  /*      
-	  int masterindex, slaveindex;
-	  cout << "Master Surface index = ";
-	  cin >> masterindex;
-	  cout << "Slave Surface index  = ";
-	  cin >> slaveindex;
-
-
-	  // CONTACT SURFACE 1
-	  outfile << "\n";
-	  outfile << "\n";
-	  outfile << "surface,1" << "\n";;
-	  outfile.width(6);
-	  outfile << "tria" << "\n";;
-	  outfile.width(13);
-	  outfile << "facet" << "\n";;
-	  zz = 0;
-	  for (i = 1; i <= mesh.GetNSE(); i++)
-	  {
-	  Element2d sel = mesh.SurfaceElement(i);
-	  if (invertsurf)
-	  sel.Invert();
-	  if (mesh.GetFaceDescriptor(sel.GetIndex ()).BCProperty() == masterindex)
-	  {
-	  zz++;
-	  outfile.width(14);
-	  outfile << zz;
-	  outfile << ",,";
-	  for (j = 1; j <= sel.GetNP(); j++)
-	  {
-	  outfile << sel.PNum(j);
-	  outfile << ",";
-	  }
-	  outfile << "\n";
-	  }
-	  }
-
-
-	  // CONTACT SURFACE 2
-	  outfile << "\n";
-	  outfile << "\n";
-	  outfile << "surface,2" << "\n";;
-	  outfile.width(6);
-	  outfile << "tria" << "\n";;
-	  outfile.width(13);
-	  outfile << "facet" << "\n";;
-	  zz = 0;
-	  for (i = 1; i <= mesh.GetNSE(); i++)
-	  {
-	  
-	  Element2d sel = mesh.SurfaceElement(i);
-	  if (invertsurf)
-	  sel.Invert();
-	  if (mesh.GetFaceDescriptor(sel.GetIndex ()).BCProperty() == slaveindex)
-	  {
-	  zz++;
-	  outfile.width(14);
-	  outfile << zz;
-	  outfile << ",,";
-	  for (j = 1; j <= sel.GetNP(); j++)
-	  {
-	  outfile << sel.PNum(j);
-	  outfile << ",";
-	  }
-	  outfile << "\n";
-	  }
-	  }
-      
-	  outfile << "\n";
-	  outfile << "\n";
-  */      
-      
-  // END CONTACT OUTPUT
-
-  cout << "done" << endl;
-}
-}
diff --git a/contrib/Netgen/libsrc/interface/writefluent.cpp b/contrib/Netgen/libsrc/interface/writefluent.cpp
deleted file mode 100644
index 5c08d59857596c0f38d2b2217db91b15b69600f2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writefluent.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-//
-//  Write Fluent file
-//  Johannes Gerstmayr, University Linz
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-
-#include "writeuser.hpp"
-
-
-
-void WriteFluentFormat (const Mesh & mesh,
-			const string & filename)
-
-{
-  cout << "start writing fluent export" << endl;
-      
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-  int i, j;
-
-  ofstream outfile (filename.c_str());
-  char str[100];
-
-  outfile.precision(6);
-  //outfile.setf (ios::fixed, ios::floatfield);
-  //outfile.setf (ios::showpoint);
-      
-  outfile << "(0 \"Exported file from NETGEN \")" << endl;
-  outfile << "(0 \"Dimension:\")" << endl;
-  outfile << "(2 3)" << endl << endl;
-
-  outfile << "(0 \"Nodes:\")" << endl;
-
-  //number of nodes:
-  sprintf(str,"(10 (0 1 %x 1))",np); //hexadecimal!!!
-  outfile << str << endl;
-
-  //nodes of zone 1:
-  sprintf(str,"(10 (7 1 %x 1)(",np); //hexadecimal!!!
-  outfile << str << endl;
-  for (i = 1; i <= np; i++)
-    {
-      const Point3d & p = mesh.Point(i);
-
-      //outfile.width(10);
-      outfile << p.X() << " ";
-      outfile << p.Y() << " ";
-      outfile << p.Z() << "\n";
-    }
-  outfile << "))" << endl << endl;
-
-  //write faces with elements
-
-  outfile << "(0 \"Faces:\")" << endl;
-
-  Element2d face, face2;
-  int i2, j2;
-  ARRAY<INDEX_3> surfaceelp;
-  ARRAY<int> surfaceeli;
-  ARRAY<int> locels;
-
-  //no cells=no tets
-  //no faces=2*tets
-
-  int noverbface = 2*ne-nse/2;
-      
-  sprintf(str,"(13 (0 1 %x 0))",(noverbface+nse)); //hexadecimal!!!
-  outfile << str << endl;
-      
-  sprintf(str,"(13 (4 1 %x 2 3)(",noverbface); //hexadecimal!!!
-  outfile << str << endl;
-
-  const_cast<Mesh&> (mesh).BuildElementSearchTree();
-
-  for (i = 1; i <= ne; i++)
-    {
-      if (ne > 2000)
-	{
-	  if (i%2000 == 0)
-	    {
-	      cout << (double)i/(double)ne*100. << "%" << endl;
-	    }
-	}
-
-      Element el = mesh.VolumeElement(i);
-      //if (inverttets)
-      //  el.Invert();
-	  
-      //outfile << el.GetIndex() << "    ";
-      if (el.GetNP() != 4) {cout << "only tet-meshes supported in write fluent!" << endl;}
-	  
-      //faces:
-	  
-      Box3d box;
-      el.GetBox(mesh.Points(), box);
-      box.IncreaseRel(1e-6);
-
-      mesh.GetIntersectingVolEls(box.PMin(),box.PMax(),locels);
-      int nel = locels.Size();
-      int locind;
-
-      //cout << "nel=" << nel << endl;
-
-      for (j = 1; j <= el.GetNFaces(); j++)
-	{
-	  el.GetFace(j, face);
-	  face.Invert();
-	  int eli2 = 0;
-	  int stopsig = 0;
-	      
-	  for (i2 = 1; i2 <= nel; i2++)
-	    {
-	      locind = locels.Get(i2);
-	      //cout << "  locind=" << locind << endl;
-
-	      Element el2 = mesh.VolumeElement(locind);
-	      //if (inverttets)
-	      //  el2.Invert();
-
-	      for (j2 = 1; j2 <= el2.GetNFaces(); j2++)
-		{
-		  el2.GetFace(j2, face2);
-
-		  if (face2.HasFace(face)) {eli2 = locind; stopsig = 1; break;}
-		}
-	      if (stopsig) break;
-	    }
-	      
-	  if (eli2==i) cout << "error in WRITE_FLUENT!!!" << endl;
-	      
-	  if (eli2 > i) //dont write faces two times!
-	    {
-	      //i: left cell, eli: right cell
-	      outfile << hex << face.PNum(2) << " "
-		<< hex << face.PNum(1) << " "
-		<< hex << face.PNum(3) << " "
-		<< hex << i  << " "
-		<< hex << eli2 << "\n";
-	    }
-	  if (eli2 == 0) 
-	    {
-	      surfaceelp.Append(INDEX_3(face.PNum(2),face.PNum(1),face.PNum(3)));
-	      surfaceeli.Append(i);
-	    }
-	}
-    }
-  outfile << "))" << endl;
-      
-  sprintf(str,"(13 (2 %x %x 3 3)(",(noverbface+1),noverbface+nse); //hexadecimal!!!
-  outfile << str << endl;
-
-  for (i = 1; i <= surfaceelp.Size(); i++)
-    {
-      outfile << hex << surfaceelp.Get(i).I1() << " "
-	      << hex << surfaceelp.Get(i).I2() << " "
-	      << hex << surfaceelp.Get(i).I3() << " "
-	      << hex << surfaceeli.Get(i) << " " << 0 << "\n";
-    }
-
-  outfile << "))" << endl << endl;
-
-  outfile << "(0 \"Cells:\")" << endl;
-      
-  sprintf(str,"(12 (0 1 %x 0))",ne); //hexadecimal!!!
-  outfile << str << endl;
-
-  sprintf(str,"(12 (1 1 %x 1 2))",ne); //hexadecimal!!!
-  outfile << str << endl << endl;
-
-
-
-
-  outfile << "(0 \"Zones:\")\n"
-	  << "(45 (1 fluid fluid)())\n"
-    //      << "(45 (2 velocity-inlet velocity_inlet.1)())\n"
-    //      << "(45 (3 pressure-outlet pressure_outlet.2)())\n"
-	  << "(45 (2 wall wall)())\n"
-	  << "(45 (4 interior default-interior)())\n" << endl;
-
-  cout << "done" << endl;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/interface/writegmsh.cpp b/contrib/Netgen/libsrc/interface/writegmsh.cpp
deleted file mode 100644
index 93def677835846f85917ccf3243f841e8d9480e6..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writegmsh.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-/*************************************
- * Write Gmsh file
- * First issue the 04/26/2004 by Paul CARRICO (paul.carrico@free.fr)
- * At the moment, the GMSH format is available for
- * linear tetrahedron elements i.e. in 3D
- * (based on Neutral Format)
- *
- * Second issue the 05/05/2004 by Paul CARRICO
- * Thanks to Joachim Schoeberl for the correction of a minor bug
- * the 2 initial Gmsh Format (i.e. volume format and surface format) are group together)
- * in only one file
- **************************************/
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-
-/*
- *  GMSH mesh format
- *  points, elements, surface elements and physical entities
- */
-
-void WriteGmshFormat (const Mesh & mesh,
-			 const CSGeometry & geom,
-			 const string & filename)
-{
-  ofstream outfile (filename.c_str());
-  outfile.precision(6);
-  outfile.setf (ios::fixed, ios::floatfield);
-  outfile.setf (ios::showpoint);
-
-  int np = mesh.GetNP();  /// number of point
-  int ne = mesh.GetNE();  /// number of element
-  int nse = mesh.GetNSE();  /// number of surface element (BC)
-  int i, j, k, l;
-
-
-  /*
-   * 3D section : Linear volume elements (only tetrahedra)
-   */
-
-   if (ne > 0 && mesh.VolumeElement(1).GetNP() == 4)
-      {
-      cout << "Write GMSH Format \n";
-      cout << "The GMSH format is available for linear tetrahedron elements only in 3D\n" << endl;
-
-      int inverttets = mparam.inverttets;
-      int invertsurf = mparam.inverttrigs;
-
-
-      /// Write nodes
-      outfile << "$NOD\n";
-      outfile << np << "\n";
-  
-      for (i = 1; i <= np; i++)
-          {
-          const Point3d & p = mesh.Point(i);
-          outfile << i << " "; /// node number
-          outfile << p.X() << " ";
-          outfile << p.Y() << " ";
-          outfile << p.Z() << "\n";
-          }
-      outfile << "$ENDNOD\n";
-
-      /// write elements
-      outfile << "$ELM\n";
-      outfile << ne + nse << "\n";  ////  number of elements + number of surfaces BC
-
-     for (i = 1; i <= nse; i++)
-         {
-         Element2d el = mesh.SurfaceElement(i);
-         if (invertsurf) el.Invert();
-         outfile << i;
-         outfile << " ";
-         outfile << "2";
-         outfile << " ";
-         outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << " ";
-         /// that means that physical entity = elementary entity (arbitrary approach)
-         outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << " ";
-         outfile << "3";
-         outfile << " ";
-                 for (j = 1; j <= el.GetNP(); j++)
-                     {
-                     outfile << " ";
-                     outfile << el.PNum(j);
-                     }
-                     outfile << "\n";
-         }
-
-
-         for (i = 1; i <= ne; i++)
-             {
-             Element el = mesh.VolumeElement(i);
-             if (inverttets) el.Invert();
-             outfile << nse + i; /// element number
-             outfile << " ";
-             outfile << "4"; /// element type i.e. Tetraedron == 4
-             outfile << " ";
-             outfile << 100000 + el.GetIndex();
-             /// that means that physical entity = elementary entity (arbitrary approach)
-             outfile << " ";
-             outfile << 100000 + el.GetIndex();   /// volume number
-             outfile << " ";
-             outfile << "4";  /// number of nodes i.e. 4 for a tetrahedron
-                                                                                                        
-             for (j = 1; j <= el.GetNP(); j++)
-                 {
-                 outfile << " ";
-                 outfile << el.PNum(j);
-                 }
-             outfile << "\n";
-             }
-
-
-             outfile << "$ENDELM\n";
-   }
-
-   /*
-    * End of 3D section
-    */
-
-
-
-
-
-  /*
-   * 2D section : available for triangles and quadrangles
-   */
-      else if (ne == 0)   /// means that there's no 3D element
-              {
-              cout << "\n Write Gmsh Surface Mesh (triangle and/or quadrangles)" << endl;
-
-              /// Write nodes
-              outfile << "$NOD\n";
-              outfile << np << "\n";
-
-              for (i = 1; i <= np; i++)
-              {
-              const Point3d & p = mesh.Point(i);
-              outfile << i << " "; /// node number
-              outfile << p.X() << " ";
-              outfile << p.Y() << " ";
-              outfile << p.Z() << "\n";
-              }
-              outfile << "$ENDNOD\n";
-
-
-              /// write triangles & quadrangles
-              outfile << "$ELM\n";
-              outfile << nse << "\n";
-
-              for (k = 1; k <= nse; k++)
-              {
-              const Element2d & el = mesh.SurfaceElement(k);
-
-
-              outfile << k;
-              outfile << " ";
-              outfile << (el.GetNP()-1);   // 2 for a triangle and 3 for a quadrangle
-              outfile << " ";
-              outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << " ";
-              /// that means that physical entity = elementary entity (arbitrary approach)
-              outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << " ";
-              outfile << (el.GetNP());    // number of node per surfacic element
-              outfile << " ";
-
-              for (l = 1; l <= el.GetNP(); l++)
-                  {
-                  outfile << " ";
-                  outfile << el.PNum(l);
-                  }
-	              outfile << "\n";
-		  
-               }
-               outfile << "$ENDELM$ \n";
-    }
-
-   /*
-    * End of 2D section
-    */
-
-     else
-    {
-    cout << " Invalide element type for Gmsh volume Format !\n";
-    }
-
-
-}
-}
-
-
diff --git a/contrib/Netgen/libsrc/interface/writepermas.cpp b/contrib/Netgen/libsrc/interface/writepermas.cpp
deleted file mode 100644
index 9dc76624583337b8efc660d9ce849a7d61f303b2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writepermas.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-//
-// Write Permas file
-// for Intes GmbH, Stuttgart
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-#include <string>
-
-using namespace std;
-
-namespace netgen
-{
-#include "writeuser.hpp"
-    // Forward declarations (don't know, where to define them, sorry)
-    int addComponent(string &strComp, string &strSitu, ofstream &out);
-
-
-    // This should be the new function to export a PERMAS file
-    void WritePermasFormat (const Mesh &mesh, const string &filename, 
-                            string &strComp, string &strSitu) 
-    {
-        ofstream outfile (filename.c_str());
-        addComponent(strComp, strSitu, outfile);
-        WritePermasFormat ( mesh, filename);
-    }
-
-    void WritePermasFormat (const Mesh &mesh, const string &filename)
-    {
-        string strComp, strSitu;
-        ofstream outfile (filename.c_str());
-        
-        outfile.precision(8);
-
-        strSitu = strComp = "";
-        if (addComponent(strComp, strSitu, outfile) == 1) {
-            printf("Error while exporting PERMAS dat!\n");
-            return;
-        }
-    
-        int np = mesh.GetNP();
-        int ne = mesh.GetNE();
-        int nse = mesh.GetNSE();
-        int i, j, k;
-    
-        if (ne == 0)
-        {
-            // pure surface mesh
-            cout << "\nWrite Permas Surface Mesh" << endl;
-            
-            int elnr = 0;
-            for (j = 1; j <= 2; j++)
-            {
-                int nelp;
-                switch (j)
-                {
-                case 1:
-                    nelp = 3;
-                    outfile << "$ELEMENT TYPE = TRIA3  ESET = ALLQUAD" << endl;		  
-                    break;
-                case 2:
-                    nelp = 4;
-                    outfile << "$ELEMENT TYPE = QUAD4  ESET = ALLQUAD" << endl;		  
-                    break;
-                }
-                
-                for (i = 1; i <= nse; i++)
-                {
-                    const Element2d & el = mesh.SurfaceElement(i);
-                    if (el.GetNP() != nelp)
-                        continue;
-                    
-                    elnr++;
-                    outfile << elnr << "  ";
-                    for (k = 1; k <= nelp; k++)
-                        outfile << " " << el.PNum(k);
-                    outfile << endl;
-                    
-                }
-            }
-        }
-        else
-        {
-            cout << "\nWrite Permas Volume Mesh" << endl;
-            
-            int secondorder = (mesh.VolumeElement(1).GetNP() == 10);
-            
-            if (!secondorder)
-            {
-                outfile << "$ELEMENT TYPE = TET4  ESET = ALLTET" << endl;
-                for (i = 1; i <= ne; i++)
-                {
-                    const Element & el = mesh.VolumeElement(i);
-                    outfile << i 
-                            << " " << el.PNum(1) 
-                            << " " << el.PNum(2) 
-                            << " " << el.PNum(3) 
-                            << " " << el.PNum(4) << endl;
-                }
-            }
-            else
-            {
-                outfile << "$ELEMENT TYPE = TET10  ESET = ALLTET" << endl;
-                for (i = 1; i <= ne; i++)
-                {
-                    const Element & el = mesh.VolumeElement(i);
-                    outfile << i 
-                            << " " << el.PNum(1) 
-                            << " " << el.PNum(5) 
-                            << " " << el.PNum(2) 
-                            << " " << el.PNum(8) 
-                            << " " << el.PNum(3) 
-                            << " " << el.PNum(6) << endl << "& "
-                            << " " << el.PNum(7) 
-                            << " " << el.PNum(9) 
-                            << " " << el.PNum(10) 
-                            << " " << el.PNum(4) << endl;
-                }
-            }
-            
-            outfile << endl << endl;
-            
-            
-            outfile << "$SURFACE GEO  SURFID = 1  SFSET = ALLSUR" << endl;
-            for (i = 1; i <= nse; i++)
-            {
-                const Element2d & el = mesh.SurfaceElement(i);
-                if (el.GetNP() == 3)
-                    outfile << "STRIA3"
-                            << " " << el.PNum(1) 
-                            << " " << el.PNum(2) 
-                            << " " << el.PNum(3) << endl;
-            }    
-            
-            for (i = 1; i <= nse; i++)
-            {
-                const Element2d & el = mesh.SurfaceElement(i);
-                if (el.GetNP() == 4)
-                    outfile << "SQUAD4"
-                            << " " << el.PNum(1) 
-                            << " " << el.PNum(2) 
-                            << " " << el.PNum(3) 
-                            << " " << el.PNum(4) << endl;
-            }      
-            
-            for (i = 1; i <= nse; i++)
-            {
-                const Element2d & el = mesh.SurfaceElement(i);
-                if (el.GetNP() == 6)
-                    outfile << "STRIA6"
-                            << " " << el.PNum(1) 
-                            << " " << el.PNum(4) 
-                            << " " << el.PNum(2) 
-                            << " " << el.PNum(5) 
-                            << " " << el.PNum(3) 
-                            << " " << el.PNum(6) << endl;
-            }      
-        }
-        
-        
-        outfile << endl << endl;
-        
-        outfile << "$COOR  NSET = ALLNODES" << endl;
-        
-        outfile.precision(6);
-        outfile.setf (ios::fixed, ios::floatfield);
-        outfile.setf (ios::showpoint);
-        
-        for (i = 1; i <= np; i++)
-        {
-            outfile << i << " ";
-            outfile << mesh.Point(i).X() << " ";
-            outfile << mesh.Point(i).Y() << " ";
-            outfile << mesh.Point(i).Z() << "\n";
-        }
-    }
-    ////////////////////////////////////////////////////////////////////////////////// 
-    // \brief Writes PERMAS configuration header into export file
-    //        Returns >0 in case of errors
-    // \par string &strComp  : Reference to component description
-    // \par string &strComp  : Reference to situation description
-    ////////////////////////////////////////////////////////////////////////////////// 
-    int addComponent(string &strComp, string &strSitu, ofstream &out)
-    {
-        if (strComp.size() > 12 || strSitu > 12) 
-            return 1;
-
-        if (0 == strComp.size()) 
-            strComp = "KOMPO1";
-        
-        if (0 == strSitu.size())
-            strSitu = "SIT1";
-
-        // Writing description header of configuration
-        out << "$ENTER COMPONENT  NAME = " << strComp << "  DOFTYPE = DISP MATH" << endl << endl;
-        out << "   $SITUATION  NAME = " << strSitu << endl;
-        out << "   $END SITUATION" << endl << endl;
-        out << "   $STRUCTURE" << endl;
-        
-        return 0;
-    }
-    
-}
diff --git a/contrib/Netgen/libsrc/interface/writepermas2.cpp b/contrib/Netgen/libsrc/interface/writepermas2.cpp
deleted file mode 100644
index f78714c5a4a7e011f115641be33231123c7a006a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writepermas2.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-//
-// Write Permas file
-// for Intes GmbH, Stuttgart
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-
-void WritePermasFormat (const Mesh & mesh,
-			const string & filename)
-
-{
-  
-  ofstream outfile (filename.c_str());
-
-  outfile.precision(8);
-      
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-  int i, j, k;
-
-
-  if (ne == 0)
-    {
-      // pure surface mesh
-
-      cout << "\nWrite Permas Surface Mesh" << endl;
-
-      int elnr = 0;
-      for (j = 1; j <= 2; j++)
-	{
-	  int nelp;
-	  switch (j)
-	    {
-	    case 1:
-	      nelp = 3;
-	      outfile << "$ELEMENT TYPE = TRIA3  ESET = ALLQUAD" << endl;		  
-	      break;
-	    case 2:
-	      nelp = 4;
-	      outfile << "$ELEMENT TYPE = QUAD4  ESET = ALLQUAD" << endl;		  
-	      break;
-	    }
-	      
-	  for (i = 1; i <= nse; i++)
-	    {
-	      const Element2d & el = mesh.SurfaceElement(i);
-	      if (el.GetNP() != nelp)
-		continue;
-		  
-	      elnr++;
-	      outfile << elnr << "  ";
-	      for (k = 1; k <= nelp; k++)
-		outfile << " " << el.PNum(k);
-	      outfile << endl;
-		  
-	    }
-	}
-    }
-
-  else
-
-    {
-      cout << "\nWrite Permas Volume Mesh" << endl;
-
-
-      int secondorder = (mesh.VolumeElement(1).GetNP() == 10);
-	  	  
-      if (!secondorder)
-	{
-	  outfile << "$ELEMENT TYPE = TET4  ESET = ALLTET" << endl;
-	  for (i = 1; i <= ne; i++)
-	    {
-	      const Element & el = mesh.VolumeElement(i);
-	      outfile << i 
-		      << " " << el.PNum(1) 
-		      << " " << el.PNum(2) 
-		      << " " << el.PNum(3) 
-		      << " " << el.PNum(4) << endl;
-	    }
-	}
-      else
-	{
-	  outfile << "$ELEMENT TYPE = TET10  ESET = ALLTET" << endl;
-	  for (i = 1; i <= ne; i++)
-	    {
-	      const Element & el = mesh.VolumeElement(i);
-	      outfile << i 
-		      << " " << el.PNum(1) 
-		      << " " << el.PNum(5) 
-		      << " " << el.PNum(2) 
-		      << " " << el.PNum(8) 
-		      << " " << el.PNum(3) 
-		      << " " << el.PNum(6) << endl << "& "
-		      << " " << el.PNum(7) 
-		      << " " << el.PNum(9) 
-		      << " " << el.PNum(10) 
-		      << " " << el.PNum(4) << endl;
-	    }
-	}
-	  
-      outfile << endl << endl;
-	  
-	  
-      outfile << "$SURFACE GEO  SURFID = 1  SFSET = ALLSUR" << endl;
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-	  if (el.GetNP() == 3)
-	    outfile << "STRIA3"
-		    << " " << el.PNum(1) 
-		    << " " << el.PNum(2) 
-		    << " " << el.PNum(3) << endl;
-	}    
-	  
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-	  if (el.GetNP() == 4)
-	    outfile << "SQUAD4"
-		    << " " << el.PNum(1) 
-		    << " " << el.PNum(2) 
-		    << " " << el.PNum(3) 
-		    << " " << el.PNum(4) << endl;
-	}      
-	  
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-	  if (el.GetNP() == 6)
-	    outfile << "STRIA6"
-		    << " " << el.PNum(1) 
-		    << " " << el.PNum(4) 
-		    << " " << el.PNum(2) 
-		    << " " << el.PNum(5) 
-		    << " " << el.PNum(3) 
-		    << " " << el.PNum(6) << endl;
-	}      
-    }
-
-
-  outfile << endl << endl;
-      
-
-
-  outfile << "$COOR  NSET = ALLNODES" << endl;
-
-  outfile.precision(6);
-  outfile.setf (ios::fixed, ios::floatfield);
-  outfile.setf (ios::showpoint);
-
-  for (i = 1; i <= np; i++)
-    {
-      outfile << i << " ";
-      outfile << mesh.Point(i).X() << " ";
-      outfile << mesh.Point(i).Y() << " ";
-      outfile << mesh.Point(i).Z() << "\n";
-    }
-}
-
-
-}
diff --git a/contrib/Netgen/libsrc/interface/writetecplot.cpp b/contrib/Netgen/libsrc/interface/writetecplot.cpp
deleted file mode 100644
index a3ddda3f9a882d774c1c6611a7d77b1143822bc1..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writetecplot.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-//
-// TECPLOT file by Jawor Georgiew
-//
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-void WriteTecPlotFormat (const Mesh & mesh,
-			 const CSGeometry & geom,
-			 const string & filename)
-{
-  INDEX i;
-  int j, k, e, z;
-  Vec<3> n;
-  
-  INDEX np = mesh.GetNP();
-  INDEX ne = mesh.GetNE();
-  INDEX nse = mesh.GetNSE();
-  
-  ARRAY<int> sn(np);
-  ofstream outfile(filename.c_str());
-  
-  outfile << "TITLE=\" " << filename << "\"" << endl;
-
-  // fill hashtable
-
-  INDEX_3_HASHTABLE<int> face2volelement(ne);
-
-  for (i = 1; i <= ne; i++)
-    {
-      const Element & el = mesh.VolumeElement(i);
-      INDEX_3 i3;
-      int k, l;
-      for (j = 1; j <= 4; j++)   // loop over faces of tet
-	{
-	  l = 0;
-	  for (k = 1; k <= 4; k++)
-	    if (k != j)
-	      {
-		l++;
-		i3.I(l) = el.PNum(k);
-	      }
-	  i3.Sort();
-	  face2volelement.Set (i3, i);
-	}
-    }
-      
-      
-  for (j = 1; j <= geom.GetNSurf(); j++)       /* Flaeche Nummer j */
-    {
-      for (i = 1; i <= np; i++)
-	sn.Elem(i) = 0;
-
-      e = 0;
-       
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-	  if (j ==  mesh.GetFaceDescriptor (el.GetIndex ()).SurfNr())
-	    {
-	      for (k = 1; k <= 3; k++)
-		sn.Elem(el.PNum(k)) = 1;
-	      e++;                     /* e= Anzahl der neuen Elemente */
-	    }
-	}
-
-      z = 0;
-      for (i = 1; i <= np; i++)
-	if (sn.Elem(i) == 1)
-	  sn.Elem(i) = ++z;
-
-      outfile << "ZONE T=\" Surface " << j << " \", N=" << z
-	      << ", E=" << e << ", ET=TRIANGLE, F=FEPOINT" << endl;
-
-      for (i = 1; i <= np; i++)
-	if (sn.Elem(i) != 0)
-	  {
-	    n = geom.GetSurface(j) -> GetNormalVector ( mesh.Point(i) );
-		
-	    outfile << mesh.Point(i).X() << " " /* Knoten Koordinaten */
-		    << mesh.Point(i).Y() << " "
-		    << mesh.Point(i).Z() << " "
-		    << n(0) << " "
-		    << n(1) << " "
-		    << n(2) << " "
-		    << i     << endl;
-	  }
-	  
-
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-	  if (j ==  mesh.GetFaceDescriptor(el.GetIndex ()).SurfNr())
-	    /* FlaechenKnoten (3) */
-	    outfile << sn.Get(el.PNum(1)) << " " 
-		    << sn.Get(el.PNum(2)) << " "
-		    << sn.Get(el.PNum(3)) << endl;
-	      
-	  /// Hier soll noch die Ausgabe der Nummer des angrenzenden
-	      /// Vol.elements erfolgen !
-
-	      for (i = 1; i <= nse; i++)
-		{
-		  const Element2d & el = mesh.SurfaceElement(i);
-		  INDEX_3 i3;
-		  for (j = 1; j <= 3; j++)
-		    i3.I(j) = el.PNum(j);
-		  i3.Sort();
-		  
-		  int elind = face2volelement.Get(i3);
-		}
-	}
-    }
-}
-
-
-}
diff --git a/contrib/Netgen/libsrc/interface/writetochnog.cpp b/contrib/Netgen/libsrc/interface/writetochnog.cpp
deleted file mode 100644
index 50546dc2d1655aa3804bc97692f50c972c4db9d1..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writetochnog.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-//  Write Tochnog file
-//
-//  by
-//
-//  Andreas Seltmann
-//  email:  A.Seltmann@lsw.uni-heidelberg.de
-//
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-void WriteTochnogFormat (const Mesh & mesh,
-			 const string & filename)
-{
-  cout << "\nWrite Tochnog Volume Mesh" << endl;
-
-  ofstream outfile (filename.c_str());
-
-  outfile << "(Nodes and Elements generated with NETGEN" << endl;
-  outfile << " " << filename << ")" << endl;
-
-  outfile.precision(8);
-
-  outfile << "(Nodes)" << endl;
-
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int i, j, k;
-
-  for (i = 1; i <= np; i++)
-    {
-      outfile << "node " << " " << i << " ";
-      outfile << mesh.Point(i).X() << " ";
-      outfile << mesh.Point(i).Y() << " ";
-      outfile << mesh.Point(i).Z() << "\n";
-    }
-
-  int elemcnt = 0; //element counter
-  int finished = 0;
-  int indcnt = 1; //index counter
-
-  while (!finished)
-    {
-      int actcnt = 0;
-      const Element & el1 = mesh.VolumeElement(1);
-      int non = el1.GetNP();
-      if (non == 4)
-	{
-	  outfile << "(Elements, type=-tet4)" << endl;
-	} 
-      else
-	{
-	  cout << "unsupported Element type!!!" << endl;	  
-	}
-
-      for (i = 1; i <= ne; i++)
-	{
-	  const Element & el = mesh.VolumeElement(i);
-	      
-	  if (el.GetIndex() == indcnt)
-	    {
-	      actcnt++;
-	      if (el.GetNP() != non) 
-		{
-		  cout << "different element-types in a subdomain are not possible!!!" << endl;
-		  continue;
-		}
-		  
-	      elemcnt++;
-	      outfile << "element " << elemcnt << " -tet4 ";
-	      if (non == 4)
-		{
-		  outfile << el.PNum(1) << " ";
-		  outfile << el.PNum(2) << " ";
-		  outfile << el.PNum(4) << " ";
-		  outfile << el.PNum(3) << "\n";
-		}
-	      else
-		{
-		  cout << "unsupported Element type!!!" << endl;
-		  for (j = 1; j <= el.GetNP(); j++)
-		    {
-		      outfile << el.PNum(j);
-		      if (j != el.GetNP()) outfile << ", ";
-		    }
-		  outfile << "\n";
-		}
-	    }
-	}	  
-      indcnt++;
-      if (elemcnt == ne) {finished = 1; cout << "all elements found by Index!" << endl;}
-      if (actcnt == 0) {finished = 1;}
-    }
-
-  cout << "done" << endl;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/interface/writeuser.cpp b/contrib/Netgen/libsrc/interface/writeuser.cpp
deleted file mode 100644
index 83b9a050cedeb6475fff2d0a3bcae848c0750c51..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writeuser.cpp
+++ /dev/null
@@ -1,899 +0,0 @@
-//
-//  Write user dependent output file
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <geometry2d.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-void RegisterUserFormats (ARRAY<const char*> & names)
-{
-  char *types[] =
-    {
-      "Neutral Format",
-      "Surface Mesh Format" ,
-      "DIFFPACK Format",
-      "TecPlot Format",     
-      "Tochnog Format",
-      "Abaqus Format",
-      "Fluent Format",
-      "Permas Format",
-      "FEAP Format",
-      "Elmer Format",
-      "STL Format",
-      "VRML Format",
-      "Gmsh Format",
-      //      { "Chemnitz Format" },
-      0
-    };
-
-  for (int i = 0; types[i]; i++)
-    names.Append (types[i]);
-}
-
-
-
-bool WriteUserFormat (const string & format, 	
-		      const Mesh & mesh,
-		      const CSGeometry & geom,
-		      const string & filename)
-{
-  PrintMessage (1, "Export mesh to file ", filename, 
-		", format is ", format);
-
-  if (format == "Neutral Format")
-    WriteNeutralFormat (mesh, geom, filename);
-
-  else if (format == "Surface Mesh Format")
-    WriteSurfaceFormat (mesh, filename);
-
-  else if (format == "DIFFPACK Format")
-    WriteDiffPackFormat (mesh, geom, filename);
-
-  else if (format == "Tochnog Format")
-    WriteTochnogFormat (mesh, filename);
-
-  else if (format == "TecPlot Format")
-    cerr << "ERROR: TecPlot format currently out of order" << endl;
-      // WriteTecPlotFormat (mesh, geom, filename);
-
-  else if (format == "Abaqus Format")
-    WriteAbaqusFormat (mesh, filename);
-
-  else if (format == "Fluent Format")
-    WriteFluentFormat (mesh, filename);
-
-  else if (format == "Permas Format")
-    WritePermasFormat (mesh, filename);
-
-  else if (format == "FEAP Format")
-    WriteFEAPFormat (mesh, filename);
-
-  else if (format == "Elmer Format")
-    WriteElmerFormat (mesh, filename);
-
-  else if (format == "STL Format")
-    WriteSTLFormat (mesh, filename);
-
-  else if (format == "VRML Format")
-    WriteVRMLFormat (mesh, 1, filename);
-
-  else if (format == "Fepp Format")
-    WriteFEPPFormat (mesh, geom, filename);
-
-  else if (format ==  "EdgeElement Format")
-    WriteEdgeElementFormat (mesh, geom, filename);
-
-  else if (format == "Chemnitz Format")
-    WriteUserChemnitz (mesh, filename);
-
-  else if (format == "Gmsh Format")
-    WriteGmshFormat (mesh, geom, filename);
- 
-  else 
-    {
-      return 1;
-    }
-
-  return 0;
-}
-
-
-
-
-/*
- *  Neutral mesh format
- *  points, elements, surface elements
- */
-
-void WriteNeutralFormat (const Mesh & mesh,
-			 const CSGeometry & geom,
-			 const string & filename)
-{
-  cout << "write neutral, new" << endl;
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-  int nseg = mesh.GetNSeg();
-  int i, j;
-  
-  int inverttets = mparam.inverttets;
-  int invertsurf = mparam.inverttrigs;
-
-  ofstream outfile (filename.c_str());
-
-  outfile.precision(6);
-  outfile.setf (ios::fixed, ios::floatfield);
-  outfile.setf (ios::showpoint);
-  
-  outfile << np << "\n";
-  
-  for (i = 1; i <= np; i++)
-    {
-      const Point3d & p = mesh.Point(i);
-      
-      outfile.width(10);
-      outfile << p.X() << " ";
-      outfile.width(9);
-      outfile << p.Y() << " ";
-      if (mesh.GetDimension() == 3)
-	{
-	  outfile.width(9);
-	  outfile << p.Z();
-	  }
-      outfile << "\n";
-    }
-
-  if (mesh.GetDimension() == 3)
-    {
-      outfile << ne << "\n";
-      for (i = 1; i <= ne; i++)
-	{
-	  Element el = mesh.VolumeElement(i);
-	  if (inverttets)
-	    el.Invert();
-	  outfile.width(4);
-	  outfile << el.GetIndex() << "  ";
-	  for (j = 1; j <= el.GetNP(); j++)
-	    {
-	      outfile << " ";
-	      outfile.width(8);
-	      outfile << el.PNum(j);
-	    }
-	  outfile << "\n";
-	}
-    }
-
-  outfile << nse << "\n";
-  for (i = 1; i <= nse; i++)
-    {
-      Element2d el = mesh.SurfaceElement(i);
-      if (invertsurf)
-	el.Invert();
-      outfile.width(4);
-      outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << "    ";
-      for (j = 1; j <= el.GetNP(); j++)
-	{
-	  outfile << " ";
-	  outfile.width(8);
-	  outfile << el.PNum(j);
-	}
-      outfile << "\n";
-    }
-
-
-  if (mesh.GetDimension() == 2)
-    {
-      outfile << nseg << "\n";
-      for (i = 1; i <= nseg; i++)
-	{
-	  const Segment & seg = mesh.LineSegment(i);
-	  outfile.width(4);
-	  outfile << seg.si << "    ";
-
-	  outfile << " ";
-	  outfile.width(8);
-	  outfile << seg.p1;
-	  outfile << " ";
-	  outfile.width(8);
-	  outfile << seg.p2;
-
-	  outfile << "\n";
-	}
-    }
-}
-
-
-
-
-
-
-
-
-
-void WriteSurfaceFormat (const Mesh & mesh,
-			 const string & filename)
-{
-  // surface mesh
-  int i, j;
-  
-  cout << "Write Surface Mesh" << endl;
-  
-  ofstream outfile (filename.c_str());
-  
-  outfile << "surfacemesh" << endl;
-  
-  outfile << mesh.GetNP() << endl;
-  for (i = 1; i <= mesh.GetNP(); i++)
-    {
-      for (j = 1; j <= 3; j++)
-	{
-	  outfile.width(10);
-	  outfile << mesh.Point(i).X(j) << " ";
-	}
-      outfile << endl;
-    }
-  outfile << mesh.GetNSE() << endl;
-  for (i = 1; i <= mesh.GetNSE(); i++)
-    {
-      for (j = 1; j <= 3; j++)
-	{
-	  outfile.width(8);
-	  outfile << mesh.SurfaceElement(i).PNum(j);
-	}
-      outfile << endl;
-    }
-}
-
-
-
-
-
-/*
- *  save surface mesh as STL file
- */
-
-void WriteSTLFormat (const Mesh & mesh,
-		     const string & filename)
-{
-  cout << "\nWrite STL Surface Mesh" << endl;
-  
-  ofstream outfile (filename.c_str());
-  
-  int i, j, k;
-  
-  outfile.precision(10);
-  
-  outfile << "solid" << endl;
-  
-  for (i = 1; i <= mesh.GetNSE(); i++)
-    {
-      outfile << "facet normal ";
-      const Point3d& p1 = mesh.Point(mesh.SurfaceElement(i).PNum(1));
-      const Point3d& p2 = mesh.Point(mesh.SurfaceElement(i).PNum(2));
-      const Point3d& p3 = mesh.Point(mesh.SurfaceElement(i).PNum(3));
-      
-      Vec3d normal = Cross(p2-p1,p3-p1);
-      if (normal.Length() != 0)
-	{
-	  normal /= (normal.Length());		  
-	}
-      
-      outfile << normal.X() << " " << normal.Y() << " " << normal.Z() << "\n";
-      outfile << "outer loop\n";
-      
-      outfile << "vertex " << p1.X() << " " << p1.Y() << " " << p1.Z() << "\n";
-      outfile << "vertex " << p2.X() << " " << p2.Y() << " " << p2.Z() << "\n";
-      outfile << "vertex " << p3.X() << " " << p3.Y() << " " << p3.Z() << "\n";
-      
-      outfile << "endloop\n";
-      outfile << "endfacet\n"; 
-    }
-  outfile << "endsolid" << endl;
-}
-
-
-
-
-
-/*
- *
- *  write surface mesh as VRML file
- *
- */
-
-void WriteVRMLFormat (const Mesh & mesh,
-		      bool faces,
-		      const string & filename)
-{
-
-  if (faces)
-
-    {
-      // Output in VRML, IndexedFaceSet is used 
-      // Bartosz Sawicki <sawickib@ee.pw.edu.pl>
-
-      int np = mesh.GetNP();
-      int nse = mesh.GetNSE();
-      int i, j, k, l;
-
-      ofstream outfile (filename.c_str());
-
-      outfile.precision(6);
-      outfile.setf (ios::fixed, ios::floatfield);
-      outfile.setf (ios::showpoint);
-
-      outfile << "#VRML V2.0 utf8 \n"
-	         "Background {\n"
-		 "    skyColor [1 1 1]\n"
-     		 "    groundColor [1 1 1]\n"
-		 "}\n"
-		 "Group{ children [\n"
-		 "Shape{ \n"
-		 "appearance Appearance { material Material { }} \n"
-                 "geometry IndexedFaceSet { \n"
-                 "coord Coordinate { point [ \n";  
-	        
-
-      for (i = 1; i <= np; i++)
-        {
-          const Point3d & p = mesh.Point(i);
-          outfile.width(10);
-          outfile << p.X() << " ";
-          outfile << p.Y() << " ";
-          outfile << p.Z() << " \n";
-	}
-
-      outfile << "  ] } \n"
-                 "coordIndex [ \n";               
-	
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-      
-	  for (j = 1; j <= 3; j++)
-	    {
-	      outfile.width(8);
-	      outfile << el.PNum(j)-1;
-	    }
-	  outfile << " -1 \n";
-	}
-      
-      outfile << "  ] \n";
-
-      //define number and RGB definitions of colors
-      outfile << "color Color { color [1 0 0, 0 1 0, 0 0 1, 1 1 0]} \n"
-                 "colorIndex [\n";
-      
-      for (i = 1; i <= nse; i++)
-	{
-	  outfile << mesh.GetFaceDescriptor(mesh.SurfaceElement(i).GetIndex ()).BCProperty();      
-          outfile << endl;
-	}
-      
-      outfile << " ] \n"
-                 "colorPerVertex FALSE \n"
-                 "creaseAngle 0 \n"
-		 "solid FALSE \n"
-                 "ccw FALSE \n"
-		 "convex TRUE \n"
-                 "} } # end of Shape\n"
-		 "] }\n";
-                         
-    } /* end of VRMLFACES */
-
-
-  else
-
-    {
-        // Output in VRML, IndexedLineSet is used
-	// Bartosz Sawicki <sawickib@ee.pw.edu.pl>
-
-      int np = mesh.GetNP();
-      int nse = mesh.GetNSE();
-      int i, j, k, l;
-
-      ofstream outfile (filename.c_str());
-
-      outfile.precision(6);
-      outfile.setf (ios::fixed, ios::floatfield);
-      outfile.setf (ios::showpoint);
-
-      outfile << "#VRML V2.0 utf8 \n"
-	         "Background {\n"
-		 "    skyColor [1 1 1]\n"
-     		 "    groundColor [1 1 1]\n"
-		 "}\n"
-		 "Group{ children [\n"
-	         "Shape{ \n"
-		 "appearance Appearance { material Material { }} \n"
-                 "geometry IndexedLineSet { \n"
-                 "coord Coordinate { point [ \n";  
-	        
-
-      for (i = 1; i <= np; i++)
-        {
-          const Point3d & p = mesh.Point(i);
-          outfile.width(10);
-          outfile << p.X() << " ";
-          outfile << p.Y() << " ";
-          outfile << p.Z() << " \n";
-	}
-
-      outfile << "  ] } \n"
-                 "coordIndex [ \n";               
-	
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-      
-	  for (j = 1; j <= 3; j++)
-	    {
-	      outfile.width(8);
-	      outfile << el.PNum(j)-1;
-	    }
-	  outfile.width(8);  
-	  outfile << el.PNum(1)-1; 
-	  outfile << " -1 \n";
-	}
-      
-      outfile << "  ] \n";
-
-/* Uncomment if you want color mesh    
-      outfile << "color Color { color [1 1 1, 0 1 0, 0 0 1, 1 1 0]} \n"
-                 "colorIndex [\n";
-      
-      for (i = 1; i <= nse; i++)
-	{
-	  outfile << mesh.GetFaceDescriptor(mesh.SurfaceElement(i).GetIndex ()).BCProperty();      
-          outfile << endl;
-	}
-      
-      outfile << " ] \n"
-*/ 
-      outfile << "colorPerVertex FALSE \n"
-                 "} } #end of Shape\n"
-		 "] } \n";
-                         
-    }
-
-}
-
-
-
-
-
-
-/*
- * FEPP .. a finite element package developed at University Linz, Austria
- */
-void WriteFEPPFormat (const Mesh & mesh,
-		      const CSGeometry & geom,
-		      const string & filename)
-{
-  
-  ofstream outfile (filename.c_str());
-
-  if (mesh.GetDimension() == 3)
-
-    {
-
-      // output for FEPP
-      
-      int np = mesh.GetNP();
-      int ne = mesh.GetNE();
-      int nse = mesh.GetNSE();
-      int ns = mesh.GetNFD();
-      int i, j;
-
-      outfile.precision(5);
-      outfile.setf (ios::fixed, ios::floatfield);
-      outfile.setf (ios::showpoint);
-      
-      outfile << "volumemesh4" << endl;
-      outfile << nse << endl;
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-
-	  //	  int facenr = mesh.facedecoding.Get(el.GetIndex()).surfnr;
-	  outfile.width(4);
-	  outfile << el.GetIndex() << " ";
-	  outfile.width(4);
-	  //	  outfile << mesh.GetFaceDescriptor(el.GetIndex()).BCProperty() << " ";
-	  outfile << mesh.GetFaceDescriptor(el.GetIndex()).BCProperty() << " ";
-	  outfile.width(4);
-	  outfile << el.GetNP() << "    ";
-	  for (j = 1; j <= el.GetNP(); j++)
-	    {
-	      outfile.width(8);
-	      outfile << el.PNum(j);
-	    }
-	  outfile << "\n";
-	}
-
-
-      outfile << ne << "\n";
-      for (i = 1; i <= ne; i++)
-	{
-	  const Element & el = mesh.VolumeElement(i);
-	  outfile.width(4);
-	  outfile << el.GetIndex() << " ";
-	  outfile.width(4);
-	  outfile << el.GetNP() << " ";
-	  for (j = 1; j <= el.GetNP(); j++)
-	    {
-	      outfile.width(8);
-	      outfile << el.PNum(j);
-	    }
-	  outfile << "\n";
-	}
-
-      outfile << np << "\n";
-      for (i = 1; i <= np; i++)
-	{
-	  const Point3d & p = mesh.Point(i);
-
-	  outfile.width(10);
-	  outfile << p.X() << " ";
-	  outfile.width(9);
-	  outfile << p.Y() << " ";
-	  outfile.width(9);
-	  outfile << p.Z() << "\n";
-	}
-
-      /*      
-      if (typ == WRITE_FEPPML)
-	{
-	  int nbn =  mesh.mlbetweennodes.Size();
-	  outfile << nbn << "\n";
-	  for (i = 1; i <= nbn; i++)
-	    outfile << mesh.mlbetweennodes.Get(i).I1() << " "
-		    << mesh.mlbetweennodes.Get(i).I2() << "\n";
-	  
-
-	  //	  int ncon = mesh.connectedtonode.Size();
-	  //	  outfile << ncon << "\n";
-	  //	  for (i = 1; i <= ncon; i++)
-	  //	    outfile << i << " " << mesh.connectedtonode.Get(i) << endl;
-	}
-      */
-
-
-      // write CSG surfaces
-      if (&geom && geom.GetNSurf() >= ns)
-	{
-	  outfile << ns << endl;
-	  for (i = 1; i <= ns; i++)
-	    geom.GetSurface(mesh.GetFaceDescriptor(i).SurfNr())->Print(outfile);
-	}
-      else 
-	outfile << "0" << endl;
-    }
-
-  
-  else
-    
-    { // 2D fepp format
-      
-      ;
-      /*
-      extern SplineGeometry2d * geometry2d;
-      if (geometry2d)
-	Save2DMesh (mesh, &geometry2d->GetSplines(), outfile);
-      else
-	Save2DMesh (mesh, 0, outfile);
-      */
-    }
-}
-
-
-
-
-
-
-/*
- *  Edge element mesh format
- *  points, elements, edges
- */
-
-void WriteEdgeElementFormat (const Mesh & mesh,
-			     const CSGeometry & geom,
-			     const string & filename)
-{
-  cout << "write edge element format" << endl;
-
-  const MeshTopology * top = &mesh.GetTopology();
-  int npoints = mesh.GetNP();
-  int nelements = mesh.GetNE();
-  int nsurfelem = mesh.GetNSE();
-  int nedges = top->GetNEdges();
-  int i, j;
-  
-  int inverttets = mparam.inverttets;
-  int invertsurf = mparam.inverttrigs;
-  ARRAY<int> edges;
-
-  ofstream outfile (filename.c_str());
-
-  outfile.precision(6);
-  outfile.setf (ios::fixed, ios::floatfield);
-  outfile.setf (ios::showpoint);
-
-
-  // vertices with coordinates  
-  outfile << npoints << "\n";
-  for (i = 1; i <= npoints; i++)
-    {
-      const Point3d & p = mesh.Point(i);
-      
-      outfile.width(10);
-      outfile << p.X() << " ";
-      outfile.width(9);
-      outfile << p.Y() << " ";
-      outfile.width(9);
-      outfile << p.Z() << "\n";
-    }
-
-  // element - edge - list
-  outfile << nelements << " " << nedges << "\n";
-  for (i = 1; i <= nelements; i++)
-    {
-      Element el = mesh.VolumeElement(i);
-      if (inverttets)
-      	el.Invert();
-      outfile.width(4);
-      outfile << el.GetIndex() << "  ";
-      outfile.width(8);
-      outfile << el.GetNP();
-      for (j = 1; j <= el.GetNP(); j++)
-	{
-	  outfile << " ";
-	  outfile.width(8);
-	  outfile << el.PNum(j);
-	}
-
-      top->GetElementEdges(i,edges);
-      outfile << endl << "      ";
-      outfile.width(8);
-      outfile << edges.Size();
-      for (j=1; j <= edges.Size(); j++)
-	{
-	  outfile << " ";
-	  outfile.width(8);
-	  outfile << edges[j-1];
-	}
-      outfile << "\n";
-
-      // orientation:
-      top->GetElementEdgeOrientations(i,edges);
-      outfile << "              ";
-      for (j=1; j <= edges.Size(); j++)
-	{
-	  outfile << " ";
-	  outfile.width(8);
-	  outfile << edges[j-1];
-	}
-      outfile << "\n";
-    }
-
-  // surface element - edge - list (with boundary conditions)
-  outfile << nsurfelem << "\n";
-  for (i = 1; i <= nsurfelem; i++)
-    {
-      Element2d el = mesh.SurfaceElement(i);
-      if (invertsurf)
-	el.Invert();
-      outfile.width(4);
-      outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << "  ";
-      outfile.width(8);
-      outfile << el.GetNP();
-      for (j = 1; j <= el.GetNP(); j++)
-	{
-	  outfile << " ";
-	  outfile.width(8);
-	  outfile << el.PNum(j);
-	}
-
-      top->GetSurfaceElementEdges(i,edges);
-      outfile << endl << "      ";
-      outfile.width(8);
-      outfile << edges.Size();
-      for (j=1; j <= edges.Size(); j++)
-	{
-	  outfile << " ";
-	  outfile.width(8);
-	  outfile << edges[j-1];
-	}
-      outfile << "\n";
-    }
-
-
-  int v1, v2;
-  // edge - vertex - list
-  outfile << nedges << "\n";
-  for (i=1; i <= nedges; i++)
-    {
-      top->GetEdgeVertices(i,v1,v2);
-      outfile.width(4);
-      outfile << v1;
-      outfile << " ";
-      outfile.width(8);
-      outfile << v2 << endl;
-    }
-}
-
-
-
-
-
-
-
-
-
-#ifdef OLDSTYLE_WRITE
-
-
-void WriteFile (int typ,
-		const Mesh & mesh,
-		const CSGeometry & geom,
-		const char * filename,
-		const char * geomfile,
-		double h)
-{
-
-  
-  int inverttets = mparam.inverttets;
-  int invertsurf = mparam.inverttrigs;
-
-
-
-
-
-
-
-
-  if (typ == WRITE_EDGEELEMENT)
-    {
-      // write edge element file
-      // Peter Harscher, ETHZ
-
-      cout << "Write Edge-Element Format" << endl;
-
-      ofstream outfile (filename);
-
-      int i, j;
-      int ned;
-
-      // hash table representing edges;
-      INDEX_2_HASHTABLE<int> edgeht(mesh.GetNP());
-
-      // list of edges
-      ARRAY<INDEX_2> edgelist;
-
-      // edge (point) on boundary ?
-      BitArray bedge, bpoint(mesh.GetNP());
-      
-      static int eledges[6][2] = { { 1, 2 } , { 1, 3 } , { 1, 4 },
-				   { 2, 3 } , { 2, 4 } , { 3, 4 } };
-
-      // fill hashtable   (point1, point2)  ---->  edgenr
-      for (i = 1; i <= mesh.GetNE(); i++)
-	{
-	  const Element & el = mesh.VolumeElement (i);
-	  INDEX_2 edge;
-	  for (j = 1; j <= 6; j++)
-	    {
-	      edge.I1() = el.PNum (eledges[j-1][0]);
-	      edge.I2() = el.PNum (eledges[j-1][1]);
-	      edge.Sort();
-
-	      if (!edgeht.Used (edge))
-		{
-		  edgelist.Append (edge);
-		  edgeht.Set (edge, edgelist.Size());
-		}
-	    }
-	}
-
-      
-      // set bedges, bpoints
-      bedge.SetSize (edgelist.Size());
-      bedge.Clear();
-      bpoint.Clear();
-
-      for (i = 1; i <= mesh.GetNSE(); i++)
-	{
-	  const Element2d & sel = mesh.SurfaceElement(i);
-	  for (j = 1; j <= 3; j++)
-	    {
-	      bpoint.Set (sel.PNum(j));
-
-	      INDEX_2 edge;
-	      edge.I1() = sel.PNum(j);
-	      edge.I2() = sel.PNum(j%3+1);
-	      edge.Sort();
-
-	      bedge.Set (edgeht.Get (edge));
-	    }
-	}
-
-
-
-      outfile << mesh.GetNE() << endl;
-      // write element ---> point
-      for (i = 1; i <= mesh.GetNE(); i++)
-	{
-	  const Element & el = mesh.VolumeElement(i);
-	  
-	  outfile.width(8);
-	  outfile << i;
-	  for (j = 1; j <= 4; j++)
-	    {
-	      outfile.width(8);
-	      outfile << el.PNum(j);
-	    }
-	  outfile << endl;
-	}
-
-      // write element ---> edge
-      for (i = 1; i <= mesh.GetNE(); i++)
-	{
-	  const Element & el = mesh.VolumeElement (i);
-	  INDEX_2 edge;
-	  for (j = 1; j <= 6; j++)
-	    {
-	      edge.I1() = el.PNum (eledges[j-1][0]);
-	      edge.I2() = el.PNum (eledges[j-1][1]);
-	      edge.Sort();
-
-	      outfile.width(8);
-	      outfile << edgeht.Get (edge);
-	    }
-	  outfile << endl;
-	}
-
-      // write points
-      outfile << mesh.GetNP() << endl;
-      outfile.precision (6);
-      for (i = 1; i <= mesh.GetNP(); i++)
-	{
-	  const Point3d & p = mesh.Point(i);
-	  
-	  for (j = 1; j <= 3; j++)
-	    {
-	      outfile.width(8);
-	      outfile << p.X(j);
-	    }
-	  outfile << "       "
-		  << (bpoint.Test(i) ? "1" : 0) << endl;
-	}
-
-      // write edges
-      outfile << edgelist.Size() << endl;
-      for (i = 1; i <= edgelist.Size(); i++)
-	{
-	  outfile.width(8);
-	  outfile << edgelist.Get(i).I1();
-	  outfile.width(8);
-	  outfile << edgelist.Get(i).I2();
-	  outfile << "       "
-		  << (bedge.Test(i) ? "1" : "0") << endl;
-	}
-    }
-
-
-
-
-}
-#endif
-}
diff --git a/contrib/Netgen/libsrc/interface/writeuser.hpp b/contrib/Netgen/libsrc/interface/writeuser.hpp
deleted file mode 100644
index afb2a6d5e3c0f1fbc000d0525662098a69fa1288..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writeuser.hpp
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef WRITEUSER
-#define WRITEUSER
-
-/**************************************************************************/
-/* File:    writeuser.hh                                                  */
-/* Authors: many                                                          */
-/* Date:    10. Dec. 97                                                   */
-/**************************************************************************/
-
-
-extern 
-void WriteFile (int typ,
-		const Mesh & mesh,
-		const CSGeometry & geom,
-		const char * filename,
-		const char * geomfile = NULL,
-		double h = 0);
-
-
-
-extern 
-void ReadFile (Mesh & mesh,
-	       const string & filename);
-
-extern 
-void ImportSolution (const char * filename);
-
-
-
-
-
-
-
-extern
-void WriteNeutralFormat (const Mesh & mesh,
-			 const CSGeometry & geom,
-			 const string & filename);
-
-extern
-void WriteSurfaceFormat (const Mesh & mesh,
-			 const string & filename);
-
-extern
-void WriteSTLFormat (const Mesh & mesh,
-		     const string & filename);
-
-extern
-void WriteVRMLFormat (const Mesh & mesh,
-		      bool faces,
-		      const string & filename);
-
-extern
-void WriteFEPPFormat (const Mesh & mesh,
-		      const CSGeometry & geom,
-		      const string & filename);
-
-extern
-void WriteGmshFormat (const Mesh & mesh,
-                         const CSGeometry & geom,
-                         const string & filename);
-
-extern
-void WriteUserChemnitz (const Mesh & mesh,
-			const string & filename);
-
-
-extern 
-void WriteDiffPackFormat (const Mesh & mesh,
-			  const CSGeometry & geom,
-			  const string & filename);
-
-extern
-void WriteTochnogFormat (const Mesh & mesh,
-			 const string & filename);
-
-extern
-void WriteTecPlotFormat (const Mesh & mesh,
-			 const CSGeometry & geom,
-			 const string & filename);
-
-extern
-void WriteAbaqusFormat (const Mesh & mesh,
-			const string & filename);
-
-extern
-void WriteFluentFormat (const Mesh & mesh,
-			const string & filename);
-
-extern
-void WritePermasFormat (const Mesh & mesh,
-			const string & filename);
-
-extern
-void WriteFEAPFormat (const Mesh & mesh,
-		      const string & filename);
-
-extern
-void WriteElmerFormat (const Mesh & mesh,
-		       const string & filename);
-
-
-extern
-void WriteEdgeElementFormat (const Mesh & mesh,
-			     const CSGeometry & geom,
-			     const string & filename);
-
-
-
-extern void RegisterUserFormats (ARRAY<const char*> & names);
-extern bool WriteUserFormat (const string & format, 	
-			     const Mesh & mesh,
-			     const CSGeometry & geom,
-			     const string & filename);
-#endif
diff --git a/contrib/Netgen/libsrc/interface/wuchemnitz.cpp b/contrib/Netgen/libsrc/interface/wuchemnitz.cpp
deleted file mode 100644
index 82a513d1ca73d73d94849225ceb6e4076a78825b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/wuchemnitz.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-// Write Chemnitz file format
-
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-
-class POINT3D
-  {
-  public:
-  POINT3D () { };
-  double x, y, z;
-  };
-
-class VOLELEMENT
-  {
-  public:
-  VOLELEMENT () {};
-  int domnr, p1, p2, p3, p4;
-  int faces[4];
-  };
-  
-class SURFELEMENT
-  {
-  public:
-  SURFELEMENT () { };
-  int snr, p1, p2, p3;
-  };
-  
-
-class FACE
-  {
-  public:
-  FACE () { };
-  int p1, p2, p3;
-  int edges[3];
-  };
-
-class EDGE
-  {
-  public:
-  EDGE () { };
-  int p1, p2;
-  };
-
-static ARRAY<POINT3D> points;
-static ARRAY<VOLELEMENT> volelements;
-static ARRAY<SURFELEMENT> surfelements;
-
-static ARRAY<FACE> faces;
-static ARRAY<EDGE> edges;
-
-
-void ReadFile (char * filename)
-  {
-  int i, n;
-  ifstream infile(filename);
-  char reco[100];
-  
-  
-  infile >> reco;  // file format recognition
-  
-  infile >> n;   // number of surface elements
-  cout << n << " Surface elements" << endl;
-  
-  for (i = 1; i <= n; i++)
-    {
-    SURFELEMENT sel;
-    infile >> sel.snr >> sel.p1 >> sel.p2 >> sel.p3;
-    surfelements.Append (sel);
-    }
-    
-  infile >> n;   // number of volume elements
-  cout << n << " Volume elements" << endl;
-  
-  for (i = 1; i <= n; i++)
-    {
-    VOLELEMENT el;
-    infile >> el.p1 >> el.p2 >> el.p3 >> el.p4;
-    volelements.Append (el);
-    }
-    
-  infile >> n;   // number of points 
-  cout << n << " Points" << endl;
-  
-  for (i = 1; i <= n; i++)
-    {
-    POINT3D p;
-    infile >> p.x >> p.y >> p.z;
-    points.Append (p);
-    }
-  }
-  
-  
-
-void ReadFileMesh (const Mesh & mesh)
-{
-  int i, n;
-  
-  n = mesh.GetNSE();   // number of surface elements
-  cout << n << " Surface elements" << endl;
-  
-  for (i = 1; i <= n; i++)
-    {
-      SURFELEMENT sel;
-      const Element2d & el = mesh.SurfaceElement(i);
-      sel.snr = el.GetIndex();
-      sel.p1 = el.PNum(1);
-      sel.p2 = el.PNum(2);
-      sel.p3 = el.PNum(3);
-      surfelements.Append (sel);
-    }
-    
-  n = mesh.GetNE();   // number of volume elements
-  cout << n << " Volume elements" << endl;
-  
-  for (i = 1; i <= n; i++)
-    {
-      VOLELEMENT el;
-      const Element & nel = mesh.VolumeElement(i);
-      el.p1 = nel.PNum(1);
-      el.p2 = nel.PNum(2);
-      el.p3 = nel.PNum(3);
-      el.p4 = nel.PNum(4);
-      //      infile >> el.p1 >> el.p2 >> el.p3 >> el.p4;
-      volelements.Append (el);
-    }
-    
-  n = mesh.GetNP();   // number of points 
-  cout << n << " Points" << endl;
-  
-  for (i = 1; i <= n; i++)
-    {
-      POINT3D p;
-      Point3d mp = mesh.Point(i);
-      p.x = mp.X();
-      p.y = mp.Y();
-      p.z = mp.Z();
-      //      infile >> p.x >> p.y >> p.z;
-      points.Append (p);
-    }
-  }
-  
-
-
-
-void Convert ()
-  {
-  int i, j, facei, edgei;
-  INDEX_3 i3;
-  INDEX_2 i2;
-
-  INDEX_3_HASHTABLE<int> faceindex(volelements.Size()/5 + 1);
-  INDEX_2_HASHTABLE<int> edgeindex(volelements.Size()/5 + 1);
-  
-  for (i = 1; i <= volelements.Size(); i++)
-    {
-    for (j = 1; j <= 4; j++)
-      {
-      switch (j)
-        {
-        case 1:
-          i3.I1() = volelements.Get(i).p2;
-          i3.I2() = volelements.Get(i).p3;
-          i3.I3() = volelements.Get(i).p4;
-          break;
-        case 2:
-          i3.I1() = volelements.Get(i).p1;
-          i3.I2() = volelements.Get(i).p3;
-          i3.I3() = volelements.Get(i).p4;
-          break;
-         case 3:
-          i3.I1() = volelements.Get(i).p1;
-          i3.I2() = volelements.Get(i).p2;
-          i3.I3() = volelements.Get(i).p4;
-          break;
-         case 4:
-          i3.I1() = volelements.Get(i).p1;
-          i3.I2() = volelements.Get(i).p2;
-          i3.I3() = volelements.Get(i).p3;
-          break;
-        }
-      i3.Sort();
-      if (faceindex.Used (i3)) 
-        facei = faceindex.Get(i3);
-      else
-        {
-        FACE fa;
-        fa.p1 = i3.I1();
-        fa.p2 = i3.I2();
-        fa.p3 = i3.I3();
-        facei = faces.Append (fa);
-        faceindex.Set (i3, facei);
-        } 
-        
-      volelements.Elem(i).faces[j-1] = facei;  
-      }    
-    
-    } 
- 
-
-  for (i = 1; i <= faces.Size(); i++)
-    {
-    for (j = 1; j <= 3; j++)
-      {
-      switch (j)
-        {
-        case 1:
-          i2.I1() = faces.Get(i).p2;
-          i2.I2() = faces.Get(i).p3;
-          break;
-        case 2:
-          i2.I1() = faces.Get(i).p1;
-          i2.I2() = faces.Get(i).p3;
-          break;
-         case 3:
-          i2.I1() = faces.Get(i).p1;
-          i2.I2() = faces.Get(i).p2;
-          break;
-        }
-      if (i2.I1() > i2.I2()) swap (i2.I1(), i2.I2());
-      if (edgeindex.Used (i2)) 
-        edgei = edgeindex.Get(i2);
-      else
-        {
-        EDGE ed;
-        ed.p1 = i2.I1();
-        ed.p2 = i2.I2();
-        edgei = edges.Append (ed);
-        edgeindex.Set (i2, edgei);
-        } 
-        
-      faces.Elem(i).edges[j-1] = edgei;  
-      }    
-    
-    }  
- 
-  }  
-  
-  
-void WriteFile (ostream & outfile)
-  {
-  int i;
-  
-  outfile 
-  	<< "#VERSION: 1.0" << endl
-  	<< "#PROGRAM: NETGEN" << endl
-  	<< "#EQN_TYPE: POISSON" << endl
-  	<< "#DIMENSION: 3D" << endl
-  	<< "#DEG_OF_FREE: 1" << endl
-  	<< "#DESCRIPTION: I don't know" << endl
-  	<< "##RENUM: not done" << endl
-  	<< "#USER: Kleinzen" << endl
-  	<< "DATE: 10.06.1996" << endl;
-  
-  outfile << "#HEADER:   8" << endl
-  	<< points.Size() << "  " << edges.Size() << "  " 
-  	<< faces.Size() << "  " << volelements.Size() << "  0  0  0  0" << endl;
-  
-  outfile << "#VERTEX:   " << points.Size() << endl;
-  for (i = 1; i <= points.Size(); i++)
-    outfile << "  " << i << "  " << points.Get(i).x << "  " << points.Get(i).y 
-    	<< "  " << points.Get(i).z << endl;
-    	
-  outfile << "#EDGE:  " << edges.Size() << endl;
-  for (i = 1; i <= edges.Size(); i++)
-    outfile << "  " << i << "  1  " 
-    	<< edges.Get(i).p1 << "  " 
-    	<< edges.Get(i).p2 
-    	<< "  0" << endl;
-    
-  outfile << "#FACE:  " << faces.Size() << endl;  
-  for (i = 1; i <= faces.Size(); i++)
-    outfile << "  " << i << "  1  3  " 
-    	<< faces.Get(i).edges[0] << "  " 
-    	<< faces.Get(i).edges[1] << "  " 
-    	<< faces.Get(i).edges[2] << endl;
-    	
-  outfile << "#SOLID:  " << volelements.Size() << endl;
-  for (i = 1; i <= volelements.Size(); i++)
-    outfile << "  " << i << "  1  4  " 
-    	<< volelements.Get(i).faces[0] << "  "
-    	<< volelements.Get(i).faces[1] << "  "
-    	<< volelements.Get(i).faces[2] << "  "
-    	<< volelements.Get(i).faces[3] << endl;
-    	
-  outfile << "#END_OF_DATA" << endl;
-  }
-    
-
-void WriteUserChemnitz (const Mesh & mesh,
-			const string & filename)
-{
-  ofstream outfile (filename.c_str());
-
-  ReadFileMesh (mesh);
-  Convert ();
-  
-  WriteFile (outfile);
-  cout << "Wrote Chemnitz standard file" << endl;
-}
-}
diff --git a/contrib/Netgen/libsrc/linalg/Makefile b/contrib/Netgen/libsrc/linalg/Makefile
deleted file mode 100644
index 0cb19b0932f492fbf213893e9b49f8c9510838f5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# Makefile for linear algebra library
-#
-src = basemat.cpp densemat.cpp vector.cpp sparsmat.cpp polynomial.cpp
-#
-lib = la
-libpath = libsrc/linalg
-#
-#
-include ../makefile.inc
-#
-
-
diff --git a/contrib/Netgen/libsrc/linalg/basemat.cpp b/contrib/Netgen/libsrc/linalg/basemat.cpp
deleted file mode 100644
index 889d79d668949b49d5d23b733867cfc7ce88ab6b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/basemat.cpp
+++ /dev/null
@@ -1,472 +0,0 @@
-#ifdef ABC
-
-#include <mystdlib.h>
-#include <linalg.hpp>
-
-
-// ofstream (*myerr) ("error.out");
-// ofstream (*myerr) ("NUL");
-
-
-namespace netgen
-{
-
-double BaseMatrix :: shit = 0;
-
-
-BaseMatrix :: BaseMatrix ()
-  {
-  height = width = 0;
-  symmetric = 0;
-  }
-
-BaseMatrix :: BaseMatrix (INDEX h, INDEX w)
-  {
-  if (!w) w = h;
-  height = h;
-  width = w;
-  symmetric = 0;
-  }
-
-void BaseMatrix :: SetSize (INDEX h, INDEX w)
-  {
-  if (!w) w = h;
-  height = h;
-  width = w;
-  }
-
-void BaseMatrix :: SetSymmetric (int sym)
-  {
-  symmetric = sym;
-  }
-
-double & BaseMatrix :: operator() (INDEX, INDEX)
-  {
-  (*myerr) << "BaseMatrix: operator() called" << endl;
-  return shit;
-  }
-
-double BaseMatrix :: operator() (INDEX, INDEX) const
-  {
-  (*myerr) << "BaseMatrix: operator() called" << endl;
-  return 0;
-  }
-
-
-
-ostream & operator<<(ostream & s, const BaseMatrix & m)
-  {
-  return m.Print (s);
-  }
-
-ostream & BaseMatrix :: Print (ostream & s) const
-  {
-  if (Symmetric()) s << "Symmetric" << endl;
-  for (INDEX i = 1; i <= Height(); i++)
-    {
-    for (INDEX j = 1; j < Width(); j++)
-      s << (*this)(i, j) << "  ";
-    s << (*this)(i, Width()) << endl;
-    }
-
-  return s;
-  }
-
-
-  /*
-TempVector BaseMatrix :: operator* (const Vector & v) const
-  {
-  Vector * prod = new Vector(Height());
-
-  if (Width() != v.Length())
-    {
-    (*myerr) << "\nMatrix and Vector don't fit 1" << endl;
-    }
-  else if (Height() != prod->Length())
-    {
-    (*myerr) << "Base_Matrix::operator*(Vector): prod vector not ok" << endl;
-    }
-  else
-    {
-    Mult (v, *prod);
-    }
-
-  return *prod;
-  }
-  */
-
-
-DenseMatrix operator* (const BaseMatrix & m1, const BaseMatrix & m2)
-  {
-  DenseMatrix temp (m1.Height(), m2.Width());
-  double sum;
-
-  if (m1.Width() != m2.Height())
-         {
-         (*myerr) << "BaseMatrix :: operator*: Matrix Size does not fit" << endl;
-         }
-  else if (temp.Height() != m1.Height())
-         {
-         (*myerr) << "BaseMatrix :: operator*: temp not allocated" << endl;
-    }
-  else
-    {
-    for (INDEX i = 1; i <= m1.Height(); i++)
-      for (INDEX j = 1; j <= m2.Width(); j++)
-        {
-        sum = 0;
-        for (INDEX k = 1; k <= m1.Width(); k++)
-          sum += m1(i, k) * m2(k, j);
-        temp(i, j) = sum;
-        }
-    }
-  return temp;
-  }
-
-
-DenseMatrix operator+ (const BaseMatrix & m1, const BaseMatrix & m2)
-  {
-  DenseMatrix temp (m1.Height(), m1.Width());
-  INDEX i, j;
-
-  if (m1.Width() != m2.Width() || m1.Height() != m2.Height())
-    {
-    (*myerr) << "BaseMatrix :: operator+: Matrix Size does not fit" << endl;
-    }
-  else if (temp.Height() != m1.Height())
-    {
-    (*myerr) << "BaseMatrix :: operator+: temp not allocated" << endl;
-    }
-  else
-    {
-    for (i = 1; i <= m1.Height(); i++)
-      for (j = 1; j <= m1.Width(); j++)
-        {
-        temp(i, j) = m1(i, j) + m2(i, j);
-        }
-    }
-  return temp;
-  }
-
-
-void BaseMatrix :: Mult (const FlatVector & /* v */,
-			 FlatVector & /* prod */) const
-  {
-    (*myerr) << "BaseMatrix :: Mult called" << endl;
-    double * x = 0;
-    *x = 1;
-    assert (1);
-  }
-
-void BaseMatrix :: MultTrans (const Vector &  v,
-      Vector & prod) const
-  {
-  if (Symmetric())
-    Mult (v, prod);
-  else
-    (*myerr) << "BaseMatrix :: MultTrans called for non symmetric matrix" << endl;
-  }
-
-void BaseMatrix :: Residuum (const Vector &  x,
-      const Vector & b, Vector & res) const
-  {
-  Mult (x, res);
-  res *= -1;
-  res.Add (1, b);
-  }
-
-void BaseMatrix :: ResiduumTrans (const Vector & x,
-      const Vector & b, Vector & res) const
-  {
-  MultTrans (x, res);
-  res *= -1;
-  res.Add (1, b);
-  }
-
-BaseMatrix * BaseMatrix :: Copy () const
-  {
-  (*myerr) << "BaseMatrix :: Copy called" << endl;
-  return NULL;
-  }
-
-
-Vector * BaseMatrix :: CreateVector () const
-  {
-  return new Vector (Height());
-  }
-
-
-
-/*
-void BaseMatrix :: Mult (const Vector & v, Vector & prod) const
-  {
-  double sum;
-
-  prod.SetLength (Height());
-
-  if (Width() != v.Length())
-    {
-    (*myerr) << "\nMatrix and Vector don't fit 2" << endl;
-    }
-  else if (Height() != prod.Length())
-    {
-    (*myerr) << "Base_Matrix::operator*(Vector): prod vector not ok" << endl;
-    }
-  else
-    {
-    for (INDEX i = 1; i <= Height(); i++)
-      {
-      sum = 0;
-
-      for (INDEX j = 1; j <= Width(); j++)
-        sum += (*this)(i,j) * v.Get(j);
-
-      prod.Set (i, sum);
-      }
-    }
-  }
-
-
-void BaseMatrix :: MultTrans (const Vector & v, Vector & prod) const
-  {
-  double sum;
-
-  prod.SetLength (Width());
-
-  if (Height() != v.Length())
-    {
-    (*myerr) << "\nMatrix and Vector don't fit 3" << endl;
-    }
-  else if (Width() != prod.Length())
-    {
-    (*myerr) << "Base_Matrix::operator*(Vector): prod vector not ok" << endl;
-    }
-  else
-    {
-    for (INDEX i = 1; i <= Width(); i++)
-      {
-      sum = 0;
-
-      for (INDEX j = 1; j <= Height(); j++)
-        sum += (*this)(j, i) * v.Get(j);
-
-      prod.Set (i, sum);
-      }
-    }
-  }
-
-
-void BaseMatrix :: Residuum (const Vector & x, const Vector & b, Vector & res) const
-  {
-  double sum;
-
-  res.SetLength (Height());
-
-  if (Width() != x.Length() || Height() != b.Length())
-    {
-    (*myerr) << "\nMatrix and Vector don't fit 4" << endl;
-    }
-  else if (Height() != res.Length())
-    {
-    (*myerr) << "Base_Matrix::operator*(Vector): prod vector not ok" << endl;
-    }
-  else
-    {
-    for (INDEX i = 1; i <= Height(); i++)
-      {
-      sum = b.Get(i);
-
-      for (INDEX j = 1; j <= Width(); j++)
-        sum -= (*this)(i,j) * x.Get(j);
-
-      res.Set (i, sum);
-      }
-    }
-  }
-*/
-
-
-
-
-
-
-
-void BaseMatrix :: SolveDestroy (const Vector & v, Vector & sol)
-  {
-  INDEX i, j, k;
-  double q;
-
-  if (Width() != Height())
-    {
-    (*myerr) << "SolveDestroy: Matrix not square";
-    return;
-    }
-  if (Width() != v.Size())
-    {
-    (*myerr) << "SolveDestroy: Matrix and Vector don't fit";
-    return;
-    }
-
-  sol = v;
-  if (Height() != sol.Size())
-    {
-    (*myerr) << "SolveDestroy: Solution Vector not ok";
-    return;
-    }
-
-  for (i = 1; i <= Height(); i++)
-    {
-    for (j = i+1; j <= Height(); j++)
-      {
-      q=(*this)(j,i) / (*this)(i,i);
-      for (k = i+1; k <= Height(); k++)
-        {
-        (*this)(j, k) -= q * (*this)(i,k);
-        }
-      sol.Elem(j) -= q * sol.Get(i);
-      }
-    }
-
-  for (i = Height(); i >= 1; i--)
-    {
-    q = sol.Elem(i);
-    for (j = i+1; j <= Height(); j++)
-      {
-      q -= (*this)(i,j) * sol.Get(j);
-      }
-    sol.Elem(i) = q / (*this)(i,i);
-    }
-  }
-
-void BaseMatrix :: Solve (const Vector & v, Vector & sol) const
-  {
-  BaseMatrix * temp = Copy();
-
-  if (temp->Height() != Height())
-    {
-    (*myerr) << "Solve: Matrix temp not allocated" << endl;
-    return;
-    }
-
-  temp->SolveDestroy (v, sol);
-
-  delete temp;
-  }
-
-
-  /*
-Vector BaseMatrix :: SolveDestroyFunc (const Vector & b) const
-{
-  return Vector(0);
-}
-*/
-
-
-Vector BaseMatrix :: Solve (const Vector & v) const
-  {
-  Vector sol (v.Size());
-
-  if (Width() != Height())
-    {
-    (*myerr) << "Solve: Matrix not square";
-    return v;
-    }
-  if (Width() != v.Size())
-    {
-    (*myerr) << "Solve: Matrix and Vector don't fit";
-    return v;
-    }
-  if (Width() != sol.Size())
-    {
-    (*myerr) << "Solve: Vector sol not allocated" << endl;
-    }
-
-  Solve (v, sol);
-
-  return sol;
-  }
-
-
-
-
-
-
-
-void BaseMatrix :: LU_Decomposition (DenseMatrix & l, DenseMatrix & u) const
-  {
-  INDEX i, j ,k;
-  double sum;
-  l.SetSize (Width());
-  u.SetSize (Width());
-
-  for (i = 1; i <= Width(); i++)
-    for (j = 1; j <= Width(); j++)
-      l(i, j) = u(i, j) = 0;
-
-  for (i = 1; i <= Width(); i++)
-    {
-    for (k = 1; k < i; k++)
-      {
-      sum = (*this)(i, k);
-      for (j = 1; j < k; j++)
-        sum -= l(i, j) * u(j, k);
-      l(i, k) = sum / u(k, k);
-      }
-    l(i, i) = 1;
-
-    for (k = i; k <= Width(); k++)
-      {
-      sum = (*this)(i, k);
-      for (j = 1; j < i; j++)
-        sum -= l(i, j) * u(j, k);
-      u(i, k) = sum;
-      }
-    }
-  }
-
-
-
-void Transpose (const BaseMatrix & m1, DenseMatrix & m2)
-  {
-  m2.SetSize (m1.Width(), m1.Height());
-  INDEX i, j;
-
-  for (i = 1; i <= m1.Height(); i++)
-    for (j = 1; j <= m1.Width(); j++)
-      m2(j, i) = m1(i, j);
-  }
-
-
-
-DenseMatrix * BaseMatrix :: MakeDenseMatrix () const
-{
-  DenseMatrix * dmat = new DenseMatrix (Height(), Width());
-  dmat -> SetSymmetric(Symmetric());
-
-  Vector x(Width()), y(Height());
-  INDEX i, j;
-
-  for (i = 1; i <= Width(); i++)
-    {
-      x = 0;
-      x.Elem(i) = 1;
-      Mult (x, y);
-      
-      for (j = 1; j <= Height(); j++)
-	dmat->Elem(j, i) = y.Get(j);
-    }
-
-  return dmat;
-}
- 
-
-BaseMatrix * BaseMatrix :: InverseMatrix (const BitArray * /* inner */) const
-{
-  (*mycout) << "called basematrix::inversemarix" << endl;
-  return NULL;
-}
-
-
-
-}
-#endif
diff --git a/contrib/Netgen/libsrc/linalg/basemat.hpp b/contrib/Netgen/libsrc/linalg/basemat.hpp
deleted file mode 100644
index d47abe790d2e04c4db695225edfa8196cb3c9a56..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/basemat.hpp
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifdef NONE
-
-#ifndef FILE_BASEMAT
-#define FILE_BASEMAT
-
-/**************************************************************************/
-/* File:   basemat.hh                                                     */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Oct. 94                                                    */
-/**************************************************************************/
-
-/* 
-   Base type for linear operator
-*/
-
-class DenseMatrix;
-
-///
-class BaseMatrix
-{
-protected:
-  ///
-  INDEX height, width;
-  ///
-  int symmetric;
-  ///
-  static double shit;
-
-public:
-  ///
-  BaseMatrix ();
-  ///
-  BaseMatrix (INDEX h, INDEX w = 0);
-  ///
-  virtual ~BaseMatrix () { };
-
-  ///
-  INDEX Width () const { return width; }
-  ///
-  INDEX Height () const { return height; }
-  ///
-  int Symmetric () const { return symmetric; }
-
-  ///
-  virtual void SetSize (INDEX h, INDEX w = 0);
-  ///
-  virtual void SetSymmetric (int sym = 1);
-
-  ///
-  virtual double & operator() (INDEX i, INDEX j);
-  ///
-  virtual double operator() (INDEX i, INDEX j) const;
-
-  ///
-  friend ostream & operator<<(ostream & s, const BaseMatrix & m);
-  ///
-  virtual ostream & Print (ostream & s) const;
-
-  ///
-  // TempVector operator* (const Vector & v) const;
-
-
-  ///
-  virtual void Mult (const FlatVector & v, FlatVector & prod) const;
-  ///
-  virtual void MultTrans (const Vector & v, Vector & prod) const;
-  ///
-  virtual void Residuum (const Vector & x, const Vector & b, Vector & res) const;
-  ///
-  virtual void ResiduumTrans (const Vector & x, const Vector & b, Vector & res) const;
-  //  virtual double EvaluateBilinearform (const Vector & x);
-
-  virtual BaseMatrix * Copy () const;
-  ///
-  virtual Vector * CreateVector () const;
-
-  ///
-  virtual void AddElementMatrix (const ARRAY<INDEX> & /* pnum */, 
-				 const BaseMatrix & /* elemmat */) { };
-  ///
-  virtual void MultElementMatrix (const ARRAY<INDEX> & /* pnum */, 
-				  const Vector & /* x */, Vector & /* y */) { };
-  ///
-  virtual void MultTransElementMatrix (const ARRAY<INDEX> & /* pnum */, 
-				       const Vector & /* x */, Vector & /* y */) { };
-
-
-  ///
-  virtual DenseMatrix * MakeDenseMatrix () const;
-  ///
-  virtual BaseMatrix * InverseMatrix (const class BitArray * inner = NULL)
-    const;
-
-  ///
-  virtual void SolveDestroy (const Vector & b, Vector & x);
-  ///
-  void Solve (const Vector & b, Vector & x) const;
-  ///
-  // virtual Vector SolveDestroyFunc (const Vector & b) const;
-  ///
-  Vector Solve (const Vector & b) const;
-  ///
-  virtual void LU_Decomposition (DenseMatrix & l, DenseMatrix & u) const;
-};
-
-
-#endif
-
-#endif
diff --git a/contrib/Netgen/libsrc/linalg/densemat.cpp b/contrib/Netgen/libsrc/linalg/densemat.cpp
deleted file mode 100644
index d15c123e0def9c824429fbce89dc763bba6bded3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/densemat.cpp
+++ /dev/null
@@ -1,1443 +0,0 @@
-#include <mystdlib.h>
-
-#include <linalg.hpp>
-
-
-namespace netgen
-{
-  DenseMatrix :: DenseMatrix () 
-  {
-    data = NULL;
-    height = 0;
-    width = 0;
-  }
-
-  DenseMatrix :: DenseMatrix (int h, int w)
-  {
-    if (!w) w = h;
-    width = w;
-    height = h;
-    if (h*w)
-      data = new double[h*w];
-    else 
-      data = 0;
-
-    for (int i = 0 ; i < (h * w); i++)
-      data[i] = 0;
-  }
-
-  /*
-  DenseMatrix :: DenseMatrix (int h, int w, const double * d) 
-    : BaseMatrix (h, w)
-  {
-  int size = h * w;  
-  int i;
-  
-  if (size)
-    {
-      data = new double[size]; 
-      for (i = 0; i < size; i++)
-	data[i] = d[i];
-    }
-  else
-    data = NULL;
-  }    
-  */
-
-  DenseMatrix :: DenseMatrix (const DenseMatrix & m2)
-  {
-    data = NULL;
-    SetSize (m2.Height(), m2.Width());
-    memcpy (data, m2.data, sizeof(double) * Height() * Width());
-  }
-
-  DenseMatrix :: ~DenseMatrix ()
-  {
-    delete [] data;
-  }
-  
-  
-  void DenseMatrix :: SetSize (int h, int w)
-  {
-    if (!w) w = h;
-    if (height == h && width == w) return;
-    
-    height = h;
-    width = w;
-    
-    delete[] data;
-    
-    if (h*w)  
-      data = new double[h*w];
-    else
-      data = NULL;
-  }
-
-
-  /*
-DenseMatrix & DenseMatrix :: operator= (const BaseMatrix & m2)
-  {
-  int i, j;
-
-  SetSize (m2.Height(), m2.Width());
-
-  if (data)
-    for (i = 1; i <= Height(); i++)
-      for (j = 1; j <= Width(); j++)
-        Set (i, j, m2(i, j));
-  else
-    (*myerr) << "DenseMatrix::Operator=: Matrix not allocated" << endl;
-
-  return *this;
-  }
-  */
-
-
-  DenseMatrix & DenseMatrix :: operator= (const DenseMatrix & m2)
-  {
-    SetSize (m2.Height(), m2.Width());
-    
-    if (data) memcpy (data, m2.data, sizeof(double) * m2.Height() * m2.Width());
-    return *this;
-  }
-
-
-  DenseMatrix & DenseMatrix :: operator+= (const DenseMatrix & m2)
-  {
-    int i;
-    double * p, * q;
-    
-    if (Height() != m2.Height() || Width() != m2.Width())
-    {
-      (*myerr) << "DenseMatrix::Operator+=: Sizes don't fit" << endl;
-      return *this;
-    }
-    
-    if (data)
-      {
-	p = data;
-	q = m2.data;
-	for (i = Width() * Height(); i > 0; i--)
-      {
-      *p += *q;
-      p++;
-      q++;
-      }
-    }
-  else
-    (*myerr) << "DenseMatrix::Operator+=: Matrix not allocated" << endl;
-
-  return *this;
-  }
-
-
-DenseMatrix & DenseMatrix :: operator-= (const DenseMatrix & m2)
-  {
-  int i;
-  double * p, * q;
-
-  if (Height() != m2.Height() || Width() != m2.Width())
-    {
-    (*myerr) << "DenseMatrix::Operator-=: Sizes don't fit" << endl;
-    return *this;
-    }
-
-  if (data)
-    {
-    p = data;
-    q = m2.data;
-    for (i = Width() * Height(); i > 0; i--)
-      {
-      *p -= *q;
-      p++;
-      q++;
-      }
-    }
-  else
-    (*myerr) << "DenseMatrix::Operator-=: Matrix not allocated" << endl;
-
-  return *this;
-  }
-
-
-
-
-  /*
-double & DenseMatrix :: operator() (int i, int j)
-{
-  if (i >= 1 && j >= 1 && i <= height && j <= width)
-    return Elem(i,j);
-  else (*myerr) << "DenseMatrix: index (" << i << "," << j << ") out of range (1.."
-		<< height << ",1.." << width << ")\n";
-  static double dummy = 0;
-  return dummy;
-}
-
-  double DenseMatrix :: operator() (int i, int j) const
-  {
-    if (i >= 1 && j >= 1 && i <= height && j <= width)
-      return Get(i,j);
-    else (*myerr) << "DenseMatrix: index (" << i << "," << j << ") out of range (1.."
-            << height << ",1.." << width << ")\n";
-
-    static double dummy = 0;
-    return dummy;
-  }
-  */
-
-DenseMatrix & DenseMatrix :: operator= (double v)
-  {
-  int i;
-  double * p = data;
-
-  if (data)
-    for (i = width*height; i > 0; i--, p++)
-      *p = v;
-
-  return *this;
-  }
-
-
-
-DenseMatrix & DenseMatrix :: operator*= (double v)
-  {
-  int i;
-  double * p = data;
-
-  if (data)
-    for (i = width*height; i > 0; i--, p++)
-      *p *= v;
-
-  return *this;
-  }
-
-
-double DenseMatrix :: Det () const
-  {
-  if (width != height)
-    {
-    (*myerr) << "DenseMatrix :: Det: width != height" << endl;
-    return 0;
-    }
-
-  switch (width)
-    {
-    case 1: return Get(1, 1);
-    case 2: return Get(1) * Get(4) - Get(2) * Get(3);
-
-    case 3: return Get(1) * Get(5) * Get(9)
-                 + Get(2) * Get(6) * Get(7)
-                 + Get(3) * Get(4) * Get(8)
-                 - Get(1) * Get(6) * Get(8)
-                 - Get(2) * Get(4) * Get(9)
-                 - Get(3) * Get(5) * Get(7);
-    default:
-      {
-      (*myerr) << "Matrix :: Det:  general size not implemented (size=" << width << ")" << endl;
-      return 0;
-      }
-    }
-  }
-
-
-void CalcInverse (const DenseMatrix & m1, DenseMatrix & m2)
-  {
-    //  int i, j, k, n;
-  double det;
-  //  DenseMatrix m1 = hm1;
-
-  if (m1.width != m1.height)
-    {
-    (*myerr) << "CalcInverse: matrix not symmetric" << endl;
-    return;
-    }
-  if (m1.width != m2.width || m1.height != m2.height)
-    {
-    (*myerr) << "CalcInverse: dim(m2) != dim(m1)" << endl;
-    return;
-    }
-
-
-  if (m1.Width() <= 3)
-    {
-    det = m1.Det();
-    if (det == 0)
-      {
-      (*myerr) << "CalcInverse: Matrix singular" << endl;
-      return;
-      }
-
-    det = 1e0 / det;
-    switch (m1.width)
-      {
-      case 1:
-        {
-        m2.Set(1, 1, det);
-        return;
-        }
-      case 2:
-        {
-        m2.Set(1, 1, det * m1.Get(4));
-        m2.Set(2, 2, det * m1.Get(1));  
-        m2.Set(1, 2, - det * m1.Get(2));
-        m2.Set(2, 1, - det * m1.Get(3));
-        return;
-        }
-      case 3:
-        {
-        m2.Set(1, 1,  det * (m1.Get(5) * m1.Get(9) - m1.Get(6) * m1.Get(8)));
-        m2.Set(2, 1, -det * (m1.Get(4) * m1.Get(9) - m1.Get(6) * m1.Get(7)));
-        m2.Set(3, 1,  det * (m1.Get(4) * m1.Get(8) - m1.Get(5) * m1.Get(7)));
-
-        m2.Set(1, 2, -det * (m1.Get(2) * m1.Get(9) - m1.Get(3) * m1.Get(8)));
-        m2.Set(2, 2,  det * (m1.Get(1) * m1.Get(9) - m1.Get(3) * m1.Get(7)));
-        m2.Set(3, 2, -det * (m1.Get(1) * m1.Get(8) - m1.Get(2) * m1.Get(7)));
-
-        m2.Set(1, 3,  det * (m1.Get(2) * m1.Get(6) - m1.Get(3) * m1.Get(5)));
-        m2.Set(2, 3, -det * (m1.Get(1) * m1.Get(6) - m1.Get(3) * m1.Get(4)));
-        m2.Set(3, 3,  det * (m1.Get(1) * m1.Get(5) - m1.Get(2) * m1.Get(4)));
-        return;
-        }
-      }
-    }
-    
-  else
-    {
-      int i, j, k, n;
-      n = m1.Height();
-      
-
-#ifdef CHOL
-      int dots = (n > 200);
-
-      // Cholesky
-      
-      double x;
-      Vector p(n);
-
-      m2 = m1;
-      /*
-      m2.SetSymmetric();
-      if (!m2.Symmetric())
-	cerr << "m should be symmetric for Cholesky" << endl;
-      */
-
-      for (i = 1; i <= n; i++)
-	for (j = 1; j < i; j++)
-	  m2.Elem(j, i) = m2.Get(i, j);
-      
-      for (i = 1; i <= n; i++)
-	{
-	  if (dots && i % 10 == 0)
-	    (*mycout) << "." << flush;
-
-	  for (j = i; j <= n; j++)
-	    {
-	      x = m2.Get(i, j);
-
-	      const double * pik = &m2.Get(i, 1);
-	      const double * pjk = &m2.Get(j, 1);
-
-	      for (k = i-2; k >= 0; --k, ++pik, ++pjk)
-		x -= (*pik) * (*pjk);
-		  
-	      // for (k = i-1; k >= 1; --k)
-	      //   x -= m2.Get(j, k) * m2.Get(i, k);
-
-	      if (i == j)
-		{
-		  if (x <= 0)
-		    {
-		      cerr << "Matrix indefinite 1" << endl;
-		      return;
-		    }
-		  
-		  p.Elem(i) = 1 / sqrt(x);
-		}
-	      else
-		{
-		  m2.Elem(j, i) = x * p.Get(i);
-		}
-	    }
-	}
-
-      for (i = 1; i <= n; i++)
-	m2.Elem(i, i) = 1 / p.Get(i);
-
-      // check: A = L L^t
-
-//       for (i = 1; i <= n; i++)
-// 	for (j = 1; j <= n; j++)
-// 	  {
-// 	    x = 0;
-// 	    for (k = 1; k <= i && k <= j; k++)
-// 	      x += m2.Get(i, k) * m2.Get(j, k);
-// 	    (*testout) << "err " << i << "," << j << " = " << (m1.Get(i, j) - x) << endl;
-// 	  }
-
-
-      
-      // calc L^{-1}, store upper triangle
-      
-      //      DenseMatrix hm(n);
-      //      hm = m2;
-
-      for (i = 1; i <= n; i++)
-	{
-	  if (dots && i % 10 == 0)
-	    (*mycout) << "+" << flush;
-
-	  for (j = i; j <= n; j++)
-	    {
-	      x = 0;
-	      if (j == i) x = 1;
-
-	      const double * pjk = &m2.Get(j, i);
-	      const double * pik = &m2.Get(i, i);
-	      for (k = i; k < j; k++, ++pjk, ++pik)
-		x -= *pik * *pjk;
-
-	      //  for (k = i; k < j; k++)
-	      //  x -= m2.Get(j, k) * m2.Get(i, k);
-
-	      m2.Elem(i, j) = x / m2.Get(j, j);
-	    }
-	}
-      
-//      (*testout) << "check L^-1" << endl;
-//      for (i = 1; i <= n; i++)
-// 	for (j = 1; j <= n; j++)
-// 	  {
-// 	    x = 0;
-// 	    for (k = j; k <= i; k++)
-// 	      x += hm.Get(i, k) * m2.Get(j, k);
-// 	    (*testout) << "i, j = " << i << "," << j << " x = " << x << endl;
-// 	  }
-
-
-      // calc A^-1 = L^-T * L^-1
-
-      for (i = 1; i <= n; i++)
-	{
-	  if (dots && i % 10 == 0)
-	    (*mycout) << "-" << flush;
-
-	  for (j = 1; j <= i; j++)
-	    {
-	      x = 0;
-	      k = i;
-	      if (j > i) k = j;
-
-	      const double * pik = &m2.Get(i, k);
-	      const double * pjk = &m2.Get(j, k);
-
-	      for ( ; k <= n; ++k, ++pik, ++pjk)
-		x += *pik * *pjk;
-	      // for (  ; k <= n; k++)
-	      //   x += m2.Get(i, k) * m2.Get(j, k);
-	      
-	      m2.Elem(i, j) = x;
-	    }
-	}
-	  
-      for (i = 1; i <= n; i++)
-	for (j = 1; j < i; j++)
-	  m2.Elem(j, i) = m2.Get(i, j);
-      
-      if (dots) (*mycout) << endl;
-#endif
-
-
-
-      // Gauss - Jordan - algorithm
-      
-      int r, hi;
-      double max, hr;
-      
-
-      ARRAY<int> p(n);   // pivot-permutation
-      Vector hv(n);
-    
-      
-      m2 = m1;
-
-      /*      
-      if (m2.Symmetric())
-	for (i = 1; i <= n; i++)
-	  for (j = 1; j < i; j++)
-	    m2.Elem(j, i) = m2.Get(i, j);
-      */
-      
-    // Algorithm of Stoer, Einf. i. d. Num. Math, S 145
-      
-      for (j = 1; j <= n; j++)
-	p.Set(j, j);
-      
-      for (j = 1; j <= n; j++)
-	{
-	  // pivot search
-	  
-	  max = fabs(m2.Get(j, j));
-	  r = j;
-	  
-	  for (i = j+1; i <= n ;i++)
-	    if (fabs (m2.Get(i, j)) > max)
-	      {
-		r = i;
-		max = fabs (m2.Get(i, j));
-	      }
-	  
-	  if (max < 1e-20)
-	    {
-	      cerr << "Inverse matrix: matrix singular" << endl;
-	      return;
-	    }
-	  
-	  r = j;
-	  
-	  // exchange rows
-	  if (r > j)
-	    {
-	      for (k = 1; k <= n; k++)
-		{
-		  hr = m2.Get(j, k);
-		  m2.Elem(j, k) = m2.Get(r, k);
-		  m2.Elem(r, k) = hr;
-		}
-	      hi = p.Get(j);
-	      p.Elem(j) = p.Get(r);
-	      p.Elem(r) = hi;
-	    }
-	  
-	  
-	  // transformation
-	  
-	  hr = 1 / m2.Get(j, j);
-	  for (i = 1; i <= n; i++)
-	    m2.Elem(i, j) *= hr;
-	  m2.Elem(j, j) = hr;
-	  
-	  for (k = 1; k <= n; k++)
-	    if (k != j)
-	      {
-		for (i = 1; i <= n; i++)
-		  if (i != j)
-		    m2.Elem(i, k) -= m2.Elem(i, j) * m2.Elem(j, k);
-		m2.Elem(j, k) *= -hr;
-	      }
-	}
-      
-      // col exchange
-      
-      for (i = 1; i <= n; i++)
-	{
-	  for (k = 1; k <= n; k++)
-	    hv.Elem(p.Get(k)) = m2.Get(i, k);
-	  for (k = 1; k <= n; k++)
-	    m2.Elem(i, k) = hv.Get(k);
-	}
-
-
-
-    /*
-    if (m1.Symmetric())
-      for (i = 1; i <= n; i++)
-	for (j = 1; j < i; j++)
-	  m1.Elem(j, i) = m1.Get(i, j);
-
-    m2 = 0;
-    
-    for (i = 1; i <= n; i++)
-      m2.Elem(i, i) = 1;
-      
-    for (i = 1; i <= n; i++)
-      {
-	//	(*mycout) << '.' << flush;
-      q = m1.Get(i, i);
-      for (k = 1; k <= n; k++)
-        {
-        m1.Elem(i, k) /= q;
-        m2.Elem(i, k) /= q;
-        }
-        
-      for (j = i+1; j <= n; j++)
-        {
-        q = m1.Elem(j, i);
-
-	double * m1pi = &m1.Elem(i, i);
-	double * m1pj = &m1.Elem(j, i);
-
-	for (k = n; k >= i; --k, ++m1pi, ++m1pj)
-	    *m1pj -= q * (*m1pi);
-
-	double * m2pi = &m2.Elem(i, 1);
-	double * m2pj = &m2.Elem(j, 1);
-
-	for (k = i; k > 0; --k, ++m2pi, ++m2pj)
-	    *m2pj -= q * (*m2pi);
-
-	    //        for (k = 1; k <= n; k++)  
-	    //          {
-	    //          m1.Elem(j, k) -= q * m1.Elem(i, k);
-	    //          m2.Elem(j, k) -= q * m2.Elem(i, k);
-	    //          }
-	  
-        }
-      }  
-            
-    for (i = n; i >= 1; i--)
-      {
-	//	(*mycout) << "+" << flush;
-	for (j = 1; j < i; j++)
-	  {
-	    q = m1.Elem(j, i);
-
-	    double * m2pi = &m2.Elem(i, 1);
-	    double * m2pj = &m2.Elem(j, 1);
-
-	    for (k = n; k > 0; --k, ++m2pi, ++m2pj)
-	      *m2pj -= q * (*m2pi);	    
-
-	    
-	    //	    for (k = 1; k <= n; k++)
-	    //	      {
-	    //		m1.Elem(j, k) -= q * m1.Elem(i, k);
-	    //		m2.Elem(j, k) -= q * m2.Elem(i, k);
-	    //	      }    
-	  }         
-      }
-
-    if (m2.Symmetric())
-      {
-	for (i = 1; i <= n; i++)
-	  for (j = 1; j < i; j++)
-	    m2.Elem(i, j) = m2.Elem(j, i);
-      }
-*/
-    }
-  }
-
-
-void CalcAAt (const DenseMatrix & a, DenseMatrix & m2)
-  {
-  int n1 = a.Height();
-  int n2 = a.Width();
-  int i, j, k;
-  double sum;
-  const double *p, *q, *p0;
-
-  if (m2.Height() != n1 || m2.Width() != n1)
-    {
-    (*myerr) << "CalcAAt: sizes don't fit" << endl;
-    return;
-    }
-
-  for (i = 1; i <= n1; i++)
-    {
-    sum = 0;
-    p = &a.ConstElem(i, 1);
-    for (k = 1; k <= n2; k++)
-      {
-      sum += *p * *p;
-      p++;
-      }
-    m2.Set(i, i, sum);
-
-    p0 = &a.ConstElem(i, 1);
-    q = a.data;
-    for (j = 1; j < i; j++)
-      {
-      sum = 0;
-      p = p0;
-
-      for (k = 1; k <= n2; k++)
-        {
-        sum += *p * *q;
-        p++;
-        q++;
-        }
-      m2.Set(i, j, sum);
-      m2.Set(j, i, sum);
-      }
-    }
-  }
-
-
-
-#ifdef ABC
-BaseMatrix * DenseMatrix :: InverseMatrix (const BitArray * /* inner */) const
-{
-  if (Height() != Width())
-    {
-      (*myerr) << "BaseMatrix::InverseMatrix(): Matrix not symmetric" << endl;
-      return new DenseMatrix(1);
-    }
-  else
-    {
-      if (Symmetric())
-	{	
-	  (*mycout) << "Invmat not available" << endl;
-	  BaseMatrix * invmat = NULL;
-	  return invmat;
-	}
-
-      DenseMatrix * invmat = new DenseMatrix (Height());
-
-      CalcInverse (*this, *invmat);
-      return invmat;
-    }
-}
-#endif
-
-
-
-void CalcAtA (const DenseMatrix & a, DenseMatrix & m2)
-  {
-  int n1 = a.Height();
-  int n2 = a.Width();
-  int i, j, k;
-  double sum;
-
-  if (m2.Height() != n2 || m2.Width() != n2)
-    {
-    (*myerr) << "CalcAtA: sizes don't fit" << endl;
-    return;
-    }
-
-  for (i = 1; i <= n2; i++)
-    for (j = 1; j <= n2; j++)
-      {
-      sum = 0;
-      for (k = 1; k <= n1; k++)
-        sum += a.Get(k, i) * a.Get(k, j);
-      m2.Elem(i, j) = sum;
-      }
-  }
-
-
-
-
-
-
-void CalcABt (const DenseMatrix & a, const DenseMatrix & b, DenseMatrix & m2)
-  {
-  int n1 = a.Height();
-  int n2 = a.Width();
-  int n3 = b.Height();
-  int i, j, k;
-  double sum;
-
-  if (m2.Height() != n1 || m2.Width() != n3 || b.Width() != n2)
-    {
-    (*myerr) << "CalcABt: sizes don't fit" << endl;
-    return;
-    }
-
-  double * pm2 = &m2.Elem(1, 1);
-  const double * pa1 = &a.Get(1, 1);
-
-  for (i = 1; i <= n1; i++)
-    {
-      const double * pb = &b.Get(1, 1);
-      for (j = 1; j <= n3; j++)
-	{
-	  sum = 0;
-	  const double * pa = pa1;
-	  
-	  for (k = 1; k <= n2; k++)
-	    {
-	      sum += *pa * *pb;
-	      pa++; pb++;
-	    }
-	  
-	  *pm2 = sum;
-	  pm2++;
-	}
-      pa1 += n2;
-    }
-  }
-
-
-void CalcAtB (const DenseMatrix & a, const DenseMatrix & b, DenseMatrix & m2)
-  {
-  int n1 = a.Height();
-  int n2 = a.Width();
-  int n3 = b.Width();
-  int i, j, k;
-
-  if (m2.Height() != n2 || m2.Width() != n3 || b.Height() != n1)
-    {
-    (*myerr) << "CalcAtB: sizes don't fit" << endl;
-    return;
-    }
-
-  for (i = 1; i <= n2 * n3; i++)
-    m2.data[i-1] = 0;
-
-  for (i = 1; i <= n1; i++)
-    for (j = 1; j <= n2; j++)
-      {
-	const double va = a.Get(i, j);
-	double * pm2 = &m2.Elem(j, 1);
-	const double * pb = &b.Get(i, 1);
-
-	for (k = 1; k <= n3; ++k, ++pm2, ++pb)
-	  *pm2 += va * *pb;
-	//	for (k = 1; k <= n3; k++)
-	//	  m2.Elem(j, k) += va * b.Get(i, k);
-      }
-  /*
-  for (i = 1; i <= n2; i++)
-    for (j = 1; j <= n3; j++)
-      {
-	sum = 0;
-	for (k = 1; k <= n1; k++)
-	  sum += a.Get(k, i) * b.Get(k, j);
-	m2.Elem(i, j) = sum;
-      }
-      */
-  }
-
-
-
-
-
-
-
-DenseMatrix operator* (const DenseMatrix & m1, const DenseMatrix & m2)
-  {
-  DenseMatrix temp (m1.Height(), m2.Width());
-
-  if (m1.Width() != m2.Height())
-    {
-    (*myerr) << "DenseMatrix :: operator*: Matrix Size does not fit" << endl;
-    }
-  else if (temp.Height() != m1.Height())
-    {
-    (*myerr) << "DenseMatrix :: operator*: temp not allocated" << endl;
-    }
-  else
-    {
-    Mult (m1, m2, temp);
-    }
-  return temp;
-  }
-
-
-void Mult (const DenseMatrix & m1, const DenseMatrix & m2, DenseMatrix & m3)
-  {
-  double sum;
-  double *p1, *p1s, *p1sn, *p1snn, *p2, *p2s, *p2sn, *p3;
-
-  if (m1.Width() != m2.Height() || m1.Height() != m3.Height() ||
-       m2.Width() != m3.Width() )
-    {
-    (*myerr) << "DenseMatrix :: Mult: Matrix Size does not fit" << endl;
-    (*myerr) << "m1: " << m1.Height() << " x " << m1.Width() << endl;
-    (*myerr) << "m2: " << m2.Height() << " x " << m2.Width() << endl;
-    (*myerr) << "m3: " << m3.Height() << " x " << m3.Width() << endl;
-    return;
-    }
-  /*
-  else if (m1.Symmetric() || m2.Symmetric() || m3.Symmetric())
-    {
-    (*myerr) << "DenseMatrix :: Mult: not implemented for symmetric matrices" << endl;
-    return;
-    }
-  */
-  else
-    {
-      //      int i, j, k;
-      int n1 = m1.Height();
-      int n2 = m2.Width();
-      int n3 = m1.Width();
-
-      /*
-      for (i = n1 * n2-1; i >= 0; --i)
-	m3.data[i] = 0;
-
-      const double * pm1 = &m1.Get(1, 1);
-      for (i = 1; i <= n1; i++)
-	{
-	  const double * pm2 = &m2.Get(1, 1);
-	  double * pm3i = &m3.Elem(i, 1);
-
-	  for (j = 1; j <= n3; j++)
-	    {
-	      const double vm1 = *pm1;
-	      ++pm1;
-	      //	      const double vm1 = m1.Get(i, j);
-	      double * pm3 = pm3i;
-	      //	      const double * pm2 = &m2.Get(j, 1);
-
-	      for (k = 0; k < n2; k++)
-		{
-		  *pm3 += vm1 * *pm2;
-		  ++pm2;
-		  ++pm3;
-		}
-
-	    //	    for (k = 1; k <= n2; k++)
-	    //	      m3.Elem(i, k) += m1.Get(i, j) * m2.Get(j, k);
-	    }
-	}
-	*/
-
-      /*
-      for (i = 1; i <= n1; i++)
-	for (j = 1; j <= n2; j++)
-	  {
-	    sum = 0;
-	    for (k = 1; k <= n3; k++)
-	      sum += m1.Get(i, k) * m2.Get(k, j);
-	    m3.Set(i, j, sum);
-	  }
-	  */
-
-
-      /*
-      for (i = 1; i <= n1; i++)
-	{
-	  const double pm1i = &m1.Get(i, 1);
-	  const double pm2j = &m2.Get(1, 1);
-
-	  for (j = 1; j <= n2; j++)
-	    {
-	      double sum = 0;
-	      const double * pm1 = pm1i;
-	      const double * pm2 = pm2j;
-	      pm2j++;
-
-	      for (k = 1; k <= n3; k++)
-		{
-		  sum += *pm1 * *pm2;
-		  ++pm1;
-		  pm2 += n2;
-		}
-	      
-	      m3.Set (i, j, sum);
-	    }
-	}
-	*/
-
-
-      p3 = m3.data;
-      p1s = m1.data;
-      p2sn = m2.data + n2;
-      p1snn = p1s + n1 * n3;
-
-      while (p1s != p1snn)
-	{
-	  p1sn = p1s + n3;
-	  p2s = m2.data;
-	  
-	  while (p2s != p2sn)
-	    {
-	      sum = 0;
-	      p1 = p1s;
-	      p2 = p2s;
-	      p2s++;
-
-	      while (p1 != p1sn)
-		{
-		  sum += *p1 * *p2;
-		  p1++;
-		  p2 += n2;
-		}
-	      *p3++ = sum;
-	    }
-	  p1s = p1sn;
-	}
-    }
-  }  
-
-
-
-DenseMatrix operator+ (const DenseMatrix & m1, const DenseMatrix & m2)
-  {
-  DenseMatrix temp (m1.Height(), m1.Width());
-  int i, j;
-
-  if (m1.Width() != m2.Width() || m1.Height() != m2.Height())
-    {
-    (*myerr) << "BaseMatrix :: operator+: Matrix Size does not fit" << endl;
-    }
-  else if (temp.Height() != m1.Height())
-    {
-    (*myerr) << "BaseMatrix :: operator+: temp not allocated" << endl;
-    }
-  else
-    {
-    for (i = 1; i <= m1.Height(); i++)
-      for (j = 1; j <= m1.Width(); j++)
-        {
-        temp.Set(i, j, m1.Get(i, j) + m2.Get(i, j));
-        }
-    }
-  return temp;
-  }
-
-
-
-
-void Transpose (const DenseMatrix & m1, DenseMatrix & m2)
-{
-  int w = m1.Width();
-  int h = m1.Height();
-  int i, j;
-
-  m2.SetSize (w, h);
-
-  double * pm2 = &m2.Elem(1, 1);
-  for (j = 1; j <= w; j++)
-    {
-      const double * pm1 = &m1.Get(1, j);
-      for (i = 1; i <= h; i++)
-	{
-	  *pm2 = *pm1;
-	  pm2 ++;
-	  pm1 += w;
-	}
-    }
-}
-
-
-/*
-void DenseMatrix :: Mult (const Vector & v, Vector & prod) const
-  {
-  double sum, val;
-  const double * mp, * sp;
-  double * dp;
-  // const Vector & v = bv.CastToVector();
-  // Vector & prod = bprod.CastToVector();
-  
-
-  int n = Height();
-  int m = Width();
-
-  if (prod.Size() != n)
-    prod.SetSize (n);
-
-#ifdef DEVELOP
-  if (!n) 
-    {
-      cout << "DenseMatrix::Mult  mheight = 0" << endl;
-    }
-  if (!m) 
-    {
-      cout << "DenseMatrix::Mult mwidth = 0" << endl;
-    }
-
-  if (m != v.Size())
-    {
-    (*myerr) << "\nMatrix and Vector don't fit" << endl;
-    }
-  else if (Height() != prod.Size())
-    {
-    (*myerr) << "Base_Matrix::operator*(Vector): prod vector not ok" << endl;
-    }
-  else
-#endif
-    {
-      if (Symmetric())
-	{
-	  int i, j;
-
-
-	  for (i = 1; i <= n; i++)
-	    {
-	      sp = &v.Get(1);
-	      dp = &prod.Elem(1);
-	      mp = &Get(i, 1);
-
-	      val = v.Get(i);
-	      sum = Get(i, i) * val;
-
-	      for (j = 1; j < i; ++j, ++mp, ++sp, ++dp)
-		{
-		  sum += *mp * *sp;
-		  *dp += val * *mp;
-		}
-
-	      prod.Elem(i) = sum;
-	    }
-	}
-      else
-	{
-	  mp = data;
-	  dp = &prod.Elem(1);
-	  for (int i = 1; i <= n; i++)
-	    {
-	      sum = 0;
-	      sp = &v.Get(1);
-	      
-	      for (int j = 1; j <= m; j++)
-		{
-		  //        sum += Get(i,j) * v.Get(j);
-		  sum += *mp * *sp;
-		  mp++;
-		  sp++;
-		}
-	      
-	      //      prod.Set (i, sum);
-	      *dp = sum;
-	      dp++;
-	    }
-	}
-    }
-  }
-*/
-
-void DenseMatrix :: MultTrans (const Vector & v, Vector & prod) const
-{
-  // const Vector & v = (const Vector&)bv; // .CastToVector();
-  // Vector & prod = (Vector & )bprod;     // .CastToVector();
-
-  /*
-  if (Height() != v.Size())
-    {
-    (*myerr) << "\nMatrix and Vector don't fit" << endl;
-    }
-  else if (Width() != prod.Size())
-    {
-    (*myerr) << "Base_Matrix::operator*(Vector): prod vector not ok" << endl;
-    }
-  else
-  */
-    {
-      int i, j;
-      int w = Width(), h = Height();
-      if (prod.Size() != w)
-	prod.SetSize (w);
-
-      const double * pmat = &Get(1, 1);
-      const double * pv = &v.Get(1);
-
-      prod = 0;
-
-      for (i = 1; i <= h; i++)
-	{
-	  double val = *pv;
-	  ++pv;
-
-	  double * pprod = &prod.Elem(1);
-
-	  for (j = w-1; j >= 0; --j, ++pmat, ++pprod)
-	    {
-	      *pprod += val * *pmat;
-	    }
-	}
-	
-      /*
-      double sum;
-
-      for (i = 1; i <= Width(); i++)
-	{
-	  sum = 0;
-	  
-	  for (int j = 1; j <= Height(); j++)
-	    sum += Get(j, i) * v.Get(j);
-	  
-	  prod.Set (i, sum);
-	}
-      */
-    }
-  }
-
-
-void DenseMatrix :: Residuum (const Vector & x, const Vector & b,
-      Vector & res) const
-  {
-  double sum;
-  //   const Vector & x = bx.CastToVector();
-  //  const Vector & b = bb.CastToVector();
-  //  Vector & res = bres.CastToVector();
-
-  res.SetSize (Height());
-
-  if (Width() != x.Size() || Height() != b.Size())
-    {
-    (*myerr) << "\nMatrix and Vector don't fit" << endl;
-    }
-  else if (Height() != res.Size())
-    {
-    (*myerr) << "Base_Matrix::operator*(Vector): prod vector not ok" << endl;
-    }
-  else
-    {
-      int i, j;
-      int h = Height(); 
-      int w = Width();
-      const double * mp = &Get(1, 1);
-
-      for (i = 1; i <= h; i++)
-	{
-	  sum = b.Get(i);
-	  const double * xp = &x.Get(1);
-
-	  for (j = 1; j <= w; ++j, ++mp, ++xp)
-	    sum -= *mp * *xp;
-	  
-	  res.Elem(i) = sum;
-	}
-    }
-  }
-
-#ifdef ABC
-double DenseMatrix :: EvaluateBilinearform (const Vector & hx) const
-  {
-  double sum = 0, hsum;
-  // const Vector & hx = x.CastToVector();
-  int i, j;
-
-  if (Width() != hx.Size() || Height() != hx.Size())
-    {
-    (*myerr) << "Matrix::EvaluateBilinearForm: sizes don't fit" << endl;
-    }
-  else
-    {
-    for (i = 1; i <= Height(); i++)
-      {
-      hsum = 0;
-      for (j = 1; j <= Height(); j++)
-        {
-        hsum += Get(i, j) * hx.Get(j);
-        }
-      sum += hsum * hx.Get(i);
-      }
-    }
-
-//  testout << "sum = " << sum << endl;
-  return sum;
-  }
-
-
-void DenseMatrix :: MultElementMatrix (const ARRAY<int> & pnum, 
-      const Vector & hx, Vector & hy)
-  {
-  int i, j;
-  //  const Vector & hx = x.CastToVector();
-  //  Vector & hy = y.CastToVector();
-
-  if (Symmetric())
-    {
-    for (i = 1; i <= Height(); i++)
-      {
-      for (j = 1; j < i; j++)
-        {
-	hy.Elem(pnum.Get(i)) += Get(i, j) * hx.Get(pnum.Get(j));
-	hy.Elem(pnum.Get(j)) += Get(i, j) * hx.Get(pnum.Get(i));
-	}
-      hy.Elem(pnum.Get(j)) += Get(i, i) * hx.Get(pnum.Get(i));	
-      }
-    }
-  else
-    for (i = 1; i <= Height(); i++)
-      for (j = 1; j <= Width(); j++)
-	hy.Elem(pnum.Get(i)) += Get(i, j) * hx.Get(pnum.Get(j));
-    
-  }
-  
-void DenseMatrix :: MultTransElementMatrix (const ARRAY<int> & pnum, 
-      const Vector & hx, Vector & hy)
-  {
-  int i, j;
-  //  const Vector & hx = x.CastToVector();
-  //  Vector & hy = y.CastToVector();
-
-  if (Symmetric())
-    MultElementMatrix (pnum, hx, hy);
-  else
-    for (i = 1; i <= Height(); i++)
-      for (j = 1; j <= Width(); j++)
-	hy.Elem(pnum.Get(i)) += Get(j, i) * hx.Get(pnum.Get(j));
-  }
-#endif
-
-
-void DenseMatrix :: Solve (const Vector & v, Vector & sol) const
-{
-  DenseMatrix temp (*this);
-  temp.SolveDestroy (v, sol);
-}
-
-
-void DenseMatrix :: SolveDestroy (const Vector & v, Vector & sol)
-  {
-  double q;
-
-  if (Width() != Height())
-    {
-    (*myerr) << "SolveDestroy: Matrix not square";
-    return;
-    }
-  if (Width() != v.Size())
-    {
-    (*myerr) << "SolveDestroy: Matrix and Vector don't fit";
-    return;
-    }
-
-  sol = v;
-  if (Height() != sol.Size())
-    {
-    (*myerr) << "SolveDestroy: Solution Vector not ok";
-    return;
-    }
-
-
-  if (0 /* Symmetric() */)
-    {
-      
-      // Cholesky factorization
-
-      int i, j, k, n;
-      n = Height();
-      
-      // Cholesky
-      
-      double x;
-      Vector p(n);
-
-      for (i = 1; i <= n; i++)
-	for (j = 1; j < i; j++)
-	  Elem(j, i) = Get(i, j);
-      
-      for (i = 1; i <= n; i++)
-	{
-	  // (*mycout) << "." << flush;
-	  for (j = i; j <= n; j++)
-	    {
-	      x = Get(i, j);
-
-	      const double * pik = &Get(i, 1);
-	      const double * pjk = &Get(j, 1);
-
-	      for (k = i-2; k >= 0; --k, ++pik, ++pjk)
-		x -= (*pik) * (*pjk);
-		  
-	      // for (k = i-1; k >= 1; --k)
-	      //   x -= Get(j, k) * Get(i, k);
-
-	      if (i == j)
-		{
-		  if (x <= 0)
-		    {
-		      cerr << "Matrix indefinite" << endl;
-		      return;
-		    }
-		  
-		  p.Elem(i) = 1 / sqrt(x);
-		}
-	      else
-		{
-		  Elem(j, i) = x * p.Get(i);
-		}
-	    }
-	}
-
-      for (i = 1; i <= n; i++)
-        Elem(i, i) = 1 / p.Get(i);
-
-      // A = L L^t 
-      // L stored in left-lower triangle
-
-
-      sol = v;
-
-      // Solve L sol = sol
-
-      for (i = 1; i <= n; i++)
-	{
-	  double val = sol.Get(i);
-
-	  const double * pij = &Get(i, 1);
-	  const double * solj = &sol.Get(1);
-
-	  for (j = 1; j < i; j++, ++pij, ++solj)
-	    val -= *pij * *solj;
-	  //	  for (j = 1; j < i; j++)
-	  //	    val -= Get(i, j) * sol.Get(j);
-
-	  sol.Elem(i) = val / Get(i, i);
-	}
-
-      // Solve L^t sol = sol
-
-      for (i = n; i >= 1; i--)
-	{
-	  double val = sol.Get(i) / Get(i, i);
-	  sol.Elem(i) = val;
-
-	  double * solj = &sol.Elem(1);
-	  const double * pij = &Get(i, 1);
-
-	  for (j = 1; j < i; ++j, ++pij, ++solj)
-	    *solj -= val * *pij;
-	  //	  for (j = 1; j < i; j++)
-	  //	    sol.Elem(j) -= Get(i, j) * val;
-	}
-
-
-    }
-  else
-    {
-      //      (*mycout) << "gauss" << endl;
-      int i, j, k, n = Height();
-      for (i = 1; i <= n; i++)
-	{
-	  for (j = i+1; j <= n; j++)
-	    {
-	      q = Get(j,i) / Get(i,i);
-	      if (q)
-		{
-		  const double * pik = &Get(i, i+1);
-		  double * pjk = &Elem(j, i+1);
-
-		  for (k = i+1; k <= n; ++k, ++pik, ++pjk)
-		    *pjk -= q * *pik;
-		  
-		  //  for (k = i+1; k <= Height(); k++)
-		  //	Elem(j, k) -= q * Get(i,k);
-
-
-		  sol.Elem(j) -= q * sol.Get(i);
-		}
-	    }
-	}
-      
-      for (i = n; i >= 1; i--)
-	{
-	  q = sol.Get(i);
-	  for (j = i+1; j <= n; j++)
-	      q -= Get(i,j) * sol.Get(j);
-
-	  sol.Elem(i) = q / Get(i,i);
-	}
-    }
-  }
-
-
-/*
-BaseMatrix * DenseMatrix :: Copy () const
-  {
-  return new DenseMatrix (*this);
-  }
-*/
-
-
-
-
-ostream & operator<< (ostream & ost, const DenseMatrix & m)
-{
-  for (int i = 0; i < m.Height(); i++)
-    {
-      for (int j = 0; j < m.Width(); j++)
-	ost << m.Get(i+1,j+1) << " ";
-      ost << endl;
-    }
-  return ost;
-}
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/linalg/densemat.hpp b/contrib/Netgen/libsrc/linalg/densemat.hpp
deleted file mode 100644
index fadb128d6a289a36b3d5e7d66a59aa0e124a4baf..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/densemat.hpp
+++ /dev/null
@@ -1,260 +0,0 @@
-#ifndef FILE_DENSEMAT
-#define FILE_DENSEMAT
-
-/**************************************************************************/
-/* File:   densemat.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Oct. 94                                                    */
-/**************************************************************************/
-
-/** 
-    Data type dense matrix
-*/
-
-
-#include <assert.h>
-
-class DenseMatrix
-{
-protected:
-  int height;
-  int width;
-  double * data;
-
-public:
-  ///
-  DenseMatrix ();
-  ///
-  DenseMatrix (int h, int w = 0);
-  ///
-  DenseMatrix (const DenseMatrix & m2);
-  ///
-  ~DenseMatrix ();
-
-  ///
-  void SetSize (int h, int w = 0);
-
-  int Height() const { return height; }
-  int Width() const { return width; }
-
-  double & operator() (int i, int j) { return data[i*width+j]; }
-  double operator() (int i, int j) const { return data[i*width+j]; }
-  double & operator() (int i) { return data[i]; }
-  double operator() (int i) const { return data[i]; }
-
-  ///
-  DenseMatrix & operator= (const DenseMatrix & m2);
-  ///
-  DenseMatrix & operator+= (const DenseMatrix & m2);
-  ///
-  DenseMatrix & operator-= (const DenseMatrix & m2);
-
-  ///
-  DenseMatrix & operator= (double v);
-  ///
-  DenseMatrix & operator*= (double v);
-
-  ///
-  void Mult (const FlatVector & v, FlatVector & prod) const
-  {
-    double sum;
-    const double * mp, * sp;
-    double * dp;
-    
-#ifdef DEBUG
-    if (prod.Size() != height)
-      {
-	cerr << "Mult: wrong vector size " << endl;
-	assert (1);
-	// prod.SetSize (height);
-      }
-    
-
-    if (!height) 
-      {
-	cout << "DenseMatrix::Mult height = 0" << endl;
-      }
-    if (!width) 
-      {
-	cout << "DenseMatrix::Mult width = 0" << endl;
-      }
-    
-    if (width != v.Size())
-      {
-	(*myerr) << "\nMatrix and Vector don't fit" << endl;
-      }
-    else if (Height() != prod.Size())
-      {
-	(*myerr) << "Base_Matrix::operator*(Vector): prod vector not ok" << endl;
-      }
-    else
-#endif
-      {      
-	mp = data;
-	dp = &prod.Elem(1);
-	for (int i = 1; i <= height; i++)
-	  {
-	    sum = 0;
-	    sp = &v.Get(1);
-	    
-	    for (INDEX j = 1; j <= width; j++)
-	      {
-		//        sum += Get(i,j) * v.Get(j);
-		sum += *mp * *sp;
-		mp++;
-		sp++;
-	      }
-	    
-	    *dp = sum;
-	    dp++;
-	  }
-      }
-  }
-
-  ///
-  void MultTrans (const Vector & v, Vector & prod) const;
-  ///
-  void Residuum (const Vector & x, const Vector & b, Vector & res) const;
-  ///
-  double Det () const;
-
-  ///
-  friend DenseMatrix operator* (const DenseMatrix & m1, const DenseMatrix & m2);
-  ///
-  friend DenseMatrix operator+ (const DenseMatrix & m1, const DenseMatrix & m2);
-
-  /// 
-  friend void Transpose (const DenseMatrix & m1, DenseMatrix & m2);
-  ///
-  friend void Mult (const DenseMatrix & m1, const DenseMatrix & m2, DenseMatrix & m3);
-  ///
-  friend void CalcInverse (const DenseMatrix & m1, DenseMatrix & m2);
-  ///
-  friend void CalcAAt (const DenseMatrix & a, DenseMatrix & m2);
-  ///
-  friend void CalcAtA (const DenseMatrix & a, DenseMatrix & m2);
-  ///
-  friend void CalcABt (const DenseMatrix & a, const DenseMatrix & b, DenseMatrix & m2);
-  ///
-  friend void CalcAtB (const DenseMatrix & a, const DenseMatrix & b, DenseMatrix & m2);
-  ///
-  void Solve (const Vector & b, Vector & x) const;
-  ///
-  void SolveDestroy (const Vector & b, Vector & x);
-  ///
-  const double & Get(INDEX i, INDEX j) const { return data[(i-1)*width+j-1]; }
-  ///
-  const double & Get(INDEX i) const { return data[i-1]; }
-  ///
-  void Set(INDEX i, INDEX j, double v) { data[(i-1)*width+j-1] = v; }
-  ///
-  double & Elem(INDEX i, INDEX j) { return data[(i-1)*width+j-1]; }
-  ///
-  const double & ConstElem(INDEX i, INDEX j) const { return data[(i-1)*width+j-1]; }
-};
-
-
-extern ostream & operator<< (ostream & ost, const DenseMatrix & m);
-
-
-
-template <int WIDTH>
-class MatrixFixWidth
-{
-protected:
-  int height;
-  double * data;
-
-public:
-  ///
-  MatrixFixWidth () 
-  { height = 0; data = 0; }
-  ///
-  MatrixFixWidth (int h)
-  { height = h; data = new double[WIDTH*height]; }
-  ///
-  ~MatrixFixWidth ()
-  { delete [] data; }
-
-  void SetSize (int h)
-  {
-    if (h != height)
-      {
-	delete data;
-	height = h;
-	data = new double[WIDTH*height]; 
-      }
-  }
-
-  ///
-  int Height() const { return height; }
-
-  ///
-  int Width() const { return WIDTH; }
-
-  ///
-  MatrixFixWidth & operator= (double v)
-  {
-    for (int i = 0; i < height*WIDTH; i++)
-      data[i] = v; 
-    return *this;
-  }
-
-  ///
-  void Mult (const FlatVector & v, FlatVector & prod) const
-  {
-    double sum;
-    const double * mp, * sp;
-    double * dp;
-
-    /*    
-    if (prod.Size() != height)
-      {
-	cerr << "MatrixFixWidth::Mult: wrong vector size " << endl;
-	assert (1);
-      }
-    */    
-
-    mp = data;
-    dp = &prod[0];
-    for (int i = 0; i < height; i++)
-      {
-	sum = 0;
-	sp = &v[0];
-	
-	for (int j = 0; j < WIDTH; j++)
-	  {
-	    sum += *mp * *sp;
-	    mp++;
-	    sp++;
-	  }
-	    
-	*dp = sum;
-	dp++;
-      }
-  }
-
-  double & operator() (int i, int j)
-  { return data[i*WIDTH+j]; }
-
-  const double & operator() (int i, int j) const
-  { return data[i*WIDTH+j]; }
-
-
-
-  const double & Get(int i, int j) const { return data[(i-1)*WIDTH+j-1]; }
-  ///
-  const double & Get(int i) const { return data[i-1]; }
-  ///
-  void Set(int i, int j, double v) { data[(i-1)*WIDTH+j-1] = v; }
-  ///
-  double & Elem(int i, int j) { return data[(i-1)*WIDTH+j-1]; }
-  ///
-  const double & ConstElem(int i, int j) const { return data[(i-1)*WIDTH+j-1]; }
-};
-
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/linalg/linalg.hpp b/contrib/Netgen/libsrc/linalg/linalg.hpp
deleted file mode 100644
index 4599fad48d187e756c451a88645c4be2460ddc8b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/linalg.hpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef FILE_LINALG
-#define FILE_LINALG
-
-/* *************************************************************************/
-/* File:   linalg.hpp                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Oct. 94                                                    */
-/* *************************************************************************/
-
-/* 
-
-   Data types for basic linear algebra
-   more data types are found in linalgl.hpp
-   
-   The basic concepts include the data types 
-   
-    Vector
-    SparseMatrix
-    DenseMatrix
-
-*/
-
-
-#include <myadt.hpp>
-namespace netgen
-{
-#include "vector.hpp"
-  // #include "basemat.hpp"
-#include "densemat.hpp"
-  // #include "sparsmat.hpp"
-#include "polynomial.hpp"
-}
-#endif
-
-
diff --git a/contrib/Netgen/libsrc/linalg/polynomial.cpp b/contrib/Netgen/libsrc/linalg/polynomial.cpp
deleted file mode 100644
index 964dab9674ba2807ded067792837b4b66252c2c9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/polynomial.cpp
+++ /dev/null
@@ -1,216 +0,0 @@
-#include <mystdlib.h>
-#include <linalg.hpp>
-
-namespace netgen
-{
-
-QuadraticPolynomial1V :: 
-QuadraticPolynomial1V (double ac, double acx, double acxx)
-{
-  c = ac;
-  cx = acx;
-  cxx = acxx;
-}
-
-double QuadraticPolynomial1V :: 
-Value (double x)
-{
-  return c + cx * x + cxx * x * x;
-}
-
-double QuadraticPolynomial1V ::  MaxUnitInterval ()
-{
-  // inner max
-  if (cxx < 0 && cx > 0 && cx < -2 * cxx)
-    {
-      return c - 0.25 * cx * cx / cxx;
-    }
-
-  
-  if (cx + cxx > 0)   // right edge
-    return c + cx + cxx;
-
-  // left end
-  return c;
-}
-
-
-
-
-LinearPolynomial2V :: 
-LinearPolynomial2V (double ac, double acx, double acy)
-{
-  c = ac;
-  cx = acx;
-  cy = acy;
-}
-
-
-QuadraticPolynomial2V ::   
-QuadraticPolynomial2V ()
-{
-  ;
-}
-
-
-QuadraticPolynomial2V :: 
-QuadraticPolynomial2V (double ac, double acx, double acy,
-		       double acxx, double acxy, double acyy)
-{
-  c = ac;
-  cx = acx;
-  cy = acy;
-  cxx = acxx;
-  cxy = acxy;
-  cyy = acyy;
-}
-
-void QuadraticPolynomial2V :: 
-Square (const LinearPolynomial2V & lp)
-{
-  c = lp.c * lp.c;
-  cx = 2 * lp.c * lp.cx;
-  cy = 2 * lp.c * lp.cy;
-
-  cxx = lp.cx * lp.cx;
-  cxy = 2 * lp.cx * lp.cy;
-  cyy = lp.cy * lp.cy;
-}
-
-void QuadraticPolynomial2V :: 
-Add (double lam, const QuadraticPolynomial2V & qp2)
-{
-  c += lam * qp2.c;
-  cx += lam * qp2.cx;
-  cy += lam * qp2.cy;
-  cxx += lam * qp2.cxx;
-  cxy += lam * qp2.cxy;
-  cyy += lam * qp2.cyy;
-}
-
-double QuadraticPolynomial2V :: 
-Value (double x, double y)
-{
-  return c + cx * x + cy * y + cxx * x * x + cxy * x * y + cyy * y * y;
-}
-
-/*
-double QuadraticPolynomial2V :: 
-MinUnitSquare ()
-{
-  double x, y;
-  double minv = 1e8;
-  double val;
-  for (x = 0; x <= 1; x += 0.1)
-    for (y = 0; y <= 1; y += 0.1)
-      {
-	val = Value (x, y);
-	if (val < minv)
-	  minv = val;
-      }
-  return minv;
-};
-*/
-
-double QuadraticPolynomial2V :: 
-MaxUnitSquare ()
-{
-  // find critical point
-
-  double maxv = c;
-  double hv;
-
-  double det, x0, y0;
-  det = 4 * cxx * cyy - cxy * cxy;
-
-  if (det > 0)
-    {
-      // definite surface
-      
-      x0 = (-2 * cyy * cx + cxy * cy) / det;
-      y0 = (cxy * cx -2 * cxx * cy) / det;
-
-      if (x0 >= 0 && x0 <= 1 && y0 >= 0 && y0 <= 1)
-	{
-	  hv = Value (x0, y0);
-	  if (hv > maxv) maxv = hv;
-	}
-    }
-  
-  QuadraticPolynomial1V e1(c, cx, cxx);
-  QuadraticPolynomial1V e2(c, cy, cyy);
-  QuadraticPolynomial1V e3(c+cy+cyy, cx+cxy, cxx);
-  QuadraticPolynomial1V e4(c+cx+cxx, cy+cxy, cyy);
-  
-  hv = e1.MaxUnitInterval();
-  if (hv > maxv) maxv = hv;
-  hv = e2.MaxUnitInterval();
-  if (hv > maxv) maxv = hv;
-  hv = e3.MaxUnitInterval();
-  if (hv > maxv) maxv = hv;
-  hv = e4.MaxUnitInterval();
-  if (hv > maxv) maxv = hv;
-
-  return maxv;
-
-  //  (*testout) << "maxv = " << maxv << " =~= ";
-
-  /*
-  double x, y;
-  maxv = -1e8;
-  double val;
-  for (x = 0; x <= 1.01; x += 0.1)
-    for (y = 0; y <= 1.01; y += 0.1)
-      {
-	val = Value (x, y);
-	if (val > maxv)
-	  maxv = val;
-      }
-
-  //  (*testout) << maxv << endl;
-  return maxv;
-  */
-}
-
-
-
-
-double QuadraticPolynomial2V :: 
-MaxUnitTriangle ()
-{
-  // find critical point
-  
-  double maxv = c;
-  double hv;
-
-  double det, x0, y0;
-  det = 4 * cxx * cyy - cxy * cxy;
-
-  if (cxx < 0 && det > 0)
-    { 
-      // definite surface
-      
-      x0 = (-2 * cyy * cx + cxy * cy) / det;
-      y0 = (cxy * cx -2 * cxx * cy) / det;
-
-      if (x0 >= 0 && y0 >= 0 && x0+y0 <= 1)
-	{
-	  return Value (x0, y0);
-	}
-    }
-  
-  
-  QuadraticPolynomial1V e1(c, cx, cxx);
-  QuadraticPolynomial1V e2(c, cy, cyy);
-  QuadraticPolynomial1V e3(c+cy+cyy, cx-cy+cxy-2*cyy, cxx-cxy+cyy);
-  
-  hv = e1.MaxUnitInterval();
-  if (hv > maxv) maxv = hv;
-  hv = e2.MaxUnitInterval();
-  if (hv > maxv) maxv = hv;
-  hv = e3.MaxUnitInterval();
-  if (hv > maxv) maxv = hv;
-
-  return maxv;
-}
-}
diff --git a/contrib/Netgen/libsrc/linalg/polynomial.hpp b/contrib/Netgen/libsrc/linalg/polynomial.hpp
deleted file mode 100644
index 3108d4dd729172bd644052524aab62f3d150576f..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/polynomial.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef FILE_POLYNOMIAL
-#define FILE_POLYNOMIAL
-
-/* *************************************************************************/
-/* File:   polynomial.hh                                                   */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   25. Nov. 99                                                     */
-/* *************************************************************************/
-
-
-class QuadraticPolynomial1V 
-{
-  double c, cx, cxx;
-public:
-  QuadraticPolynomial1V (double ac, double acx, double acxx);
-  double Value (double x);
-  double MaxUnitInterval ();
-};
-
-class LinearPolynomial2V
-{
-  double c, cx, cy;
-public:
-  LinearPolynomial2V (double ac, double acx, double acy);
-  friend class QuadraticPolynomial2V;
-};
-
-
-class QuadraticPolynomial2V
-{
-  double c, cx, cy, cxx, cxy, cyy;
-public:
-  QuadraticPolynomial2V ();
-  QuadraticPolynomial2V (double ac, double acx, double acy,
-			 double acxx, double acxy, double acyy);
-  void Square (const LinearPolynomial2V & lp);
-  void Add (double lam, const QuadraticPolynomial2V & qp);
-
-  double Value (double x, double y);
-  //  double MinUnitSquare ();
-  double MaxUnitSquare ();
-  double MaxUnitTriangle ();
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/linalg/sparsmat.cpp b/contrib/Netgen/libsrc/linalg/sparsmat.cpp
deleted file mode 100644
index f3249f82e64807f2ec05bbfba3b9012335b98b21..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/sparsmat.cpp
+++ /dev/null
@@ -1,1707 +0,0 @@
-//#include <algorithm>
-#ifdef ABC
-
-#include <mystdlib.h>
- 
-#include <linalg.hpp>
-
-
-namespace netgen
-{
-MatrixGraph :: MatrixGraph (int size, int aincrement)
-{
-  int i;
-  increment = aincrement;
-  
-  lines.SetSize (size);
-  for (i = 1;i <= size; i++)
-    {
-      lines.Elem(i).allocsize = increment;
-      lines.Elem(i).size = 1;
-      lines.Elem(i).diag = 1;
-      lines.Elem(i).col = new INDEX[increment];
-      lines.Elem(i).col[0] = i;
-    }
-}
-
-MatrixGraph :: MatrixGraph (const ARRAY<int> & linesize)
-{
-  INDEX i;
-  INDEX n = linesize.Size();
-  INDEX sum = 0;
-  INDEX * cola;
-
-  lines.SetSize (n);
-  increment = 0;
-
-  for (i = 1; i <= n; i++)
-    sum += linesize.Get(i);
-  
-  cola = new INDEX[sum];
-
-  sum = 0;
-  for (i = 1; i <= n; i++)
-    {
-      lines.Elem(i).allocsize=linesize.Get(i);
-      lines.Elem(i).size = 1;
-      lines.Elem(i).diag = 1;
-      lines.Elem(i).col = &cola[sum];
-      cola[sum] = i;
-      sum += linesize.Get(i);
-    }
-}
-
-int MatrixGraph :: GetPosition (INDEX i, INDEX j) const
-{
-  int k;
-  
-  INDEX * ip = lines.Get(i).col;
-  INDEX n = lines.Get(i).size;
-  for (k = 1; k <= n; k++, ip++)
-    {
-      if (j == *ip) return k;
-    }
-
-  return 0;
-  
-  /*  
-  //  quick search:
-
-  const INDEX * ip = lines.Get(i).col;
-  int max = lines.Get(i).size;
-
-  int l = 0, k = 1, newind;
-  
-  while (k < max)
-    k <<= 1;
-
-  while (k > 0)
-    {
-      k >>= 1;
-      newind = k+l;
-      if (newind >= max) continue;
-      if (ip[newind] <= j)
-	l += k;
-    }
-
-  if (l < max && ip[l] == j) 
-    return l+1;
-
-  return 0;
-  */
-}
-
-
-
-int MatrixGraph :: CreatePosition (INDEX i, INDEX j)    
-  {
-  int k;
-  MatrixGraph::linestruct * lin = &lines.Elem(i);
-
- 
-
-  for (k = 1; k <= lin->size; k++)
-    {
-      if (lin->col[k-1] == j) 
-	return 0;
-      if (lin->col[k-1] > j) 
-	break;
-    }
-
-  // k ... position to enter new element
-
-  if (lin->size == lin->allocsize)
-    {
-      INDEX * tmpcol = new INDEX[lin->size + increment];
-      memcpy (tmpcol, lin->col, sizeof(INDEX) * lin->size);
-      delete lin->col;
-      lin->col = tmpcol;
-      lin->allocsize+=increment;
-    }
-
-  if (k <= lin->size)
-    memmove (&lin->col[k], &lin->col[k-1], 
-	     sizeof(INDEX) * (lin->size + 1 - k));
-  
-  lin->col[k-1] = j;
-  lin->size++;
-  if (j < i) lin->diag++;
-
-  return 1;
-  }
-
-
-
-double & SparseMatrix :: operator() (INDEX i, INDEX j)
-{
-  if (i >= 1 && i <= height && j >= 1 && j <= width)
-    return Elem(i, j);
-  else
-    {
-    (*myerr) << "SparseMatirx::operator(): out of range" << endl;
-    return shit;
-    }
-}
- 
-double SparseMatrix :: operator() (INDEX i, INDEX j) const
-{
-  if (i >= 1 && i <= height && j >= 1 && j <= width)
-    return Get(i, j);
-  else
-    {
-    (*myerr) << "SparseMatirx::operator(): out of range" << endl;
-    return shit;
-    }
-}
-   
-
-
-
-
-
-SparseMatrix :: SparseMatrix (INDEX h, INDEX w)
-  : BaseMatrix (h, w)
-{
-  ;
-}
-
-
-
-
-void SparseMatrix :: Mult (const Vector & v, Vector & prod) const
-  {
-  double sum, vi;
-  INDEX i, j, n;
-
-  const INDEX * col;
-  const double * valp;
-
-  //  const Vector & v = bv.CastToVector();
-  //  Vector & prod = bprod.CastToVector();
-
-  prod.SetSize (Height());
-
-  /*
-  if (prod.Size() != Height() || v.Size() != Width())
-    {
-    (*myerr) << "SparseMatrix::Mult: Dimensions don't fit" << endl;
-    return;
-    }
-    */
-
-  if (!Symmetric())
-    {
-      n = Height();
-      INDEX w = Width();
-
-      /*
-      const MatrixGraph::linestruct * linep = &graph->lines.Get(1);   
-
-      for (i = 1; i <= n; i++) 
-	{
-	  sum = 0; 
-	  col = linep->col;
-	  valp = data.Get(i);
-	  
-	  for (j = 0; j < linep->size; j++, valp++, col++)
-	    sum += *valp * v.Get(*col); 
-
-	  linep++;
-	  prod.Set (i, sum);
-	}
-	*/
-
-      const MatrixGraph::linestruct * linep = &graph->lines.Get(1);   
-      const double * vp = &v.Get(1);
-      vp--;
-
-      for (i = 1; i <= n; i++) 
-	{
-	  sum = 0; 
-	  col = linep->col;
-	  valp = data.Get(i);
-	  const int ls = linep->size;
-	  
-	  if (i <= w)
-	    for (j = 0; j < ls; j++)
-	      sum += valp[j] * vp[col[j]];
-	  else
-	    // decrement one, because of diagonal element outside
-	    for (j = 0; j < ls-1; j++)
-	      sum += valp[j] * vp[col[j]];
-
-	  
-	  linep++;
-	  prod.Elem(i) = sum;
-	}
-
-    }
-  else
-    {
-      prod = 0;
-      n = Height();
-      
-      const MatrixGraph::linestruct * linep = &graph->lines.Get(1);   
-
-      for (i = 1; i <= n; i++)
-	{
-	  sum = 0; 
-	  //	  col = graph->lines.Get(i).col;
-	  col = linep->col;
-	  valp = data.Get(i);
-	  vi = v.Get(i);
-	  
-	  for (j = linep->diag-1; j > 0; j--, col++, valp++)
-	    {
-	      sum += (*valp) * v.Get(*col);
-	      prod.Elem(*col) += (*valp) * vi;
-	    }
-	  
-	  linep++;
-	  sum += (*valp) * v.Get(*col);
-	  prod.Elem(i) += sum;
-	}
-    }
-  }
-
-void SparseMatrix :: MultTrans (const Vector & v, Vector & prod) const
-  {
-  INDEX i, j, n, coln;
-  //  const Vector & v = bv.CastToVector();
-  //  Vector & prod = bprod.CastToVector();
-  const INDEX * col;
-  const double * valp;
-  double val;
-
-  prod.SetSize (Width());
-
-  if (prod.Size() != Width() || v.Size() != Height())
-    {
-    (*myerr) << "SparseMatrix::Mult: Dimensions don't fit" << endl;
-    return;
-    }
-
-  if (!Symmetric())
-    {
-    n = Height();
-    prod = 0;
-
-    for (i = 1; i <= n; i++)
-      {
-	col = graph->lines.Get(i).col;
-	valp = data.Get(i);
-	coln = graph->lines.Get(i).size;
-	val = v.Get(i);
-
-	//      lin = &lins.Get(i);
-	//      col = lin->col;
-	//      val = v.Get(i);
-      
-      for (j = 1; j <= coln; j++, col++, valp++)
-        prod.Elem(*col) += (*valp) * val;
-      }
-    }
-  else
-    {
-    Mult (v, prod);
-    }
-  }
-
-
-
-
-void SparseMatrix :: Residuum (const Vector & bx, const Vector & bb,
-      Vector & bres) const
-  {
-    BaseMatrix :: Residuum (bx, bb, bres);
-    /*
-  double sum, xi;
-  INDEX i, j, n;
-  colstruct * col;
-  const linestruct * lin;
-  const Vector & x = bx.CastToVector();
-  const Vector & b = bb.CastToVector();
-  Vector & res = bres.CastToVector();
-
-  res.SetSize (b.Size());
-
-  if (res.Size() != b.Size() || b.Size() != Height() ||
-      x.Size() != Width())
-    {
-    (*myerr) << "SparseMatrix::Residuum: Dimensions don't fit" << endl;
-    return;
-    }
-
-  n = Height();
-  if (!Symmetric())
-    {
-    for (i = 1; i <= Height(); i++)
-      {
-      lin = &lins.Get(i);
-      sum = b.Get(i);
-      col = lin->col;
-
-      for (j = lin->size; j > 0; j--, col++)
-        sum -= col->data * x.Get(col->colnr);
-
-      res.Set (i, sum);
-      }
-    }
-  else
-    {
-    res = b;
-    for (i = 1; i <= n; i++)
-      {
-      lin = &lins.Get(i);
-      sum = 0;
-      col = lin->col;
-      xi = x.Get(i);
-
-      for (j = lin->size; j > 0; j--, col++)
-        {
-        sum -= col->data * x.Get(col->colnr);
-        if (col->colnr != i)
-          res.Elem(col->colnr) -= col->data * xi;
-        }
-
-      res.Elem(i) += sum;
-      }
-    }
-    */
-  }
-
-
-void SparseMatrix :: ResiduumTrans (const Vector & /* bx */, 
-				    const Vector & /* bb */,
-				    Vector & /* bres */) const
-  {
-    cerr << "SparseMastrix :: Residuumtrans called, but not implemented" << endl;
-
-    /*
-  INDEX i, j, n;
-  colstruct * col;
-  const linestruct * lin;
-  const Vector & x = bx.CastToVector();
-  const Vector & b = bb.CastToVector();
-  Vector & res = bres.CastToVector();
-
-
-  res.SetSize (Width());
-
-  if (res.Size() != b.Size() || b.Size() != Width() ||
-      x.Size() != Height())
-    {
-    (*myerr) << "SparseMatrix::ResiduumTrans: Dimensions don't fit" << endl;
-    return;
-    }
-  
-  if (!Symmetric())
-    {
-    n = Height();
-
-    res = b;
-
-    for (i = 1; i <= n; i++)
-      {
-      lin = &lins.Get(i);
-      col = lin->col;
-
-      for (j = lin->size; j > 0; j--, col++)
-        res.Elem(col->colnr) -= col->data * x.Get(i);
-      }
-    }
-  else
-    {
-    Residuum (bx, bb, bres);
-    }
-    */
-  }
-
-
-
-ostream & SparseMatrix :: Print (ostream & s) const
-  {
-  INDEX i, j;
-
-  if (Symmetric()) s << "Lower half of matrix:" << endl;
-
-  for (i = 1; i <= Height(); i++)
-    {
-    s << "Line " << i << " ";
-
-    if (Symmetric())
-      {
-	for (j = 1 ; j <= GetDiagPos (i); j++)
-	  s << "(" << GetColIndex (i, j) << ": " << GetData (i, j) << ") ";
-      }
-    else
-      {
-	for (j = 1 ; j <= ElementsInLine (i); j++)
-	  s << "(" << GetColIndex (i, j) << ": " << GetData (i, j) << ") ";
-      }
-
-    s << endl;
-    }
-  return s;
-  }
-
-
-
-
-
-
-void SparseMatrix :: AddElementMatrix (const ARRAY<INDEX> & pnum,
-      const BaseMatrix & elemmat)
-{
-  int i, j, i1, i2, n;
-
-  n = pnum.Size();
-  static ARRAY<int> spnum, map;
-  spnum.SetSize (n);
-  map.SetSize (n);
-
-  for (i = 1; i <= n; i++)
-    spnum.Elem(i) = pnum.Get(i);
-
-  for (i = 1; i <= n; i++)
-    for (j = 1; j <= n-1; j++)
-      if (spnum.Elem(j) > spnum.Elem(j+1))
-	swap (spnum.Elem(j), spnum.Elem(j+1));
-
-  for (i = 1; i <= n; i++)
-    for (j = 1; j <= n; j++)
-      if (pnum.Get(i) == spnum.Get(j))
-	map.Elem(j) = i;
-
-
-  const DenseMatrix & delemmat = (const DenseMatrix&)elemmat;
-  if (Symmetric())
-    {
-      for (i1 = 1; i1 <= n; i1++)
-	{
-	  INDEX ii1 = spnum.Get(i1);
-	  const INDEX * coli = graph->lines.Get(ii1).col;
-	  double * val = data.Get(ii1);
-	  int ncol = graph->lines.Get(ii1).size;
-
-	  int hi = 0;
-	  for (i2 = 1; i2 <= i1; i2++)
-	    {
-	      while (coli[hi] < spnum.Get(i2))
-		hi++;
-	      val[hi] += delemmat.Get(map.Get(i1), map.Get(i2));
-	    }
-	}
-
-      /*
-      for (i1 = 1; i1 <= pnum.Size(); i1++)
-	for (i2 = 1; i2 <= i1; i2++)
-	  Elem(pnum.Get(i1), pnum.Get(i2)) += delemmat.Get(i1, i2);
-	  */
-    }
-  else
-    {
-      for (i1 = 1; i1 <= n; i1++)
-	{
-	  INDEX ii1 = spnum.Get(i1);
-	  const INDEX * coli = graph->lines.Get(ii1).col;
-	  double * val = data.Get(ii1);
-	  int ncol = graph->lines.Get(ii1).size;
-
-	  int hi = 0;
-	  for (i2 = 1; i2 <= n; i2++)
-	    {
-	      while (coli[hi] < spnum.Get(i2))
-		hi++;
-	      val[hi] += delemmat.Get(map.Get(i1), map.Get(i2));
-	    }
-	}
-
-      /*
-      for (i1 = 1; i1 <= pnum.Size(); i1++)
-	for (i2 = 1; i2 <= pnum.Size(); i2++)
-	  Elem(pnum.Get(i1), pnum.Get(i2)) += delemmat.Get(i1, i2);
-	  */
-    }
-}
-
-
-
-
-double SparseMatrix :: RowTimesVector (INDEX i, const Vector & v) const
-  {
-  const double * valp;
-  const INDEX * col;
-  int coln;
-  double sum;
-  int j;
-
-  /*
-  if (Width() > v.Size())
-    {
-    cerr << "SparseMatrix::RowTimesVector: Size doesn't fit" << endl;
-    return 0;
-    }
-    */
-
-  col = graph->lines.Get(i).col;
-  valp = data.Get(i);
-  sum = 0;
-  coln = Symmetric() ? graph->lines.Get(i).diag : graph->lines.Get(i).size;
-
-  for (j = 1; j <= coln; ++j, ++col, ++valp)
-    sum += (*valp) * v.Get(*col);
-
-  return sum;
-
-  /*
-	col = graph->lines.Get(i).col;
-	valp = data.Get(i);
-	coln = graph->lines.Get(i).size;
-	val = v.Get(i);
-
-	//      lin = &lins.Get(i);
-	//      col = lin->col;
-	//      val = v.Get(i);
-      
-      for (j = 1; j <= coln; j++, col++, valp++)
-        prod.Elem(*col) += (*valp) * val;
-	*/
-
-
-  }
-  
-
-
-void SparseMatrix :: AddRowToVector (INDEX i, double s, Vector & v) const
-{
-  const double * valp;
-  const INDEX * col;
-  double * vp;
-  int coln, j;
-  
-#ifdef debug  
-  if (Width() > v.Size())
-    {
-      cerr << "SparseMatrix::AddRowToVector: Size doesn't fit" 
-	   << "w = " << Width() << " len = " << v.Size() << endl;
-      return;
-    }
-#endif    
-
-  vp = &v.Elem(1) - 1;
-  valp = data.Get(i);
-  col = graph->lines.Get(i).col;
-  coln =  Symmetric() ? graph->lines.Get(i).diag : graph->lines.Get(i).size;
-
-  //  for (j = 0; j < coln; j++)
-  //    vp[col[j]] += s * valp[j];
-
-  for (j = coln-1; j >= 0; --j, ++valp, ++col)
-    vp[*col] += s * (*valp);
-}
-
-
-
-
-
-
-char SparseMatrix :: Used (INDEX i, INDEX j) const
-  {
-  return (graph->GetPosition(i, j) != 0);
-  }
-
-
-
-double SparseMatrix :: Get(INDEX i, INDEX j) const
-  {
-  if (Symmetric() && (j > i)) swap (i, j);
-    
-  int pos = graph->GetPosition(i, j);
-  if (pos)
-    return data.Get(i)[pos-1];
-  else 
-    return 0;
-  }
-  
-
-/*
-  quick search:
-
-  const colstruct * col = lins.Get(i).col;
-  INDEX max = lins.Get(i).size;
-
-  int l = 0, k = 1, newind;
-
-  while (k < max)
-    k <<= 1;
-
-
-  while (k > 0)
-    {
-    k >>= 1;
-    newind = k+l;
-    if (newind >= max) continue;
-    if (col[newind].colnr <= j)
-      l += k;
-    }
-
-  if (l < max && col[l].colnr == j) return col[l].data;
-
-  return 0;
-  */
-  
-
-
-void SparseMatrix :: Set(INDEX i, INDEX j, double v)
-  {
-  Elem (i, j) = v;
-  }
-
-
-
-double & SparseMatrix :: Elem(INDEX i, INDEX j)
-  {
-  if (Symmetric() && j > i) swap (i, j);
-  
-  int pos = graph->GetPosition (i, j);
-  if (!pos)
-    {
-      CreatePosition (i, j);
-      pos = graph->GetPosition (i, j);
-    }
-
-  return data.Elem(i)[pos-1];
-  }
-
-
-
-
-
-
-
-
-SparseMatrixFlex :: SparseMatrixFlex (INDEX h, INDEX w)
-  : SparseMatrix (h, w)
-{
-  INDEX i;
-  graph = 
-    mygraph = new MatrixGraph (h);
-
-  data.SetSize (h);
-  for (i = 1; i <= graph->Size(); i++)
-    {
-      data.Elem(i) = new double[graph->lines.Get(i).allocsize];
-      data.Elem(i)[0] = 0;
-    }
-}
-
-SparseMatrixFlex :: ~SparseMatrixFlex ()
-{
-  ;
-}
-
-
-void SparseMatrixFlex :: SetSize (INDEX /* h */, INDEX /* w */)
-{
-  cerr << "SparseMatrixFlex :: SetSize() not implemented" << endl;
-}
-
-void SparseMatrixFlex :: SetSymmetric (int sym)
-{
-  BaseMatrix::SetSymmetric (sym);
-}
-
-void SparseMatrixFlex :: ChangeSize (INDEX /* h */, INDEX /* w */)
-{
-  cerr << "SparseMatrixFlex :: ChangeSize() not implemented" << endl;
-}
-
-
-void SparseMatrixFlex :: DeleteElements ()
-{
-  ;
-} 
-
-BaseMatrix * SparseMatrixFlex :: Copy () const
-{
-  return (SparseMatrixFlex*)this;
-}
-
-
-int SparseMatrixFlex :: CreatePosition (INDEX i, INDEX j)
-{
-  int oldlinesize = graph->lines.Get(i).allocsize;
-  if (mygraph->CreatePosition(i, j))
-    {
-      int newlinesize = graph->lines.Get(i).allocsize;
-      if (oldlinesize != newlinesize)
-	{
-	  double * hdp = new double[newlinesize];
-	  memcpy (hdp, data.Elem(i), sizeof(double) * oldlinesize);
-	  delete data.Elem(i);
-	  data.Elem(i) = hdp;
-	}
-
-      int pos = graph->GetPosition (i, j);
-      int size = graph->lines.Get(i).size;
-
-      memmove (&data.Elem(i)[pos], &data.Elem(i)[pos-1], 
-	       sizeof(double) * (size-pos));
-      data.Elem(i)[pos-1] = 0;
-    }
-
-  return 0;
-}
-
-
-
-
-SparseMatrixFix :: SparseMatrixFix (const MatrixGraph & agraph,
-				     int asymmetric)
-  : SparseMatrix (agraph.Size())
-{
-  graph = &agraph;
-  SetSymmetric (asymmetric);
-
-  data.SetSize (graph->Size());
-
-  int i, nne;
-  double * block;
-  
-  nne = 0;
-  for (i = 1; i <= graph->Size(); i++)
-    {
-    if (Symmetric())
-      nne += graph->lines.Get(i).diag;
-    else
-      nne += graph->lines.Get(i).size;
-    }
-    
-  block = new double[nne];
-  
-  for (i = 0; i < nne; i++)
-    block[i] = 0;
-
-  nne = 0;
-  for (i = 1; i <= graph->Size(); i++)
-    {
-    data.Elem(i) = &block[nne];
-    if (Symmetric())
-      nne += graph->lines.Get(i).diag;
-    else
-      nne += graph->lines.Get(i).size;
-    }
-
-}
-
-
-SparseMatrixFix :: ~SparseMatrixFix ()
-{
-  ;
-}
-
-int SparseMatrixFix :: CreatePosition (INDEX i, INDEX j)
-{
-  (*myerr) << "SparseMatrixFix cannot change graph, requested: " 
-       << i << "-" << j << endl;
-  return 0;
-}
-
-#ifdef nothing
-
-
-SparseMatrix :: SparseMatrix () : BaseMatrix (), lins()
-  {
-  };
-
-SparseMatrix :: SparseMatrix (INDEX h, INDEX w) : BaseMatrix (h, w), lins (h)
-  {
-  if (!w) w = h;
-
-  for (INDEX i = 1; i <= h; i++)
-    {
-    lins[i].size = 0;
-    lins[i].maxsize = 0;
-    lins[i].col = NULL;
-    }
-  }
-
-SparseMatrix :: SparseMatrix (const SparseMatrix & m2) : BaseMatrix(), lins()
-  {
-  (*this) = m2;
-  }
-
-
-SparseMatrix :: ~SparseMatrix ()
-  {
-  DeleteElements ();
-  }
-
-
-
-void SparseMatrix :: SetSize (INDEX h, INDEX w)
-  {
-  if (!w) w = h;
-  DeleteElements ();
-
-  if (height == h && width == w) return;
-
-  height = h;
-  width = w;
-  lins.SetSize (height);
-
-  if (lins.Size () == height)
-    {
-    for (INDEX i = 1; i <= h; i++)
-      {
-      lins[i].size = 0;
-      lins[i].maxsize = 0;
-      lins[i].col = NULL;
-      }
-    }
-  else
-    {
-    height = width = 0;
-    (*myerr) << "SparseMatrix::SetSize: Out of memory" << endl;
-    }
-  }
-
-
-void SparseMatrix :: ChangeSize (INDEX h, INDEX w)
-  {
-  INDEX i;
-
-  if (!w) w = h;
-  if (height == h && width == w) return;
-
-  lins.SetSize (h);
-
-  if (lins.Size () == h)
-    {
-    for (i = height+1; i <= h; i++)
-      {
-      lins[i].size = 0;
-      lins[i].maxsize = 0;
-      lins[i].col = NULL;
-      }
-    for (i = h+1; i <= height; i++)
-      {
-      if (lins[i].col)
-        {
-        DeleteColStruct (lins[i].col, lins[i].maxsize);
-
-        lins[i].col = NULL;
-        lins[i].size = 0;
-        lins[i].maxsize = 0;
-        }
-      }
-
-    height = h;
-    width = w;
-    }
-  else
-    {
-    height = width = 0;
-    (*myerr) << "SparseMatrix::SetSize: Out of memory" << endl;
-    }
-  }
-
-
-void SparseMatrix :: SetSymmetric (int sym)
-  {
-  INDEX i, j;
-  int nr;
-
-  if (sym != Symmetric())
-    {
-    BaseMatrix :: SetSymmetric (sym);
-
-    if (!sym)
-      {
-      for (i = 1; i <= Height(); i++)
-        for (nr = 1; nr <= ElementsInLine (i); nr++)
-          {
-          j = GetIndex (i, nr);
-          if (j < i)
-            Elem (j, i) = GetData (i, nr);
-          }
-      }
-    else
-      {
-      DeleteElements();
-      }
-    }
-  }
-
-
-void SparseMatrix :: DeleteElements ()
-  {
-  for (INDEX i = 1; i <= lins.Size(); i++)
-    {
-    if (lins[i].col)
-      {
-      DeleteColStruct (lins[i].col, lins[i].maxsize);
-
-      lins[i].col = NULL;
-      lins[i].size = 0;
-      lins[i].maxsize = 0;
-      }
-    }
-  }
-
-
-
-double & SparseMatrix::operator() (INDEX i, INDEX j)
-{
-  if (i >= 1 && j >= 1 && i <= height && j <= width)
-    {
-      return Elem(i, j);
-    }
-  else (*myerr) << "\nindex (" << i << "," << j << ") out of range (1.."
-	     << height << ",1.." << width << ")\n";
-  return shit;
-}
-
-double SparseMatrix::operator() (INDEX i, INDEX j) const
-{
-  if (i >= 1 && j >= 1 && i <= height && j <= width)
-    {
-    return Get(i, j);
-    }
-  else (*myerr) << "\nindex (" << i << "," << j << ") out of range (1.."
-	     << height << ",1.." << width << ")\n";
-  return 0;
-}
-
-SparseMatrix & SparseMatrix :: operator= (const SparseMatrix & m2)
-  {
-  INDEX i, j;
-
-  SetSize (m2.Height(), m2.Width());
-  SetSymmetric (m2.Symmetric());
-
-  for (i = 1; i <= m2.Height(); i++)
-    for (j = 1; j <= m2.ElementsInLine(i); j++)
-      (*this).Elem(i, m2.GetIndex(i, j)) = m2.GetData(i, j);
-  return *this;
-  }
-
-
-SparseMatrix & SparseMatrix :: operator*= (double v)
-  {
-  INDEX i, j;
-
-  for (i = 1; i <= Height(); i++)
-    for (j = 1; j <= ElementsInLine(i); j++)
-      GetDataRef(i, j) *= v;
-  return *this;
-  }
-
-
-
-char SparseMatrix :: Used (INDEX i, INDEX j) const
-  {
-  if (Symmetric() && j > i) swap (i, j);
-
-  if (i < 1 || i > height) return 0;
-
-  const colstruct * col = lins.Get(i).col;
-  INDEX max = lins.Get(i).size;
-
-  for (int k = 0; k < max; k++, col++)
-    if (col->colnr == j) return 1;
-
-  return 0;
-  }
-
-
-
-double SparseMatrix :: Get(INDEX i, INDEX j) const
-  {
-  if (Symmetric() && j > i) swap (i, j);
-
-  const colstruct * col = lins.Get(i).col;
-  INDEX max = lins.Get(i).size;
-
-  int l = 0, k = 1, newind;
-
-  while (k < max)
-    k <<= 1;
-
-
-  while (k > 0)
-    {
-    k >>= 1;
-    newind = k+l;
-    if (newind >= max) continue;
-    if (col[newind].colnr <= j)
-      l += k;
-    }
-
-  if (l < max && col[l].colnr == j) return col[l].data;
-
-  return 0;
-
-  /*
-  for (INDEX k = 0; k < max; k++, col++)
-    if (col->colnr == j) 
-      {
-	if (l != k) cerr << "Set: ind not ok" << endl;
-        else cerr << "is ok" << endl;
-      return col->data;
-      }
-
-  return 0;
-  */
-  }
-
-
-void SparseMatrix :: Set(INDEX i, INDEX j, double v)
-  {
-  Elem (i, j) = v;
-  }
-
-
-
-double & SparseMatrix :: Elem(INDEX i, INDEX j)
-  {
-  if (Symmetric() && j > i) swap (i, j);
-
-  linestruct * lin = &lins.Elem(i);
-  colstruct * col, *ncol;
-
-  int size = lin->size;
-  int pos;
-
-  if (size)
-    {
-
-    // bereits Elemente in der Liste
-
-    if (j > lin->col[size-1].colnr)
-      {
-
-      // neues Element an letzter Position einfuegen
-
-      if (lin->maxsize > size)
-        {
-        lin->size++;
-        lin->col[size].colnr = j;
-        return lin->col[size].data = 0;
-        }
-
-      if ( (ncol = NewColStruct(lin->maxsize+4)/* new colstruct[lin->maxsize+4] */) != NULL)
-        {
-        memcpy (ncol, lin->col, sizeof(colstruct) * size);
-
-        DeleteColStruct (lin->col, lin->maxsize);
-
-        lin->maxsize += 4;
-        lin->col = ncol;
-        lin->size++;
-        ncol[size].colnr = j;
-        return ncol[size].data = 0;
-        }
-      else
-        {
-        (*myerr) << "SparseMatrix::Elem: Out of memory 1" << endl;
-        return shit;
-        }
-
-      }
-    else
-      {
-
-      for (col = lin->col; col->colnr < j; col++);
-                                        // Zeilenliste durchsuchen
-
-      if (col->colnr == j) return col->data;
-                                        // Element exisitiert bereits
-
-      if (lin->maxsize > size)
-        {
-        memmove (col+1, col, size_t((char*)&lin->col[size] - (char*)col));
-
-        lin->size++;
-        col->colnr = j;
-        return col->data = 0;
-        }
-
-      pos = size_t (col - lin->col);
-
-      if ( (ncol = NewColStruct(lin->maxsize+4) ) != NULL)
-        {
-
-        if (pos) memcpy (ncol, lin->col, sizeof(colstruct) * pos);
-        memcpy (ncol+(pos+1), col, sizeof(colstruct) * (size-pos));
-
-        DeleteColStruct (lin->col, lin->maxsize);
-//        delete lin->col;
-
-        lin->maxsize += 4;
-        lin->col = ncol;
-        lin->size++;
-        ncol[pos].colnr = j;
-        return ncol[pos].data = 0;
-        }
-      else
-        {
-        (*myerr) << "SparseMatrix::Elem: Out of memory 2" << endl;
-        return shit;
-        }
-      }
-    }
-  else
-    {
-    // kein Element in der Liste
-
-    if (lin->maxsize)
-      {
-      // Liste bereits angelegt
-
-      lin->size = 1;
-      lin->col->colnr = j;
-      return lin->col->data = 0;
-      }
-    else
-      {
-      if ( (lin->col = NewColStruct(6) ) != NULL )
-        {
-        lin->maxsize = 6;
-        lin->size = 1;
-        lin->col->colnr = j;
-        return lin->col->data = 0;
-        }
-      else
-        {
-        (*myerr) << "SparseMatrix::Elem: Out of memory 3" << endl;
-        return shit;
-        }
-      }
-    }
-  }
-
-
-
-void SparseMatrix :: Delete (INDEX i, int nr)
-  {
-  colstruct * col = lins[i].col;
-
-  nr--;
-  while (nr < lins[i].size-1)
-    {
-    col[nr].data = col[nr+1].data;
-    col[nr].colnr = col[nr+1].colnr;
-    nr++;
-    }
-  lins[i].size--;
-  }
-
-void SparseMatrix :: DeleteElem (INDEX i, INDEX j)
-  {
-  int nr;
-  int dec = 0;
-
-  if (Symmetric() && j > i) swap (i, j);
-
-  colstruct * col = lins[i].col;
-
-  for (nr = 0; nr < lins[i].size; nr++)
-    {
-    if (dec)
-      {
-      col[nr-1].data = col[nr].data;
-      col[nr-1].colnr = col[nr].colnr;
-      }
-    if (col[nr].colnr == j) dec = 1;
-    }
-  if (dec)
-    lins[i].size--;
-  }
-
-
-void SparseMatrix :: SetLineAllocSize (INDEX i, int j)
-  {
-  colstruct * ncol;
-
-
-  if (lins[i].maxsize < j)
-    {
-    if ( (ncol = NewColStruct(j)) != NULL)
-      {
-      memcpy (ncol, lins[i].col, sizeof(colstruct) * lins[i].size);
-
-      if (lins[i].maxsize)
-        DeleteColStruct (lins[i].col, lins[i].maxsize);
-
-      lins[i].maxsize = j;
-      lins[i].col = ncol;
-      }
-    else
-      (*myerr) << "SPARSE_MATIRX :: SetLineAllocSize: Out of Memory" << endl;
-    }
-  }
-
-
-
-
-
-
-
-
-
-  
-  
-
-
-
-SparseMatrix operator* (const SparseMatrix & m1,
-                         const SparseMatrix & m2)
-  {
-  SparseMatrix m(m1.Height(), m2.Width());
-  INDEX i, j, k, nr;
-
-  if (!m1.Symmetric() && !m2.Symmetric())
-    {
-    for (i = 1; i <= m1.Height(); i++)
-      {
-      for (j = 1; j <= m1.ElementsInLine(i); j++)
-        {
-        nr = m1.GetIndex (i, j);
-        for (k = 1; k <= m2.ElementsInLine(nr); k++)
-          {
-          m(i, m2.GetIndex(nr, k)) += m1.GetData(i, j) * m2.GetData(nr, k);
-          }
-        }
-      }
-    }
-  else
-    {
-    (*myerr) << "SparseMatrix :: operator* not implemented for symmetric case" << endl;
-    }
-  return m;
-  }
-
-
-SparseMatrix & SparseMatrix :: operator+= (const SparseMatrix & m2)
-  {
-  INDEX i, k;
-  int j;
-
-  if (Symmetric() == m2.Symmetric())
-    {
-    for (i = 1; i <= Height(); i++)
-      for (j = 1; j <= m2.ElementsInLine (i); j++)
-        {
-        k = m2.GetIndex (i, j);
-        Elem(i, k) += m2.GetData (i, j);
-        }
-    }
-  else
-    {
-    (*myerr) << "SparseMatrix :: operator+= not implemented for different cases" << endl;
-    }
-  return *this;
-  }
-
-
-
-SparseMatrix & SparseMatrix :: operator*= (const SparseMatrix & m2)
-  {
-  INDEX i, k;
-  int j, l;
-  colstruct * cs;
-  int ms, s;
-
-  if (!Symmetric() && !m2.Symmetric())
-    {
-    for (i = 1; i <= Height(); i++)
-      {
-      cs = lins[i].col;
-      s = lins[i].size;
-      ms = lins[i].maxsize;
-
-      lins[i].col = NULL;
-      lins[i].size = 0;
-      lins[i].maxsize = 0;
-
-
-      for (j = 0; j < s; j++)
-        {
-        k = cs[j].colnr;
-
-        for (l = 1; l <= m2.ElementsInLine (k); l++)
-          Elem(i, m2.GetIndex(k, l)) += cs[j].data * m2.GetData(k, l);
-        }
-
-      DeleteColStruct (cs, ms);
-      }
-    }
-  else
-    {
-    (*myerr) << "SparseMatrix :: operator*= not implemented for Symmetric matrices" << endl;
-    }
-
-  return *this;
-  }
-
-
-void SparseMatrix :: Solve (const Vector & v, Vector & sol) const
-  {
-  SparseMatrix temp = *this;
-  INDEX i, j, nr, k;
-  double q;
-
-  sol = v;
-
-
-  if (!Symmetric())
-    {
-    for (i = 1; i <= Height(); i++)
-      {
-      if (temp.ElementsInLine(i) < 1 || temp.GetIndex(i, 1) != i)
-        {
-        (*myerr) << "i = " << i << endl;
-        (*myerr) << "Solve: Matrix singular" << endl;
-        char ch;
-        cin >> ch;
-        }
-      for (j = 2; j <= temp.ElementsInLine(i); j++)
-        {
-        nr = temp.GetIndex(i, j);
-        if (temp.GetIndex(nr, 1) != i)
-          {
-          (*myerr) << temp << endl;
-          (*myerr) << "i = " << i << "j = " << j << "nr = " << nr << endl;
-          (*myerr) << "Solve: Graph not symmetrix" << endl;
-          char ch;
-          cin >> ch;
-          }
-
-        q = temp.GetData (nr, 1) / temp.GetData(i, 1);
-        temp.Delete (nr, 1);
-
-        for (k = 2; k <= temp.ElementsInLine (i); k++)
-          temp.Elem(nr, temp.GetIndex(i, k)) -= q * temp.GetData(i, k);
-
-        sol(nr) -= q * sol(i);
-        }
-      }
-
-    for (i = temp.Height(); i >= 1; i--)
-      {
-      for (j = 2; j <= temp.ElementsInLine(i); j++)
-        {
-        sol(i) -= temp.GetData(i, j) * sol(temp.GetIndex(i, j));
-        }
-      sol(i) /= temp.GetData(i, 1);
-      }
-    }
-  else
-    (*myerr) << "SparseMatrix :: Solve not implemented for symmetic case" << endl;
-  }
-
-
-
-
-
-void Transpose (const SparseMatrix & m1, SparseMatrix & m2)
-  {
-  INDEX i, j;
-
-  m2.SetSize(m1.Width(), m1.Height());
-  m2.SetSymmetric(m1.Symmetric());
-
-  if (!m1.Symmetric())
-    {
-    for (i = 1; i <= m1.Height(); i++)
-      for (j = 1; j <= m1.ElementsInLine(i); j++)
-        m2(m1.GetIndex(i, j), i) = m1.GetData(i, j);
-    }
-  else
-    m2 = m1;
-  }
-
-
-
-BaseMatrix * SparseMatrix :: Copy () const
-  {
-  return new SparseMatrix (*this);
-  }
-
-
-
-
-
-
-
-void SparseMatrix :: AddRowMatrix (INDEX row, const SparseMatrix & m2)
-  {
-  int i1, i2, i;
-  colstruct * cs1, * cs2, * ncs;
-  int s1, s2, s;
-
-  s1 = lins[row].size;
-  s2 = m2.lins[1].size;
-  cs1 = lins[row].col;
-  cs2 = m2.lins[1].col;
-
-  i1 = 0;
-  i2 = 0;
-  i = 0;
-
-
-  if (Symmetric())
-    {
-    while (s2 && cs2[s2-1].colnr > row) s2--;
-    }
-
-
-  while (i1 < s1 && i2 < s2)
-    {
-    if (cs1[i1].colnr < cs2[i2].colnr) i1++;
-    else if (cs1[i1].colnr > cs2[i2].colnr) i2++;
-    else { i1++; i2++; }
-    i++;
-    }
-
-  i += (s1 - i1);
-  i += (s2 - i2);
-
-  s = i;
-
-  if (s > s1)
-    {
-    ncs = NewColStruct (s);
-
-    i1 = 0;
-    i2 = 0;
-    i = 0;
-
-    while (i1 < s1 && i2 < s2)
-      {
-      if (cs1[i1].colnr < cs2[i2].colnr)
-        {
-        ncs[i].colnr = cs1[i1].colnr;
-        ncs[i].data = cs1[i1].data;
-        i1++;
-        }
-      else if (cs1[i1].colnr > cs2[i2].colnr)
-        {
-        ncs[i].colnr = cs2[i2].colnr;
-        ncs[i].data = cs2[i2].data;
-        i2++;
-        }
-      else
-        {
-        ncs[i].colnr = cs1[i1].colnr;
-        ncs[i].data = cs1[i1].data + cs2[i2].data;
-        i1++;
-        i2++;
-        }
-      i++;
-      }
-
-    while (i1 < s1)
-      {
-      ncs[i].colnr = cs1[i1].colnr;
-      ncs[i].data = cs1[i1].data;
-      i1++;
-      i++;
-      }
-
-    while (i2 < s2)
-      {
-      ncs[i].colnr = cs2[i2].colnr;
-      ncs[i].data = cs2[i2].data;
-      i2++;
-      i++;
-      }
-
-    if (lins[row].maxsize)
-      DeleteColStruct (cs1, lins[row].maxsize);
-
-    lins[row].col = ncs;
-    lins[row].size = s;
-    lins[row].maxsize = s;
-    }
-
-
-  else
-    {
-    i1 = 0;
-    i2 = 0;
-
-    while (i2 < s2)
-      {
-      if (cs1[i1].colnr == cs2[i2].colnr)
-        {
-        cs1[i1].data += cs2[i2].data;
-        i2++;
-        }
-      i1++;
-      }
-    }
-  }
-
-
-double SparseMatrix :: RowTimesVector (INDEX i, const Vector & v) const
-  {
-  const linestruct * lin;
-  const colstruct * col;
-  double sum;
-  int j;
-
-  if (Width() > v.Size())
-    {
-    cerr << "SparseMatrix::RowTimesVector: Size doesn't fit" << endl;
-    return 0;
-    }
-
-  lin = &lins.Get(i);
-  sum = 0;
-  col = lin->col;
-
-  for (j = lin->size; j > 0; j--, col++)
-    sum += col->data * v.Get(col->colnr);
-
-  return sum;
-  }
-  
-void SparseMatrix :: AddRowToVector (INDEX i, double s, Vector & v) const
-  {
-  const linestruct * lin;
-  const colstruct * col;
-  int j;
-
-  if (Width() > v.Size())
-    {
-    cerr << "SparseMatrix::AddRowToVector: Size doesn't fit" 
-    	 << "w = " << Width() << " len = " << v.Size() << endl;
-    return;
-    }
-
-  lin = &lins.Get(i);
-  col = lin->col;
-
-  for (j = lin->size; j > 0; j--, col++)
-    v.Elem(col->colnr) += s * col->data;
-  }
-
-
-static ARRAY<void*> poolarray;
-static ARRAY<int> poolsizes;
-
-
-SparseMatrix::colstruct * SparseMatrix :: NewColStruct (int s)
-  {
-//  return new colstruct[s];
-
-
-  int i, j;
-  void * p;
-  colstruct * cs;
-
-  if (s > 20) return new colstruct[s];
-
-  for (i = 1; i <= poolsizes.Size(); i++)
-    if (poolsizes.Get(i) == s) break;
-
-  if (i > poolsizes.Size())
-    {
-    poolsizes.Append(s);
-    poolarray.Append((void*)NULL);
-    i = poolsizes.Size();
-    }
-
-  p = poolarray.Get(i);
-  if (!p)
-    {
-    poolarray.Elem(i) = p = cs = new colstruct[10 * s];
-    for (j = 0; j < 9; j++)
-      *(void**)(void*)(&cs[s * j]) = &cs[s * (j+1)];
-    *(void**)(void*)(&cs[s * 9]) = NULL;
-    }
-
-  poolarray.Elem(i) = *(void**)p;
-  return (colstruct*)p;
-  }
-
-void SparseMatrix :: DeleteColStruct (colstruct * cs, int s)
-  {
-//  delete cs;
-//  return;
-
-  int i;
-
-  if (s > 20)
-    {
-    delete cs;
-    return;
-    }
-
-  for (i = 1; i <= poolsizes.Size(); i++)
-    if (poolsizes.Get(i) == s) break;
-
-
-  if (i > poolsizes.Size())
-    {
-    (*myerr) << "SparseMatrix :: DeleteColStruct: Size not found" << endl;
-    return;
-    }
-
-
-  *(void**)(void*)cs = poolarray.Get(i);
-  poolarray.Elem(i) = cs;
-  }
-
-void SparseMatrix :: SetGraph (const class TABLE<INDEX> & graph)
-  { 
-  int i, j, es, ad, nne;
-  colstruct * block;
-  
-  nne = 0;
-  for (i = 1; i <= graph.Size(); i++)
-    {
-    if (Symmetric())
-      {
-      es = 0;
-      for (j = 1; j <= graph.EntrySize(i); j++)
-        if (graph.Get(i, j) <= i)
-          es++;
-      }
-    else
-      es = graph.EntrySize(i);
-    nne += es;
-    }
-    
-  oneblock = 1;
-  block = new colstruct[nne];
-  
-  ad = 0;
-  for (i = 1; i <= graph.Size(); i++)
-    {
-    if (Symmetric())
-      {
-      es = 0;
-      for (j = 1; j <= graph.EntrySize(i); j++)
-        if (graph.Get(i, j) <= i)
-          es++;
-      }
-    else
-      es = graph.EntrySize(i);
-      
-    lins.Elem(i).size = 0;
-    lins.Elem(i).maxsize = es;
-    lins.Elem(i).col = &block[ad];
-    ad += es;
-    }
-  }
-
-
-
-
-#endif
-}
-#endif
diff --git a/contrib/Netgen/libsrc/linalg/sparsmat.hpp b/contrib/Netgen/libsrc/linalg/sparsmat.hpp
deleted file mode 100644
index 74aaa3134eaf3bd139017924637f8dd259d5144b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/sparsmat.hpp
+++ /dev/null
@@ -1,265 +0,0 @@
-#ifdef NONE
-
-#ifndef FILE_SPARSMAT
-#define FILE_SPARSMAT
-
-/* *************************************************************************/
-/* File:   sparsmat.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Oct. 94                                                    */
-/* *************************************************************************/
-
-
-class SparseMatrix;
-
-/** 
-  The graph of a sparse matrix.
-  The graph is stored for a non-symmetric matrix
-*/
-class MatrixGraph
-{
-  /// data structure for one row of matrix
-  struct linestruct 
-  { 
-    /// allocated size
-    int allocsize;    
-    /// used size
-    int size;    
-    /// diag element (always allocated)      
-    int diag;  
-    /// colume numbers  
-    INDEX* col;
-  };
-
-  /// graph of matrix
-  ARRAY<linestruct> lines;
-  /// increment of allocated line-memory on overflow
-  int increment;
-  
-public:
-  //@{ @name Constructors, Destructor
-
-  /// Height of matrix, increment value for line-overflow
-  MatrixGraph (int size, int aincrement = 5);
-  /// Allocates graph with elements per row given in ARRAY linesize
-  MatrixGraph (const ARRAY<int> & linesize);
-  //@}
-
-  
-  /// returns position of Element (i, j), 0 for unused
-  int GetPosition (INDEX i, INDEX j) const;
-
-  /// returns position of new element
-  int CreatePosition (INDEX i, INDEX j); 
-
-  /// Returns height of matrix
-  int Size() const { return lines.Size(); }
-
-
-  friend class SparseMatrix;
-  friend class SparseMatrixFlex;
-  friend class SparseMatrixFix;
-  friend class PointJacobiPrecond;
-};
-
-
-
-
-
-
-/**
-  Base class for sparse matrix.
-  Matrix to work with in most applications
-  */
-class SparseMatrix : public BaseMatrix
-{
-protected:
-  /// graph of matrix
-  const MatrixGraph * graph;
-  /// pointer to matrix values in each row
-  ARRAY<double*> data;
-
-public:
-
-  /// returns reference, fail save but slow
-  virtual double & operator() (INDEX i, INDEX j);
-  /// returns value, fail save but slow
-  virtual double operator() (INDEX i, INDEX j) const;
-
-
-  /// prod = matrix x v
-  virtual void Mult (const Vector & v, Vector & prod) const;
-  /// prod = matrix^T x v
-  virtual void MultTrans (const Vector & v, Vector & prod) const;
-  /// res = b - mat x x
-  virtual void Residuum (const Vector & x, const Vector & b, 
-			 Vector & res) const;
-  /// res = b - mat^T x x
-  virtual void ResiduumTrans (const Vector & x, const Vector & b,
-			      Vector & res) const;
-
-
-  /**
-    Add element matrix to sparse matrix.
-    The graph of the element-matrix must be symmetric.
-    Global point numbers are given in pnum.
-   */
-  virtual void AddElementMatrix (const ARRAY<INDEX> & pnum, const BaseMatrix & elemmat);
-
-  /// for multigrid-extension, should be removed from here
-  void GSStepToInner (const Vector & b, Vector & x, double dump,
-      const BitArray & inner) const;
-
-  /// for multigrid-extension, should be removed from here
-  void GSStepBackToInner (const Vector & b, Vector & x, double dump,
-      const BitArray & inner) const;
-
-  /// 
-  virtual ostream & Print (ostream & s) const;
-
-  /** Scalar product of i-th row times vector.
-    For symmetric matrices only lower left block 
-    (including diagonal) is used.
-    */
-  double RowTimesVector (INDEX i, const Vector & v) const;
-  /** Adds s times the i-th row of matrix to vector v.
-    For symmetric matrices only lower left block 
-    (including diagonal) is used.
-    */
-  void AddRowToVector (INDEX i, double s, Vector & v) const;
-
-  /** Number of elements in line.
-    For symmetric matrices GetDiagPos must be used for
-    most purposes.
-    */
-  int ElementsInLine (INDEX i) const 
-    { return graph->lines.Get(i).size; }
-
-  /** Columne index of nr-th non-zero element in row i */
-  INDEX GetColIndex (INDEX i, int nr) const
-    { return graph->lines.Get(i).col[nr-1]; }
-
-  /** Referece to columne index of nr-th non-zero 
-    element in row i */
-  const INDEX & GetColIndexRef (INDEX i, int nr) const
-    { return graph->lines.Get(i).col[nr-1]; }
-
-  /** Value of nr-th non-zero element in row i */
-  double GetData (INDEX i, int nr) const 
-    { return data.Get(i)[nr-1]; }
-
-  /** Reference to value of nr-th non-zero element in row i */
-  const double & GetDataRef (INDEX i, int nr) const
-    { return data.Get(i)[nr-1]; }
-
-  /** Returns value of diagonal element in row i */
-  double GetDiag (INDEX i) const 
-    { return data.Get(i)[graph->lines.Get(i).diag-1]; }
-
-  /** Which position has diagonal element in row i ? */
-  int GetDiagPos (INDEX i) const
-    { return graph->lines.Get(i).diag; }
-
-  /** Returns matrix value of row i, col j.
-    For symmetric matrices the indices will be sorted in
-    this function */
-  double Get(INDEX i, INDEX j) const;
-
-  /** Set value of element (i, j) to v.
-    For symmetric matrices element (j, i) is set. */
-  void Set(INDEX i, INDEX j, double v);
-
-  /** Returns reference to element (i, j).
-    For symmetric matrices a reference to (j, i) is returned */
-  double & Elem(INDEX i, INDEX j);
-
-  /** Is element (i, j) used ? */
-  char Used (INDEX i, INDEX j) const;
-
-protected:
-  /// A sparse matrix must not be constructed
-  SparseMatrix (INDEX h, INDEX w = 0);
-  /// Allocates matrix position
-  virtual int CreatePosition (INDEX i, INDEX j) = 0;
-
-private:
-  ///
-  friend class ScalarBlockJacobiPrecond;
-  friend class PointJacobiPrecond;
-};
-
-
-
-
-/** Sparse matrix with flexible graph.
-  On demand, a matrix position is allocated */
-class SparseMatrixFlex : public SparseMatrix
-{ 
- /// non-const pointer to graph.
- MatrixGraph * mygraph;
-
-public:
-  ///
-  SparseMatrixFlex ();
-  ///
-  SparseMatrixFlex (INDEX h, INDEX w = 0);
-  ///
-  SparseMatrixFlex (const SparseMatrix & m2);
-  ///
-  virtual ~SparseMatrixFlex ();
-
-  /// 
-  virtual void SetSize (INDEX h, INDEX w = 0);
-  ///
-  virtual void SetSymmetric (int sym = 1);
-  ///
-  virtual void ChangeSize (INDEX h, INDEX w = 0);
-  ///
-  void DeleteElements ();
-
-
-  ///
-  SparseMatrix & operator= (const SparseMatrix & m2);
-  ///
-  SparseMatrix & operator*= (double v);
-
-
-  ///
-  virtual BaseMatrix * Copy () const;
-  ///
-  void Delete (INDEX i, int nr);
-  ///
-  void DeleteElem (INDEX i, INDEX j);
-
-  ///
-  void SetLineAllocSize (INDEX i, int j);
-
-protected:
-  ///
-  virtual int CreatePosition (INDEX i, INDEX j);
-
-};
-
-
-
-
-/** Sparse matrix with fixed graph.
-  After construction of the matrix, the graph
-  must not be changed. */
-class SparseMatrixFix : public SparseMatrix
-{
-public:
-  ///
-  SparseMatrixFix (const MatrixGraph & agraph, int asymmetric = 0);
-  ///
-  virtual ~SparseMatrixFix ();
-  
-protected:
-  /// CreatePosition is not allowed for SparseMatrixFix -> error
-  virtual int CreatePosition (INDEX i, INDEX j);
-};
-
-
-#endif
-
-#endif
diff --git a/contrib/Netgen/libsrc/linalg/vector.cpp b/contrib/Netgen/libsrc/linalg/vector.cpp
deleted file mode 100644
index 05b5a0a71e87a73fb3dc2562b37079ae228c9e82..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/vector.cpp
+++ /dev/null
@@ -1,787 +0,0 @@
-#ifdef abc
-#include <mystdlib.h>
-#include <linalg.hpp>
-#include <algorithm>
-
-namespace netgen
-{
-
-double BaseVector :: shit = 0;
-
-// %FD Constructs a vector of length zero
-BaseVector :: BaseVector ()
-  {
-  length = 0;
-  }
-
-// %FD Constructs a vector of given length
-BaseVector :: BaseVector (
-    INDEX alength  // length of the vector
-    )
-  {
-  length = alength;
-  }
-
-// %FD Sets length of the vector, old vector will be destroyed
-void
-BaseVector :: SetLength (
-    INDEX alength        // new length of the vector
-    )
-  {
-  length = alength;
-  }
-
-// %FD Changes length of the vector, old values stay valid
-void
-BaseVector :: ChangeLength (
-    INDEX alength        // new length of the vector
-    )
-  {
-  length = alength;
-  }
-
-
-
-// %FD { Write a vector with the help of the '<<' operator onto a stream }
-ostream &    // stream for further use
-operator<< (
-    ostream & s,            // stream to write vector onto
-    const BaseVector & v   // vector to write
-    )
-  {
-  return v.Print (s);
-  }
-
-
-// %FD{ Divides every component of the vector by the scalar c.
-//      The function checks for division by zero }
-BaseVector &      // result vector
-BaseVector :: operator/= (
-    double c       // scalar to divide by
-    )
-  {
-  if (c)
-    return (*this) *= (1/c);
-  else
-    {
-    (*myerr) << "operator/=: division by zero" << endl;
-    return *this;
-    }
-  }
-
-
-// %FD Creates a copy of the object
-BaseVector *      // pointer to the new vector
-BaseVector :: Copy () const
-  {
-  cerr << "Base_vector::Copy called" << endl << flush;
-  return NULL;
-  }
-
-
-
-
-void BaseVector :: GetElementVector (const ARRAY<INDEX> & pnum,
-				 BaseVector & elvec) const
-{
-  int i;
-  for (i = 1; i <= pnum.Size(); i++)
-    elvec(i) = (*this)(pnum.Get(i));
-}
-
-void BaseVector :: SetElementVector (const ARRAY<INDEX> & pnum,
-				 const BaseVector & elvec)
-{
-  int i;
-  for (i = 1; i <= pnum.Size(); i++)
-    (*this)(pnum.Get(i)) = elvec(i);
-}
-
-
-void BaseVector :: AddElementVector (const ARRAY<INDEX> & pnum,
-				 const BaseVector & elvec)
-{
-  int i;
-  for (i = 1; i <= pnum.Size(); i++)
-    (*this)(pnum.Get(i)) += elvec(i);
-}
-
-
-
-
-
-
-
-
-
-
-
-TempVector :: ~TempVector ()
-  {
-  delete vec;
-  }
-
-TempVector BaseVector :: operator+ (const BaseVector & v2) const
-  {
-  return (*Copy()) += v2;
-  }
-
-TempVector BaseVector :: operator- (const BaseVector & v2) const
-  {
-  return (*Copy()) -= v2;
-  }
-
-TempVector BaseVector :: operator- () const
-  {
-  return (*Copy()) *= -1;
-  }
-
-
-TempVector operator* (const BaseVector & v1, double scal) 
-  {
-  return (*v1.Copy()) *= scal;
-  }
-
-TempVector operator/ (const BaseVector & v1, double scal) 
-  {
-  return (*v1.Copy()) /= scal;
-  }
-
-
-TempVector operator* (double scal, const BaseVector & v1)
-  {
-  return v1 * scal;
-  }
-
-
-
-
-
-BaseVector * TempVector :: Copy () const
-  {
-  return vec->Copy();
-  }
-
-
-
-
-
-
-
-
-
-
-double Vector :: shit = 0;
-
-class clVecpool
-{
-public:
-  ARRAY<double *> vecs;
-  ARRAY<INDEX> veclens;
-
-  ~clVecpool();
-};
-
-clVecpool :: ~clVecpool()
-{
-  int i;
-  for (i = 1; i <= vecs.Size(); i++)
-    delete vecs.Elem(i);
-}
-
-static clVecpool vecpool;
-
-
-
-static double * NewDouble (INDEX len)
-{
-  if (len < 10)
-    return new double[len];
-  else
-    {
-      int i;
-      for (i = 1; i <= vecpool.veclens.Size(); i++)
-	if (vecpool.veclens.Get(i) == len)
-	  {
-	    double * hvec = vecpool.vecs.Get(i);
-	    vecpool.vecs.DeleteElement(i);
-	    vecpool.veclens.DeleteElement(i);
-	    return hvec;
-	  }
-
-      return new double[len];
-    }
-}
-
-static void DeleteDouble (INDEX len, double * dp)
-{
-  if (len < 10)
-    delete [] dp;
-  else
-    {
-      vecpool.vecs.Append (dp);
-      vecpool.veclens.Append (len);
-    }
-}
-
-
-
-Vector :: Vector () : BaseVector()
-  {
-  data = NULL;
-  }
-
-Vector :: Vector (INDEX alength) : BaseVector (alength)
-  {
-  if (length)
-    {
-      //    data = new double[length];
-      data = NewDouble (length);
-
-    if (!data)
-      {
-      length = 0;
-      (*myerr) << "Vector not allocated" << endl;
-      }
-    }
-  else
-    data = NULL;
-  }
-
-
-Vector :: Vector (const Vector & v2)
-  {
-  length = v2.length;
-
-  if (length)
-    {
-      //    data = new double[length];
-      data = NewDouble (length);
-
-    if (data)
-      {
-      memcpy (data, v2.data, length * sizeof (double));
-      }
-    else
-      {
-      length = 0;
-      (*myerr) << "Vector::Vector : Vector not allocated" << endl;
-      }
-    }
-  else
-    data = NULL;
-  }
-
-
-Vector :: ~Vector ()
-{
-  //  veclenfile << "~Vector delete: " << length << endl;
-  if (data) 
-    {
-      DeleteDouble (length, data);
-      //      delete [] data;
-    }
-
-}
-
-void Vector :: SetLength (INDEX alength)
-  {
-  if (length == alength) return;
-
-  if (data) 
-    {
-      DeleteDouble (length, data);
-      //      delete [] data;
-    }
-  data = NULL;
-  length = alength;
-
-  if (length == 0) return;
-  //  data = new double[length];
-  data = NewDouble (length);
-
-  if (!data)
-    {
-    length = 0;
-    (*myerr) << "Vector::SetLength: Vector not allocated" << endl;
-    }
-  }
-
-void Vector :: ChangeLength (INDEX alength)
-{
-  (*mycout) << "Vector::ChangeLength called" << endl;
-  if (length == alength) return;
-  
-  if (alength == 0)
-    {
-      //    delete [] data;
-      DeleteDouble (length, data);
-      length = 0;
-      return;
-    }
-  
-  double * olddata = data;
-
-  data = NewDouble (alength);
-  //  data = new double[alength];
-  if (!data)
-    {
-    length = 0;
-    (*myerr) << "Vector::SetLength: Vector not allocated" << endl;
-    delete [] olddata;
-    }
-
-  memcpy (data, olddata, min2(alength, length));
-
-  delete [] olddata;
-  length = alength;
-  }
-
-/// NEW RM
-void Vector::SetBlockLength (INDEX /* blength */)
-{
-  MyError("BaseVector::SetBlockLength was called for a Vector");
-}
-
-
-double & Vector :: operator() (INDEX i)
-  {
-  if (i >= 1 && i <= length) return Elem(i);
-  else (*myerr) << "\nindex " << i << " out of range ("
-                                << 1 << "," << Length() << ")\n";
-  return shit;
-  }
-
-double Vector :: operator() (INDEX i) const
-  {
-  if (i >= 1 && i <= length) return Get(i);
-  else (*myerr) << "\nindex " << i << " out of range ("
-                                << 1 << "," << Length() << ")\n" << flush;
-  return shit;
-  }
-
-
-
-double Vector :: SupNorm () const
-  {
-  double sup = 0;
-
-  for (INDEX i = 1; i <= Length(); i++)
-    if (fabs (Get(i)) > sup)
-      sup = fabs(Get(i));
-
-  return sup;
-  }
-
-double Vector :: L2Norm () const
-  {
-  double sum = 0;
-
-  for (INDEX i = 1; i <= Length(); i++)
-    sum += Get(i) * Get(i);
-
-  return sqrt (sum);
-  }
-
-double Vector :: L1Norm () const
-  {
-  double sum = 0;
-
-  for (INDEX i = 1; i <= Length(); i++)
-    sum += fabs (Get(i));
-
-  return sum;
-  }
-
-double Vector :: Max () const
-  {
-  if (!Length()) return 0;
-  double m = Get(1);
-  for (INDEX i = 2; i <= Length(); i++)
-    if (Get(i) > m) m = Get(i);
-  return m;
-  }
-
-double Vector :: Min () const
-  {
-  if (!Length()) return 0;
-  double m = Get(1);
-  for (INDEX i = 2; i <= Length(); i++)
-    if (Get(i) < m) m = Get(i);
-  return m;
-  }
-
-
-/*
-ostream & operator<<(ostream & s, const Vector & v)
-  {
-  int w = s.width();
-  if (v.Length())
-    {
-    s.width(0);
-    s << '(';
-    for (INDEX i = 1; i < v.Length(); i++)
-      {
-      s.width(w);
-      s << v.Get(i) << ",";
-      if (i % 8 == 0) s << endl << ' ';
-      }
-    s.width(w);
-    s << v.Get(v.Length()) << ')';
-    }
-  else
-    s << "(Vector not allocated)";
-
-  return s;
-  }
-*/
-
-ostream & Vector :: Print (ostream & s) const
-  {
-  int w = s.width();
-  if (Length())
-    {
-    s.width(0);
-    s << '(';
-    for (INDEX i = 1; i < Length(); i++)
-      {
-      s.width(w);
-      s << Get(i) << ",";
-      if (i % 8 == 0) s << endl << ' ';
-      }
-    s.width(w);
-    s << Get(Length()) << ')';
-    }
-  else
-    s << "(Vector not allocated)";
-
-  return s;
-  }
-
-
-
-BaseVector & Vector :: operator+= (const BaseVector & v2)
-  {
-  const Vector & hv2 = v2.CastToVector();
-
-  if (Length() == hv2.Length())
-    for (INDEX i = 1; i <= Length(); i++)
-      Elem (i) += hv2.Get(i);
-  else
-    (*myerr) << "operator+= illegal dimension" << endl;
-  return *this;
-  }
-
-BaseVector & Vector :: operator-= (const BaseVector & v2)
-  {
-  const Vector & hv2 = v2.CastToVector();
-
-  if (Length() == hv2.Length())
-    for (INDEX i = 1; i <= Length(); i++)
-      Elem (i) -= hv2.Get(i);
-  else
-    (*myerr) << "operator-= illegal dimension" << endl;
-  return *this;
-  }
-
-BaseVector & Vector :: operator*= (double c)
-  {
-  for (INDEX i = 1; i <= Length(); i++)
-    Elem(i) *= c;
-  return *this;
-  }
-
-
-
-BaseVector & Vector :: Add (double scal, const BaseVector & v2)
-  {
-  const Vector & hv2 = v2.CastToVector();
-
-  if (Length() == hv2.Length())
-    {
-    double * p1 = data;
-    double * p2 = hv2.data;
-
-    for (INDEX i = Length(); i > 0; i--)
-      {
-      (*p1) += scal * (*p2);
-      p1++; p2++;
-      }
-    }
-  else
-    (*myerr) << "Vector::Add: illegal dimension" << endl;
-  return *this;
-  }
-
-BaseVector & Vector :: Add2 (double scal, const BaseVector & v2,
-                             double scal3, const BaseVector & v3)
-  {
-  const Vector & hv2 = v2.CastToVector();
-  const Vector & hv3 = v3.CastToVector();
-
-  if (Length() == hv2.Length())
-    {
-    double * p1 = data;
-    double * p2 = hv2.data;
-    double * p3 = hv3.data;
-
-    for (INDEX i = Length(); i > 0; i--)
-      {
-      (*p1) += (scal * (*p2) + scal3 * (*p3));
-      p1++; p2++; p3++;
-      }
-    }
-  else
-    (*myerr) << "Vector::Add: illegal dimension" << endl;
-  return *this;
-  }
-
-BaseVector & Vector :: Set (double scal, const BaseVector & v2)
-  {
-  const Vector & hv2 = v2.CastToVector();
-
-  if (Length() == hv2.Length())
-    {
-    double * p1 = data;
-    double * p2 = hv2.data;
-
-    for (INDEX i = Length(); i > 0; i--)
-      {
-      (*p1) = scal * (*p2);
-      p1++; p2++;
-      }
-    }
-  else
-    (*myerr) << "Vector::Set: illegal dimension" << endl;
-  return *this;
-  }
-
-
-BaseVector & Vector :: Set2 (double scal , const BaseVector & v2,
-      double scal3, const BaseVector & v3)
-  {
-  const Vector & hv2 = v2.CastToVector();
-  const Vector & hv3 = v3.CastToVector();
-
-
-  if (Length() == hv2.Length())
-    {
-    double * p1 = data;
-    double * p2 = hv2.data;
-    double * p3 = hv3.data;
-
-    for (INDEX i = Length(); i > 0; i--)
-      {
-      (*p1) = scal * (*p2) + scal3 * (*p3);
-      p1++; p2++; p3++;
-      }
-    }
-  else
-    (*myerr) << "Vector::Set: illegal dimension" << endl;
-  return *this;
-  }
-
-
-void Vector :: GetPart (int startpos, BaseVector & v2) const
-{
-  Vector & hv2 = v2.CastToVector();
-
-  if (Length() >= startpos + v2.Length() - 1)
-    {
-      const double * p1 = &Get(startpos);
-      double * p2 = &hv2.Elem(1);
-      
-      memcpy (p2, p1, hv2.Length() * sizeof(double));
-    }
-  else
-    MyError ("Vector::GetPart: Vector to short");
-}
-
-
-// NEW RM
-void Vector :: SetPart (int startpos, const BaseVector & v2)
-{
-  const Vector & hv2 = v2.CastToVector();
-  INDEX i;
-  INDEX n = v2.Length();
-
-  if (Length() >= startpos + n - 1)
-    {
-      double * p1 = &Elem(startpos);
-      const double * p2 = &hv2.Get(1);
-
-      for (i = 1; i <= n; i++)
-	{
-	  (*p1) = (*p2);
-	  p1++;
-	  p2++;
-	}
-    }
-  else
-    MyError ("Vector::SetPart: Vector to short");
-}
-
-void Vector :: AddPart (int startpos, double val, const BaseVector & v2)
-{
-  const Vector & hv2 = v2.CastToVector();
-  INDEX i;
-  INDEX n = v2.Length();
-
-  if (Length() >= startpos + n - 1)
-    {
-      double * p1 = &Elem(startpos);
-      const double * p2 = &hv2.Get(1);
-
-      for (i = 1; i <= n; i++)
-	{
-	  (*p1) += val * (*p2);
-	  p1++;
-	  p2++;
-	}
-    }
-  else
-    MyError ("Vector::AddPart: Vector to short");
-}
-
-
-
-
-double Vector :: operator* (const BaseVector & v2) const
-  {
-  const Vector & hv2 = v2.CastToVector();
-
-  double sum = 0;
-  double * p1 = data;
-  double * p2 = hv2.data;
-
-  if (Length() == hv2.Length())
-    {
-    for (INDEX i = Length(); i > 0; i--)
-      {
-      sum += (*p1) * (*p2);
-      p1++; p2++;
-      }
-    }
-  else
-    (*myerr) << "Scalarproduct illegal dimension" << endl;
-  return sum;
-  }
-
-void Vector :: SetRandom ()
-  {
-  INDEX i;
-  for (i = 1; i <= Length(); i++)
-    Elem(i) = rand ();
-
-  double l2 = L2Norm();
-  if (l2 > 0)
-    (*this) /= l2;
-    //    Elem(i) = 1.0 / double(i);
-    //    Elem(i) = drand48();
-  }
-
-
-/*
-TempVector Vector :: operator- () const
-  {
-  Vector & sum = *(Vector*)Copy();
-
-  if (sum.Length () == Length())
-    {
-    for (INDEX i = 1; i <= Length(); i++)
-      sum.Set (i, Get(i));
-    }
-  else
-    (*myerr) << "operator+ (Vector, Vector): sum.Length() not ok" << endl;
-  return sum;
-  }
-*/
-
-BaseVector & Vector::operator= (const Vector & v2)
-  {
-  SetLength (v2.Length());
-
-  if (data == v2.data) return *this;
-  
-  if (v2.Length() == Length())
-    memcpy (data, v2.data, sizeof (double) * Length());
-  else
-    (*myerr) << "Vector::operator=: not allocated" << endl;
-
-  return *this;
-  }
-
-BaseVector & Vector::operator= (const BaseVector & v2)
-  {
-  const Vector & hv2 = v2.CastToVector();
-
-  SetLength (hv2.Length());
-
-  if (data == hv2.data) return *this;
-  
-  if (hv2.Length() == Length())
-    memcpy (data, hv2.data, sizeof (double) * Length());
-  else
-    (*myerr) << "Vector::operator=: not allocated" << endl;
-
-  return *this;
-  }
-
-
-BaseVector & Vector::operator= (double scal)
-  {
-  if (!Length()) (*myerr) << "Vector::operator= (double) : data not allocated"
-                      << endl;
-
-  for (INDEX i = 1; i <= Length(); i++)
-    Set (i, scal);
-
-  return *this;
-  }
-
-
-BaseVector * Vector :: Copy () const
-  {
-  return new Vector (*this);
-  }
-
-
-void Vector :: Swap (BaseVector & v2)
-  {
-  Vector & hv2 = v2.CastToVector();
-  swap (length, hv2.length);
-  swap (data, hv2.data);
-  }
-
-
-
-
-void Vector :: GetElementVector (const ARRAY<INDEX> & pnum,
-				 BaseVector & elvec) const
-{
-  int i;
-  Vector & helvec = elvec.CastToVector();
-  for (i = 1; i <= pnum.Size(); i++)
-    helvec.Elem(i) = Get(pnum.Get(i));
-}
-
-void Vector :: SetElementVector (const ARRAY<INDEX> & pnum,
-				 const BaseVector & elvec)
-{
-  int i;
-  const Vector & helvec = elvec.CastToVector();
-  for (i = 1; i <= pnum.Size(); i++)
-    Elem(pnum.Get(i)) = helvec.Get(i);
-}
-
-
-void Vector :: AddElementVector (const ARRAY<INDEX> & pnum,
-				 const BaseVector & elvec)
-{
-  int i;
-  const Vector & helvec = elvec.CastToVector();
-  for (i = 1; i <= pnum.Size(); i++)
-    Elem(pnum.Get(i)) += helvec.Get(i);
-}
-}
-#endif
diff --git a/contrib/Netgen/libsrc/linalg/vector.hpp b/contrib/Netgen/libsrc/linalg/vector.hpp
deleted file mode 100644
index acba49179206111ab8a432a6d50461f92591f972..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/vector.hpp
+++ /dev/null
@@ -1,485 +0,0 @@
-#ifndef FILE_VECTOR
-#define FILE_VECTOR
-
-/* *************************************************************************/
-/* File:   vector.hh                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Oct. 94                                                    */
-/* *************************************************************************/
-
-
-class FlatVector
-{
-protected:
-  int s;
-  double *data;
-public:
-  FlatVector () { ; }
-  FlatVector (int as, double * adata)
-  { s = as; data = adata; }
-
-  int Size () const
-  { return s; }
-
-  FlatVector & operator= (const FlatVector & v) 
-  { memcpy (data, v.data, s*sizeof(double)); return *this; }
-
-  FlatVector & operator= (double scal) 
-  {
-    for (int i = 0; i < s; i++) data[i] = scal; 
-    return *this;
-  }
-
-  double & operator[] (int i) { return data[i]; }
-  const double & operator[] (int i) const { return data[i]; }
-  double & operator() (int i) { return data[i]; }
-  const double & operator() (int i) const { return data[i]; }
-
-  double & Elem (int i) { return data[i-1]; }
-  const double & Get (int i) const { return data[i-1]; }
-  void Set (int i, double val) { data[i-1] = val; }
-
-  FlatVector & operator*= (double scal)
-  {
-    for (int i = 0; i < s; i++) data[i] *= scal;
-    return *this;
-  }
-
-  FlatVector & Add (double scal, const FlatVector & v2)
-  {
-    for (int i = 0; i < s; i++) 
-      data[i] += scal * v2.data[i];
-    return *this;
-  }
-
-  FlatVector & Set (double scal, const FlatVector & v2)
-  {
-    for (int i = 0; i < s; i++) 
-      data[i] = scal * v2.data[i];
-    return *this;
-  }
-
-  FlatVector & Set2 (double scal1, const FlatVector & v1,
-		 double scal2, const FlatVector & v2)
-  {
-    for (int i = 0; i < s; i++) 
-      data[i] = scal1 * v1.data[i] + scal2 * v2.data[i];
-    return *this;
-  }
-  
-  double L2Norm() const
-  {
-    double sum = 0;
-    for (int i = 0; i < s; i++)
-      sum += data[i] * data[i];
-    return sqrt (sum);
-  }
-
-  friend double operator* (const FlatVector & v1, const FlatVector & v2);
-};
-
-
-
-class Vector : public FlatVector
-{
-
-public:
-  Vector () 
-  { s = 0; data = 0; }
-  Vector (int as)
-  { s = as; data = new double[s]; }
-  ~Vector ()
-  { delete [] data; }
-
-  Vector & operator= (const FlatVector & v) 
-  { memcpy (data, &v.Get(1), s*sizeof(double)); return *this; }
-
-  Vector & operator= (double scal) 
-  {
-    for (int i = 0; i < s; i++) data[i] = scal; 
-    return *this;
-  }
-
-  void SetSize (int as)
-  {
-    if (s != as)
-      {
-	s = as;
-	delete [] data;
-	data = new double [s];
-      }
-  }
-
-};
-
-
-inline double operator* (const FlatVector & v1, const FlatVector & v2)
-{
-  double sum = 0;
-  for (int i = 0; i < v1.s; i++)
-    sum += v1.data[i] * v2.data[i];
-  return sum;
-}
-
-
-
-
-inline ostream & operator<< (ostream & ost, const FlatVector & v)
-{
-  for (int i = 0; i < v.Size(); i++)
-    ost << " " << setw(7) << v[i];
-  return ost;
-}
-
-
-
-
-
-
-
-
-
-
-#ifdef OLDVEC
-
-class TempVector;
-class Vector;
-class BlockVector;
-
-/** Data types for vectors.
-   
-   Every Vector data structure is derived from a BaseVector class.
-   A BaseVector provides virtual functions for the scalar-vector
-   and vector-vector operations. 
-   If the return value of a function is a vector, then there should
-   be used a TempVector class. This avoids one additional constructor/
-   destructor call.
-   Finally, a Vector - class contains the data of a Vector in dense
-   form.
-   
-   Vector - Operations:
-   
-     Vector ( x )       Constructor empty, with given length or 
-                        given vector to copy  
-                       
-     SetLength () 
-     ChangeLength()     Change vector-length with/without destroing the vector
-     Length()           return vector-length
-     
-     Copy()             Construct a vector of same type and contents
-     
-     operator()         Save vector access
-     Set, Get, Elem:    Fast vector access for setting, receiving and reference
-
-     +, -, *, =, +=, -=, *=, /=
-     			virtual vector operations
-                     
-     SupNorm, L2Norm, L1Norm, Min, Max
-			Vector operations 
-			
-     Set (s, v), Add (s, v)
-     			Fast scalar-vector operations
-     			
-     Print ()           stream output of a vector
-
-*/
-
-class BaseVector
-{
-protected:
-  ///
-  INDEX length;
-  ///
-  static double shit;
-  
-public:
-  ///
-  BaseVector ();
-  ///
-  BaseVector (INDEX alength);
-  ///
-  virtual ~BaseVector () { };
-  ///
-  virtual void SetSize (INDEX asize) { SetLength(asize); }
-  ///
-  virtual void SetLength (INDEX alength);
-  ///
-  virtual void ChangeLength (INDEX alength);
-  /// Size should be prefered !!!
-  INDEX Length () const { return length; }
-  /// 
-  INDEX Size() const { return length; }
-
-    // NEW RM ---> in BlockVector
-    // rtual void SetBlockLength (INDEX blength) = 0;
-
-  ///
-  virtual BaseVector & operator= (const BaseVector & /* v2 */) { return *this; }
-  ///
-  virtual BaseVector & operator= (double /* scal */) { return *this; }
-
-  ///
-  virtual double & operator() (INDEX /* i */) { return shit; }
-  ///
-  virtual double operator() (INDEX /* i */) const { return 0; }
-
-  ///
-  virtual double SupNorm () const = 0;
-  ///
-  virtual double L2Norm () const = 0;
-  ///
-  virtual double L1Norm () const = 0;
-  ///
-  virtual double Min () const = 0;
-  ///
-  virtual double Max () const = 0;
-
-  ///
-  virtual BaseVector & operator+= (const BaseVector & v2) = 0;
-  ///
-  virtual BaseVector & operator-= (const BaseVector & v2) = 0;
-  ///
-  virtual BaseVector & operator*= (double scal) = 0;
-  ///
-  virtual BaseVector & operator/= (double scal);
-
-  ///
-  virtual TempVector operator+ (const BaseVector & v2) const;
-  ///
-  virtual TempVector operator- (const BaseVector & v2) const;
-  ///
-  virtual TempVector operator- () const;
-  ///
-  virtual double operator* (const BaseVector & v2) const = 0;
-  ///
-  friend TempVector operator* (const BaseVector & v1, double scal);
-  ///
-  friend TempVector operator/ (const BaseVector & v1, double scal);
-  ///
-  friend TempVector operator* (double scal, const BaseVector & v1);
-
-  ///
-  virtual BaseVector & Add (double /* scal */, const BaseVector & /* v2 */) { return *this; }
-  ///
-  virtual BaseVector & Add2 (double /* scal */, const BaseVector & /* v2 */,
-                        double /* scal3 */, const BaseVector & /* v3 */) { return *this; }
-  ///
-  virtual BaseVector & Set (double /* scal */, const BaseVector & /* v2 */) { return *this; }
-  ///
-  virtual BaseVector & Set2 (double /* scal */, const BaseVector & /* v2 */,
-                        double /* scal3 */, const BaseVector & /* v3 */) { return *this; }
-
-    ///
-    virtual void SetRandom () { };
-
-    
-    ///
-    virtual void GetPart (int /* startpos */, 
-			  BaseVector & /* v2*/ ) const { };
-    ///
-    virtual void SetPart (int /* startpos */,  
-			  const BaseVector & /* v2 */) { };
-    ///
-    virtual void AddPart (int /* startpos */, double /* val */, 
-			  const BaseVector & /* v2 */) { };
-
-  ///
-  virtual void GetElementVector (const ARRAY<INDEX> & pnum,
-				 BaseVector & elvec) const;
-  ///
-  virtual void SetElementVector (const ARRAY<INDEX> & pnum,
-				 const BaseVector & elvec);
-  ///
-  virtual void AddElementVector (const ARRAY<INDEX> & pnum,
-				 const BaseVector & elvec);
-
-  ///
-  friend ostream & operator<<(ostream & s, const BaseVector & v);
-  ///
-  virtual ostream & Print (ostream & s) const { return s; }
-
-  ///
-  virtual BaseVector * Copy () const;
-  /// 
-  virtual int IsVector () const { return 0; }
-  ///
-  virtual int IsBlockVector () const { return 0; }
-  ///
-  virtual Vector & CastToVector () { return *(Vector*)this; }
-  ///
-  virtual const Vector & CastToVector () const { return *(Vector*)this; }
-  ///
-  virtual BlockVector & CastToBlockVector () { return *(BlockVector*)this; }
-  ///
-  virtual const BlockVector & CastToBlockVector () const { return *(BlockVector*)this; }
-  };
-
-
-///
-class TempVector : public BaseVector
-{
-  ///
-  BaseVector * vec;
-
-  public:
-  ///
-  TempVector (BaseVector & v1) { vec = & v1; }
-  ///
-  ~TempVector ();
-  ///
-  virtual Vector & CastToVector ()
-      { return vec->CastToVector(); }
-  ///
-  virtual const Vector & CastToVector () const
-      { return vec->CastToVector(); }
-  ///
-  virtual BlockVector & CastToBlockVector ()
-      { return vec->CastToBlockVector(); }
-  ///
-  virtual const BlockVector & CastToBlockVector () const
-      { return vec->CastToBlockVector(); }
-
-
-  ///
-  virtual BaseVector & operator+= (const BaseVector & /* v2 */) { return *this; }
-  ///
-  virtual BaseVector & operator-= (const BaseVector & /* v2 */) { return *this; }
-  ///
-  virtual BaseVector & operator*= (double /* scal */) { return *this; }
-  ///
-  virtual double operator* (const BaseVector & /* v2 */) const { return 0; }
-
-  ///
-  virtual double SupNorm () const { return vec->SupNorm(); }
-  ///
-  virtual double L2Norm () const { return vec->L2Norm(); }
-  ///
-  virtual double L1Norm () const { return vec->L1Norm(); }
-  ///
-  virtual double Min () const { return vec->Min(); }
-  ///
-  virtual double Max () const { return vec->Max(); }
-
-  ///
-  virtual void Swap (BaseVector &) { };
-  ///
-  virtual BaseVector * Copy () const;
-
-
-  };
-
-
-///
-class Vector : public BaseVector
-{
-  ///
-  double * data;
-  ///
-  static double shit;
-  
-public:
-  ///
-  Vector ();
-  ///
-  Vector (INDEX alength);
-  ///
-  Vector (const Vector & v2);
-  ///
-  virtual ~Vector ();
-
-  ///
-  virtual void SetLength (INDEX alength);
-  ///
-  virtual void ChangeLength (INDEX alength);
-  /// NEW RM
-  virtual void SetBlockLength (INDEX blength);
-
-  ///
-  virtual BaseVector & operator= (const BaseVector & v2);
-  ///
-  virtual BaseVector & operator= (const Vector & v2);
-  ///
-  virtual BaseVector & operator= (double scal);
-
-  ///
-  double & operator() (INDEX i);
-  ///
-  double operator() (INDEX i) const;
-
-  ///
-  virtual double SupNorm () const;
-  ///
-  virtual double L2Norm () const;
-  ///
-  virtual double L1Norm () const;
-  ///
-  virtual double Min () const;
-  ///
-  virtual double Max () const;
-
-  ///
-  virtual BaseVector & operator+= (const BaseVector & v2);
-  ///
-  virtual BaseVector & operator-= (const BaseVector & v2);
-  ///
-  virtual BaseVector & operator*= (double scal);
-
-  ///
-  virtual double operator* (const BaseVector & v2) const;
-
-
-  ///
-  virtual BaseVector & Add (double scal, const BaseVector & v2);
-  ///
-  virtual BaseVector & Add2 (double scal, const BaseVector & v2,
-                        double scal3, const BaseVector & v3);
-  ///
-  virtual BaseVector & Set (double scal, const BaseVector & v2);
-  ///
-  virtual BaseVector & Set2 (double scal , const BaseVector & v2,
-                        double scal3, const BaseVector & v3);
-
-    ///
-    virtual void GetPart (int startpos, BaseVector & v2) const;
-    ///
-    virtual void SetPart (int startpos, const BaseVector & v2);
-    ///
-    virtual void AddPart (int startpos, double val, const BaseVector & v2);
-
-  ///
-  virtual void SetRandom ();
-
-  ///
-  virtual ostream & Print (ostream & s) const;
-  ///
-  virtual BaseVector * Copy () const;
-  ///
-  virtual void Swap (BaseVector &);
-
-  ///
-  const double & Get (INDEX i) const { return data[i-1]; }
-  ///
-  void Set (INDEX i, double v) { data[i-1] = v; }
-  ///
-  double & Elem (INDEX i) { return data[i-1]; }
-
-  ///
-  virtual int IsVector () const { return 1; }
-
-
-  ///
-  virtual void GetElementVector (const ARRAY<INDEX> & pnum,
-				 BaseVector & elvec) const;
-  ///
-  virtual void SetElementVector (const ARRAY<INDEX> & pnum,
-				 const BaseVector & elvec);
-  ///
-  virtual void AddElementVector (const ARRAY<INDEX> & pnum,
-				 const BaseVector & elvec);
-  };
-
-#endif
-
-#endif
-
-
diff --git a/contrib/Netgen/libsrc/makefile.inc b/contrib/Netgen/libsrc/makefile.inc
deleted file mode 100644
index 7fb7d946c7cdd204471dd94b145fcbc85ceaaba4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.inc
+++ /dev/null
@@ -1,20 +0,0 @@
-# Gmsh - This replaces the original makefile.inc provided by Netgen
-
-include ../../../../variables
-
-INC = ${DASH}I../../../../Common ${DASH}I../include ${DASH}I../interface
-
-CFLAGS = ${OPTIM} ${FLAGS} ${INC} ${SYSINCLUDE}\
-         ${DASH}DNO_PARALLEL_THREADS ${DASH}UWIN32
-
-OBJ = ${src:.cpp=${OBJEXT}}
-
-.SUFFIXES: ${OBJEXT} .cpp
-
-default: ${OBJ}
-
-.cpp${OBJEXT}:
-	${CXX} ${CFLAGS} ${DASH}c $<
-
-clean:
-	${RM} *.o *.obj
diff --git a/contrib/Netgen/libsrc/makefile.mach.FREEBSD b/contrib/Netgen/libsrc/makefile.mach.FREEBSD
deleted file mode 100644
index 6f903d4e601d43df425640eed1b623aef377cc32..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.mach.FREEBSD
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Machine dependent make include file for gcc
-# 
-#
-#CC=gcc
-CPLUSPLUS=$(CC)
-AR=ar
-LINK=$(CC)
-#MAKE=make
-RM=rm
-RANLIB=ranlib
-#
-# Machine dependent flags:
-#
-include $(LOCALBASE)/lib/tixConfig.sh
-include $(LOCALBASE)/lib/tcl$(TCL_VER)/tclConfig.sh
-include $(LOCALBASE)/lib/tk$(TK_VER)/tkConfig.sh
-tcltklib = `echo $(TIX_BUILD_LIB_SPEC)` `echo $(TK_LIB_SPEC)` `echo $(TCL_LIB_FLAG)`
-
-CFLAGS2 =
-CPLUSPLUSFLAGS2 = $(CXXFLAGS) -I$(X11BASE)/include -DLINUX -DOPENGL
-CPLUSPLUSFLAGS3 = -I$(LIBSRC_DIR)/step `echo $(TCL_INCLUDE_SPEC)` `echo -I$(TK_PREFIX)`/include/tk`echo $(TK_VERSION)`
-#
-LINKFLAGS2 =  -L$(LOCALBASE)/lib -L$(X11BASE)/lib
-
-SYSLIB2 = -lstdc++
diff --git a/contrib/Netgen/libsrc/makefile.mach.INTEL b/contrib/Netgen/libsrc/makefile.mach.INTEL
deleted file mode 100644
index deef5b091c02c00b7550fc7d4d5530e6b359e0e4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.mach.INTEL
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# Machine dependent make include file
-#
-CC=icc
-CPLUSPLUS=$(CC)
-AR=ar
-LINK=$(CC)
-MAKE=make
-RM=rm
-RANLIB=ranlib
-#
-# Machine dependent flags:
-#
-CFLAGS2 =
-CPLUSPLUSFLAGS2 = -O2 -wd1572 -Ob2 -DLINUX -DOPENGL -DNGSOLVE \
-	-Qoption,c,-ip_ninl_max_stats=1000 \
-	-Qoption,c,-ip_ninl_min_stats=50 \
-	-Qoption,c,-ip_ninl_max_total_stats=1000 \
-	-gcc-name=/usr/bin/g++
-#  
-LINKFLAGS2 =  -L/usr/openwin/lib -L/usr/X11R6/lib -L/usr/lib/GL3.5 \
-	-gcc-name=/usr/bin/g++
-#
-# SYSLIB2 = /opt/experimental/lib/libstdc++.a
-# SYSLIB2 = -lstdc++ 
-# -lgcc_s
-# SYSLIB2 = -L/usr/lib/lapack -lblas -lstdc++
-
-# goalngs = goalngs
-
-
-goalngs=goalngs
-
-appngs =  lib/$(MACHINE)/*.o -lngsolvebasic
\ No newline at end of file
diff --git a/contrib/Netgen/libsrc/makefile.mach.LINUX b/contrib/Netgen/libsrc/makefile.mach.LINUX
deleted file mode 100644
index f5df356167d899dad11bc7148cda58fb2d10479e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.mach.LINUX
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Machine dependent make include file
-# 
-#
-# CC=/opt/gcc-dev/bin/gcc 
-# CC=/usr/local/bin/gcc
-CC=gcc
-CPLUSPLUS=$(CC)
-AR=ar
-LINK=$(CC)
-MAKE=make
-RM=rm
-RANLIB=ranlib
-#
-# Machine dependent flags:
-#
-CFLAGS2 =
-
-CPLUSPLUSFLAGS2 = -O2 -I/usr/include/GL3.5 -DLINUX -DOPENGL \
-	-ftemplate-depth-99 -finline-limit=20000 \
-	-funroll-loops  -DNGSOLVE
-
-LINKFLAGS2 =   -L/usr/openwin/lib -L/usr/X11R6/lib -L/usr/lib/GL3.5 -lstdc++ 
-
-
-goalngs=goalngs
-
-# lapack =  -llapack  -lblas -lgmp -lg2c
-
-
-appngs =  lib/$(MACHINE)/*.o -lngsolvebasic
\ No newline at end of file
diff --git a/contrib/Netgen/libsrc/makefile.mach.LINUXGCC33 b/contrib/Netgen/libsrc/makefile.mach.LINUXGCC33
deleted file mode 100644
index 0a6ee84afbd5cf793f427262e0f7bccfecb442ac..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.mach.LINUXGCC33
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Machine dependent make include file
-# 
-#
-# CC=/opt/gcc33/bin/gcc 
-# CC=/usr/local/bin/gcc
-CC=gcc
-CPLUSPLUS=$(CC)
-AR=ar
-LINK=$(CC)
-MAKE=make
-RM=rm
-RANLIB=ranlib
-#
-#
-CFLAGS2 =
-CPLUSPLUSFLAGS2 = -O2 -DLINUX -DOPENGL \
-	-ftemplate-depth-99 -finline-limit=20000 \
-	-mcpu=pentium4  -fforce-addr  -funroll-loops \
-	-DnoTRAFO -DNGSOLVE -DnoADDON -DnoPML -DnoLAPACK \
-	-DnoOCCGEOMETRY -I/usr/include/g++/backward -I./occ/inc -DnoDEBUG 
-#	
-#
-#  
-LINKFLAGS2 = -L/usr/openwin/lib -L/usr/X11R6/lib -L/usr/lib/GL3.5 
-
-SYSLIB2 =  -lstdc++ 
-
-goalngs   = goalngs
-
-appngs =  lib/$(MACHINE)/*.o -lngsolvebasic
-
-# occlib = -L$(OCCLIB_DIR) -lTKIGES -lTKBRep -lTKSTEP -lTKSTL
\ No newline at end of file
diff --git a/contrib/Netgen/libsrc/makefile.mach.SGI b/contrib/Netgen/libsrc/makefile.mach.SGI
deleted file mode 100644
index b75920ce267f805e70dff473792705d0461a4932..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.mach.SGI
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Machine dependent make include file
-# 
-CC=CC
-CPLUSPLUS=$(CC)
-AR=ar
-LINK=$(CC)
-MAKE=make -k
-RM=rm
-RANLIB=echo
-#
-CFLAGS2 =
-#
-CPLUSPLUSFLAGS2 = -O2 -LANG:std -OPT:Olimit=0 -I/usr/X11R6/include -I/usr/local/include -I/nfs/home/joachim/tcltk/include -DOPENGL -woff 1174 -woff 1682 -woff 1681 -woff 1552 -DOLDCINCLUDE
-# -woff 3262,3203,1174,1110
-#
-#  -I/usr/freeware/include
-LINKFLAGS2 = -LANG:std  -L/usr/openwin/lib -L/usr/freeware/lib32 -L/usr/X11R6/lib -L/usr/local/lib  -w -L/nfs/home/joachim/tcltk/lib
-
diff --git a/contrib/Netgen/libsrc/makefile.mach.SGIGCC b/contrib/Netgen/libsrc/makefile.mach.SGIGCC
deleted file mode 100644
index c43363c5e70e1c4609d26a95ce7cc0a6e4cc85c3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.mach.SGIGCC
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# Machine dependent make include file
-# 
-#
-# CC=/opt/experimental/bin/gcc 
-CC=/usr/freeware/bin/gcc
-CPLUSPLUS=$(CC)
-AR=ar
-LINK=$(CC)
-MAKE=make
-RM=rm
-RANLIB=ranlib
-#
-# Machine dependent flags:
-#
-CFLAGS2 =
-# I/opt/experimental/include/g++-v3 
-CPLUSPLUSFLAGS2 = -O2 -save-temps -fverbose-asm -I/usr/local/include -I/usr/freeware/include -I/usr/freeware/include/tcl -I/usr/freeware/include/tk -I/usr/include/GL3.5 -DLINUX -DOPENGL -I../lapack/\
-	-ftemplate-depth-99
-#  -finline-limit=10000 
-#	-mcpu=pentiumpro -fforce-addr -Wdisabled-optimization  -funroll-loops 
-#   -funroll-all-loops   
-# -dr -dt -df
-#	-fforce-addr \
-#	-fssa -fdce -fschedule-insns2 -fstrict-aliasing -frename-registers \
-#	-freg-struct-return 
-#	-fargument-noalias-global -fargument-noalias \
-#	--param max-gcse-memory=100000000 \
-#	--param max-delay-slot-live-search=100000 \
-#	--param max-pending-list-length=10000 \
-#	-fssa \
-#	-fomit-frame-pointer -fno-enforce-eh-specs -fno-defer-pop \
-#	-fforce-mem -fstrict-aliasing \
-#	-fno-implement-inlines \
-#	-foptimize-sibling-calls \
-#	-frerun-cse-after-loop -fcse-follow-jumps -fexpensive-optimizations \
-#	-fstrength-reduce -frerun-loop-opt -fcse-skip-blocks -fgcse \
-#	  -pedantic \
-# -fno-implicit-templates
-#
-#  -I/usr/local/intel/mkl/INCLUDE
-# -fsyntax-only
-# -fomit-frame-pointer
-# -funroll-loops
-#  
-LINKFLAGS2 = -L/usr/local/lib -L/usr/openwin/lib -L/usr/X11R6/lib -L/usr/lib/GL3.5  -L/usr/freeware/lib32 -L/usr/X11R6/lib -L/usr/local/lib
-
-# SYSLIB2 = libstdc++.
-# SYSLIB2 = -lstdc++ 
-# -lgcc_s
-# SYSLIB2 = -L/usr/lib/lapack -lblas -lstdc++
-
-
diff --git a/contrib/Netgen/libsrc/makefile.mach.SUN b/contrib/Netgen/libsrc/makefile.mach.SUN
deleted file mode 100644
index f927ae06f1985c80b7511ea7d7cdffc4c8363259..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.mach.SUN
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Machine dependent make include file
-# 
-CC=CC
-CPLUSPLUS=$(CC)
-AR=ar
-LINK=$(CC)
-MAKE=make -k
-RM=rm
-RANLIB=ranlib
-#
-CFLAGS2 =
-#
-CPLUSPLUSFLAGS2 =  -fast -O2 -I/usr/openwin/share/include 
-LINKFLAGS2 = -L/usr/openwin/lib 
-
diff --git a/contrib/Netgen/libsrc/meshing/Makefile b/contrib/Netgen/libsrc/meshing/Makefile
deleted file mode 100644
index c0f17db98650f9b6f485f5bfdd51a8a8e329d57b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-src = adfront2.cpp adfront3.cpp geomsearch.cpp global.cpp \
-        meshtool.cpp \
-        netrule2.cpp netrule3.cpp parser2.cpp parser3.cpp ruler2.cpp ruler3.cpp \
-        meshtype.cpp meshclass.cpp improve2.cpp smoothing2.cpp improve3.cpp smoothing3.cpp \
-	improve2gen.cpp meshing2.cpp meshing3.cpp  \
-	localh.cpp delaunay.cpp topology.cpp clusters.cpp \
-	tetrarls.cpp triarls.cpp quadrls.cpp meshfunc.cpp meshfunc2d.cpp \
-	refine.cpp bisect.cpp zrefine.cpp secondorder.cpp hprefinement.cpp \
-	boundarylayer.cpp specials.cpp msghandler.cpp \
-	pyramidrls.cpp pyramid2rls.cpp prism2rls.cpp curvedelems.cpp curvedelems2.cpp
-#
-lib = mesh
-libpath = libsrc/meshing
-#
-include ../makefile.inc
-#
diff --git a/contrib/Netgen/libsrc/meshing/adfront2.cpp b/contrib/Netgen/libsrc/meshing/adfront2.cpp
deleted file mode 100644
index 01b591f47792351e3448f35ad7ea540d4ad3779e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/adfront2.cpp
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
-  Advancing front class for surfaces
-*/
-
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-
-  /*
-AdFront2::FrontPoint2 :: FrontPoint2 ()
-{
-  globalindex = 0;
-  nlinetopoint = 0;
-  frontnr = INT_MAX-10;    // attention: overflow on calculating  INT_MAX + 1
-  mgi = NULL;
-}
-  */
-
-AdFront2::FrontPoint2 :: FrontPoint2 (const Point3d & ap, PointIndex agi,
-				      MultiPointGeomInfo * amgi)
-{
-  p = ap;
-  globalindex = agi;
-  nlinetopoint = 0;
-  frontnr = INT_MAX-10;
-
-  if (amgi)
-    {
-      mgi = new MultiPointGeomInfo (*amgi);
-      for (int i = 1; i <= mgi->GetNPGI(); i++)
-	if (mgi->GetPGI(i).trignum <= 0)
-	  cout << "Add FrontPoint2, illegal geominfo = " << mgi->GetPGI(i).trignum << endl;
-    }
-  else
-    mgi = NULL;
-}
-
-/*
-AdFront2::FrontPoint2 :: ~FrontPoint2 ()
-{
-//  if (mgi) delete mgi;
-}
-*/
-
-
-AdFront2::FrontLine :: FrontLine ()
-{
-  lineclass = 1;
-}
-
-AdFront2::FrontLine :: FrontLine (const INDEX_2 & al)
-{
-  l = al;
-  lineclass = 1;
-}
-
-
-
-
-
-
-AdFront2 :: AdFront2 (const Box3d & aboundingbox)
-  : boundingbox(aboundingbox), 
-    linesearchtree(boundingbox.PMin(), boundingbox.PMax()),
-    cpointsearchtree(boundingbox.PMin(), boundingbox.PMax())
-{
-  nfl = 0;
-  //  allflines = new INDEX_2_HASHTABLE<int> (100000);
-  allflines = 0;
-
-  minval = 0;
-  starti = 1;
-}
-
-AdFront2 :: ~AdFront2 ()
-{
-  delete allflines;
-}
-
-
-void AdFront2 :: PrintOpenSegments (ostream & ost) const
-{
- if (nfl > 0)
-    {
-      int i;
-      ost << nfl << " open front segments left:" << endl;
-      for (i = 1; i <= lines.Size(); i++)
-	if (lines.Get(i).Valid())
-	  ost << GetGlobalIndex (lines.Get(i).L().I1()) << "-"
-	      << GetGlobalIndex (lines.Get(i).L().I2()) << endl;
-	    
-    }
-}
-
-
-void AdFront2 :: GetPoints (ARRAY<Point3d> & apoints) const
-{
-  for (int i = 0; i < points.Size(); i++)
-    apoints.Append (points[i].P());
-}
-
-
-
-
-
-INDEX AdFront2 :: AddPoint (const Point3d & p, PointIndex globind, 
-			    MultiPointGeomInfo * mgi)
-{
-  // inserts at empty position or resizes array
-  int pi;
-
-  if (delpointl.Size() != 0)
-    {
-      pi = delpointl.Last();
-      delpointl.DeleteLast ();
-
-      points.Elem(pi) = FrontPoint2 (p, globind, mgi);
-    }
-  else
-    {
-      pi = points.Append (FrontPoint2 (p, globind, mgi));
-    }
-
-  if (mgi)
-    {
-      cpointsearchtree.Insert (p, pi);
-    }
-
-  return pi;
-}
-
-
-INDEX AdFront2 :: AddLine (INDEX pi1, INDEX pi2,
-			   const PointGeomInfo & gi1, const PointGeomInfo & gi2)
-{
-  int minfn;
-  INDEX li;
-
-  FrontPoint2 & p1 = points.Elem(pi1);
-  FrontPoint2 & p2 = points.Elem(pi2);
-
-
-
-  nfl++;
-
-  p1.AddLine();
-  p2.AddLine();
-
-  minfn = min2 (p1.FrontNr(), p2.FrontNr());
-  p1.DecFrontNr (minfn+1);
-  p2.DecFrontNr (minfn+1);
-
-  if (dellinel.Size() != 0)
-    {
-      li = dellinel.Last();
-      dellinel.DeleteLast ();
-
-      lines.Elem(li) = FrontLine (INDEX_2(pi1, pi2));
-    }
-  else
-    {
-      li = lines.Append(FrontLine (INDEX_2(pi1, pi2)));
-    }
-
-  
-  if (!gi1.trignum || !gi2.trignum)
-    {
-      cout << "ERROR: in AdFront::AddLine, illegal geominfo" << endl;
-    }
-  
-  lines.Elem(li).SetGeomInfo (gi1, gi2);
-
-  Box3d lbox;
-  lbox.SetPoint(p1.P());
-  lbox.AddPoint(p2.P());
-
-  linesearchtree.Insert (lbox.PMin(), lbox.PMax(), li);
-
-  /*
-  (*testout) << "add front line: " << p1.P() << " - " << p2.P()
-  	     << " Dist = " << Dist (p1.P(), p2.P()) << endl;
-  */
-
-  if (allflines)
-    {
-      if (allflines->Used (INDEX_2 (GetGlobalIndex (pi1), 
-				    GetGlobalIndex (pi2))))
-	{
-	  cerr << "ERROR Adfront2::AddLine: line exists" << endl;
-	  (*testout) << "ERROR Adfront2::AddLine: line exists" << endl;
-	}
-
-      allflines->Set (INDEX_2 (GetGlobalIndex (pi1), 
-			       GetGlobalIndex (pi2)), 1);
-    }
-
-  return li;
-}
-
-
-void AdFront2 :: DeleteLine (INDEX li)
-{
-  int i;
-  INDEX pi;
-
-  nfl--;
-
-  for (i = 1; i <= 2; i++)
-    {
-      pi = lines.Get(li).L().I(i);
-      points.Elem(pi).RemoveLine();
-
-      if (!points.Get(pi).Valid())
-	{
-	  delpointl.Append (pi);
-	  if (points.Elem(pi).mgi)
-	    {
-	      cpointsearchtree.DeleteElement (pi);
-	      delete points.Elem(pi).mgi;
-	      points.Elem(pi).mgi = NULL;
-	    }
-	}
-    }
-
-  if (allflines)
-    {
-      allflines->Set (INDEX_2 (GetGlobalIndex (lines.Get(li).L().I1()),
-			       GetGlobalIndex (lines.Get(li).L().I2())), 2);
-    }
-
-  lines.Elem(li).Invalidate();
-  linesearchtree.DeleteElement (li);
-
-
-
-  dellinel.Append (li);
-}
-
-
-int AdFront2 :: ExistsLine (int pi1, int pi2)
-{
-  if (!allflines)
-    return 0;
-  if (allflines->Used (INDEX_2(pi1, pi2)))
-    return allflines->Get (INDEX_2 (pi1, pi2));
-  else
-    return 0;
-}
-
-
-
-void AdFront2 :: IncrementClass (INDEX li)
-{
-  lines.Elem(li).IncrementClass();
-}
-
-
-void AdFront2 :: ResetClass (INDEX li)
-{
-  lines.Elem(li).ResetClass();
-}
-
-
-
-int AdFront2 :: SelectBaseLine (Point3d & p1, Point3d & p2, 
-				const PointGeomInfo *& geominfo1,
-				const PointGeomInfo *& geominfo2,
-				int & qualclass)
-{
-  int i, hi;
-
-  /*  
-      int minval;
-      int baselineindex;
-      minval = INT_MAX;
-  for (i = 1; i <= lines.Size(); i++)
-    if (lines.Get(i).Valid())
-      {
-	hi = lines.Get(i).LineClass() +
-	  points.Get(lines.Get(i).L().I1()).FrontNr() +
-	  points.Get(lines.Get(i).L().I2()).FrontNr();
-	
-	if (hi < minval)
-	  {
-	    minval = hi;
-	    baselineindex = i;
-	  }
-      }
-  */
-
-  /*
-  static int minval = 0;
-  static int starti = 1;
-  */
-  int baselineindex = 0; 
-
-  for (i = starti; i <= lines.Size(); i++)
-    {
-      if (lines.Get(i).Valid())
-	//      const ILINE * lp = &lines.Get(i).l;
-	//      if (lp->I1() >= 0)
-	{
-	  hi = lines.Get(i).LineClass() +
-	    points.Get(lines.Get(i).L().I1()).FrontNr() +
-	    points.Get(lines.Get(i).L().I2()).FrontNr();
-	  
-	  if (hi <= minval)
-	    {
-	      minval = hi;
-	      baselineindex = i;
-	      break;
-	    }
-	}
-    }
-  
-  if (!baselineindex)
-    {
-      // (*testotu) << "nfl = " << nfl << " tot l = " << lines.Size() << endl;
-      minval = INT_MAX;
-      for (i = 1; i <= lines.Size(); i++)
-	if (lines.Get(i).Valid())
-	  {
-	    hi = lines.Get(i).LineClass() +
-	      points.Get(lines.Get(i).L().I1()).FrontNr() +
-	      points.Get(lines.Get(i).L().I2()).FrontNr();
-	    
-	    if (hi < minval)
-	      {
-		minval = hi;
-		baselineindex = i;
-	      }
-	  }
-    }
-  starti = baselineindex+1;
-
-
-
-  p1 = points.Get(lines.Get(baselineindex).L().I1()).P();
-  p2 = points.Get(lines.Get(baselineindex).L().I2()).P();
-  geominfo1 = &lines.Get(baselineindex).GetGeomInfo(1);
-  geominfo2 = &lines.Get(baselineindex).GetGeomInfo(2);
-
-  qualclass = lines.Get(baselineindex).LineClass();
-
-  return baselineindex;
-}
-
-
-
-
-int AdFront2 :: GetLocals (int baselineindex,
-			   ARRAY<Point3d> & locpoints,
-			   ARRAY<MultiPointGeomInfo> & pgeominfo,
-			   ARRAY<INDEX_2> & loclines,   // local index
-			   ARRAY<INDEX> & pindex,
-			   ARRAY<INDEX> & lindex,
-			   double xh)
-{
-  int i, j, ii;
-  int pstind;
-  int pi;
-  Point3d midp, p0;
-
-  pstind = lines.Get(baselineindex).L().I1();
-  p0 = points.Get(pstind).P();
-
-  loclines.Append(lines.Get(baselineindex).L());
-  lindex.Append(baselineindex);
-
-  static ARRAY<int> nearlines;
-
-  nearlines.SetSize(0);
-
-  linesearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh),
-				  p0 + Vec3d(xh, xh, xh),
-				  nearlines);
-
-  for (ii = 1; ii <= nearlines.Size(); ii++)
-    {
-      i = nearlines.Get(ii);
-
-      if (lines.Get(i).Valid() && i != baselineindex)
-	{
-	  // const Point3d & p1 = points.Get(lines.Get(i).L().I1()).P();
-	  // const Point3d & p2 = points.Get(lines.Get(i).L().I2()).P();
-
-	  //	  midp = Center (p1, p2);
-	  //	  if (Dist (midp, p0) <= xh + 0.5 * Dist (p1, p2))
-	    {
-	      loclines.Append(lines.Get(i).L());
-	      lindex.Append(i);
-	    }
-	}
-    }
-
-  static ARRAY<int> invpindex;
-
-  invpindex.SetSize (points.Size());
-  for (i = 1; i <= loclines.Size(); i++)
-    {
-      invpindex.Elem(loclines.Get(i).I1()) = 0;
-      invpindex.Elem(loclines.Get(i).I2()) = 0;
-    }
-
-  for (i = 1; i <= loclines.Size(); i++)
-    {
-      for (j = 1; j <= 2; j++)
-	{
-	  pi = loclines.Get(i).I(j);
-	  if (invpindex.Get(pi) == 0)
-	    {
-	      pindex.Append (pi);
-	      invpindex.Elem(pi) = pindex.Size();
-	      loclines.Elem(i).I(j) = locpoints.Append (points.Get(pi).P());
-	    }
-	  else
-	    loclines.Elem(i).I(j) = invpindex.Get(pi);
-	}
-    }
-
-  pgeominfo.SetSize (locpoints.Size());
-  for (i = 1; i <= pgeominfo.Size(); i++)
-    pgeominfo.Elem(i).Init();
-
-
-  for (i = 1; i <= loclines.Size(); i++)
-    for (j = 1; j <= 2; j++)
-      {
-	int lpi = loclines.Get(i).I(j);
-	
-	const PointGeomInfo & gi = 
-	  lines.Get(lindex.Get(i)).GetGeomInfo (j);
-	pgeominfo.Elem(lpi).AddPointGeomInfo (gi);
-	
-	/*
-	if (pgeominfo.Elem(lpi).cnt == MULTIPOINTGEOMINFO_MAX)
-	  break;
-
-	const PointGeomInfo & gi = 
-	  lines.Get(lindex.Get(i)).GetGeomInfo (j);
-	
-	PointGeomInfo * pgi = pgeominfo.Elem(lpi).mgi;
-
-	int found = 0;
-	for (k = 0; k < pgeominfo.Elem(lpi).cnt; k++)
-	  if (pgi[k].trignum == gi.trignum)
-	    found = 1;
-
-	if (!found)
-	  {
-	    pgi[pgeominfo.Elem(lpi).cnt] = gi;
-	    pgeominfo.Elem(lpi).cnt++;
-	  }
-	*/
-      }
-
-  for (i = 1; i <= locpoints.Size(); i++)
-    {
-      int pi = pindex.Get(i);
-      
-      if (points.Get(pi).mgi)
-	for (j = 1; j <= points.Get(pi).mgi->GetNPGI(); j++)
-	  pgeominfo.Elem(i).AddPointGeomInfo (points.Get(pi).mgi->GetPGI(j));
-    }
-	
-  
-
-  /*
-  for (i = 1; i <= points.Size(); i++)
-    if (points.Get(i).Valid() && 
-	Dist (points.Get(i).P(), p0) <= xh &&
-	invpindex.Get(i) == 0)
-      {
-	invpindex.Elem(i) =
-	  locpoints.Append (points.Get(pi).P());
-      }
-  */
-
-  if (loclines.Size() == 1)
-    {
-      cout << "loclines.Size = 1" << endl;
-      (*testout) << "loclines.size = 1" << endl
-		 << " h = " << xh << endl
-		 << " nearline.size = " << nearlines.Size() << endl
-		 << " p0 = " << p0 << endl;
-    }
-
-  return lines.Get(baselineindex).LineClass();
-}
-
-
-
-void AdFront2 :: SetStartFront ()
-{
-  INDEX i;
-  int j;
-
-  for (i = 1; i <= lines.Size(); i++)
-    if (lines.Get(i).Valid())
-      for (j = 1; j <= 2; j++)
-        points.Elem(lines.Get(i).L().I(j)).DecFrontNr(0);
-}
-
-
-
-
-void AdFront2 :: Print (ostream & ost) const
-{
-  INDEX i;
-
-  ost << points.Size() << " Points: " << endl;
-  for (i = 1; i <= points.Size(); i++)
-    if (points.Get(i).Valid())
-      ost << i << "  " << points.Get(i).P() << endl;
-
-  ost << nfl << " Lines: " << endl;
-  for (i = 1; i <= lines.Size(); i++)
-    if (lines.Get(i).Valid())
-      ost << lines.Get(i).L().I1() << " - " << lines.Get(i).L().I2() << endl;
-
-  ost << flush;
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/adfront2.hpp b/contrib/Netgen/libsrc/meshing/adfront2.hpp
deleted file mode 100644
index 4e72c087fb1615703626749ae7d0eedd8a7af8c8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/adfront2.hpp
+++ /dev/null
@@ -1,337 +0,0 @@
-#ifndef FILE_ADFRONT2
-#define FILE_ADFRONT2
-
-/**************************************************************************/
-/* File:   adfront2.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Okt. 95                                                    */
-/**************************************************************************/
-
-/*
-    Advancing front class for surfaces
-*/
-
-
-/*
-#define FRONTLINE_GEOMINFO_SIZE 8
-#define FRONTPOINT_GEOMINFO_SIZE 4
-*/
-
-///
-class AdFront2
-{
-
-  ///
-  class FrontPoint2
-  {
-    /// coordinates
-    Point3d p;            
-    /// global node index
-    PointIndex globalindex;   
-    /// number of front lines connected to point 
-    int nlinetopoint;    
-    /// distance to original boundary
-    int frontnr;          
-    //   char geominfo[FRONTLINE_GEOMINFO_SIZE];    
-  public:
-    ///
-    MultiPointGeomInfo * mgi;
-
-    ///
-    FrontPoint2 ()
-    {
-      globalindex = -1;
-      nlinetopoint = 0;
-      frontnr = INT_MAX-10;    // attention: overflow on calculating  INT_MAX + 1
-      mgi = NULL;
-    }
-
-    ///
-    FrontPoint2 (const Point3d & ap, PointIndex agi,
-		 MultiPointGeomInfo * amgi);
-    ///
-    ~FrontPoint2 () { ; }
-
-    ///
-    const Point3d & P () const { return p; }
-    ///
-    PointIndex GlobalIndex () const { return globalindex; }
-
-    ///
-    void AddLine () { nlinetopoint++; }
-    ///
-    void RemoveLine ()
-    {
-      nlinetopoint--;
-      if (nlinetopoint == 0)
-	nlinetopoint = -1;
-    }
-
-    ///
-    bool Valid () const
-    { return nlinetopoint >= 0; }
-
-    ///
-    void DecFrontNr (int afrontnr)
-    {
-      if (frontnr > afrontnr) frontnr = afrontnr;
-    }
-    
-    ///
-    int FrontNr () const { return frontnr; }
-  };
-
-  
-  ///
-  class FrontLine
-  {
-  private:
-    /// Point Indizes
-    INDEX_2 l;            
-    /// quality class 
-    int lineclass;      
-    /// geometry specific data
-    //    char geominfo[FRONTLINE_GEOMINFO_SIZE];
-    PointGeomInfo geominfo[2];
-  public:
-
-    FrontLine ();
-    ///
-    FrontLine (const INDEX_2 & al);
-
-    ///
-    const INDEX_2 & L () const
-    {
-      return l;
-    }
-
-    ///
-    int LineClass() const
-    {
-      return lineclass;
-    }
-
-    ///
-    void IncrementClass ()
-    {
-      lineclass++;
-    }
-    ///
-    void ResetClass ()
-    {
-      lineclass = 1;
-    }
-
-    ///
-    bool Valid () const
-    {
-      return l.I1() != -1;
-    }
-    ///
-    void Invalidate ()
-    {
-      l.I1() = -1;
-      l.I2() = -1;
-      lineclass = 1000;
-    }
-
-    void SetGeomInfo (const PointGeomInfo & gi1, const PointGeomInfo & gi2)
-      {
-	geominfo[0] = gi1;
-	geominfo[1] = gi2;
-      }
-
-    const PointGeomInfo * GetGeomInfo () const
-    { return geominfo; }
-    
-    const PointGeomInfo & GetGeomInfo (int endp) const
-    { return geominfo[endp-1]; }
-
-    friend class AdFront2;
-  };
-
-
-
-  ///
-  ARRAY<FrontPoint2> points;  /// front points
-  ARRAY<FrontLine> lines;     /// front lines
-
-  Box3d boundingbox;
-  Box3dTree linesearchtree;       /// search tree for lines
-  Point3dTree cpointsearchtree;   /// search tree for cone points
-
-  ARRAY<INDEX> delpointl;     /// list of deleted front points
-  ARRAY<INDEX> dellinel;      /// list of deleted front lines
-
-  INDEX nfl;                  /// number of front lines;
-  INDEX_2_HASHTABLE<int> * allflines; /// all front lines ever have been
-
-
-  int minval;
-  int starti;
-
-public:
-  ///
-  //  AdFront2 ();
-  AdFront2 (const Box3d & aboundingbox);
-  ///
-  ~AdFront2 ();
-
-  ///
-  void GetPoints (ARRAY<Point3d> & apoints) const;
-  ///
-  void Print (ostream & ost) const;
-
-  ///
-  bool Empty () const
-  {
-    return nfl == 0;
-  }
-  ///
-  int GetNFL () const { return nfl; }
-  ///
-  int SelectBaseLine (Point3d & p1, Point3d & p2, 
-		      const PointGeomInfo *& geominfo1,
-		      const PointGeomInfo *& geominfo2,
-		      int & qualclass);
-
-  ///
-  int GetLocals (int baseline, 
-		 ARRAY<Point3d> & locpoints,
-		 ARRAY<MultiPointGeomInfo> & pgeominfo,
-                 ARRAY<INDEX_2> & loclines,   // local index
-                 ARRAY<INDEX> & pindex,
-                 ARRAY<INDEX> & lindex,
-                 double xh);
-
-  ///
-  void DeleteLine (INDEX li);
-  ///
-  INDEX AddPoint (const Point3d & p, PointIndex globind, 
-		  MultiPointGeomInfo * mgi = NULL);
-  ///
-  INDEX AddLine (INDEX pi1, INDEX pi2, 
-		 const PointGeomInfo & gi1, const PointGeomInfo & gi2);
-  ///
-  int ExistsLine (int gpi1, int gpi2);
-  ///
-  void IncrementClass (INDEX li);
-  ///
-  void ResetClass (INDEX li);
-
-  ///
-  const PointGeomInfo & GetLineGeomInfo (int li, int lend) const
-    { return lines.Get(li).GetGeomInfo (lend); }
-  ///
-
-  PointIndex GetGlobalIndex (int pi) const
-  {
-    return points.Get(pi).GlobalIndex();
-  }
-  ///
-  void SetStartFront ();
-  ///
-  void PrintOpenSegments (ostream & ost) const;
-};
-
-
-
-
-
-
-/*
-inline int AdFront2::FrontPoint2 :: Valid () const
-{
-  return nlinetopoint >= 0;
-}
-*/
-/*
-inline const Point3d & AdFront2::FrontPoint2 :: P () const
-{
-  return p;
-}
-
-inline PointIndex AdFront2::FrontPoint2 :: GlobalIndex () const
-{
-  return globalindex;
-}
-
-inline void AdFront2::FrontPoint2 :: AddLine ()
-{
-  nlinetopoint++;
-}
-
-inline void AdFront2::FrontPoint2 :: RemoveLine ()
-{
-  nlinetopoint--;
-  if (nlinetopoint == 0)
-    nlinetopoint = -1;
-}
-
-inline int AdFront2::FrontPoint2 :: FrontNr () const
-{
-  return frontnr;
-}
-
-inline void AdFront2::FrontPoint2 :: DecFrontNr (int afrontnr)
-{
-  if (frontnr > afrontnr) frontnr = afrontnr;
-}
-*/
-
-
-
-
-
-
-
-
-/*
-inline int AdFront2::FrontLine :: Valid () const
-{
-  return l.I1() != 0;
-}
-
-inline void AdFront2::FrontLine :: Invalidate ()
-{
-  l.I1() = 0;
-  l.I2() = 0;
-  lineclass = 1000;
-}
-
-inline const INDEX_2 & AdFront2::FrontLine :: L () const
-{
-  return l;
-}
-
-inline int AdFront2::FrontLine :: LineClass () const
-{
-  return lineclass;
-}
-
-
-inline void AdFront2::FrontLine :: IncrementClass ()
-{
-  lineclass++;
-}
-
-inline void AdFront2::FrontLine :: ResetClass ()
-{
-  lineclass = 1;
-}
-
-
-inline int AdFront2 :: Empty () const
-{
-  return nfl == 0;
-}
-
-inline INDEX AdFront2 :: GetGlobalIndex (INDEX pi) const
-{
-  return points.Get(pi).GlobalIndex();
-}
-*/
-#endif
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/adfront3.cpp b/contrib/Netgen/libsrc/meshing/adfront3.cpp
deleted file mode 100644
index 1bf686e103fa0b6e66a703c5ad8de7f950f727d2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/adfront3.cpp
+++ /dev/null
@@ -1,883 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-/* ********************** FrontPoint ********************** */
-
-namespace netgen
-{
-
-FrontPoint3 :: FrontPoint3 () 
-{ 
-  globalindex = -1;
-  nfacetopoint = 0; 
-  frontnr = 1000; 
-  cluster = 0;
-}
-
-
-FrontPoint3 :: FrontPoint3 (const Point3d & ap, PointIndex agi)
-{ 
-  p = ap; 
-  globalindex = agi;
-  nfacetopoint = 0; 
-  frontnr = 1000; 
-  cluster = 0;
-}
-
-
-
-/* ********************** FrontFace ********************** */
-
-FrontFace :: FrontFace () 
-{ 
-  qualclass = 1; 
-  oldfront = 0; 
-  hashvalue = 0;
-  cluster = 0;
-}
-
-FrontFace :: FrontFace (const Element2d & af)
-{ 
-  f = af; 
-  oldfront = 0; 
-  qualclass = 1; 
-  hashvalue = 0;
-}
-
-void FrontFace :: Invalidate ()
-{ 
-  f.Delete(); 
-  oldfront = 0; 
-  qualclass = 1000; 
-}
-
-
-
-
-/* ********************** AddFront ********************** */
- 
-
-AdFront3 :: AdFront3 ()
-{
-  nff = 0;
-  nff4 = 0;
-  vol = 0;
-
-  hashon = 1;
-  hashcreated = 0;
-  if (hashon) 
-    hashtable.Init(&points, &faces);
-
-  facetree = NULL;
-  connectedpairs = NULL;
-
-  rebuildcounter = -1;
-  lasti = 0;
-  minval = -1;
-}
-
-
-AdFront3 :: ~AdFront3 ()
-{
-  delete facetree;
-  delete connectedpairs;
-}
-
-void AdFront3 :: GetPoints (ARRAY<Point3d> & apoints) const
-{
-  for (PointIndex pi = PointIndex::BASE; 
-       pi < points.Size()+PointIndex::BASE; pi++)
-    
-    apoints.Append (points[pi].P());
-}
-
-
-PointIndex AdFront3 :: AddPoint (const Point3d & p, PointIndex globind)
-{
-  if (delpointl.Size())
-    {
-      PointIndex pi = delpointl.Last();
-      delpointl.DeleteLast ();
-      
-      points[pi] = FrontPoint3 (p, globind);
-      return pi;
-    }
-  else
-    {
-      points.Append (FrontPoint3 (p, globind));
-      return points.Size()-1+PointIndex::BASE;
-    }
-}
-
-
-INDEX AdFront3 :: AddFace (const Element2d & aface)
-{
-  int i, minfn;
-
-  nff++;
-
-  for (i = 0; i < aface.GetNP(); i++)
-    points[aface[i]].AddFace();
-
-  const Point3d & p1 = points[aface[0]].P();
-  const Point3d & p2 = points[aface[1]].P();
-  const Point3d & p3 = points[aface[2]].P();
-
-  vol += 1.0/6.0 * (p1.X() + p2.X() + p3.X()) *
-    ( (p2.Y() - p1.Y()) * (p3.Z() - p1.Z()) -
-      (p2.Z() - p1.Z()) * (p3.Y() - p1.Y()) );
-
-  if (aface.GetNP() == 4)
-    {
-      nff4++;
-      const Point3d & p4 = points[aface[3]].P();      
-      vol += 1.0/6.0 * (p1.X() + p3.X() + p4.X()) *
-	( (p3.Y() - p1.Y()) * (p4.Z() - p1.Z()) -
-	  (p3.Z() - p1.Z()) * (p4.Y() - p1.Y()) );
-    }
-
-
-  minfn = 1000;
-  for (i = 0; i < aface.GetNP(); i++)
-    {
-      int fpn = points[aface[i]].FrontNr();
-      if (i == 0 || fpn < minfn)
-	minfn = fpn;
-    }
-
-
-  int cluster = 0;
-  for (i = 1; i <= aface.GetNP(); i++)
-    {
-      if (points[aface.PNum(i)].cluster)
-	cluster = points[aface.PNum(i)].cluster;
-    }
-  for (i = 1; i <= aface.GetNP(); i++)
-    points[aface.PNum(i)].cluster = cluster;
-
-
-  for (i = 1; i <= aface.GetNP(); i++)
-    points[aface.PNum(i)].DecFrontNr (minfn+1);
-
-  int nfn = faces.Append(FrontFace (aface));
-  faces.Elem(nfn).cluster = cluster;
-
-  if (hashon && hashcreated) 
-    hashtable.AddElem(aface, nfn);
-
-  return nfn;
-}
-
-
-
-void AdFront3 :: DeleteFace (INDEX fi)
-{
-  nff--;
-
-  for (int i = 1; i <= faces.Get(fi).Face().GetNP(); i++)
-    {
-      PointIndex pi = faces.Get(fi).Face().PNum(i);
-      points[pi].RemoveFace();
-      if (!points[pi].Valid())
-	delpointl.Append (pi);
-    }
-
-  const Element2d & face = faces.Get(fi).Face();
-  const Point3d & p1 = points[face.PNum(1)].P();
-  const Point3d & p2 = points[face.PNum(2)].P();
-  const Point3d & p3 = points[face.PNum(3)].P();
-
-  vol -= 1.0/6.0 * (p1.X() + p2.X() + p3.X()) *
-    ( (p2.Y() - p1.Y()) * (p3.Z() - p1.Z()) -
-      (p2.Z() - p1.Z()) * (p3.Y() - p1.Y()) );
-
-  if (face.GetNP() == 4)
-    {
-      const Point3d & p4 = points[face.PNum(4)].P();      
-      vol -= 1.0/6.0 * (p1.X() + p3.X() + p4.X()) *
-	( (p3.Y() - p1.Y()) * (p4.Z() - p1.Z()) -
-	  (p3.Z() - p1.Z()) * (p4.Y() - p1.Y()) );
-
-      nff4--;
-    }
-
-  faces.Elem(fi).Invalidate();
-}
-
-
-INDEX AdFront3 :: AddConnectedPair (const INDEX_2 & apair)
-{
-  if (!connectedpairs)
-    connectedpairs = new TABLE<int, PointIndex::BASE> (GetNP());
-
-  connectedpairs->Add (apair.I1(), apair.I2());
-  connectedpairs->Add (apair.I2(), apair.I1());
-
-  return 0;
-}
-
-
-
-void AdFront3 :: IncrementClass (INDEX fi)
-{
-  faces.Elem(fi).IncrementQualClass();
-}
-
-
-void AdFront3 :: ResetClass (INDEX fi)
-{
-  faces.Elem(fi).ResetQualClass();
-}
-
-
-
-void AdFront3 :: CreateTrees ()
-{
-  int i, j;
-  PointIndex pi;
-  Point3d pmin, pmax;
-
-  for (pi = PointIndex::BASE; 
-       pi < GetNP()+PointIndex::BASE; pi++)
-    {
-      const Point3d & p = GetPoint(pi);
-      if (pi == PointIndex::BASE)
-	{
-	  pmin = p;
-	  pmax = p;
-	}
-      else
-	{
-	  pmin.SetToMin (p);
-	  pmax.SetToMax (p);
-	}
-    }
-
-  pmax = pmax + 0.5 * (pmax - pmin);
-  pmin = pmin + 0.5 * (pmin - pmax);
-
-  delete facetree;
-  facetree = new Box3dTree (pmin, pmax);
-  
-  for (i = 1; i <= GetNF(); i++)
-    {
-      const Element2d & el = GetFace(i);
-      pmin = GetPoint (el[0]);
-      pmax = pmin;
-      for (j = 1; j < 3; j++)
-	{
-	  const Point3d & p = GetPoint (el[j]);
-	  pmin.SetToMin (p);
-	  pmax.SetToMax (p);
-	}
-      pmax = pmax + 0.01 * (pmax - pmin);
-      pmin = pmin + 0.01 * (pmin - pmax);
-      //      (*testout) << "insert " << i << ": " << pmin << " - " << pmax << "\n";
-      facetree -> Insert (pmin, pmax, i);
-    }
-}
-
-
-void AdFront3 :: GetIntersectingFaces (const Point3d & pmin, const Point3d & pmax, 
-				       ARRAY<int> & ifaces) const
-{
-  facetree -> GetIntersecting (pmin, pmax, ifaces);
-}
-
-void AdFront3 :: GetFaceBoundingBox (int i, Box3d & box) const
-{
-  const FrontFace & face = faces.Get(i);
-  box.SetPoint (points[face.f[0]].p);
-  box.AddPoint (points[face.f[1]].p);
-  box.AddPoint (points[face.f[2]].p);
-}
-
-void AdFront3 :: RebuildInternalTables ()
-{
-  int i, j, hi;
-
-  hi = 0;
-  for (i = 1; i <= faces.Size(); i++)
-    if (faces.Get(i).Valid())
-      {
-	hi++;
-	if (hi < i)
-	  faces.Elem(hi) = faces.Get(i);
-      }
-  
-  faces.SetSize (nff);
-
-  int np = points.Size();
-
-  for (i = PointIndex::BASE; 
-       i < np+PointIndex::BASE; i++)
-    points[i].cluster = i;
-
-  int change;
-  do
-    {
-      change = 0;
-      for (i = 1; i <= faces.Size(); i++)
-	{
-	  const Element2d & el = faces.Get(i).Face();
-
-	  int mini = points[el.PNum(1)].cluster;
-	  int maxi = mini;
-	  
-	  for (j = 2; j <= 3; j++)
-	    {
-	      int ci = points[el.PNum(j)].cluster;
-	      if (ci < mini) mini = ci;
-	      if (ci > maxi) maxi = ci;
-	    }
-
-	  if (mini < maxi)
-	    {
-	      change = 1;
-	      for (j = 1; j <= 3; j++)
-		points[el.PNum(j)].cluster = mini;
-	    }
-	}
-    }
-  while (change);
-
-  BitArrayChar<PointIndex::BASE> usecl(np);
-  usecl.Clear();
-  for (i = 1; i <= faces.Size(); i++)
-    {
-      usecl.Set (points[faces.Get(i).Face().PNum(1)].cluster);
-      faces.Elem(i).cluster =
-	points[faces.Get(i).Face().PNum(1)].cluster;
-    }
-  int cntcl = 0;
-  for (i = PointIndex::BASE; 
-       i < np+PointIndex::BASE; i++)
-    if (usecl.Test(i))
-      cntcl++;
-
-  ARRAY<double, PointIndex::BASE> clvol (np);
-  clvol = 0.0;
-
-  for (i = 1; i <= faces.Size(); i++)
-    {
-      const Element2d & face = faces.Get(i).Face();
-
-      const Point3d & p1 = points[face.PNum(1)].P();      
-      const Point3d & p2 = points[face.PNum(2)].P();      
-      const Point3d & p3 = points[face.PNum(3)].P();      
-      
-      double vi = 1.0/6.0 * (p1.X() + p2.X() + p3.X()) *
-	( (p2.Y() - p1.Y()) * (p3.Z() - p1.Z()) -
-	  (p2.Z() - p1.Z()) * (p3.Y() - p1.Y()) );
-      
-      if (face.GetNP() == 4)
-	{
-	  const Point3d & p4 = points[face.PNum(4)].P();      
-	  vi += 1.0/6.0 * (p1.X() + p3.X() + p4.X()) *
-	    ( (p3.Y() - p1.Y()) * (p4.Z() - p1.Z()) -
-	      (p3.Z() - p1.Z()) * (p4.Y() - p1.Y()) );
-	}
-     
-      clvol[faces.Get(i).cluster] += vi;
-    }
-
-
-  int negvol = 0;
-  for (i = PointIndex::BASE; 
-       i < clvol.Size()+PointIndex::BASE; i++)
-    {
-      if (clvol[i] < 0)
-	negvol = 1;
-    }
-
-  if (negvol)
-    {
-      for (i = 1; i <= faces.Size(); i++)
-	faces.Elem(i).cluster = 1;
-      for (i = PointIndex::BASE; 
-	   i < points.Size()+PointIndex::BASE; i++)
-	points[i].cluster = 1;
-    }
-
-  if (hashon) 
-    hashtable.Create();
-}
-
-
-
-int AdFront3 :: SelectBaseElement ()
-{
-  int i, hi, fstind;
-
-  /*
-  static int minval = -1;
-  static int lasti = 0;
-  static int counter = 0;
-  */
-  if (rebuildcounter <= 0)
-    {
-      RebuildInternalTables();
-      rebuildcounter = nff / 10 + 1;
-      
-      lasti = 0;
-    }
-  rebuildcounter--;
-
-  /*
-  if (faces.Size() > 2 * nff)
-    {
-      // compress facelist
-
-      RebuildInternalTables ();
-      lasti = 0;
-    }
-    */
-  
-  fstind = 0;
-
-  for (i = lasti+1; i <= faces.Size() && !fstind; i++)
-    if (faces.Elem(i).Valid())
-      {
-	hi = faces.Get(i).QualClass() +
-	  points[faces.Get(i).Face().PNum(1)].FrontNr() +
-	  points[faces.Get(i).Face().PNum(2)].FrontNr() +
-	  points[faces.Get(i).Face().PNum(3)].FrontNr();
-	
-	if (hi <= minval)
-	  {
-	    minval = hi;
-	    fstind = i;
-	    lasti = fstind;
-	  }
-      }
-  
-  if (!fstind)
-    {
-      minval = INT_MAX;
-      for (i = 1; i <= faces.Size(); i++)
-	if (faces.Elem(i).Valid())
-	  {
-	    hi = faces.Get(i).QualClass() +
-	      points[faces.Get(i).Face().PNum(1)].FrontNr() +
-	      points[faces.Get(i).Face().PNum(2)].FrontNr() +
-	      points[faces.Get(i).Face().PNum(3)].FrontNr();
-	    
-	    if (hi <= minval)
-	      {
-		minval = hi;
-		fstind = i;
-		lasti = 0;
-	      }
-	  }
-    }
-
-
-  return fstind;
-}
-
-
-
-int AdFront3 :: GetLocals (int fstind,
-			   ARRAY<Point3d> & locpoints,
-			   ARRAY<Element2d> & locfaces,   // local index
-			   ARRAY<PointIndex> & pindex,
-			   ARRAY<INDEX> & findex,
-			   INDEX_2_HASHTABLE<int> & getconnectedpairs,
-			   float xh,
-			   float relh,
-			   INDEX& facesplit)
-{
-  if (hashon && faces.Size() < 500) { hashon=0; }
-  if (hashon && !hashcreated) 
-    {
-      hashtable.Create(); 
-      hashcreated=1;
-    }
-
-  INDEX i, j;
-  PointIndex pstind;
-  INDEX pi;
-  Point3d midp, p0;
-
-  static ARRAY<int, PointIndex::BASE> invpindex;
-  
-  static ARRAY<Element2d> locfaces2;           //all local faces in radius xh
-  static ARRAY<int> locfaces3;           // all faces in outer radius relh
-  static ARRAY<INDEX> findex2;
-
-  locfaces2.SetSize(0);
-  locfaces3.SetSize(0);
-  findex2.SetSize(0);
-
-  int cluster = faces.Get(fstind).cluster;
-
-  pstind = faces.Get(fstind).Face().PNum(1);
-  p0 = points[pstind].P();
-  
-  locfaces2.Append(faces.Get(fstind).Face());
-  findex2.Append(fstind);
-
-
-  Box3d b1 (p0 - Vec3d(xh, xh, xh), p0 + Vec3d (xh, xh, xh));
-
-  if (hashon)
-    {
-      hashtable.GetLocals(locfaces2, findex2, fstind, p0, xh);
-    }
-  else
-    {
-      for (i = 1; i <= faces.Size(); i++)
-	{
-	  const Element2d & face = faces.Get(i).Face();
-	  if (faces.Get(i).cluster == cluster && faces.Get(i).Valid() && i != fstind)
-	    {
-	      const Point3d & p1 = points[face.PNum(1)].P();
-	      const Point3d & p2 = points[face.PNum(2)].P();
-	      const Point3d & p3 = points[face.PNum(3)].P();
-	      
-	      Box3d b2;
-	      b2.SetPoint (p1);
-	      b2.AddPoint (p2);
-	      b2.AddPoint (p3);
-
-	      /*
-	      midp = Center (p1, p2, p3);
-	      
-	      if (Dist2 (midp, p0) <= xh*xh)
-		{
-		  locfaces2.Append(faces.Get(i).Face());
-		  findex2.Append(i);
-		}
-		*/
-	      if (b1.Intersect (b2))
-		{
-		  locfaces2.Append(faces.Get(i).Face());
-		  findex2.Append(i);
-		}
-	    }
-	}
-    }
-
-  //local faces for inner radius:
-  for (i = 1; i <= locfaces2.Size(); i++)
-    {
-      const Element2d & face = locfaces2.Get(i);
-      const Point3d & p1 = points[face.PNum(1)].P();
-      const Point3d & p2 = points[face.PNum(2)].P();
-      const Point3d & p3 = points[face.PNum(3)].P();
-
-      midp = Center (p1, p2, p3);
-
-      if (Dist2 (midp, p0) <= relh * relh || i == 1)
-	{
-          locfaces.Append(locfaces2.Get(i));
-	  findex.Append(findex2.Get(i));
-	}
-      else
-	locfaces3.Append (i);
-    }
-  
-  facesplit=locfaces.Size();
-  
-  
-  //local faces for outer radius:
-  for (i = 1; i <= locfaces3.Size(); i++)
-    {
-      locfaces.Append (locfaces2.Get(locfaces3.Get(i)));
-      findex.Append (findex2.Get(locfaces3.Get(i)));
-    }
-
-
-  invpindex.SetSize (points.Size());
-  for (i = 1; i <= locfaces.Size(); i++)
-    for (j = 1; j <= locfaces.Get(i).GetNP(); j++)
-      {
-	pi = locfaces.Get(i).PNum(j);
-	invpindex[pi] = -1;
-      }
-
-  for (i = 1; i <= locfaces.Size(); i++)
-    {
-      for (j = 1; j <= locfaces.Get(i).GetNP(); j++)
-	{
-	  pi = locfaces.Get(i).PNum(j);
-	  if (invpindex[pi] == -1)
-	    {
-	      pindex.Append (pi);
-	      invpindex[pi] = pindex.Size();  // -1+PointIndex::BASE;
-	      locfaces.Elem(i).PNum(j) = locpoints.Append (points[pi].P());
-	    }
-	  else
-	    locfaces.Elem(i).PNum(j) = invpindex[pi];
-
-	}
-    }
-
-
-
-  if (connectedpairs)
-    {
-      for (i = 1; i <= locpoints.Size(); i++)
-	{
-	  int pi = pindex.Get(i);
-	  if (pi >= 1 && pi <= connectedpairs->Size ())
-	    {
-	      for (j = 1; j <= connectedpairs->EntrySize(pi); j++)
-		{
-		  int oi = connectedpairs->Get(pi, j);
-		  int other = invpindex.Get(oi);
-		  if (other >= 1 && other <= pindex.Size() && 
-		      pindex.Get(other) == oi)
-		    {
-		      INDEX_2 coned(i, other);
-		      coned.Sort();
-		      //		      (*testout) << "connected: " << locpoints.Get(i) << "-" << locpoints.Get(other) << endl;
-		      getconnectedpairs.Set (coned, 1);
-		    }
-		}
-	    }
-	}
-    }
-  
-
-
-
-  /*
-  for (i = 1; i <= points.Size(); i++)
-    if (points.Elem(i).Valid() && Dist (points.Elem(i).P(), p0) <= xh)
-      {
-	if (!invpindex.Get(i))
-	  {
-	    locpoints.Append (points.Get(i).P());
-	    pindex.Append (i);
-	    invpindex.Elem(i) = pindex.Size();
-	  }
-      }
-      */
-  return faces.Get(fstind).QualClass();
-}
-
-
-// returns all points connected with fi
-void AdFront3 :: GetGroup (int fi,
-			   ARRAY<MeshPoint> & grouppoints,
-			   ARRAY<Element2d> & groupelements,
-			   ARRAY<PointIndex> & pindex,
-			   ARRAY<INDEX> & findex
-			   ) const
-{
-  static ARRAY<char> pingroup;
-  INDEX i;
-  int j, changed, fused;
-
-  pingroup.SetSize(points.Size());
-
-  for (i = 1; i <= pingroup.Size(); i++)
-    pingroup.Elem(i) = 0;
-  for (j = 1; j <= 3; j++)
-    pingroup.Elem (faces.Get(fi).Face().PNum(j)) = 1;
-
-  do
-    {
-      changed = 0;
-
-      for (i = 1; i <= faces.Size(); i++)
-	if (faces.Get(i).Valid())
-	  {
-	    const Element2d & face = faces.Get(i).Face();
-
-
-	    fused = 0;
-	    for (j = 1; j <= 3; j++)
-	      if (pingroup.Elem(face.PNum(j))) 
-		fused++;
-            
-	    if (fused >= 2)
-	      for (j = 1; j <= 3; j++)
-		if (!pingroup.Elem(face.PNum(j)))
-		  {
-		    pingroup.Elem(face.PNum(j)) = 1;
-		    changed = 1;
-		  }
-	  }
-
-    }
-  while (changed);
-
-
-  static ARRAY<int> invpindex;
-  invpindex.SetSize (points.Size());
-  
-
-  for (i = 1; i <= points.Size(); i++)
-    if (points.Get(i).Valid())
-      {
-	grouppoints.Append (points.Get(i).P());
-	pindex.Append (i);
-	invpindex.Elem(i) = pindex.Size();
-      }
-
-  for (i = 1; i <= faces.Size(); i++)
-    if (faces.Get(i).Valid())
-      {
-	fused = 0;
-	for (j = 1; j <= 3; j++)
-	  if (pingroup.Get(faces.Get(i).Face().PNum(j)))
-	    fused++;
-
-	if (fused >= 2)
-	  {
-	    groupelements.Append (faces.Get(i).Face());
-	    findex.Append (i);
-	  }
-      }
-      
-  for (i = 1; i <= groupelements.Size(); i++)
-    for (j = 1; j <= 3; j++)
-      {
-	groupelements.Elem(i).PNum(j) =
-	  invpindex.Get(groupelements.Elem(i).PNum(j));
-      }
-
-  /*
-  for (i = 1; i <= groupelements.Size(); i++)
-    for (j = 1; j <= 3; j++)
-      for (k = 1; k <= grouppoints.Size(); k++)
-        if (pindex.Get(k) == groupelements.Get(i).PNum(j))
-          {
-	    groupelements.Elem(i).PNum(j) = k;
-	    break;
-          }
-  */          
-}
-
-
-void AdFront3 :: SetStartFront (int /* baseelnp */)
-{
-  INDEX i;
-  int j;
-
-  for (i = 1; i <= faces.Size(); i++)
-    if (faces.Get(i).Valid())
-      {
-	const Element2d & face = faces.Get(i).Face();
-	for (j = 1; j <= 3; j++)
-	  points[face.PNum(j)].DecFrontNr(0);
-      }
-
-  /*
-  if (baseelnp)
-    {
-      for (i = 1; i <= faces.Size(); i++)
-	if (faces.Get(i).Valid() && faces.Get(i).Face().GetNP() != baseelnp)
-	  faces.Elem(i).qualclass = 1000;
-    }
-    */
-}
-
-
-int AdFront3 :: Inside (const Point3d & p) const
-{
-  int i, cnt;
-  Vec3d n, v1, v2;
-  DenseMatrix a(3), ainv(3);
-  Vector b(3), u(3);
-
-  // random numbers:
-  n.X() = 0.123871;
-  n.Y() = 0.15432;
-  n.Z() = -0.43989;
-
-  cnt = 0;
-  for (i = 1; i <= faces.Size(); i++)
-    if (faces.Get(i).Valid())
-      {
-	const Point3d & p1 = points[faces.Get(i).Face().PNum(1)].P();
-	const Point3d & p2 = points[faces.Get(i).Face().PNum(2)].P();
-	const Point3d & p3 = points[faces.Get(i).Face().PNum(3)].P();
-
-	v1 = p2 - p1;
-	v2 = p3 - p1;
-
-	a.Elem(1, 1) = v1.X();
-	a.Elem(2, 1) = v1.Y();
-	a.Elem(3, 1) = v1.Z();
-	a.Elem(1, 2) = v2.X();
-	a.Elem(2, 2) = v2.Y();
-	a.Elem(3, 2) = v2.Z();
-	a.Elem(1, 3) = -n.X();
-	a.Elem(2, 3) = -n.Y();
-	a.Elem(3, 3) = -n.Z();
-
-	b.Elem(1) = p.X() - p1.X();
-	b.Elem(2) = p.Y() - p1.Y();
-	b.Elem(3) = p.Z() - p1.Z();
-
-	CalcInverse (a, ainv);
-	ainv.Mult (b, u);
-
-	if (u.Elem(1) >= 0 && u.Elem(2) >= 0 && u.Elem(1)+u.Elem(2) <= 1 &&
-	    u.Elem(3) > 0)
-	  {
-	    cnt++;
-	  }
-      }
-
-  return (cnt % 2);
-}
-
-
-
-
-
-int AdFront3 :: SameSide (const Point3d & lp1, const Point3d & lp2,
-			  const ARRAY<int> * testfaces) const
-{
-  int i, ii, cnt;
-
-  const Point3d *line[2];
-  line[0] = &lp1;
-  line[1] = &lp2;
-
-
-  cnt = 0;
-
-  Point3d pmin(lp1);
-  Point3d pmax(lp1);
-  pmin.SetToMin (lp2);
-  pmax.SetToMax (lp2);
-
-  static ARRAY<int> aprif;
-  aprif.SetSize(0);
-  
-  if (!testfaces)
-    facetree->GetIntersecting (pmin, pmax, aprif);
-  else
-    {
-      for (i = 1; i <= testfaces->Size(); i++)
-	aprif.Append (testfaces->Get(i));
-    }
-
-  //  (*testout) << "test ss, p1,p2 = " << lp1 << lp2 << ", inters = " << aprif.Size() << endl;
-  //  for (i = 1; i <= faces.Size(); i++)
-  for (ii = 1; ii <= aprif.Size(); ii++)
-    {
-      i = aprif.Get(ii);
-      
-      if (faces.Get(i).Valid())
-	{
-	  const Point3d *tri[3];
-	  tri[0] = &points[faces.Get(i).Face().PNum(1)].P();
-	  tri[1] = &points[faces.Get(i).Face().PNum(2)].P();
-	  tri[2] = &points[faces.Get(i).Face().PNum(3)].P();
-	  	  
-	  if (IntersectTriangleLine (&tri[0], &line[0]))
-	    cnt++;
-	  
-	}
-    }
-
-  return ((cnt+1) % 2);
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/adfront3.hpp b/contrib/Netgen/libsrc/meshing/adfront3.hpp
deleted file mode 100644
index 2c43f9334b58a459b741b37e24aef7311e74220a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/adfront3.hpp
+++ /dev/null
@@ -1,276 +0,0 @@
-#ifndef FILE_ADFRONT3
-#define FILE_ADFRONT3
-
-/**************************************************************************/
-/* File:   adfront3.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Okt. 95                                                    */
-/**************************************************************************/
-
-/*
-    Advancing front class for volume meshing
-*/
-
-
-
-/// Point in advancing front
-class FrontPoint3
-{
-  /// coordinates
-  Point3d p;           
-  /// global node index
-  PointIndex globalindex;   
-  /// number of faces connected to point 
-  int nfacetopoint;    
-  /// distance to original boundary
-  int frontnr;
-  /// 
-  int cluster;
-public:
-  ///
-  FrontPoint3 ();
-  ///
-  FrontPoint3 (const Point3d & ap, PointIndex agi);
-  
-  ///
-  const Point3d & P () const
-    { return p; }
-  ///
-  PointIndex GlobalIndex () const
-    { return globalindex; }
-  
-  ///
-  void AddFace ()
-    { nfacetopoint++; }
-
-  ///
-  void RemoveFace()
-    { 
-      nfacetopoint--;
-      if (nfacetopoint == 0) nfacetopoint = -1;
-    }
-  
-  ///
-  int Valid () const
-  { return nfacetopoint >= 0; }
-
-  ///
-  void DecFrontNr (int afrontnr)
-    {
-      if (frontnr > afrontnr) frontnr = afrontnr;
-    }
-  
-  ///
-  int FrontNr () const
-    { return frontnr; }
-
-  ///
-  friend class AdFront3;
-};
-
-/// Face in advancing front
-class FrontFace
-{
-  ///
-  Element2d f;
-  ///
-  int qualclass;
-  ///
-  char oldfront;
-  ///
-  int hashvalue;
-  ///
-  int cluster;
-
-public:
-  ///
-  FrontFace ();
-  ///
-  FrontFace (const Element2d & af);
-  ///
-  const Element2d & Face () const
-    { return f; }
-    
-  ///
-  int QualClass () const
-    { return qualclass; }
-
-  ///
-  void IncrementQualClass ()
-    { qualclass++; }
-
-  ///
-  void ResetQualClass ()
-    {
-      if (qualclass > 1)
-	{
-	  qualclass = 1;
-	  oldfront = 0;
-	}
-    }
-  
-  ///
-  bool Valid () const
-  { return !f.IsDeleted(); }
-
-  ///
-  void Invalidate ();
-
-  ///
-  int HashValue() const 
-  { return hashvalue; }
-
-  ///
-  void SetHashValue(int hv) 
-  { hashvalue = hv; }
-
-  ///
-  friend class AdFront3;
-
-  int Cluster () const { return cluster; }
-};  
-
-
-
-
-/// Advancing front, 3D.
-class AdFront3
-{
-  ///
-  ARRAY<FrontPoint3, PointIndex::BASE> points;
-  ///
-  ARRAY<FrontFace> faces;
-  ///
-  ARRAY<PointIndex> delpointl;
-
-  /// which points are connected to pi ?
-  TABLE<int, PointIndex::BASE> * connectedpairs;
-  
-  /// number of total front faces;
-  int nff;
-  /// number of quads in front
-  int nff4; 
-  
-  ///
-  double vol;
-
-  ///
-  GeomSearch3d hashtable;
-
-  /// 
-  int hashon;
-
-  ///
-  int hashcreated;
-
-  /// counter for rebuilding internal tables
-  int rebuildcounter;
-  /// last base element
-  int lasti;
-  /// minimal selection-value of baseelements
-  int minval;
-
-  ///
-  class Box3dTree * facetree;
-public:
-
-  ///
-  AdFront3 ();
-  ///
-  ~AdFront3 ();
-  ///
-  void GetPoints (ARRAY<Point3d> & apoints) const;
-  ///
-  int GetNP() const 
-    { return points.Size(); }
-  ///
-  const Point3d & GetPoint (PointIndex pi) const
-  { return points[pi].P(); }
-  ///
-  int GetNF() const
-    { return nff; }
-  ///
-  const Element2d & GetFace (int i) const
-    { return faces.Get(i).Face(); }
-  ///
-  void Print () const;
-  ///
-  bool Empty () const
-    { return nff == 0; }
-  ///
-  bool Empty (int elnp) const
-    {
-      if (elnp == 4)
-	return (nff4 == 0);
-      return (nff - nff4 == 0);
-    }
-  ///
-  int SelectBaseElement ();
-
-  ///
-  void CreateTrees ();
-
-  ///
-  void GetIntersectingFaces (const Point3d & pmin, const Point3d & pmax, 
-			     ARRAY<int> & ifaces) const;
-
-  ///
-  void GetFaceBoundingBox (int i, Box3d & box) const;
-
-  ///
-  int GetLocals (int baseelement,
-		 ARRAY<Point3d> & locpoints,
-                 ARRAY<Element2d> & locfaces,   // local index
-                 ARRAY<PointIndex> & pindex,
-                 ARRAY<INDEX> & findex,
-		 INDEX_2_HASHTABLE<int> & connectedpairs,
-                 float xh,
-		 float relh,
-		 INDEX& facesplit);
-  
-  ///
-  void GetGroup (int fi,
-                 ARRAY<MeshPoint> & grouppoints,
-                 ARRAY<Element2d> & groupelements,
-                 ARRAY<PointIndex> & pindex,
-                 ARRAY<INDEX> & findex
-                 ) const;
-
-  ///
-  void DeleteFace (INDEX fi);
-  ///
-  PointIndex AddPoint (const Point3d & p, PointIndex globind);
-  ///
-  INDEX AddFace (const Element2d & e);
-  ///
-  INDEX AddConnectedPair (const INDEX_2 & pair);
-  ///
-  void IncrementClass (INDEX fi);
-  ///
-  void ResetClass (INDEX fi);
-  ///
-  void SetStartFront (int baseelnp = 0);
-
-  /// is Point p inside Surface ?
-  int Inside (const Point3d & p) const;
-  /// both points on same side ?
-  int SameSide (const Point3d & lp1, const Point3d & lp2, 
-		const ARRAY<int> * testfaces = NULL) const;
-
-
-  ///
-  PointIndex GetGlobalIndex (PointIndex pi) const
-    { return points[pi].GlobalIndex(); }
-  ///
-  double Volume () const
-    { return vol; }
-
-
-private:
-  void RebuildInternalTables();
-};
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/bisect.cpp b/contrib/Netgen/libsrc/meshing/bisect.cpp
deleted file mode 100644
index c95a2f1421b5fa5449dbf5213c60ffa5a9107c86..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/bisect.cpp
+++ /dev/null
@@ -1,2371 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-//#include "../interface/writeuser.hpp"
-
-  class MarkedTet;
-  class MarkedPrism;
-  class MarkedTri;
-  class MarkedQuad;
-  
-  typedef MoveableArray<MarkedTet> T_MTETS;
-  typedef MoveableArray<MarkedPrism> T_MPRISMS;
-  typedef MoveableArray<MarkedTri> T_MTRIS;
-  typedef MoveableArray<MarkedQuad> T_MQUADS;
-
-class MarkedTet
-{
-public:
-  /// pnums of tet
-  PointIndex pnums[4];
-  /// material number
-  int matindex;
-  /// element marked for refinement
-  /// marked = 1: marked by element marker, marked = 2 due to closure
-  unsigned int marked:2;
-  /// flag of Arnold-Mukherjee algorithm
-  unsigned int flagged:1;
-  /// tetedge (local coordinates 0..3)
-  unsigned int tetedge1:3;
-  unsigned int tetedge2:3;
-  /// marked edge of faces
-  /// face_j : face without node j,
-  /// mark_k : edge without node k
-  unsigned char faceedges[4];
-
-  bool incorder;
-  unsigned int order:6;
-
-  friend ostream & operator<< (ostream & ost, const MarkedTet & mt);
-};
-
-class MarkedPrism
-{
-public:
-  /// 6 point numbers
-  PointIndex pnums[6];
-  /// material number
-  int matindex;
-  /// marked for refinement
-  int marked;
-  /// edge without node k (0,1,2)
-  int markededge;
-
-  bool incorder;
-  unsigned int order:6;
-};
-
-class MarkedTri
-{
-public:
-  /// three point numbers
-  PointIndex pnums[3];
-  /// three geominfos
-  PointGeomInfo pgeominfo[3];
-  /// marked for refinement
-  int marked;
-  /// edge without node k
-  int markededge;
-  /// surface id
-  int surfid;
-
-  bool incorder;
-  unsigned int order:6;
-};
-
-class MarkedQuad
-{
-public:
-  /// point numbers
-  PointIndex pnums[4];
-  ///
-  PointGeomInfo pgeominfo[4];
-  /// marked for refinement
-  int marked;
-  /// surface id
-  int surfid;
-
-  bool incorder;
-  unsigned int order:6;
-};
-
-
-
-
-
-ostream & operator<< (ostream & ost, const MarkedTet & mt)
-{
-  int k;
-  ost << "MT: " << mt.pnums[0] << " - " << mt.pnums[1] << " - " 
-      << mt.pnums[2] << " - " << mt.pnums[3] << endl
-      << "marked edge: " << mt.tetedge1 << " - " << mt.tetedge2
-      << ", order = " << mt.order << endl;
-  for (k = 0; k < 4; k++)
-    ost << mt.faceedges[k] << "  ";
-  ost << endl;
-  return ost;
-}
-
-
-
-
-void BTSortEdges (const Mesh & mesh,
-		  INDEX_2_CLOSED_HASHTABLE<int> & edgenumber)
-{
-  cout << "sorting ... " << flush;
-
-  //  if (mesh.PureTetMesh())
-  if (1)
-    {
-      // new, fast version
-      
-      ARRAY<INDEX_2> edges;
-      ARRAY<int> eclasses;
-      
-      int i, j, k;
-      int cntedges = 0;
-      int goon;
-      int ned;
-      
-      // enumerate edges:
-      for (i = 1; i <= mesh.GetNE(); i++)
-	{
-	  const Element & el = mesh.VolumeElement (i);
-	  static int tetedges[6][2] =
-	  { { 1, 2 },
-	    { 1, 3 },
-	    { 1, 4 },
-	    { 2, 3 },
-	    { 2, 4 },
-            { 3, 4 } } ;
-	  static int prismedges[9][2] =
-	  { { 1, 2 },
-	    { 1, 3 },
-	    { 2, 3 },
-	    { 4, 5 },
-	    { 4, 6 },
-	    { 5, 6 },
-	    { 1, 4 },
-	    { 2, 5 },
-            { 3, 6 } };
-	  int pyramidedges[6][2] =
-	  { { 1, 2 },
-	    { 3, 4 },
-	    { 1, 5 },
-	    { 2, 5 },
-	    { 3, 5 },
-	    { 4, 5 } };
-	  
-	  int (*tip)[2];
-	  
-	  switch (el.GetType())
-	    {
-	    case TET:
-	    case TET10:
-	      {
-		tip = tetedges;
-		ned = 6;
-		break;
-	      }
-	    case PRISM:
-	    case PRISM12:
-	      {
-		tip = prismedges;
-		ned = 6;
-		break;
-	      }
-	    case PYRAMID:
-	      {
-		tip = pyramidedges;
-		ned = 6;
-		break;
-	      }
-	    }
-	      
-	  for (j = 0; j < ned; j++)
-	    {
-	      INDEX_2 i2(el.PNum(tip[j][0]), el.PNum(tip[j][1]));
-	      i2.Sort();
-	      if (!edgenumber.Used(i2))
-		{
-		  cntedges++;
-		  edges.Append (i2);
-		  edgenumber.Set(i2, cntedges);
-		}
-	    }
-	}
-      
-      // additional surface edges:
-      for (i = 1; i <= mesh.GetNSE(); i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement (i);
-	  static int trigedges[3][2] =
-	  { { 1, 2 },
-	    { 2, 3 },
-	    { 3, 1 } };
-
-	  static int quadedges[4][2] =
-	  { { 1, 2 },
-	    { 2, 3 },
-	    { 3, 4 },
-	    { 4, 1 } };
-
-
-	  int (*tip)[2];
-	  
-	  switch (el.GetType())
-	    {
-	    case TRIG:
-	    case TRIG6:
-	      {
-		tip = trigedges;
-		ned = 3;
-		break;
-	      }
-	    case QUAD:
-	    case QUAD6:
-	      {
-		tip = quadedges;
-		ned = 4;
-		break;
-	      }
-	    default:
-	      {
-		cerr << "Error: Sort for Bisect, SE has " << el.GetNP() << " points" << endl;
-		ned = 0;
-	      }
-	    }
-	      
-	  for (j = 0; j < ned; j++)
-	    {
-	      INDEX_2 i2(el.PNum(tip[j][0]), el.PNum(tip[j][1]));
-	      i2.Sort();
-	      if (!edgenumber.Used(i2))
-		{
-		  cntedges++;
-		  edges.Append (i2);
-		  edgenumber.Set(i2, cntedges);
-		}
-	    }
-	}
-
-
-
-
-
-      eclasses.SetSize (cntedges);
-      for (i = 1; i <= cntedges; i++)
-	eclasses.Elem(i) = i;
-
-
-      // identify edges in element stack
-      do
-	{
-	  goon = 0;
-	  for (i = 1; i <= mesh.GetNE(); i++)
-	    {
-	      const Element & el = mesh.VolumeElement (i);	     
-	      
-	      if (el.GetType() != PRISM &&
-		  el.GetType() != PRISM12 &&
-		  el.GetType() != PYRAMID)
-		continue;
-
-	      int prismpairs[3][4] =
-	      { { 1, 2, 4, 5 },
-		{ 2, 3, 5, 6 },
-		{ 1, 3, 4, 6 } };
-	      
-	      int pyramidpairs[3][4] =
-	      { { 1, 2, 4, 3 },
-		{ 1, 5, 4, 5 },
-		{ 2, 5, 3, 5 } };
-		      
-	      int (*pairs)[4];
-	      switch (el.GetType())
-		{
-		case PRISM:
-		case PRISM12:
-		  {
-		    pairs = prismpairs;
-		    break;
-		  }
-		case PYRAMID:
-		  {
-		    pairs = pyramidpairs;
-		    break;
-		  }
-		}
-
-	      for (j = 0; j < 3; j++)
-		{
-		  INDEX_2 e1 (el.PNum(pairs[j][0]), 
-			      el.PNum(pairs[j][1]));
-		  INDEX_2 e2 (el.PNum(pairs[j][2]), 
-			      el.PNum(pairs[j][3]));
-		  e1.Sort();
-		  e2.Sort();
-		      
-		  int eclass1 = edgenumber.Get (e1);
-		  int eclass2 = edgenumber.Get (e2);
-
-		  //		  (*testout) << "identify edges " << eclass1 << "-" << eclass2 << endl;
-
-		  if (eclasses.Get(eclass1) >
-		      eclasses.Get(eclass2))
-		    {
-		      eclasses.Elem(eclass1) = 
-			eclasses.Get(eclass2);
-		      goon = 1;
-		    }
-		  if (eclasses.Get(eclass2) >
-		      eclasses.Get(eclass1))
-		    {
-		      eclasses.Elem(eclass2) = 
-			eclasses.Get(eclass1);
-		      goon = 1;
-		    }
-		}
-	    }
-	}
-      while (goon);
-
-      /*      
-      for (i = 1; i <= cntedges; i++)
-	{
-	  (*testout) << "edge " << i << ": " 
-		     << edges.Get(i).I1() << "-" << edges.Get(i).I2()
-		     << ", class = " << eclasses.Get(i) << endl;
-	}
-      */      
-      // compute classlength:
-      ARRAY<double> edgelength(cntedges);
-      for (i = 1; i <= cntedges; i++)
-	edgelength.Elem(i) = 1e20;
-
-      for (i = 1; i <= cntedges; i++)
-	{
-	  INDEX_2 edge = edges.Get(i);
-	  double elen = Dist (mesh.Point(edge.I1()),
-			      mesh.Point(edge.I2()));
-	  edgelength.Elem (i) = elen;
-	}
-
-      /*
-      for (i = 1; i <= mesh.GetNE(); i++)
-	{
-	  const Element & el = mesh.VolumeElement (i);
-	  
-	  if (el.GetType() == TET)
-	    {
-	      for (j = 1; j <= 3; j++)
-		for (k = j+1; k <= 4; k++)
-		  {
-		    INDEX_2 i2(el.PNum(j), el.PNum(k));
-		    i2.Sort();
-		    
-		    int enr = edgenumber.Get(i2);
-		    double elen = Dist (mesh.Point (i2.I1()), mesh.Point (i2.I2()));
-		    if (elen < edgelength.Get(enr))
-		      edgelength.Set (enr, elen);
-		  }
-	    }
-	  else if (el.GetType() == PRISM)
-	    {
-	      for (j = 1; j <= 3; j++)
-		{
-		  k = (j % 3) + 1;
-		  
-		  INDEX_2 i2(el.PNum(j), el.PNum(k));
-		  i2.Sort();
-		  
-		  int enr = edgenumber.Get(i2);
-		  double elen = Dist (mesh.Point (i2.I1()), mesh.Point (i2.I2()));
-		  if (elen < edgelength.Get(enr))
-		    edgelength.Set (enr, elen);
-		  
-		  i2 = INDEX_2(el.PNum(j+3), el.PNum(k+3));
-		  i2.Sort();
-		  
-		  enr = edgenumber.Get(i2);
-		  elen = Dist (mesh.Point (i2.I1()), mesh.Point (i2.I2()));
-		  if (elen < edgelength.Get(enr))
-		    edgelength.Set (enr, elen);
-		  
-		  if (!edgenumber.Used(i2))
-		    {
-		      cntedges++;
-		      edgenumber.Set(i2, cntedges);
-		    }
-		  i2 = INDEX_2(el.PNum(j), el.PNum(j+3));
-		  i2.Sort();
-		  
-		  enr = edgenumber.Get(i2);
-		  elen = Dist (mesh.Point (i2.I1()), mesh.Point (i2.I2()));
-		  if (elen < edgelength.Get(enr))
-		    edgelength.Set (enr, elen);
-		}
-	    }
-	}
-      */
-
-      
-      for (i = 1; i <= cntedges; i++)
-	{
-	  if (eclasses.Get(i) != i)
-	    {
-	      if (edgelength.Get(i) < edgelength.Get(eclasses.Get(i)))
-		edgelength.Elem(eclasses.Get(i)) = edgelength.Get(i);
-	      edgelength.Elem(i) = 1e20;
-	    }
-	}
-
-
-      TABLE<int> eclasstab(cntedges);
-      for (i = 1; i <= cntedges; i++)
-	eclasstab.Add1 (eclasses.Get(i), i);
-
-
-      // sort edges:
-      ARRAY<int> sorted(cntedges);
-      
-      QickSort (edgelength, sorted);
-      
-      int cnt = 0;
-      for (i = 1; i <= cntedges; i++)
-	{
-	  int ii = sorted.Get(i);
-	  for (j = 1; j <= eclasstab.EntrySize(ii); j++)
-	    {
-	      cnt++;
-	      edgenumber.Set (edges.Get(eclasstab.Get(ii, j)), cnt); 
-	    }
-	}
-    }
-
-  else
-    
-    {
-      // old version
-      
-      int i, j, k;
-      int cnt = 0;
-      int found;
-      double len2, maxlen2;
-      INDEX_2 ep;
-      
-      // sort edges by length, parallel edges (on prisms)
-      // are added in blocks
-      
-      do
-	{
-	  found = 0;
-	  maxlen2 = 1e30;
-	  
-	  for (i = 1; i <= mesh.GetNE(); i++)
-	    {
-	      const Element & el = mesh.VolumeElement (i);
-	      int ned;
-	      int tetedges[6][2] =
-	      { { 1, 2 },
-		{ 1, 3 },
-		{ 1, 4 },
-		{ 2, 3 },
-		{ 2, 4 },
-		{ 3, 4 } };
-	      int prismedges[6][2] =
-	      { { 1, 2 },
-		{ 1, 3 },
-		{ 2, 4 },
-		{ 4, 5 },
-		{ 4, 6 },
-		{ 5, 6 } };
-	      int pyramidedges[6][2] =
-	      { { 1, 2 },
-		{ 3, 4 },
-		{ 1, 5 },
-		{ 2, 5 },
-		{ 3, 5 },
-		{ 4, 5 } };
-
-	      int (*tip)[2];
-
-	      switch (el.GetType())
-		{
-		case TET:
-		  {
-		    tip = tetedges;
-		    ned = 6;
-		    break;
-		  }
-		case PRISM:
-		  {
-		    tip = prismedges;
-		    ned = 6;
-		    break;
-		  }
-		case PYRAMID:
-		  {
-		    tip = pyramidedges;
-		    ned = 6;
-		    break;
-		  }
-		}
-	      
-	      for (j = 0; j < ned; j++)
-		{
-		  INDEX_2 i2(el.PNum(tip[j][0]), el.PNum(tip[j][1]));
-		  i2.Sort();
-		  if (!edgenumber.Used(i2))
-		    {
-		      len2 = Dist (mesh.Point (i2.I1()),
-				   mesh.Point (i2.I2()));
-		      if (len2 < maxlen2)
-			{
-			  maxlen2 = len2;
-			  ep = i2;
-			  found = 1;
-			}
-		    }
-		}
-	    }
-	  if (found)
-	    {
-	      cnt++;
-	      edgenumber.Set (ep, cnt);
-	      
-	      
-	      // find connected edges:
-	      int goon = 0;
-	      do
-		{
-		  goon = 0;
-		  for (i = 1; i <= mesh.GetNE(); i++)
-		    {
-		      const Element & el = mesh.VolumeElement (i);	      
-		      if (el.GetNP() != 6) continue;
-
-		      int prismpairs[3][4] =
-		      { { 1, 2, 4, 5 },
-			{ 2, 3, 5, 6 },
-			{ 1, 3, 4, 6 } };
-
-		      int pyramidpairs[3][4] =
-		      { { 1, 2, 4, 3 },
-			{ 1, 5, 4, 5 },
-			{ 2, 5, 3, 5 } };
-		      
-		      int (*pairs)[4];
-		      switch (el.GetType())
-			{
-			case PRISM:
-			  {
-			    pairs = prismpairs;
-			    break;
-			  }
-			case PYRAMID:
-			  {
-			    pairs = pyramidpairs;
-			    break;
-			  }
-			}
-
-		      for (j = 0; j < 3; j++)
-			{
-			  INDEX_2 e1 (el.PNum(pairs[j][0]), 
-				      el.PNum(pairs[j][1]));
-			  INDEX_2 e2 (el.PNum(pairs[j][2]), 
-				      el.PNum(pairs[j][3]));
-			  e1.Sort();
-			  e2.Sort();
-			  
-			  int used1 = edgenumber.Used (e1);
-			  int used2 = edgenumber.Used (e2);
-			  
-			  if (used1 && !used2)
-			    {
-			      cnt++;
-			      edgenumber.Set (e2, cnt);
-			      goon = 1;
-			    }
-			  if (used2 && !used1)
-			    {
-			      cnt++;
-			      edgenumber.Set (e1, cnt);
-			      goon = 1;
-			    }
-			}
-		    }
-		}
-	      while (goon);
-	    }
-	}
-      while (found);
-    }
-}
-
-
-
-
-void BTDefineMarkedTet (const Element & el,
-			INDEX_2_CLOSED_HASHTABLE<int> & edgenumber,
-			MarkedTet & mt)
-{
-  int i, j, k;
-  for (i = 0; i < 4; i++)
-    mt.pnums[i] = el[i];
-
-  mt.marked = 0;
-  mt.flagged = 0;
-
-  mt.incorder = 0;
-  mt.order = 1;
-  
-  int val = 0;
-  // find marked edge of tet:
-  for (i = 0; i < 3; i++)
-    for (j = i+1; j < 4; j++)
-      {
-	INDEX_2 i2(mt.pnums[i], mt.pnums[j]);
-	i2.Sort();
-	int hval = edgenumber.Get(i2);
-	if (hval > val)
-	  {
-	    val = hval;
-	    mt.tetedge1 = i;
-	    mt.tetedge2 = j;
-	  }
-      }
-
-
-  // find marked edges of faces:
-  for (k = 0; k < 4; k++)
-    {
-      val = 0;
-      for (i = 0; i < 3; i++)
-	for (j = i+1; j < 4; j++)
-	  if (i != k && j != k)
-	    {
-	      INDEX_2 i2(mt.pnums[i], mt.pnums[j]);
-	      i2.Sort();
-	      int hval = edgenumber.Get(i2);
-	      if (hval > val)
-		{
-		  val = hval;
-		  mt.faceedges[k] = 6 - k - i - j;
-		}
-	    }
-    }
-}
-
-
-
-
-void BTDefineMarkedPrism (const Element & el,
-			  INDEX_2_CLOSED_HASHTABLE<int> & edgenumber,
-			  MarkedPrism & mp)
-{
-  int i, j, k;
-
-  if (el.GetType() == PRISM ||
-      el.GetType() == PRISM12)
-    {
-      for (i = 0; i < 6; i++)
-	mp.pnums[i] = el[i];
-    }
-  else if (el.GetType() == PYRAMID)
-    {
-      static int map[6] = 
-	{ 1, 2, 5, 4, 3, 5 };
-      for (i = 0; i < 6; i++)
-	mp.pnums[i] = el.PNum(map[i]);
-    }
-  else if (el.GetType() == TET ||
-	   el.GetType() == TET10)
-    {
-      static int map[6] = 
-      { 1, 4, 3, 2, 4, 3 };
-      for (i = 0; i < 6; i++)
-	mp.pnums[i] = el.PNum(map[i]);
-      
-    }
-  else
-    {
-      PrintSysError ("Define marked prism called for non-prism and non-pyramid");
-    }
-  
-
-
-  mp.marked = 0;
-
-  mp.incorder = 0;
-  mp.order = 1;
-
-  int val = 0;
-  for (i = 0; i < 2; i++)
-    for (j = i+1; j < 3; j++)
-      {
-	INDEX_2 i2(mp.pnums[i], mp.pnums[j]);
-	i2.Sort();
-	int hval = edgenumber.Get(i2);
-	if (hval > val)
-	  {
-	    val = hval;
-	    mp.markededge = 3 - i - j;
-	  }
-      }
-}
-
-
-
-
-
-
-void BTDefineMarkedTri (const Element2d & el,
-			INDEX_2_CLOSED_HASHTABLE<int> & edgenumber,
-			MarkedTri & mt)
-{
-  int i, j, k;
-  for (i = 0; i < 3; i++)
-    {
-      mt.pnums[i] = el[i];
-      mt.pgeominfo[i] = el.GeomInfoPi (i+1);
-    }
-
-  mt.marked = 0;
-  mt.surfid = el.GetIndex();
-
-  mt.incorder = 0;
-  mt.order = 1;
-
-  int val = 0;
-  for (i = 0; i < 2; i++)
-    for (j = i+1; j < 3; j++)
-      {
-	INDEX_2 i2(mt.pnums[i], mt.pnums[j]);
-	i2.Sort();
-	int hval = edgenumber.Get(i2);
-	if (hval > val)
-	  {
-	    val = hval;
-	    mt.markededge = 3 - i - j;
-	  }
-      }
-}
-
-
-
-
-
-void BTDefineMarkedQuad (const Element2d & el,
-			 INDEX_2_CLOSED_HASHTABLE<int> & edgenumber,
-			 MarkedQuad & mq)
-{
-  int i, j, k;
-  for (i = 0; i < 4; i++)
-    mq.pnums[i] = el[i];
-  Swap (mq.pnums[2], mq.pnums[3]);
-
-  mq.marked = 0;
-  mq.surfid = el.GetIndex();
-}
-
-
-
-
-// mark elements due to local h
-int BTMarkTets (T_MTETS & mtets,
-		T_MPRISMS & mprisms,
-		const Mesh & mesh)
-{
-  int i, j, k;
-  int step;
-
-  int marked = 0;
-
-  int np = mesh.GetNP();
-  Vector hv(np);
-  for (i = 1; i <= np; i++)
-    hv.Elem(i) = mesh.GetH (mesh.Point(i));
-
-  double hfac = 1;
-  
-  for (step = 1; step <= 2; step++)
-    {
-      for (i = 1; i <= mtets.Size(); i++)
-	{
-	  double h = 0;
-	  
-	  for (j = 0; j < 3; j++)
-	    for (k = j+1; k < 4; k++)
-	      {
-		const Point3d & p1 = mesh.Point (mtets.Get(i).pnums[j]);
-		const Point3d & p2 = mesh.Point (mtets.Get(i).pnums[k]);
-		double hh = Dist2 (p1, p2);
-		if (hh > h) h = hh;
-	      }
-	  h = sqrt (h);
-	  
-	  double hshould = 1e10;
-	  for (j = 0; j < 4; j++)
-	    {
-	      double hi = hv.Get (mtets.Get(i).pnums[j]);
-	      if (hi < hshould)
-		hshould = hi;
-	    }
-	  
-	
-	  if (step == 1)
-	    {
-	      if (h / hshould > hfac)
-		hfac = h / hshould;
-	    }
-	  else
-	    {
-	      if (h > hshould * hfac)
-		{
-		  mtets.Elem(i).marked = 1;
-		  marked = 1;
-		}
-	      else
-		mtets.Elem(i).marked = 0;
-	    }
-	  
-	}
-      for (i = 1; i <= mprisms.Size(); i++)
-	{
-	  double h = 0;
-	  
-	  for (j = 0; j < 2; j++)
-	    for (k = j+1; k < 3; k++)
-	      {
-		const Point3d & p1 = mesh.Point (mprisms.Get(i).pnums[j]);
-		const Point3d & p2 = mesh.Point (mprisms.Get(i).pnums[k]);
-		double hh = Dist2 (p1, p2);
-		if (hh > h) h = hh;
-	      }
-	  h = sqrt (h);
-	  
-	  double hshould = 1e10;
-	  for (j = 0; j < 6; j++)
-	    {
-	      double hi = hv.Get (mprisms.Get(i).pnums[j]);
-	      if (hi < hshould)
-		hshould = hi;
-	    }
-	  
-	
-	  if (step == 1)
-	    {
-	      if (h / hshould > hfac)
-		hfac = h / hshould;
-	    }
-	  else
-	    {
-	      if (h > hshould * hfac)
-		{
-		  mprisms.Elem(i).marked = 1;
-		  marked = 1;
-		}
-	      else
-		mprisms.Elem(i).marked = 0;
-	    }
-	  
-	}
-
-
-
-      if (step == 1)
-	{
-	  if (hfac > 2)
-	    hfac /= 2;
-	  else
-	    hfac = 1;
-	}
-
-    }
-  return marked;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void BTBisectTet (const MarkedTet & oldtet, int newp, 
-		  MarkedTet & newtet1, MarkedTet & newtet2)
-{
-  int i, j, k;
-  
-  
-  // points vis a vis from tet-edge
-  int vis1, vis2;
-  vis1 = 0;
-  while (vis1 == oldtet.tetedge1 || vis1 == oldtet.tetedge2)
-    vis1++;
-  vis2 = 6 - vis1 - oldtet.tetedge1 - oldtet.tetedge2;
-
-
-  // is tet of type P ?
-  int istypep = 0;
-  for (i = 0; i < 4; i++)
-    {
-      int cnt = 0;
-      for (j = 0; j < 4; j++)
-	if (oldtet.faceedges[j] == i)
-	  cnt++;
-      if (cnt == 3)
-	istypep = 1;
-    }
-
-
-  
-  for (i = 0; i < 4; i++)
-    {
-      newtet1.pnums[i] = oldtet.pnums[i];
-      newtet2.pnums[i] = oldtet.pnums[i];
-    }
-  newtet1.flagged = istypep && !oldtet.flagged;
-  newtet2.flagged = istypep && !oldtet.flagged;
-
-  int nm = oldtet.marked - 1;
-  if (nm < 0) nm = 0;
-  newtet1.marked = nm;
-  newtet2.marked = nm;
-
-
-  for (i = 0; i < 4; i++)
-    {
-      if (i == oldtet.tetedge1)
-	{
-	  newtet2.pnums[i] = newp;
-	  newtet2.faceedges[i] = oldtet.faceedges[i];  // inherited face
-	  newtet2.faceedges[vis1] = i;        // cut faces
-	  newtet2.faceedges[vis2] = i;
-
-	  j = 0;
-	  while (j == i || j == oldtet.faceedges[i])
-	    j++;
-	  k = 6 - i - oldtet.faceedges[i] - j;
-	  newtet2.tetedge1 = j;                        // tet-edge
-	  newtet2.tetedge2 = k;         
-
-	  // new face:
-	  if (istypep && oldtet.flagged)
-	    newtet2.faceedges[oldtet.tetedge2] = 
-	      6 - oldtet.tetedge1 - j - k;
-	  else
-	    newtet2.faceedges[oldtet.tetedge2] = oldtet.tetedge1;
-	}
-
-      if (i == oldtet.tetedge2)
-	{
-	  newtet1.pnums[i] = newp;
-	  newtet1.faceedges[i] = oldtet.faceedges[i];  // inherited face
-	  newtet1.faceedges[vis1] = i;
-	  newtet1.faceedges[vis2] = i;
-	  j = 0;
-	  while (j == i || j == oldtet.faceedges[i])
-	    j++;
-	  k = 6 - i - oldtet.faceedges[i] - j;
-	  newtet1.tetedge1 = j;        
-	  newtet1.tetedge2 = k;
-
-	  // new face:
-	  if (istypep && oldtet.flagged)
-	    newtet1.faceedges[oldtet.tetedge1] = 
-	      6 - oldtet.tetedge2 - j - k;
-	  else
-	    newtet1.faceedges[oldtet.tetedge1] = oldtet.tetedge2;
-	}
-    }
-
-  newtet1.matindex = oldtet.matindex;
-  newtet2.matindex = oldtet.matindex;
-  newtet1.incorder = 0;
-  newtet1.order = oldtet.order;
-  newtet2.incorder = 0;
-  newtet2.order = oldtet.order;
-}
-
-
-
-
-void BTBisectPrism (const MarkedPrism & oldprism, int newp1, int newp2,
-		    MarkedPrism & newprism1, MarkedPrism & newprism2)
-{
-  int i, j, k;
-
-  for (i = 0; i < 6; i++)
-    {
-      newprism1.pnums[i] = oldprism.pnums[i];
-      newprism2.pnums[i] = oldprism.pnums[i];
-    }  
-
-  int pe1, pe2;
-  pe1 = 0;
-  if (pe1 == oldprism.markededge)
-    pe1++;
-  pe2 = 3 - oldprism.markededge - pe1;
-
-  newprism1.pnums[pe2] = newp1;
-  newprism1.pnums[pe2+3] = newp2;
-  newprism1.markededge = pe2;
-  newprism2.pnums[pe1] = newp1;
-  newprism2.pnums[pe1+3] = newp2;
-  newprism2.markededge = pe1;
-
-  newprism1.matindex = oldprism.matindex;
-  newprism2.matindex = oldprism.matindex;
-
-  int nm = oldprism.marked - 1;
-  if (nm < 0) nm = 0;
-  newprism1.marked = nm;
-  newprism2.marked = nm;
-
-  newprism1.incorder = 0;
-  newprism1.order = oldprism.order;
-  newprism2.incorder = 0;
-  newprism2.order = oldprism.order;
-}
-
-
-
-void BTBisectTri (const MarkedTri & oldtri, int newp, const PointGeomInfo & newpgi,
-		  MarkedTri & newtri1, MarkedTri & newtri2)
-{
-  int i, j, k;
-
-  for (i = 0; i < 3; i++)
-    {
-      newtri1.pnums[i] = oldtri.pnums[i];
-      newtri1.pgeominfo[i] = oldtri.pgeominfo[i];
-      newtri2.pnums[i] = oldtri.pnums[i];
-      newtri2.pgeominfo[i] = oldtri.pgeominfo[i];
-    }  
-
-  int pe1, pe2;
-  pe1 = 0;
-  if (pe1 == oldtri.markededge)
-    pe1++;
-  pe2 = 3 - oldtri.markededge - pe1;
-
-  newtri1.pnums[pe2] = newp;
-  newtri1.pgeominfo[pe2] = newpgi;
-  newtri1.markededge = pe2;
-
-  newtri2.pnums[pe1] = newp;
-  newtri2.pgeominfo[pe1] = newpgi;
-  newtri2.markededge = pe1;
-
-  newtri1.surfid = oldtri.surfid;
-  newtri2.surfid = oldtri.surfid;
-
-  int nm = oldtri.marked - 1;
-  if (nm < 0) nm = 0;
-  newtri1.marked = nm;
-  newtri2.marked = nm;
-
-  newtri1.incorder = 0;
-  newtri1.order = oldtri.order;
-  newtri2.incorder = 0;
-  newtri2.order = oldtri.order;
-}
-
-
-void BTBisectQuad (const MarkedQuad & oldquad, 
-		   int newp1, const PointGeomInfo & npgi1, 
-		   int newp2, const PointGeomInfo & npgi2, 
-		   MarkedQuad & newquad1, MarkedQuad & newquad2)
-{
-  int i, j, k;
-
-  for (i = 0; i < 4; i++)
-    {
-      newquad1.pnums[i] = oldquad.pnums[i];
-      newquad1.pgeominfo[i] = oldquad.pgeominfo[i];
-      newquad2.pnums[i] = oldquad.pnums[i];
-      newquad2.pgeominfo[i] = oldquad.pgeominfo[i];
-    }  
-
-  newquad1.pnums[1] = newp1;
-  newquad1.pgeominfo[1] = npgi1;
-  newquad1.pnums[3] = newp2;
-  newquad1.pgeominfo[3] = npgi2;
-
-  newquad2.pnums[0] = newp1;
-  newquad2.pgeominfo[0] = npgi1;
-  newquad2.pnums[2] = newp2;
-  newquad2.pgeominfo[2] = npgi2;
-
-  newquad1.surfid = oldquad.surfid;
-  newquad2.surfid = oldquad.surfid;
-
-
-  int nm = oldquad.marked - 1;
-  if (nm < 0) nm = 0;
-
-  newquad1.marked = nm;
-  newquad2.marked = nm;
-}
-
-
-
-
-int MarkHangingTets (T_MTETS & mtets, 
-		     const INDEX_2_CLOSED_HASHTABLE<int> & cutedges)
-{
-  int i, j, k;
-
-  int hanging = 0;
-  for (i = 1; i <= mtets.Size(); i++)
-    {
-      MarkedTet & teti = mtets.Elem(i);
-
-      if (teti.marked)
-	{
-	  hanging = 1;
-	  continue;
-	}
-
-      for (j = 0; j < 3; j++)
-	for (k = j+1; k < 4; k++)
-	  {
-	    INDEX_2 edge(teti.pnums[j],
-			 teti.pnums[k]);
-	    edge.Sort();
-	    if (cutedges.Used (edge))
-	      {
-		teti.marked = 1;
-		hanging = 1;
-	      }
-	  }
-    }
-  return hanging;
-}
-
-
-
-int MarkHangingPrisms (T_MPRISMS & mprisms, 
-		       const INDEX_2_CLOSED_HASHTABLE<int> & cutedges)
-{
-  int i, j, k;
-
-  int hanging = 0;
-  for (i = 1; i <= mprisms.Size(); i++)
-    {
-      if (mprisms.Elem(i).marked)
-	{
-	  hanging = 1;
-	  continue;
-	}
-
-      for (j = 0; j < 2; j++)
-	for (k = j+1; k < 3; k++)
-	  {
-	    INDEX_2 edge1(mprisms.Get(i).pnums[j],
-			  mprisms.Get(i).pnums[k]);
-	    INDEX_2 edge2(mprisms.Get(i).pnums[j+3],
-			  mprisms.Get(i).pnums[k+3]);
-	    edge1.Sort();
-	    edge2.Sort();
-	    if (cutedges.Used (edge1) ||
-		cutedges.Used (edge2))
-	      {
-		mprisms.Elem(i).marked = 1;
-		hanging = 1;
-	      }
-	  }
-    }
-  return hanging;
-}
-
-
-
-int MarkHangingTris (T_MTRIS & mtris, 
-		     const INDEX_2_CLOSED_HASHTABLE<int> & cutedges)
-{
-  int i, j, k;
-
-  int hanging = 0;
-  for (i = 1; i <= mtris.Size(); i++)
-    {
-      if (mtris.Get(i).marked)
-	{
-	  hanging = 1;
-	  continue;
-	}
-      for (j = 0; j < 2; j++)
-	for (k = j+1; k < 3; k++)
-	  {
-	    INDEX_2 edge(mtris.Get(i).pnums[j],
-			 mtris.Get(i).pnums[k]);
-	    edge.Sort();
-	    if (cutedges.Used (edge))
-	      {
-		mtris.Elem(i).marked = 1;
-		hanging = 1;
-	      }
-	  }
-    }
-  return hanging;
-}
-
-
-
-int MarkHangingQuads (T_MQUADS & mquads, 
-		      const INDEX_2_CLOSED_HASHTABLE<int> & cutedges)
-{
-  int i;
-
-  int hanging = 0;
-  for (i = 1; i <= mquads.Size(); i++)
-    {
-      if (mquads.Elem(i).marked)
-	{
-	  hanging = 1;
-	  continue;
-	}
-
-      INDEX_2 edge1(mquads.Get(i).pnums[0],
-		    mquads.Get(i).pnums[1]);
-      INDEX_2 edge2(mquads.Get(i).pnums[2],
-		    mquads.Get(i).pnums[3]);
-      edge1.Sort();
-      edge2.Sort();
-      if (cutedges.Used (edge1) ||
-	  cutedges.Used (edge2))
-	{
-	  mquads.Elem(i).marked = 1;
-	  hanging = 1;
-	}
-    
-    }
-  return hanging;
-}
-
-
-
-void ConnectToNodeRec (int node, int tonode, 
-		       const TABLE<int> & conto, ARRAY<int> & connecttonode)
-{
-  int i, n2;
-  //  (*testout) << "connect " << node << " to " << tonode << endl;
-  for (i = 1; i <= conto.EntrySize(node); i++)
-    {
-      n2 = conto.Get(node, i);
-      if (!connecttonode.Get(n2))
-	{
-	  connecttonode.Elem(n2) = tonode;
-	  ConnectToNodeRec (n2, tonode, conto, connecttonode);
-	}
-    }
-}
-
-
-
-
-T_MTETS mtets;
-T_MPRISMS mprisms;
-T_MTRIS mtris;
-T_MQUADS mquads;
-
-
-
-void BisectTetsCopyMesh (Mesh & mesh, const class CSGeometry *,
-			 BisectionOptions & opt)
-{
-  mtets.SetName ("bisection, tets");
-  mprisms.SetName ("bisection, prisms");
-  mtris.SetName ("bisection, trigs");
-  mquads.SetName ("bisection, quads");
-
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-  int i, j, k, l, m;
-
-  /*
-  if (mtets.Size() + mprisms.Size() == mesh.GetNE())
-    return;
-  */
-
-  mtets.SetSize(0);
-  mprisms.SetSize(0);
-  mtris.SetSize(0);
-  mquads.SetSize(0);
-
-
-  INDEX_2_HASHTABLE<int> shortedges(100);
-  for (i = 1; i <= ne; i++)
-    {
-      const Element & el = mesh.VolumeElement(i);
-      if (el.GetType() == PRISM ||
-	  el.GetType() == PRISM12)
-	{
-	  for (j = 1; j <= 3; j++)
-	    {
-	      INDEX_2 se(el.PNum(j), el.PNum(j+3));
-	      se.Sort();
-	      shortedges.Set (se, 1);
-	    }
-	}
-    }
-
-
-
-  // INDEX_2_HASHTABLE<int> edgenumber(np);
-  INDEX_2_CLOSED_HASHTABLE<int> edgenumber(9*ne+4*nse);  
-
-  BTSortEdges (mesh, edgenumber);
-  for (i = 1; i <= ne; i++)
-    {
-      const Element & el = mesh.VolumeElement(i);
-	  
-      switch (el.GetType())
-	{
-	case TET:
-	case TET10:
-	  {
-	    // if tet has short edge, it is handled as degenerated prism
-
-	    int foundse = 0;
-	    for (j = 1; j <= 3; j++)
-	      for (k = j+1; k <= 4; k++)
-		{
-		  INDEX_2 se(el.PNum(j), el.PNum(k));
-		  se.Sort();
-		  if (shortedges.Used (se))
-		    {
-		      //		      cout << "tet converted to prism" << endl;
-
-		      foundse = 1;
-		      int p3 = 1;
-		      while (p3 == j || p3 == k)
-			p3++;
-		      int p4 = 10 - j - k - p3;
-
-		      // even permutation ?
-		      int pi[4];
-		      pi[0] = j;
-		      pi[1] = k;
-		      pi[2] = p3;
-		      pi[3] = p4;
-		      int cnt = 0;
-		      for (l = 1; l <= 4; l++)
-			for (m = 0; m < 3; m++)
-			  if (pi[m] > pi[m+1])
-			    {
-			      Swap (pi[m], pi[m+1]);
-			      cnt++;
-			    }
-		      if (cnt % 2)
-			Swap (p3, p4);
-
-		      Element hel = el;
-		      hel.PNum(1) = el.PNum(j);
-		      hel.PNum(2) = el.PNum(k);
-		      hel.PNum(3) = el.PNum(p3);
-		      hel.PNum(4) = el.PNum(p4);
-
-		      MarkedPrism mp;
-		      BTDefineMarkedPrism (hel, edgenumber, mp);
-		      mp.matindex = el.GetIndex();
-		      mprisms.Append (mp);
-		    }
-		}
-	    if (!foundse)
-	      {
-		MarkedTet mt;
-		BTDefineMarkedTet (el, edgenumber, mt);
-		mt.matindex = el.GetIndex();
-		mtets.Append (mt);
-	      }
-	    break;
-	  }
-	case PYRAMID:
-	  {
-	    // eventually rotate
-	    MarkedPrism mp;
-	    
-	    INDEX_2 se(el.PNum(1), el.PNum(2));
-	    se.Sort();
-	    if (shortedges.Used (se))
-	      {
-		Element hel = el;
-		hel.PNum(1) = el.PNum(2);
-		hel.PNum(2) = el.PNum(3);
-		hel.PNum(3) = el.PNum(4);
-		hel.PNum(4) = el.PNum(1);
-		BTDefineMarkedPrism (hel, edgenumber, mp);
-	      }
-	    else
-	      {
-		BTDefineMarkedPrism (el, edgenumber, mp);
-	      }
-
-	    mp.matindex = el.GetIndex();
-	    mprisms.Append (mp);
-	    break;
-	  }
-	case PRISM:
-	case PRISM12:
-	  {
-	    MarkedPrism mp;
-	    BTDefineMarkedPrism (el, edgenumber, mp);
-	    mp.matindex = el.GetIndex();
-	    mprisms.Append (mp);
-	    break;
-	  }
-	}
-    }
-
-  for (i = 1; i <= nse; i++)
-    {
-      const Element2d & el = mesh.SurfaceElement(i);
-      if (el.GetType() == TRIG ||
-	  el.GetType() == TRIG6)
-	{
-	  MarkedTri mt;
-	  BTDefineMarkedTri (el, edgenumber, mt);
-	  mtris.Append (mt);
-	}
-      else
-	{
-	  MarkedQuad mq;
-	  BTDefineMarkedQuad (el, edgenumber, mq);
-	  mquads.Append (mq);
-	}
-    }
-
-
-
-  mesh.mlparentelement.SetSize(ne);
-  for (i = 1; i <= ne; i++)
-    mesh.mlparentelement.Elem(i) = 0;
-  mesh.mlparentsurfaceelement.SetSize(nse);
-  for (i = 1; i <= nse; i++)
-    mesh.mlparentsurfaceelement.Elem(i) = 0;
-
-
-  cout << "copied " << mtets.Size() << " tets, " << mtris.Size() << " trigs" << endl;
-}
-
-
-void Refinement :: Bisect (Mesh & mesh, 
-			   BisectionOptions & opt)
-{
-  cout << "Mesh bisection" << endl;
-
-  if (mesh.mglevels == 1)
-    BisectTetsCopyMesh(mesh, NULL, opt);
-
-  mesh.ComputeNVertices();
-  
-  int np = mesh.GetNV();
-  mesh.SetNP(np);
-
-  // int ne = mesh.GetNE();
-  // int nse = mesh.GetNSE();
-  int i, j, l;
-
-  // int initnp = np;
-  //  int maxsteps = 3;
-
-  mesh.mglevels++;
-
-  /*
-  if (opt.refinementfilename || opt.usemarkedelements)
-    maxsteps = 3;
-  */
-
-
-
-  if (opt.refine_p)
-    {
-      int ne = mesh.GetNE();
-      int nse = mesh.GetNSE();
-      int ii = 0;
-      for (ElementIndex ei = 0; ei < ne; ei++)
-        if (mesh[ei].TestRefinementFlag())
-	  mesh[ei].SetOrder (mesh[ei].GetOrder()+1);
-
-      for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-        if (mesh[sei].TestRefinementFlag())
-	  mesh[sei].SetOrder (mesh[sei].GetOrder()+1);
-
-
-      ARRAY<int,PointIndex::BASE> v_order (mesh.GetNP());
-      v_order = 0;
-
-      for (ElementIndex ei = 0; ei < ne; ei++)
-	for (j = 0; j < mesh[ei].GetNP(); j++)
-	  if (mesh[ei].GetOrder() > v_order[mesh[ei][j]])
-	    v_order[mesh[ei][j]] = mesh[ei].GetOrder();
-
-      for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-	for (j = 0; j < mesh[sei].GetNP(); j++)
-	  if (mesh[sei].GetOrder() > v_order[mesh[sei][j]])
-	    v_order[mesh[sei][j]] = mesh[sei].GetOrder();
-
-      for (ElementIndex ei = 0; ei < ne; ei++)
-	for (j = 0; j < mesh[ei].GetNP(); j++)
-	  if (mesh[ei].GetOrder() < v_order[mesh[ei][j]]-1)
-	    mesh[ei].SetOrder(v_order[mesh[ei][j]]-1);
-
-      for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-	for (j = 0; j < mesh[sei].GetNP(); j++)
-	  if (mesh[sei].GetOrder() < v_order[mesh[sei][j]]-1)
-	    mesh[sei].SetOrder(v_order[mesh[sei][j]]-1);
-
-      return;
-    }
-
-
-
-  // INDEX_2_HASHTABLE<int> cutedges(10 + 5 * (mtets.Size()+mprisms.Size()+mtris.Size()+mquads.Size()));
-  INDEX_2_CLOSED_HASHTABLE<int> cutedges(10 + 9 * (mtets.Size()+mprisms.Size()+mtris.Size()+mquads.Size()));
-
-  
-  for (l = 1; l <= 1; l++)
-    {
-      int marked = 0;
-      if (opt.refinementfilename)
-	{
-	  ifstream inf(opt.refinementfilename);
-	  cout << "load refinementinfo from file " << opt.refinementfilename << endl;
-	  char ch;
-	  for (i = 1; i <= mtets.Size(); i++)
-	    {
-	      inf >> ch;
-	      mtets.Elem(i).marked = (ch == '1');
-	    }
-	  marked = 1;
-	}
-
-      else if (opt.usemarkedelements)
-	{
-	  int cntm = 0;
-
-	  // all in one !
-	  if (mprisms.Size())
-	    {
-	      int cnttet = 0;
-	      int cntprism = 0;
-	      for (i = 1; i <= mesh.GetNE(); i++)
-		{
-		  if (mesh.VolumeElement(i).GetType() == TET ||
-		      mesh.VolumeElement(i).GetType() == TET10)
-		    {
-		      cnttet++;
-		      mtets.Elem(cnttet).marked =
-			3 * mesh.VolumeElement(i).TestRefinementFlag();
-		      if (mtets.Elem(cnttet).marked)
-			cntm++;
-		    }
-		  else
-		    {
-		      cntprism++;
-		      mprisms.Elem(cntprism).marked =
-			2 * mesh.VolumeElement(i).TestRefinementFlag();
-		      if (mprisms.Elem(cntprism).marked)
-			cntm++;
-		    }
-
-		}
-	    }
-	  else
-	    for (i = 1; i <= mtets.Size(); i++)
-	      {
-		mtets.Elem(i).marked =
-		  3 * mesh.VolumeElement(i).TestRefinementFlag();
-		if (mtets.Elem(i).marked)
-		  cntm++;
-	      }
-
-	  // (*testout) << "mtets = " << mtets << endl;
-
-	  /*
-	  for (i = 1; i <= mtris.Size(); i++)
-	    mtris.Elem(i).marked = 0;
-	  for (i = 1; i <= mquads.Size(); i++)
-	    mquads.Elem(i).marked = 0;
-	    */
-
-	  cout << "marked elements: " << cntm << endl;
-
-	  int cnttrig = 0;
-	  int cntquad = 0;
-	  for (i = 1; i <= mesh.GetNSE(); i++)
-	    {
-	      if (mesh.SurfaceElement(i).GetType() == TRIG ||
-		  mesh.SurfaceElement(i).GetType() == TRIG6)
-		{
-		  cnttrig++;
-		  mtris.Elem(cnttrig).marked =
-		    mesh.SurfaceElement(i).TestRefinementFlag() ? 2 : 0;
-		  // mtris.Elem(cnttrig).marked = 0;
-		  if (mtris.Elem(cnttrig).marked)
-		    cntm++;
-		}
-	      else
-		{
-		  cntquad++;
-		  mquads.Elem(cntquad).marked =
-		    mesh.SurfaceElement(i).TestRefinementFlag();
-		  // mquads.Elem(cntquad).marked = 0;
-		  if (mquads.Elem(cntquad).marked)
-		    cntm++;
-		}
-	    }
-
-	  cout << "with surface-elements: " << cntm << endl;
-
-	  if (mesh.GetDimension() == 2)
-	    {
-	      cntm = 0;
-	      for (i = 1; i <= mtris.Size(); i++)
-		{
-		  mtris.Elem(i).marked =
-		    2 * mesh.SurfaceElement(i).TestRefinementFlag();
-		  //		  mtris.Elem(i).marked = 2;
-		  if (mtris.Elem(i).marked)
-		    cntm++;
-		}
-
-	      if (!cntm)
-		{
-		  for (i = 1; i <= mtris.Size(); i++)
-		    {
-		      mtris.Elem(i).marked = 2;
-		      cntm++;
-		    }
-		}
-	      cout << "trigs: " << mtris.Size() << " ";
-	      cout << "marked: " << cntm << endl;
-	    }
-
-	  marked = (cntm > 0);
-	}
-      else
-	{
-	  marked = BTMarkTets (mtets, mprisms, mesh);
-	}
-
-      if (!marked) break;
-
-
-	  if (opt.refine_p)
-	    {
-	      cout << "refine p" << endl;
-
-	      for (i = 1; i <= mtets.Size(); i++)
-		mtets.Elem(i).incorder = mtets.Elem(i).marked ? 1 : 0;
-
-	      for (i = 1; i <= mtets.Size(); i++)
-		if (mtets.Elem(i).incorder)
-		  mtets.Elem(i).marked = 0;
-
-
-	      for (i = 1; i <= mprisms.Size(); i++)
-		mprisms.Elem(i).incorder = mprisms.Elem(i).marked ? 1 : 0;
-
-	      for (i = 1; i <= mprisms.Size(); i++)
-		if (mprisms.Elem(i).incorder)
-		  mprisms.Elem(i).marked = 0;
-
-
-	      for (i = 1; i <= mtris.Size(); i++)
-		mtris.Elem(i).incorder = mtris.Elem(i).marked ? 1 : 0;
-
-	      for (i = 1; i <= mtris.Size(); i++)
-		{
-		  if (mtris.Elem(i).incorder)
-		    mtris.Elem(i).marked = 0;
-		}
-	    }
-
-	  if (opt.refine_hp)
-	    {
-	      cout << "refine hp" << endl;
-	      BitArray singv(np);
-	      singv.Clear();
-
-	      if (mesh.GetDimension() == 3)
-		for (i = 1; i <= mesh.GetNSeg(); i++)
-		  {
-		    const Segment & seg = mesh.LineSegment(i);
-		    singv.Set (seg.p1);
-		    singv.Set (seg.p2);
-		  }
-	      else
-		{
-		  // vertices with 2 different bnds
-		  ARRAY<int> bndind(np);
-		  bndind = 0;
-		  for (i = 1; i <= mesh.GetNSeg(); i++)
-		    {
-		      const Segment & seg = mesh.LineSegment(i);
-		      for (int j = 0; j < 2; j++)
-			{
-			  int pi = (j == 0) ? seg.p1 : seg.p2;
-			  if (bndind.Elem(pi) == 0)
-			    bndind.Elem(pi) = seg.edgenr;
-			  else if (bndind.Elem(pi) != seg.edgenr)
-			    singv.Set (pi);
-			}
-		    }
-		}
-
-
-
-	      for (i = 1; i <= mtets.Size(); i++)
-		mtets.Elem(i).incorder = 1;
-	      for (i = 1; i <= mtets.Size(); i++)
-		{
-		  if (!mtets.Elem(i).marked)
-		    mtets.Elem(i).incorder = 0;
-		  for (j = 0; j < 4; j++)
-		    if (singv.Test (mtets.Elem(i).pnums[j]))
-		      mtets.Elem(i).incorder = 0;
-		}
-	      for (i = 1; i <= mtets.Size(); i++)
-		if (mtets.Elem(i).incorder)
-		  mtets.Elem(i).marked = 0;
-
-
-	      for (i = 1; i <= mprisms.Size(); i++)
-		mprisms.Elem(i).incorder = 1;
-	      for (i = 1; i <= mprisms.Size(); i++)
-		{
-		  if (!mprisms.Elem(i).marked)
-		    mprisms.Elem(i).incorder = 0;
-		  for (j = 0; j < 6; j++)
-		    if (singv.Test (mprisms.Elem(i).pnums[j]))
-		      mprisms.Elem(i).incorder = 0;
-		}
-	      for (i = 1; i <= mprisms.Size(); i++)
-		if (mprisms.Elem(i).incorder)
-		  mprisms.Elem(i).marked = 0;
-
-
-	      for (i = 1; i <= mtris.Size(); i++)
-		mtris.Elem(i).incorder = 1;
-	      for (i = 1; i <= mtris.Size(); i++)
-		{
-		  if (!mtris.Elem(i).marked)
-		    mtris.Elem(i).incorder = 0;
-		  for (j = 0; j < 3; j++)
-		    if (singv.Test (mtris.Elem(i).pnums[j]))
-		      mtris.Elem(i).incorder = 0;
-		}
-	      for (i = 1; i <= mtris.Size(); i++)
-		{
-		  if (mtris.Elem(i).incorder)
-		    mtris.Elem(i).marked = 0;
-		}
-	    }
-
-
-
-
-
-      int hangingvol, hangingsurf, hangingedge;
-
-      do
-	{
-	  // refine volume elements
-
-	  int nel = mtets.Size();
-	  for (i = 1; i <= nel; i++)
-	    if (mtets.Elem(i).marked)
-	      {
-		MarkedTet oldtet;
-		MarkedTet newtet1, newtet2;
-		int newp;
-
-
-		oldtet = mtets.Get(i);
-		INDEX_2 edge(oldtet.pnums[oldtet.tetedge1],
-			     oldtet.pnums[oldtet.tetedge2]);
-		edge.Sort();
-		if (cutedges.Used (edge))
-		  {
-		    newp = cutedges.Get(edge);
-		  }
-		else
-		  {
-		    Point3d np = Center (mesh.Point (edge.I1()),
-					 mesh.Point (edge.I2()));
-		    newp = mesh.AddPoint (np);
-		    cutedges.Set (edge, newp);
-		  }
-
-		BTBisectTet (oldtet, newp, newtet1, newtet2);
-		mtets.Elem(i) = newtet1;
-		mtets.Append (newtet2);
-	      }
-
-	  int npr = mprisms.Size();
-	  for (i = 1; i <= npr; i++)
-	    if (mprisms.Elem(i).marked)
-	      {
-		MarkedPrism oldprism;
-		MarkedPrism newprism1, newprism2;
-		int newp1, newp2;
-
-		oldprism = mprisms.Get(i);
-		int pi1 = 0;
-		if (pi1 == oldprism.markededge)
-		  pi1++;
-		int pi2 = 3-pi1-oldprism.markededge;
-
-		INDEX_2 edge1(oldprism.pnums[pi1],
-			      oldprism.pnums[pi2]);
-		INDEX_2 edge2(oldprism.pnums[pi1+3],
-			      oldprism.pnums[pi2+3]);
-		edge1.Sort();
-		edge2.Sort();
-
-		if (cutedges.Used (edge1))
-		  newp1 = cutedges.Get(edge1);
-		else
-		  {
-		    Point3d np = Center (mesh.Point (edge1.I1()),
-					 mesh.Point (edge1.I2()));
-		    newp1 = mesh.AddPoint (np);
-		    cutedges.Set (edge1, newp1);
-		  }
-		if (cutedges.Used (edge2))
-		  newp2 = cutedges.Get(edge2);
-		else
-		  {
-		    Point3d np = Center (mesh.Point (edge2.I1()),
-					 mesh.Point (edge2.I2()));
-		    newp2 = mesh.AddPoint (np);
-		    cutedges.Set (edge2, newp2);
-		  }
-		
-
-		BTBisectPrism (oldprism, newp1, newp2, newprism1, newprism2);
-		mprisms.Elem(i) = newprism1;
-		mprisms.Append (newprism2);
-	      }
-
-
-	  hangingvol = 
-	    MarkHangingTets (mtets, cutedges) +
-	    MarkHangingPrisms (mprisms, cutedges);
-
-
-	  int nsel = mtris.Size();
-
-	  for (i = 1; i <= nsel; i++)
-	    if (mtris.Elem(i).marked)
-	      {
-		MarkedTri oldtri;
-		MarkedTri newtri1, newtri2;
-		int newp;
-		
-		oldtri = mtris.Get(i);
-		int oldpi1 = oldtri.pnums[(oldtri.markededge+1)%3];
-		int oldpi2 = oldtri.pnums[(oldtri.markededge+2)%3];
-		INDEX_2 edge(oldpi1, oldpi2);
-		edge.Sort();
-
-		//		cerr << "edge = " << edge.I1() << "-" << edge.I2() << endl;
-
-		if (cutedges.Used (edge))
-		  {
-		    newp = cutedges.Get(edge);
-		  }
-		else
-		  {
-		    Point3d np = Center (mesh.Point (edge.I1()),
-					 mesh.Point (edge.I2()));
-		    newp = mesh.AddPoint (np);
-		    cutedges.Set (edge, newp);
-		  }
-		//		newp = cutedges.Get(edge);
-		
-		int si = mesh.GetFaceDescriptor (oldtri.surfid).SurfNr();
-		//  geom->GetSurface(si)->Project (mesh.Point(newp));
-		PointGeomInfo npgi;
-		
-		if (mesh.PointType(newp) != EDGEPOINT)
-		  PointBetween (mesh.Point (oldpi1), mesh.Point (oldpi2),
-				0.5, si,
-				oldtri.pgeominfo[(oldtri.markededge+1)%3],
-				oldtri.pgeominfo[(oldtri.markededge+2)%3],
-				mesh.Point (newp), npgi);
-		
-		BTBisectTri (oldtri, newp, npgi, newtri1, newtri2);
-		
-		
-		mtris.Elem(i) = newtri1;
-		mtris.Append (newtri2);
-		mesh.mlparentsurfaceelement.Append (i);
-	      }
-	  
-	  int nquad = mquads.Size();
-	  for (i = 1; i <= nquad; i++)
-	    if (mquads.Elem(i).marked)
-	      {
-		MarkedQuad oldquad;
-		MarkedQuad newquad1, newquad2;
-		int newp1, newp2;
-		
-		oldquad = mquads.Get(i);
-		INDEX_2 edge1(oldquad.pnums[0],
-			      oldquad.pnums[1]);
-		INDEX_2 edge2(oldquad.pnums[2],
-			      oldquad.pnums[3]);
-		edge1.Sort();
-		edge2.Sort();
-
-		if (cutedges.Used (edge1))
-		  {
-		    newp1 = cutedges.Get(edge1);
-		  }
-		else
-		  {
-		    Point3d np = Center (mesh.Point (edge1.I1()),
-					 mesh.Point (edge1.I2()));
-		    newp1 = mesh.AddPoint (np);
-		    cutedges.Set (edge1, newp1);
-		  }
-
-		if (cutedges.Used (edge2))
-		  {
-		    newp2 = cutedges.Get(edge2);
-		  }
-		else
-		  {
-		    Point3d np = Center (mesh.Point (edge2.I1()),
-					 mesh.Point (edge2.I2()));
-		    newp2 = mesh.AddPoint (np);
-		    cutedges.Set (edge2, newp2);
-		  }
-
-		PointGeomInfo npgi1, npgi2;
-		
-		int si = mesh.GetFaceDescriptor (oldquad.surfid).SurfNr();
-		//		geom->GetSurface(si)->Project (mesh.Point(newp1));
-		//		geom->GetSurface(si)->Project (mesh.Point(newp2));
-
-		(*testout) << "project point " << newp1 << " old: " << mesh.Point(newp1);
-		PointBetween (mesh.Point (edge1.I1()), mesh.Point (edge1.I2()),
-			      0.5, si,
-			      oldquad.pgeominfo[0],
-			      oldquad.pgeominfo[1],
-			      mesh.Point (newp1), npgi1);
-		(*testout) << " new: " << mesh.Point(newp1) << endl;
-
-		
-		PointBetween (mesh.Point (edge2.I1()), mesh.Point (edge2.I2()),
-			      0.5, si,
-			      oldquad.pgeominfo[2],
-			      oldquad.pgeominfo[3],
-			      mesh.Point (newp2), npgi2);
-		
-
-		BTBisectQuad (oldquad, newp1, npgi1, newp2, npgi2,
-			      newquad1, newquad2);
-		mquads.Elem(i) = newquad1;
-		mquads.Append (newquad2);
-	      }
-	  
-
-	  hangingsurf = 
-	    MarkHangingTris (mtris, cutedges) +
-	    MarkHangingQuads (mquads, cutedges);
-
-	  hangingedge = 0;
-	  
-	  int nseg = mesh.GetNSeg ();
-	  for (i = 1; i <= nseg; i++)
-	    {
-	      Segment & seg = mesh.LineSegment (i);
-	      INDEX_2 edge(seg.p1, seg.p2);
-	      edge.Sort();
-	      if (cutedges.Used (edge))
-		{
-		  hangingedge = 1;
-		  Segment nseg1 = seg;
-		  Segment nseg2 = seg;
-		  
-		  int newpi = cutedges.Get(edge);
-		  
-		  nseg1.p2 = newpi;
-		  nseg2.p1 = newpi;
-		  
-		  EdgePointGeomInfo newepgi;
-		  
-		  //		  (*testout) << "move edgepoint " << newpi << " from " << mesh.Point(newpi);
-		  PointBetween (mesh.Point (seg.p1), mesh.Point (seg.p2),
-				0.5, seg.surfnr1, seg.surfnr2, 
-				seg.epgeominfo[0], seg.epgeominfo[1],
-				mesh.Point (newpi), newepgi);
-		  //		  (*testout) << " to " << mesh.Point (newpi) << endl;
-		  nseg1.epgeominfo[1] = newepgi;
-		  nseg2.epgeominfo[0] = newepgi;
-		  
-		  mesh.LineSegment (i) = nseg1;
-		  mesh.AddSegment (nseg2);
-		}
-	    }
-
-	}
-      while (hangingvol || hangingsurf || hangingedge);
-      
-      
-      cout << mtets.Size() << " tets" << endl;
-      cout << mtris.Size() << " trigs" << endl;
-      if (mprisms.Size())
-	{
-	  cout << mprisms.Size() << " prisms" << endl;
-	  cout << mquads.Size() << " quads" << endl;
-	}
-      cout << mesh.GetNP() << " points" << endl;
-    }
-
-  /*
-  cout << "mem in mtets: " << endl;
-  mtets.PrintMemInfo(cout);
-  cout << "cutedges" << endl;
-  cutedges.PrintMemInfo(cout);
-  */
-
-  // (*testout) << "mtets = " << mtets << endl;
-
-  if (opt.refine_hp)
-    {
-      //
-      ARRAY<int> v_order (mesh.GetNP());
-      v_order = 0;
-      if (mesh.GetDimension() == 3)
-	{
-	  for (i = 1; i <= mtets.Size(); i++)
-	    if (mtets.Elem(i).incorder)
-	      mtets.Elem(i).order++;
-      
-	  for (i = 0; i < mtets.Size(); i++)
-	    for (j = 0; j < 4; j++)
-	    if (mtets[i].order > v_order.Elem(mtets[i].pnums[j]))
-	      v_order.Elem(mtets[i].pnums[j]) = mtets[i].order;
-	  for (i = 0; i < mtets.Size(); i++)
-	    for (j = 0; j < 4; j++)
-	      if (mtets[i].order < v_order.Elem(mtets[i].pnums[j])-1)
-		mtets[i].order = v_order.Elem(mtets[i].pnums[j])-1;
-	}
-      else
-	{
-	  for (i = 1; i <= mtris.Size(); i++)
-	    if (mtris.Elem(i).incorder)
-	      {
-		mtris.Elem(i).order++;
-	      }
-
-	  for (i = 0; i < mtris.Size(); i++)
-	    for (j = 0; j < 3; j++)
-	      if (mtris[i].order > v_order.Elem(mtris[i].pnums[j]))
-		v_order.Elem(mtris[i].pnums[j]) = mtris[i].order;
-	  for (i = 0; i < mtris.Size(); i++)
-	    {
-	      for (j = 0; j < 3; j++)
-		if (mtris[i].order < v_order.Elem(mtris[i].pnums[j])-1)
-		  mtris[i].order = v_order.Elem(mtris[i].pnums[j])-1;
-	    }
-	}
-    }
-  
-  mtets.SetAllocSize (mtets.Size());
-  mprisms.SetAllocSize (mprisms.Size());
-  mtris.SetAllocSize (mtris.Size());
-  mquads.SetAllocSize (mquads.Size());
-  
-  
-  mesh.ClearVolumeElements();
-  mesh.VolumeElements().SetAllocSize (mtets.Size()+mprisms.Size());
-  for (i = 1; i <= mtets.Size(); i++)
-    {
-      Element el(TET);
-      el.SetIndex (mtets.Get(i).matindex);
-      for (j = 1; j <= 4; j++)
-	el.PNum(j) = mtets.Get(i).pnums[j-1];
-      el.SetOrder (mtets.Get(i).order);
-      mesh.AddVolumeElement (el);
-    }
-  for (i = 1; i <= mprisms.Size(); i++)
-    {
-      Element el(PRISM);
-      el.SetIndex (mprisms.Get(i).matindex);
-      for (j = 1; j <= 6; j++)
-	el.PNum(j) = mprisms.Get(i).pnums[j-1];
-      el.SetOrder (mprisms.Get(i).order);
-
-      // degenerated prism ?
-      static const int map1[] = { 3, 2, 5, 6, 1 };
-      static const int map2[] = { 1, 3, 6, 4, 2 };
-      static const int map3[] = { 2, 1, 4, 5, 3 };
-      
-
-      const int * map = NULL;
-      int deg1 = 0, deg2 = 0, deg3 = 0;
-      // int deg = 0;
-      if (el.PNum(1) == el.PNum(4)) { map = map1; deg1 = 1; }
-      if (el.PNum(2) == el.PNum(5)) { map = map2; deg2 = 1; }
-      if (el.PNum(3) == el.PNum(6)) { map = map3; deg3 = 1; }
-	  
-      switch (deg1+deg2+deg3)
-	{
-	case 1:
-	  {
-	    for (j = 1; j <= 5; j++)
-	      el.PNum(j) = mprisms.Get(i).pnums[map[j-1]-1];
-	    
-	    el.SetType (PYRAMID);
-	    break;
-	  }
-	case 2:
-	  {
-	    static const int tetmap1[] = { 1, 2, 3, 4 };
-	    static const int tetmap2[] = { 2, 3, 1, 5 };
-	    static const int tetmap3[] = { 3, 1, 2, 6 };
-	    if (!deg1) map = tetmap1;
-	    if (!deg2) map = tetmap2;
-	    if (!deg3) map = tetmap3; 
-	    for (j = 1; j <= 4; j++)
-	      el.PNum(j) = mprisms.Get(i).pnums[map[j-1]-1];
-	    /*
-	    if (!deg1) el.PNum(4) = el.PNum(4);
-	    if (!deg2) el.PNum(4) = el.PNum(5);
-	    if (!deg3) el.PNum(4) = el.PNum(6);
-	    */
-	    el.SetType(TET);
-	    break;
-	  }
-	default:
-	  ;
-	}
-      mesh.AddVolumeElement (el);
-    }
-  
-  mesh.ClearSurfaceElements();
-  for (i = 1; i <= mtris.Size(); i++)
-    {
-      Element2d el(TRIG);
-      el.SetIndex (mtris.Get(i).surfid);
-      el.SetOrder (mtris.Get(i).order);
-      for (j = 1; j <= 3; j++)
-	{
-	  el.PNum(j) = mtris.Get(i).pnums[j-1];
-	  el.GeomInfoPi(j) = mtris.Get(i).pgeominfo[j-1];
-	}
-      mesh.AddSurfaceElement (el);
-    }
-  for (i = 1; i <= mquads.Size(); i++)
-    {
-      Element2d el(QUAD);
-      el.SetIndex (mquads.Get(i).surfid);
-      for (j = 1; j <= 4; j++)
-	el.PNum(j) = mquads.Get(i).pnums[j-1];
-      Swap (el.PNum(3), el.PNum(4));
-      mesh.AddSurfaceElement (el);
-    }
-
-
-      
-  // write multilevel hierarchy to mesh:
-  np = mesh.GetNP();
-  mesh.mlbetweennodes.SetSize(np);
-  if (mesh.mglevels <= 2)
-    for (i = 1; i <= np; i++)
-      {
-	mesh.mlbetweennodes.Elem(i).I1() = 0;
-	mesh.mlbetweennodes.Elem(i).I2() = 0;
-      }
-
-  /*
-  for (i = 1; i <= cutedges.GetNBags(); i++)
-    for (j = 1; j <= cutedges.GetBagSize(i); j++)
-      {
-	INDEX_2 edge;
-	int newpi;
-	cutedges.GetData (i, j, edge, newpi);
-	mesh.mlbetweennodes.Elem(newpi) = edge;
-      }
-  */
-  for (i = 1; i <= cutedges.Size(); i++)
-    if (cutedges.UsedPos(i))
-      {
-	INDEX_2 edge;
-	int newpi;
-	cutedges.GetData (i, edge, newpi);
-	mesh.mlbetweennodes.Elem(newpi) = edge;
-      }
-
-
-  /*
-  mesh.PrintMemInfo (cout);
-  cout << "tets ";
-  mtets.PrintMemInfo (cout);
-  cout << "prims ";
-  mprisms.PrintMemInfo (cout);
-  cout << "tris ";
-  mtris.PrintMemInfo (cout);
-  cout << "quads ";
-  mquads.PrintMemInfo (cout);
-  cout << "cutedges ";
-  cutedges.PrintMemInfo (cout);
-  */
-
-
-  /*
-
-  // find connected nodes (close nodes)
-  TABLE<int> conto(np);
-  for (i = 1; i <= mprisms.Size(); i++)
-    for (j = 1; j <= 6; j++)
-      {
-	int n1 = mprisms.Get(i).pnums[j-1];
-	int n2 = mprisms.Get(i).pnums[(j+2)%6];
-	//	    if (n1 != n2)
-	{
-	  int found = 0;
-	  for (k = 1; k <= conto.EntrySize(n1); k++)
-	    if (conto.Get(n1, k) == n2)
-	      {
-		found = 1;
-		break;
-	      }
-	  if (!found)
-	    conto.Add (n1, n2);
-	}
-      }
-  mesh.connectedtonode.SetSize(np);
-  for (i = 1; i <= np; i++)
-    mesh.connectedtonode.Elem(i) = 0;
-  
-
-//       (*testout) << "connection table: " << endl;
-//       for (i = 1; i <= np; i++)
-//       {
-//       (*testout) << "node " << i << ": ";
-// 	  for (j = 1; j <= conto.EntrySize(i); j++)
-// 	  (*testout) << conto.Get(i, j) << " ";
-// 	  (*testout) << endl;
-// 	}
-
-  
-  for (i = 1; i <= np; i++)
-    if (mesh.connectedtonode.Elem(i) == 0)
-      {
-	mesh.connectedtonode.Elem(i) = i;
-	ConnectToNodeRec (i, i, conto, mesh.connectedtonode);
-      }
-*/  
-
-  //  mesh.BuildConnectedNodes();
-
-  mesh.ComputeNVertices();
-  mesh.UpdateTopology();
-
-  // update identification tables
-  for (i = 1; i <= mesh.GetIdentifications().GetMaxNr(); i++)
-    {
-      ARRAY<int,PointIndex::BASE> identmap;
-      mesh.GetIdentifications().GetMap (i, identmap);
-
-
-      /*
-      for (j = 1; j <= cutedges.GetNBags(); j++)
-	for (k = 1; k <= cutedges.GetBagSize(j); k++)
-	  {
-	    INDEX_2 i2;
-	    int newpi;
-	    cutedges.GetData (j, k, i2, newpi);
-	    INDEX_2 oi2(identmap.Get(i2.I1()),
-			identmap.Get(i2.I2()));
-	    oi2.Sort();
-	    if (cutedges.Used (oi2))
-	      {
-		int onewpi = cutedges.Get(oi2);
-		mesh.GetIdentifications().Add (newpi, onewpi, i);
-	      }
-	  }
-      */
-
-      for (j = 1; j <= cutedges.Size(); j++)
-	if (cutedges.UsedPos(j))
-	  {
-	    INDEX_2 i2;
-	    int newpi;
-	    cutedges.GetData (j, i2, newpi);
-	    INDEX_2 oi2(identmap.Get(i2.I1()),
-			identmap.Get(i2.I2()));
-	    oi2.Sort();
-	    if (cutedges.Used (oi2))
-	      {
-		int onewpi = cutedges.Get(oi2);
-		mesh.GetIdentifications().Add (newpi, onewpi, i);
-	      }
-	  }
-
-    }
-  PrintMessage (5, "Bisection done");
-}
-
-
-
-
-BisectionOptions :: BisectionOptions ()
-{
-  outfilename = NULL;
-  mlfilename = NULL;
-  refinementfilename = NULL;
-  femcode = NULL;
-  maxlevel = 50;
-  usemarkedelements = 0;
-  refine_hp = 0;
-  refine_p = 0;
-}
-
-
-
-void Refinement :: PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-				 int surfi, 
-				 const PointGeomInfo & gi1, 
-				 const PointGeomInfo & gi2,
-				 Point3d & newp, PointGeomInfo & newgi)
-{
-  newp = p1+secpoint*(p2-p1);
-}
-
-void Refinement :: PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-				 int surfi1, int surfi2, 
-				 const EdgePointGeomInfo & ap1, 
-				 const EdgePointGeomInfo & ap2,
-				 Point3d & newp, EdgePointGeomInfo & newgi)
-{
-  newp = p1+secpoint*(p2-p1);
-}
-
-void Refinement :: ProjectToSurface (Point<3> & p, int surfi)
-{
-  cout << "Refinement :: ProjectToSurface    ERROR: no geometry set" << endl;
-}
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/bisect.hpp b/contrib/Netgen/libsrc/meshing/bisect.hpp
deleted file mode 100644
index 8a1e8361163d581913c24066442a3c3e600360ae..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/bisect.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef BISECT
-#define BISECT
-
-class BisectionOptions
-{
-public:
-  const char * outfilename;
-  const char * mlfilename;
-  const char * refinementfilename;
-  const char * femcode;
-  int maxlevel;
-  int usemarkedelements;
-  bool refine_hp;
-  bool refine_p;
-  BisectionOptions ();
-};
-
-class ZRefinementOptions
-{
-public:
-  int minref;
-  ZRefinementOptions();
-};
-
-
-/*
-extern void BisectTets (Mesh &, const CSGeometry *,
-			BisectionOptions & opt);
-*/
-
-extern void BisectTetsCopyMesh (Mesh &, const class CSGeometry *,
-				BisectionOptions & opt);
-
-extern void ZRefinement (Mesh &, const CSGeometry *,
-			 ZRefinementOptions & opt);
-
-
-
-
-
-class Refinement
-{
-public:
-  Refinement ();
-  virtual ~Refinement ();
-  
-  void Refine (Mesh & mesh);
-  void Bisect (Mesh & mesh, class BisectionOptions & opt);
-  void MakeSecondOrder (Mesh & mesh);
-
-  virtual void PointBetween (const Point3d & p1, const Point3d & p2, double secpoint, 
-			     int surfi, 
-			     const PointGeomInfo & gi1, 
-			     const PointGeomInfo & gi2,
-			     Point3d & newp, PointGeomInfo & newgi);
-
-  virtual void PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-			     int surfi1, int surfi2, 
-			     const EdgePointGeomInfo & ap1, 
-			     const EdgePointGeomInfo & ap2,
-			     Point3d & newp, EdgePointGeomInfo & newgi);
-
-  virtual void ProjectToSurface (Point<3> & p, int surfi);
-
-  virtual void ProjectToSurface (Point<3> & p, int surfi, PointGeomInfo & /* gi */)
-  {
-    ProjectToSurface (p, surfi);
-  }
-
-
-  void ValidateSecondOrder (Mesh & mesh);
-  void ValidateRefinedMesh (Mesh & mesh, 
-			    ARRAY<INDEX_2> & parents);
-
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/boundarylayer.cpp b/contrib/Netgen/libsrc/meshing/boundarylayer.cpp
deleted file mode 100644
index 6f564586b6b528861aeed1b375aa08bdb2b388c1..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/boundarylayer.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-void InsertVirtualBoundaryLayer (Mesh & mesh)
-{
-  cout << "Insert virt. b.l." << endl;
-  
-  int surfid;
-
-  cout << "Boundary Nr:";
-  cin >> surfid;
-
-  int i, j;
-  int np = mesh.GetNP();
-
-  cout << "Old NP: " << mesh.GetNP() << endl;
-  cout << "Trigs: " << mesh.GetNSE() << endl;
-
-  BitArray bndnodes(np);
-  ARRAY<int> mapto(np);
-
-  bndnodes.Clear();
-  for (i = 1; i <= mesh.GetNSeg(); i++)
-    {
-      int snr = mesh.LineSegment(i).edgenr;
-      cout << "snr = " << snr << endl;
-      if (snr == surfid)
-	{
-	  bndnodes.Set (mesh.LineSegment(i).p1);
-	  bndnodes.Set (mesh.LineSegment(i).p2);
-	}
-    }
-  for (i = 1; i <= mesh.GetNSeg(); i++)
-    {
-      int snr = mesh.LineSegment(i).edgenr;
-      if (snr != surfid)
-	{
-	  bndnodes.Clear (mesh.LineSegment(i).p1);
-	  bndnodes.Clear (mesh.LineSegment(i).p2);
-	}
-    }
-  
-  for (i = 1; i <= np; i++)
-    {
-      if (bndnodes.Test(i))
-	mapto.Elem(i) = mesh.AddPoint (mesh.Point (i));
-      else
-	mapto.Elem(i) = 0;
-    }
-
-  for (i = 1; i <= mesh.GetNSE(); i++)
-    {
-      Element2d & el = mesh.SurfaceElement(i);
-      for (j = 1; j <= el.GetNP(); j++)
-	if (mapto.Get(el.PNum(j)))
-	  el.PNum(j) = mapto.Get(el.PNum(j));
-    }
-
-
-  int nq = 0;
-  for (i = 1; i <= mesh.GetNSeg(); i++)
-    {
-      int snr = mesh.LineSegment(i).edgenr;
-      if (snr == surfid)
-	{
-	  int p1 = mesh.LineSegment(i).p1;
-	  int p2 = mesh.LineSegment(i).p2;
-	  int p3 = mapto.Get (p1);
-	  if (!p3) p3 = p1;
-	  int p4 = mapto.Get (p2);
-	  if (!p4) p4 = p2;
-	  
-	  Element2d el(4);
-	  el.PNum(1) = p1;
-	  el.PNum(2) = p2;
-	  el.PNum(3) = p3;
-	  el.PNum(4) = p4;
-	  el.SetIndex (2);
-	  mesh.AddSurfaceElement (el);
-	  nq++;
-	}
-    }
-
-  cout << "New NP: " << mesh.GetNP() << endl;
-  cout << "Quads: " << nq << endl;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/boundarylayer.hpp b/contrib/Netgen/libsrc/meshing/boundarylayer.hpp
deleted file mode 100644
index e5a047b6bb0239c3ebd3e7a839a4ee830bef2183..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/boundarylayer.hpp
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef FILE_BOUNDARYLAYER
-#define FILE_BOUNDARYLAYER
-
-
-///
-extern void InsertVirtualBoundaryLayer (Mesh & mesh);
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/clusters.cpp b/contrib/Netgen/libsrc/meshing/clusters.cpp
deleted file mode 100644
index 5eef2078e732dc6c3f8065f1915bdaa7701445cf..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/clusters.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-AnisotropicClusters ::  AnisotropicClusters (const Mesh & amesh)
-  : mesh(amesh)
-{
-  ;
-}
-
-AnisotropicClusters ::  ~AnisotropicClusters ()
-{
-  ;
-}
-
-void AnisotropicClusters ::  Update()
-{
-  int i, j, k;
-
-  const MeshTopology & top = mesh.GetTopology();
-  if (!top.HasEdges())
-    return;
-
-  PrintMessage (3, "Update Clusters");
-
-  nv = mesh.GetNV();
-  ned = top.GetNEdges();
-  nfa = top.GetNFaces();
-  ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-
-  cluster_reps.SetSize (nv+ned+nfa+ne);
-  
-  ARRAY<int> nnums, ednums, fanums;
-  int changed;
-
-  for (i = 1; i <= cluster_reps.Size(); i++)
-    cluster_reps.Elem(i) = i;
-
-  for (i = 1; i <= cluster_reps.Size(); i++)
-    cluster_reps.Elem(i) = -1;
-
-  for (i = 1; i <= ne; i++)
-    {
-      const Element & el = mesh.VolumeElement(i);
-      ELEMENT_TYPE typ = el.GetType();
-      
-      top.GetElementEdges (i, ednums);
-      top.GetElementFaces (i, fanums);
-      
-      int elnv = top.GetNVertices (typ);
-      int elned = ednums.Size();
-      int elnfa = fanums.Size();
-	  
-      nnums.SetSize(elnv+elned+elnfa+1);
-      for (j = 1; j <= elnv; j++)
-	nnums.Elem(j) = el.PNum(j);
-      for (j = 1; j <= elned; j++)
-	nnums.Elem(elnv+j) = nv+ednums.Elem(j);
-      for (j = 1; j <= elnfa; j++)
-	nnums.Elem(elnv+elned+j) = nv+ned+fanums.Elem(j);
-      nnums.Elem(elnv+elned+elnfa+1) = nv+ned+nfa+i;
-
-      for (j = 0; j < nnums.Size(); j++)
-	cluster_reps.Elem(nnums[j]) = nnums[j];
-    }
-
-
-  for (i = 1; i <= nse; i++)
-    {
-      const Element2d & el = mesh.SurfaceElement(i);
-      ELEMENT_TYPE typ = el.GetType();
-      
-      top.GetSurfaceElementEdges (i, ednums);
-      int fanum = top.GetSurfaceElementFace (i);
-      
-      int elnv = top.GetNVertices (typ);
-      int elned = ednums.Size();
-	  
-      nnums.SetSize(elnv+elned+1);
-      for (j = 1; j <= elnv; j++)
-	nnums.Elem(j) = el.PNum(j);
-      for (j = 1; j <= elned; j++)
-	nnums.Elem(elnv+j) = nv+ednums.Elem(j);
-      nnums.Elem(elnv+elned+1) = fanum;
-
-      for (j = 0; j < nnums.Size(); j++)
-	cluster_reps.Elem(nnums[j]) = nnums[j];
-    }
-
-  static const int hex_cluster[] =
-    { 
-      1, 2, 3, 4, 1, 2, 3, 4, 
-      5, 6, 7, 8, 5, 6, 7, 8, 1, 2, 3, 4, 
-      9, 9, 5, 8, 6, 7, 
-      9
-    };
-
-  static const int prism_cluster[] =
-    { 
-      1, 2, 3, 1, 2, 3,
-      4, 5, 6, 4, 5, 6, 3, 1, 2,
-      7, 7, 4, 5, 6, 
-      7
-    };
-  static const int pyramid_cluster[] =
-    { 
-      1, 2, 2, 1, 3,
-      4, 2, 1, 4, 6, 5, 5, 6,
-      7, 5, 7, 6, 4, 
-      7
-    };
-  static const int tet_cluster14[] =
-    { 1, 2, 3, 1,   1, 4, 5, 4, 5, 6,   7, 5, 4, 7, 7 };
-  
-  static const int tet_cluster12[] =
-    { 1, 1, 2, 3,   4, 4, 5, 1, 6, 6,   7, 7, 4, 6, 7 };
-
-  static const int tet_cluster13[] =
-    { 1, 2, 1, 3,   4, 6, 4, 5, 1, 5,   7, 4, 7, 5, 7 };
-
-  static const int tet_cluster23[] =
-    { 2, 1, 1, 3, 6, 5, 5, 4, 4, 1, 5, 7, 7, 4, 7 };
-
-  static const int tet_cluster24[] =
-    { 2, 1, 3, 1, 4, 1, 5, 4, 6, 5, 5, 7, 4, 7, 7 };
-
-  static const int tet_cluster34[] =
-    { 2, 3, 1, 1, 4, 5, 1, 6, 4, 5, 5, 4, 7, 7, 7 };
-
-  int cnt = 0;
-  do
-    {
-      cnt++;
-      changed = 0;
-      
-      for (i = 1; i <= ne; i++)
-	{
-	  const Element & el = mesh.VolumeElement(i);
-	  ELEMENT_TYPE typ = el.GetType();
-	  
-	  top.GetElementEdges (i, ednums);
-	  top.GetElementFaces (i, fanums);
-	  
-	  int elnv = top.GetNVertices (typ);
-	  int elned = ednums.Size();
-	  int elnfa = fanums.Size();
-	  
-	  nnums.SetSize(elnv+elned+elnfa+1);
-	  for (j = 1; j <= elnv; j++)
-	    nnums.Elem(j) = el.PNum(j);
-	  for (j = 1; j <= elned; j++)
-	    nnums.Elem(elnv+j) = nv+ednums.Elem(j);
-	  for (j = 1; j <= elnfa; j++)
-	    nnums.Elem(elnv+elned+j) = nv+ned+fanums.Elem(j);
-	  nnums.Elem(elnv+elned+elnfa+1) = nv+ned+nfa+i;
-
-	  
-	  const int * clustertab = NULL;
-	  switch (typ)
-	    {
-	    case PRISM:
-	    case PRISM12:
-	      clustertab = prism_cluster;
-	      break;
-	    case HEX: 
-	      clustertab = hex_cluster; 
-	      break; 
-	    case PYRAMID:
-	      clustertab = pyramid_cluster;
-	      break;
-	    case TET:
-	    case TET10:
-	      if (cluster_reps.Get(el.PNum(1)) == 
-		  cluster_reps.Get(el.PNum(2)))
-		clustertab = tet_cluster12;
-	      else if (cluster_reps.Get(el.PNum(1)) == 
-		       cluster_reps.Get(el.PNum(3)))
-		clustertab = tet_cluster13;
-	      else if (cluster_reps.Get(el.PNum(1)) == 
-		       cluster_reps.Get(el.PNum(4)))
-		clustertab = tet_cluster14;
-	      else if (cluster_reps.Get(el.PNum(2)) == 
-		       cluster_reps.Get(el.PNum(3)))
-		clustertab = tet_cluster23;
-	      else if (cluster_reps.Get(el.PNum(2)) == 
-		       cluster_reps.Get(el.PNum(4)))
-		clustertab = tet_cluster24;
-	      else if (cluster_reps.Get(el.PNum(3)) == 
-		       cluster_reps.Get(el.PNum(4)))
-		clustertab = tet_cluster34;
-	      else
-		clustertab = NULL;
-	      break;
-	    default:
-	      clustertab = NULL;
-	    }
-	  
-	  if (clustertab)
-	    for (j = 0; j < nnums.Size(); j++)
-	      for (k = 0; k < j; k++)
-		if (clustertab[j] == clustertab[k])
-		  {
-		    int jj = nnums[j];
-		    int kk = nnums[k];
-		    if (cluster_reps.Get(jj) < cluster_reps.Get(kk))
-		      {
-			cluster_reps.Elem(kk) = cluster_reps.Get(jj);
-			changed = 1;
-		      }
-		    else if (cluster_reps.Get(kk) < cluster_reps.Get(jj))
-		      {
-			cluster_reps.Elem(jj) = cluster_reps.Get(kk);
-			changed = 1;
-		      }
-		  }
-
-	  /*
-	  if (clustertab)
-	    {
-	      if (typ == PYRAMID)
-		(*testout) << "pyramid";
-	      else if (typ == PRISM || typ == PRISM12)
-		(*testout) << "prism";
-	      else if (typ == TET || typ == TET10)
-		(*testout) << "tet";
-	      else
-		(*testout) << "unknown type" << endl;
-		
-	      (*testout) << ", nnums  = ";
-	      for (j = 0; j < nnums.Size(); j++)
-		(*testout) << "node " << j << " = " << nnums[j] << ", rep = "
-			   << cluster_reps.Get(nnums[j]) << endl;
-	    }
-	  */
-	}
-    }
-  while (changed);
-
-  /*
-    (*testout) << "cluster reps:" << endl;
-    for (i = 1; i <= cluster_reps.Size(); i++)
-    {
-    (*testout) << i << ": ";
-    if (i <= nv)
-    (*testout) << "v" << i << " ";
-    else if (i <= nv+ned)
-    (*testout) << "e" << i-nv << " ";
-    else if (i <= nv+ned+nfa)
-    (*testout) << "f" << i-nv-ned << " ";
-    else
-    (*testout) << "c" << i-nv-ned-nfa << " ";
-    (*testout) << cluster_reps.Get(i) << endl;
-    }
-  */
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/clusters.hpp b/contrib/Netgen/libsrc/meshing/clusters.hpp
deleted file mode 100644
index b0eea1b5e02b06a43fe4f9332029fe20574dea7e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/clusters.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef CLUSTERS
-#define CLUSTERS
-
-/**************************************************************************/
-/* File:   clusers.hh                                                     */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   28. Apr. 01                                                    */
-/**************************************************************************/
-
-/*
-  Anisotropic clusters
-
-  nodes, edges, faces, elements
-*/
-
-
-class AnisotropicClusters
-{
-  const Mesh & mesh;
-
-  int nv, ned, nfa, ne;
-
-  // connected nodes, nodes = vertices, edges, faces, elements
-  ARRAY<int> cluster_reps;
-
-public:
-  AnisotropicClusters (const Mesh & amesh);
-  ~AnisotropicClusters();
-
-  void Update();
-
-  int GetVertexRepresentant (int vnr) const
-  { return cluster_reps.Get(vnr); }
-  int GetEdgeRepresentant (int ednr) const
-  { return cluster_reps.Get(nv+ednr); }
-  int GetFaceRepresentant (int fnr) const
-  { return cluster_reps.Get(nv+ned+fnr); }
-  int GetElementRepresentant (int enr) const
-  { return cluster_reps.Get(nv+ned+nfa+enr); }
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/curvedelems.cpp b/contrib/Netgen/libsrc/meshing/curvedelems.cpp
deleted file mode 100644
index 50fea32f555ebe69320c6710c49f0be0737df2c7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/curvedelems.cpp
+++ /dev/null
@@ -1,2037 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-
-namespace netgen
-{
-    
-    
-    // computes Gaussean integration formula on (0,1) with n points
-    // in: Numerical algs in C (or, was it the Fortran book ?)
-    void ComputeGaussRule (int n, ARRAY<double> & xi, ARRAY<double> & wi)
-    {
-	xi.SetSize (n);
-	wi.SetSize (n);
-	
-	int m = (n+1)/2;
-	double p1, p2, p3;
-	double pp, z, z1;
-	for (int i = 1; i <= m; i++)
-	{
-	    z = cos ( M_PI * (i - 0.25) / (n + 0.5));
-	    while(1)
-	    {
-		p1 = 1; p2 = 0;
-		for (int j = 1; j <= n; j++)
-		{
-		    p3 = p2; p2 = p1;
-		    p1 = ((2 * j - 1) * z * p2 - (j - 1) * p3) / j;
-		}
-		// p1 is legendre polynomial
-
-		pp = n * (z*p1-p2) / (z*z - 1);
-		z1 = z;
-		z = z1-p1/pp;
-
-		if (fabs (z - z1) < 1e-14) break;
-	    }
-
-	    xi[i-1] = 0.5 * (1 - z);
-	    xi[n-i] = 0.5 * (1 + z);
-	    wi[i-1] = wi[n-i] = 1.0 / ( (1  - z * z) * pp * pp);
-	}
-    }
-
-
-
-// ----------------------------------------------------------------------------
-//      PolynomialBasis
-// ----------------------------------------------------------------------------
-
-
-    void PolynomialBasis :: CalcLegendrePolynomials (double x)
-    {
-	double p1 = 1.0, p2 = 0.0, p3;
-
-	lp[0] = 1.0;
-
-	for (int j=1; j<=order; j++)
-	{
-	    p3=p2; p2=p1;
-	    p1=((2.0*j-1.0)*(2*x-1)*p2-(j-1.0)*p3)/j;
-	    lp[j] = p1;
-	}
-    }
-
-
-    void PolynomialBasis :: CalcDLegendrePolynomials (double x)
-    {
-	double p1 = 0., p2 = 0., p3;
-
-	dlp[0] = 0.;
-
-	for (int j = 1; j <= order-1; j++)
-	{
-	    p3=p2; p2=p1;
-	    p1=((2.*j-1.)*(2*lp[j-1]+(2*x-1)*p2)-(j-1.)*p3)/j;
-	    dlp[j] = p1;
-	}
-    }
-
-
-    void PolynomialBasis :: CalcF (double x)
-    {
-	CalcLegendrePolynomials (x);
-
-	for (int j = 0; j<=order-2; j++)
-	    f[j] = (lp[j+2]-lp[j])/(2.0*(j+1)+1)/2.0;
-    }
-
-
-    void PolynomialBasis :: CalcDf (double x)
-    {
-	CalcLegendrePolynomials (x);
-
-	for (int j = 0; j <= order-2; j++)
-	    df[j] = lp[j+1];
-    }
-
-
-    void PolynomialBasis :: CalcFDf (double x)
-    {
-	CalcLegendrePolynomials (x);
-
-	for (int j = 0; j<=order-2; j++)
-	{
-	    f[j] = (lp[j+2]-lp[j])/(2.0*(j+1)+1)/2.0;
-	    df[j] = lp[j+1];
-	}
-    }
-
-
-    void PolynomialBasis :: CalcDDf (double x)
-    {
-        CalcLegendrePolynomials (x);
-	CalcDLegendrePolynomials (x);
-
-	for (int j = 0; j <= order-2; j++) ddf[j] = dlp[j+1];
-    }
-
-
-
-// ----------------------------------------------------------------------------
-//      BaseFiniteElement1D
-// ----------------------------------------------------------------------------
-
-
-    void BaseFiniteElement1D :: CalcVertexShapes ()
-    {
-	vshape[0] = xi(0);
-	vshape[1] = 1-xi(0);
-
-	vdshape[0] = 1;
-	vdshape[1] = -1;
-
-	/*
-	if (edgeorient == -1)
-	{
-	    Swap (vshape[0], vshape[1]);
-	    Swap (vdshape[0], vdshape[1]);
-	}
-	*/
-	
-    }
-
-
-    void BaseFiniteElement1D :: CalcEdgeShapes ()
-    {
-	b.SetOrder (edgeorder);
-	if (edgeorient == 1)
-	  b.CalcFDf( 1-xi(0) );
-	else
-	  b.CalcFDf( xi(0) );
-
-	for (int k = 2; k <= edgeorder; k++)
-	{
-	    eshape[k-2] = b.GetF(k);
-	    edshape[k-2] = -b.GetDf(k);
-	}
-    }
-
-
-    void BaseFiniteElement1D :: CalcEdgeLaplaceShapes ()
-    {
-        b.SetOrder (edgeorder);
-	if (edgeorient == 1)
-	  b.CalcDDf( 1-xi(0) );
-	else
-	  b.CalcDDf( xi(0) );
-
-	for (int k = 2; k <= edgeorder; k++)
-	    eddshape[k-2] = b.GetDDf(k);
- }
-
-
-
-
-// ----------------------------------------------------------------------------
-//      BaseFiniteElement2D
-// ----------------------------------------------------------------------------
-
-
-    void BaseFiniteElement2D :: SetElementNumber (int aelnr)
-    {
-	int locmaxedgeorder = -1;
-	
-	BaseFiniteElement<2> :: SetElementNumber (aelnr);
-	const Element2d & elem = mesh[(SurfaceElementIndex) (elnr-1)]; 
-	top.GetSurfaceElementEdges (elnr, &(edgenr[0]), &(edgeorient[0]));
-	facenr = top.GetSurfaceElementFace (elnr);
-	faceorient = top.GetSurfaceElementFaceOrientation (elnr);
-	
-	for (int v = 0; v < nvertices; v++)
-	    vertexnr[v] = elem[v];
-	
-	for (int e = 0; e < nedges; e++)
-	{
-	    edgeorder[e] = curv.GetEdgeOrder (edgenr[e]-1); // 1-based
-	    locmaxedgeorder = max2 (edgeorder[e], locmaxedgeorder);
-	}
-	
-	faceorder = curv.GetFaceOrder (facenr-1); // 1-based
-	CalcNFaceShapes ();
-	
-	if (locmaxedgeorder > maxedgeorder)
-	{
-	    maxedgeorder = locmaxedgeorder;
-	    eshape.SetSize(nedges * (maxedgeorder-1));
-	    edshape.SetSize(nedges * (maxedgeorder-1));
-	}
-	
-	if (faceorder > maxfaceorder)
-	{
-	    maxfaceorder = faceorder;
-	    fshape.SetSize( nfaceshapes ); // number of face shape functions
-	    fdshape.SetSize( nfaceshapes );
-	    fddshape.SetSize ( nfaceshapes );
-	}
-    }
-    
-
-
-
-// ----------------------------------------------------------------------------
-//      BaseFiniteElement3D
-// ----------------------------------------------------------------------------
-
-
-    void BaseFiniteElement3D :: SetElementNumber (int aelnr)
-    {
-	int locmaxedgeorder = -1;
-	int locmaxfaceorder = -1;
-	int v, f, e;
-
-	BaseFiniteElement<3> :: SetElementNumber (aelnr);
-	Element elem = mesh[(ElementIndex) (elnr-1)];
-	top.GetElementEdges (elnr, &(edgenr[0]), &(edgeorient[0]));
-	top.GetElementFaces (elnr, &(facenr[0]), &(faceorient[0]));
-	
-	for (v = 0; v < nvertices; v++)
-	    vertexnr[v] = elem[v];
-	
-	for (f = 0; f < nfaces; f++)
-	{
-	    surfacenr[f] = top.GetFace2SurfaceElement (facenr[f]);
-	    // surfaceorient[f] = top.GetSurfaceElementFaceOrientation (surfacenr[f]);
-	}
-	
-	for (e = 0; e < nedges; e++)
-	{
-	    edgeorder[e] = curv.GetEdgeOrder (edgenr[e]-1); // 1-based
-	    locmaxedgeorder = max (edgeorder[e], locmaxedgeorder);
-	}
-	
-	for (f = 0; f < nfaces; f++)
-	{
-	    faceorder[f] = curv.GetFaceOrder (facenr[f]-1); // 1-based
-	    locmaxfaceorder = max (faceorder[f], locmaxfaceorder);
-	}
-	
-	CalcNFaceShapes ();
-	
-	if (locmaxedgeorder > maxedgeorder)
-	{
-	    maxedgeorder = locmaxedgeorder;
-	    eshape.SetSize(nedges * (maxedgeorder-1));
-	    edshape.SetSize(nedges * (maxedgeorder-1));
-	}
-	
-	if (locmaxfaceorder > maxfaceorder)
-	{
-	    maxfaceorder = locmaxfaceorder;
-	    fshape.SetSize( nfaces * (maxfaceorder-1) * (maxfaceorder-1)); // number of face shape functions
-	    fdshape.SetSize( nfaces * (maxfaceorder-1) * (maxfaceorder-1));
-	}
-    }
-    
-    
-
-
-// ----------------------------------------------------------------------------
-//      FETrig
-// ----------------------------------------------------------------------------
-
-
-    void FETrig :: SetReferencePoint (Point<2> axi)
-    {
-	BaseFiniteElement2D :: SetReferencePoint (axi);
-	lambda(0) = xi(0);
-	lambda(1) = xi(1);
-	lambda(2) = 1-xi(0)-xi(1);
-
-	dlambda(0,0) =  1; dlambda(0,1) =  0;
-	dlambda(1,0) =  0; dlambda(1,1) =  1;
-	dlambda(2,0) = -1; dlambda(2,1) = -1;
-    }
-
-
-    void FETrig :: SetVertexSingularity (int v, int exponent)
-    {
-      int i;
-	if (1-lambda(v) < EPSILON) return;
-
-	Point<3> lamold = lambda;
-
-	Vec<2> dfac;
-
-	double fac = pow(1-lambda(v),exponent-1);
-
-	for (i = 0; i < 2; i++)
-	{
-	    dfac(i) = -(exponent-1)*pow(1-lambda(v),exponent-2)*dlambda(v,i);
-	    dlambda(v,i) *= exponent * pow(1-lambda(v),exponent-1);
-	}
-
-	lambda(v) = 1-pow(1-lambda(v),exponent);
-
-	for (i = 0; i < nvertices; i++)
-	{
-	    if (i == v) continue;
-	    for (int j = 0; j < 2; j++)
-		dlambda(i,j) = dlambda(i,j) * fac + lamold(i) * dfac(j);
-
-	    lambda(i) *= fac;
-	}
-    }
-
-
-
-    void FETrig :: CalcVertexShapes ()
-    {
-	for (int v = 0; v < nvertices; v++)
-	{
-	    vshape[v] = lambda(v);
-	    vdshape[v](0) = dlambda(v,0);
-	    vdshape[v](1) = dlambda(v,1);
-	}
-    }
-
-
-    void FETrig :: CalcEdgeShapes ()
-    {
-	int index = 0;
-	for (int e = 0; e < nedges; e++)
-	{
-	  if (edgeorder[e] <= 1) continue;
-
-	    int i0 = eledge[e][0]-1;
-	    int i1 = eledge[e][1]-1;
-
-	    double arg = lambda(i0) + lambda(i1); // = 1-lambda[i2];
-
-	    if (fabs(arg) < EPSILON) // division by 0
-	    {
-		for (int k = 2; k <= edgeorder[e]; k++)
-		{
-		    eshape[index] = 0;
-		    edshape[index] = Vec<2>(0,0);
-		    index++;
-		}
-		continue;
-	    }
-
-	    if (edgeorient[e] == -1) Swap (i0, i1); // reverse orientation
-
-	    double xi = lambda(i1)/arg;
-
-	    b1.SetOrder (edgeorder[e]);
-	    b1.CalcFDf (xi);
-
-	    double decay = arg;
-	    double ddecay;
-	    
-	    double l0 = lambda(i0);
-	    double l0x = dlambda(i0,0);
-	    double l0y = dlambda(i0,1);
-
-	    double l1 = lambda(i1);
-	    double l1x = dlambda(i1,0);
-	    double l1y = dlambda(i1,1);
-
-	    for (int k = 2; k <= edgeorder[e]; k++)
-	    {        
-		ddecay = k*decay;
-		decay *= arg;
-		
-		eshape[index] = b1.GetF (k) * decay;
-		edshape[index] = Vec<2>
-		    (b1.GetDf(k) * (l1x*arg - l1*(l0x+l1x)) * 
-		     decay / (arg * arg) + b1.GetF(k) * ddecay * (l0x+l1x),
-		     b1.GetDf(k) * (l1y*arg - l1*(l0y+l1y)) *
-		     decay / (arg * arg) + b1.GetF(k) * ddecay * (l0y+l1y));
-		index++;
-	    }
-	}
-	// (*testout) << "eshape = " << eshape << ", edshape = " << edshape << endl;
-
-
-	/*
-	index = 0;
-	for (int e = 0; e < nedges; e++)
-	  {
-	    int i0 = eledge[e][0]-1;
-	    int i1 = eledge[e][1]-1;
-
-	    if (edgeorient[e] == -1) Swap (i0, i1); // reverse orientation
-	    
-	    double x = lambda(i1)-lambda(i0);
-	    double y = 1-lambda(i0)-lambda(i1);
-	    double fy = (1-y)*(1-y);
-
-	    // double p3 = 0, p3x = 0, p3y = 0;
-	    // double p2 = -1, p2x = 0, p2y = 0;
-	    // double p1 = x, p1x = 1, p1y = 0;
-
-	    double p3 = 0, p3x = 0, p3y = 0;
-	    double p2 = -0.5, p2x = 0, p2y = 0;
-	    double p1 = 0.5*x, p1x = 0.5, p1y = 0;
-
-	    for (int j=2; j<= edgeorder[e]; j++)
-	      {
-		p3=p2; p3x = p2x; p3y = p2y;
-		p2=p1; p2x = p1x; p2y = p1y;
-		double c1 = (2.0*j-3) / j;
-		double c2 = (j-3.0) / j;
-		
-		p1  = c1 * x * p2 - c2 * fy * p3;
-		p1x = c1 * p2 + c1 * x * p2x - c2 * fy * p3x;
-		p1y = c1 * x * p2y - (c2 * 2 * (y-1) * p3 + c2 * fy * p3y);
-		eshape[index] = p1;
-		// edshape[index] = Vec<2> (p1x, p1y);
-		edshape[index](0) = -2*p1x;
-		edshape[index](1) = p1y-p1x;
-		index++;
-	      }    
-
-	  }
-	  // (*testout) << "eshape = " << eshape << ", edshape = " << edshape << endl;
-	  */
-    }
-
-
-    void FETrig :: CalcFaceShapes ()
-    {
-	int index = 0;
-
-	int i0 = elface[0][0]-1;
-	int i1 = elface[0][1]-1;
-	int i2 = elface[0][2]-1;
-
-	// sort lambda_i's by the corresponing vertex numbers
-
-	if (vertexnr[i1] < vertexnr[i0]) Swap (i0, i1);
-	if (vertexnr[i2] < vertexnr[i0]) Swap (i0, i2);
-	if (vertexnr[i2] < vertexnr[i1]) Swap (i1, i2);
-
-	double arg = lambda(i1) + lambda(i2);
-
-	if (fabs(arg) < EPSILON) // division by 0
-	{
-	    for (int k = 0; k < nfaceshapes; k++)
-	    {
-		fshape[index] = 0;
-		fdshape[index] = Vec<2>(0,0);
-		index++;
-	    }
-	    return;
-	}
-
-	b1.SetOrder (faceorder);
-	b2.SetOrder (faceorder);
-
-	b1.CalcFDf (lambda(i0));
-	b2.CalcFDf (lambda(i2)/arg);
-
-	double decay = 1;
-	double ddecay;
-
-	double l0 = lambda(i0);
-	double l1 = lambda(i1);
-	double l2 = lambda(i2);
-	double dl0x = dlambda(i0,0);
-	double dl0y = dlambda(i0,1);
-	double dl1x = dlambda(i1,0);
-	double dl1y = dlambda(i1,1);
-	double dl2x = dlambda(i2,0);
-	double dl2y = dlambda(i2,1);
-
-	double dargx = dl1x + dl2x;
-	double dargy = dl1y + dl2y;
-
-	for (int n1 = 2; n1 < faceorder; n1++)
-	{
-	    ddecay = (n1-1)*decay;
-	    decay *= arg;
-	    
-	    for (int n0 = 2; n0 < faceorder-n1+2; n0++)
-	    {
-		fshape[index] = b1.GetF(n0) * b2.GetF(n1) * decay;
-		fdshape[index] = Vec<2>
-		    (b1.GetDf(n0) * dl0x * b2.GetF(n1) * decay +
-		     b1.GetF(n0) * b2.GetDf(n1) * (dl2x * arg - l2 * dargx)/(arg*arg) * decay +
-		     b1.GetF(n0) * b2.GetF(n1) * ddecay * dargx,
-		     b1.GetDf(n0) * dl0y * b2.GetF(n1) * decay +
-		     b1.GetF(n0) * b2.GetDf(n1) * (dl2y * arg - l2 * dargy)/(arg*arg) * decay +
-		     b1.GetF(n0) * b2.GetF(n1) * ddecay * dargy);
-		index++;
-	    }
-	}
-    }
-
-
-
-    void FETrig :: CalcFaceLaplaceShapes ()
-    {
-	int index = 0;
-
-	int i0 = elface[0][0]-1;
-	int i1 = elface[0][1]-1;
-	int i2 = elface[0][2]-1;
-
-	if (vertexnr[i1] < vertexnr[i0]) Swap (i0, i1);
-	if (vertexnr[i2] < vertexnr[i0]) Swap (i0, i2);
-	if (vertexnr[i2] < vertexnr[i1]) Swap (i1, i2);
-
-	double arg = lambda(i1) + lambda(i2);
-
-	if (fabs(arg) < EPSILON) // division by 0
-	{
-	    for (int k = 0; k < nfaceshapes; k++)
-		fddshape[k] = 0;
-	    return;
-	}
-
-	b1.SetOrder (faceorder);
-	b2.SetOrder (faceorder);
-
-	b1.CalcFDf (lambda(i0));
-	b1.CalcDDf (lambda(i0));
-	b2.CalcFDf (lambda(i2)/arg);
-	b2.CalcDDf (lambda(i2)/arg);
-
-	double decay = 1;
-	double ddecay = 0;
-	double dddecay;
-
-	double l0 = lambda(i0);
-	double l1 = lambda(i1);
-	double l2 = lambda(i2);
-	double dl0x = dlambda(i0,0);
-	double dl0y = dlambda(i0,1);
-	double dl1x = dlambda(i1,0);
-	double dl1y = dlambda(i1,1);
-	double dl2x = dlambda(i2,0);
-	double dl2y = dlambda(i2,1);
-
-	double dargx = dl1x + dl2x;
-	double dargy = dl1y + dl2y;
-
-	for (int n1 = 2; n1 < faceorder; n1++)
-	{
-	    dddecay = (n1-1)*ddecay;
-	    ddecay = (n1-1)*decay;
-	    decay *= arg;
-	    
-	    for (int n0 = 2; n0 < faceorder-n1+2; n0++)
-	    {
-		fddshape[index] = 
-
-		//  b1.GetDf(n0) * dl0x * b2.GetF(n1) * decay .... derived
-
-		    b1.GetDDf(n0) * dl0x * dl0x * b2.GetF(n1) * decay +
-		    b1.GetDf(n0) * dl0x * b2.GetDf(n1) * (dl2x * arg - l2 * dargx)/(arg*arg) * decay +
-		    b1.GetDf(n0) * dl0x * b2.GetF(n1) * ddecay * dargx +
-
-		    
-	        //  b1.GetF(n0) * b2.GetDf(n1) * (dl2x * arg - l2 * dargx)/(arg*arg) * decay ... derived
-
-		    b1.GetDf(n0) * dl0x * b2.GetDf(n1) * (dl2x * arg - l2 * dargx)/(arg*arg) * decay +
-		    b1.GetF(n0) * b2.GetDDf(n1) * pow((dl2x * arg - l2 * dargx)/(arg*arg),2) * decay +
-		    b1.GetF(n0) * b2.GetDf(n1) * (-2*dargx/arg) * (dl2x * arg - l2 * dargx)/(arg*arg) * decay +
-		    b1.GetF(n0) * b2.GetDf(n1) * (dl2x * arg - l2 * dargx)/(arg*arg) * ddecay * dargx +
-
-		    
-		//  b1.GetF(n0) * b2.GetF(n1) * ddecay * dargx ... derived
-
-		    b1.GetDf(n0) * dl0x * b2.GetF(n1) * ddecay * dargx +
-		    b1.GetF(n0) * b2.GetDf(n1) * (dl2x * arg - l2 * dargx)/(arg*arg) * ddecay * dargx +
-		    b1.GetF(n0) * b2.GetF(n1) * dddecay * dargx * dargx +
-
-		    
-		//  b1.GetDf(n0) * dl0y * b2.GetF(n1) * decay ... derived
-
-		    b1.GetDDf(n0) * dl0y * dl0y * b2.GetF(n1) * decay +
-		    b1.GetDf(n0) * dl0y * b2.GetDf(n1) * (dl2y * arg - l2 * dargy)/(arg*arg) * decay +
-		    b1.GetDf(n0) * dl0y * b2.GetF(n1) * ddecay * dargy +
-		    
-
-		//  b1.GetF(n0) * b2.GetDf(n1) * (dl2y * arg - l2 * dargy)/(arg*arg) * decay ... derived
-
-		    b1.GetDf(n0) * dl0y * b2.GetDf(n1) * (dl2y * arg - l2 * dargy)/(arg*arg) * decay +
-		    b1.GetF(n0) * b2.GetDDf(n1) * pow((dl2y * arg - l2 * dargy)/(arg*arg),2) * decay +
-		    b1.GetF(n0) * b2.GetDf(n1) * (-2*dargy/arg) * (dl2y * arg - l2 * dargy)/(arg*arg) * decay +
-		    b1.GetF(n0) * b2.GetDf(n1) * (dl2y * arg - l2 * dargy)/(arg*arg) * ddecay * dargy +
-		    
-
-		//  b1.GetF(n0) * b2.GetF(n1) * ddecay * dargy ... derived
-
-		    b1.GetDf(n0) * dl0y * b2.GetF(n1) * ddecay * dargy +
-		    b1.GetF(n0) * b2.GetDf(n1) * (dl2y * arg - l2 * dargy)/(arg*arg) * ddecay * dargy +
-		    b1.GetF(n0) * b2.GetF(n1) * dddecay * dargy * dargy;
-
-		index++;
-	    }
-	}
-    }
-
-
-
-// ----------------------------------------------------------------------------
-//      FEQuad
-// ----------------------------------------------------------------------------
-
-
-    void FEQuad :: CalcVertexShapes ()
-    {
-	vshape[0] = (1-xi(0)) * (1-xi(1));
-	vshape[1] = (  xi(0)) * (1-xi(1));
-	vshape[2] = (  xi(0)) * (  xi(1));
-	vshape[3] = (1-xi(0)) * (  xi(1));
-
-	vdshape[0] = Vec<2> ( -(1-xi(1)), -(1-xi(0)) );
-	vdshape[1] = Vec<2> (  (1-xi(1)), -(  xi(0)) );
-	vdshape[2] = Vec<2> (  (  xi(1)),  (  xi(0)) );
-	vdshape[3] = Vec<2> ( -(  xi(1)),  (1-xi(0)) );
-    }
-
-
-    void FEQuad :: CalcEdgeShapes ()
-    {
-	int index = 0;
-
-	double arg0[4] = { xi(0), 1-xi(0), 1-xi(1), xi(1) };
-	double arg1[4] = { 1-xi(1), xi(1), 1-xi(0), xi(0) };
-	double darg0[4] = {  1, -1, -1,  1 };
-	double darg1[4] = { -1,  1, -1,  1 };
-	
-	for (int e = 0; e < nedges; e++)
-	{
-	    b1.SetOrder (edgeorder[e]);
-	    b1.CalcFDf (edgeorient[e] == 1 ? arg0[e] : 1-arg0[e]);
-
-	    double decay = arg1[e];
-	    double ddecay;
-
-	    for (int k = 2; k <= edgeorder[e]; k++, index++)
-	    {
-		ddecay = k*decay;
-		decay *= arg1[e];
-// linear decay
-		eshape[index] = b1.GetF(k) * arg1[e];
-
-		if (e < 2)
-		    edshape[index] = Vec<2>
-			(darg0[e] * edgeorient[e] * b1.GetDf(k) * arg1[e],
-			 b1.GetF(k) * darg1[e]);
-		else
-		    edshape[index] = Vec<2>
-			(b1.GetF(k) * darg1[e],
-			 darg0[e] * edgeorient[e] * b1.GetDf(k) * arg1[e]);
-
-// exponential decay
-/*		eshape[index] = b1.GetF(k) * decay;
-
-		if (e < 2)
-		    edshape[index] = Vec<2>
-			(darg0[e] * edgeorient[e] * b1.GetDf(k) * decay,
-			 b1.GetF(k) * ddecay * darg1[e]);
-		else
-		    edshape[index] = Vec<2>
-			(b1.GetF(k) * ddecay * darg1[e],
-			 darg0[e] * edgeorient[e] * b1.GetDf(k) * decay);
-*/
-	    }
-	}
-    }
-
-
-    void FEQuad :: CalcFaceShapes ()
-    {
-	int index = 0;
-
-	// find index of point with smallest number
-
-	int i0 = 0;
-	for (int i = 1; i < 4; i++)
-	    if (vertexnr[elface[0][i]-1] < vertexnr[elface[0][i0]-1]) i0 = i;
-
-	double x;
-	double y;
-	double dxx;
-	double dxy;
-	double dyx;
-	double dyy;
-
-	switch (i0)
-	{
-	    case 0:
-		x = xi(0); y = xi(1);
-		dxx = 1; dxy = 0;
-		dyx = 0; dyy = 1;
-		break;
-	    case 1:
-		x = xi(1); y = 1-xi(0);
-		dxx = 0; dxy = 1;
-		dyx = -1; dyy = 0;
-		break;
-	    case 2: 
-		x = 1-xi(0); y = 1-xi(1);
-		dxx = -1; dxy = 0;
-		dyx = 0; dyy = -1;
-		break;
-	    case 3:
-		x = 1-xi(1); y = xi(0);
-		dxx = 0; dxy =-1;
-		dyx = 1; dyy = 0;
-		break;
-	}
-
-	if (vertexnr[elface[0][(i0+1) % 4]-1] > vertexnr[elface[0][(i0+3) % 4]-1]) 
-	{
-	    Swap (x,y);
-	    Swap (dxx, dyx);
-	    Swap (dxy, dyy);
-	}
-
-	b1.SetOrder (faceorder);
-	b2.SetOrder (faceorder);
-
-	b1.CalcFDf (x);
-	b2.CalcFDf (y);
-
-	for (int n0 = 2; n0 <= faceorder; n0++)
-	    for (int n1 = 2; n1 <= faceorder; n1++)
-	    {
-		fshape[index] = b1.GetF(n0) * b2.GetF(n1);
-		fdshape[index] = Vec<2> (b1.GetDf(n0) * dxx * b2.GetF(n1) + b1.GetF(n0) * b2.GetDf(n1) * dyx,
-					 b1.GetDf(n0) * dxy * b2.GetF(n1) + b1.GetF(n0) * b2.GetDf(n1) * dyy);
-		index++;
-	    }
-    }
-
-
-    void FEQuad :: CalcFaceLaplaceShapes ()
-    {
-	int index = 0;
-
-	// find index of point with smallest number
-
-	int i0 = 0;
-	for (int i = 1; i < 4; i++)
-	    if (vertexnr[elface[0][i]-1] < vertexnr[elface[0][i0]-1]) i0 = i;
-
-	double x;
-	double y;
-	double dxx;
-	double dxy;
-	double dyx;
-	double dyy;
-
-	switch (i0)
-	{
-	    case 0:
-		x = xi(0); y = xi(1);
-		dxx = 1; dxy = 0;
-		dyx = 0; dyy = 1;
-		break;
-	    case 1:
-		x = xi(1); y = 1-xi(0);
-		dxx = 0; dxy = 1;
-		dyx = -1; dyy = 0;
-		break;
-	    case 2: 
-		x = 1-xi(0); y = 1-xi(1);
-		dxx = -1; dxy = 0;
-		dyx = 0; dyy = -1;
-		break;
-	    case 3:
-		x = 1-xi(1); y = xi(0);
-		dxx = 0; dxy =-1;
-		dyx = 1; dyy = 0;
-		break;
-	}
-
-	if (vertexnr[elface[0][(i0+1) % 4]-1] > vertexnr[elface[0][(i0+3) % 4]-1]) 
-	{
-	    Swap (x,y);
-	    Swap (dxx, dyx);
-	    Swap (dxy, dyy);
-	}
-
-	b1.SetOrder (faceorder);
-	b2.SetOrder (faceorder);
-
-	b1.CalcFDf (x);
-	b1.CalcDDf (x);
-	b2.CalcFDf (y);
-	b2.CalcDDf (y);
-
-	for (int n0 = 2; n0 <= faceorder; n0++)
-	    for (int n1 = 2; n1 <= faceorder; n1++)
-	    {
-		fddshape[index] =
-		    b1.GetDDf(n0) * dxx * dxx * b2.GetF(n1) +
-		2*  b1.GetDf(n0) * dxx * b2.GetDf(n1) * dyx +
-		    b1.GetF(n0) * b2.GetDDf(n1) * dyx * dyx +
-
-		    b1.GetDDf(n0) * dxy * dxy * b2.GetF(n1) +
-		2*  b1.GetDf(n0) * dxy * b2.GetDf(n1) * dyy +
-		    b1.GetF(n0) * b2.GetDDf(n1) * dyy * dyy;
-
-		index++;
-	    }
-    }
-
-
-
-// ----------------------------------------------------------------------------
-//      FETet
-// ----------------------------------------------------------------------------
-
-
-    void FETet :: SetReferencePoint (Point<3> axi)
-    {
-	BaseFiniteElement3D :: SetReferencePoint (axi);
-	
-	lambda(0) = xi(0);
-	lambda(1) = xi(1);
-	lambda(2) = xi(2);
-	lambda(3) = 1-xi(0)-xi(1)-xi(2);
-
-	dlambda(0,0) =  1; dlambda(0,1) =  0; dlambda(0,2) =   0;
-	dlambda(1,0) =  0; dlambda(1,1) =  1; dlambda(1,2) =   0;
-	dlambda(2,0) =  0; dlambda(2,1) =  0; dlambda(2,2) =   1;
-	dlambda(3,0) = -1; dlambda(3,1) = -1; dlambda(3,2) =  -1;
-    }
-
-
-    void FETet :: CalcVertexShapes ()
-    {
-	for (int v = 0; v < nvertices; v++)
-	{
-	    vshape[v] = lambda(v);
-	    vdshape[v](0) = dlambda(v,0);
-	    vdshape[v](1) = dlambda(v,1);
-	    vdshape[v](2) = dlambda(v,2);
-	}
-    }
-
-
-    void FETet :: CalcEdgeShapes ()
-    {
-	int index = 0;
-
-	for (int e = 0; e < nedges; e++)
-	{
-	    int i0 = eledge[e][0]-1;
-	    int i1 = eledge[e][1]-1;
-
-	    double arg = lambda(i0)+lambda(i1);
-
-	    if (fabs(arg) < EPSILON) // division by 0
-	    {
-		for (int k = 2; k <= edgeorder[e]; k++)
-		{
-		    eshape[index] = 0;
-		    edshape[index] = Vec<3>(0,0,0);
-		    index++;
-		}
-		continue;
-	    }
-
-	    if (edgeorient[e] == -1) Swap (i0, i1);
-
-	    double xi = lambda[i1]/arg;
-
-	    b1.SetOrder (edgeorder[e]);
-	    b1.CalcFDf (xi);
-
-	    double decay = arg;
-	    double ddecay;
-	    
-	    double l0 = lambda(i0);
-	    double dl0x = dlambda(i0,0);
-	    double dl0y = dlambda(i0,1);
-	    double dl0z = dlambda(i0,2);
-
-	    double l1 = lambda(i1);
-	    double dl1x = dlambda(i1,0);
-	    double dl1y = dlambda(i1,1);
-	    double dl1z = dlambda(i1,2);
-
-	    double dargx = dl0x + dl1x;
-	    double dargy = dl0y + dl1y;
-	    double dargz = dl0z + dl1z;
-                           
-	    for (int k = 2; k <= edgeorder[e]; k++)
-	    {        
-		ddecay = k*decay;
-		decay *= arg;
-
-		eshape[index] = b1.GetF (k) * decay;
-		edshape[index] = Vec<3>
-		    (b1.GetDf(k) * (dl1x*arg - l1*dargx) * 
-		     decay / (arg * arg) + b1.GetF(k) * ddecay * dargx,
-		     b1.GetDf(k) * (dl1y*arg - l1*dargy) * 
-		     decay / (arg * arg) + b1.GetF(k) * ddecay * dargy,
-		     b1.GetDf(k) * (dl1z*arg - l1*dargz) * 
-		     decay / (arg * arg) + b1.GetF(k) * ddecay * dargz);
-
-		index++;
-	    }
-	}
-    }
-
-
-    void FETet :: CalcFaceShapes ()
-    {
-	int index = 0;
-
-	for (int f = 0; f < nfaces; f++)
-	{
-	  if (faceorder[f] <= 2) continue;
-
-	    int i0 = elface[f][0]-1;
-	    int i1 = elface[f][1]-1;
-	    int i2 = elface[f][2]-1;
-
-	    if (vertexnr[i1] < vertexnr[i0]) Swap (i0, i1);
-	    if (vertexnr[i2] < vertexnr[i0]) Swap (i0, i2);
-	    if (vertexnr[i2] < vertexnr[i1]) Swap (i1, i2);
-
-	    double arg = lambda(i1) + lambda(i2);
-	    double arg2 = lambda(i0) + lambda(i1) + lambda(i2);
-
-	    if (fabs(arg) < EPSILON || fabs(arg2) < EPSILON) // division by 0
-	    {
-		for (int k = 0; k < nfaceshapes[f]; k++)
-		{
-		    fshape[index] = 0;
-		    fdshape[index] = Vec<3>(0,0,0);
-		    index++;
-		}
-		continue;
-	    }
-
-	    b1.SetOrder (faceorder[f]);
-	    b2.SetOrder (faceorder[f]);
-	    
-	    b1.CalcFDf (lambda(i0)/arg2);
-	    b2.CalcFDf (lambda(i2)/arg);
-	    
-	    double decay = 1;
-	    double ddecay;
-	    
-	    double l0 = lambda(i0);
-	    double l1 = lambda(i1);
-	    double l2 = lambda(i2);
-	    double dl0x = dlambda(i0,0);
-	    double dl0y = dlambda(i0,1);
-	    double dl0z = dlambda(i0,2);
-	    double dl1x = dlambda(i1,0);
-	    double dl1y = dlambda(i1,1);
-	    double dl1z = dlambda(i1,2);
-	    double dl2x = dlambda(i2,0);
-	    double dl2y = dlambda(i2,1);
-	    double dl2z = dlambda(i2,2);
-	    
-	    double dargx = dl1x + dl2x;
-	    double dargy = dl1y + dl2y;
-	    double dargz = dl1z + dl2z;
-	    double darg2x = dl0x + dl1x + dl2x;
-	    double darg2y = dl0y + dl1y + dl2y;
-	    double darg2z = dl0z + dl1z + dl2z;
-
-	    for (int n1 = 2; n1 < faceorder[f]; n1++)
-	    {
-		ddecay = (n1-1)*decay;
-		decay *= arg;
-		
-		double decay2 = arg2;
-		double ddecay2;
-
-		for (int n0 = 2; n0 < faceorder[f]-n1+2; n0++)
-		{
-		    ddecay2 = n0*decay2;
-		    decay2 *= arg2;
-
-		    fshape[index] = b1.GetF(n0) * b2.GetF(n1) * decay * decay2;
-		    fdshape[index] = Vec<3>
-			(b1.GetDf(n0) * (dl0x * arg2 - l0 * darg2x)/(arg2*arg2) * b2.GetF(n1) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetDf(n1) * (dl2x * arg - l2 * dargx)/(arg*arg) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargx * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * decay * ddecay2 * darg2x,
-			
-			 b1.GetDf(n0) * (dl0y * arg2 - l0 * darg2y)/(arg2*arg2) * b2.GetF(n1) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetDf(n1) * (dl2y * arg - l2 * dargy)/(arg*arg) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargy * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * decay * ddecay2 * darg2y,
-
-			 b1.GetDf(n0) * (dl0z * arg2 - l0 * darg2z)/(arg2*arg2) * b2.GetF(n1) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetDf(n1) * (dl2z * arg - l2 * dargz)/(arg*arg) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargz * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * decay * ddecay2 * darg2z);
-
-		    index++;
-		}
-	    }
-	}
-    }
-
-
-
-
-// ----------------------------------------------------------------------------
-//      FEPrism
-// ----------------------------------------------------------------------------
-
-
-    void FEPrism :: SetReferencePoint (Point<3> axi)
-    {
-	BaseFiniteElement3D :: SetReferencePoint (axi);
-	
-	lambda(0) = xi(0);
-	lambda(1) = xi(1);
-	lambda(2) = 1-xi(0)-xi(1);
-	lambda(3) = xi(2);
-
-	dlambda(0,0) =  1; dlambda(0,1) =  0; dlambda(0,2) =   0;
-	dlambda(1,0) =  0; dlambda(1,1) =  1; dlambda(1,2) =   0;
-	dlambda(2,0) = -1; dlambda(2,1) = -1; dlambda(2,2) =   0;
-	dlambda(3,0) =  0; dlambda(3,1) =  0; dlambda(3,2) =   1;
-    }
-
-
-    void FEPrism :: CalcVertexShapes ()
-    {
-	double zcomp = 1-lambda(3);
-
-	for (int v = 0; v < nvertices; v++)
-	{
-	    if (v == 3) zcomp = 1-zcomp;
-
-	    vshape[v] = lambda(v % 3) * zcomp;
-	    vdshape[v](0) = dlambda(v % 3,0) * zcomp;
-	    vdshape[v](1) = dlambda(v % 3,1) * zcomp;
-	    vdshape[v](2) = lambda(v % 3) * (-dlambda(3,2));
-
-	    if (v >= 3) vdshape[v](2) *= -1;
-	}
-    }
-
-
-    void FEPrism :: CalcEdgeShapes ()
-    {
-	int index = 0;
-	int e;
-	// triangle edge shapes
-	
-	for (e = 0; e < 6; e++)
-	{
-	    int i0 = (eledge[e][0]-1) % 3;
-	    int i1 = (eledge[e][1]-1) % 3;
-
-	    double arg = lambda[i0]+lambda[i1];
-
-	    if (fabs(arg) < EPSILON) // division by 0
-	    {
-		for (int k = 2; k <= edgeorder[e]; k++)
-		{
-		    eshape[index] = 0;
-		    edshape[index] = Vec<3>(0,0,0);
-		    index++;
-		}
-		continue;
-	    }
-
-	    if (edgeorient[e] == -1) Swap (i0, i1);
-
-	    double xi = lambda[i1]/arg;
-
-	    b1.SetOrder (edgeorder[e]);
-	    b1.CalcFDf (xi);
-
-	    double decay = arg;
-	    double ddecay;
-
-	    double zarg = e < 3 ? (1-lambda(3)) : lambda(3);
-	    double zcomp = zarg;
-	    double dzcomp;
-	    
-	    double l0 = lambda(i0);
-	    double dl0x = dlambda(i0,0);
-	    double dl0y = dlambda(i0,1);
-
-	    double l1 = lambda(i1);
-	    double dl1x = dlambda(i1,0);
-	    double dl1y = dlambda(i1,1);
-
-	    double dargx = dl0x + dl1x;
-	    double dargy = dl0y + dl1y;
-                           
-	    for (int k = 2; k <= edgeorder[e]; k++)
-	    {        
-		ddecay = k*decay;
-		decay *= arg;
-
-		dzcomp = k*zcomp;
-		zcomp *= zarg;
-
-		eshape[index] = b1.GetF (k) * decay * zcomp;
-		edshape[index] = Vec<3>
-		    ((b1.GetDf(k) * (dl1x*arg - l1*dargx) * 
-		     decay / (arg * arg) + b1.GetF(k) * ddecay * dargx) * zcomp,
-		     (b1.GetDf(k) * (dl1y*arg - l1*dargy) * 
-		     decay / (arg * arg) + b1.GetF(k) * ddecay * dargy) * zcomp,
-		     b1.GetF(k) * decay * dzcomp * (e < 3 ? -1 : 1));
-		index++;
-	    }
-	}
-
-	// rectangle edge shapes
-	
-	for (e = 6; e < nedges; e++)
-	{
-	    int i0 = eledge[e][0]-1;
-
-	    double arg = lambda[i0]; 
-
-	    if (fabs(arg) < EPSILON) // division by 0
-	    {
-		for (int k = 2; k <= edgeorder[e]; k++)
-		{
-		    eshape[index] = 0.;
-		    edshape[index] = Vec<3>(0.,0.,0.);
-		    index++;
-		}
-		continue;
-	    }
-
-	    double xi = lambda[3];
-
-	    if (edgeorient[e] == -1) xi = 1-xi;
-
-	    b1.SetOrder (edgeorder[e]);
-	    b1.CalcFDf (xi);
-
-	    double decay = arg;
-	    double ddecay;
-	    
-	    double l0 = lambda(i0);
-	    double l0x = dlambda(i0,0);
-	    double l0y = dlambda(i0,1);
-
-	    for (int k = 2; k <= edgeorder[e]; k++)
-	    {        
-		ddecay = k*decay;
-		decay *= arg;
-		
-		eshape[index] = b1.GetF (k) * decay;
-		edshape[index] = Vec<3>
-		    (b1.GetF(k) * ddecay * l0x,
-		     b1.GetF(k) * ddecay * l0y,
-		     b1.GetDf(k) * edgeorient[e] * decay);
-		index++;
-	    }
-	}
-    }
-
-
-    void FEPrism :: CalcFaceShapes ()
-    {
-	int index = 0;
-	int f;
-
-	// triangle face parts
-
-	for (f = 0; f < 2; f++)
-	{
-	    int i0 = elface[f][0]-1;
-	    int i1 = elface[f][1]-1;
-	    int i2 = elface[f][2]-1;
-
-	    if (vertexnr[i1] < vertexnr[i0]) Swap (i0, i1);
-	    if (vertexnr[i2] < vertexnr[i0]) Swap (i0, i2);
-	    if (vertexnr[i2] < vertexnr[i1]) Swap (i1, i2);
-
-	    i0 = i0 % 3;
-	    i1 = i1 % 3;
-	    i2 = i2 % 3;
-
-	    double arg = lambda(i1) + lambda(i2);
-
-	    if (fabs(arg) < EPSILON) // division by 0
-	    {
-		for (int k = 0; k < nfaceshapes[f]; k++)
-		{
-		    fshape[index] = 0;
-		    fdshape[index] = Vec<3>(0,0,0);
-		    index++;
-		}
-		continue;
-	    }
-
-	    b1.SetOrder (faceorder[f]);
-	    b2.SetOrder (faceorder[f]);
-	    
-	    b1.CalcFDf (lambda(i0));
-	    b2.CalcFDf (lambda(i2)/arg);
-	    
-	    double decay = 1;
-	    double ddecay;
-	    
-	    double l0 = lambda(i0);
-	    double l1 = lambda(i1);
-	    double l2 = lambda(i2);
-	    double dl0x = dlambda(i0,0);
-	    double dl0y = dlambda(i0,1);
-	    double dl0z = dlambda(i0,2);
-	    double dl1x = dlambda(i1,0);
-	    double dl1y = dlambda(i1,1);
-	    double dl1z = dlambda(i1,2);
-	    double dl2x = dlambda(i2,0);
-	    double dl2y = dlambda(i2,1);
-	    double dl2z = dlambda(i2,2);
-	    
-	    double dargx = dl1x + dl2x;
-	    double dargy = dl1y + dl2y;
-	    double dargz = dl1z + dl2z;
-
-	    double arg2 = f == 0 ? 1-xi(2) : xi(2);
-	    double darg2z = f == 0 ? -1 : 1;
-	    
-	    for (int n1 = 2; n1 < faceorder[f]; n1++)
-	    {
-		ddecay = (n1-1)*decay;
-		decay *= arg;
-		
-		double decay2 = arg2;
-		double ddecay2;
-
-		for (int n0 = 2; n0 < faceorder[f]-n1+2; n0++)
-		{
-		    ddecay2 = n0*decay2;
-		    decay2 *= arg2;
-
-		    fshape[index] = b1.GetF(n0) * b2.GetF(n1) * decay * decay2;
-		    fdshape[index] = Vec<3>
-			(b1.GetDf(n0) * dl0x * b2.GetF(n1) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetDf(n1) * (dl2x * arg - l2 * dargx)/(arg*arg) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargx * decay2,
-			
-			 b1.GetDf(n0) * dl0y * b2.GetF(n1) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetDf(n1) * (dl2y * arg - l2 * dargy)/(arg*arg) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargy * decay2,
-
-			 b1.GetDf(n0) * dl0z * b2.GetF(n1) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetDf(n1) * (dl2z * arg - l2 * dargz)/(arg*arg) * decay * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargz * decay2 +
-			 b1.GetF(n0) * b2.GetF(n1) * decay * ddecay2 * darg2z);
-
-		    index++;
-		}
-	    }
-	}
-
-
-	// quad parts
-
-	for (f = 2; f < nfaces; f++)
-	{
-	    // find index of point with smallest number
-	  
-	    int i, i0 = 0;
-	    for (i = 1; i < 4; i++)
-		if (vertexnr[elface[f][i]-1] < vertexnr[elface[f][i0]-1]) i0 = i;
-	    
-	    double arg = 0;
-	    double dargx = 0;
-	    double dargy = 0;
-	    double dargz = 0;
-	    for (i = 0; i < 4; i++)
-	    {
-		arg += lambda((elface[f][i]-1) % 3)/2.0;
-		dargx += dlambda((elface[f][i]-1) % 3,0)/2.0;
-		dargy += dlambda((elface[f][i]-1) % 3,1)/2.0;
-		dargz += dlambda((elface[f][i]-1) % 3,2)/2.0;
-	    }
-	    
-	    if (fabs(arg) < EPSILON) // division by 0
-	    {
-		for (int k = 0; k < nfaceshapes[f]; k++)
-		{
-		    fshape[index] = 0;
-		    fdshape[index] = Vec<3>(0,0,0);
-		    index++;
-		}
-		continue;
-	    }
-
-	    int i1 = (i0+3) % 4;
-	    int j = (elface[f][i0]-1) % 3;
-
-	    double lam = lambda(j)/arg;
-	    double dlamx = (dlambda(j,0)*arg-lambda(j)*dargx)/(arg*arg);
-	    double dlamy = (dlambda(j,1)*arg-lambda(j)*dargy)/(arg*arg);
-	    double dlamz = (dlambda(j,2)*arg-lambda(j)*dargz)/(arg*arg);
-			    
-	    double x;
-	    double z;
-	    double dxx;
-	    double dxy;
-	    double dxz;
-	    double dzx;
-	    double dzy;
-	    double dzz;
-
-	    int ratvar;
-	    /*
-	    switch (i0)
-	    {
-		case 0:
-		    x = xi(2); z = lam;
-
-		    dxx = 0;     dxy = 0;     dxz = 1;
-		    dzx = dlamx; dzy = dlamy; dzz = dlamz;
-		    ratvar = 1;
-		    break;
-		case 1:
-		    x = 1-lam; z = xi(2);
-		    dxx = -dlamx; dxy = -dlamy; dxz = -dlamz;
-		    dzx = 0;      dzy = 0;      dzz = 1;
-		    ratvar = 0;
-		    break;
-		case 2: 
-		    x = 1-xi(2); z = 1-lam;
-		    dxx = 0;      dxy = 0;      dxz = -1;
-		    dzx = -dlamx; dzy = -dlamy; dzz = -dlamz;
-		    ratvar = 1;
-		    break;
-		case 3:
-		    x = lam; z = 1-xi(2);
-		    dxx = dlamx; dxy = dlamy; dxz = dlamz;
-		    dzx = 0;     dzy = 0;     dzz = -1;
-		    ratvar = 0;
-		    break;
-	    }
-	    */
-
-	    ratvar = 0;
-	    x = 1-lam;
-	    dxx = -dlamx; dxy = -dlamy; dxz = -dlamz;
-	    if (i0 == 0 || i0 == 1)
-	    {
-		z = xi(2);
-		dzx = 0; dzy = 0; dzz = 1;
-	    }
-	    else
-	    {
-		z = 1-xi(2);
-		dzx = 0; dzy = 0; dzz = -1;
-	    }
-
-	    int ix = i0 ^ 1;
-	    int iz = 3-i0;
-
-	    if (vertexnr[elface[f][ix]-1] > vertexnr[elface[f][iz]-1])
-	    {
-	        Swap (x,z);
-	        Swap (dxx, dzx);
-	        Swap (dxy, dzy);
-		Swap (dxz, dzz);
-		ratvar = 1-ratvar;
-	    }
-
-	    b1.SetOrder (faceorder[f]);
-	    b2.SetOrder (faceorder[f]);
-	    
-	    b1.CalcFDf (x);
-	    b2.CalcFDf (z);
-	    
-	    double decay = arg;
-	    double ddecay;
-	    
-	    for (int n0 = 2; n0 <= faceorder[f]; n0++)
-	    {
-		ddecay = n0*decay;
-		decay *= arg;
-		
-		if (ratvar == 1) decay = arg;
-
-		for (int n1 = 2; n1 <= faceorder[f]; n1++)
-		{
-		    if (ratvar == 1)
-		    {
-			ddecay = n1*decay;
-			decay *= arg;
-		    }
-
-		    fshape[index] = b1.GetF(n0) * b2.GetF(n1) * decay;
-		    fdshape[index] = Vec<3>
-			(b1.GetDf(n0) * dxx * b2.GetF(n1) * decay +
-			 b1.GetF(n0) * b2.GetDf(n1) * dzx * decay +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargx,
-
-			 b1.GetDf(n0) * dxy * b2.GetF(n1) * decay +
-			 b1.GetF(n0) * b2.GetDf(n1) * dzy * decay +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargy,
-			
-			 b1.GetDf(n0) * dxz * b2.GetF(n1) * decay +
-			 b1.GetF(n0) * b2.GetDf(n1) * dzz * decay +
-			 b1.GetF(n0) * b2.GetF(n1) * ddecay * dargz);
-
-		    index++;
-		}
-	    }
-	}
-    }
-    
-
-
-// ----------------------------------------------------------------------------
-//      FEPyramid
-// ----------------------------------------------------------------------------
-
-
-    void FEPyramid :: SetReferencePoint (Point<3> axi)
-    {
-	BaseFiniteElement3D :: SetReferencePoint (axi);
-    }
-
-
-    void FEPyramid :: CalcVertexShapes ()
-    {
-	double x = xi(0);
-	double y = xi(1);
-	double z = xi(2);
-
-	if (z == 1.) z = 1-1e-10;
-	vshape[0] = (1-z-x)*(1-z-y) / (1-z);
-	vshape[1] = x*(1-z-y) / (1-z);
-	vshape[2] = x*y / (1-z);
-	vshape[3] = (1-z-x)*y / (1-z);
-	vshape[4] = z;
-
-	double z1 = 1-z;
-	double z2 = z1*z1;
-
-	vdshape[0] = Vec<3>( -(z1-y)/z1, -(z1-x)/z1, ((x+y+2*z-2)*z1+(z1-y)*(z1-x))/z2 );
-	vdshape[1] = Vec<3>( (z1-y)/z1,  -x/z1,      (-x*z1+x*(z1-y))/z2 );
-	vdshape[2] = Vec<3>( y/z1,       x/z1,       x*y/z2 );
-	vdshape[3] = Vec<3>( -y/z1,      (z1-x)/z1,  (-y*z1+y*(z1-x))/z2 );
-	vdshape[4] = Vec<3>( 0, 0, 1 );
-    }
-
-
-    void FEPyramid :: CalcEdgeShapes ()
-    {
-	int index = 0;
-
-	for (int e = 0; e < GetNEdges(); e++)
-	{
-	    for (int k = 2; k <= edgeorder[e]; k++)
-	    {        
-		eshape[index] = 0;
-		edshape[index] = Vec<3>(0,0,0);
-		index++;
-	    }
-	}
-    }
-
-
-    void FEPyramid :: CalcFaceShapes ()
-    {
-	int index = 0;
-
-	for (int f = 0; f < GetNFaces(); f++)
-	{
-	    for (int k = 0; k < nfaceshapes[f]; k++)
-	    {
-		fshape[index] = 0;
-		fdshape[index] = Vec<3>(0,0,0);
-		index++;
-	    }
-	}
-    }
-    
-
-
-
-
-// ----------------------------------------------------------------------------
-//      FEHex
-// ----------------------------------------------------------------------------
-
-
-    void FEHex :: SetReferencePoint (Point<3> axi)
-    {
-	BaseFiniteElement3D :: SetReferencePoint (axi);
-    }
-
-
-    void FEHex :: CalcVertexShapes ()
-    {
-	double x = xi(0);
-	double y = xi(1);
-	double z = xi(2);
-
-	vshape[0] = (1-x)*(1-y)*(1-z);
-	vshape[1] =    x *(1-y)*(1-z); 
-	vshape[2] =    x *   y *(1-z);
-	vshape[3] = (1-x)*   y *(1-z);
-	vshape[4] = (1-x)*(1-y)* z;
-	vshape[5] =    x *(1-y)* z;
-	vshape[6] =    x *   y * z;
-	vshape[7] = (1-x)*   y * z;
-
-	vdshape[0] = Vec<3>(-(1-y)*(1-z), -(1-x)*(1-z), -(1-x)*(1-y));
-	vdshape[1] = Vec<3>( (1-y)*(1-z),    -x *(1-z),    -x *(1-y));
-	vdshape[2] = Vec<3>(    y *(1-z),     x *(1-z),    -x * y);
-	vdshape[3] = Vec<3>(   -y *(1-z),  (1-x)*(1-z), -(1-x)*y);
-	vdshape[4] = Vec<3>(-(1-y)*   z, -(1-x)* z,  (1-x)*(1-y));
-	vdshape[5] = Vec<3>( (1-y)*   z,    -x * z,     x *(1-y));
-	vdshape[6] = Vec<3>(    y *   z,     x * z,     x * y);
-	vdshape[7] = Vec<3>(   -y *   z,  (1-x)* z,  (1-x)*y);
-
-    }
-
-
-    void FEHex :: CalcEdgeShapes ()
-    {
-	int index = 0;
-
-	for (int e = 0; e < GetNEdges(); e++)
-	{
-	    for (int k = 2; k <= edgeorder[e]; k++)
-	    {        
-		eshape[index] = 0;
-		edshape[index] = Vec<3>(0,0,0);
-		index++;
-	    }
-	}
-    }
-
-
-    void FEHex :: CalcFaceShapes ()
-    {
-	int index = 0;
-
-	for (int f = 0; f < GetNFaces(); f++)
-	{
-	    for (int k = 0; k < nfaceshapes[f]; k++)
-	    {
-		fshape[index] = 0;
-		fdshape[index] = Vec<3>(0,0,0);
-		index++;
-	    }
-	}
-    }
-    
-
-
-
-
-
-
-
-
-  int CurvedElements :: IsSurfaceElementCurved (int elnr) const
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [ mesh[(SurfaceElementIndex) elnr].hp_elnr];
-
-	return mesh.coarsemesh->GetCurvedElements().IsSurfaceElementCurved (hpref_el.coarse_elnr);
-      }
-
-
-
-
-    Element2d elem = mesh[(SurfaceElementIndex) elnr];
-
-    switch (elem.GetType())
-      {
-      case TRIG:
-	{
-	  FETrig fe2d(*this);
-	  fe2d.SetElementNumber (elnr+1);
-	  return (fe2d.IsCurved());
-	  break;
-	}
-
-      case QUAD:
-	{
-	  FEQuad fe2d(*this);
-	  fe2d.SetElementNumber (elnr+1);
-	  return (fe2d.IsCurved());
-	  break;
-	}
-
-      }
-    return 0;
-  }
-
-
-
-  int CurvedElements :: IsElementCurved (int elnr) const
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [ mesh[(ElementIndex) elnr].hp_elnr];
-
-	return mesh.coarsemesh->GetCurvedElements().IsElementCurved (hpref_el.coarse_elnr);
-      }
-
-
-
-    Element elem = mesh[(ElementIndex) elnr];
-
-    switch (elem.GetType())
-      {
-      case TET:
-	{
-	  FETet fe3d(*this);
-	  fe3d.SetElementNumber (elnr+1);
-	  return (fe3d.IsCurved());
-	  break;
-	}
-
-      case PRISM:
-	{
-	  FEPrism fe3d(*this);
-	  fe3d.SetElementNumber (elnr+1);
-	  return (fe3d.IsCurved());
-	  break;
-	}
-
-      case PYRAMID:
-	{
-	  FEPyramid fe3d(*this);
-	  fe3d.SetElementNumber (elnr+1);
-	  return (fe3d.IsCurved());
-	  break;
-	}
-
-      case HEX:
-	{
-	  FEHex fe3d(*this);
-	  fe3d.SetElementNumber (elnr+1);
-	  return (fe3d.IsCurved());
-	  break;
-	}
-
-      }
-
-    return 0;
-  }
-
-
-    void CurvedElements :: CalcSegmentTransformation (double xi, int segnr,
-						      Point<3> * x, Vec<3> * dxdxi)
-    {
-	FESegm segm (*this);
-	segm.SetElementNumber (segnr+1);
-	segm.SetReferencePoint (Point<1>(xi));
-
-//	segm.CalcVertexShapes (x != NULL, dxdxi != NULL);
-	segm.CalcVertexShapes ();
-
-	if (x)
-	{
-	    (*x) = Point<3>(0,0,0);
-	    for (int v = 0; v < 2; v++)
-		(*x) = (*x) + segm.GetVertexShape(v) * mesh.Point(segm.GetVertexNr(v));
-	}
-
-	if (dxdxi)
-	{
-	    (*dxdxi) = Vec<3>(0,0,0);
-	    for (int v = 0; v < 2; v++)
-		(*dxdxi) = (*dxdxi) + segm.GetVertexDShape(v) * mesh.Point(segm.GetVertexNr(v));
-	}
-
-	if (segm.GetEdgeOrder() > 1)
-	{
-//	    segm.CalcEdgeShapes (x != NULL, dxdxi != NULL);
-	    segm.CalcEdgeShapes ();
-
-	    if (x)
-	    {
-		int gindex = edgecoeffsindex[segm.GetEdgeNr()-1];
-		for (int k = 2; k <= segm.GetEdgeOrder(); k++, gindex++)
-		    (*x) = (*x) + segm.GetEdgeShape(k-2) * edgecoeffs[gindex];
-	    }
-
-	    if (dxdxi)
-	    {
-		int gindex = edgecoeffsindex[segm.GetEdgeNr()-1];
-		for (int k = 2; k <= segm.GetEdgeOrder(); k++, gindex++)
-		    (*dxdxi) = (*dxdxi) + segm.GetEdgeDShape(k-2) * edgecoeffs[gindex];
-	    }
-	}
-    }
-
-
-
-    void CurvedElements :: CalcSurfaceTransformation (Point<2> xi, int elnr,
-						      Point<3> * x, Mat<3,2> * dxdxi)
-    {
-
-      if (mesh.coarsemesh)
-	{
-	  const HPRefElement & hpref_el =
-	    (*mesh.hpelements) [ mesh[(SurfaceElementIndex) elnr].hp_elnr];
-	  
-	  // xi umrechnen
-	  double lami[4];
-	  switch (mesh[(SurfaceElementIndex) elnr].GetType())
-	    {
-	    case TRIG: 
-	      {
-		lami[0] = xi(0);
-		lami[1] = xi(1);
-		lami[2] = 1-xi(0)-xi(1);
-		lami[3] = 0;
-		break;
-	      }
-	    case QUAD: 
-	      {
-		lami[0] = (1-xi(0))*(1-xi(1));
-		lami[1] = xi(0) * (1-xi(1));
-		lami[2] = xi(0) * xi(1);
-		lami[3] = (1-xi(0))*xi(1);
-		break;
-	      }
-	    }
-	  Point<2> coarse_xi(0,0);
-	  for (int i = 0; i < 4; i++)
-	    {
-	      coarse_xi(0) += hpref_el.param[i][0] * lami[i];
-	      coarse_xi(1) += hpref_el.param[i][1] * lami[i];
-	    }
-	  mesh.coarsemesh->GetCurvedElements().CalcSurfaceTransformation (coarse_xi, hpref_el.coarse_elnr, x, dxdxi);
-
-	  return;
-	}
-
-
-
-
-      const Element2d & elem = mesh[(SurfaceElementIndex) elnr];
-
-      BaseFiniteElement2D * fe2d;
-
-	// char locmem[max2(sizeof(FEQuad), sizeof(FETrig))];
-	char locmemtrig[sizeof(FETrig)];
-	char locmemquad[sizeof(FEQuad)];
-	switch (elem.GetType())
-	  {
-	  case TRIG: fe2d = new (locmemtrig) FETrig (*this); break;
-	  case QUAD: fe2d = new (locmemquad) FEQuad (*this); break;
-	  }
-
-	fe2d->SetElementNumber (elnr+1);
-	fe2d->SetReferencePoint (xi);
-
-	/*
-	for (int v = 0; v < fe2d->GetNVertices(); v++)
-	{
-	  // if (fe2d->GetVertexNr(v) == 1)
-	  fe2d->SetVertexSingularity (v, 2);
-	}
-	*/
-	/*
-	int imin = 0, imax = 0;
-	if (fe2d->GetVertexNr(1) < fe2d->GetVertexNr(0)) imin = 1;
-	if (fe2d->GetVertexNr(2) < fe2d->GetVertexNr(imin)) imin = 2;
-	if (fe2d->GetVertexNr(1) > fe2d->GetVertexNr(0)) imax = 1;
-	if (fe2d->GetVertexNr(2) > fe2d->GetVertexNr(imax)) imax = 2;
-
-	fe2d->SetVertexSingularity (imin, 3);
-	fe2d->SetVertexSingularity (3-imin-imax, 3);
-	fe2d->SetVertexSingularity (imax, 3);
-	*/
-	fe2d->CalcVertexShapes ();
-
-	if (x)
-	{
-	    (*x) = Point<3>(0,0,0);
-	    for (int v = 0; v < fe2d->GetNVertices(); v++)
-		(*x) = (*x) + fe2d->GetVertexShape(v) * mesh.Point(fe2d->GetVertexNr(v));
-	}
-
-	if (dxdxi)
-	{
-	    for (int i = 0; i < 3; i++)
-                for (int j = 0; j < 2; j++)
-                  (*dxdxi)(i,j) = 0;
-                  
-	    for (int v = 0; v < elem.GetNV(); v++)
-		for (int i = 0; i < 3; i++)
-		    for (int j = 0; j < 2; j++)
-			(*dxdxi)(i,j) += fe2d->GetVertexDShape(v)(j) * mesh.Point(fe2d->GetVertexNr(v)).X(i+1);
-	}
-
-	if (IsHighOrder())
-	{
-//	    fe2d->CalcEdgeShapes (x != NULL, dxdxi != NULL);
-	    fe2d->CalcEdgeShapes ();
-	    if (x)
-	    {
-		int index = 0;
-		for (int e = 0; e < fe2d->GetNEdges(); e++)
-		{
-		    int gindex = edgecoeffsindex[fe2d->GetEdgeNr(e)-1];
-
-		    for (int k = 2; k <= fe2d->GetEdgeOrder(e); k++, index++, gindex++)
-			(*x) = (*x) + fe2d->GetEdgeShape(index) * edgecoeffs[gindex];
- 		}
-	    }
-
-	    if (dxdxi)
-	    {
-		int index = 0;
-		for (int e = 0; e < fe2d->GetNEdges(); e++)
-		{
-		    int gindex = edgecoeffsindex[fe2d->GetEdgeNr(e)-1];
-		    for (int k = 2; k <= fe2d->GetEdgeOrder(e); k++, index++, gindex++)
-			for (int i = 0; i < 3; i++)
-			    for (int j = 0; j < 2; j++)
-				(*dxdxi)(i,j) += fe2d->GetEdgeDShape(index)(j) * edgecoeffs[gindex](i);
-		}
-	    }
-
-	    if (mesh.GetDimension() == 3)
-	    {
-//		fe2d->CalcFaceShapes (x != NULL, dxdxi != NULL);
-		fe2d->CalcFaceShapes ();
-
-		if (x)
-		{
-		    int gindex = facecoeffsindex[fe2d->GetFaceNr()-1];
-		    for (int index = 0; index < fe2d->GetNFaceShapes(); index++, gindex++)
-		    {
-			(*x) = (*x) + fe2d->GetFaceShape(index) * facecoeffs[gindex];
-		    }
-		}
-
-		if (dxdxi)
-		{
-		    int gindex = facecoeffsindex[fe2d->GetFaceNr()-1];
-		    for (int index = 0; index < fe2d->GetNFaceShapes(); index++, gindex++)
-			for (int i = 0; i < 3; i++)
-			    for (int j = 0; j < 2; j++)
-				(*dxdxi)(i,j) += fe2d->GetFaceDShape(index)(j) * facecoeffs[gindex](i);
-		}
-	    }
-	} 
-
-	fe2d -> ~BaseFiniteElement2D();
-    }	
-
-
-
-
-    void CurvedElements :: CalcElementTransformation (Point<3> xi, int elnr,
-						      Point<3> * x, Mat<3,3> * dxdxi)
-    {
-
-     if (mesh.coarsemesh)
-	{
-	  const HPRefElement & hpref_el =
-	    (*mesh.hpelements) [ mesh[(ElementIndex) elnr].hp_elnr];
-	  
-
-	  double lami[8];
-	  FlatVector vlami(8, lami);
-	  vlami = 0;
-	  mesh[(ElementIndex) elnr] . GetShapeNew (xi, vlami);
-
-	  Point<3> coarse_xi(0,0,0);
-	  for (int i = 0; i < 8; i++)
-	    for (int l = 0; l < 3; l++)
-	      coarse_xi(l) += hpref_el.param[i][l] * lami[i];
-	  
-	  Mat<3,3> trans, dxdxic;
-	  if (dxdxi)
-	    {
-	      MatrixFixWidth<3> dlami(8);
-	      dlami = 0;
-	      mesh[(ElementIndex) elnr] . GetDShapeNew (xi, dlami);	  
-	      
-	      trans = 0;
-	      for (int k = 0; k < 3; k++)
-		for (int l = 0; l < 3; l++)
-		  {
-		    double sum = 0;
-		    for (int i = 0; i < 8; i++)
-		      sum += hpref_el.param[i][l] * dlami(i, k);
-		    trans(l,k) = sum;
-		  }
-	    }
-	  
-	  mesh.coarsemesh->GetCurvedElements().CalcElementTransformation (coarse_xi, hpref_el.coarse_elnr, x, &dxdxic);
-
-	  if (dxdxi)
-	    *dxdxi = dxdxic * trans;
-	  return;
-	}
-
-
-
-
-
-
-
-
-
-	Element elem = mesh[(ElementIndex) elnr];
-	BaseFiniteElement3D * fe3d;
-
-	// char locmem[max2(sizeof(FETet), sizeof(FEPrism))];
-	char locmemtet[sizeof(FETet)];
-	char locmemprism[sizeof(FEPrism)];
-	char locmempyramid[sizeof(FEPyramid)];
-	char locmemhex[sizeof(FEHex)];
-	switch (elem.GetType())
-	{
-	    case TET: fe3d = new (locmemtet) FETet (*this); break;
-	    case PRISM: fe3d = new (locmemprism) FEPrism (*this); break;
-	    case PYRAMID: fe3d = new (locmempyramid) FEPyramid (*this); break;
-	    case HEX: fe3d = new (locmemhex) FEHex (*this); break;
-	}
-	
-	fe3d->SetElementNumber (elnr+1);
-	fe3d->SetReferencePoint (xi);
-
-	fe3d->CalcVertexShapes ();
-//	fe3d->CalcVertexShapes (x != NULL, dxdxi != NULL);
-
-	if (x)
-	{
-	    (*x) = Point<3>(0,0,0);
-	    for (int v = 0; v < fe3d->GetNVertices(); v++)
-		(*x) += fe3d->GetVertexShape(v) * Vec<3> (mesh.Point(fe3d->GetVertexNr(v)));
-	}
-
-	if (dxdxi)
-	{
-            for (int i = 0; i < 3; i++)
-                for (int j = 0; j < 3; j++)
-                    (*dxdxi)(i,j) = 0;
-                    
-	    for (int v = 0; v < fe3d->GetNVertices(); v++)
-		for (int i = 0; i < 3; i++)
-		    for (int j = 0; j < 3; j++)
-			(*dxdxi)(i,j) += fe3d->GetVertexDShape(v)(j) * mesh.Point(fe3d->GetVertexNr(v)).X(i+1);
-	}
-
-	if (IsHighOrder())
-	{
-//	    fe3d->CalcEdgeShapes (x != NULL, dxdxi != NULL);
-	    fe3d->CalcEdgeShapes ();
-
-	    if (x)
-	    {
-		int index = 0;
-		for (int e = 0; e < fe3d->GetNEdges(); e++)
-		{
-		    int gindex = edgecoeffsindex[fe3d->GetEdgeNr(e)-1];
-		    for (int k = 2; k <= fe3d->GetEdgeOrder(e); k++, index++, gindex++)
-			(*x) += fe3d->GetEdgeShape(index) * edgecoeffs[gindex];
-		}
-	    }
-
-	    if (dxdxi)
-	    {
-		int index = 0;
-		for (int e = 0; e < fe3d->GetNEdges(); e++)
-		{
-		    int gindex = edgecoeffsindex[fe3d->GetEdgeNr(e)-1];
-		    for (int k = 2; k <= fe3d->GetEdgeOrder(e); k++, index++, gindex++)
-			for (int i = 0; i < 3; i++)
-			    for (int j = 0; j < 3; j++)
-				(*dxdxi)(i,j) += fe3d->GetEdgeDShape(index)(j) * edgecoeffs[gindex](i);
-		}
-	    }
-
-	    if (mesh.GetDimension() == 3)
-	    {
-		fe3d->CalcFaceShapes ();
-//		fe3d->CalcFaceShapes (x != NULL, dxdxi != NULL);
-
-		if (x)
-		{
-		    int index = 0;
-		    for (int f = 0; f < fe3d->GetNFaces(); f++)
-		    {
-			int gindex = facecoeffsindex[fe3d->GetFaceNr(f)-1];
-			for (int k = 0; k < fe3d->GetNFaceShapes(f); k++, index++, gindex++)
-			    (*x) += fe3d->GetFaceShape(index) * facecoeffs[gindex];
-		    }
-		}
-
-		if (dxdxi)
-		{
-		    int index = 0;
-		    for (int f = 0; f < fe3d->GetNFaces(); f++)
-		    {
-			int gindex = facecoeffsindex[fe3d->GetFaceNr(f)-1];
-			for (int k = 0; k < fe3d->GetNFaceShapes(f); k++, index++, gindex++)
-			    for (int i = 0; i < 3; i++)
-				for (int j = 0; j < 3; j++)
-				    (*dxdxi)(i,j) += fe3d->GetFaceDShape(index)(j) * facecoeffs[gindex](i);
-		    }
-		}
-	    } 
-	}
-	
-	fe3d -> ~BaseFiniteElement3D();
-    }
-
-
-} // namespace netgen
-
-
diff --git a/contrib/Netgen/libsrc/meshing/curvedelems.hpp b/contrib/Netgen/libsrc/meshing/curvedelems.hpp
deleted file mode 100644
index dd11eef051039e7eb513bfa585dc41f7ac02a9c7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/curvedelems.hpp
+++ /dev/null
@@ -1,837 +0,0 @@
-#ifndef CURVEDELEMS
-#define CURVEDELEMS
-
-/**************************************************************************/
-/* File:   curvedelems.hpp                                                */
-/* Author: Robert Gaisbauer                                               */
-/* Date:   27. Sep. 02 (second version: 30. Jan. 03)                      */
-/**************************************************************************/
-
-#include "bisect.hpp"
-#include <iostream>
-
-#define EPSILON 1e-20
-
-
-
-void ComputeGaussRule (int n, ARRAY<double> & xi, ARRAY<double> & wi);
-
-
-
-
-
-// ----------------------------------------------------------------------------
-//      CurvedElements
-// ----------------------------------------------------------------------------
-
-class CurvedElements
-{
-  const Mesh & mesh;
-  const MeshTopology & top;
-
-  bool isHighOrder;
-  int nvisualsubsecs;
-  int nIntegrationPoints;
-
-  ARRAY<int> edgeorder;
-  ARRAY<int> faceorder;
-
-  /*
-
-  ARRAY< Vec<3> > edgecoeffs;
-  ARRAY< Vec<3> > facecoeffs;
-
-  ARRAY<int> edgecoeffsindex;
-  ARRAY<int> facecoeffsindex;
-
-  */
-
-  inline Vec<3> GetEdgeCoeff (int edgenr, int k);
-  inline Vec<3> GetFaceCoeff (int facenr, int k);
-
-  
-  void CalcSegmentTransformation (double xi, int segnr,
-				  Point<3> * x = NULL, Vec<3> * dxdxi = NULL);
-
-  void CalcSurfaceTransformation (Point<2> xi, int elnr,
-				  Point<3> * x = NULL, Mat<3,2> * dxdxi = NULL);
-
-  void CalcElementTransformation (Point<3> xi, int elnr,
-				  Point<3> * x = NULL, Mat<3,3> * dxdxi = NULL);
-
-public:
-
-  Refinement * refinement;
-
-  ARRAY< Vec<3> > edgecoeffs;
-  ARRAY< Vec<3> > facecoeffs;
-
-  ARRAY<int> edgecoeffsindex;
-  ARRAY<int> facecoeffsindex;
-
-
-
-
-
-  CurvedElements (const Mesh & amesh);
-  ~CurvedElements();
-
-  bool IsHighOrder() const
-  { return isHighOrder; };
-  void SetHighOrder () { isHighOrder = 1; }
-
-
-  int GetNVisualSubsecs() const
-  { return nvisualsubsecs; };
-
-  const class Mesh & GetMesh() const
-  { return mesh; };
-
-  void BuildCurvedElements(Refinement * ref, int polydeg);
-
-  int GetEdgeOrder (int edgenr) const
-  { return edgeorder[edgenr]; };
-
-  int GetFaceOrder (int facenr) const
-  { return faceorder[facenr]; };
-
-  int IsEdgeCurved (int edgenr) const;
-
-  int IsFaceCurved (int facenr) const;
-
-  int IsSurfaceElementCurved (int elnr) const;
-
-  int IsElementCurved (int elnr) const;
-
-
-  void CalcSegmentTransformation (double xi, int segnr,
-				  Point<3> & x)
-  { CalcSegmentTransformation (xi, segnr, &x, NULL); };
-
-  void CalcSegmentTransformation (double xi, int segnr,
-				  Vec<3> & dxdxi)
-  { CalcSegmentTransformation (xi, segnr, NULL, &dxdxi); };
-
-  void CalcSegmentTransformation (double xi, int segnr,
-				  Point<3> & x, Vec<3> & dxdxi)
-  { CalcSegmentTransformation (xi, segnr, &x, &dxdxi); };
-
-
-  void CalcSurfaceTransformation (Point<2> & xi, int elnr,
-				  Point<3> & x)
-  { CalcSurfaceTransformation (xi, elnr, &x, NULL); };
-
-  void CalcSurfaceTransformation (Point<2> & xi, int elnr,
-				  Mat<3,2> & dxdxi)
-  { CalcSurfaceTransformation (xi, elnr, NULL, &dxdxi); };
-
-  void CalcSurfaceTransformation (Point<2> & xi, int elnr,
-				  Point<3> & x, Mat<3,2> & dxdxi)
-  { CalcSurfaceTransformation (xi, elnr, &x, &dxdxi); };
-
-
-  void CalcElementTransformation (Point<3> xi, int elnr,
-				  Point<3> & x)
-  { CalcElementTransformation (xi, elnr, &x, NULL); };
-
-  void CalcElementTransformation (Point<3> xi, int elnr,
-				  Mat<3,3> & dxdxi)
-  { CalcElementTransformation (xi, elnr, NULL, &dxdxi); };
-
-  void CalcElementTransformation (Point<3> xi, int elnr,
-				  Point<3> & x, Mat<3,3> & dxdxi)
-  { CalcElementTransformation (xi, elnr, &x, &dxdxi); };
-
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      PolynomialBasis
-// ----------------------------------------------------------------------------
-
-class PolynomialBasis
-{
-  int order;
-  int maxorder;
-  ArrayMem<double,20> f;
-  ArrayMem<double,20> df;
-  ArrayMem<double,20> ddf;
-
-  ArrayMem<double,20> lp;
-  ArrayMem<double,20> dlp;
-
-  inline void CalcLegendrePolynomials (double x);
-  inline void CalcDLegendrePolynomials (double x);
-
-public:
-
-  PolynomialBasis ()
-  { maxorder = -1; };
-
-  ~PolynomialBasis ()
-  {};
-
-  void SetOrder (int aorder)
-  {
-    order = aorder;
-    if (order > maxorder)
-      {
-	maxorder = order;
-	f.SetSize(order-1);
-	df.SetSize(order-1);
-	ddf.SetSize(order-1);
-	lp.SetSize(order+1);
-	dlp.SetSize(order);
-      };
-  };
-
-  inline void CalcF (double x);
-  inline void CalcDf (double x);
-  inline void CalcDDf (double x);
-
-  inline void CalcFDf (double x);
-
-  double GetF (int p) { return f[p-2]; };
-  double GetDf (int p) { return df[p-2]; };
-  double GetDDf (int p) { return ddf[p-2]; };
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      BaseFiniteElement
-// ----------------------------------------------------------------------------
-
-template <int DIM>
-class BaseFiniteElement
-{
-protected:
-
-  Point<DIM> xi;
-  int elnr;
-  const CurvedElements & curv;
-  const Mesh & mesh;
-  const MeshTopology & top;
-
-public:
-
-  BaseFiniteElement(const CurvedElements & acurv)
-    : curv(acurv), mesh(curv.GetMesh()), top(mesh.GetTopology())
-  {};
-
-  virtual ~BaseFiniteElement()
-  {};
-
-  void SetElementNumber (int aelnr)
-  { elnr = aelnr; }; // 1-based arrays in netgen
-
-  virtual void SetReferencePoint (Point<DIM> axi)
-  { xi = axi; };
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      BaseFiniteElement1D
-// ----------------------------------------------------------------------------
-
-class BaseFiniteElement1D : public BaseFiniteElement<1>
-{
-protected:
-  PolynomialBasis b;
-
-  int vertexnr[2];
-  int edgenr;
-  int edgeorient;
-  int edgeorder;
-
-  int maxedgeorder;
-
-  double vshape[2];
-  double vdshape[2];
-  ArrayMem<double,20> eshape;
-  ArrayMem<double,20> edshape;
-  ArrayMem<double,20> eddshape;
-
-public:
-
-  BaseFiniteElement1D (const CurvedElements & acurv) : BaseFiniteElement<1>(acurv)
-  { maxedgeorder = 1; };
-
-  virtual ~BaseFiniteElement1D()
-  {};
-
-  int GetVertexNr (int v)
-  { return vertexnr[v]; };
-
-  int GetEdgeNr ()
-  { return edgenr; };
-
-  int GetEdgeOrder ()
-  { return edgeorder; };
-
-  int GetEdgeOrientation ()
-  { return edgeorient; };
-
-  void CalcVertexShapes();
-  void CalcEdgeShapes();
-  void CalcEdgeLaplaceShapes();
-
-  double GetVertexShape (int v)
-  { return vshape[v]; };
-
-  double GetEdgeShape (int index)
-  { return eshape[index]; };
-
-  double GetVertexDShape (int v)
-  { return vdshape[v]; };
-
-  double GetEdgeDShape (int index)
-  { return edshape[index]; };
-
-  double GetEdgeLaplaceShape (int index)
-  { return eddshape[index]; };
-
-};
-
-
-
-
-// ----------------------------------------------------------------------------
-//      FESegm
-// ----------------------------------------------------------------------------
-
-class FESegm : public BaseFiniteElement1D
-{
-
-public:
-
-  FESegm(const CurvedElements & acurv) : BaseFiniteElement1D(acurv)
-  {};
-
-  virtual ~FESegm()
-  {};
-
-  void SetElementNumber (int aelnr)
-  { 
-    BaseFiniteElement<1> :: SetElementNumber (aelnr);
-    Segment s = mesh.LineSegment(elnr);
-    vertexnr[0] = s.p1;
-    vertexnr[1] = s.p2;
-    edgenr = top.GetSegmentEdge(elnr);
-    edgeorient = top.GetSegmentEdgeOrientation(elnr);
-    edgeorder = curv.GetEdgeOrder(edgenr-1); // 1-based arrays in netgen
-
-    if (edgeorder > maxedgeorder)
-      {
-	maxedgeorder = edgeorder;
-	eshape.SetSize(maxedgeorder-1);
-	edshape.SetSize(maxedgeorder-1);
-	eddshape.SetSize(maxedgeorder-1);
-      }
-  };
-
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      FEEdge
-// ----------------------------------------------------------------------------
-
-class FEEdge : public BaseFiniteElement1D
-{
-
-public:
-
-  FEEdge(const CurvedElements & acurv) : BaseFiniteElement1D(acurv)
-  {};
-
-  virtual ~FEEdge()
-  {};
-
-  void SetElementNumber (int aelnr)
-  { 
-    BaseFiniteElement<1> :: SetElementNumber (aelnr);
-    top.GetEdgeVertices (elnr, vertexnr[0], vertexnr[1]);
-    edgenr = elnr;
-    edgeorient = 1;
-    edgeorder = curv.GetEdgeOrder(edgenr-1); // 1-based arrays in netgen
-
-    if (edgeorder > maxedgeorder)
-      {
-	maxedgeorder = edgeorder;
-	eshape.SetSize(maxedgeorder-1);
-	edshape.SetSize(maxedgeorder-1);
-	eddshape.SetSize(maxedgeorder-1);
-      }
-  };
-    
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      BaseFiniteElement2D
-// ----------------------------------------------------------------------------
-
-class BaseFiniteElement2D : public BaseFiniteElement<2>
-{
-protected:
-
-  int nvertices;
-  int nedges;
-
-  int vertexnr[4];
-  int edgenr[4];
-  int edgeorient[4];
-  int edgeorder[4];
-  int facenr;
-  int faceorient;
-  int faceorder;
- 
-  int nfaceshapes;
-
-  int maxedgeorder;
-  int maxfaceorder;
-
-  PolynomialBasis b1, b2;
-
-  double vshape[4];
-  Vec<2> vdshape[4];
-  ArrayMem<double,80> eshape;
-  ArrayMem< Vec<2>,80> edshape;
-  ArrayMem<double,400> fshape;
-  ArrayMem<Vec<2>,400> fdshape;
-  ArrayMem<double,400> fddshape;
-
-  virtual void CalcNFaceShapes () = 0;
-
-public:
-
-  BaseFiniteElement2D (const CurvedElements & acurv) : BaseFiniteElement<2>(acurv)
-  { maxedgeorder = maxfaceorder = -1; };
-
-    virtual ~BaseFiniteElement2D()
-	{};
-
-  void SetElementNumber (int aelnr);
-
-  virtual void SetVertexSingularity (int v, int exponent) = 0;
-
-  int GetVertexNr (int v)
-  { return vertexnr[v]; };
-
-  int GetEdgeNr (int e)
-  { return edgenr[e]; };
-
-  int GetFaceNr ()
-  { return facenr; };
-
-  int GetEdgeOrder (int e)
-  { return edgeorder[e]; };
-
-  int GetFaceOrder ()
-  { return faceorder; }
-
-  int GetNVertices ()
-  { return nvertices; };
-
-  int GetNEdges ()
-  { return nedges; };
-
-  int GetNFaceShapes ()
-  { return nfaceshapes; };
-
-  int IsCurved ()
-  {
-    bool iscurved = 0;
-    int e;
-
-    for (e = 0; e < GetNEdges(); e++)
-      iscurved = iscurved || (GetEdgeOrder(e) > 1);
-
-    return iscurved || (GetFaceOrder() > 1);
-  }
-
-  virtual void CalcVertexShapes() = 0;
-  virtual void CalcEdgeShapes() = 0; 
-  virtual void CalcFaceShapes() = 0;
-
-  virtual void CalcFaceLaplaceShapes() = 0;
-
-  double GetVertexShape (int v)
-  { return vshape[v]; };
-
-  double GetEdgeShape (int index)
-  { return eshape[index]; };
-
-  double GetFaceShape (int index)
-  { return fshape[index]; };
-
-  Vec<2> GetVertexDShape (int v)
-  { return vdshape[v]; };
-
-  Vec<2> GetEdgeDShape (int index)
-  { return edshape[index]; };
-
-  Vec<2> GetFaceDShape (int index)
-  { return fdshape[index]; };
-
-  double GetFaceLaplaceShape (int index)
-  { return fddshape[index]; };
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      FETrig
-// ----------------------------------------------------------------------------
-
-class FETrig : public BaseFiniteElement2D
-{
-  Point<3> lambda;
-  Mat<3,2> dlambda;
-
-  const ELEMENT_EDGE * eledge;
-  const ELEMENT_FACE * elface;
-
-  virtual void CalcNFaceShapes ()
-  { nfaceshapes = ((faceorder-1)*(faceorder-2))/2; };
-
-public:
-
-  FETrig (const CurvedElements & acurv) : BaseFiniteElement2D(acurv)
-  {
-    nvertices = 3;
-    nedges = 3;
-    eledge = MeshTopology :: GetEdges (TRIG);
-    elface = MeshTopology :: GetFaces (TRIG);
-  };
-
-    virtual ~FETrig()
-	{};
-
-  virtual void SetReferencePoint (Point<2> axi);
-
-  virtual void SetVertexSingularity (int v, int exponent);
-
-  virtual void CalcVertexShapes();
-  virtual void CalcEdgeShapes();
-  virtual void CalcFaceShapes();
-
-  virtual void CalcFaceLaplaceShapes();
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      FEQuad
-// ----------------------------------------------------------------------------
-
-class FEQuad : public BaseFiniteElement2D
-{
-  const ELEMENT_FACE * elface;
-
-  virtual void CalcNFaceShapes ()
-  { nfaceshapes = (faceorder-1)*(faceorder-1); };
-
-public:
-
-  FEQuad (const CurvedElements & acurv) : BaseFiniteElement2D(acurv)
-  {
-    nvertices = 4;
-    nedges = 4;
-    elface = MeshTopology :: GetFaces (QUAD);
-  };
-
-    virtual ~FEQuad()
-	{};
-
-  virtual void SetVertexSingularity (int /* v */, int /* exponent */)
-	{};
-
-  virtual void CalcVertexShapes();
-  virtual void CalcEdgeShapes();
-  virtual void CalcFaceShapes();
-
-  virtual void CalcFaceLaplaceShapes();
-};
-
-
-
-
-// ----------------------------------------------------------------------------
-//      BaseFiniteElement3D
-// ----------------------------------------------------------------------------
-
-class BaseFiniteElement3D : public BaseFiniteElement<3>
-{
-protected:
-
-  int nvertices;
-  int nedges;
-  int nfaces;
-
-  int vertexnr[8];
-  int edgenr[12];
-  int edgeorient[12];
-  int edgeorder[12];
-  int facenr[6];
-  int faceorient[6];
-  int faceorder[6];
-  int surfacenr[6];
-  // int surfaceorient[6];
-
-  int nfaceshapes[6];
-
-  int maxedgeorder;
-  int maxfaceorder;
-
-  PolynomialBasis b1, b2;
-
-  double vshape[8];
-  Vec<3> vdshape[8];
-  ArrayMem<double,120> eshape;
-  ArrayMem<Vec<3>,120> edshape;
-  ArrayMem<double,2000> fshape;
-  ArrayMem<Vec<3>,2000> fdshape;
-
-  virtual void CalcNFaceShapes () = 0;
-
-public:
-
-  int locmaxedgeorder;
-  int locmaxfaceorder;
-
-  BaseFiniteElement3D (const CurvedElements & acurv) : BaseFiniteElement<3>(acurv)
-  { maxedgeorder = maxfaceorder = -1; };
-
-  void SetElementNumber (int aelnr);
-
-  int GetVertexNr (int v)
-  { return vertexnr[v]; };
-
-  int GetEdgeNr (int e)
-  { return edgenr[e]; };
-
-  int GetFaceNr (int f)
-  { return facenr[f]; };
-
-  int GetNFaceShapes (int f)
-  { return nfaceshapes[f]; };
-
-  int GetEdgeOrder (int e)
-  { return edgeorder[e]; };
-
-  int GetFaceOrder (int f)
-  { return faceorder[f]; };
-
-  int GetNVertices ()
-  { return nvertices; };
-
-  int GetNEdges ()
-  { return nedges; };
-
-  int GetNFaces ()
-  { return nfaces; };
-
-  int IsCurved ()
-  {
-    bool iscurved = 0;
-    int e, f;
-
-    for (e = 0; e < GetNEdges(); e++)
-      iscurved = iscurved || (GetEdgeOrder(e) > 1);
-
-    for (f = 0; f < GetNFaces(); f++)
-      iscurved = iscurved || (GetFaceOrder(f) > 1);
-
-    return iscurved;
-  }
-
-  virtual void CalcVertexShapes() = 0;
-  virtual void CalcEdgeShapes() = 0;
-  virtual void CalcFaceShapes() = 0;
-
-  double GetVertexShape (int v)
-  { return vshape[v]; };
-
-  double GetEdgeShape (int index)
-  { return eshape[index]; };
-
-  double GetFaceShape (int index)
-  { return fshape[index]; };
-
-  Vec<3> GetVertexDShape (int v)
-  { return vdshape[v]; };
-
-  Vec<3> GetEdgeDShape (int index)
-  { return edshape[index]; };
-
-  Vec<3> GetFaceDShape (int index)
-  { return fdshape[index]; };
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      FETet
-// ----------------------------------------------------------------------------
-
-class FETet : public BaseFiniteElement3D
-{
-  Point<4> lambda;
-  Mat<4,3> dlambda;
-
-  const ELEMENT_EDGE * eledge;
-  const ELEMENT_FACE * elface;
-
-  virtual void CalcNFaceShapes ()
-  {
-    for (int f = 0; f < nfaces; f++)
-      nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;
-  };
-
-public:
-
-  FETet (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)
-  {
-    nvertices = 4;
-    nedges = 6;
-    nfaces = 4;
-    eledge = MeshTopology :: GetEdges (TET);
-    elface = MeshTopology :: GetFaces (TET);
-  };
-
-  void SetReferencePoint (Point<3> axi);
-
-  virtual void CalcVertexShapes();
-  virtual void CalcEdgeShapes();
-  virtual void CalcFaceShapes();
-};
-
-
-
-// ----------------------------------------------------------------------------
-//      FEPrism
-// ----------------------------------------------------------------------------
-
-class FEPrism : public BaseFiniteElement3D
-{
-  Point<4> lambda;   // mixed barycentric coordinates
-  Mat<4,3> dlambda;
-
-  const ELEMENT_EDGE * eledge;
-  const ELEMENT_FACE * elface;
-
-  virtual void CalcNFaceShapes ()
-  {
-    int f;
-    for (f = 0; f < 2; f++)
-      nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;
-    for (f = 2; f < nfaces; f++)
-      nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);
-  };
-
-public:
-
-  FEPrism (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)
-  {
-    nvertices = 6;
-    nedges = 9;
-    nfaces = 5;
-    eledge = MeshTopology :: GetEdges (PRISM);
-    elface = MeshTopology :: GetFaces (PRISM);
-  };
-
-  void SetReferencePoint (Point<3> axi);
-
-  virtual void CalcVertexShapes();
-  virtual void CalcEdgeShapes();
-  virtual void CalcFaceShapes();
-};
-
-
-
-
-// ----------------------------------------------------------------------------
-//      FEPyramid
-// ----------------------------------------------------------------------------
-
-class FEPyramid : public BaseFiniteElement3D
-{
-
-  const ELEMENT_EDGE * eledge;
-  const ELEMENT_FACE * elface;
-
-  virtual void CalcNFaceShapes ()
-  {
-    int f;
-    for (f = 0; f < 4; f++)
-      nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;
-    for (f = 4; f < nfaces; f++)
-      nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);
-  };
-
-public:
-
-  FEPyramid (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)
-  {
-    nvertices = 5;
-    nedges = 8;
-    nfaces = 5;
-    eledge = MeshTopology :: GetEdges (PYRAMID);
-    elface = MeshTopology :: GetFaces (PYRAMID);
-  };
-
-  void SetReferencePoint (Point<3> axi);
-
-  virtual void CalcVertexShapes();
-  virtual void CalcEdgeShapes();
-  virtual void CalcFaceShapes();
-};
-
-
-
-
-// ----------------------------------------------------------------------------
-//      FEHex
-// ----------------------------------------------------------------------------
-
-class FEHex : public BaseFiniteElement3D
-{
-
-  const ELEMENT_EDGE * eledge;
-  const ELEMENT_FACE * elface;
-
-  virtual void CalcNFaceShapes ()
-  {
-    int f;
-    for (f = 0; f < 6; f++)
-      nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);
-  };
-
-public:
-
-  FEHex (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)
-  {
-    nvertices = 8;
-    nedges = 12;
-    nfaces = 6;
-    eledge = MeshTopology :: GetEdges (HEX);
-    elface = MeshTopology :: GetFaces (HEX);
-  };
-
-  void SetReferencePoint (Point<3> axi);
-
-  virtual void CalcVertexShapes();
-  virtual void CalcEdgeShapes();
-  virtual void CalcFaceShapes();
-};
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/curvedelems2.cpp b/contrib/Netgen/libsrc/meshing/curvedelems2.cpp
deleted file mode 100644
index 6b79ee5fe92949eba6a2f03c0db2b682615883f8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/curvedelems2.cpp
+++ /dev/null
@@ -1,752 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-
-namespace netgen
-{
-    
-
-// ----------------------------------------------------------------------------
-//      CurvedElements
-// ----------------------------------------------------------------------------
-
-    CurvedElements :: CurvedElements (const Mesh & amesh)
-	: mesh(amesh), top(mesh.GetTopology())
-    {
-	isHighOrder = 0;
-	nvisualsubsecs = 2;
-	nIntegrationPoints = 10;
-    }
-
-
-    CurvedElements :: ~CurvedElements ()
-    {
-      ;
-    }
-
-
-    void CurvedElements :: BuildCurvedElements(Refinement * ref, int polydeg)
-    {
-      if (mesh.coarsemesh)
-	{
-	  mesh.coarsemesh->GetCurvedElements().BuildCurvedElements (ref, polydeg);
-	  SetHighOrder();
-	  return;
-	}
-
-      PrintMessage (2, "Build curved elements, order = ", polydeg);
-
-      NgLock lock(const_cast<Mesh&>(mesh).Mutex(), 1);
-      isHighOrder = 0;
-      lock.UnLock();
-
-	const_cast<Mesh &>(mesh).UpdateTopology();
-
-	// set order of edges and faces
-
-	BaseFiniteElement2D * fe2d;
-
-	FEEdge edge (*this);
-	FESegm segm (*this);
-	FETrig trig (*this);
-	FEQuad quad (*this);
-
-	int i, k, e, f;
-
-	ARRAY<bool> edgedone;
-
-	edgedone.SetSize (top.GetNEdges());
-
-	edgeorder.SetSize (top.GetNEdges());
-	faceorder.SetSize (top.GetNFaces());
-
-	int nedgestocurve = mesh.GetNSeg();
-
-	edgedone = 0;
-	edgeorder = 1;
-	faceorder = 1;
-	
-	/*
-	for (e = 0; e < top.GetNEdges(); e++)
-	  {
-	    edgedone = 0;
-	    edgeorder[e] = 1;
-	  }
-
-	for (f = 0; f < top.GetNFaces(); f++)
-	    faceorder[f] = 1;
-	*/
-
-	for (i = 1; i <= mesh.GetNSeg(); i++) 
-	    edgeorder[top.GetSegmentEdge(i)-1] = polydeg;
-
-
-	if (mesh.GetDimension() == 3)
-	  {
-	    for (i = 1; i <= mesh.GetNSE(); i++)
-	      {
-		faceorder[top.GetSurfaceElementFace(i)-1] = polydeg;
-		
-		Element2d elem = mesh[(SurfaceElementIndex) (i-1)];
-		
-		ARRAY<int> edgenrs;
-		top.GetSurfaceElementEdges(i, edgenrs);
-		
-		nedgestocurve += top.GetNEdges(elem.GetType());
-		
-		for (int e = 0; e < top.GetNEdges(elem.GetType()); e++)
-		  edgeorder[edgenrs[e]-1] = polydeg;
-	      }
-	  }
-
-	if (polydeg == 1)
-	{
-	    isHighOrder = 0;
-	    return;
-	}
-
-	PrintMessage (1, "Building curved elements, order = ", polydeg);
-	PushStatusF ("curving edges");
-
-
-
-        // set edgecoeffs and facecoeffs arrays index and size
-
-	edgecoeffsindex.SetSize (top.GetNEdges()+1);
-	facecoeffsindex.SetSize (top.GetNFaces()+1);
-
-	edgecoeffsindex[0] = 0;
-	for (e = 2; e <= top.GetNEdges()+1; e++)
-	    edgecoeffsindex[e-1] = edgecoeffsindex[e-2] + edgeorder[e-2]-1;
-
-	facecoeffsindex[0] = 0;
-	for (f = 2; f <= top.GetNFaces()+1; f++)
-	{
-	    switch (top.GetFaceType (f-1))
-	    {
-		case TRIG:
-		    facecoeffsindex[f-1] = facecoeffsindex[f-2] + 
-			(faceorder[f-2]-1)*(faceorder[f-2]-2)/2;
-		    break;
-		case QUAD:
-		    facecoeffsindex[f-1] = facecoeffsindex[f-2] +
-			(faceorder[f-2]-1)*(faceorder[f-2]-1);
-		    break;
-	    }
-	}
-
-	edgecoeffs.SetSize(edgecoeffsindex[top.GetNEdges()]);
-	facecoeffs.SetSize(facecoeffsindex[top.GetNFaces()]);
-
-
-        
-	// evaluate edge points
-
-	PointGeomInfo newgi;          // dummy variable, only needed for function call
-	EdgePointGeomInfo newepgi;    // dummy variable, only needed for function call
-	Point3d xexact;               // new point to be stored in ARRAY edgepts
-
-	ARRAY<double> xi, wi;
-	ComputeGaussRule(nIntegrationPoints, xi, wi);
-
-	for (i=0; i<edgecoeffsindex[top.GetNEdges()]; i++)
-	    edgecoeffs[i] = Vec<3>(0.,0.,0.);
-
-
-
-
-	// all edges belonging to segments
-
-	for (i=0; i<mesh.GetNSeg(); i++) 
-	{
-	  if (multithread.terminate) return;
-
-	  SetThreadPercent( double(100*i/nedgestocurve) );
-
-	  int edgenr = top.GetSegmentEdge(i+1);
-
-	  if (edgedone[edgenr-1]) continue;
-
-	  edgedone[edgenr-1] = 1;
-
-            Segment s = mesh.LineSegment(i+1); 
-
-	    segm.SetElementNumber (i+1);
-	
-	    for (k = 2; k <= segm.GetEdgeOrder(); k++)
-	      edgecoeffs[edgecoeffsindex[edgenr-1]+k-2] = Vec<3>(0.,0.,0.);
-
-	    for (int l = 0; l < nIntegrationPoints; l++)
-	      {
-		segm.SetReferencePoint (Point<1>(xi[l]));
-		segm.CalcVertexShapes ();
-		segm.CalcEdgeLaplaceShapes ();
-		
-		Point<3> xv(0,0,0);
-
-		for (int v = 0; v < 2; v++)
-		  xv = xv + segm.GetVertexShape(v) * mesh.Point(segm.GetVertexNr(v));
-		  		
-		double secpoint = xi[l];
-
-		ref->PointBetween (mesh.Point(segm.GetVertexNr(1)),
-				   mesh.Point(segm.GetVertexNr(0)), secpoint,
-				   s.surfnr2, s.surfnr1,
-				   s.epgeominfo[1], s.epgeominfo[0],
-				   xexact, newepgi);
-		
-		for (int k = 2; k <= segm.GetEdgeOrder(); k++)
-		  edgecoeffs[edgecoeffsindex[edgenr-1]+k-2] -=
-		    wi[l] * segm.GetEdgeLaplaceShape(k-2) * Vec<3>(xexact - xv);
-		
-	      }
-	    
-	    for (k = 2; k <= segm.GetEdgeOrder(); k++)
-	      edgecoeffs[edgecoeffsindex[edgenr-1]+k-2] =
-		(2.0*(k-1.0)+1.0)*edgecoeffs[edgecoeffsindex[edgenr-1]+k-2];
-	
-	}
-
-
-
-
-
-	// all edges belonging to surface elements
-	
-	if (mesh.GetDimension() == 3)
-	  {
-	    int nedgescurved = mesh.GetNSeg();
-	    for (int i=0; i<mesh.GetNSE(); i++) 
-	      {
-		if (multithread.terminate) return;
-		
-		//		SetThreadPercent( double(100*(mesh.GetNSeg()+i)/nedgestocurve) );
-		Element2d elem = mesh[(SurfaceElementIndex) i];
-		const ELEMENT_EDGE * eledges = MeshTopology::GetEdges(elem.GetType());
-		
-		ARRAY<int> edgenrs;
-		ARRAY<int> orient;
-		top.GetSurfaceElementEdges(i+1, edgenrs);
-		top.GetSurfaceElementEdgeOrientations(i+1, orient);
-
-		for (int e = 0; e < top.GetNEdges(elem.GetType()); e++)
-		  {
-//		    cout << "e = " << e << "/" << top.GetNEdges(elem.GetType()) <<  endl;
-
-		    nedgescurved++;
-
-		    if (edgedone[edgenrs[e]-1]) continue;
-		    
-		    edgedone[edgenrs[e]-1] = 1;
-
-		    SetThreadPercent( double(100*(nedgescurved)/nedgestocurve) );
-
-		    edge.SetElementNumber (edgenrs[e]);
-
-		    for (k = 2; k <= edge.GetEdgeOrder(); k++)
-		      edgecoeffs[edgecoeffsindex[edgenrs[e]-1]+k-2] = Vec<3>(0.,0.,0.);
-
-		    for (int l = 0; l < nIntegrationPoints; l++)
-		      {
-//			cout << "." << flush;
-			edge.SetReferencePoint (Point<1>(xi[l]));
-			edge.CalcVertexShapes ();
-			edge.CalcEdgeLaplaceShapes ();
-			
-			Point<3> xv(0,0,0);
-			for (int v = 0; v < 2; v++)
-			  xv = xv + edge.GetVertexShape(v) * mesh.Point(edge.GetVertexNr(v));
-
-			double secpoint = xi[l];
-
-			if (orient[e] == 1)
-			  ref->PointBetween (mesh.Point(edge.GetVertexNr(1)),
-					     mesh.Point(edge.GetVertexNr(0)), secpoint,
-					     mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr(),
-					     elem.GeomInfoPi(eledges[e][1]),
-					     elem.GeomInfoPi(eledges[e][0]),
-					     xexact, newgi);
-			else
-			  ref->PointBetween (mesh.Point(edge.GetVertexNr(1)),
-					     mesh.Point(edge.GetVertexNr(0)), secpoint,
-					     mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr(),
-					     elem.GeomInfoPi(eledges[e][0]),
-					     elem.GeomInfoPi(eledges[e][1]),
-					     xexact, newgi);
-
-			for (k = 2; k <= edge.GetEdgeOrder(); k++)
-			  edgecoeffs[edgecoeffsindex[edgenrs[e]-1]+k-2] -=
-			    wi[l] * edge.GetEdgeLaplaceShape(k-2) * Vec<3>(xexact - xv);
-		      }	
-//		    cout << endl;
-		    for (k = 2; k <= edge.GetEdgeOrder(); k++)
-		      edgecoeffs[edgecoeffsindex[edgenrs[e]-1]+k-2] =
-			(2.0*(k-1.0)+1.0)*edgecoeffs[edgecoeffsindex[edgenrs[e]-1]+k-2];
-		    
-		}
-	      }
-	  }
-
-
-
-
-/*
-
-	// L2-Projection for edges
-
-
-	cout << "WARNING: L2-Projection for edges" << endl;
-
-	if (mesh.GetDimension() == 3)
-	{
-	    for (int i=0; i<mesh.GetNSE(); i++) 
-	    {
-		Element2d elem = mesh[(SurfaceElementIndex) i];
-		const ELEMENT_EDGE * eledges = MeshTopology::GetEdges(elem.GetType());
-		
-		ARRAY<int> edgenrs;
-		ARRAY<int> orient;
-		top.GetSurfaceElementEdges(i+1, edgenrs);
-		top.GetSurfaceElementEdgeOrientations(i+1, orient);
-		
-		for (int e = 0; e < top.GetNEdges(elem.GetType()); e++)
-		{
-		    edge.SetElementNumber (edgenrs[e]);
-
-		    int npoints = edge.GetEdgeOrder()-1;
-
-		    if (npoints == 0) continue;
-
-		    DenseMatrix mat(npoints);
-		    DenseMatrix inv(npoints);
-		    Vector vec[3];
-	    
-		    for (int k = 0; k < 3; k++)
-		    {
-			vec[k].SetSize(npoints);
-			for (int n = 1; n <= npoints; n++) vec[k].Set(n, 0.);
-		    }
-		    
-		    for (int l = 0; l < nIntegrationPoints; l++)
-		    {
-			double w = wi[l];
-			
-			edge.SetReferencePoint (Point<1>(xi[l]));
-			edge.CalcVertexShapes ();
-			edge.CalcEdgeShapes ();
-		
-			for (int n = 0; n < npoints; n++)
-			    for (int m = 0; m < npoints; m++)
-				mat.Set(n+1, m+1, mat.Get(n+1,m+1) +
-					edge.GetEdgeShape(n) * edge.GetEdgeShape(m) * w);
-		
-			Point<3> xv(0,0,0);
-			for (int v = 0; v < 2; v++)
-			    xv = xv + edge.GetVertexShape(v) * mesh.Point(edge.GetVertexNr(v));
-			
-			double secpoint = xi[l];
-			
-			ref->PointBetween (mesh.Point(edge.GetVertexNr(1)),
-					   mesh.Point(edge.GetVertexNr(0)), secpoint,
-					   mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr(),
-					   elem.GeomInfoPi(eledges[e][1]),
-					   elem.GeomInfoPi(eledges[e][0]),
-					   xexact, newgi);
-		
-			for (int k = 2; k <= edge.GetEdgeOrder(); k++)
-			{
-			    vec[0].Set(k-1, vec[0].Get(k-1) + Vec<3>(xexact - xv)(0)*edge.GetEdgeShape(k-2)*w );
-			    vec[1].Set(k-1, vec[1].Get(k-1) + Vec<3>(xexact - xv)(1)*edge.GetEdgeShape(k-2)*w );
-			    vec[2].Set(k-1, vec[2].Get(k-1) + Vec<3>(xexact - xv)(2)*edge.GetEdgeShape(k-2)*w );
-			}
-		
-		    }
-
-
-		    CalcInverse(mat,inv);
-	    
-		    Vector a0, a1, a2;
-		    
-		    a0 = inv*vec[0];
-		    a1 = inv*vec[1];
-		    a2 = inv*vec[2];
-
-		    int index = edgecoeffsindex[edge.GetEdgeNr()-1];
-
-		    for (int n = 0; n < npoints; n++, index++)
-			edgecoeffs[index] =  Vec<3>(a0(n+1), a1(n+1), a2(n+1));
-		}
-	    }
-	}
-
-
-	for (int i=0; i<mesh.GetNSeg(); i++) 
-	{
-	    int edgenr = top.GetSegmentEdge(i+1);
-
-            Segment s = mesh.LineSegment(i+1); 
-
-	    segm.SetElementNumber (i+1);
-
-	    int npoints = segm.GetEdgeOrder()-1;
-
-	    if (npoints == 0) continue;
-
-	    DenseMatrix mat(npoints);
-	    DenseMatrix inv(npoints);
-	    Vector vec[3];
-
-	    for (int k = 0; k < 3; k++)
-	    {
-		vec[k].SetSize(npoints);
-		for (int n = 1; n <= npoints; n++) vec[k].Set(n, 0.);
-	    }
-	
-	    for (int l = 0; l < nIntegrationPoints; l++)
-	    {
-		double w = wi[l];
-
-		segm.SetReferencePoint (Point<1>(xi[l]));
-		segm.CalcVertexShapes ();
-		segm.CalcEdgeShapes ();
-		
-		for (int n = 0; n < npoints; n++)
-		    for (int m = 0; m < npoints; m++)
-			mat.Set(n+1, m+1, mat.Get(n+1,m+1) +
-				segm.GetEdgeShape(n) * segm.GetEdgeShape(m) * w);
-		
-		Point<3> xv(0,0,0);
-		for (int v = 0; v < 2; v++)
-		    xv = xv + segm.GetVertexShape(v) * mesh.Point(segm.GetVertexNr(v));
-		
-		double secpoint = xi[l];
-		
-		if (segm.GetEdgeOrientation() == -1) secpoint = 1. - secpoint; // reverse orientation
-		
-		ref->PointBetween (mesh.Point(segm.GetVertexNr(1)),
-				   mesh.Point(segm.GetVertexNr(0)), secpoint,
-				   s.surfnr2, s.surfnr1,
-				   s.epgeominfo[1], s.epgeominfo[0],
-				   xexact, newepgi);
-		
-		for (int k = 2; k <= segm.GetEdgeOrder(); k++)
-		{
-		    vec[0].Set(k-1, vec[0].Get(k-1) + Vec<3>(xexact - xv)(0)*segm.GetEdgeShape(k-2)*w );
-		    vec[1].Set(k-1, vec[1].Get(k-1) + Vec<3>(xexact - xv)(1)*segm.GetEdgeShape(k-2)*w );
-		    vec[2].Set(k-1, vec[2].Get(k-1) + Vec<3>(xexact - xv)(2)*segm.GetEdgeShape(k-2)*w );
-		}
-		
-	    }
-
-
-	    CalcInverse(mat,inv);
-	    
-	    Vector a0, a1, a2;
-
-	    a0 = inv*vec[0];
-	    a1 = inv*vec[1];
-	    a2 = inv*vec[2];
-
-	    int index = edgecoeffsindex[segm.GetEdgeNr()-1];
-
-	    for (int n = 0; n < npoints; n++, index++)
-		edgecoeffs[index] =  Vec<3>(a0(n+1), a1(n+1), a2(n+1));
-
-
-
-	}
-
-*/
-
-
-
-
-
-	// evaluate face points
-
-	if (mesh.GetDimension() == 3)
-	  {
-	    PopStatus ();
-	    PushStatusF ("curving faces");
-	    
-	    for (int j=0; j<facecoeffsindex[top.GetNFaces()]; j++)
-	      facecoeffs[j] = Vec<3>(0.,0.,0.);
-	    
-	    for (SurfaceElementIndex i = 0; i < mesh.GetNSE(); i++)   // for all surface elements
-	      {
-		if (multithread.terminate) return;
-
-	        SetThreadPercent( double(100*i/mesh.GetNSE()) );
-
-		Element2d elem = mesh[i];
-		
-		if (elem.GetType() == TRIG)
-		    fe2d = &trig;
-                else
-		    fe2d = &quad;
-
-		fe2d->SetElementNumber (i+1);
-
-		int npoints = fe2d->GetNFaceShapes();
-
-		if (npoints == 0) continue;
-
-		DenseMatrix mat(npoints);
-		DenseMatrix inv(npoints);
-		Vector vec[3];
-
-		for (int k = 0; k < 3; k++)
-		{
-		    vec[k].SetSize(npoints);
-		    for (int n = 1; n <= npoints; n++) vec[k].Set(n, 0.);
-		}
-
-		for (int j = 0; j < nIntegrationPoints; j++)
-		{
-		    for (int k = 0; k < nIntegrationPoints; k++)
-		    {
-			double w;
-			Point<2> xr;
-
-			if (elem.GetType() == TRIG)
-			  {
-			    w = wi[j]*wi[k]*(1-xi[j]);
-			    xr = Point<2> (xi[j], xi[k]*(1-xi[j]));
-			  }
-			else
-			  {
-			    w = wi[j]*wi[k];
-			    xr = Point<2> (xi[j], xi[k]);
-			  }
-
-			fe2d->SetReferencePoint (xr);
-			fe2d->CalcFaceShapes ();
-			fe2d->CalcVertexShapes ();
-			fe2d->CalcEdgeShapes ();
-			fe2d->CalcFaceLaplaceShapes ();
-
-			// integration over the product of the gradients of the face shapes
-
-			for (int n = 0; n < npoints; n++)
-			  for (int m = 0; m < npoints; m++)
-			    mat.Set(n+1, m+1,
-				    mat.Get(n+1,m+1) +
-				    fe2d->GetFaceDShape(n)*fe2d->GetFaceDShape(m)*w);
-
-			// integration over the difference between the exact geometry and the one
-			// defined by vertex and edge shape functions times face shape
-
-			// double giu = 0, giv = 0;
-			PointGeomInfo gi;
-			gi.trignum = elem.GeomInfoPi(1).trignum;
-			gi.u = 0.0;
-			gi.v = 0.0;
-			Point<3> xve(0.,0.,0.);
-
-			// vertex shape functions
-			for (int v = 0; v < fe2d->GetNVertices(); v++)
-			  {
-			    xve = xve + fe2d->GetVertexShape(v) * mesh.Point(fe2d->GetVertexNr(v));
-			    gi.u += fe2d->GetVertexShape(v) * elem.GeomInfoPi(v+1).u;
-			    gi.v += fe2d->GetVertexShape(v) * elem.GeomInfoPi(v+1).v;
-			  }
-
-			// edge shape functions
-			int index = 0;
-			for (int e = 0; e < fe2d->GetNEdges(); e++)
-			  {
-			    int gindex = edgecoeffsindex[fe2d->GetEdgeNr(e)-1];
-			    for (int k = 2; k <= fe2d->GetEdgeOrder(e); k++, index++, gindex++)
-			      xve = xve + fe2d->GetEdgeShape(index) * edgecoeffs[gindex];
-			  }
-
-			// exact point
-
-			Point<3> xexact = xve;
-			ref->ProjectToSurface (xexact, mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr(), gi);
-
-			Vec<3> v2 = w*(Vec<3>(xexact)-Vec<3>(xve));
-
-			for (int k = 0; k < 3; k++)
-			  for (int n = 0; n < npoints; n++)
-			    vec[k].Set(n+1, vec[k].Get(n+1) - fe2d->GetFaceLaplaceShape(n)*v2(k));
-		    }
-		}
-
-		CalcInverse(mat,inv);
-		
-		Vector a0(npoints), a1(npoints), a2(npoints);
-		
-		/*
-		a0 = inv*vec[0];
-		a1 = inv*vec[1];
-		a2 = inv*vec[2];
-		*/
-		inv.Mult (vec[0], a0);
-		inv.Mult (vec[1], a1);
-		inv.Mult (vec[2], a2);
-
-		int index = facecoeffsindex[fe2d->GetFaceNr()-1];
-		
-		for (int n = 0; n < npoints; n++, index++)
-		  facecoeffs[index] =  Vec<3>(a0.Elem(n+1), a1.Elem(n+1), a2.Elem(n+1));
-	      }
-	  }
-	
-
-
-	
-/*
-	cout << "WARNING: L2-Projection for faces" << endl;
-
-	// evaluate face points
-
-	if (mesh.GetDimension() == 3)
-	{
-	    for (int i=0; i<facecoeffsindex[top.GetNFaces()]; i++)
-		facecoeffs[i] = Vec<3>(0.,0.,0.);
-
-	    for (SurfaceElementIndex i = 0; i < mesh.GetNSE(); i++)   // for all surface elements
-	    {
-		Element2d elem = mesh[i];
-		
-		if (elem.GetType() == TRIG)
-		    fe2d = &trig;
-                else
-		    fe2d = &quad;
-
-		fe2d->SetElementNumber (i+1);
-
-		int npoints = fe2d->GetNFaceShapes();
-
-		if (npoints == 0) continue;
-
-		DenseMatrix mat(npoints);
-		DenseMatrix inv(npoints);
-		Vector vec[3];
-
-		for (int k = 0; k < 3; k++)
-		{
-		    vec[k].SetSize(npoints);
-		    for (int n = 1; n <= npoints; n++) vec[k].Set(n, 0.);
-		}
-
-		for (int j = 0; j < nIntegrationPoints; j++)
-		{
-		    for (int k = 0; k < nIntegrationPoints; k++)
-		    {
-			double w;
-			Point<2> xr;
-
-			if (elem.GetType() == TRIG)
-			{
-			    w = wi[j]*wi[k]*(1-xi[j]);
-			    xr = Point<2> (xi[j], xi[k]*(1-xi[j]));
-			}
-			else
-			{
-			    w = wi[j]*wi[k];
-			    xr = Point<2> (xi[j], xi[k]);
-			}
-
-			fe2d->SetReferencePoint (xr);
-//			fe2d->CalcFaceDShape (false, true);
-			fe2d->CalcFaceShapes ();
-
-			// integration over the product of the gradients of the face shapes
-
-			for (int n = 0; n < npoints; n++)
-			    for (int m = 0; m < npoints; m++)
-				    mat.Set(n+1, m+1, mat.Get(n+1,m+1) +
-					    fe2d->GetFaceShape(n)*fe2d->GetFaceShape(m)*w);
-
-			// integration over the difference between the exact geometry and the one
-			// defined by vertex and edge shape functions times face shape
-
-			Point<3> xve(0.,0.,0.);
-
-			// vertex shape functions
-			fe2d->CalcVertexShapes ();
-//			fe2d->CalcVertexShape (true, false);
-			for (int v = 0; v < fe2d->GetNVertices(); v++)
-			    xve = xve + fe2d->GetVertexShape(v) * mesh.Point(fe2d->GetVertexNr(v));
-
-			// edge shape functions
-//			fe2d->CalcEdgeShape (true, false);
-			fe2d->CalcEdgeShapes ();
-
-			int index = 0;
-			for (int e = 0; e < fe2d->GetNEdges(); e++)
-			{
-			    int gindex = edgecoeffsindex[fe2d->GetEdgeNr(e)-1];
-
-			    for (int k = 2; k <= fe2d->GetEdgeOrder(e); k++, index++, gindex++)
-				xve = xve + fe2d->GetEdgeShape(index) * edgecoeffs[gindex];
-			}
-
-			// exact point
-
-			Point<3> xexact = xve;
-			ref->ProjectToSurface (xexact, mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr());
-
-			Vec<3> v = w*(Vec<3>(xexact)-Vec<3>(xve));
-
-			fe2d->CalcFaceLaplaceShapes ();
-
-			for (int k = 0; k < 3; k++)
-			    for (int n = 0; n < npoints; n++)
-				vec[k].Set(n+1, vec[k].Get(n+1) + fe2d->GetFaceShape(n)*v(k));
-			}
-		    }
-
- 		    CalcInverse(mat,inv);
-
-		    Vector a0, a1, a2;
-
-		    a0 = inv*vec[0];
-		    a1 = inv*vec[1];
-		    a2 = inv*vec[2];
-
-		    int index = facecoeffsindex[fe2d->GetFaceNr()-1];
-
-		    for (int n = 0; n < npoints; n++, index++)
-			facecoeffs[index] =  Vec<3>(a0(n+1), a1(n+1), a2(n+1));
-	    }
-	}
-*/
-
-
-    PrintMessage (5, "reducing order");
-   
-    for (e = 0; e < top.GetNEdges(); e++)
-      if (edgeorder[e] > 1)
-	{
-	  int i;
-	  double maxcoeff = 0.;
-
-	  for (i = edgecoeffsindex[e]; i < edgecoeffsindex[e+1]; i++)
-	    maxcoeff = max2 (maxcoeff, edgecoeffs[i].Length());
-
-	  if (maxcoeff < 1e-12) edgeorder[e] = 1;
-	}
-
-    for (f = 0; f < top.GetNFaces(); f++)
-      if (faceorder[f] > 1)
-	{
-	  int i;
-	  double maxcoeff = 0.;
-
-	  for (i = facecoeffsindex[f]; i < facecoeffsindex[f+1]; i++)
-	    maxcoeff = max (maxcoeff, facecoeffs[i].Length());
-
-	  if (maxcoeff < 1e-12) faceorder[f] = 1;
-	}
-
-    isHighOrder = 1;              // true
-
-    PrintMessage(1, "done");
-    PopStatus();
-    //	cout << "finished" << endl;
-    }
-
-} // namespace netgen
diff --git a/contrib/Netgen/libsrc/meshing/delaunay.cpp b/contrib/Netgen/libsrc/meshing/delaunay.cpp
deleted file mode 100644
index 505a8c193fc77bd03aeba14ee3101a664d9dea75..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/delaunay.cpp
+++ /dev/null
@@ -1,1683 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-
-namespace netgen
-{
-
-
-  static const int deltetfaces[][3] = 
-    { { 1, 2, 3 },
-      { 2, 0, 3 },
-      { 0, 1, 3 },
-      { 1, 0, 2 } };
-
-
-  class DelaunayTet
-  {
-    PointIndex pnums[4];
-    int nb[4];
-
-  public:
-    DelaunayTet () { ; }
-
-    DelaunayTet (const DelaunayTet & el)
-    {
-      for (int i = 0; i < 4; i++)
-	pnums[i] = el[i];
-    }
-
-    DelaunayTet (const Element & el)
-    {
-      for (int i = 0; i < 4; i++)
-	pnums[i] = el[i];
-    }
-    
-    PointIndex & operator[] (int i) { return pnums[i]; }
-    PointIndex operator[] (int i) const { return pnums[i]; }
-
-    int & NB1(int i) { return nb[i-1]; }
-    int NB1(int i) const { return nb[i-1]; }
-
-    int & NB(int i) { return nb[i]; }
-    int NB(int i) const { return nb[i]; }
-
-
-    int FaceNr (INDEX_3 & face) const  // which face nr is it ?
-    {
-      for (int i = 0; i < 3; i++)
-	if (pnums[i] != face.I1() && 
-	    pnums[i] != face.I2() && 
-	    pnums[i] != face.I3())
-	  return i;
-      return 3;
-    }
-    
-    void GetFace1 (int i, INDEX_3 & face) const
-    {
-      face.I(1) = pnums[deltetfaces[i-1][0]];
-      face.I(2) = pnums[deltetfaces[i-1][1]];
-      face.I(3) = pnums[deltetfaces[i-1][2]];
-    }
-
-    void GetFace (int i, INDEX_3 & face) const
-    {
-      face.I(1) = pnums[deltetfaces[i][0]];
-      face.I(2) = pnums[deltetfaces[i][1]];
-      face.I(3) = pnums[deltetfaces[i][2]];
-    }
-      
-    INDEX_3 GetFace1 (int i) const
-    {
-      return INDEX_3 (pnums[deltetfaces[i-1][0]],
-		      pnums[deltetfaces[i-1][1]],
-		      pnums[deltetfaces[i-1][2]]);
-    }
-
-    INDEX_3 GetFace (int i) const
-    {
-      return INDEX_3 (pnums[deltetfaces[i][0]],
-		      pnums[deltetfaces[i][1]],
-		      pnums[deltetfaces[i][2]]);
-    }
-     
-    void GetFace1 (int i, Element2d & face) const
-    {
-      // face.SetType(TRIG);
-      face[0] = pnums[deltetfaces[i-1][0]];
-      face[1] = pnums[deltetfaces[i-1][1]];
-      face[2] = pnums[deltetfaces[i-1][2]];
-    }
-  };
-
-
-
-
-
-
-
-
-
-  /*
-    Table to maintain neighbour elements
-  */
-  class MeshNB
-  {
-    // face nodes -> one element
-    INDEX_3_CLOSED_HASHTABLE<int> faces;
-
-    // 
-    ARRAY<DelaunayTet> & tets;
-
-  public:
-
-    // estimated number of points
-    MeshNB (ARRAY<DelaunayTet> & atets, int np)
-      : faces(200), tets(atets)
-    { ; }
-
-    // add element with 4 nodes
-    void Add (int elnr);
-
-    // delete element with 4 nodes
-    void Delete (int elnr)
-    {
-      DelaunayTet & el = tets.Elem(elnr);
-      for (int i = 0; i < 4; i++)
-	faces.Set (el.GetFace(i).Sort(), el.NB(i));
-    }
-
-    // get neighbour of element elnr in direction fnr 
-    int GetNB (int elnr, int fnr)
-    { 
-      return tets.Get(elnr).NB1(fnr); 
-    }
-
-    //
-    void ResetFaceHT (int size)
-    {
-      faces.SetSize (size);
-    }
-  };
-
-
-
-  void MeshNB :: Add (int elnr)
-  {
-    DelaunayTet & el = tets.Elem(elnr);
-
-    for (int i = 0; i < 4; i++)
-      {
-	INDEX_3 i3 = INDEX_3::Sort (el.GetFace(i));
-
-	int posnr;
-	
-	if (!faces.PositionCreate (i3, posnr))
-	  {
-	    // face already in use
-	    int othertet = faces.GetData (posnr);
-
-	    el.NB(i) = othertet;
-	    if (othertet)
-	      {
-		int fnr = tets.Get(othertet).FaceNr (i3);
-		tets.Elem(othertet).NB(fnr) = elnr;
-	      }
-	  }
-	else
-	  {
-	    faces.SetData (posnr, elnr);	
-	    el.NB(i) = 0;
-	  }
-      }
-  }
-
-
-
-
-
-
-  /*
-    connected lists of cosphereical elements
-  */
-  class SphereList 
-  {
-    ARRAY<int> links;
-  public:
-    SphereList () 
-    { ; }
-
-    void AddElement (int elnr)
-    {
-      if (elnr > links.Size())
-	links.Append (1);
-      links.Elem(elnr) = elnr;
-    }
-
-    void DeleteElement (int elnr)
-    {
-      links.Elem(elnr) = 0;
-    }    
-  
-    void ConnectElement (int eli, int toi)
-    {
-      links.Elem (eli) = links.Get (toi);
-      links.Elem (toi) = eli;
-    }
-      
-    void GetList (int eli, ARRAY<int> & linked) const;
-  };
-
-
-  void SphereList :: GetList (int eli, ARRAY<int> & linked) const
-  {
-    linked.SetSize (0);
-    int pi = eli;
-
-    do
-      {
-	if (pi <= 0 || pi > links.Size())
-	  {
-	    cerr << "link, error " << endl;
-	    cerr << "pi = " << pi << " linked.s = " << linked.Size() << endl;
-	    exit(1);
-	  }
-	if (linked.Size() > links.Size())
-	  {
-	    cerr << "links have loop" << endl;
-	    exit(1);
-	  }
-
-	linked.Append (pi);
-	pi = links.Get(pi);
-      }
-    while (pi != eli);
-  }
-
-
-
-
-
-  void AddDelaunayPoint (PointIndex newpi, const Point3d & newp, 
-			 ARRAY<DelaunayTet> & tempels, 
-			 Mesh & mesh,
-			 Box3dTree & tettree, 
-			 MeshNB & meshnb,
-			 ARRAY<Point3d> & centers, ARRAY<double> & radi2,
-			 ARRAY<int> & connected, ARRAY<int> & treesearch, 
-			 ARRAY<int> & freelist, SphereList & list,
-			 IndexSet & insphere, IndexSet & closesphere)
-  {
-    int i, j, k, l;
-  
-    /*
-      find any sphere, such that newp is contained in
-    */
-  
-    DelaunayTet el;
-    int cfelind = -1;
-
-    const Point3d * pp[4];
-    Point3d pc;
-    double r2;
-    Point3d tpmin, tpmax;
-
-    tettree.GetIntersecting (newp, newp, treesearch);
-    for (j = 0; j < treesearch.Size(); j++)
-      {
-	int jjj = treesearch[j];
-	if (Dist2 (centers.Get(jjj), newp) < radi2.Get(jjj))
-	  {
-	    el = tempels.Get(jjj);
-	    cfelind = jjj;
-	    break;
-	  }
-      }
-  
-    /*
-      if (!felind)
-      {
-      cerr << "not in any sphere, 1" << endl;
-      // old, non tree search
-
-      double mindist = 1e10;
-      for (j = 1; j <= tempels.Size(); j++)
-      {
-      if (tempels.Get(j).PNum(1))
-      {
-      double toofar = 
-      Dist2 (centers.Get(j), newp) - radi2.Get(j);
-      if (toofar < mindist || toofar < 1e-7) 
-      {
-      mindist = toofar;
-      cout << " dist2 = " << Dist2 (centers.Get(j), newp)
-      << " radi2 = " << radi2.Get(j) << endl;
-      }
-      if (toofar < 0)
-      {
-      el = tempels.Get(j);
-      felind = j;
-      cout << "sphere found !" << endl;
-      break; 
-      }
-      }
-      }
-      cout << "point is too far from sheres: " << mindist << endl;
-      }
-    */      
-
-    if (cfelind == -1)
-      {
-	PrintWarning ("Delaunay, point not in any sphere");
-	return;
-      }
-	
-
-    /*
-      insphere:     point is in sphere -> delete element
-      closesphere:  point is close to sphere -> considered for same center
-    */
-
-    // save overestimate
-    insphere.SetMaxIndex (2 * tempels.Size() + 5 * mesh.GetNP());
-    closesphere.SetMaxIndex (2 * tempels.Size() + 5 * mesh.GetNP());
-
-    insphere.Clear();
-    closesphere.Clear();
-
-
-    insphere.Add (cfelind);
-      
-    int changed = 1;
-    int nstarti = 1, starti;
-    while (changed)
-      {
-	changed = 0;
-	starti = nstarti;
-	nstarti = insphere.Array().Size()+1;
-
-	// if point in sphere, then it is also closesphere
-	for (j = starti; j < nstarti; j++)
-	  {
-	    int helind = insphere.Array().Get(j);
-	    if (!closesphere.IsIn (helind))
-	      closesphere.Add (helind);
-	  }
-
-	// add connected spheres to insphere - list
-	for (j = starti; j < nstarti; j++)
-	  {
-	    list.GetList (insphere.Array().Get(j), connected);
-	    for (k = 1; k <= connected.Size(); k++)
-	      {
-		int celind = connected.Get(k);
-
-		if (tempels.Get(celind)[0] != -1 && 
-		    !insphere.IsIn (celind))
-		  {
-		    changed = 1;
-		    insphere.Add (celind);
-		  }
-	      }
-	  }
-
-	// check neighbour-tets
-	for (j = starti; j < nstarti; j++)
-	  for (k = 1; k <= 4; k++)
-	    {
-	      int helind = insphere.Array().Get(j);
-	      int nbind = meshnb.GetNB (helind, k);
-
-	      if (nbind && !insphere.IsIn (nbind) )
-		{
-		  if (Dist2 (centers.Get(nbind), newp) 
-		      < radi2.Get(nbind) * (1+1e-8) )
-		    {
-		      closesphere.Add (nbind);
-		    }
-
-		  if (Dist2 (centers.Get(nbind), newp) 
-		      < radi2.Get(nbind) * (1 + 1e-12))
-		    {
-		      // point is in sphere -> remove tet
-		      insphere.Add (nbind);
-		      changed = 1;
-		    }
-		  else
-		    {
-		      /*
-		      Element2d face;
-		      tempels.Get(helind).GetFace (k, face);
-
-		      const Point3d & p1 = mesh.Point (face.PNum(1));
-		      const Point3d & p2 = mesh.Point (face[1]);
-		      const Point3d & p3 = mesh.Point (face[2]);
-		      */
-
-		      INDEX_3 i3 = tempels.Get(helind).GetFace (k-1);
-
-		      const Point3d & p1 = mesh.Point ( PointIndex (i3.I1()));
-		      const Point3d & p2 = mesh.Point ( PointIndex (i3.I2()));
-		      const Point3d & p3 = mesh.Point ( PointIndex (i3.I3()));
-
-
-		      Vec3d v1(p1, p2);
-		      Vec3d v2(p1, p3);
-		      Vec3d n = Cross (v1, v2);
-		      n /= n.Length();
-
-		      if (n * Vec3d (p1, mesh.Point (tempels.Get(helind)[k-1])) > 0)
-			n *= -1;
-
-		      double dist = n * Vec3d (p1, newp);
-
-
-		      if (dist > -1e-10)  // 1e-10
-			{
-			  insphere.Add (nbind);
-			  changed = 1;
-			}
-
-
-		    }
-		}
-	    }
-      } // while (changed)
-
-    //      (*testout) << "newels: " << endl;
-    ARRAY<Element> newels;
-
-    Element2d face(TRIG);
-    for (j = 1; j <= insphere.Array().Size(); j++)
-      for (k = 1; k <= 4; k++)
-	{
-	  //	    int elind = insphere.Array().Get(j);
-	  int celind = insphere.Array().Get(j);
-	  int nbind = meshnb.GetNB (celind, k);
-
-	  if (!nbind || !insphere.IsIn (nbind))
-	    {
-	      tempels.Get (celind).GetFace1 (k, face);
-		
-	      Element newel(TET);
-	      for (l = 1; l <= 3; l++)
-		newel.PNum(l) = face.PNum(l);
-	      newel[3] = newpi;
-
-	      newels.Append (newel);
-
-	      Vec3d v1(mesh.Point (face[0]), mesh.Point (face[1]));
-	      Vec3d v2(mesh.Point (face[0]), mesh.Point (face[2]));
-	      Vec3d n = Cross (v1, v2);
-	      n /= n.Length();
-	      if (n * Vec3d(mesh.Point (face[0]), 
-			    mesh.Point (tempels.Get(insphere.Array().Get(j))[k-1]))
-		  > 0)
-		n *= -1;
-
-	      double hval = n * Vec3d (mesh.Point (face[0]), newp);
-		
-	      if (hval > -1e-12)
-		{
-		  cerr << "vec to outer" << endl;
-		  (*testout) << "vec to outer, hval = " << hval << endl;
-		  (*testout) << "v1 x v2 = " << Cross (v1, v2) << endl;
-		  (*testout) << "facep: "
-			     << mesh.Point (face[0]) << " "
-			     << mesh.Point (face[1]) << " "
-			     << mesh.Point (face[2]) << endl;
-		}
-	    }
-	}
-
-    meshnb.ResetFaceHT (10*insphere.Array().Size()+1);
-
-    for (j = 1; j <= insphere.Array().Size(); j++)
-      {
-	//	  int elind = 
-	int celind = insphere.Array().Get(j);
-
-	meshnb.Delete (celind); 
-	list.DeleteElement (celind);
-	  
-	for (k = 0; k < 4; k++)
-	  tempels.Elem(celind)[k] = -1;
-
-	((ADTree6&)tettree.Tree()).DeleteElement (celind);
-	freelist.Append (celind);
-      }
-
-
-    int hasclose = 0;
-    for (j = 1; j <= closesphere.Array().Size(); j++)
-      {
-	int ind = closesphere.Array().Get(j);
-	if (!insphere.IsIn(ind) &&
-	    fabs (Dist2 (centers.Get (ind), newp) - radi2.Get(ind)) < 1e-8 )
-	  hasclose = 1;
-      }
-
-    for (j = 1; j <= newels.Size(); j++)
-      {
-	int nelind;
-
-	if (!freelist.Size())
-	  {
-	    tempels.Append (newels.Get(j));
-	    nelind = tempels.Size();
-	  }
-	else
-	  {
-	    nelind = freelist.Last();
-	    freelist.DeleteLast();
-
-	    tempels.Elem(nelind) = newels.Get(j);
-	  }
-
-	meshnb.Add (nelind);
-	list.AddElement (nelind);
-
-	for (k = 1; k <= 4; k++)
-	  pp[k-1] = &mesh.Point (newels.Get(j).PNum(k));
-
-	if (CalcSphereCenter (&pp[0], pc) )
-	  {
-	    PrintSysError ("Delaunay: New tet is flat");
-
-	    (*testout) << "new tet is flat" << endl;
-	    for (k = 1; k <= 4; k++)
-	      (*testout) << newels.Get(j).PNum(k) << " ";
-	    (*testout) << endl;
-	    for (k = 1; k <= 4; k++)
-	      (*testout) << *pp[k-1] << " ";
-	    (*testout) << endl;
-	  }
-
-	r2 = Dist2 (*pp[0], pc);
-	if (hasclose)
-	  for (k = 1; k <= closesphere.Array().Size(); k++)
-	    {
-	      int csameind = closesphere.Array().Get(k); 
-	      if (!insphere.IsIn(csameind) &&
-		  fabs (r2 - radi2.Get(csameind)) < 1e-10 && 
-		  Dist (pc, centers.Get(csameind)) < 1e-10)
-		{
-		  pc = centers.Get(csameind);
-		  r2 = radi2.Get(csameind);
-		  list.ConnectElement (nelind, csameind);
-		  break;
-		}
-	    }
-      
-	if (centers.Size() < nelind)
-	  {
-	    centers.Append (pc);
-	    radi2.Append (r2);
-	  }
-	else
-	  {
-	    centers.Elem(nelind) = pc;
-	    radi2.Elem(nelind) = r2;
-	  }
-
-	closesphere.Add (nelind);
-	  
-	tpmax = tpmin = *pp[0];
-	for (k = 1; k <= 3; k++)
-	  {
-	    tpmin.SetToMin (*pp[k]);
-	    tpmax.SetToMax (*pp[k]);
-	  }
-	tpmax = tpmax + 0.01 * (tpmax - tpmin);
-	tettree.Insert (tpmin, tpmax, nelind);
-      }
-  }
-
-
-
-
-
-
-  void Delaunay1 (Mesh & mesh, const MeshingParameters & mp, AdFront3 * adfront,
-		  ARRAY<DelaunayTet> & tempels,
-		  int oldnp, DelaunayTet & startel, Point3d & pmin, Point3d & pmax)
-  {
-    int i, j, k, l;
-    const Point3d * pp[4];
-
-    ARRAY<Point3d> centers;
-    ARRAY<double> radi2;
-  
-    Point3d tpmin, tpmax;
-
-
-    // new: local box
-    mesh.GetBox (pmax, pmin);   // lower bound for pmax, upper for pmin
-    for (i = 1; i <= adfront->GetNF(); i++)
-      {
-	const Element2d & face = adfront->GetFace(i);
-	for (j = 0; j < face.GetNP(); j++)
-	  {
-	    pmin.SetToMin  (mesh.Point (face[j]));
-	    pmax.SetToMax  (mesh.Point (face[j]));
-	  }
-      }
-  
-    for (i = 0; i < mesh.LockedPoints().Size(); i++)
-      {
-	pmin.SetToMin (mesh.Point (mesh.LockedPoints()[i]));
-	pmax.SetToMax (mesh.Point (mesh.LockedPoints()[i]));
-      }
-  
-
-
-    Vec3d vdiag(pmin, pmax);
-    // double r1 = vdiag.Length();
-    double r1 = sqrt (3.0) * max3(vdiag.X(), vdiag.Y(), vdiag.Z());
-    vdiag = Vec3d (r1, r1, r1);
-    double r2;
-
-    Point3d pmin2 = pmin - 8 * vdiag;
-    Point3d pmax2 = pmax + 8 * vdiag;
-
-    Point3d cp1(pmin2), cp2(pmax2), cp3(pmax2), cp4(pmax2);
-    cp2.X() = pmin2.X();
-    cp3.Y() = pmin2.Y();
-    cp4.Z() = pmin2.Z();
-
-
-
-
-    int np = mesh.GetNP();
-
-    startel[0] = mesh.AddPoint (cp1);
-    startel[1] = mesh.AddPoint (cp2);
-    startel[2] = mesh.AddPoint (cp3);
-    startel[3] = mesh.AddPoint (cp4);
-
-    // flag points to use for Delaunay:
-    BitArrayChar<PointIndex::BASE> usep(np);
-    usep.Clear();
-    for (i = 1; i <= adfront->GetNF(); i++)
-      {
-	const Element2d & face = adfront->GetFace(i);
-	for (j = 0; j < face.GetNP(); j++)
-	  usep.Set (face[j]);
-      }
-
-    for (i = oldnp + PointIndex::BASE; 
-	 i < np + PointIndex::BASE; i++)
-      usep.Set (i);
-
-    for (i = 0; i < mesh.LockedPoints().Size(); i++)
-      usep.Set (mesh.LockedPoints()[i]);
-  
-
-    ARRAY<int> freelist;
-
-
-    int cntp = 0;
-
-    MeshNB meshnb (tempels, mesh.GetNP() + 5);
-    SphereList list;
-
-    pmin2 = pmin2 + 0.1 * (pmin2 - pmax2);
-    pmax2 = pmax2 + 0.1 * (pmax2 - pmin2);
-
-    Box3dTree tettree(pmin2, pmax2);
-
-
-    tempels.Append (startel);
-    meshnb.Add (1);
-    list.AddElement (1);
-    ARRAY<int> connected, treesearch;
-
-
-    tpmin = tpmax = mesh.Point(startel[0]);
-    for (k = 1; k < 4; k++)
-      {
-	tpmin.SetToMin (mesh.Point (startel[k]));
-	tpmax.SetToMax (mesh.Point (startel[k]));
-      }
-    tpmax = tpmax + 0.01 * (tpmax - tpmin);
-    tettree.Insert (tpmin, tpmax, 1);
-
-
-    Point3d pc;
-	  
-    for (k = 0; k < 4; k++)
-      pp[k] = &mesh.Point (startel[k]);
-  
-    CalcSphereCenter (&pp[0], pc);
-
-    centers.Append (pc);
-    radi2.Append (Dist2 (*pp[0], pc));
-
-
-    IndexSet insphere(mesh.GetNP());
-    IndexSet closesphere(mesh.GetNP());
-
-
-
-#ifdef MARK
-    MARK (delaunay1);
-#endif
-
-
-    // "random" reordering of points  (speeds a factor 3 - 5 !!!)
-
-    ARRAY<int> mixed(np);
-    int prims[] = { 11, 13, 17, 19, 23, 29, 31, 37 };
-    int prim;
-  
-    i = 0;
-    while (np % prims[i] == 0) i++;
-    prim = prims[i];
-
-    for (i = 1; i <= np; i++)
-      mixed.Elem(i) = (prim * i) % np + PointIndex::BASE;
-
-    for (i = 1; i <= np; i++)
-      {
-	if (i % 100 == 0)
-	  PrintDot ('+');
-
-	multithread.percent = 100.0 * i / np;
-	if (multithread.terminate)
-	  break;
-
-	PointIndex newpi = mixed.Get(i);
-
-	if (!usep.Test(newpi)) 
-	  continue;
-
-	cntp++;
-
-	const Point3d & newp = mesh.Point(newpi);
-      
-	AddDelaunayPoint (newpi, newp, tempels, mesh,
-			  tettree, meshnb, centers, radi2, 
-			  connected, treesearch, freelist, list, insphere, closesphere);
-      }
-
-#ifdef MARK
-    MARK (delaunay3);
-#endif  
-
-
-
-    for (i = tempels.Size(); i >= 1; i--)
-      if (tempels.Get(i)[0] <= 0)
-	tempels.DeleteElement (i);
-
-    PrintDot ('\n');
-
-    PrintMessage (3, "Points: ", cntp);
-    PrintMessage (3, "Elements: ", tempels.Size());
-    //   (*mycout) << cntp << " / " << tempels.Size() << " points/elements" << endl;
-
-    /*
-      cout << "tempels: ";
-      tempels.PrintMemInfo(cout);
-      cout << "Searchtree: ";
-      tettree.Tree().PrintMemInfo(cout);
-      cout << "MeshNB: ";
-      meshnb.PrintMemInfo(cout);
-    */
-  }
-
-
-
-
-
-
-  void Meshing3 :: Delaunay (Mesh & mesh, const MeshingParameters & mp)
-  {
-    PointIndex pi;
-    int i, j, k, l;
-    int ii;
-    int np, ne;
-
-    PrintMessage (1, "Delaunay meshing");
-    PrintMessage (3, "number of points: ", mesh.GetNP());
-    PushStatus ("Delaunay meshing");
-
-
-
-    ARRAY<DelaunayTet> tempels;
-
-    Point3d pmin, pmax;
-    Point3d tpmin, tpmax;
-    const Point3d * pp[4];
-  
-  
-    DelaunayTet startel;
-
-    int oldnp = mesh.GetNP();
-    if (mp.blockfill)
-      {
-	BlockFillLocalH (mesh, mp);
-	PrintMessage (3, "number of points: ", mesh.GetNP());
-      }
-
-    np = mesh.GetNP();
-
-    Delaunay1 (mesh, mp, adfront, tempels, oldnp, startel, pmin, pmax);
-  
-
-    {
-      // improve delaunay - mesh by swapping !!!!
-
-      Mesh tempmesh;
-      for (pi = PointIndex::BASE; pi < mesh.GetNP()+PointIndex::BASE; pi++)
-	tempmesh.AddPoint (mesh[pi]);
-      
-      for (i = 1; i <= tempels.Size(); i++)
-	{   
-	  Element el(4);
-	  for (j = 0; j < 4; j++)
-	    el[j] = tempels.Elem(i)[j];
-
-	  el.SetIndex (1);
-
-	  const Point3d & lp1 = mesh.Point (el[0]);
-	  const Point3d & lp2 = mesh.Point (el[1]);
-	  const Point3d & lp3 = mesh.Point (el[2]);
-	  const Point3d & lp4 = mesh.Point (el[3]);
-	  Vec3d v1(lp1, lp2);
-	  Vec3d v2(lp1, lp3);
-	  Vec3d v3(lp1, lp4);
-	  Vec3d n = Cross (v1, v2);
-	  double vol = n * v3;
-	
-	  if (vol > 0)
-	    swap (el[2], el[3]);
-	
-	  tempmesh.AddVolumeElement (el);
-	}
-
-
-      MeshQuality3d (tempmesh);
-    
-      for (i = 1; i <= mesh.GetNOpenElements(); i++)
-	{
-	  Element2d sel = mesh.OpenElement(i);
-	  sel.SetIndex(1);
-	  tempmesh.AddSurfaceElement (sel);
-	  swap (sel[1], sel[2]);
-	  tempmesh.AddSurfaceElement (sel);
-	}
-
-
-      for (i = 1; i <= 4; i++)
-	{
-	  Element2d self(TRIG);
-	  self.SetIndex (1);
-	  startel.GetFace1 (i, self);
-	  tempmesh.AddSurfaceElement (self);
-	}
-
-      
-      tempmesh.AddFaceDescriptor (FaceDescriptor (1, 1, 0, 0));
-      tempmesh.AddFaceDescriptor (FaceDescriptor (2, 1, 0, 0));
-
-
-      //  for (i = mesh.GetNP() - 3; i <= mesh.GetNP(); i++)
-      //    tempmesh.AddLockedPoint (i);
-      for (pi = PointIndex::BASE; 
-	   pi < tempmesh.GetNP() + PointIndex::BASE; pi++)
-	tempmesh.AddLockedPoint (pi);
-
-      //    tempmesh.PrintMemInfo(cout);
-      // tempmesh.Save ("tempmesh.vol");
-
-      for (i = 1; i <= 2; i++)
-	{ 
-	  tempmesh.FindOpenElements ();
-
-	  PrintMessage (5, "Num open: ", tempmesh.GetNOpenElements());
-	  tempmesh.CalcSurfacesOfNode ();
-
-	  tempmesh.FreeOpenElementsEnvironment (1);
-
-	  MeshOptimize3d meshopt;
-	  meshopt.SwapImprove(tempmesh, OPT_CONFORM);
-	}
-    
-
-#ifdef STAT_STREAM
-      tempmesh.FindOpenElements ();
-      PrintMessage (5, "Num open: ", tempmesh.GetNOpenElements());
-      (*statout) << tempmesh.GetNOpenElements() << " & " << endl;
-#endif   
-
-      MeshQuality3d (tempmesh);
-    
-      tempels.SetSize(0);
-      for (i = 1; i <= tempmesh.GetNE(); i++)
-	tempels.Append (tempmesh.VolumeElement(i));
-    }
-
-
-
-    // remove degenerated
-
-    BitArray badnode(mesh.GetNP());
-    badnode.Clear();
-    int ndeg = 0;
-    for (i = 1; i <= tempels.Size(); i++)
-      {
-	Element el(4);
-	for (j = 0; j < 4; j++)
-	  el[j] = tempels.Elem(i)[j];
-	//      Element & el = tempels.Elem(i);
-	const Point3d & lp1 = mesh.Point (el[0]);
-	const Point3d & lp2 = mesh.Point (el[1]);
-	const Point3d & lp3 = mesh.Point (el[2]);
-	const Point3d & lp4 = mesh.Point (el[3]);
-	Vec3d v1(lp1, lp2);
-	Vec3d v2(lp1, lp3);
-	Vec3d v3(lp1, lp4);
-	Vec3d n = Cross (v1, v2);
-	double vol = n * v3;
-
-	double h = v1.Length() + v2.Length() + v3.Length();
-	if (fabs (vol) < 1e-8 * (h * h * h) &&
-	    (el[0] <= np && el[1] <= np &&
-	     el[2] <= np && el[3] <= np) )   // old: 1e-12
-	  {
-	    badnode.Set(el[0]);
-	    badnode.Set(el[1]);
-	    badnode.Set(el[2]);
-	    badnode.Set(el[3]);
-	    ndeg++;
-	    (*testout) << "vol = " << vol << " h = " << h << endl;
-	  }
-
-	if (vol > 0)
-	  Swap (el[2], el[3]);
-      }
-
-    ne = tempels.Size();
-    for (i = ne; i >= 1; i--)
-      {
-	const DelaunayTet & el = tempels.Get(i);
-	if (badnode.Test(el[0]) ||
-	    badnode.Test(el[1]) ||
-	    badnode.Test(el[2]) ||
-	    badnode.Test(el[3]) )
-	  tempels.DeleteElement(i);
-      }
-
-  
-    PrintMessage (3, ndeg, " degenerated elements removed");
-
-    // find surface triangles which are no face of any tet
-
-    INDEX_3_HASHTABLE<int> openeltab(mesh.GetNOpenElements()+3);
-    ARRAY<int> openels;
-    for (i = 1; i <= mesh.GetNOpenElements(); i++)
-      {
-	const Element2d & tri = mesh.OpenElement(i);
-	INDEX_3 i3(tri[0], tri[1], tri[2]);
-	i3.Sort();
-	openeltab.Set (i3, i);
-      }
-
-    for (i = 1; i <= tempels.Size(); i++)
-      {
-	for (j = 0; j < 4; j++)
-	  {
-	    INDEX_3 i3 = tempels.Get(i).GetFace (j);
-	    i3.Sort();
-	    if (openeltab.Used(i3))
-	      openeltab.Set (i3, 0);
-	  }
-      }
-  
-    // and store them in openels
-    for (i = 1; i <= openeltab.GetNBags(); i++)
-      for (j = 1; j <= openeltab.GetBagSize(i); j++)
-	{
-	  INDEX_3 i3;
-	  int fnr;
-	  openeltab.GetData (i, j, i3, fnr);
-	  if (fnr)
-	    openels.Append (fnr);
-	}
-
-
-
-
-
-    // find open triangle with close edge (from halfening of surface squares)
-  
-    INDEX_2_HASHTABLE<INDEX_2> twotrias(mesh.GetNOpenElements()+5); 
-    //  for (i = 1; i <= mesh.GetNOpenElements(); i++)
-    for (ii = 1; ii <= openels.Size(); ii++)
-      {
-	i = openels.Get(ii);
-	const Element2d & el = mesh.OpenElement(i);
-	for (j = 1; j <= 3; j++)
-	  {
-	    INDEX_2 hi2 (el.PNumMod (j), el.PNumMod(j+1));
-	    hi2.Sort();
-	    if (twotrias.Used(hi2))
-	      {
-		INDEX_2 hi3;
-		hi3 = twotrias.Get (hi2);
-		hi3.I2() = el.PNumMod (j+2);
-		twotrias.Set (hi2, hi3);
-	      }
-	    else
-	      {
-		INDEX_2 hi3(el.PNumMod (j+2), 0);
-		twotrias.Set (hi2, hi3);
-	      }
-	  }
-      }
-
-    INDEX_2_HASHTABLE<int> tetedges(tempels.Size() + 5);
-    for (i = 1; i <= tempels.Size(); i++)
-      {
-	const DelaunayTet & el = tempels.Get(i);
-	INDEX_2 i2;
-	for (j = 1; j <= 6; j++)
-	  {
-	    switch (j)
-	      {
-	      case 1: i2 = INDEX_2(el[0], el[1]); break;
-	      case 2: i2 = INDEX_2(el[0], el[2]); break;
-	      case 3: i2 = INDEX_2(el[0], el[3]); break;
-	      case 4: i2 = INDEX_2(el[1], el[2]); break;
-	      case 5: i2 = INDEX_2(el[1], el[3]); break;
-	      case 6: i2 = INDEX_2(el[2], el[3]); break;
-	      }
-	    i2.Sort();
-	    tetedges.Set (i2, 1);
-	  }
-      }
-    //  cout << "tetedges:";
-    //  tetedges.PrintMemInfo (cout);
-
-
-    for (INDEX_2_HASHTABLE<INDEX_2>::Iterator it = twotrias.Begin();
-	 it != twotrias.End(); it++)
-      {
-	INDEX_2 hi2, hi3;
-	twotrias.GetData (it, hi2, hi3);
-	hi3.Sort();
-	if (tetedges.Used (hi3))
-	  {
-	    const Point3d & p1 = mesh.Point ( PointIndex (hi2.I1()));
-	    const Point3d & p2 = mesh.Point ( PointIndex (hi2.I2()));
-	    const Point3d & p3 = mesh.Point ( PointIndex (hi3.I1()));
-	    const Point3d & p4 = mesh.Point ( PointIndex (hi3.I2()));
-	    Vec3d v1(p1, p2);
-	    Vec3d v2(p1, p3);
-	    Vec3d v3(p1, p4);
-	    Vec3d n = Cross (v1, v2);
-	    double vol = n * v3;
-	    
-	    double h = v1.Length() + v2.Length() + v3.Length();
-	    if (fabs (vol) < 1e-4 * (h * h * h))   // old: 1e-12
-	      {
-		badnode.Set(hi3.I1());	
-		badnode.Set(hi3.I2());	
-	      }
-	  }
-      }
-
-    /*
-    for (i = 1; i <= twotrias.GetNBags(); i++)
-      for (j = 1; j <= twotrias.GetBagSize (i); j++)
-	{
-	  INDEX_2 hi2, hi3;
-	  twotrias.GetData (i, j, hi2, hi3);
-	  hi3.Sort();
-	  if (tetedges.Used (hi3))
-	    {
-	      const Point3d & p1 = mesh.Point (hi2.I1());
-	      const Point3d & p2 = mesh.Point (hi2.I2());
-	      const Point3d & p3 = mesh.Point (hi3.I1());
-	      const Point3d & p4 = mesh.Point (hi3.I2());
-	      Vec3d v1(p1, p2);
-	      Vec3d v2(p1, p3);
-	      Vec3d v3(p1, p4);
-	      Vec3d n = Cross (v1, v2);
-	      double vol = n * v3;
-	    
-	      double h = v1.Length() + v2.Length() + v3.Length();
-	      if (fabs (vol) < 1e-4 * (h * h * h))   // old: 1e-12
-		{
-		  badnode.Set(hi3.I1());	
-		  badnode.Set(hi3.I2());	
-		}
-	    }
-	}
-    */
-
-    ne = tempels.Size();
-    for (i = ne; i >= 1; i--)
-      {
-	const DelaunayTet & el = tempels.Get(i);
-	if (badnode.Test(el[0]) ||
-	    badnode.Test(el[1]) ||
-	    badnode.Test(el[2]) ||
-	    badnode.Test(el[3]) )
-	  tempels.DeleteElement(i);
-      }
-
-
-
-
-    // find intersecting:
-    PrintMessage (3, "Remove intersecting");
-    if (openels.Size())
-      {
-	Box3dTree setree(pmin, pmax);
-
-	/*      
-		cout << "open elements in search tree: " << openels.Size() << endl;
-		cout << "pmin, pmax = " << pmin << " - " << pmax << endl;
-	*/
-
-	for (i = 1; i <= openels.Size(); i++)
-	  {
-	    int fnr;
-	    fnr = openels.Get(i);
-	    if (fnr)
-	      {
-		const Element2d & tri = mesh.OpenElement(fnr);
-	      
-		Point3d ltpmin (mesh.Point(tri[0]));
-		Point3d ltpmax (tpmin);
-	      
-		for (k = 2; k <= 3; k++)
-		  {
-		    ltpmin.SetToMin (mesh.Point (tri.PNum(k)));
-		    ltpmax.SetToMax (mesh.Point (tri.PNum(k)));
-		  }
-		setree.Insert (ltpmin, ltpmax, fnr);
-	      }
-	  }
-      
-	ARRAY<int> neartrias;
-	for (i = 1; i <= tempels.Size(); i++)
-	  {
-	    //      const Point3d *pp[4];
-	    int tetpi[4];
-	    DelaunayTet & el = tempels.Elem(i);
-	  
-	    int intersect = 0;
-	  
-	    for (j = 0; j < 4; j++)
-	      {
-		pp[j] = &mesh.Point(el[j]);
-		tetpi[j] = el[j];
-	      }
-	  
-	    Point3d tetpmin(*pp[0]);
-	    Point3d tetpmax(tetpmin);
-	    for (j = 1; j < 4; j++)
-	      {
-		tetpmin.SetToMin (*pp[j]);
-		tetpmax.SetToMax (*pp[j]);
-	      }
-	    tetpmin = tetpmin + 0.01 * (tetpmin - tetpmax);
-	    tetpmax = tetpmax + 0.01 * (tetpmax - tetpmin);
-	  
-	    setree.GetIntersecting (tetpmin, tetpmax, neartrias);
-	  
-	  
-	    //      for (j = 1; j <= mesh.GetNSE(); j++)
-	    //	{
-	    for (int jj = 1; jj <= neartrias.Size(); jj++)
-	      {
-		j = neartrias.Get(jj);
-	      
-		const Element2d & tri = mesh.OpenElement(j);
-		const Point3d *tripp[3];
-		int tripi[3];
-	      
-		for (k = 1; k <= 3; k++)
-		  {
-		    tripp[k-1] = &mesh.Point (tri.PNum(k));
-		    tripi[k-1] = tri.PNum(k);
-		  }
-	      
-		if (IntersectTetTriangle (&pp[0], &tripp[0], tetpi, tripi))
-		  {
-		    /*
-		    int il1, il2;
-		    (*testout) << "intersect !" << endl;
-		    (*testout) << "triind: ";
-		    for (il1 = 0; il1 < 3; il1++)
-		      (*testout) << " " << tripi[il1];
-		    (*testout) << endl;
-		    (*testout) << "tetind: ";
-		    for (il2 = 0; il2 < 4; il2++)
-		      (*testout) << " " << tetpi[il2];
-		    (*testout) << endl;
-		  
-		    (*testout) << "trip: ";
-		    for (il1 = 0; il1 < 3; il1++)
-		      (*testout) << " " << *tripp[il1];
-		    (*testout) << endl;
-		    (*testout) << "tetp: ";
-		    for (il2 = 0; il2 < 4; il2++)
-		      (*testout) << " " << *pp[il2];
-		    (*testout) << endl;
-		    */
-		  
-		  
-		    intersect = 1;
-		    break;
-		  }
-	      }
-	  
-	  
-	    if (intersect)
-	      {
-		tempels.DeleteElement(i);
-		i--;
-	      }
-	  }
-      }
-  
-
-#ifdef MARK
-    MARK (delaunay4);
-#endif  
-
-
-
-
-
-
-
-
-    PrintMessage (3, "Remove outer");
-
-    // find connected tets (with no face between, and no hole due
-    // to removed intersecting tets.
-    //  INDEX_3_HASHTABLE<INDEX_2> innerfaces(np);
-
-  
-    INDEX_3_HASHTABLE<int> boundaryfaces(mesh.GetNOpenElements()/3+1);
-    for (i = 1; i <= mesh.GetNOpenElements(); i++)
-      {
-	const Element2d & tri = mesh.OpenElement(i);
-	INDEX_3 i3 (tri[0], tri[1], tri[2]);
-	i3.Sort();
-	boundaryfaces.PrepareSet (i3);
-      }
-    boundaryfaces.AllocateElements();
-    for (i = 1; i <= mesh.GetNOpenElements(); i++)
-      {
-	const Element2d & tri = mesh.OpenElement(i);
-	INDEX_3 i3 (tri[0], tri[1], tri[2]);
-	i3.Sort();
-	boundaryfaces.Set (i3, 1);
-      }
-
-    for (i = 0; i < tempels.Size(); i++)
-      for (j = 0; j < 4; j++)
-	tempels[i].NB(j) = 0;
-  
-    TABLE<int,PointIndex::BASE> elsonpoint(mesh.GetNP());
-    for (i = 0; i < tempels.Size(); i++)
-      {
-	const DelaunayTet & el = tempels[i];
-	INDEX_4 i4(el[0], el[1], el[2], el[3]);
-	i4.Sort();
-	elsonpoint.IncSizePrepare (i4.I1());
-	elsonpoint.IncSizePrepare (i4.I2());
-      }
-
-    elsonpoint.AllocateElementsOneBlock();
-
-    for (i = 0; i < tempels.Size(); i++)
-      {
-	const DelaunayTet & el = tempels[i];
-	INDEX_4 i4(el[0], el[1], el[2], el[3]);
-	i4.Sort();
-	elsonpoint.Add (i4.I1(), i+1);
-	elsonpoint.Add (i4.I2(), i+1);
-      }
-
-    //  cout << "elsonpoint mem: ";
-    //  elsonpoint.PrintMemInfo(cout);
-
-    INDEX_3_CLOSED_HASHTABLE<INDEX_2> faceht(100);   
-  
-    Element2d hel(TRIG);
-    for (pi = PointIndex::BASE; 
-	 pi < mesh.GetNP()+PointIndex::BASE; pi++)
-      {
-	faceht.SetSize (4 * elsonpoint[pi].Size());
-	for (ii = 0; ii < elsonpoint[pi].Size(); ii++)
-	  {
-	    i = elsonpoint[pi][ii];
-	    const DelaunayTet & el = tempels.Get(i);
-
-	    for (j = 1; j <= 4; j++)
-	      {
-		el.GetFace1 (j, hel);
-		hel.Invert();
-		hel.NormalizeNumbering();
-	      
-		if (hel[0] == pi)
-		  {
-		    INDEX_3 i3(hel[0], hel[1], hel[2]);
-		  
-		    if (!boundaryfaces.Used (i3))
-		      {
-			if (faceht.Used (i3))
-			  {
-			    INDEX_2 i2 = faceht.Get(i3);
-			  
-			    tempels.Elem(i).NB1(j) = i2.I1();
-			    tempels.Elem(i2.I1()).NB1(i2.I2()) = i;
-			  }
-			else
-			  {
-			    hel.Invert();
-			    hel.NormalizeNumbering();
-			    INDEX_3 i3(hel[0], hel[1], hel[2]);
-			    INDEX_2 i2(i, j);
-			    faceht.Set (i3, i2);
-			  }
-		      }
-		  }
-	      }
-	  }
-      }
-  
-    /*
-      for (i = 1; i <= tempels.Size(); i++)
-      {
-      const DelaunayTet & el = tempels.Get(i);
-      for (j = 1; j <= 4; j++)
-      {
-      INDEX_3 i3;
-      Element2d face;
-      el.GetFace1 (j, face);
-      for (int kk = 1; kk <= 3; kk++)
-      i3.I(kk) = face.PNum(kk);
-
-      i3.Sort();
-      if (!boundaryfaces.Used (i3))
-      {
-      if (innerfaces.Used(i3))
-      {
-      INDEX_2 i2;
-      i2 = innerfaces.Get(i3);
-      i2.I2() = i;
-      innerfaces.Set (i3, i2);
-      }
-      else
-      {
-      INDEX_2 i2;
-      i2.I1() = i;
-      i2.I2() = 0;
-      innerfaces.Set (i3, i2);
-      }
-      }
-      }
-      }
-    */
-
-    /*
-      (*testout) << "nb elements:" << endl;
-      for (i = 1; i <= tempels.Size(); i++)
-      {
-      (*testout) << i << " ";
-      for (j = 1; j <= 4; j++)
-      (*testout) << tempels.Get(i).NB1(j) << " ";
-      (*testout) << endl;
-      }
-  
-      (*testout) << "pairs:" << endl;
-      for (i = 1; i <= innerfaces.GetNBags(); i++)
-      for (j = 1; j <= innerfaces.GetBagSize(i); j++)
-      {
-      INDEX_3 i3;
-      INDEX_2 i2;
-      innerfaces.GetData (i, j, i3, i2);
-      (*testout) << i2 << endl;
-      }
-    */
-
-
-
-
-
-
-
-    /*
-      cout << "innerfaces: ";
-      innerfaces.PrintMemInfo (cout);
-    */
-
-    //  cout << "boundaryfaces: ";
-    //  boundaryfaces.PrintMemInfo (cout);
-
-
-    PrintMessage (5, "tables filled");
- 
-
-    ne = tempels.Size();
-    BitArray inner(ne), outer(ne);
-    inner.Clear();
-    outer.Clear();
-    ARRAY<int> elstack;
-
-    /*
-      int starti = 0;
-      for (i = 1; i <= ne; i++)
-      {
-      const Element & el = tempels.Get(i);
-      for (j = 1; j <= 4; j++)
-      for (k = 1; k <= 4; k++)
-      if (el.PNum(j) == startel.PNum(k))
-      {
-      outer.Set(i);
-      starti = i;
-      }
-      }
-    */
-
-    while (1)
-      {
-	int inside;
-	bool done = 1;
-
-	for (i = 1; i <= ne; i++)
-	  if (!inner.Test(i) && !outer.Test(i))
-	    {
-	      done = 0;
-	      break;
-	    }
-
-	if (done) break;
-      
-	const DelaunayTet & el = tempels.Get(i);
-	const Point3d & p1 = mesh.Point (el[0]);
-	const Point3d & p2 = mesh.Point (el[1]);
-	const Point3d & p3 = mesh.Point (el[2]);
-	const Point3d & p4 = mesh.Point (el[3]);
-      
-	Point3d ci = Center (p1, p2, p3, p4);
-
-	inside = adfront->Inside (ci);
-
-	/*
-	  cout << "startel: " << i << endl;
-	  cout << "inside = " << inside << endl;
-	  cout << "ins2 = " << adfront->Inside (Center (ci, p1)) << endl;
-	  cout << "ins3 = " << adfront->Inside (Center (ci, p2)) << endl;
-	*/
-      
-	elstack.SetSize(0);
-	elstack.Append (i);
-  
-	while (elstack.Size())
-	  {
-	    int ei = elstack.Last();
-	    elstack.DeleteLast();
-	  
-	    if (!inner.Test(ei) && !outer.Test(ei))
-	      {
-		if (inside)
-		  inner.Set(ei);
-		else
-		  outer.Set(ei);
-
-
-		for (j = 1; j <= 4; j++)
-		  {
-		    INDEX_3 i3 = tempels.Get(ei).GetFace1(j);
-		    /*
-		    Element2d face;
-		    tempels.Get(ei).GetFace(j, face);
-		    for (int kk = 1; kk <= 3; kk++)
-		      i3.I(kk) = face.PNum(kk);
-		    */
-		    i3.Sort();
-		  
-
-		    if (tempels.Get(ei).NB1(j))
-		      elstack.Append (tempels.Get(ei).NB1(j));
-
-		    /*
-		      if (innerfaces.Used(i3))
-		      {
-		      INDEX_2 i2 = innerfaces.Get(i3);
-		      int other = i2.I1() + i2.I2() - ei;
-
-		      if (other != tempels.Get(ei).NB1(j))
-		      cerr << "different1 !!" << endl;
-
-		      if (other)
-		      {
-		      elstack.Append (other);
-		      }
-		      }
-		      else
-		      if (tempels.Get(ei).NB1(j))
-		      cerr << "different2 !!" << endl;
-		    */
-
-		  }
-	      }
-	  }
-      }
-
-
-
-    // check outer elements
-    if (debugparam.slowchecks)
-      {
-	for (i = 1; i <= ne; i++)
-	  {
-	    const DelaunayTet & el = tempels.Get(i);
-	    const Point3d & p1 = mesh.Point (el[0]);
-	    const Point3d & p2 = mesh.Point (el[1]);
-	    const Point3d & p3 = mesh.Point (el[2]);
-	    const Point3d & p4 = mesh.Point (el[3]);
-	  
-	    Point3d ci = Center (p1, p2, p3, p4);
-	  
-	    //       if (adfront->Inside (ci) != adfront->Inside (Center (ci, p1)))
-	    // 	cout << "ERROR: outer test unclear !!!" << endl;	
-	  
-	    if (inner.Test(i) != adfront->Inside (ci))
-	      {
-		/*
-		  cout << "ERROR: outer test wrong !!!" 
-		  << "inner = " << int(inner.Test(i))
-		  << "outer = " << int(outer.Test(i))
-		  << endl;
-	      
-		  cout << "Vol = " << Determinant(Vec3d(p1, p2),
-		  Vec3d(p1, p3),
-		  Vec3d(p1, p4)) << endl;
-	      
-		*/	      
-		for (j = 1; j <= 4; j++)
-		  {
-		    Point3d hp;
-		    switch (j)
-		      {
-		      case 1: hp = Center (ci, p1); break;
-		      case 2: hp = Center (ci, p2); break;
-		      case 3: hp = Center (ci, p3); break;
-		      case 4: hp = Center (ci, p4); break;
-		      }
-		    //		  cout << "inside(" << hp << ") = " << adfront->Inside(hp) << endl;
-		  }
-	      
-	      }
-	  
-	    if (adfront->Inside(ci))
-	      outer.Clear(i);
-	    else
-	      outer.Set(i);
-	  }
-      }
-
-
-    /*
-
-    // find bug in innerfaces
-
-    tempmesh.DeleteVolumeElements();
-
-    for (i = 1; i <= innerfaces.GetNBags(); i++)
-    for (j = 1; j <= innerfaces.GetBagSize(i); j++)
-    {
-    INDEX_3 i3;
-    INDEX_2 i2;
-    innerfaces.GetData (i, j, i3, i2);
-    if (i2.I2())
-    {
-    if (outer.Test(i2.I1()) != outer.Test(i2.I2()))
-    {
-    tempmesh.AddVolumeElement (tempels.Get(i2.I1()));
-    tempmesh.AddVolumeElement (tempels.Get(i2.I2()));
-    cerr << "outer flag different for connected els" << endl;
-    }
-    }
-    }
-
-
-    cout << "Check intersectiong once more" << endl;
-
-    for (i = 1; i <= openels.Size(); i++)
-    {
-    tempmesh.SurfaceElement(2*openels.Get(i)).SetIndex(2);
-    tempmesh.SurfaceElement(2*openels.Get(i)-1).SetIndex(2);
-    }
-
-    //  for (i = 1; i <= tempmesh.GetNE(); i++)
-    //    for (j = 1; j <= tempmesh.GetNSE(); j++)
-    i = 6; j = 403;
-    if (i <= tempmesh.GetNE() && j <= tempmesh.GetNSE())
-    if (tempmesh.SurfaceElement(j).GetIndex()==2)
-    {
-    const Element & el = tempmesh.VolumeElement(i);
-    const Element2d & sel = tempmesh.SurfaceElement(j);
-
-    const Point3d *tripp[3];
-    const Point3d *pp[4];
-    int tetpi[4], tripi[3];
-
-    for (k = 1; k <= 4; k++)
-    {
-    pp[k-1] = &tempmesh.Point(el.PNum(k));
-    tetpi[k-1] = el.PNum(k);
-    }
-
-    for (k = 1; k <= 3; k++)
-    {
-    tripp[k-1] = &tempmesh.Point (sel.PNum(k));
-    tripi[k-1] = sel.PNum(k);
-    }
-
-    (*testout) << "Check Triangle " << j << ":";
-    for (k = 1; k <= 3; k++)
-    (*testout) << " " << sel.PNum(k);
-    for (k = 1; k <= 3; k++)
-    (*testout) << " " << tempmesh.Point(sel.PNum(k));
-    (*testout) << endl;
-
-    (*testout) << "Check Tet " << i << ":";
-    for (k = 1; k <= 4; k++)
-    (*testout) << " " << el.PNum(k);
-    for (k = 1; k <= 4; k++)
-    (*testout) << " " << tempmesh.Point(el.PNum(k));
-    (*testout) << endl;
-
-    if (IntersectTetTriangle (&pp[0], &tripp[0], tetpi, tripi))
-    {
-    cout << "Intesection detected !!" << endl;
-    }
-    }
-
-    tempmesh.Save ("temp.vol");
-
-    // end bug search
-    */
-
-
-    for (i = ne; i >= 1; i--)
-      {
-	if (outer.Test(i))
-	  tempels.DeleteElement(i);
-      }
-
-
-    //  (*mycout) << "done" << endl;
-
-
-    // mesh.points.SetSize(mesh.points.Size()-4);
-
-    for (i = 1; i <= tempels.Size(); i++)
-      {
-	Element el(4);
-	for (j = 0; j < 4; j++)
-	  el[j] = tempels.Elem(i)[j];
-	mesh.AddVolumeElement (el);
-      }
-
-    PrintMessage (5, "outer removed");
-
-    mesh.FindOpenElements();
-
-    mesh.Compress();
-
-    PopStatus ();
-  }
-}
diff --git a/contrib/Netgen/libsrc/meshing/findip.cpp b/contrib/Netgen/libsrc/meshing/findip.cpp
deleted file mode 100644
index 7be0ee913d1b295fa5fda890a675a689543504d7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/findip.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-// find inner point
-
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-
-template <typename POINTARRAY, typename FACEARRAY>
-int FindInnerPoint (POINTARRAY & points,
-		    FACEARRAY & faces,
-		    Point3d & p)
-{
-  int i, j;
-  ARRAY<Vec3d> a;
-  ARRAY<double> c;
-  Point3d p1, pmin;
-  int i1, i2, i3, i4;
-  int nf;
-  DenseMatrix m(3), inv(3);
-  Vector rs(3), x(3);
-  double f, fmin, hd, hmax;
-
-  nf = faces.Size();
-
-  //  testout << "#faces  = " << faces.Size() << endl;
-  //  testout << "#points = " << points.Size() << endl;
-
-  a.SetSize (nf);
-  c.SetSize (nf);
-
-  for (i = 1; i <= nf; i++)
-    {
-      p1 = points.Get(faces.Get(i).PNum(1));
-      a.Elem(i) = Cross (points.Get(faces.Get(i).PNum(2)) - points.Get(faces.Get(i).PNum(1)),
-		    points.Get(faces.Get(i).PNum(3)) - points.Get(faces.Get(i).PNum(1)));
-      a.Elem(i) /= a.Get(i).Length();
-      c.Elem(i) = - (a.Get(i).X() * p1.X() + a.Get(i).Y() * p1.Y() + a.Get(i).Z() * p1.Z());
-    }
-
-
-  hmax = 0;
-  for (i = 1; i <= nf; i++)
-    {
-      const Element2d & el = faces.Get(i);
-      for (j = 1; j <= 3; j++)
-	{
-	  double hi = Dist (points.Get(el.PNumMod(j)),
-			    points.Get(el.PNumMod(j+1)));
-	  if (hi > hmax) hmax = hi;
-	}
-    }
-
-
-  fmin = 100;
-  pmin = Point3d (0, 0, 0);
-
-  for (i1 = 1; i1 <= nf; i1++)
-    for (i2 = i1+1; i2 <= nf; i2++)
-      for (i3 = i2+1; i3 <= nf; i3++)
-        for (i4 = i3+1; i4 <= nf; i4++)
-          {
-	    m.Elem(1, 1) = a.Get(i1).X() - a.Get(i2).X();
-	    m.Elem(1, 2) = a.Get(i1).Y() - a.Get(i2).Y();
-	    m.Elem(1, 3) = a.Get(i1).Z() - a.Get(i2).Z();
-	    rs.Elem(1) = c.Get(i2) - c.Get(i1);
-
-	    m.Elem(2, 1) = a.Get(i1).X() - a.Get(i3).X();
-	    m.Elem(2, 2) = a.Get(i1).Y() - a.Get(i3).Y();
-	    m.Elem(2, 3) = a.Get(i1).Z() - a.Get(i3).Z();
-	    rs.Elem(2) = c.Get(i3) - c.Get(i1);
-
-	    m.Elem(3, 1) = a.Get(i1).X() - a.Get(i4).X();
-	    m.Elem(3, 2) = a.Get(i1).Y() - a.Get(i4).Y();
-	    m.Elem(3, 3) = a.Get(i1).Z() - a.Get(i4).Z();
-	    rs.Elem(3) = c.Get(i4) - c.Get(i1);
-
-
-	    if (fabs (m.Det()) > 1e-10)
-	      {
-		CalcInverse (m, inv);
-		inv.Mult (rs, x);
-
-		//            testout << "x = " << x << endl;
-
-
-		f = -1e10;
-		for (i = 1; i <= nf; i++)
-		  {
-		    hd = x.Elem(1) * a.Get(i).X()
-		      + x.Elem(2) * a.Get(i).Y()
-		      + x.Elem(3) * a.Get(i).Z()
-		      + c.Get(i);
-		    if (hd > f) f = hd;
-		  }
-
-		if (f < fmin)
-		  {
-		    fmin = f;
-		    pmin.X() = x.Elem(1);
-		    pmin.Y() = x.Elem(2);
-		    pmin.Z() = x.Elem(3);
-		  }
-	      }
-          }
-
-  //  testout << "fmin = " << fmin << endl;
-  //  testout << "pmin = " << pmin << endl;
-
-  p = pmin;
-  return (fmin < -1e-3 * hmax) ? 1 : 0;
-  //  return (fmin < 0) ? 1 : 0;
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/findip.hpp b/contrib/Netgen/libsrc/meshing/findip.hpp
deleted file mode 100644
index a0aed91b6cefc970e1011e1f6d0fb319ed50d7f9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/findip.hpp
+++ /dev/null
@@ -1,108 +0,0 @@
-// find inner point
-
-template <typename POINTARRAY, typename FACEARRAY>
-inline int FindInnerPoint (POINTARRAY & points,
-		    FACEARRAY & faces,
-		    Point3d & p)
-{
-  int i, j;
-  ARRAY<Vec3d> a;
-  ARRAY<double> c;
-  Point3d p1, pmin;
-  int i1, i2, i3, i4;
-  int nf;
-  DenseMatrix m(3), inv(3);
-  Vector rs(3), x(3);
-  double f, fmin, hd, hmax;
-
-  nf = faces.Size();
-
-  //  testout << "#faces  = " << faces.Size() << endl;
-  //  testout << "#points = " << points.Size() << endl;
-
-  a.SetSize (nf);
-  c.SetSize (nf);
-
-  for (i = 1; i <= nf; i++)
-    {
-      p1 = points.Get(faces.Get(i).PNum(1));
-      a.Elem(i) = Cross (points.Get(faces.Get(i).PNum(2)) - points.Get(faces.Get(i).PNum(1)),
-		    points.Get(faces.Get(i).PNum(3)) - points.Get(faces.Get(i).PNum(1)));
-      a.Elem(i) /= a.Get(i).Length();
-      c.Elem(i) = - (a.Get(i).X() * p1.X() + a.Get(i).Y() * p1.Y() + a.Get(i).Z() * p1.Z());
-    }
-
-
-  hmax = 0;
-  for (i = 1; i <= nf; i++)
-    {
-      const Element2d & el = faces.Get(i);
-      for (j = 1; j <= 3; j++)
-	{
-	  double hi = Dist (points.Get(el.PNumMod(j)),
-			    points.Get(el.PNumMod(j+1)));
-	  if (hi > hmax) hmax = hi;
-	}
-    }
-
-
-  fmin = 100;
-  pmin = Point3d (0, 0, 0);
-
-  for (i1 = 1; i1 <= nf; i1++)
-    for (i2 = i1+1; i2 <= nf; i2++)
-      for (i3 = i2+1; i3 <= nf; i3++)
-        for (i4 = i3+1; i4 <= nf; i4++)
-          {
-	    m.Elem(1, 1) = a.Get(i1).X() - a.Get(i2).X();
-	    m.Elem(1, 2) = a.Get(i1).Y() - a.Get(i2).Y();
-	    m.Elem(1, 3) = a.Get(i1).Z() - a.Get(i2).Z();
-	    rs.Elem(1) = c.Get(i2) - c.Get(i1);
-
-	    m.Elem(2, 1) = a.Get(i1).X() - a.Get(i3).X();
-	    m.Elem(2, 2) = a.Get(i1).Y() - a.Get(i3).Y();
-	    m.Elem(2, 3) = a.Get(i1).Z() - a.Get(i3).Z();
-	    rs.Elem(2) = c.Get(i3) - c.Get(i1);
-
-	    m.Elem(3, 1) = a.Get(i1).X() - a.Get(i4).X();
-	    m.Elem(3, 2) = a.Get(i1).Y() - a.Get(i4).Y();
-	    m.Elem(3, 3) = a.Get(i1).Z() - a.Get(i4).Z();
-	    rs.Elem(3) = c.Get(i4) - c.Get(i1);
-
-
-	    if (fabs (m.Det()) > 1e-10)
-	      {
-		CalcInverse (m, inv);
-		inv.Mult (rs, x);
-
-		//            testout << "x = " << x << endl;
-
-
-		f = -1e10;
-		for (i = 1; i <= nf; i++)
-		  {
-		    hd = x.Elem(1) * a.Get(i).X()
-		      + x.Elem(2) * a.Get(i).Y()
-		      + x.Elem(3) * a.Get(i).Z()
-		      + c.Get(i);
-		    if (hd > f) f = hd;
-		  }
-
-		if (f < fmin)
-		  {
-		    fmin = f;
-		    pmin.X() = x.Elem(1);
-		    pmin.Y() = x.Elem(2);
-		    pmin.Z() = x.Elem(3);
-		  }
-	      }
-          }
-
-  //  testout << "fmin = " << fmin << endl;
-  //  testout << "pmin = " << pmin << endl;
-
-  p = pmin;
-  return (fmin < -1e-3 * hmax) ? 1 : 0;
-  //  return (fmin < 0) ? 1 : 0;
-}
-
diff --git a/contrib/Netgen/libsrc/meshing/geomsearch.cpp b/contrib/Netgen/libsrc/meshing/geomsearch.cpp
deleted file mode 100644
index 1c37637816ed957e8c09ade4591063852ffb9877..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/geomsearch.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-  GeomSearch3d :: GeomSearch3d() 
-  {
-    size.i1 = 0; size.i2 = 0; size.i3 = 0; 
-  }
-
-  GeomSearch3d :: ~GeomSearch3d()
-  {
-    //delete old Hashtable:
-    if (size.i1 != 0)
-      {
-	for (int i = 0; i < size.i1*size.i2*size.i3; i++)
-	  delete hashtable[i];
-      } 
-  }
-
-  void GeomSearch3d :: Init (ARRAY <FrontPoint3,PointIndex::BASE> *pointsi, ARRAY <FrontFace> *facesi)
-  {
-    points = pointsi;
-    faces = facesi;
-    size.i1 = 0; size.i2 = 0; size.i3 = 0; 
-    reset = 1;
-    hashcount = 1;
-  }
-
-  void GeomSearch3d :: ElemMaxExt(Point3d& minp, Point3d& maxp, const Element2d& elem)
-  {
-    maxp.X()=(*points)[elem.PNum(1)].P().X();
-    maxp.Y()=(*points)[elem.PNum(1)].P().Y();
-    maxp.Z()=(*points)[elem.PNum(1)].P().Z();
-    minp.X()=(*points)[elem.PNum(1)].P().X();
-    minp.Y()=(*points)[elem.PNum(1)].P().Y();
-    minp.Z()=(*points)[elem.PNum(1)].P().Z();
-  
-    for (int i=2; i <= 3; i++)
-      {
-	maxp.X()=max2((*points)[elem.PNum(i)].P().X(),maxp.X());
-	maxp.Y()=max2((*points)[elem.PNum(i)].P().Y(),maxp.Y());
-	maxp.Z()=max2((*points)[elem.PNum(i)].P().Z(),maxp.Z());
-	minp.X()=min2((*points)[elem.PNum(i)].P().X(),minp.X());
-	minp.Y()=min2((*points)[elem.PNum(i)].P().Y(),minp.Y());
-	minp.Z()=min2((*points)[elem.PNum(i)].P().Z(),minp.Z());
-      }
-  }
-
-  void GeomSearch3d :: MinCoords(const Point3d& p1, Point3d& p2)
-  {
-    p2.X()=min2(p1.X(),p2.X());
-    p2.Y()=min2(p1.Y(),p2.Y());
-    p2.Z()=min2(p1.Z(),p2.Z());
-  }
-
-  void GeomSearch3d :: MaxCoords(const Point3d& p1, Point3d& p2)
-  {
-    p2.X()=max2(p1.X(),p2.X());
-    p2.Y()=max2(p1.Y(),p2.Y());
-    p2.Z()=max2(p1.Z(),p2.Z());
-  }
-
-  void GeomSearch3d :: Create()
-  {
-    INDEX i,j,k;
-    if (reset)
-      {
-	const double hashelemsizefactor = 4;
-	reset = 0;
-	/*
-	  minext=Point3d(MAXDOUBLE, MAXDOUBLE, MAXDOUBLE);
-	  maxext=Point3d(MINDOUBLE, MINDOUBLE, MINDOUBLE);
-	*/
-	ElemMaxExt(minext, maxext, faces->Get(1).Face());
-	Point3d maxp, minp;
-	Vec3d midext(0,0,0);
-      
-	//get max Extension of Frontfaces
-	for (i = 1; i <= faces->Size(); i++)
-	  {
-	    ElemMaxExt(minp, maxp, faces->Get(i).Face());
-	    MinCoords(minp, minext);
-	    MaxCoords(maxp, maxext);
-	    midext+=maxp-minp;
-	  }
-
-
-	maxextreal = maxext;
-	maxext = maxext + 1e-4 * (maxext - minext);
-
-	midext*=1./faces->Size();
-	Vec3d boxext = maxext - minext;
-      
-	//delete old Hashtable:
-	if (size.i1 != 0)
-	  {
-	    for (i = 1; i <= size.i1*size.i2*size.i3; i++)
-	      {
-		delete hashtable.Get(i);
-	      }
-	  } 
-      
-	size.i1 = int (boxext.X()/midext.X()/hashelemsizefactor+1);
-	size.i2 = int (boxext.Y()/midext.Y()/hashelemsizefactor+1);
-	size.i3 = int (boxext.Z()/midext.Z()/hashelemsizefactor+1);
-	PrintMessage (5, "hashsizes = ", size.i1, ", ", size.i2, ", ", size.i3);
-      
-	elemsize.X()=boxext.X()/size.i1;
-	elemsize.Y()=boxext.Y()/size.i2;
-	elemsize.Z()=boxext.Z()/size.i3;
-
-	//create Hasharrays:
-	hashtable.SetSize(size.i1*size.i2*size.i3);
-	for (i = 1; i <= size.i1; i++)
-	  {
-	    for (j = 1; j <= size.i2; j++)
-	      {
-		for (k = 1; k <= size.i3; k++)
-		  {
-		    INDEX ind=i+(j-1)*size.i1+(k-1)*size.i2*size.i1;
-		    hashtable.Elem(ind) = new ARRAY <int> ();
-		  }
-	      }
-	  }
-      }
-    else
-      {
-	//Clear all Hash-Arrays
-	for (i = 1; i <= size.i1; i++)
-	  {
-	    for (j = 1; j <= size.i2; j++)
-	      {
-		for (k = 1; k <= size.i3; k++)
-		  {
-		    INDEX ind=i+(j-1)*size.i1+(k-1)*size.i2*size.i1;
-		    hashtable.Elem(ind)->SetSize(0);
-		  }
-	      }
-	  }	  
-      }
-  
-    //Faces in Hashtable einfuegen:
-    for (i = 1; i <= faces->Size(); i++)
-      {
-	AddElem(faces->Get(i).Face(),i);
-      }
-  
-  }
-
-  void GeomSearch3d :: AddElem(const Element2d& elem, INDEX elemnum)
-  {
-    Point3d minp, maxp;
-    ElemMaxExt(minp, maxp, elem);
-    int sx = int ((minp.X()-minext.X())/elemsize.X()+1.);
-    int ex = int ((maxp.X()-minext.X())/elemsize.X()+1.);
-    int sy = int ((minp.Y()-minext.Y())/elemsize.Y()+1.);
-    int ey = int ((maxp.Y()-minext.Y())/elemsize.Y()+1.);
-    int sz = int ((minp.Z()-minext.Z())/elemsize.Z()+1.);
-    int ez = int ((maxp.Z()-minext.Z())/elemsize.Z()+1.);
-    int ix,iy,iz;
-  
-    for (ix = sx; ix <= ex; ix++)
-      {
-	for (iy = sy; iy <= ey; iy++)
-	  {
-	    for (iz = sz; iz <= ez; iz++)
-	      {
-		INDEX ind=ix+(iy-1)*size.i1+(iz-1)*size.i2*size.i1;
-		if (ind < 1 || ind > size.i1 * size.i2 * size.i3)
-		  {
-		    cerr << "Illegal hash-position";
-		    cerr << "Position: " << ix << "," << iy << "," << iz << endl;
-		  }
-		hashtable.Elem(ind)->Append(elemnum);		      
-	      }
-	  }
-      }
-  }
-
-  void GeomSearch3d :: GetLocals(ARRAY<Element2d> & locfaces,  ARRAY<INDEX> & findex,
-				 INDEX fstind, const Point3d& p0, double xh)
-  {
-    hashcount++;
-  
-    Point3d minp, maxp, midp; 
-
-    minp=p0-Vec3d(xh,xh,xh); //lay cube over sphere
-    maxp=p0+Vec3d(xh,xh,xh);
-
-    MaxCoords(minext,minp); //cube may not be out of hash-region
-    MinCoords(maxextreal,maxp);
-
-
-    int cluster = faces->Get(fstind).Cluster();
-  
-    int sx = int((minp.X()-minext.X())/elemsize.X()+1.);
-    int ex = int((maxp.X()-minext.X())/elemsize.X()+1.);
-    int sy = int((minp.Y()-minext.Y())/elemsize.Y()+1.);
-    int ey = int((maxp.Y()-minext.Y())/elemsize.Y()+1.);
-    int sz = int((minp.Z()-minext.Z())/elemsize.Z()+1.);
-    int ez = int((maxp.Z()-minext.Z())/elemsize.Z()+1.);
-    int ix,iy,iz,i,k;
-
-    int cnt1 = 0;  // test, how efficient hashtable is
-    int cnt2 = 0;
-    int cnt3 = 0;
-  
-    for (ix = sx; ix <= ex; ix++)
-      {
-	for (iy = sy; iy <= ey; iy++)
-	  {
-	    for (iz = sz; iz <= ez; iz++)
-	      {
-		INDEX ind=ix+(iy-1)*size.i1+(iz-1)*size.i2*size.i1;
-	      
-		//go through all elements in one hash area
-		const ARRAY <int> & area = *hashtable.Elem(ind);
-		for (k = 1; k <= area.Size(); k++)
-		  {
-		    cnt2++;
-		    i = area.Get(k);
-		    if (faces->Get(i).Cluster() == cluster && 
-			faces->Get(i).Valid() &&
-			faces->Get(i).HashValue() != hashcount && 
-			i != fstind)
-		      {
-			cnt1++;
-			const Element2d & face = faces->Get(i).Face();
-		      
-			const Point3d & p1 = (*points)[face.PNum(1)].P();
-			const Point3d & p2 = (*points)[face.PNum(2)].P();
-			const Point3d & p3 = (*points)[face.PNum(3)].P();
-		      
-			midp = Center (p1, p2, p3);
-		      
-			if (Dist2 (midp, p0) <= xh*xh)
-			  {
-			    cnt3++;
-			    locfaces.Append(faces->Get(i).Face());
-			    findex.Append(i);
-			    faces->Elem(i).SetHashValue(hashcount);
-			  }
-		      }
-		  }
-	      }
-	  }
-      }
-    /*
-      if (faces->Size() != 0 && hashcount % 200 == 0)
-      {
-      (*mycout) << "n.o.f= " << faces->Size();
-      (*mycout) << ", n.o.lf= " << locfaces.Size();
-      (*mycout) << ", hashf= " << (double)cnt2/(double)faces->Size();
-      (*mycout) << " (" << (double)cnt1/(double)faces->Size();
-      (*mycout) << ", " << (double)cnt3/(double)faces->Size() << ")" << endl;
-      }
-    */
-
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/geomsearch.hpp b/contrib/Netgen/libsrc/meshing/geomsearch.hpp
deleted file mode 100644
index 5364c24f8db8ed8cc521bf381282e6fc44ff7e41..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/geomsearch.hpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef FILE_GEOMSEARCH
-#define FILE_GEOMSEARCH
-
-/**************************************************************************/
-/* File:   geomsearch.hh                                                  */
-/* Author: Johannes Gerstmayr                                             */
-/* Date:   19. Nov. 97                                                    */
-/**************************************************************************/
-
-class FrontPoint3;
-class FrontFace;
-
-  /// class for quick access of 3D-elements; class cannot delete elements, but only append
-class GeomSearch3d
-{
-
-public:
-  ///
-  GeomSearch3d();
-  ///
-  virtual ~GeomSearch3d();
-
-  ///
-  void Init (ARRAY <FrontPoint3,PointIndex::BASE> *pointsi, ARRAY <FrontFace> *facesi);
-
-  ///get elements max extension
-  void ElemMaxExt(Point3d& minp, Point3d& maxp, const Element2d& elem);
-  
-  ///get minimum coordinates of two points ->p2
-  void MinCoords(const Point3d& p1, Point3d& p2);
-
-  ///get minimum coordinates of two points ->p2
-  void MaxCoords(const Point3d& p1, Point3d& p2);
-
-  ///create a hashtable from an existing array of triangles
-  ///sizei = number of pieces in one direction
-  void Create();
-
-  ///add new element to Hashtable
-  void AddElem(const Element2d& elem, INDEX elemnum);
-
-  ///GetLocal faces in sphere with radius xh and middlepoint p
-  void GetLocals(ARRAY<Element2d> & locfaces,  ARRAY<INDEX> & findex,
-		 INDEX fstind, const Point3d& p0, double xh);
-
-private:
-  
-  ARRAY <FrontFace> *faces; // Pointers to Arrays in Adfront
-  ARRAY <FrontPoint3,PointIndex::BASE> *points;
-
-  ARRAY <ARRAY <int>*> hashtable;
-
-  Point3d minext; //extension of Hashdomain
-  Point3d maxext;
-  Point3d maxextreal;
-  Vec3d elemsize;  //size of one Hash-Element
-
-  threeint size; // size of Hashtable in each direction
-  int reset;
-  int hashcount;
-};
-
-#endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/global.cpp b/contrib/Netgen/libsrc/meshing/global.cpp
deleted file mode 100644
index 60a1fbe51d15b2846c108725384962b23b62b614..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/global.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-  ostream * testout = &cout;
-
-  ostream * mycout = &cout;
-  ostream * myerr = &cerr;
-
-
-  // Flags globflags; // not used anymoure
-  Flags parameters;
-
-
-  int silentflag = 0;
-  int testmode = 0;
-
-  MeshingParameters mparam;
-  volatile multithreadt multithread;
-
-  string ngdir = ".";
-
-  ARRAY<int> tets_in_qualclass;
-
-
-  multithreadt :: multithreadt()
-  {
-    pause =0;
-    testmode = 0;
-    redraw = 0;
-    drawing = 0;
-    terminate = 0;
-    running = 0;
-    percent = 0;
-    task = "";
-  }
-
-  DebugParameters debugparam;
-  bool verbose = 0;
-
-  int timestamp = 0;
-  int GetTimeStamp() 
-  { 
-    return timestamp; 
-  }
-
-  int NextTimeStamp()
-  {
-    timestamp++;
-    return timestamp;
-  }
-}
diff --git a/contrib/Netgen/libsrc/meshing/global.hpp b/contrib/Netgen/libsrc/meshing/global.hpp
deleted file mode 100644
index 843231d0c51e910a6516d7ea5b7b137b8f1402ac..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/global.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef FILE_GLOBAL
-#define FILE_GLOBAL
-
-
-/**************************************************************************/
-/* File:   global.hh                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Okt. 95                                                    */
-/**************************************************************************/
-
-/*
-  global functions and variables
-*/
-
-///
-extern double GetTime ();
-extern void ResetTime ();
-
-///
-extern int testmode;
-
-// extern ostream * testout;
-// extern AutoPtr<ostream> testout;
-
-/// calling parameters
-extern Flags parameters;
-
-extern MeshingParameters mparam;
-
-extern ARRAY<int> tets_in_qualclass;
-
-
-class multithreadt
-{
-public:
-  int pause;
-  int testmode;
-  int redraw;
-  int drawing;
-  int terminate;
-  int running;
-  double percent;
-  char * task;
-  bool demorunning;
-  multithreadt();
-};
-
-extern volatile multithreadt multithread;
-
-extern string ngdir;
-extern DebugParameters debugparam;
-extern bool verbose;  
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/hpref_prism.hpp b/contrib/Netgen/libsrc/meshing/hpref_prism.hpp
deleted file mode 100644
index ffbf2d2873617eab8bb1cd7c546befaf78701af3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_prism.hpp
+++ /dev/null
@@ -1,300 +0,0 @@
-
-
-
-
-
-  // HP_PRISM  ... no refinement
-  int refprism_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_newels[][8] =
-    {
-      { 1, 2, 3, 4, 5, 6 }
-    };
-  HPRef_Struct refprism =
-    {
-      HP_PRISM,
-      refprism_splitedges, 
-      0, 0,
-      refprism_newelstypes, 
-      refprism_newels
-    };
-
-
-
-  // HP_PRISM_SINGEDGE  ... vertical edge 1-4 is singular
-  int refprism_singedge_splitedges[][3] =
-    {
-      { 1, 2, 7 },
-      { 1, 3, 8 },
-      { 4, 5, 9 },
-      { 4, 6, 10 },
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_singedge_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE,
-      HP_HEX,
-      HP_NONE,
-    };
-  int refprism_singedge_newels[][8] =
-    {
-      { 1, 7, 8, 4, 9, 10 },
-      { 3, 8, 7, 2, 6, 10, 9, 5 }
-    };
-  HPRef_Struct refprism_singedge =
-    {
-      HP_PRISM,
-      refprism_singedge_splitedges, 
-      0, 0,
-      refprism_singedge_newelstypes, 
-      refprism_singedge_newels
-    };
-
-
-
-
-
-
-  // HP_PRISM_SINGEDGE_V12  vertical edges 1-4 and 2-5 are singular 
-  int refprism_singedge_v12_splitedges[][3] =
-    {
-      { 1, 2, 7 },
-      { 1, 3, 8 },
-      { 2, 1, 9 },
-      { 2, 3, 10 },
-      { 4, 5, 11 },
-      { 4, 6, 12 },
-      { 5, 4, 13 },
-      { 5, 6, 14},
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_singedge_v12_newelstypes[] =
-    {
-      HP_HEX,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_singedge_v12_newels[][8] =
-    {
-      { 7, 9, 10, 8, 11, 13, 14, 12 },
-      { 1, 7, 8, 4, 11, 12 },
-      { 2, 10, 9, 5, 14, 13 },
-      { 3, 8, 10, 6, 12, 14 },
-    };
-  HPRef_Struct refprism_singedge_v12 =
-    {
-      HP_PRISM,
-      refprism_singedge_v12_splitedges, 
-      0, 0,
-      refprism_singedge_v12_newelstypes, 
-      refprism_singedge_v12_newels
-    };
-
-
-
-
-
-
-  // HP_PRISM_SINGEDGE_H12
-  int refprism_singedge_h12_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 1, 8 },
-      { 2, 3, 9 },
-      { 3, 1, 10 },
-
-      { 4, 6, 12 },
-      { 5, 4, 13 },
-      { 5, 6, 14 },
-      { 6, 4, 15 },
-
-      { 0, 0, 0 }
-    };
-
-  int refprism_singedge_h12_splitfaces[][4] =
-    {
-      { 2, 1, 3, 11 },
-      { 5, 4, 6, 16 },
-      { 0, 0, 0, 0 },
-    };
-
-  HPREF_ELEMENT_TYPE refprism_singedge_h12_newelstypes[] =
-    {
-      HP_HEX,
-      HP_HEX,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_singedge_h12_newels[][8] =
-    {
-      { 1, 8, 11, 7, 4, 13, 16, 12 },
-      { 9, 3, 10, 11, 14, 6, 15, 16 },
-      { 7, 11, 10, 12, 16, 15 },
-      { 2, 9, 11, 5, 14, 16 },
-      { 8, 2, 11, 13, 5, 16 }
-    };
-  HPRef_Struct refprism_singedge_h12 =
-    {
-      HP_PRISM,
-      refprism_singedge_h12_splitedges, 
-      refprism_singedge_h12_splitfaces, 
-      0,
-      refprism_singedge_h12_newelstypes, 
-      refprism_singedge_h12_newels
-    };
-
-
-
-
-
-
-  // HP_PRISM_SINGEDGE_H1
-  int refprism_singedge_h1_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 3, 8 },
-      { 4, 6, 9 },
-      { 5, 6, 10 },
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_singedge_h1_newelstypes[] =
-    {
-      HP_HEX,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_singedge_h1_newels[][8] =
-    {
-      { 1, 2, 8, 7, 4, 5, 10, 9 },
-      { 3, 7, 8, 6, 9, 10 }
-    };
-  HPRef_Struct refprism_singedge_h1 =
-    {
-      HP_PRISM,
-      refprism_singedge_h1_splitedges, 
-      0, 0,
-      refprism_singedge_h1_newelstypes, 
-      refprism_singedge_h1_newels
-    };
-
-
-
-
-
-
-
-//  HP_PRISM_1FA_0E_0V
-  int refprism_1fa_0e_0v_splitedges[][3] =
-    {
-      { 1, 4, 7 },
-      { 2, 5, 8 },
-      { 3, 6, 9 },
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_1fa_0e_0v_newelstypes[] =
-    {
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_1fa_0e_0v_newels[][8] =
-    {
-      { 1, 2, 3, 7, 8, 9 },
-      { 7, 8, 9, 4, 5, 6 }
-    };
-  HPRef_Struct refprism_1fa_0e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_0e_0v_splitedges, 
-      0, 0,
-      refprism_1fa_0e_0v_newelstypes, 
-      refprism_1fa_0e_0v_newels
-    };
-
-
-
-
-
-
-//  HP_PRISM_1FB_0E_0V   ... quad face 1-2-4-5
-  int refprism_1fb_0e_0v_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 3, 8 },
-      { 4, 6, 9 },
-      { 5, 6, 10 },
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_1fb_0e_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_1fb_0e_0v_newels[][8] =
-    {
-      { 1, 4, 5, 2, 7, 9, 10, 8  },
-      { 7, 8, 3, 9, 10, 6 }
-    };
-  HPRef_Struct refprism_1fb_0e_0v =
-    {
-      HP_PRISM,
-      refprism_1fb_0e_0v_splitedges, 
-      0, 0,
-      refprism_1fb_0e_0v_newelstypes, 
-      refprism_1fb_0e_0v_newels
-    };
-
-
-
-
-
-
-//  HP_PRISM_1FB_1EA_0V   ... quad face 1-2-4-5
-  int refprism_1fb_1ea_0v_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 3, 8 },
-      { 4, 6, 9 },
-      { 5, 6, 10 },
-      { 1, 2, 11 },
-      { 4, 5, 12 },
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_1fb_1ea_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_1fb_1ea_0v_newels[][8] =
-    {
-      { 11, 12, 5, 2, 7, 9, 10, 8  },
-      { 1, 11, 7, 4, 12, 9 },
-      { 7, 8, 3, 9, 10, 6 }
-    };
-  HPRef_Struct refprism_1fb_1ea_0v =
-    {
-      HP_PRISM,
-      refprism_1fb_1ea_0v_splitedges, 
-      0, 0,
-      refprism_1fb_1ea_0v_newelstypes, 
-      refprism_1fb_1ea_0v_newels
-    };
-
-
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/hpref_quad.hpp b/contrib/Netgen/libsrc/meshing/hpref_quad.hpp
deleted file mode 100644
index 8802d4539e71e11649bd0fb35277a9f6fae7430a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_quad.hpp
+++ /dev/null
@@ -1,2129 +0,0 @@
-
-
-
-
-// HP_QUAD
-int refquad_splitedges[][3] =
-{
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_newelstypes[] =
-{
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_newels[][8] =
-{
-  { 1, 2, 3, 4 },
-};
-HPRef_Struct refquad =
-{
-  HP_QUAD,
-  refquad_splitedges, 
-  0, 0,
-  refquad_newelstypes, 
-  refquad_newels
-};
-
-
-
-
-
-
-
-// HP_QUAD_SINGCORNER
-int refquad_singcorner_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_singcorner_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_QUAD,
-  HP_TRIG,
-  HP_NONE,
-};
-int refquad_singcorner_newels[][8] =
-{
-  { 1, 5, 6 },
-  { 2, 4, 6, 5 },
-  { 2, 3, 4 },
-};
-HPRef_Struct refquad_singcorner =
-{
-  HP_QUAD,
-  refquad_singcorner_splitedges, 
-  0, 0,
-  refquad_singcorner_newelstypes, 
-  refquad_singcorner_newels
-};
-
-
-
-
-
-// HP_DUMMY_QUAD_SINGCORNER
-int refdummyquad_singcorner_splitedges[][3] =
-{
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refdummyquad_singcorner_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_TRIG,
-  HP_NONE,
-};
-int refdummyquad_singcorner_newels[][8] =
-{
-  { 1, 2, 4 },
-  { 4, 2, 3 },
-};
-HPRef_Struct refdummyquad_singcorner =
-{
-  HP_QUAD,
-  refdummyquad_singcorner_splitedges, 
-  0, 0,
-  refdummyquad_singcorner_newelstypes, 
-  refdummyquad_singcorner_newels
-};
-
-
-
-
-
-
-
-// HP_QUAD_SINGEDGE
-int refquad_singedge_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_singedge_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_singedge_newels[][8] =
-{
-  { 1, 2, 6, 5 },
-  { 5, 6, 3, 4 },
-};
-HPRef_Struct refquad_singedge =
-{
-  HP_QUAD,
-  refquad_singedge_splitedges, 
-  0, 0,
-  refquad_singedge_newelstypes, 
-  refquad_singedge_newels
-};
-
-
-
-
-
-
-// HP_QUAD_0E_2VA
-int refquad_0e_2va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_0e_2va_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_0e_2va_newels[][8] =
-{
-  { 1, 5, 6 },
-  { 2, 8, 7 },
-  { 5, 7, 8, 6 },
-  { 6, 8, 3, 4 },
-};
-HPRef_Struct refquad_0e_2va =
-{
-  HP_QUAD,
-  refquad_0e_2va_splitedges, 
-  0, 0,
-  refquad_0e_2va_newelstypes, 
-  refquad_0e_2va_newels
-};
-
-
-
-// HP_QUAD_0E_2VB
-int refquad_0e_2vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 3, 4, 7 },
-  { 3, 2, 8 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_0e_2vb_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_0e_2vb_newels[][8] =
-{
-  { 1, 5, 6 },
-  { 3, 7, 8 },
-  { 5, 2, 4, 6 },
-  { 2, 8, 7, 4 },
-};
-HPRef_Struct refquad_0e_2vb =
-{
-  HP_QUAD,
-  refquad_0e_2vb_splitedges, 
-  0, 0,
-  refquad_0e_2vb_newelstypes, 
-  refquad_0e_2vb_newels
-};
-
-
-
-
-// HP_QUAD_0E_3V
-int refquad_0e_3v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 3, 2, 9 },
-  { 3, 4, 10 },
-  { 0, 0, 0 }
-};
-
-int refquad_0e_3v_splitfaces[][4] =
-{
-  { 2, 3, 1, 14 },
-  { 0, 0, 0, 0 },
-};
-
-HPREF_ELEMENT_TYPE refquad_0e_3v_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_DUMMY_QUAD_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD,
-  HP_QUAD,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_0e_3v_newels[][8] =
-{
-  { 1, 5, 6 },
-  { 2, 8, 14, 7 },
-  { 3, 10, 9 },
-  { 5, 7, 14, 6 },
-  { 8, 9, 10, 14 },
-  { 6, 14, 10, 4 },
-};
-HPRef_Struct refquad_0e_3v =
-{
-  HP_QUAD,
-  refquad_0e_3v_splitedges, 
-  refquad_0e_3v_splitfaces, 
-  0,
-  refquad_0e_3v_newelstypes, 
-  refquad_0e_3v_newels
-};
-
-
-
-
-// HP_QUAD_0E_4V
-int refquad_0e_4v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 3, 2, 9 },
-  { 3, 4, 10 },
-  { 4, 1, 11 },
-  { 4, 3, 12 },
-  { 0, 0, 0 }
-};
-
-int refquad_0e_4v_splitfaces[][4] =
-{
-  { 1, 2, 4, 13 },
-  { 2, 3, 1, 14 },
-  { 3, 4, 2, 15 },
-  { 4, 1, 3, 16 },
-  { 0, 0, 0, 0 },
-};
-
-HPREF_ELEMENT_TYPE refquad_0e_4v_newelstypes[] =
-{
-  HP_DUMMY_QUAD_SINGCORNER,
-  HP_DUMMY_QUAD_SINGCORNER,
-  HP_DUMMY_QUAD_SINGCORNER,
-  HP_DUMMY_QUAD_SINGCORNER,
-
-  HP_QUAD,
-  HP_QUAD,
-  HP_QUAD,
-  HP_QUAD,
-
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_0e_4v_newels[][8] =
-{
-  { 1, 5, 13, 6 },
-  { 2, 8, 14, 7 },
-  { 3, 10, 15, 9 },
-  { 4, 11, 16, 12 },
-  { 5, 7, 14, 13 },
-  { 8, 9, 15, 14 },
-  { 10, 12, 16, 15 },
-  { 11, 6, 13, 16 },
-  { 13, 14, 15, 16 }
-};
-HPRef_Struct refquad_0e_4v =
-{
-  HP_QUAD,
-  refquad_0e_4v_splitedges, 
-  refquad_0e_4v_splitfaces, 
-  0,
-  refquad_0e_4v_newelstypes, 
-  refquad_0e_4v_newels
-};
-
-
-
-
-
-
-
-
-// HP_QUAD_1E_1VA
-int refquad_1e_1va_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_1va_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_NONE,
-};
-int refquad_1e_1va_newels[][8] =
-{
-  { 7, 2, 6, 5 },
-  { 5, 6, 3, 4 },
-  { 1, 7, 5 },
-};
-HPRef_Struct refquad_1e_1va =
-{
-  HP_QUAD,
-  refquad_1e_1va_splitedges, 
-  0, 0,
-  refquad_1e_1va_newelstypes, 
-  refquad_1e_1va_newels
-};
-
-
-
-
-// HP_QUAD_1E_1VB
-int refquad_1e_1vb_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 2, 1, 7 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_1vb_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_NONE,
-};
-int refquad_1e_1vb_newels[][8] =
-{
-  { 1, 7, 6, 5 },
-  { 5, 6, 3, 4 },
-  { 7, 2, 6 },
-};
-HPRef_Struct refquad_1e_1vb =
-{
-  HP_QUAD,
-  refquad_1e_1vb_splitedges, 
-  0, 0,
-  refquad_1e_1vb_newelstypes, 
-  refquad_1e_1vb_newels
-};
-
-
-
-// HP_QUAD_1E_1VC
-int refquad_1e_1vc_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 3, 4, 8 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_1vc_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int refquad_1e_1vc_newels[][8] =
-{
-  { 1, 2, 6, 5 },
-  { 5, 6, 4 },
-  { 4, 6, 7, 8 },
-  { 3, 8, 7 }
-};
-HPRef_Struct refquad_1e_1vc =
-{
-  HP_QUAD,
-  refquad_1e_1vc_splitedges, 
-  0, 0,
-  refquad_1e_1vc_newelstypes, 
-  refquad_1e_1vc_newels
-};
-
-
-
-// HP_QUAD_1E_1VD
-int refquad_1e_1vd_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 4, 1, 7 },
-  { 4, 3, 8 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_1vd_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int refquad_1e_1vd_newels[][8] =
-{
-  { 1, 2, 6, 5 },
-  { 5, 6, 3 },
-  { 5, 3, 8, 7 },
-  { 4, 7, 8 }
-};
-HPRef_Struct refquad_1e_1vd =
-{
-  HP_QUAD,
-  refquad_1e_1vd_splitedges, 
-  0, 0,
-  refquad_1e_1vd_newelstypes, 
-  refquad_1e_1vd_newels
-};
-
-
-
-
-
-
-
-// HP_QUAD_1E_2VA
-int refquad_1e_2va_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 2, 1, 8 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_2va_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_NONE,
-};
-int refquad_1e_2va_newels[][8] =
-{
-  { 7, 8, 6, 5 },
-  { 5, 6, 3, 4 },
-  { 1, 7, 5 },
-  { 8, 2, 6 }
-};
-HPRef_Struct refquad_1e_2va =
-{
-  HP_QUAD,
-  refquad_1e_2va_splitedges, 
-  0, 0,
-  refquad_1e_2va_newelstypes, 
-  refquad_1e_2va_newels
-};
-
-
-
-
-// HP_QUAD_1E_2VB
-int refquad_1e_2vb_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 3, 2, 8 },
-  { 3, 4, 9 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_2vb_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int refquad_1e_2vb_newels[][8] =
-{
-  { 7, 2, 6, 5 },
-  { 1, 7, 5 },
-  { 5, 6, 4 },
-  { 4, 6, 8, 9 },
-  { 3, 9, 8 }
-};
-HPRef_Struct refquad_1e_2vb =
-{
-  HP_QUAD,
-  refquad_1e_2vb_splitedges, 
-  0, 0,
-  refquad_1e_2vb_newelstypes, 
-  refquad_1e_2vb_newels
-};
-
-
-
-
-// HP_QUAD_1E_2VC
-int refquad_1e_2vc_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 4, 1, 8 },
-  { 4, 3, 9 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_2vc_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int refquad_1e_2vc_newels[][8] =
-{
-  { 7, 2, 6, 5 },
-  { 1, 7, 5 },
-  { 5, 6, 3 },
-  { 5, 3, 9, 8 },
-  { 4, 8, 9 }
-};
-HPRef_Struct refquad_1e_2vc =
-{
-  HP_QUAD,
-  refquad_1e_2vc_splitedges, 
-  0, 0,
-  refquad_1e_2vc_newelstypes, 
-  refquad_1e_2vc_newels
-};
-
-
-
-
-// HP_QUAD_1E_2VD
-int refquad_1e_2vd_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 2, 1, 7 },
-  { 3, 2, 8 },
-  { 3, 4, 9 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_2vd_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int refquad_1e_2vd_newels[][8] =
-{
-  { 1, 7, 6, 5 },
-  { 7, 2, 6 },
-  { 5, 6, 4 },
-  { 4, 6, 8, 9 },
-  { 3, 9, 8 }
-};
-HPRef_Struct refquad_1e_2vd =
-{
-  HP_QUAD,
-  refquad_1e_2vd_splitedges, 
-  0, 0,
-  refquad_1e_2vd_newelstypes, 
-  refquad_1e_2vd_newels
-};
-
-
-
-
-
-// HP_QUAD_1E_2VE
-int refquad_1e_2ve_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 2, 1, 7 },
-  { 4, 1, 8 },
-  { 4, 3, 9 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_2ve_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int refquad_1e_2ve_newels[][8] =
-{
-  { 1, 7, 6, 5 },
-  { 7, 2, 6 },
-  { 5, 6, 3 },
-  { 5, 3, 9, 8 },
-  { 4, 8, 9 }
-};
-HPRef_Struct refquad_1e_2ve =
-{
-  HP_QUAD,
-  refquad_1e_2ve_splitedges, 
-  0, 0,
-  refquad_1e_2ve_newelstypes, 
-  refquad_1e_2ve_newels
-};
-
-
-
-
-
-
-// HP_QUAD_1E_2VF
-int refquad_1e_2vf_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 4, 1, 7 },
-  { 4, 3, 8 },
-  { 3, 2, 9 },
-  { 3, 4, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_2vf_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int refquad_1e_2vf_newels[][8] =
-{
-  { 1, 2, 6, 5 },
-  { 5, 6, 9, 7 },
-  { 7, 9, 10, 8 },
-  { 4, 7, 8 },
-  { 3, 10, 9 },
-};
-HPRef_Struct refquad_1e_2vf =
-{
-  HP_QUAD,
-  refquad_1e_2vf_splitedges, 
-  0, 0,
-  refquad_1e_2vf_newelstypes, 
-  refquad_1e_2vf_newels
-};
-
-
-
-
-
-// HP_QUAD_1E_3VA
-int refquad_1e_3va_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 2, 1, 8 },
-  { 3, 2, 9 },
-  { 3, 4, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_3va_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG,
-  HP_NONE,
-};
-int refquad_1e_3va_newels[][8] =
-{
-  { 1, 7, 5 },
-  { 8, 2, 6 },
-  { 3, 10, 9 },
-  { 7, 8, 6, 5 },
-  { 4, 6, 9, 10 },
-  { 5, 6, 4 }
-};
-HPRef_Struct refquad_1e_3va =
-{
-  HP_QUAD,
-  refquad_1e_3va_splitedges, 
-  0, 0,
-  refquad_1e_3va_newelstypes, 
-  refquad_1e_3va_newels
-};
-
-
-
-
-
-// HP_QUAD_1E_3VB
-int refquad_1e_3vb_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 2, 1, 8 },
-  { 4, 1, 9 },
-  { 4, 3, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_3vb_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG,
-  HP_NONE,
-};
-int refquad_1e_3vb_newels[][8] =
-{
-  { 1, 7, 5 },
-  { 8, 2, 6 },
-  { 4, 9, 10 },
-  { 7, 8, 6, 5 },
-  { 5, 3, 10, 9 },
-  { 5, 6, 3 }
-};
-HPRef_Struct refquad_1e_3vb =
-{
-  HP_QUAD,
-  refquad_1e_3vb_splitedges, 
-  0, 0,
-  refquad_1e_3vb_newelstypes, 
-  refquad_1e_3vb_newels
-};
-
-
-
-
-
-// HP_QUAD_1E_3VC
-int refquad_1e_3vc_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 3, 2, 8 },
-  { 3, 4, 9 },
-  { 4, 3, 10 },
-  { 4, 1, 11 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_3vc_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_1e_3vc_newels[][8] =
-{
-  { 1, 7, 5 },
-  { 3, 9, 8 },
-  { 4, 11, 10 },
-  { 7, 2, 6, 5 },
-  { 5, 6, 8, 11 },
-  { 11, 8, 9, 10 }
-};
-HPRef_Struct refquad_1e_3vc =
-{
-  HP_QUAD,
-  refquad_1e_3vc_splitedges, 
-  0, 0,
-  refquad_1e_3vc_newelstypes, 
-  refquad_1e_3vc_newels
-};
-
-
-
-
-// HP_QUAD_1E_3VD
-int refquad_1e_3vd_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 2, 1, 7 },
-  { 3, 2, 8 },
-  { 3, 4, 9 },
-  { 4, 3, 10 },
-  { 4, 1, 11 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_3vd_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_1e_3vd_newels[][8] =
-{
-  { 7, 2, 6 },
-  { 3, 9, 8 },
-  { 4, 11, 10 },
-  { 1, 7, 6, 5 },
-  { 5, 6, 8, 11 },
-  { 11, 8, 9, 10 }
-};
-HPRef_Struct refquad_1e_3vd =
-{
-  HP_QUAD,
-  refquad_1e_3vd_splitedges, 
-  0, 0,
-  refquad_1e_3vd_newelstypes, 
-  refquad_1e_3vd_newels
-};
-
-
-
-
-
-
-// HP_QUAD_1E_4V
-int refquad_1e_4v_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 2, 1, 8 },
-  { 4, 1, 9 },
-  { 3, 2, 10 },
-  { 4, 3, 11 },
-  { 3, 4, 12 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_1e_4v_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_1e_4v_newels[][8] =
-{
-  { 1, 7, 5 },
-  { 8, 2, 6 },
-  { 3, 12, 10 },
-  { 4, 9, 11 },
-  { 7, 8, 6, 5 },
-  { 5, 6, 10, 9 },
-  { 9, 10, 12, 11 }
-};
-HPRef_Struct refquad_1e_4v =
-{
-  HP_QUAD,
-  refquad_1e_4v_splitedges, 
-  0, 0,
-  refquad_1e_4v_newelstypes, 
-  refquad_1e_4v_newels
-};
-
-
-
-
-////////////////////////////////////////////////////////////////////////////////
-
-
-
-// HP_QUAD_2E
-int refquad_2e_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 4, 3, 8 },
-  { 0, 0, 0 }
-};
-int refquad_2e_splitfaces[][4] =
-{
-  { 1, 2, 4, 9 },
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2e_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2e_newels[][8] =
-{
-  { 1, 5, 9 },
-  { 6, 1, 9 },
-  { 5, 2, 7, 9 },
-  { 4, 6, 9, 8 },
-  { 9, 7, 3, 8 },
-};
-HPRef_Struct refquad_2e =
-{
-  HP_QUAD,
-  refquad_2e_splitedges, 
-  refquad_2e_splitfaces, 
-  0,
-  refquad_2e_newelstypes, 
-  refquad_2e_newels
-};
-
-
-
-
-
-
-
-// HP_QUAD_2E_1VA
-int refquad_2e_1va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 4, 3, 8 },
-  { 2, 1, 10 },
-  { 0, 0, 0 }
-};
-int refquad_2e_1va_splitfaces[][4] =
-{
-  { 1, 2, 4, 9 },
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2e_1va_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_NONE,
-};
-int refquad_2e_1va_newels[][8] =
-{
-  { 1, 5, 9 },
-  { 6, 1, 9 },
-  { 5, 10, 7, 9 },
-  { 4, 6, 9, 8 },
-  { 9, 7, 3, 8 },
-  { 10, 2, 7 },
-};
-HPRef_Struct refquad_2e_1va =
-{
-  HP_QUAD,
-  refquad_2e_1va_splitedges, 
-  refquad_2e_1va_splitfaces, 
-  0,
-  refquad_2e_1va_newelstypes, 
-  refquad_2e_1va_newels
-};
-
-
-
-
-
-
-// HP_QUAD_2E_1VB
-int refquad_2e_1vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 4, 3, 8 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 0, 0, 0 }
-};
-int refquad_2e_1vb_splitfaces[][4] =
-{
-  { 1, 2, 4, 9 },
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2e_1vb_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int refquad_2e_1vb_newels[][8] =
-{
-  { 1, 5, 9 },
-  { 6, 1, 9 },
-  { 5, 2, 7, 9 },
-  { 4, 6, 9, 8 },
-  { 7, 8, 9 },
-  { 8, 7, 10, 11 },
-  { 3, 11, 10 }
-};
-HPRef_Struct refquad_2e_1vb =
-{
-  HP_QUAD,
-  refquad_2e_1vb_splitedges, 
-  refquad_2e_1vb_splitfaces, 
-  0,
-  refquad_2e_1vb_newelstypes, 
-  refquad_2e_1vb_newels
-};
-
-
-
-
-
-// HP_QUAD_2E_1VC
-int refquad_2e_1vc_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 4, 1, 8 },
-  { 4, 3, 9 },
-  { 0, 0, 0 }
-};
-int refquad_2e_1vc_splitfaces[][4] =
-{
-  { 1, 2, 4, 10 },
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2e_1vc_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2e_1vc_newels[][8] =
-{
-  { 1, 5, 10 },
-  { 6, 1, 10 },
-  { 4, 8, 9 },
-  { 5, 2, 7, 10 },
-  { 8, 6, 10, 9 },
-  { 10, 7, 3, 9 },
-};
-HPRef_Struct refquad_2e_1vc =
-{
-  HP_QUAD,
-  refquad_2e_1vc_splitedges, 
-  refquad_2e_1vc_splitfaces, 
-  0,
-  refquad_2e_1vc_newelstypes, 
-  refquad_2e_1vc_newels
-};
-
-
-
-
-
-
-
-
-
-
-// HP_QUAD_2E
-int refquad_2e_2va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 4, 3, 8 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 2, 1, 12 },
-  { 0, 0, 0 }
-};
-int refquad_2e_2va_splitfaces[][4] =
-{
-  { 1, 2, 4, 9 },
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2e_2va_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_NONE,
-};
-int refquad_2e_2va_newels[][8] =
-{
-  { 1, 5, 9 },
-  { 6, 1, 9 },
-  { 5, 12, 7, 9 },
-  { 4, 6, 9, 8 },
-  { 7, 8, 9 },
-  { 8, 7, 10, 11 },
-  { 3, 11, 10 },
-  { 12, 2, 7 }
-};
-HPRef_Struct refquad_2e_2va =
-{
-  HP_QUAD,
-  refquad_2e_2va_splitedges, 
-  refquad_2e_2va_splitfaces, 
-  0,
-  refquad_2e_2va_newelstypes, 
-  refquad_2e_2va_newels
-};
-
-
-
-
-
-
-// HP_QUAD_2E_2VB
-int refquad_2e_2vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 4, 1, 9 },
-  { 4, 3, 10 },
-  { 0, 0, 0 }
-};
-int refquad_2e_2vb_splitfaces[][4] =
-{
-  { 1, 2, 4, 11 },
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2e_2vb_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2e_2vb_newels[][8] =
-{
-  { 1, 5, 11 },
-  { 6, 1, 11 },
-  { 4, 9, 10 },
-  { 7, 2, 8 },
-  { 5, 7, 8, 11 },
-  { 9, 6, 11, 10 },
-  { 3, 10, 11, 8 },
-};
-HPRef_Struct refquad_2e_2vb =
-{
-  HP_QUAD,
-  refquad_2e_2vb_splitedges, 
-  refquad_2e_2vb_splitfaces, 
-  0,
-  refquad_2e_2vb_newelstypes, 
-  refquad_2e_2vb_newels
-};
-
-
-
-
-
-
-
-
-
-
-// HP_QUAD_2E
-int refquad_2e_2vc_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 4, 3, 8 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 4, 1, 12 },
-  { 0, 0, 0 }
-};
-int refquad_2e_2vc_splitfaces[][4] =
-{
-  { 1, 2, 4, 9 },
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2e_2vc_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_NONE,
-};
-int refquad_2e_2vc_newels[][8] =
-{
-  { 1, 5, 9 },
-  { 6, 1, 9 },
-  { 5, 2, 7, 9 },
-  { 12, 6, 9, 8 },
-  { 7, 8, 9 },
-  { 8, 7, 10, 11 },
-  { 3, 11, 10 },
-  { 4, 12, 8 }
-};
-HPRef_Struct refquad_2e_2vc =
-{
-  HP_QUAD,
-  refquad_2e_2vc_splitedges, 
-  refquad_2e_2vc_splitfaces, 
-  0,
-  refquad_2e_2vc_newelstypes, 
-  refquad_2e_2vc_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// HP_QUAD_2E
-int refquad_2e_3v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 4, 3, 8 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 2, 1, 12 },
-  { 4, 1, 13 },
-  { 0, 0, 0 }
-};
-int refquad_2e_3v_splitfaces[][4] =
-{
-  { 1, 2, 4, 9 },
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2e_3v_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_NONE,
-};
-int refquad_2e_3v_newels[][8] =
-{
-  { 1, 5, 9 },
-  { 6, 1, 9 },
-  { 5, 12, 7, 9 },
-  { 13, 6, 9, 8 },
-  { 7, 8, 9 },
-  { 8, 7, 10, 11 },
-  { 3, 11, 10 },
-  { 12, 2, 7 },
-  { 4, 13, 8 }
-};
-HPRef_Struct refquad_2e_3v =
-{
-  HP_QUAD,
-  refquad_2e_3v_splitedges, 
-  refquad_2e_3v_splitfaces, 
-  0,
-  refquad_2e_3v_newelstypes, 
-  refquad_2e_3v_newels
-};
-
-
-
-
-
-
-
-
-
-
-// HP_QUAD_2EB_0V
-int refquad_2eb_0v_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 4, 1, 8 },
-  { 0, 0, 0 }
-};
-int refquad_2eb_0v_splitfaces[][4] =
-{
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2eb_0v_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_0v_newels[][8] =
-{
-  { 1, 2, 6, 5 },
-  { 3, 4, 8, 7 },
-  { 5, 6, 7, 8 }
-};
-HPRef_Struct refquad_2eb_0v =
-{
-  HP_QUAD,
-  refquad_2eb_0v_splitedges, 
-  refquad_2eb_0v_splitfaces, 
-  0,
-  refquad_2eb_0v_newelstypes, 
-  refquad_2eb_0v_newels
-};
-
-
-
-
-
-
-
-
-// HP_QUAD_2EB_1VA
-int refquad_2eb_1va_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 4, 1, 8 },
-  { 1, 2, 9 },
-  { 0, 0, 0 }
-};
-int refquad_2eb_1va_splitfaces[][4] =
-{
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2eb_1va_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_1va_newels[][8] =
-{
-  { 9, 2, 6, 5 },
-  { 3, 4, 8, 7 },
-  { 1, 9, 5 },
-  { 5, 6, 7, 8 }
-};
-HPRef_Struct refquad_2eb_1va =
-{
-  HP_QUAD,
-  refquad_2eb_1va_splitedges, 
-  refquad_2eb_1va_splitfaces, 
-  0,
-  refquad_2eb_1va_newelstypes, 
-  refquad_2eb_1va_newels
-};
-
-
-
-
-// HP_QUAD_2EB_1VB
-int refquad_2eb_1vb_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 4, 1, 8 },
-  { 2, 1, 9 },
-  { 0, 0, 0 }
-};
-int refquad_2eb_1vb_splitfaces[][4] =
-{
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2eb_1vb_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_1vb_newels[][8] =
-{
-  { 1, 9, 6, 5 },
-  { 3, 4, 8, 7 },
-  { 9, 2, 6 },
-  { 5, 6, 7, 8 }
-};
-HPRef_Struct refquad_2eb_1vb =
-{
-  HP_QUAD,
-  refquad_2eb_1vb_splitedges, 
-  refquad_2eb_1vb_splitfaces, 
-  0,
-  refquad_2eb_1vb_newelstypes, 
-  refquad_2eb_1vb_newels
-};
-
-
-
-
-
-
-// HP_QUAD_2EB_2VA
-int refquad_2eb_2va_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 4, 1, 8 },
-  { 1, 2, 9 },
-  { 2, 1, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_2eb_2va_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_2va_newels[][8] =
-{
-  { 9, 10, 6, 5 },
-  { 3, 4, 8, 7 },
-  { 1, 9, 5 },
-  { 10, 2, 6 },
-  { 5, 6, 7, 8 }
-};
-HPRef_Struct refquad_2eb_2va =
-{
-  HP_QUAD,
-  refquad_2eb_2va_splitedges, 
-  0, 0,
-  refquad_2eb_2va_newelstypes, 
-  refquad_2eb_2va_newels
-};
-
-
-
-// HP_QUAD_2EB_2VB
-int refquad_2eb_2vb_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 4, 1, 8 },
-  { 1, 2, 9 },
-  { 3, 4, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_2eb_2vb_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_2vb_newels[][8] =
-{
-  { 9, 2, 6, 5 },
-  { 10, 4, 8, 7 },
-  { 1, 9, 5 },
-  { 3, 10, 7 },
-  { 5, 6, 7, 8 }
-};
-HPRef_Struct refquad_2eb_2vb =
-{
-  HP_QUAD,
-  refquad_2eb_2vb_splitedges, 
-  0, 0,
-  refquad_2eb_2vb_newelstypes, 
-  refquad_2eb_2vb_newels
-};
-
-
-
-// HP_QUAD_2EB_2VC
-int refquad_2eb_2vc_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 4, 1, 8 },
-  { 1, 2, 9 },
-  { 4, 3, 10 },
-  { 0, 0, 0 }
-};
-int refquad_2eb_2vc_splitfaces[][4] =
-{
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2eb_2vc_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_2vc_newels[][8] =
-{
-  { 9, 2, 6, 5 },
-  { 3, 10, 8, 7 },
-  { 1, 9, 5 },
-  { 10, 4, 8 },
-  { 5, 6, 7, 8 }
-};
-HPRef_Struct refquad_2eb_2vc =
-{
-  HP_QUAD,
-  refquad_2eb_2vc_splitedges, 
-  refquad_2eb_2vc_splitfaces, 
-  0,
-  refquad_2eb_2vc_newelstypes, 
-  refquad_2eb_2vc_newels
-};
-
-
-
-
-// HP_QUAD_2EB_2VD
-int refquad_2eb_2vd_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 4, 1, 8 },
-  { 2, 1, 9 },
-  { 4, 3, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_2eb_2vd_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_2vd_newels[][8] =
-{
-  { 1, 9, 6, 5 },
-  { 3, 10, 8, 7 },
-  { 9, 2, 6 },
-  { 10, 4, 8 },
-  { 5, 6, 7, 8 }
-};
-HPRef_Struct refquad_2eb_2vd =
-{
-  HP_QUAD,
-  refquad_2eb_2vd_splitedges, 
-  0, 0,
-  refquad_2eb_2vd_newelstypes, 
-  refquad_2eb_2vd_newels
-};
-
-
-
-
-
-
-
-// HP_QUAD_2EB_3VA
-int refquad_2eb_3va_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 2, 1, 8 },
-  { 3, 2, 9 },
-  { 4, 1, 10 },
-  { 3, 4, 11 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_2eb_3va_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_3va_newels[][8] =
-{
-  { 1, 7, 5 },
-  { 8, 2, 6 },
-  { 3, 11, 9},
-  { 7, 8, 6, 5 },
-  { 11, 4, 10, 9 },
-  { 5, 6, 9, 10 }
-};
-HPRef_Struct refquad_2eb_3va =
-{
-  HP_QUAD,
-  refquad_2eb_3va_splitedges, 
-  0, 0,
-  refquad_2eb_3va_newelstypes, 
-  refquad_2eb_3va_newels
-};
-
-
-
-
-
-// HP_QUAD_2EB_3VB
-int refquad_2eb_3vb_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 1, 2, 7 },
-  { 2, 1, 8 },
-  { 3, 2, 9 },
-  { 4, 1, 10 },
-  { 4, 3, 11 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE refquad_2eb_3vb_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2eb_3vb_newels[][8] =
-{
-  { 1, 7, 5 },
-  { 8, 2, 6 },
-  { 11, 4, 10 },
-  { 7, 8, 6, 5 },
-  { 3, 11, 10, 9 },
-  { 5, 6, 9, 10 }
-};
-HPRef_Struct refquad_2eb_3vb =
-{
-  HP_QUAD,
-  refquad_2eb_3vb_splitedges, 
-  0, 0,
-  refquad_2eb_3vb_newelstypes, 
-  refquad_2eb_3vb_newels
-};
-
-
-
-
-
-
-// HP_QUAD_2EB_4V
-int refquad_2eb_4v_splitedges[][3] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 4, 1, 8 },
-  { 1, 2, 9 },
-  { 2, 1, 10 },
-  { 3, 4, 11 },
-  { 4, 3, 12 },
-  { 0, 0, 0 }
-};
-int refquad_2eb_4v_splitfaces[][4] =
-{
-  { 0, 0, 0, 0 },
-};
-HPREF_ELEMENT_TYPE refquad_2eb_4v_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_NONE,
-};
-int refquad_2eb_4v_newels[][8] =
-{
-  { 9, 10, 6, 5 },
-  { 11, 12, 8, 7 },
-  { 5, 6, 7, 8 },
-  { 1, 9, 5 },
-  { 10, 2, 6 },
-  { 3, 11, 7 },
-  { 12, 4, 8 },
-};
-HPRef_Struct refquad_2eb_4v =
-{
-  HP_QUAD,
-  refquad_2eb_4v_splitedges, 
-  refquad_2eb_4v_splitfaces, 
-  0,
-  refquad_2eb_4v_newelstypes, 
-  refquad_2eb_4v_newels
-};
-
-
-
-
-
-
-
-// HP_QUAD_3E
-int refquad_3e_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 3, 4, 10 },
-  { 4, 3, 12 },
-  { 0, 0, 0 }
-};
-
-int refquad_3e_splitfaces[][4] =
-{
-  { 1, 2, 4, 13 },
-  { 2, 3, 1, 14 },
-  { 0, 0, 0, 0 },
-};
-
-HPREF_ELEMENT_TYPE refquad_3e_newelstypes[] =
-{
-  HP_QUAD_2E,
-  HP_QUAD_2E,
-//   HP_TRIG_SINGEDGECORNER1,
-//   HP_TRIG_SINGEDGECORNER2,
-//   HP_TRIG_SINGEDGECORNER2,
-//   HP_TRIG_SINGEDGECORNER1,
-
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_3e_newels[][8] =
-{
-//   { 1, 5, 13 },
-//   { 6, 1, 13 },
-//   { 7, 2, 14 },
-//   { 2, 8, 14 },
-  { 1, 5, 13, 6 },
-  { 2, 8, 14, 7 },
-  { 5, 7, 14, 13 },
-  { 8, 3, 10, 14 },
-  { 4, 6, 13, 12 },
-  { 13, 14, 10, 12 }
-};
-HPRef_Struct refquad_3e =
-{
-  HP_QUAD,
-  refquad_3e_splitedges, 
-  refquad_3e_splitfaces, 
-  0,
-  refquad_3e_newelstypes, 
-  refquad_3e_newels
-};
-
-
-
-
-
-
-
-// HP_QUAD_3E_3VA
-int refquad_3e_3va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 3, 4, 10 },
-  { 3, 2, 11 },
-  { 4, 3, 12 },
-  { 0, 0, 0 }
-};
-
-int refquad_3e_3va_splitfaces[][4] =
-{
-  { 1, 2, 4, 13 },
-  { 2, 3, 1, 14 },
-  { 0, 0, 0, 0 },
-};
-
-HPREF_ELEMENT_TYPE refquad_3e_3va_newelstypes[] =
-{
-  HP_QUAD_2E,
-  HP_QUAD_2E,
-
-//   HP_TRIG_SINGEDGECORNER1,
-//   HP_TRIG_SINGEDGECORNER2,
-//   HP_TRIG_SINGEDGECORNER2,
-//   HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_3e_3va_newels[][8] =
-{
-//   { 1, 5, 13 },
-//   { 6, 1, 13 },
-//   { 7, 2, 14 },
-//   { 2, 8, 14 },
-  { 1, 5, 13, 6 },
-  { 2, 8, 14, 7 },
-  { 11, 3, 10 },
-  { 5, 7, 14, 13 },
-  { 8, 11, 10, 14 },
-  { 4, 6, 13, 12 },
-  { 13, 14, 10, 12 }
-};
-HPRef_Struct refquad_3e_3va =
-{
-  HP_QUAD,
-  refquad_3e_3va_splitedges, 
-  refquad_3e_3va_splitfaces, 
-  0,
-  refquad_3e_3va_newelstypes, 
-  refquad_3e_3va_newels
-};
-
-
-
-
-
-
-
-
-
-
-// HP_QUAD_3E_3VB
-int refquad_3e_3vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 3, 4, 10 },
-  { 4, 1, 11 },
-  { 4, 3, 12 },
-  { 0, 0, 0 }
-};
-
-int refquad_3e_3vb_splitfaces[][4] =
-{
-  { 1, 2, 4, 13 },
-  { 2, 3, 1, 14 },
-  { 0, 0, 0, 0 },
-};
-
-HPREF_ELEMENT_TYPE refquad_3e_3vb_newelstypes[] =
-{
-  HP_QUAD_2E,
-  HP_QUAD_2E,
-
-//   HP_TRIG_SINGEDGECORNER1,
-//   HP_TRIG_SINGEDGECORNER2,
-//   HP_TRIG_SINGEDGECORNER2,
-//   HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER1,
-
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_3e_3vb_newels[][8] =
-{
-//   { 1, 5, 13 },
-//   { 6, 1, 13 },
-//   { 7, 2, 14 },
-//   { 2, 8, 14 },
-  { 1, 5, 13, 6 },
-  { 2, 8, 14, 7 },
-  { 4, 11, 12 },
-  { 5, 7, 14, 13 },
-  { 8, 3, 10, 14 },
-  { 11, 6, 13, 12 },
-  { 13, 14, 10, 12 }
-};
-HPRef_Struct refquad_3e_3vb =
-{
-  HP_QUAD,
-  refquad_3e_3vb_splitedges, 
-  refquad_3e_3vb_splitfaces, 
-  0,
-  refquad_3e_3vb_newelstypes, 
-  refquad_3e_3vb_newels
-};
-
-
-
-
-
-
-
-
-
-// HP_QUAD_3E_4V
-int refquad_3e_4v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 3, 4, 10 },
-  { 3, 2, 11 },
-  { 4, 3, 12 },
-  { 4, 1, 15 },
-  { 0, 0, 0 }
-};
-
-int refquad_3e_4v_splitfaces[][4] =
-{
-  { 1, 2, 4, 13 },
-  { 2, 3, 1, 14 },
-  { 0, 0, 0, 0 },
-};
-
-HPREF_ELEMENT_TYPE refquad_3e_4v_newelstypes[] =
-{
-  HP_QUAD_2E,
-  HP_QUAD_2E,
-
-//   HP_TRIG_SINGEDGECORNER1,
-//   HP_TRIG_SINGEDGECORNER2,
-//   HP_TRIG_SINGEDGECORNER2,
-//   HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER1,
-
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_3e_4v_newels[][8] =
-{
-//   { 1, 5, 13 },
-//   { 6, 1, 13 },
-//   { 7, 2, 14 },
-//   { 2, 8, 14 },
-  { 1, 5, 13, 6 },
-  { 2, 8, 14, 7 },
-  { 11, 3, 10 },
-  { 4, 15, 12 },
-  { 5, 7, 14, 13 },
-  { 8, 11, 10, 14 },
-  { 15, 6, 13, 12 },
-  { 13, 14, 10, 12 }
-};
-HPRef_Struct refquad_3e_4v =
-{
-  HP_QUAD,
-  refquad_3e_4v_splitedges, 
-  refquad_3e_4v_splitfaces, 
-  0,
-  refquad_3e_4v_newelstypes, 
-  refquad_3e_4v_newels
-};
-
-
-
-
-
-
-
-
-
-// HP_QUAD_4E
-int refquad_4e_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 3, 2, 9 },
-  { 3, 4, 10 },
-  { 4, 1, 11 },
-  { 4, 3, 12 },
-  { 0, 0, 0 }
-};
-
-int refquad_4e_splitfaces[][4] =
-{
-  { 1, 2, 4, 13 },
-  { 2, 3, 1, 14 },
-  { 3, 4, 2, 15 },
-  { 4, 1, 3, 16 },
-  { 0, 0, 0, 0 },
-};
-
-HPREF_ELEMENT_TYPE refquad_4e_newelstypes[] =
-{
-  HP_QUAD_2E,
-  HP_QUAD_2E,
-  HP_QUAD_2E,
-  HP_QUAD_2E,
-
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_4e_newels[][8] =
-{
-  { 1, 5, 13, 6 },
-  { 2, 8, 14, 7 },
-  { 3, 10, 15, 9 },
-  { 4, 11, 16, 12 },
-  { 5, 7, 14, 13 },
-  { 8, 9, 15, 14 },
-  { 10, 12, 16, 15 },
-  { 11, 6, 13, 16 },
-  { 13, 14, 15, 16 }
-};
-HPRef_Struct refquad_4e =
-{
-  HP_QUAD,
-  refquad_4e_splitedges, 
-  refquad_4e_splitfaces, 
-  0,
-  refquad_4e_newelstypes, 
-  refquad_4e_newels
-};
-
-
diff --git a/contrib/Netgen/libsrc/meshing/hpref_tet.hpp b/contrib/Netgen/libsrc/meshing/hpref_tet.hpp
deleted file mode 100644
index b071269ec8ccbf6e0c52c7b5f5316e7b10e79ae2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_tet.hpp
+++ /dev/null
@@ -1,2842 +0,0 @@
-
-
-// HP_TET
-int reftet_splitedges[][3] =
-{
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_newelstypes[] =
-{
-  HP_TET,
-  HP_NONE,
-};
-int reftet_newels[][8] =
-{
-  { 1, 2, 3, 4 },
-};
-HPRef_Struct reftet =
-{
-  HP_TET,
-  reftet_splitedges, 
-  0, 0,
-  reftet_newelstypes, 
-  reftet_newels
-};
-
-
-
-/* *********** Tet - Refinement - 0 edges *************** */
-
-// HP_TET_0E_1V
-int reftet_0e_1v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_0e_1v_newelstypes[] =
-{
-  HP_TET_0E_1V,
-  HP_PRISM,
-  HP_NONE,
-};
-int reftet_0e_1v_newels[][8] =
-{
-  { 1, 5, 6, 7 },
-  { 5, 6, 7, 2, 3, 4 }
-};
-HPRef_Struct reftet_0e_1v =
-{
-  HP_TET,
-  reftet_0e_1v_splitedges, 
-  0, 0,
-  reftet_0e_1v_newelstypes, 
-  reftet_0e_1v_newels
-};
-
-
-
-// HP_TET_0E_2V
-int reftet_0e_2v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_0e_2v_newelstypes[] =
-{
-  HP_TET_0E_1V,
-  HP_TET_0E_1V,
-  HP_PRISM,
-  HP_PRISM,
-  HP_NONE,
-};
-int reftet_0e_2v_newels[][8] =
-{
-  { 1, 5, 6, 7 },
-  { 2, 10, 9, 8 },
-  { 5, 6, 7, 8, 9, 10 },
-  { 4, 10, 7, 3, 9, 6 },
-};
-HPRef_Struct reftet_0e_2v =
-{
-  HP_TET,
-  reftet_0e_2v_splitedges, 
-  0, 0,
-  reftet_0e_2v_newelstypes, 
-  reftet_0e_2v_newels
-};
-
-
-
-
-
-// HP_TET_0E_3V
-int reftet_0e_3v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 0, 0, 0 }
-};
-int reftet_0e_3v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 14 },
-    { 2, 3, 1, 15 },
-    { 3, 1, 2, 16 },
-    { 0, 0, 0, 0 },
-  };
-HPREF_ELEMENT_TYPE reftet_0e_3v_newelstypes[] =
-{
-  HP_PYRAMID_0E_1V,
-  HP_PYRAMID_0E_1V,
-  HP_PYRAMID_0E_1V,
-  HP_PRISM,
-  HP_PRISM,
-  HP_PRISM,
-  HP_PRISM,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_0e_3v_newels[][8] =
-{
-  { 1, 5, 14, 6, 7 },
-  { 2, 9, 15, 8, 10 },
-  { 3, 11, 16, 12, 13 },
-  { 5, 14, 7, 8, 15, 10 },
-  { 9, 15, 10, 12, 16, 13 },
-  { 6, 7, 14, 11, 13, 16 },
-  { 14, 15, 16, 7, 10, 13 },
-  { 7, 10, 13, 4 }
-};
-HPRef_Struct reftet_0e_3v =
-{
-  HP_TET,
-  reftet_0e_3v_splitedges, 
-  reftet_0e_3v_splitfaces, 
-  0,
-  reftet_0e_3v_newelstypes, 
-  reftet_0e_3v_newels
-};
-
-
-
-
-
-// HP_TET_0E_4V
-int reftet_0e_4v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_0e_4v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 1, 2, 4, 18 },
-    { 1, 3, 4, 19 },
-
-    { 2, 1, 3, 20 },
-    { 2, 1, 4, 21 },
-    { 2, 3, 4, 22 },
-
-    { 3, 1, 2, 23 },
-    { 3, 1, 4, 24 },
-    { 3, 2, 4, 25 },
-
-    { 4, 1, 2, 26 },
-    { 4, 1, 3, 27 },
-    { 4, 2, 3, 28 },
-    { 0, 0, 0, 0 },
-  };
-int reftet_0e_4v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 29 },
-    { 2, 3, 4, 1, 30 },
-    { 3, 4, 1, 2, 31 },
-    { 4, 1, 2, 3, 32 },
-    { 0 },
-  };
-HPREF_ELEMENT_TYPE reftet_0e_4v_newelstypes[] =
-{
-  HP_HEX_0E_1V,
-  HP_HEX_0E_1V,
-  HP_HEX_0E_1V,
-  HP_HEX_0E_1V,
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  /*
-  HP_HEX, 
-  HP_HEX, 
-  HP_HEX, 
-  HP_HEX, 
-  HP_HEX, 
-  HP_HEX, 
-  */
-  HP_PRISM,
-  HP_PRISM,
-  HP_PRISM,
-  HP_PRISM,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_0e_4v_newels[][8] =
-{
-  { 1, 5, 17, 6, 7, 18, 29, 19 },
-  { 2, 9, 20, 8, 10, 22, 30, 21 },
-  { 3, 11, 23, 12, 13, 24, 31, 25 },
-  { 4, 15, 26, 14, 16, 28, 32, 27 },
-  { 5, 17, 18, 8, 20, 21 },
-  { 18, 17, 29, 21, 20, 30 },
-  { 6, 19, 17,  11, 24, 23 },
-  { 17, 19, 29,  23, 24, 31 },
-  { 7, 18, 19, 14, 26, 27 },
-  { 19, 18, 29, 27, 26, 32 },
-  { 9, 20, 22, 12, 23, 25 },
-  { 22, 20, 30, 25, 23, 31 },
-  { 10, 22, 21, 15, 28, 26 },
-  { 21, 22, 30, 26, 28, 32 },
-  { 13, 24, 25, 16, 27, 28 },
-  { 25, 24, 31, 28, 27, 32 },
-  /*
-  { 5, 17, 29, 18, 8, 20, 30, 21 },
-  { 6, 19, 29, 17, 11, 24, 31, 23 },
-  { 7, 18, 29, 19, 14, 26, 32, 27 },
-  { 9, 20, 30, 22, 12, 23, 31, 25 },
-  { 10, 22, 30, 21, 15, 28, 32, 26 },
-  { 13, 24, 31, 25, 16, 27, 32, 28 },
-  */
-  { 17, 20, 23, 29, 30, 31 },
-  { 18, 26, 21, 29, 32, 30 },
-  { 19, 24, 27, 29, 31, 32 },
-  { 22, 28, 25, 30, 32, 31 },
-
-  { 29, 30, 31, 32 },
-};
-HPRef_Struct reftet_0e_4v =
-{
-  HP_TET,
-  reftet_0e_4v_splitedges, 
-  reftet_0e_4v_splitfaces, 
-  reftet_0e_4v_splitelements, 
-  reftet_0e_4v_newelstypes, 
-  reftet_0e_4v_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* *********** Tet - Refinement - 1 edge *************** */
-
-
-
-// HP_TET_1E_0V
-int reftet_1e_0v_splitedges[][3] =
-{
-  { 1, 3, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 2, 4, 8 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_1e_0v_newelstypes[] =
-{
-  HP_PRISM_SINGEDGE,
-  HP_PRISM,
-  HP_NONE,
-};
-int reftet_1e_0v_newels[][8] =
-{
-  { 1, 5, 6, 2, 7, 8 },
-  { 7, 3, 5, 8, 4, 6 }
-};
-HPRef_Struct reftet_1e_0v =
-{
-  HP_TET,
-  reftet_1e_0v_splitedges, 
-  0, 0,
-  reftet_1e_0v_newelstypes, 
-  reftet_1e_0v_newels
-};
-
-
-
-
-
-// HP_TET_1E_1VA
-int reftet_1e_1va_splitedges[][3] =
-{
-  { 1, 3, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 2, 4, 8 },
-  { 1, 2, 9 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_1e_1va_newelstypes[] =
-{
-  HP_TET_1E_1VA,
-  HP_PRISM_SINGEDGE,
-  HP_PRISM,
-  HP_NONE,
-};
-int reftet_1e_1va_newels[][8] =
-{
-  { 1, 9, 5, 6 },
-  { 9, 5, 6, 2, 7, 8 },
-  { 7, 3, 5, 8, 4, 6 }
-};
-HPRef_Struct reftet_1e_1va =
-{
-  HP_TET,
-  reftet_1e_1va_splitedges, 
-  0, 0,
-  reftet_1e_1va_newelstypes, 
-  reftet_1e_1va_newels
-};
-
-
-
-
-
-
-// HP_TET_1E_1VB
-int reftet_1e_1vb_splitedges[][3] =
-{
-  { 1, 3, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 2, 4, 8 },
-  { 4, 1, 9 },
-  { 4, 2, 10 },
-  { 4, 3, 11 },
-  { 0, 0, 0 }
-};
-int reftet_1e_1vb_splitelements[][5] =
-{
-  { 4, 1, 2, 3, 12 },
-  { 0 }
-};
-
-HPREF_ELEMENT_TYPE reftet_1e_1vb_newelstypes[] =
-{
-  HP_PRISM_SINGEDGE,
-  HP_TET_0E_1V,
-  HP_PYRAMID,
-  HP_TET,
-  HP_PYRAMID, 
-  HP_TET,
-  HP_PYRAMID,
-  HP_TET,
-  HP_PYRAMID,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_1e_1vb_newels[][8] =
-{
-  { 1, 5, 6, 2, 7, 8 },
-  { 4, 11, 10, 9 },
-  { 7, 8, 10, 11, 12 },
-  { 3, 7, 11, 12 },
-  { 5, 11, 9, 6, 12 },
-  { 5, 3, 11, 12 },
-  { 6, 9, 10, 8, 12 },
-  { 5, 7, 3, 12 },
-  { 5, 6, 8, 7, 12 },
-  { 9, 11, 10, 12 }
-};
-HPRef_Struct reftet_1e_1vb =
-{
-  HP_TET,
-  reftet_1e_1vb_splitedges, 
-  0,
-  reftet_1e_1vb_splitelements, 
-  reftet_1e_1vb_newelstypes, 
-  reftet_1e_1vb_newels
-};
-
-
-
-
-
-
-
-
-// HP_TET_1E_2VA
-int reftet_1e_2va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_1e_2va_newelstypes[] =
-{
-  HP_TET_1E_1VA,
-  HP_TET_1E_1VA,
-  HP_PRISM_SINGEDGE,
-  HP_PRISM,
-  HP_NONE,
-};
-int reftet_1e_2va_newels[][8] =
-{
-  { 1, 5, 6, 7 },
-  { 2, 8, 10, 9 },
-  { 5, 6, 7, 8, 9, 10 },
-  { 4, 10, 7, 3, 9, 6 },
-};
-HPRef_Struct reftet_1e_2va =
-{
-  HP_TET,
-  reftet_1e_2va_splitedges, 
-  0, 0,
-  reftet_1e_2va_newelstypes, 
-  reftet_1e_2va_newels
-};
-
-
-
-
-
-
-
-// HP_TET_1E_2VB
-int reftet_1e_2vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 3, 8 },
-  { 2, 4, 9 },
-  { 3, 1, 10 },
-  { 3, 2, 11 },
-  { 3, 4, 12 },
-  { 0, 0, 0 }
-};
-int reftet_1e_2vb_splitelements[][5] =
-{
-  { 3, 4, 1, 2, 13 },
-  { 0 }
-};
-
-HPREF_ELEMENT_TYPE reftet_1e_2vb_newelstypes[] =
-{
-  HP_TET_1E_1VA,
-  HP_PRISM_SINGEDGE,
-  HP_TET_0E_1V,
-  HP_PYRAMID,
-  HP_TET,
-  HP_PYRAMID, 
-  HP_TET,
-  HP_PYRAMID,
-  HP_TET,
-  HP_PYRAMID,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_1e_2vb_newels[][8] =
-{
-  { 1, 5, 6, 7 },
-  { 5, 6, 7, 2, 8, 9 },
-  { 3, 10, 11, 12 },
-
-  { 8, 9, 12, 11, 13 },
-  { 4, 12, 9, 13 },
-  { 6, 10, 12, 7, 13 },
-  { 4, 7, 12, 13 },
-  { 6, 8, 11, 10, 13 },
-  { 4, 9, 7, 13 },
-  { 6, 7, 9, 8, 13 },
-  { 10, 11, 12, 13 },
-};
-HPRef_Struct reftet_1e_2vb =
-{
-  HP_TET,
-  reftet_1e_2vb_splitedges, 
-  0,
-  reftet_1e_2vb_splitelements, 
-  reftet_1e_2vb_newelstypes, 
-  reftet_1e_2vb_newels
-};
-
-
-
-
-
-
-// HP_TET_1E_2VC
-int reftet_1e_2vc_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 3, 8 },
-  { 2, 4, 9 },
-  { 4, 1, 10 },
-  { 4, 2, 11 },
-  { 4, 3, 12 },
-  { 0, 0, 0 }
-};
-int reftet_1e_2vc_splitelements[][5] =
-{
-  { 4, 1, 2, 3, 13 },
-  { 0 }
-};
-
-HPREF_ELEMENT_TYPE reftet_1e_2vc_newelstypes[] =
-{
-  HP_TET_1E_1VA,
-  HP_PRISM_SINGEDGE,
-  HP_TET_0E_1V,
-  HP_PYRAMID,
-  HP_TET,
-  HP_PYRAMID, 
-  HP_TET,
-  HP_PYRAMID,
-  HP_TET,
-  HP_PYRAMID,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_1e_2vc_newels[][8] =
-{
-  { 1, 5, 6, 7 },
-  { 5, 6, 7, 2, 8, 9 },
-  { 4, 11, 10, 12 },
-  { 8, 9, 11, 12, 13 },
-  { 3, 8, 12, 13 },
-  { 7, 6, 12, 10, 13 },
-  { 3, 12, 6, 13 },
-  { 9, 7, 10, 11, 13 },
-  { 3, 6, 8, 13 },
-  { 6, 7, 9, 8, 13 },
-  { 10, 12, 11, 13 }
-};
-HPRef_Struct reftet_1e_2vc =
-{
-  HP_TET,
-  reftet_1e_2vc_splitedges, 
-  0,
-  reftet_1e_2vc_splitelements, 
-  reftet_1e_2vc_newelstypes, 
-  reftet_1e_2vc_newels
-};
-
-
-
-
-
-
-
-
-/*
-
-// HP_TET_1E_2VD
-int reftet_1e_2vd_splitedges[][3] =
-{
-  { 1, 3, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 2, 4, 8 },
-  { 3, 1, 9 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 4, 1, 12 },
-  { 4, 2, 13 },
-  { 4, 3, 14 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_1e_2vd_newelstypes[] =
-{
-  HP_PRISM_SINGEDGE,
-  HP_TET_0E_1V,
-  HP_TET_0E_1V,
-  HP_PRISM,
-  HP_HEX,
-  HP_NONE,
-};
-int reftet_1e_2vd_newels[][8] =
-{
-  { 1, 5, 6, 2, 7, 8 },
-  { 4, 13, 12, 14 },
-  { 3, 10, 11, 9 },
-  { 14, 13, 12, 11, 10, 9 },
-  { 6, 12, 13, 8, 5, 9, 10, 7 },
-};
-HPRef_Struct reftet_1e_2vd =
-{
-  HP_TET,
-  reftet_1e_2vd_splitedges, 
-  0, 0,
-  reftet_1e_2vd_newelstypes, 
-  reftet_1e_2vd_newels
-};
-
-*/
-
-
-
-
-//  HP_TET_1E_2VD,  // 1 v on edge
-int reftet_1e_2vd_splitedges[][3] =
-{
-  // { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  // { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_1e_2vd_splitfaces[][4] =
-  {
-    { 1, 3, 4, 19 },
-    { 2, 3, 4, 22 },
-    { 3, 1, 4, 24 },
-    { 3, 2, 4, 25 },
-    { 4, 1, 3, 27 },
-    { 4, 2, 3, 28 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_1e_2vd_newelstypes[] =
-  {
-    HP_PRISM_SINGEDGE,
-    HP_TET_0E_1V,
-    HP_TET_0E_1V,
-    HP_PRISM,
-    HP_HEX,
-    HP_PYRAMID,
-    HP_HEX,
-    HP_PYRAMID,
-    HP_PRISM,
-    HP_PRISM,
-    HP_NONE,
-  };
-int reftet_1e_2vd_newels[][8] =
-{
-  { 1, 6, 7, 2, 9, 10 },
-  { 3, 11, 12, 13 },
-  { 4, 16, 15, 14 },
-  { 7, 6, 19, 10, 9, 22 },
-  { 7, 19, 27, 14, 10, 22, 28, 15 },
-  { 14, 15, 28, 27, 16 },
-  { 9, 6, 19, 22, 12, 11, 24, 25 },
-  { 12, 11, 24, 25, 13 },
-  { 19, 24, 27, 22, 25, 28 },
-  { 16, 28, 27, 13, 25, 24 }
-};
-HPRef_Struct reftet_1e_2vd =
-{
-  HP_TET,
-  reftet_1e_2vd_splitedges, 
-  reftet_1e_2vd_splitfaces, 
-  0,
-  reftet_1e_2vd_newelstypes, 
-  reftet_1e_2vd_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// HP_TET_1E_3VA
-int reftet_1e_3va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 0, 0, 0 }
-};
-int reftet_1e_3va_splitelements[][5] =
-{
-  { 1, 2, 3, 4, 14 },
-  { 0 }
-};
-
-HPREF_ELEMENT_TYPE reftet_1e_3va_newelstypes[] =
-{
-  HP_PRISM_SINGEDGE,
-  HP_TET_1E_1VA,
-  HP_TET_1E_1VA,
-  HP_TET_0E_1V,
-
-  HP_PYRAMID,
-  HP_TET,
-  HP_PYRAMID, 
-  HP_TET,
-  HP_PYRAMID,
-  HP_TET,
-  HP_PYRAMID,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_1e_3va_newels[][8] =
-{
-  { 5, 6, 7, 8, 9, 10 },
-  { 1, 5, 6, 7 },
-  { 2, 8, 10, 9 },
-  { 3, 11, 12, 13 },
-
-  { 6, 7, 10, 9, 14 },
-  { 4, 10, 7, 14 },
-  { 9, 10, 13, 12, 14 },
-  { 4, 13, 10, 14 },
-  { 6, 11, 13, 7, 14 },
-  { 4, 7, 13, 14 },
-  { 6, 11, 12, 9, 14 },
-  { 11, 13, 12, 14 },
-};
-
-HPRef_Struct reftet_1e_3va =
-{
-  HP_TET,
-  reftet_1e_3va_splitedges, 
-  0,
-  reftet_1e_3va_splitelements, 
-  reftet_1e_3va_newelstypes, 
-  reftet_1e_3va_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//  HP_TET_1E_3VB,  // 1 v on edge
-int reftet_1e_3vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  // { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_1e_3vb_splitfaces[][4] =
-  {
-    { 1, 3, 4, 19 },
-    { 2, 3, 4, 22 },
-    { 3, 1, 4, 24 },
-    { 3, 2, 4, 25 },
-    { 4, 1, 3, 27 },
-    { 4, 2, 3, 28 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_1e_3vb_newelstypes[] =
-  {
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_TET_0E_1V,
-    HP_TET_0E_1V,
-    HP_PRISM,
-    HP_HEX,
-    HP_PYRAMID,
-    HP_HEX,
-    HP_PYRAMID,
-    HP_PRISM,
-    HP_PRISM,
-    HP_NONE,
-  };
-int reftet_1e_3vb_newels[][8] =
-{
-  { 1, 5, 6, 7 },
-  { 5, 6, 7, 2, 9, 10 },
-  { 3, 11, 12, 13 },
-  { 4, 16, 15, 14 },
-  { 7, 6, 19, 10, 9, 22 },
-  { 7, 19, 27, 14, 10, 22, 28, 15 },
-  { 14, 15, 28, 27, 16 },
-  { 9, 6, 19, 22, 12, 11, 24, 25 },
-  { 12, 11, 24, 25, 13 },
-  { 19, 24, 27, 22, 25, 28 },
-  { 16, 28, 27, 13, 25, 24 }
-};
-HPRef_Struct reftet_1e_3vb =
-{
-  HP_TET,
-  reftet_1e_3vb_splitedges, 
-  reftet_1e_3vb_splitfaces, 
-  0,
-  reftet_1e_3vb_newelstypes, 
-  reftet_1e_3vb_newels
-};
-
-
-
-
-
-
-
-
-
-// HP_TET_1E_4V
-int reftet_1e_4v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_1e_4v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 1, 2, 4, 18 },
-    { 1, 3, 4, 19 },
-
-    { 2, 1, 3, 20 },
-    { 2, 1, 4, 21 },
-    { 2, 3, 4, 22 },
-
-    { 3, 1, 2, 23 },
-    { 3, 1, 4, 24 },
-    { 3, 2, 4, 25 },
-
-    { 4, 1, 2, 26 },
-    { 4, 1, 3, 27 },
-    { 4, 2, 3, 28 },
-    { 0, 0, 0, 0 },
-  };
-int reftet_1e_4v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 29 },
-    { 2, 3, 4, 1, 30 },
-    { 3, 4, 1, 2, 31 },
-    { 4, 1, 2, 3, 32 },
-    { 0 },
-  };
-HPREF_ELEMENT_TYPE reftet_1e_4v_newelstypes[] =
-{
-  HP_HEX_1E_1V,
-  HP_HEX_1E_1V,
-  HP_HEX_0E_1V,
-  HP_HEX_0E_1V,
-  HP_PRISM_SINGEDGE, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM, HP_PRISM, 
-  HP_PRISM,
-  HP_PRISM,
-  HP_PRISM,
-  HP_PRISM,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_1e_4v_newels[][8] =
-{
-  { 1, 5, 17, 6, 7, 18, 29, 19 },
-  //  { 2, 9, 20, 8, 10, 22, 30, 21 },
-  { 2, 8, 21, 10, 9, 20, 30, 22 },
-  { 3, 11, 23, 12, 13, 24, 31, 25 },
-  { 4, 15, 26, 14, 16, 28, 32, 27 },
-  { 5, 17, 18, 8, 20, 21 },
-  { 18, 17, 29, 21, 20, 30 },
-  { 6, 19, 17,  11, 24, 23 },
-  { 17, 19, 29,  23, 24, 31 },
-  { 7, 18, 19, 14, 26, 27 },
-  { 19, 18, 29, 27, 26, 32 },
-  { 9, 20, 22, 12, 23, 25 },
-  { 22, 20, 30, 25, 23, 31 },
-  { 10, 22, 21, 15, 28, 26 },
-  { 21, 22, 30, 26, 28, 32 },
-  { 13, 24, 25, 16, 27, 28 },
-  { 25, 24, 31, 28, 27, 32 },
-  /*
-  { 5, 17, 29, 18, 8, 20, 30, 21 },
-  { 6, 19, 29, 17, 11, 24, 31, 23 },
-  { 7, 18, 29, 19, 14, 26, 32, 27 },
-  { 9, 20, 30, 22, 12, 23, 31, 25 },
-  { 10, 22, 30, 21, 15, 28, 32, 26 },
-  { 13, 24, 31, 25, 16, 27, 32, 28 },
-  */
-  { 17, 20, 23, 29, 30, 31 },
-  { 18, 26, 21, 29, 32, 30 },
-  { 19, 24, 27, 29, 31, 32 },
-  { 22, 28, 25, 30, 32, 31 },
-
-  { 29, 30, 31, 32 },
-};
-HPRef_Struct reftet_1e_4v =
-{
-  HP_TET,
-  reftet_1e_4v_splitedges, 
-  reftet_1e_4v_splitfaces, 
-  reftet_1e_4v_splitelements, 
-  reftet_1e_4v_newelstypes, 
-  reftet_1e_4v_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-//  HP_TET_2EA_0V,  // 2 edges connected
-int reftet_2ea_0v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 0, 0, 0 }
-};
-int reftet_2ea_0v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_2ea_0v_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    HP_TET,
-    HP_NONE,
-  };
-int reftet_2ea_0v_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 5, 17, 7, 2, 9, 10 },
-  { 6, 7, 17, 3, 13, 12 },
-  { 17, 9, 12, 7, 10, 13 },
-  { 7, 10, 13, 4 },
-};
-HPRef_Struct reftet_2ea_0v =
-{
-  HP_TET,
-  reftet_2ea_0v_splitedges, 
-  reftet_2ea_0v_splitfaces, 
-  0,
-  reftet_2ea_0v_newelstypes, 
-  reftet_2ea_0v_newels
-};
-
-
-
-
-
-
-//  HP_TET_2EA_1VA,  // 2 edges connected
-int reftet_2ea_1va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 0, 0, 0 }
-};
-int reftet_2ea_1va_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_2ea_1va_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_PRISM_SINGEDGE,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    HP_TET,
-    HP_NONE,
-  };
-int reftet_2ea_1va_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 5, 17, 7, 8, 9, 10 },
-  { 2, 8, 10, 9 },
-  { 6, 7, 17, 3, 13, 12 },
-  { 17, 9, 12, 7, 10, 13 },
-  { 7, 10, 13, 4 },
-};
-HPRef_Struct reftet_2ea_1va =
-{
-  HP_TET,
-  reftet_2ea_1va_splitedges, 
-  reftet_2ea_1va_splitfaces, 
-  0,
-  reftet_2ea_1va_newelstypes, 
-  reftet_2ea_1va_newels
-};
-
-
-
-
-
-
-
-
-//  HP_TET_2EA_1VB, 
-int reftet_2ea_1vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 0, 0, 0 }
-};
-int reftet_2ea_1vb_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_2ea_1vb_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    HP_TET,
-    HP_NONE,
-  };
-int reftet_2ea_1vb_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 3, 11, 12, 13 },
-  { 5, 17, 7, 2, 9, 10 },
-  { 6, 7, 17, 11, 13, 12 },
-  { 17, 9, 12, 7, 10, 13 },
-  { 7, 10, 13, 4 },
-};
-HPRef_Struct reftet_2ea_1vb =
-{
-  HP_TET,
-  reftet_2ea_1vb_splitedges, 
-  reftet_2ea_1vb_splitfaces, 
-  0,
-  reftet_2ea_1vb_newelstypes, 
-  reftet_2ea_1vb_newels
-};
-
-
-
-
-
-
-//  HP_TET_2EA_1VC,  // 2 edges connected
-int reftet_2ea_1vc_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  //  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_2ea_1vc_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 2, 3, 4, 18 },
-    { 3, 4, 2, 19 },
-    { 4, 2, 3, 20 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_2ea_1vc_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 21 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_2ea_1vc_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    //    HP_TET_1E_1VA,
-    HP_TET_0E_1V,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-
-    HP_TET, HP_TET, HP_TET, HP_TET, 
-    HP_PYRAMID, HP_PYRAMID, HP_PYRAMID, 
-    HP_PYRAMID, HP_PYRAMID, HP_TET,
-    HP_PYRAMID, HP_PYRAMID, HP_TET,
-    //     HP_PRISM,
-    //    HP_PRISM,
-    HP_NONE,
-  };
-int reftet_2ea_1vc_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  // { 3, 11, 12, 13 },
-  { 4, 15, 14, 16 }, 
-  { 5, 17, 7, 2, 9, 10 },
-  { 6, 7, 17, 3, 13, 12 },
- 
-  { 9, 10, 18, 21 },
-  { 13, 12, 19, 21 },
-  { 15, 16, 20, 21 },
-  { 18, 20, 19, 21 },
-  { 10, 15, 20, 18, 21 },
-  { 13, 19, 20, 16, 21 },
-  { 9, 18, 19, 12, 21 },
-  
-  { 7, 13, 16, 14, 21 },
-  { 7, 14, 15, 10, 21 },
-  { 9, 12, 17, 21 },
-  { 7, 10, 9, 17, 21 },
-  { 7, 17, 12, 13, 21 },
-  { 14, 16, 15, 21 },
-  //  { 17, 9, 12, 7, 10, 13 },
-  //  { 7, 10, 13, 14, 15, 16 },
-};
-HPRef_Struct reftet_2ea_1vc =
-{
-  HP_TET,
-  reftet_2ea_1vc_splitedges, 
-  reftet_2ea_1vc_splitfaces, 
-  reftet_2ea_1vc_splitelements, 
-  reftet_2ea_1vc_newelstypes, 
-  reftet_2ea_1vc_newels
-};
-
-
-
-
-
-
-
-
-
-
-
- 
-//  HP_TET_2EA_2VA, 
-int reftet_2ea_2va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 0, 0, 0 }
-};
-int reftet_2ea_2va_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_2ea_2va_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    HP_TET,
-    HP_NONE,
-  };
-int reftet_2ea_2va_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 3, 11, 12, 13 },
-  { 2, 8, 10, 9 },
-  { 5, 17, 7, 8, 9, 10 },
-  { 6, 7, 17, 11, 13, 12 },
-  { 17, 9, 12, 7, 10, 13 },
-  { 7, 10, 13, 4 },
-};
-HPRef_Struct reftet_2ea_2va =
-{
-  HP_TET,
-  reftet_2ea_2va_splitedges, 
-  reftet_2ea_2va_splitfaces, 
-  0,
-  reftet_2ea_2va_newelstypes, 
-  reftet_2ea_2va_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-//  HP_TET_2EA_2VB,  // 2 edges connected
-int reftet_2ea_2vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  //  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_2ea_2vb_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 2, 3, 4, 18 },
-    { 3, 4, 2, 19 },
-    { 4, 2, 3, 20 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_2ea_2vb_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 21 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_2ea_2vb_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    //  HP_TET_1E_1VA,
-    HP_TET_0E_1V,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-
-    HP_TET, HP_TET, HP_TET, HP_TET, 
-    HP_PYRAMID, HP_PYRAMID, HP_PYRAMID, 
-    HP_PYRAMID, HP_PYRAMID, HP_TET,
-    HP_PYRAMID, HP_PYRAMID, HP_TET,
-    //     HP_PRISM,
-    //    HP_PRISM,
-    HP_NONE,
-  };
-int reftet_2ea_2vb_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 2, 8, 10, 9 },
-  //  { 3, 11, 12, 13 },
-  { 4, 15, 14, 16 }, 
-  { 5, 17, 7, 8, 9, 10 },
-  { 6, 7, 17, 3, 13, 12 },
- 
-  { 9, 10, 18, 21 },
-  { 13, 12, 19, 21 },
-  { 15, 16, 20, 21 },
-  { 18, 20, 19, 21 },
-  { 10, 15, 20, 18, 21 },
-  { 13, 19, 20, 16, 21 },
-  { 9, 18, 19, 12, 21 },
-  
-  { 7, 13, 16, 14, 21 },
-  { 7, 14, 15, 10, 21 },
-  { 9, 12, 17, 21 },
-  { 7, 10, 9, 17, 21 },
-  { 7, 17, 12, 13, 21 },
-  { 14, 16, 15, 21 },
-  //  { 17, 9, 12, 7, 10, 13 },
-  //  { 7, 10, 13, 14, 15, 16 },
-};
-HPRef_Struct reftet_2ea_2vb =
-{
-  HP_TET,
-  reftet_2ea_2vb_splitedges, 
-  reftet_2ea_2vb_splitfaces, 
-  reftet_2ea_2vb_splitelements, 
-  reftet_2ea_2vb_newelstypes, 
-  reftet_2ea_2vb_newels
-};
-
-
-
-
-
-
-
- 
-
-
-//  HP_TET_2EA_2VC,  // 2 edges connected
-int reftet_2ea_2vc_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  //  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_2ea_2vc_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 2, 3, 4, 18 },
-    { 3, 4, 2, 19 },
-    { 4, 2, 3, 20 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_2ea_2vc_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 21 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_2ea_2vc_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    //    HP_TET_1E_1VA,
-    HP_TET_0E_1V,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-
-    HP_TET, HP_TET, HP_TET, HP_TET, 
-    HP_PYRAMID, HP_PYRAMID, HP_PYRAMID, 
-    HP_PYRAMID, HP_PYRAMID, HP_TET,
-    HP_PYRAMID, HP_PYRAMID, HP_TET,
-    //     HP_PRISM,
-    //    HP_PRISM,
-    HP_NONE,
-  };
-int reftet_2ea_2vc_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  //  { 2, 8, 10, 9 },
-  { 3, 11, 12, 13 },
-  { 4, 15, 14, 16 }, 
-  { 5, 17, 7, 2, 9, 10 },
-  { 6, 7, 17, 11, 13, 12 },
- 
-  { 9, 10, 18, 21 },
-  { 13, 12, 19, 21 },
-  { 15, 16, 20, 21 },
-  { 18, 20, 19, 21 },
-  { 10, 15, 20, 18, 21 },
-  { 13, 19, 20, 16, 21 },
-  { 9, 18, 19, 12, 21 },
-  
-  { 7, 13, 16, 14, 21 },
-  { 7, 14, 15, 10, 21 },
-  { 9, 12, 17, 21 },
-  { 7, 10, 9, 17, 21 },
-  { 7, 17, 12, 13, 21 },
-  { 14, 16, 15, 21 },
-  //  { 17, 9, 12, 7, 10, 13 },
-  //  { 7, 10, 13, 14, 15, 16 },
-};
-HPRef_Struct reftet_2ea_2vc =
-{
-  HP_TET,
-  reftet_2ea_2vc_splitedges, 
-  reftet_2ea_2vc_splitfaces, 
-  reftet_2ea_2vc_splitelements, 
-  reftet_2ea_2vc_newelstypes, 
-  reftet_2ea_2vc_newels
-};
-
-
-
-
-
-
-
-
-//  HP_TET_2EA_3V,  // 2 edges connected
-int reftet_2ea_3v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_2ea_3v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 2, 3, 4, 18 },
-    { 3, 4, 2, 19 },
-    { 4, 2, 3, 20 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_2ea_3v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 21 },
-    { 0, 0, 0, 0 }
-  };
-HPREF_ELEMENT_TYPE reftet_2ea_3v_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    HP_TET_1E_1VA,
-    HP_TET_0E_1V,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-
-    HP_TET, HP_TET, HP_TET, HP_TET, 
-    HP_PYRAMID, HP_PYRAMID, HP_PYRAMID, 
-    HP_PYRAMID, HP_PYRAMID, HP_TET,
-    HP_PYRAMID, HP_PYRAMID, HP_TET,
-    //     HP_PRISM,
-    //    HP_PRISM,
-    HP_NONE,
-  };
-int reftet_2ea_3v_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 2, 8, 10, 9 },
-  { 3, 11, 12, 13 },
-  { 4, 15, 14, 16 }, 
-  { 5, 17, 7, 8, 9, 10 },
-  { 6, 7, 17, 11, 13, 12 },
- 
-  { 9, 10, 18, 21 },
-  { 13, 12, 19, 21 },
-  { 15, 16, 20, 21 },
-  { 18, 20, 19, 21 },
-  { 10, 15, 20, 18, 21 },
-  { 13, 19, 20, 16, 21 },
-  { 9, 18, 19, 12, 21 },
-  
-  { 7, 13, 16, 14, 21 },
-  { 7, 14, 15, 10, 21 },
-  { 9, 12, 17, 21 },
-  { 7, 10, 9, 17, 21 },
-  { 7, 17, 12, 13, 21 },
-  { 14, 16, 15, 21 },
-  //  { 17, 9, 12, 7, 10, 13 },
-  //  { 7, 10, 13, 14, 15, 16 },
-};
-HPRef_Struct reftet_2ea_3v =
-{
-  HP_TET,
-  reftet_2ea_3v_splitedges, 
-  reftet_2ea_3v_splitfaces, 
-  reftet_2ea_3v_splitelements, 
-  reftet_2ea_3v_newelstypes, 
-  reftet_2ea_3v_newels
-};
-
-
-
-
-
-
-
-//  HP_TET_2EB_0V,  // 2 opposite edges
-int reftet_2eb_0v_splitedges[][3] =
-{
-  { 1, 3, 5 },
-  { 1, 4, 6 },
-  { 2, 3, 7 },
-  { 2, 4, 8 },
-  { 3, 1, 9 },
-  { 3, 2, 10 },
-  { 4, 1, 11 },
-  { 4, 2, 12 },
-  { 0, 0, 0 }
-};
-
-HPREF_ELEMENT_TYPE reftet_2eb_0v_newelstypes[] =
-  {
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_HEX,
-    HP_NONE,
-  };
-int reftet_2eb_0v_newels[][8] =
-{
-  { 1, 5, 6, 2, 7, 8 },
-  { 3, 9, 10, 4, 11, 12 },
-  { 6, 11, 12, 8, 5, 9, 10, 7 },
-};
-HPRef_Struct reftet_2eb_0v =
-{
-  HP_TET,
-  reftet_2eb_0v_splitedges, 
-  0, 0,
-  reftet_2eb_0v_newelstypes, 
-  reftet_2eb_0v_newels
-};
-
-
-
-
-
-
-
-//  HP_TET_2EB_2VA,  // 2 opposite edges
-int reftet_2eb_2va_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-
-HPREF_ELEMENT_TYPE reftet_2eb_2va_newelstypes[] =
-  {
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_TET_1E_1VA,
-    //    HP_TET_1E_1VA,
-    HP_TET_1E_1VA,
-    //    HP_TET_1E_1VA,
-    HP_HEX,
-    HP_NONE,
-  };
-int reftet_2eb_2va_newels[][8] =
-{
-  { 5, 6, 7, 2, 9, 10 },
-  { 4, 15, 14, 13, 12, 11 },
-  { 1, 5, 6, 7 },
-  //  { 2, 8, 10, 9 },
-  { 3, 13, 11, 12 },
-  //  { 4, 16, 15, 14 },
-  { 7, 14, 15, 10, 6, 11, 12, 9 }
-};
-HPRef_Struct reftet_2eb_2va =
-{
-  HP_TET,
-  reftet_2eb_2va_splitedges, 
-  0, 0,
-  reftet_2eb_2va_newelstypes, 
-  reftet_2eb_2va_newels
-};
-
-
-
-
-
-
-//  HP_TET_2EB_4V,  // 2 opposite edges
-int reftet_2eb_4v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-
-HPREF_ELEMENT_TYPE reftet_2eb_4v_newelstypes[] =
-  {
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_TET_1E_1VA,
-    HP_TET_1E_1VA,
-    HP_TET_1E_1VA,
-    HP_TET_1E_1VA,
-    HP_HEX,
-    HP_NONE,
-  };
-int reftet_2eb_4v_newels[][8] =
-{
-  { 5, 6, 7, 8, 9, 10 },
-  { 16, 15, 14, 13, 12, 11 },
-  { 1, 5, 6, 7 },
-  { 2, 8, 10, 9 },
-  { 3, 13, 11, 12 },
-  { 4, 16, 15, 14 },
-  { 7, 14, 15, 10, 6, 11, 12, 9 }
-};
-HPRef_Struct reftet_2eb_4v =
-{
-  HP_TET,
-  reftet_2eb_4v_splitedges, 
-  0, 0,
-  reftet_2eb_4v_newelstypes, 
-  reftet_2eb_4v_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//  HP_TET_3EA_0V,  
-int reftet_3ea_0v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 3, 8 },
-  { 2, 4, 9 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 4, 2, 12 },
-  { 4, 3, 13 },
-  { 0, 0, 0 }
-};
-int reftet_3ea_0v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 14 },
-    { 1, 2, 4, 15 },
-    { 1, 3, 4, 16 },
-    { 2, 3, 4, 17 },
-    { 3, 4, 2, 18 },
-    { 4, 2, 3, 19 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3ea_0v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3ea_0v_newelstypes[] =
-  {
-    HP_HEX_3E_0V,
-    HP_HEX_1E_0V,
-    HP_HEX_1E_0V,
-    HP_HEX_1E_0V,
-    HP_PRISM,
-    HP_PRISM,
-    HP_PRISM,
-    HP_TET,
-    HP_NONE,
-  };
-int reftet_3ea_0v_newels[][8] =
-{
-  { 1, 5, 14, 6, 7, 15, 20, 16 },
-  { 5, 2, 8, 14, 15, 9, 17, 20 },
-  { 3, 6, 14, 10, 11, 16, 20, 18 },
-  { 7, 4, 12, 15, 16, 13, 19, 20 },
-  { 11, 13, 16, 18, 19, 20 },
-  { 15, 12, 9, 20, 19, 17 },
-  { 8, 10, 14, 17, 18, 20 },
-  { 20, 17, 18, 19 },
-};
-HPRef_Struct reftet_3ea_0v =
-{
-  HP_TET,
-  reftet_3ea_0v_splitedges, 
-  reftet_3ea_0v_splitfaces, 
-  reftet_3ea_0v_splitelements, 
-  reftet_3ea_0v_newelstypes, 
-  reftet_3ea_0v_newels
-};
-
-
-
-
-
-
-
-
-
-
-//  HP_TET_3EA_1V,  
-int reftet_3ea_1v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 3, 8 },
-  { 2, 4, 9 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 4, 2, 12 },
-  { 4, 3, 13 },
-  { 2, 1, 21 },
-  { 3, 1, 22 },
-  { 4, 1, 23 },
-  { 0, 0, 0 }
-};
-int reftet_3ea_1v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 14 },
-    { 1, 2, 4, 15 },
-    { 1, 3, 4, 16 },
-    { 2, 3, 4, 17 },
-    { 3, 4, 2, 18 },
-    { 4, 2, 3, 19 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3ea_1v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3ea_1v_newelstypes[] =
-  {
-    HP_HEX_3E_0V,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    //    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    //    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-
-    HP_PRISM,
-    HP_PRISM,
-    HP_PRISM,
-    HP_TET,
-    HP_NONE,
-  };
-int reftet_3ea_1v_newels[][8] =
-{
-  { 1, 5, 14, 6, 7, 15, 20, 16 },
-
-  { 2, 21, 9, 8 },
-  { 5, 14, 15, 21, 8, 9 },
-  { 15, 14, 20, 9, 8, 17 },
-  //  { 3, 22, 10, 11 },
-  //  { 6, 16, 14, 22, 11, 10 },
-  { 6, 16, 14, 3, 11, 10 },
-  { 14, 16, 20, 10, 11, 18 },
-  //  { 4, 23, 13, 12 },
-  //  { 7, 15, 16, 23, 12, 13 },
-  { 7, 15, 16, 4, 12, 13 },
-  { 16, 15, 20, 13, 12, 19 },
-
-  { 11, 13, 16, 18, 19, 20 },
-  { 15, 12, 9, 20, 19, 17 },
-  { 8, 10, 14, 17, 18, 20 },
-  { 20, 17, 18, 19 },
-};
-HPRef_Struct reftet_3ea_1v =
-{
-  HP_TET,
-  reftet_3ea_1v_splitedges, 
-  reftet_3ea_1v_splitfaces, 
-  reftet_3ea_1v_splitelements, 
-  reftet_3ea_1v_newelstypes, 
-  reftet_3ea_1v_newels
-};
-
-
-
-
-
-
-
-
-
-
-//  HP_TET_3EA_2V,  
-int reftet_3ea_2v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 3, 8 },
-  { 2, 4, 9 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 4, 2, 12 },
-  { 4, 3, 13 },
-  { 2, 1, 21 },
-  { 3, 1, 22 },
-  { 4, 1, 23 },
-  { 0, 0, 0 }
-};
-int reftet_3ea_2v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 14 },
-    { 1, 2, 4, 15 },
-    { 1, 3, 4, 16 },
-    { 2, 3, 4, 17 },
-    { 3, 4, 2, 18 },
-    { 4, 2, 3, 19 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3ea_2v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3ea_2v_newelstypes[] =
-  {
-    HP_HEX_3E_0V,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    //    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-
-    HP_PRISM,
-    HP_PRISM,
-    HP_PRISM,
-    HP_TET,
-    HP_NONE,
-  };
-int reftet_3ea_2v_newels[][8] =
-{
-  { 1, 5, 14, 6, 7, 15, 20, 16 },
-
-  { 2, 21, 9, 8 },
-  { 5, 14, 15, 21, 8, 9 },
-  { 15, 14, 20, 9, 8, 17 },
-  { 3, 22, 10, 11 },
-  { 6, 16, 14, 22, 11, 10 },
-  { 14, 16, 20, 10, 11, 18 },
-  //  { 4, 23, 13, 12 },
-  { 7, 15, 16, 4, 12, 13 },
-  { 16, 15, 20, 13, 12, 19 },
-
-  { 11, 13, 16, 18, 19, 20 },
-  { 15, 12, 9, 20, 19, 17 },
-  { 8, 10, 14, 17, 18, 20 },
-  { 20, 17, 18, 19 },
-};
-HPRef_Struct reftet_3ea_2v =
-{
-  HP_TET,
-  reftet_3ea_2v_splitedges, 
-  reftet_3ea_2v_splitfaces, 
-  reftet_3ea_2v_splitelements, 
-  reftet_3ea_2v_newelstypes, 
-  reftet_3ea_2v_newels
-};
-
-
-
-
-
-
-
-
-//  HP_TET_3EA_3V,  
-int reftet_3ea_3v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 3, 8 },
-  { 2, 4, 9 },
-  { 3, 2, 10 },
-  { 3, 4, 11 },
-  { 4, 2, 12 },
-  { 4, 3, 13 },
-  { 2, 1, 21 },
-  { 3, 1, 22 },
-  { 4, 1, 23 },
-  { 0, 0, 0 }
-};
-int reftet_3ea_3v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 14 },
-    { 1, 2, 4, 15 },
-    { 1, 3, 4, 16 },
-    { 2, 3, 4, 17 },
-    { 3, 4, 2, 18 },
-    { 4, 2, 3, 19 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3ea_3v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3ea_3v_newelstypes[] =
-  {
-    HP_HEX_3E_0V,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM,
-
-    HP_PRISM,
-    HP_PRISM,
-    HP_PRISM,
-    HP_TET,
-    HP_NONE,
-  };
-int reftet_3ea_3v_newels[][8] =
-{
-  { 1, 5, 14, 6, 7, 15, 20, 16 },
-
-  { 2, 21, 9, 8 },
-  { 5, 14, 15, 21, 8, 9 },
-  { 15, 14, 20, 9, 8, 17 },
-  { 3, 22, 10, 11 },
-  { 6, 16, 14, 22, 11, 10 },
-  { 14, 16, 20, 10, 11, 18 },
-  { 4, 23, 13, 12 },
-  { 7, 15, 16, 23, 12, 13 },
-  { 16, 15, 20, 13, 12, 19 },
-
-  { 11, 13, 16, 18, 19, 20 },
-  { 15, 12, 9, 20, 19, 17 },
-  { 8, 10, 14, 17, 18, 20 },
-  { 20, 17, 18, 19 },
-};
-HPRef_Struct reftet_3ea_3v =
-{
-  HP_TET,
-  reftet_3ea_3v_splitedges, 
-  reftet_3ea_3v_splitfaces, 
-  reftet_3ea_3v_splitelements, 
-  reftet_3ea_3v_newelstypes, 
-  reftet_3ea_3v_newels
-};
-
-
-
-
-
-
-
-//  HP_TET_3EV_0V,  
-int reftet_3eb_0v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  //  { 3, 2, 12 },
-  { 3, 4, 13 },
-  //  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_3eb_0v_splitfaces[][4] =
-  {
-    { 1, 2, 4, 17 },
-    { 2, 1, 3, 18 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3eb_0v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3eb_0v_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_PYRAMID_EDGES,
-    //    HP_TET_1E_1VA,
-    //    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_TET,
-    HP_TET,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_NONE,
-  };
-int reftet_3eb_0v_newels[][8] =
-{
-  { 1, 7, 17, 5, 6 },
-  { 2, 9, 18, 8, 10 },
-  //  { 3, 12, 13, 11 },
-  //  { 4, 14, 16, 15 },
-  { 5, 6, 17, 8, 18, 10 },
-  { 7, 17, 6, 4, 15, 16 },
-  { 9, 18, 10, 3, 11, 13 },
-  
-  { 10, 15, 16, 13, 20 },
-  { 6, 11, 13, 16, 20 },
-  { 10, 17, 15, 20 },
-  { 6, 18, 11, 20 },
-  { 6, 17, 10, 18, 20 },
-  { 6, 16, 15, 17, 20 },
-  { 18, 10, 13, 11, 20 },
-};
-HPRef_Struct reftet_3eb_0v =
-{
-  HP_TET,
-  reftet_3eb_0v_splitedges, 
-  reftet_3eb_0v_splitfaces, 
-  reftet_3eb_0v_splitelements, 
-  reftet_3eb_0v_newelstypes, 
-  reftet_3eb_0v_newels
-};
-
-
-
-
-
-
-
-
-
-//  HP_TET_3EV_1V,  
-int reftet_3eb_1v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  //  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_3eb_1v_splitfaces[][4] =
-  {
-    { 1, 2, 4, 17 },
-    { 2, 1, 3, 18 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3eb_1v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3eb_1v_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    //    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_TET,
-    HP_TET,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_NONE,
-  };
-int reftet_3eb_1v_newels[][8] =
-{
-  { 1, 7, 17, 5, 6 },
-  { 2, 9, 18, 8, 10 },
-  { 3, 12, 13, 11 },
-  //  { 4, 14, 16, 15 },
-  { 5, 6, 17, 8, 18, 10 },
-  { 7, 17, 6, 4, 15, 16 },
-  { 9, 18, 10, 12, 11, 13 },
-  
-  { 10, 15, 16, 13, 20 },
-  { 6, 11, 13, 16, 20 },
-  { 10, 17, 15, 20 },
-  { 6, 18, 11, 20 },
-  { 6, 17, 10, 18, 20 },
-  { 6, 16, 15, 17, 20 },
-  { 18, 10, 13, 11, 20 },
-};
-HPRef_Struct reftet_3eb_1v =
-{
-  HP_TET,
-  reftet_3eb_1v_splitedges, 
-  reftet_3eb_1v_splitfaces, 
-  reftet_3eb_1v_splitelements, 
-  reftet_3eb_1v_newelstypes, 
-  reftet_3eb_1v_newels
-};
-
-
-
-
-
-
-
-
-//  HP_TET_3EV_2V,  
-int reftet_3eb_2v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_3eb_2v_splitfaces[][4] =
-  {
-    { 1, 2, 4, 17 },
-    { 2, 1, 3, 18 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3eb_2v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3eb_2v_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_TET,
-    HP_TET,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_NONE,
-  };
-int reftet_3eb_2v_newels[][8] =
-{
-  { 1, 7, 17, 5, 6 },
-  { 2, 9, 18, 8, 10 },
-  { 3, 12, 13, 11 },
-  { 4, 14, 16, 15 },
-  { 5, 6, 17, 8, 18, 10 },
-  { 7, 17, 6, 14, 15, 16 },
-  { 9, 18, 10, 12, 11, 13 },
-  
-  { 10, 15, 16, 13, 20 },
-  { 6, 11, 13, 16, 20 },
-  { 10, 17, 15, 20 },
-  { 6, 18, 11, 20 },
-  { 6, 17, 10, 18, 20 },
-  { 6, 16, 15, 17, 20 },
-  { 18, 10, 13, 11, 20 },
-};
-HPRef_Struct reftet_3eb_2v =
-{
-  HP_TET,
-  reftet_3eb_2v_splitedges, 
-  reftet_3eb_2v_splitfaces, 
-  reftet_3eb_2v_splitelements, 
-  reftet_3eb_2v_newelstypes, 
-  reftet_3eb_2v_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-//  HP_TET_3EC_0V,  
-int reftet_3ec_0v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  //  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  //  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_3ec_0v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 2, 1, 4, 18 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3ec_0v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3ec_0v_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_PYRAMID_EDGES,
-    //    HP_TET_1E_1VA,
-    //    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_TET,
-    HP_TET,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_NONE,
-  };
-int reftet_3ec_0v_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 2, 8, 18, 10, 9 },
-  //  { 3, 11, 12, 13 },
-  //  { 4, 15, 14, 16 },
-  { 5, 17, 7, 8, 9, 18 },
-  { 6, 7, 17, 3, 13, 12 },
-  { 10, 9, 18, 4, 16, 14 },
-  
-  { 9, 16, 13, 12, 20 },
-  { 7, 13, 16, 14, 20 },
-  { 7, 14, 18, 20 },
-  { 9, 12, 17, 20 },
-  { 17, 7, 18, 9, 20 },
-  { 7, 17, 12, 13, 20 },
-  { 9, 18, 14, 16, 20 },
-};
-HPRef_Struct reftet_3ec_0v =
-{
-  HP_TET,
-  reftet_3ec_0v_splitedges, 
-  reftet_3ec_0v_splitfaces, 
-  reftet_3ec_0v_splitelements, 
-  reftet_3ec_0v_newelstypes, 
-  reftet_3ec_0v_newels
-};
-
-
-
-
-
-
- 
-
-
-//  HP_TET_3EC_1V,  
-int reftet_3ec_1v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  // { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_3ec_1v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 2, 1, 4, 18 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3ec_1v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3ec_1v_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    //    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_TET,
-    HP_TET,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_NONE,
-  };
-int reftet_3ec_1v_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 2, 8, 18, 10, 9 },
-  { 3, 11, 12, 13 },
-  //  { 4, 15, 14, 16 },
-  { 5, 17, 7, 8, 9, 18 },
-  { 6, 7, 17, 11, 13, 12 },
-  { 10, 9, 18, 4, 16, 14 },
-  
-  { 9, 16, 13, 12, 20 },
-  { 7, 13, 16, 14, 20 },
-  { 7, 14, 18, 20 },
-  { 9, 12, 17, 20 },
-  { 17, 7, 18, 9, 20 },
-  { 7, 17, 12, 13, 20 },
-  { 9, 18, 14, 16, 20 },
-};
-HPRef_Struct reftet_3ec_1v =
-{
-  HP_TET,
-  reftet_3ec_1v_splitedges, 
-  reftet_3ec_1v_splitfaces, 
-  reftet_3ec_1v_splitelements, 
-  reftet_3ec_1v_newelstypes, 
-  reftet_3ec_1v_newels
-};
-
-
-
-
-
-
-
-
-//  HP_TET_3EC_2V,  
-int reftet_3ec_2v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 2, 3, 9 },
-  { 2, 4, 10 },
-  { 3, 1, 11 },
-  { 3, 2, 12 },
-  { 3, 4, 13 },
-  { 4, 1, 14 },
-  { 4, 2, 15 },
-  { 4, 3, 16 },
-  { 0, 0, 0 }
-};
-int reftet_3ec_2v_splitfaces[][4] =
-  {
-    { 1, 2, 3, 17 },
-    { 2, 1, 4, 18 },
-    { 0, 0, 0, 0 }
-  };
-int reftet_3ec_2v_splitelements[][5] =
-  {
-    { 1, 2, 3, 4, 20 },
-    { 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_3ec_2v_newelstypes[] =
-  {
-    HP_PYRAMID_EDGES,
-    HP_PYRAMID_EDGES,
-    HP_TET_1E_1VA,
-    HP_TET_1E_1VA,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    HP_PRISM_SINGEDGE,
-    
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_TET,
-    HP_TET,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_PYRAMID,
-    HP_NONE,
-  };
-int reftet_3ec_2v_newels[][8] =
-{
-  { 1, 5, 17, 6, 7 },
-  { 2, 8, 18, 10, 9 },
-  { 3, 11, 12, 13 },
-  { 4, 15, 14, 16 },
-  { 5, 17, 7, 8, 9, 18 },
-  { 6, 7, 17, 11, 13, 12 },
-  { 10, 9, 18, 15, 16, 14 },
-  
-  { 9, 16, 13, 12, 20 },
-  { 7, 13, 16, 14, 20 },
-  { 7, 14, 18, 20 },
-  { 9, 12, 17, 20 },
-  { 17, 7, 18, 9, 20 },
-  { 7, 17, 12, 13, 20 },
-  { 9, 18, 14, 16, 20 },
-};
-HPRef_Struct reftet_3ec_2v =
-{
-  HP_TET,
-  reftet_3ec_2v_splitedges, 
-  reftet_3ec_2v_splitfaces, 
-  reftet_3ec_2v_splitelements, 
-  reftet_3ec_2v_newelstypes, 
-  reftet_3ec_2v_newels
-};
-
-
-
-
-
-
-
-
-
-
-/* ************************ 1 singular face ******************** */
-
-
-// HP_TET_1F_0E_0V
-int reftet_1f_0e_0v_splitedges[][3] =
-{
-  { 2, 1, 5 },
-  { 3, 1, 6 },
-  { 4, 1, 7 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_1f_0e_0v_newelstypes[] =
-{
-  HP_PRISM_1FA_0E_0V,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_1f_0e_0v_newels[][8] =
-{
-  { 3, 2, 4, 6, 5, 7 },
-  { 5, 7, 6, 1 }
-};
-HPRef_Struct reftet_1f_0e_0v =
-{
-  HP_TET,
-  reftet_1f_0e_0v_splitedges, 
-  0, 0,
-  reftet_1f_0e_0v_newelstypes, 
-  reftet_1f_0e_0v_newels
-};
-
-
-
-
-
-// HP_TET_1F_0E_1VA    ... singular vertex in face
-int reftet_1f_0e_1va_splitedges[][3] =
-{
-  { 2, 1, 5 },
-  { 2, 3, 6 },
-  { 2, 4, 7 },
-  { 3, 1, 8 },
-  { 4, 1, 9 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_1f_0e_1va_newelstypes[] =
-{
-  HP_HEX_1F_0E_0V,
-  HP_TET_1F_0E_1VA,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_1f_0e_1va_newels[][8] =
-{
-  { 3, 6, 7, 4, 8, 5, 5, 9 },
-  { 5, 2, 6, 7 },
-  { 5, 9, 8, 1 },
-};
-HPRef_Struct reftet_1f_0e_1va =
-{
-  HP_TET,
-  reftet_1f_0e_1va_splitedges, 
-  0, 0,
-  reftet_1f_0e_1va_newelstypes, 
-  reftet_1f_0e_1va_newels
-};
-
-
-
-
-
-// HP_TET_1F_0E_1VB    ... singular vertex not in face
-int reftet_1f_0e_1vb_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 1, 3, 6 },
-  { 1, 4, 7 },
-  { 2, 1, 8 },
-  { 3, 1, 9 },
-  { 4, 1, 10 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftet_1f_0e_1vb_newelstypes[] =
-{
-  HP_PRISM_1FA_0E_0V,
-  HP_PRISM,
-  HP_TET_0E_1V,
-  HP_NONE,
-};
-int reftet_1f_0e_1vb_newels[][8] =
-{
-  { 2, 4, 3, 8, 10, 9 },
-  { 8, 10, 9, 5, 7, 6 }, 
-  { 1, 5, 6, 7 },
-};
-HPRef_Struct reftet_1f_0e_1vb =
-{
-  HP_TET,
-  reftet_1f_0e_1vb_splitedges, 
-  0, 0,
-  reftet_1f_0e_1vb_newelstypes, 
-  reftet_1f_0e_1vb_newels
-};
-
-
-
-
-
-
-
-
-// HP_TET_1F_1EA_0V  ... sing edge is 1..2
-int reftet_1f_1ea_0v_splitedges[][3] =
-{
-  { 1, 3, 5 },
-  { 1, 4, 6 },
-  { 2, 1, 7 },
-  { 2, 3, 8 },
-  { 2, 4, 9 },
-  { 3, 1, 10 },
-  { 4, 1, 11 },
-  { 0, 0, 0 }
-};
-
-int reftet_1f_1ea_0v_splitfaces[][4] =
-  {
-    { 2, 1, 3, 12 },
-    { 2, 1, 4, 13 },
-    { 0, 0, 0, 0 }
-  };
-
-
-HPREF_ELEMENT_TYPE reftet_1f_1ea_0v_newelstypes[] =
-{
-  HP_HEX_1F_0E_0V,
-  //  HP_PRISM,
-  HP_PYRAMID_1FB_0E_1VA,
-  HP_TET_1E_1VA,
-  HP_PRISM_SINGEDGE,
-  HP_PRISM,
-  HP_NONE,
-};
-int reftet_1f_1ea_0v_newels[][8] =
-{
-  { 3, 8, 9, 4, 10, 12, 13, 11 },
-  // { 2, 9, 8, 7, 13, 12 },
-  { 8, 9, 13, 12, 2 },
-  { 2, 7, 13, 12 },
-  { 7, 13, 12, 1, 6, 5 },
-  { 6, 11, 13, 5, 10, 12 }
-};
-HPRef_Struct reftet_1f_1ea_0v =
-{
-  HP_TET,
-  reftet_1f_1ea_0v_splitedges, 
-  reftet_1f_1ea_0v_splitfaces, 
-  0, 
-  reftet_1f_1ea_0v_newelstypes, 
-  reftet_1f_1ea_0v_newels
-};
-
-
-
-
-
-
-
-
-// HP_TET_1F_1EB_0V     singular edge in face, edge is 2-3
-int reftet_1f_1eb_0v_splitedges[][3] =
-{
-  { 2, 1, 5 },
-  { 2, 4, 6 },
-  { 3, 1, 7 },
-  { 3, 4, 8 },
-  { 4, 1, 9 },
-  { 0, 0, 0 }
-};
-
-
-HPREF_ELEMENT_TYPE reftet_1f_1eb_0v_newelstypes[] =
-{
-  HP_PRISM_1FB_1EA_0V,
-  HP_PRISM_1FA_0E_0V,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_1f_1eb_0v_newels[][8] =
-{
-  // { 2, 5, 6, 3, 7, 8 },
-  { 3, 8, 7, 2, 6, 5 },
-  { 6, 4, 8, 5, 9, 7 },
-  { 5, 9, 7, 1}
-};
-HPRef_Struct reftet_1f_1eb_0v =
-{
-  HP_TET,
-  reftet_1f_1eb_0v_splitedges, 
-  0, 0, 
-  reftet_1f_1eb_0v_newelstypes, 
-  reftet_1f_1eb_0v_newels
-};
-
-
-
-
-
-
-
-
-
-
-/* ************************ 2 singular faces ******************** */
-
-
-// HP_TET_2F_0E_0V
-int reftet_2f_0e_0v_splitedges[][3] =
-{
-  { 1, 2, 5 },
-  { 2, 1, 6 },
-  { 3, 1, 7 },
-  { 3, 2, 8 },
-  { 4, 1, 9 },
-  { 4, 2, 10 },
-  { 0, 0, 0 }
-};
-
-int reftet_2f_0e_0v_splitfaces[][4] =
-  {
-    { 3, 1, 2, 11 },
-    { 4, 1, 2, 12 },
-    { 0, 0, 0, 0 }
-  };
-
-
-HPREF_ELEMENT_TYPE reftet_2f_0e_0v_newelstypes[] =
-{
-  HP_PRISM_1FA_0E_0V,
-  HP_PRISM_1FA_0E_0V,
-  HP_PRISM_1FB_1EA_0V,
-  HP_PRISM_1FB_1EA_0V,
-  HP_TET,
-  HP_NONE,
-};
-int reftet_2f_0e_0v_newels[][8] =
-{
-  { 2, 10, 8, 6, 12, 11 },
-  { 1, 7, 9, 5, 11, 12 },
-  //   { 3, 11, 8, 4, 12, 10 },
-  { 4, 10, 12, 3, 8, 11 }, 
-  { 3, 7, 11, 4, 9, 12 },
-  { 5, 6, 11, 12 }
-};
-HPRef_Struct reftet_2f_0e_0v =
-{
-  HP_TET,
-  reftet_2f_0e_0v_splitedges, 
-  reftet_2f_0e_0v_splitfaces, 
-  0, 
-  reftet_2f_0e_0v_newelstypes, 
-  reftet_2f_0e_0v_newels
-};
-
-
diff --git a/contrib/Netgen/libsrc/meshing/hpref_trig.hpp b/contrib/Netgen/libsrc/meshing/hpref_trig.hpp
deleted file mode 100644
index 6e2ede0eb0597b137f7353fa70565ad7d23f8e83..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_trig.hpp
+++ /dev/null
@@ -1,750 +0,0 @@
-
-
-
-
-
-// HP_TRIG
-int reftrig_splitedges[][3] =
-{
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_newelstypes[] =
-{
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_newels[][8] =
-{
-  { 1, 2, 3 },
-};
-HPRef_Struct reftrig =
-{
-  HP_TRIG, 
-  reftrig_splitedges, 
-  0, 0, 
-  reftrig_newelstypes, 
-  reftrig_newels
-};
-
-
-
-
-
-
-// HP_TRIG_SINGCORNER
-int reftrig_singcorner_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singcorner_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_QUAD,
-  HP_NONE,
-};
-int reftrig_singcorner_newels[][8] =
-{
-  { 1, 4, 5 },
-  { 2, 3, 5, 4 },
-};
-HPRef_Struct reftrig_singcorner =
-{
-  HP_TRIG,
-  reftrig_singcorner_splitedges, 
-  0, 0,
-  reftrig_singcorner_newelstypes, 
-  reftrig_singcorner_newels
-};
-
-
-/*
-// HP_TRIG_SINGCORNER, trigs only
-int reftrig_singcorner_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singcorner_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_TRIG,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singcorner_newels[][8] =
-{
-  { 1, 4, 5 },
-  { 4, 2, 5 },
-  { 5, 2, 3 },
-};
-HPRef_Struct reftrig_singcorner =
-{
-  HP_TRIG,
-  reftrig_singcorner_splitedges, 
-  0, 0,
-  reftrig_singcorner_newelstypes, 
-  reftrig_singcorner_newels
-};
-*/
-
-
-
-
-
-// HP_TRIG_SINGCORNER12
-int reftrig_singcorner12_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 1, 6 },
-  { 2, 3, 7 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singcorner12_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singcorner12_newels[][8] =
-{
-  { 1, 4, 5 },
-  { 2, 7, 6 },
-  { 4, 6, 7, 5 },
-  { 5, 7, 3 },
-};
-HPRef_Struct reftrig_singcorner12 =
-{
-  HP_TRIG,
-  reftrig_singcorner12_splitedges, 
-  0, 0,
-  reftrig_singcorner12_newelstypes, 
-  reftrig_singcorner12_newels
-};
-
-
-
-
-// HP_TRIG_SINGCORNER123_2D
-int reftrig_singcorner123_2D_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 1, 6 },
-  { 2, 3, 7 },
-  { 3, 1, 8 },
-  { 3, 2, 9 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singcorner123_2D_newelstypes[] =
-{
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER,
-  HP_QUAD,
-  HP_QUAD,
-  HP_NONE,
-};
-int reftrig_singcorner123_2D_newels[][8] =
-{
-  { 1, 4, 5 },
-  { 2, 7, 6 },
-  { 3, 8, 9 },
-  { 4, 6, 8, 5 },
-  { 6, 7, 9, 8 },
-};
-HPRef_Struct reftrig_singcorner123_2D =
-{
-  HP_TRIG,
-  reftrig_singcorner123_2D_splitedges, 
-  0, 0,
-  reftrig_singcorner123_2D_newelstypes, 
-  reftrig_singcorner123_2D_newels
-};
-
-
-
-
-
-
-// HP_TRIG_SINGCORNER123
-int reftrig_singcorner123_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 1, 6 },
-  { 2, 3, 7 },
-  { 3, 1, 8 },
-  { 3, 2, 9 },
-  { 0, 0, 0 }
-};
-
-int reftrig_singcorner123_splitfaces[][4] =
-{
-  { 1, 2, 3, 10 },
-  { 2, 3, 1, 11 },
-  { 3, 1, 2, 12 },
-  { 0, 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singcorner123_newelstypes[] =
-{
-  HP_DUMMY_QUAD_SINGCORNER,
-  HP_DUMMY_QUAD_SINGCORNER,
-  HP_DUMMY_QUAD_SINGCORNER,
-  //  HP_TRIG_SINGCORNER,
-  //  HP_TRIG,
-  //  HP_TRIG_SINGCORNER,
-  //  HP_TRIG,
-  //  HP_TRIG_SINGCORNER,
-  //  HP_TRIG,
-  HP_QUAD,
-  HP_QUAD,
-  HP_QUAD,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singcorner123_newels[][8] =
-{
-  { 1, 4, 10, 5 },
-  { 2, 7, 11, 6 },
-  { 3, 8, 12, 9 },
-  //  { 1, 4, 5 },
-  //  { 5, 4, 10 },
-  //  { 2, 7, 6 },
-  //  { 6, 7, 11 },
-  //  { 3, 8, 9 },
-  //  { 8, 12, 9 },
-  { 4, 6, 11, 10 },
-  { 7, 9, 12, 11 },
-  { 8, 5, 10, 12 },
-  { 10, 11, 12 },
-};
-HPRef_Struct reftrig_singcorner123 =
-{
-  HP_TRIG,
-  reftrig_singcorner123_splitedges, 
-  reftrig_singcorner123_splitfaces, 
-  0, 
-  reftrig_singcorner123_newelstypes, 
-  reftrig_singcorner123_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-// HP_TRIG_SINGEDGE
-int reftrig_singedge_splitedges[][3] =
-{
-  { 2, 3, 4 },
-  { 1, 3, 5 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singedge_newelstypes[] =
-{
-  HP_TRIG,
-  HP_QUAD_SINGEDGE,
-  HP_NONE,
-};
-int reftrig_singedge_newels[][8] =
-{
-  { 4, 3, 5 },
-  { 1, 2, 4, 5 },
-};
-HPRef_Struct reftrig_singedge =
-{
-  HP_TRIG,
-  reftrig_singedge_splitedges, 
-  0, 0,
-  reftrig_singedge_newelstypes, 
-  reftrig_singedge_newels
-};
-
-
-
-
-
-
-// HP_TRIG_SINGEDGECORNER1
-int reftrig_singedgecorner1_splitedges[][3] =
-{
-  { 1, 2, 6 },
-  { 1, 3, 5 },
-  { 2, 3, 4 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singedgecorner1_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singedgecorner1_newels[][8] =
-{
-  { 1, 6, 5 },
-  { 6, 2, 4, 5 },
-  { 5, 4, 3 },
-};
-HPRef_Struct reftrig_singedgecorner1 =
-{
-  HP_TRIG,
-  reftrig_singedgecorner1_splitedges, 
-  0, 0, 
-  reftrig_singedgecorner1_newelstypes, 
-  reftrig_singedgecorner1_newels
-};
-
-
-
-
-
-
-
-
-// HP_TRIG_SINGEDGECORNER2
-int reftrig_singedgecorner2_splitedges[][3] =
-{
-  { 2, 1, 6 },
-  { 1, 3, 5 },
-  { 2, 3, 4 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singedgecorner2_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singedgecorner2_newels[][8] =
-{
-  { 6, 2, 4},
-  { 1, 6, 4, 5 },
-  { 5, 4, 3 },
-};
-HPRef_Struct reftrig_singedgecorner2 =
-{
-  HP_TRIG,
-  reftrig_singedgecorner2_splitedges, 
-  0, 0,
-  reftrig_singedgecorner2_newelstypes, 
-  reftrig_singedgecorner2_newels
-};
-
-
-
-
-// HP_TRIG_SINGEDGECORNER12
-int reftrig_singedgecorner12_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 1, 6 },
-  { 2, 3, 7 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singedgecorner12_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singedgecorner12_newels[][8] =
-{
-  { 1, 4, 5 },
-  { 6, 2, 7 },
-  { 4, 6, 7, 5 },
-  { 5, 7, 3 },
-};
-HPRef_Struct reftrig_singedgecorner12 =
-{
-  HP_TRIG,
-  reftrig_singedgecorner12_splitedges, 
-  0, 0,
-  reftrig_singedgecorner12_newelstypes, 
-  reftrig_singedgecorner12_newels
-};
-
-
-
-
-
-
-
-// HP_TRIG_SINGEDGECORNER3
-int reftrig_singedgecorner3_splitedges[][3] =
-{
-  { 1, 3, 4 },
-  { 3, 1, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singedgecorner3_newelstypes[] =
-{
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int reftrig_singedgecorner3_newels[][8] =
-{
-  { 1, 2, 6, 4 },
-  { 4, 6, 7, 5 },
-  { 3, 5, 7 },
-};
-HPRef_Struct reftrig_singedgecorner3 =
-{
-  HP_TRIG,
-  reftrig_singedgecorner3_splitedges, 
-  0, 0,
-  reftrig_singedgecorner3_newelstypes, 
-  reftrig_singedgecorner3_newels
-};
-
-
-
-
-// HP_TRIG_SINGEDGECORNER13
-int reftrig_singedgecorner13_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 3, 6 },
-  { 3, 1, 7 },
-  { 3, 2, 8 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singedgecorner13_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int reftrig_singedgecorner13_newels[][8] =
-{
-  { 1, 4, 5 },
-  { 4, 2, 6, 5 },
-  { 5, 6, 8, 7 },
-  { 3, 7, 8 },
-};
-HPRef_Struct reftrig_singedgecorner13 =
-{
-  HP_TRIG,
-  reftrig_singedgecorner13_splitedges, 
-  0, 0,
-  reftrig_singedgecorner13_newelstypes, 
-  reftrig_singedgecorner13_newels
-};
-
-
-
-
-
-// HP_TRIG_SINGEDGECORNER23
-int reftrig_singedgecorner23_splitedges[][3] =
-{
-  { 1, 3, 4 },
-  { 2, 1, 5 },
-  { 2, 3, 6 },
-  { 3, 1, 7 },
-  { 3, 2, 8 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singedgecorner23_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int reftrig_singedgecorner23_newels[][8] =
-{
-  { 5, 2, 6 },
-  { 1, 5, 6, 4 },
-  { 4, 6, 8, 7 },
-  { 3, 7, 8 },
-};
-HPRef_Struct reftrig_singedgecorner23 =
-{
-  HP_TRIG,
-  reftrig_singedgecorner23_splitedges, 
-  0, 0,
-  reftrig_singedgecorner23_newelstypes, 
-  reftrig_singedgecorner23_newels
-};
-
-
-
-// HP_TRIG_SINGEDGECORNER123
-int reftrig_singedgecorner123_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 1, 6 },
-  { 2, 3, 7 },
-  { 3, 1, 8 },
-  { 3, 2, 9 },
-  { 0, 0, 0 }
-};
-HPREF_ELEMENT_TYPE reftrig_singedgecorner123_newelstypes[] =
-{
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_NONE,
-};
-int reftrig_singedgecorner123_newels[][8] =
-{
-  { 1, 4, 5 },
-  { 6, 2, 7 },
-  { 4, 6, 7, 5 },
-  { 5, 7, 9, 8 },
-  { 3, 8, 9 },
-};
-HPRef_Struct reftrig_singedgecorner123 =
-{
-  HP_TRIG,
-  reftrig_singedgecorner123_splitedges, 
-  0, 0,
-  reftrig_singedgecorner123_newelstypes, 
-  reftrig_singedgecorner123_newels
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-// HP_TRIG_SINGEDGES
-int reftrig_singedges_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 3, 6 },
-  { 3, 2, 7 },
-  { 0, 0, 0 }
-};
-int reftrig_singedges_splitfaces[][4] =
-{
-  { 1, 2, 3, 8 },
-  { 0, 0, 0, 0 }
-};
-
-HPREF_ELEMENT_TYPE reftrig_singedges_newelstypes[] =
-{
-  //  HP_QUAD_2E,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singedges_newels[][8] =
-{
-  // { 1, 4, 8, 5 },
-  { 1, 4, 8 },
-  { 5, 1, 8 },
-  { 4, 2, 6, 8 },
-  { 3, 5, 8, 7 },
-  { 6, 7, 8 },
-};
-HPRef_Struct reftrig_singedges =
-{
-  HP_TRIG,
-  reftrig_singedges_splitedges, 
-  reftrig_singedges_splitfaces, 
-  0,
-  reftrig_singedges_newelstypes, 
-  reftrig_singedges_newels
-};
-
-
-
-
-
-
-
-
-// HP_TRIG_SINGEDGES2
-int reftrig_singedges2_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 1, 6 },
-  { 2, 3, 7 },
-  { 3, 2, 8 },
-  { 0, 0, 0 }
-};
-int reftrig_singedges2_splitfaces[][4] =
-{
-  { 1, 2, 3, 9 },
-  { 0, 0, 0, 0 }
-};
-
-HPREF_ELEMENT_TYPE reftrig_singedges2_newelstypes[] =
-{
-  //  HP_QUAD_2E,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singedges2_newels[][8] =
-{
-  //  { 1, 4, 9, 5 },
-  { 1, 4, 9 },
-  { 5, 1, 9 },
-  { 4, 6, 7, 9 },
-  { 3, 5, 9, 8 },
-  { 6, 2, 7 },
-  { 7, 8, 9 },
-};
-HPRef_Struct reftrig_singedges2 =
-{
-  HP_TRIG,
-  reftrig_singedges2_splitedges, 
-  reftrig_singedges2_splitfaces, 
-  0,
-  reftrig_singedges2_newelstypes, 
-  reftrig_singedges2_newels
-};
-
-
-
-
-// HP_TRIG_SINGEDGES3
-int reftrig_singedges3_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 3, 6 },
-  { 3, 1, 7 },
-  { 3, 2, 8 },
-  { 0, 0, 0 }
-};
-int reftrig_singedges3_splitfaces[][4] =
-{
-  { 1, 2, 3, 9 },
-  { 0, 0, 0, 0 }
-};
-
-HPREF_ELEMENT_TYPE reftrig_singedges3_newelstypes[] =
-{
-  //  HP_QUAD_2E,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singedges3_newels[][8] =
-{
-  //  { 1, 4, 9, 5 },
-  { 1, 4, 9 },
-  { 5, 1, 9 },
-  { 4, 2, 6, 9 },
-  { 7, 5, 9, 8 },
-  { 3, 7, 8 },
-  { 6, 8, 9 },
-};
-HPRef_Struct reftrig_singedges3 =
-{
-  HP_TRIG,
-  reftrig_singedges3_splitedges, 
-  reftrig_singedges3_splitfaces, 
-  0,
-  reftrig_singedges3_newelstypes, 
-  reftrig_singedges3_newels
-};
-
-
-
-
-
-
-// HP_TRIG_SINGEDGES23
-int reftrig_singedges23_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 1, 3, 5 },
-  { 2, 1, 6 },
-  { 2, 3, 7 },
-  { 3, 1, 8 },
-  { 3, 2, 9 },
-  { 0, 0, 0 }
-};
-int reftrig_singedges23_splitfaces[][4] =
-{
-  { 1, 2, 3, 10 },
-  { 0, 0, 0, 0 }
-};
-
-HPREF_ELEMENT_TYPE reftrig_singedges23_newelstypes[] =
-{
-  //  HP_QUAD_2E,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG_SINGEDGECORNER2,
-
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_TRIG_SINGEDGECORNER1,
-  HP_TRIG,
-  HP_NONE,
-};
-int reftrig_singedges23_newels[][8] =
-{
-  //  { 1, 4, 10, 5 },
-  { 1 , 4, 10 },
-  { 5, 1, 10 },
-  { 4, 6, 7, 10 },
-  { 8, 5, 10, 9 },
-  { 6, 2, 7 },
-  { 3, 8, 9 },
-  { 7, 9, 10 },
-};
-HPRef_Struct reftrig_singedges23 =
-{
-  HP_TRIG,
-  reftrig_singedges23_splitedges, 
-  reftrig_singedges23_splitfaces, 
-  0,
-  reftrig_singedges23_newelstypes, 
-  reftrig_singedges23_newels
-};
-
-
diff --git a/contrib/Netgen/libsrc/meshing/hprefinement.cpp b/contrib/Netgen/libsrc/meshing/hprefinement.cpp
deleted file mode 100644
index 6a63e876751bfcc89221d7f92f446923eff92d64..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hprefinement.cpp
+++ /dev/null
@@ -1,2605 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-
-
-namespace netgen
-{
-
-
-  // HP_SEGM
-  int refsegm_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  
-  HPREF_ELEMENT_TYPE refsegm_newelstypes[] =
-    {
-      HP_SEGM,
-      HP_NONE,
-    };
-  int refsegm_newels[][8] =
-    {
-      { 1, 2 },
-    };
-  HPRef_Struct refsegm =
-    {
-      HP_SEGM, 
-      refsegm_splitedges, 
-      0, 0, 
-      refsegm_newelstypes, 
-      refsegm_newels
-    };
-
-
-  // HP_SEGM_SINGCORNERL = 2,
-  int refsegm_scl_splitedges[][3] =
-    {
-      { 1, 2, 3 },
-      { 0, 0, 0 }
-    };
-
-  HPREF_ELEMENT_TYPE refsegm_scl_newelstypes[] =
-    {
-      HP_SEGM_SINGCORNERL,
-      HP_SEGM,
-      HP_NONE,
-    };
-  int refsegm_scl_newels[][8] =
-    {
-      { 1, 3 },
-      { 3, 2 },
-      { 0, 0 },
-    };
-  HPRef_Struct refsegm_scl =
-    {
-      HP_SEGM,
-      refsegm_scl_splitedges,
-      0, 0,
-      refsegm_scl_newelstypes,
-      refsegm_scl_newels
-    };
-
-
-
-  // HP_SEGM_SINGCORNERR
-  int refsegm_scr_splitedges[][3] =
-    {
-      { 2, 1, 3 },
-      { 0, 0, 0 }
-    };
-
-  HPREF_ELEMENT_TYPE refsegm_scr_newelstypes[] =
-    {
-      HP_SEGM,
-      HP_SEGM_SINGCORNERR,
-      HP_NONE,
-    };
-  int refsegm_scr_newels[][8] =
-    {
-      { 1, 3 },
-      { 3, 2 },
-      { 0, 0 },
-    };
-  HPRef_Struct refsegm_scr =
-    {
-      HP_SEGM,
-      refsegm_scr_splitedges,
-      0, 0,
-      refsegm_scr_newelstypes,
-      refsegm_scr_newels
-    };
-
-
-
-
-
-
-  // HP_SEGM_SINGCORNERS = 3,
-  int refsegm_sc2_splitedges[][3] =
-    {
-      { 1, 2, 3 },
-      { 2, 1, 4 },
-      { 0, 0, 0 }
-    };
-
-  HPREF_ELEMENT_TYPE refsegm_sc2_newelstypes[] =
-    {
-      HP_SEGM_SINGCORNERL,
-      HP_SEGM_SINGCORNERR,
-      HP_SEGM,
-      HP_NONE,
-    };
-  int refsegm_sc2_newels[][8] =
-    {
-      { 1, 3 },
-      { 4, 2 },
-      { 3, 4 },
-      { 0, 0 },
-    };
-  HPRef_Struct refsegm_sc2 =
-    {
-      HP_SEGM,
-      refsegm_sc2_splitedges,
-      0, 0,
-      refsegm_sc2_newelstypes,
-      refsegm_sc2_newels
-    };
-
-
-
-
-
-
-#include "hpref_trig.hpp"
-#include "hpref_quad.hpp"
-#include "hpref_tet.hpp"
-#include "hpref_prism.hpp"
-
-
-
-
-
-  // HP_PYRAMID
-  int refpyramid_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refpyramid_newelstypes[] =
-    {
-      HP_PYRAMID,
-      HP_NONE,
-    };
-  int refpyramid_newels[][8] =
-    {
-      { 1, 2, 3, 4, 5, 6 }
-    };
-  HPRef_Struct refpyramid =
-    {
-      HP_PYRAMID,
-      refpyramid_splitedges, 
-      0, 0,
-      refpyramid_newelstypes, 
-      refpyramid_newels
-    };
-
-
-
-  // HP_PYRAMID_0E_1V
-  int refpyramid_0e_1v_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refpyramid_0e_1v_newelstypes[] =
-    {
-      HP_TET_0E_1V,
-      HP_TET,
-      HP_NONE,
-    };
-  int refpyramid_0e_1v_newels[][8] =
-    {
-      { 1, 2, 4, 5 },
-      { 2, 3, 4, 5 },
-    };
-  HPRef_Struct refpyramid_0e_1v =
-    {
-      HP_PYRAMID,
-      refpyramid_0e_1v_splitedges, 
-      0, 0,
-      refpyramid_0e_1v_newelstypes, 
-      refpyramid_0e_1v_newels
-    };
-
-
-
-  // HP_PYRAMID_EDGES
-  int refpyramid_edges_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refpyramid_edges_newelstypes[] =
-    {
-      HP_TET_1E_1VA,
-      HP_TET_1E_1VA,
-      HP_NONE,
-    };
-  int refpyramid_edges_newels[][8] =
-    {
-      { 1, 2, 3, 5 },
-      { 1, 4, 5, 3 },
-    };
-  HPRef_Struct refpyramid_edges =
-    {
-      HP_PYRAMID,
-      refpyramid_edges_splitedges, 
-      0, 0,
-      refpyramid_edges_newelstypes, 
-      refpyramid_edges_newels
-    };
-
-
-
-
-  // HP_PYRAMID_1FB_0E_1VA
-  int refpyramid_1fb_0e_1va_splitedges[][3] =
-    {
-      { 1, 4, 6 },
-      { 2, 3, 7 },
-      { 5, 1, 8 },
-      { 5, 2, 9 },
-      { 5, 3, 10 },
-      { 5, 4, 11 },
-      { 0, 0, 0 },
-    };
-
-  HPREF_ELEMENT_TYPE refpyramid_1fb_0e_1va_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_PYRAMID_1FB_0E_1VA,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refpyramid_1fb_0e_1va_newels[][8] =
-    {
-      { 1, 8, 9, 2, 6, 11, 10, 7 },
-      { 8, 9, 10, 11, 5 },
-      { 3, 7, 10, 4, 6, 11 }
-    };
-  HPRef_Struct refpyramid_1fb_0e_1va =
-    {
-      HP_PYRAMID,
-      refpyramid_1fb_0e_1va_splitedges, 
-      0, 0,
-      refpyramid_1fb_0e_1va_newelstypes, 
-      refpyramid_1fb_0e_1va_newels
-    };
-
-
-
-
-
-
-
-  // HP_HEX
-  int refhex_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refhex_newelstypes[] =
-    {
-      HP_HEX,
-      HP_NONE,
-    };
-  int refhex_newels[][8] =
-    {
-      { 1, 2, 3, 4, 5, 6, 7, 8 }
-    };
-  HPRef_Struct refhex =
-    {
-      HP_HEX,
-      refhex_splitedges, 
-      0, 0,
-      refhex_newelstypes, 
-      refhex_newels
-    };
-
-
-
-
-  // HP_HEX_0E_1V
-  int refhex_0e_1v_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refhex_0e_1v_newelstypes[] =
-    {
-      HP_TET_0E_1V,
-      HP_TET,
-      HP_TET,
-      HP_TET,
-      HP_TET,
-      HP_TET,
-      HP_NONE,
-    };
-  int refhex_0e_1v_newels[][8] =
-    {
-      { 1, 5, 2, 4 },
-      { 7, 3, 6, 8 },
-      { 2, 8, 5, 6 },
-      { 2, 8, 6, 3 },
-      { 2, 8, 3, 4 },
-      { 2, 8, 4, 5 },
-    };
-  HPRef_Struct refhex_0e_1v =
-    {
-      HP_HEX,
-      refhex_0e_1v_splitedges, 
-      0, 0,
-      refhex_0e_1v_newelstypes, 
-      refhex_0e_1v_newels
-    };
-
-
-
-
-  // HP_HEX_1E_1V
-  int refhex_1e_1v_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refhex_1e_1v_newelstypes[] =
-    {
-      HP_TET_1E_1VA,
-      HP_TET,
-      HP_TET_0E_1V,
-      HP_TET_0E_1V,
-      HP_TET_0E_1V,
-      HP_TET_0E_1V,
-      HP_NONE,
-    };
-  int refhex_1e_1v_newels[][8] =
-    {
-      // { 1, 5, 2, 4 }, 
-      { 1, 2, 4, 5 },
-      { 7, 3, 6, 8 },
-      { 2, 8, 5, 6 },
-      { 2, 8, 6, 3 },
-      { 2, 8, 3, 4 },
-      { 2, 8, 4, 5 },
-    };
-  HPRef_Struct refhex_1e_1v =
-    {
-      HP_HEX,
-      refhex_1e_1v_splitedges, 
-      0, 0,
-      refhex_1e_1v_newelstypes, 
-      refhex_1e_1v_newels
-    };
-
-
-
-  // HP_HEX_3E_0V
-  int refhex_3e_0v_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refhex_3e_0v_newelstypes[] =
-    {
-      HP_TET_1E_1VA,
-      HP_TET_1E_1VA,
-      HP_TET_1E_1VA,
-      HP_TET_0E_1V,
-      HP_TET,
-      HP_NONE,
-    };
-  int refhex_3e_0v_newels[][8] =
-    {
-      { 1, 2, 3, 6 },
-      { 1, 4, 8, 3 },
-      { 1, 5, 6, 8 },
-      { 1, 6, 3, 8 },
-      { 3, 8, 6, 7 },
-    };
-  HPRef_Struct refhex_3e_0v =
-    {
-      HP_HEX,
-      refhex_3e_0v_splitedges, 
-      0, 0,
-      refhex_3e_0v_newelstypes, 
-      refhex_3e_0v_newels
-    };
-
-
-
-
-  // HP_HEX_1E_0V
-  int refhex_1e_0v_splitedges[][3] =
-    {
-      { 0, 0, 0 }
-    };
-
-  HPREF_ELEMENT_TYPE refhex_1e_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refhex_1e_0v_newels[][8] =
-    {
-      { 1, 4, 5, 2, 3, 6 },
-      { 5, 4, 8, 6, 3, 7 },
-    };
-  HPRef_Struct refhex_1e_0v =
-    {
-      HP_HEX,
-      refhex_1e_0v_splitedges, 
-      0, 0,
-      refhex_1e_0v_newelstypes, 
-      refhex_1e_0v_newels
-    };
-
-
-
-
-
-  // HP_HEX_1F_0E_0V
-  int refhex_1f_0e_0v_splitedges[][3] =
-    {
-      { 1, 5, 9 },
-      { 2, 6, 10 },
-      { 3, 7, 11 },
-      { 4, 8, 12 },
-      { 0, 0, 0 }
-    };
-
-  HPREF_ELEMENT_TYPE refhex_1f_0e_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_HEX,
-      HP_NONE,
-    };
-  int refhex_1f_0e_0v_newels[][8] =
-    {
-      { 1, 2, 3, 4, 9, 10, 11, 12 },
-      { 9, 10, 11, 12, 5, 6, 7, 8 }
-    };
-  HPRef_Struct refhex_1f_0e_0v =
-    {
-      HP_HEX,
-      refhex_1f_0e_0v_splitedges, 
-      0, 0,
-      refhex_1f_0e_0v_newelstypes, 
-      refhex_1f_0e_0v_newels
-    };
-
-
-
-
-
-
-
-  HPRef_Struct * Get_HPRef_Struct (HPREF_ELEMENT_TYPE type)
-  {
-    HPRef_Struct * hps = NULL;
-
-    switch (type)
-      {
-      case HP_SEGM:
-	hps = &refsegm; break;
-      case HP_SEGM_SINGCORNERL:
-	hps = &refsegm_scl; break;
-      case HP_SEGM_SINGCORNERR:
-	hps = &refsegm_scr; break;
-      case HP_SEGM_SINGCORNERS:
-	hps = &refsegm_sc2; break;
-
-      case HP_TRIG:
-	hps = &reftrig; break;
-      case HP_TRIG_SINGCORNER:
-	hps = &reftrig_singcorner; break;
-      case HP_TRIG_SINGCORNER12:
-	hps = &reftrig_singcorner12; break;
-      case HP_TRIG_SINGCORNER123:
-	hps = &reftrig_singcorner123; break;
-      case HP_TRIG_SINGCORNER123_2D:
-	hps = &reftrig_singcorner123_2D; break;
-      case HP_TRIG_SINGEDGE:
-	hps = &reftrig_singedge; break;
-      case HP_TRIG_SINGEDGECORNER1:
-	hps = &reftrig_singedgecorner1; break;
-      case HP_TRIG_SINGEDGECORNER2:
-	hps = &reftrig_singedgecorner2; break;
-      case HP_TRIG_SINGEDGECORNER12:
-	hps = &reftrig_singedgecorner12; break;
-      case HP_TRIG_SINGEDGECORNER3:
-	hps = &reftrig_singedgecorner3; break;
-      case HP_TRIG_SINGEDGECORNER13:
-	hps = &reftrig_singedgecorner13; break;
-      case HP_TRIG_SINGEDGECORNER23:
-	hps = &reftrig_singedgecorner23; break;
-      case HP_TRIG_SINGEDGECORNER123:
-	hps = &reftrig_singedgecorner123; break;
-      case HP_TRIG_SINGEDGES:
-	hps = &reftrig_singedges; break;
-      case HP_TRIG_SINGEDGES2:
-	hps = &reftrig_singedges2; break;
-      case HP_TRIG_SINGEDGES3:
-	hps = &reftrig_singedges3; break;
-      case HP_TRIG_SINGEDGES23:
-	hps = &reftrig_singedges23; break;
-      case HP_QUAD:
-	hps = &refquad; break;
-      case HP_DUMMY_QUAD_SINGCORNER:
-	hps = &refdummyquad_singcorner; break;
-      case HP_QUAD_SINGCORNER:
-	hps = &refquad_singcorner; break;
-      case HP_QUAD_SINGEDGE:
-	hps = &refquad_singedge; break;
-
-      case HP_QUAD_0E_2VA:
-	hps = &refquad_0e_2va; break;
-      case HP_QUAD_0E_2VB:
-	hps = &refquad_0e_2vb; break;
-
-      case HP_QUAD_0E_3V:
-	hps = &refquad_0e_3v; break;
-      case HP_QUAD_0E_4V:
-	hps = &refquad_0e_4v; break;
-
-      case HP_QUAD_1E_1VA:
-	hps = &refquad_1e_1va; break;
-      case HP_QUAD_1E_1VB:
-	hps = &refquad_1e_1vb; break;
-      case HP_QUAD_1E_1VC:
-	hps = &refquad_1e_1vc; break;
-      case HP_QUAD_1E_1VD:
-	hps = &refquad_1e_1vd; break;
-
-      case HP_QUAD_1E_2VA:
-	hps = &refquad_1e_2va; break;
-      case HP_QUAD_1E_2VB:
-	hps = &refquad_1e_2vb; break;
-      case HP_QUAD_1E_2VC:
-	hps = &refquad_1e_2vc; break;
-      case HP_QUAD_1E_2VD:
-	hps = &refquad_1e_2vd; break;
-      case HP_QUAD_1E_2VE:
-	hps = &refquad_1e_2ve; break;
-      case HP_QUAD_1E_2VF:
-	hps = &refquad_1e_2vf; break;
-
-      case HP_QUAD_1E_3VA:
-	hps = &refquad_1e_3va; break;
-      case HP_QUAD_1E_3VB:
-	hps = &refquad_1e_3vb; break;
-      case HP_QUAD_1E_3VC:
-	hps = &refquad_1e_3vc; break;
-      case HP_QUAD_1E_3VD:
-	hps = &refquad_1e_3vd; break;
-      case HP_QUAD_1E_4V:
-	hps = &refquad_1e_4v; break;
-
-
-      case HP_QUAD_2E:
-	hps = &refquad_2e; break;
-      case HP_QUAD_2E_1VA:
-	hps = &refquad_2e_1va; break;
-      case HP_QUAD_2E_1VB:
-	hps = &refquad_2e_1vb; break;
-      case HP_QUAD_2E_1VC:
-	hps = &refquad_2e_1vc; break;
-      case HP_QUAD_2E_2VA:
-	hps = &refquad_2e_2va; break;
-      case HP_QUAD_2E_2VB:
-	hps = &refquad_2e_2vb; break;
-      case HP_QUAD_2E_2VC:
-	hps = &refquad_2e_2vc; break;
-      case HP_QUAD_2E_3V:
-	hps = &refquad_2e_3v; break;
-
-      case HP_QUAD_2EB_0V:
-	hps = &refquad_2eb_0v; break;
-
-      case HP_QUAD_2EB_1VA:
-	hps = &refquad_2eb_1va; break;
-      case HP_QUAD_2EB_1VB:
-	hps = &refquad_2eb_1vb; break;
-
-
-      case HP_QUAD_2EB_2VA:
-	hps = &refquad_2eb_2va; break;
-      case HP_QUAD_2EB_2VB:
-	hps = &refquad_2eb_2vb; break;
-      case HP_QUAD_2EB_2VC:
-	hps = &refquad_2eb_2vc; break;
-      case HP_QUAD_2EB_2VD:
-	hps = &refquad_2eb_2vd; break;
-
-      case HP_QUAD_2EB_3VA:
-	hps = &refquad_2eb_3va; break;
-      case HP_QUAD_2EB_3VB:
-	hps = &refquad_2eb_3vb; break;
-
-      case HP_QUAD_2EB_4V:
-	hps = &refquad_2eb_4v; break;
-
-      case HP_QUAD_3E:
-	hps = &refquad_3e; break;
-      case HP_QUAD_3E_3VA:
-	hps = &refquad_3e_3va; break;
-      case HP_QUAD_3E_3VB:
-	hps = &refquad_3e_3vb; break;
-      case HP_QUAD_3E_4V:
-	hps = &refquad_3e_4v; break;
-
-
-      case HP_QUAD_4E:
-	hps = &refquad_4e; break;
-
-
-      case HP_TET:
-	hps = &reftet; break;
-      case HP_TET_0E_1V:
-	hps = &reftet_0e_1v; break;
-      case HP_TET_0E_2V:
-	hps = &reftet_0e_2v; break;
-      case HP_TET_0E_3V:
-	hps = &reftet_0e_3v; break;
-      case HP_TET_0E_4V:
-	hps = &reftet_0e_4v; break;
-
-      case HP_TET_1E_0V:      
-	hps = &reftet_1e_0v; break;
-      case HP_TET_1E_1VA:
-	hps = &reftet_1e_1va; break;
-      case HP_TET_1E_1VB:
-	hps = &reftet_1e_1vb; break;
-
-      case HP_TET_1E_2VA:
-	hps = &reftet_1e_2va; break;
-      case HP_TET_1E_2VB:
-	hps = &reftet_1e_2vb; break;
-      case HP_TET_1E_2VC:
-	hps = &reftet_1e_2vc; break;
-      case HP_TET_1E_2VD:
-	hps = &reftet_1e_2vd; break;
-
-      case HP_TET_1E_3VA:
-	hps = &reftet_1e_3va; break;
-      case HP_TET_1E_3VB:
-	hps = &reftet_1e_3vb; break;
-      case HP_TET_1E_4V:
-	hps = &reftet_1e_4v; break;
-
-      case HP_TET_2EA_0V:
-	hps = &reftet_2ea_0v; break;
-      case HP_TET_2EA_1VB:
-	hps = &reftet_2ea_1vb; break;
-      case HP_TET_2EA_1VC:
-	hps = &reftet_2ea_1vc; break;
-      case HP_TET_2EA_1VA:
-	hps = &reftet_2ea_1va; break;
-      case HP_TET_2EA_2VA:
-	hps = &reftet_2ea_2va; break;
-      case HP_TET_2EA_2VB:
-	hps = &reftet_2ea_2vb; break;
-      case HP_TET_2EA_2VC:
-	hps = &reftet_2ea_2vc; break;
-      case HP_TET_2EA_3V:
-	hps = &reftet_2ea_3v; break;
-
-      case HP_TET_2EB_0V:
-	hps = &reftet_2eb_0v; break;
-      case HP_TET_2EB_2VA:
-	hps = &reftet_2eb_2va; break;
-      case HP_TET_2EB_4V:
-	hps = &reftet_2eb_4v; break;
-
-
-      case HP_TET_3EA_0V:
-	hps = &reftet_3ea_0v; break;
-      case HP_TET_3EA_1V:
-	hps = &reftet_3ea_1v; break;
-      case HP_TET_3EA_2V:
-	hps = &reftet_3ea_2v; break;
-      case HP_TET_3EA_3V:
-	hps = &reftet_3ea_3v; break;
-
-      case HP_TET_3EB_0V:
-	hps = &reftet_3eb_0v; break;
-      case HP_TET_3EB_1V:
-	hps = &reftet_3eb_1v; break;
-      case HP_TET_3EB_2V:
-	hps = &reftet_3eb_2v; break;
-      case HP_TET_3EC_0V:
-	hps = &reftet_3ec_0v; break;
-      case HP_TET_3EC_1V:
-	hps = &reftet_3ec_1v; break;
-      case HP_TET_3EC_2V:
-	hps = &reftet_3ec_2v; break;
-
-
-      case HP_TET_1F_0E_0V:
-	hps = &reftet_1f_0e_0v; break;
-      case HP_TET_1F_0E_1VA:
-	hps = &reftet_1f_0e_1va; break;
-      case HP_TET_1F_0E_1VB:
-	hps = &reftet_1f_0e_1vb; break;
-      case HP_TET_1F_1EA_0V:
-	hps = &reftet_1f_1ea_0v; break;
-      case HP_TET_1F_1EB_0V:
-	hps = &reftet_1f_1eb_0v; break;
-      case HP_TET_2F_0E_0V:
-	hps = &reftet_2f_0e_0v; break;
-
-
-      case HP_PRISM:
-	hps = &refprism; break;
-      case HP_PRISM_SINGEDGE:
-	hps = &refprism_singedge; break;
-      case HP_PRISM_SINGEDGE_H1:
-	hps = &refprism_singedge_h1; break;
-      case HP_PRISM_SINGEDGE_H12:
-	hps = &refprism_singedge_h12; break;
-      case HP_PRISM_SINGEDGE_V12:
-	hps = &refprism_singedge_v12; break;
-
-      case HP_PRISM_1FA_0E_0V:
-	hps = &refprism_1fa_0e_0v; break;
-      case HP_PRISM_1FB_0E_0V:
-	hps = &refprism_1fb_0e_0v; break;
-      case HP_PRISM_1FB_1EA_0V:
-	hps = &refprism_1fb_1ea_0v; break;
-
-      case HP_PYRAMID:
-	hps = &refpyramid; break;
-      case HP_PYRAMID_0E_1V:
-	hps = &refpyramid_0e_1v; break;
-      case HP_PYRAMID_EDGES:
-	hps = &refpyramid_edges; break;
-      case HP_PYRAMID_1FB_0E_1VA:
-	hps = &refpyramid_1fb_0e_1va; break;
-      case HP_HEX:
-	hps = &refhex; break;
-      case HP_HEX_0E_1V:
-	hps = &refhex_0e_1v; break;
-      case HP_HEX_1E_1V:
-	hps = &refhex_1e_1v; break;
-      case HP_HEX_1E_0V:
-	hps = &refhex_1e_0v; break;
-      case HP_HEX_3E_0V:
-	hps = &refhex_3e_0v; break;
-
-      case HP_HEX_1F_0E_0V:
-	hps = &refhex_1f_0e_0v; break;
-      }
-
-    if (!hps)
-      {
-	PrintSysError ("hp-refinement not implemented for case ", type);
-      }
-
-    return hps;
-  }
-
-
-  /* *********************** PrepareElements ****************************** */
-  
-  // Elements (volume, surface, edges)  are classified by singular vertices, edges, faces
-
-
-  void PrepareElements (Mesh & mesh, ARRAY<HPRefElement> & elements)
-  {
-    INDEX_2_HASHTABLE<int> edges(mesh.GetNSeg()+1);
-    BitArray edgepoint(mesh.GetNP());
-    INDEX_2_HASHTABLE<int> edgepoint_dom(mesh.GetNSeg()+1);
-
-    edgepoint.Clear();
-    BitArray cornerpoint(mesh.GetNP());
-    cornerpoint.Clear();
-
-
-    // value = nr > 0 ... refine elements in domain nr
-    // value = -1   ..... refine elements in any domain
-    INDEX_3_HASHTABLE<int> faces(mesh.GetNSE()+1);
-    INDEX_2_HASHTABLE<int> face_edges(mesh.GetNSE()+1);
-    ARRAY<int, PointIndex::BASE> facepoint(mesh.GetNP());
-
-    if (mesh.GetDimension() == 3)
-      {
-	/*
-	// check, if point has as least 3 different surfs:
-
-	ARRAY<INDEX_3, PointIndex::BASE> surfonpoint(mesh.GetNP());
-	surfonpoint = INDEX_3(0,0,0);
-
-	for (SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
-	  {
-	    const Element2d & el = mesh[sei];
-	    int ind = el.GetIndex();
-	    for (int j = 0; j < el.GetNP(); j++)
-	      {
-		INDEX_3 & i3 = surfonpoint[el[j]];
-		if (ind != i3.I1() && ind != i3.I2() && ind != i3.I3())
-		  {
-		    i3.I1() = i3.I2();
-		    i3.I2() = i3.I3();
-		    i3.I3() = ind;
-		  }
-	      }
-	  }
-	for (int i = 1; i <= mesh.GetNP(); i++)
-	  if (surfonpoint.Get(i).I1())
-	    cornerpoint.Set(i);
-	*/
-	cornerpoint.Clear();
-
-	for (int i = 1; i <= mesh.GetNP(); i++)
-	  {
-	    if (mesh.Point(i).IsSingular())
-	      cornerpoint.Set(i);
-	  }
-
-
-	for (int i = 1; i <= mesh.GetNSeg(); i++)
-	  if (mesh.LineSegment(i).singedge_left)
-	    {
-	      INDEX_2 i2 (mesh.LineSegment(i).p1, 
-			  mesh.LineSegment(i).p2);
-	      i2.Sort();
-	      
-	      edges.Set (i2, 1);
-	      INDEX_2 i2s(i2.I2(), i2.I1());
-	      edges.Set (i2s, 1);
-	      
-	      edgepoint.Set (i2.I1());
-	      edgepoint.Set (i2.I2());
-	    }
-
-
-	// if 2 adjacent edges of an element are singular, the 
-	// commen point must be a singular point
-	for (int i = 1; i <= mesh.GetNE(); i++)
-	  {
-	    const Element & el = mesh.VolumeElement(i);
-	    const ELEMENT_EDGE * eledges = MeshTopology::GetEdges (el.GetType());
-	    int nedges = MeshTopology::GetNEdges (el.GetType());
-	    for (int j = 0; j < nedges; j++)
-	      for (int k = 0; k < nedges; k++)
-		if (j != k)
-		  {
-		    INDEX_2 ej(el.PNum(eledges[j][0]), el.PNum(eledges[j][1]));
-		    ej.Sort();
-		    INDEX_2 ek(el.PNum(eledges[k][0]), el.PNum(eledges[k][1]));
-		    ek.Sort();
-		    if (edges.Used(ej) && edges.Used(ek))
-		      {
-			if (ej.I1() == ek.I1()) cornerpoint.Set (ek.I1());
-			if (ej.I1() == ek.I2()) cornerpoint.Set (ek.I2());
-			if (ej.I2() == ek.I1()) cornerpoint.Set (ek.I1());
-			if (ej.I2() == ek.I2()) cornerpoint.Set (ek.I2());
-		      }
-		  }
-	  }
-
-	
-	edgepoint.Or (cornerpoint);
-	
-	(*testout) << "cornerpoint = " << endl << cornerpoint << endl;
-	(*testout) << "edgepoint = " << endl << edgepoint << endl;
-
-	facepoint = 0;
-	for (SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
-	  {
-	    const Element2d & el = mesh[sei];
-	    const FaceDescriptor & fd = mesh.GetFaceDescriptor (el.GetIndex());
-
-	    if (!fd.domin_singular && !fd.domout_singular) continue;
-	    int domnr;
-	    if (fd.domin_singular) domnr = fd.DomainIn();
-	    if (fd.domout_singular) domnr = fd.DomainOut();
-	    if (fd.domin_singular && fd.domout_singular) domnr = -1;
-	    
-
-	    faces.Set (INDEX_3::Sort (el[0], el[1], el[2]), domnr);
-	    face_edges.Set (INDEX_2::Sort (el[0], el[1]), domnr);
-	    face_edges.Set (INDEX_2::Sort (el[0], el[2]), domnr);
-	    face_edges.Set (INDEX_2::Sort (el[2], el[1]), domnr);
-	    facepoint[el[0]] = domnr;
-	    facepoint[el[1]] = domnr;
-	    facepoint[el[2]] = domnr;
-	  }
-	
-      }
-    else
-      {
-	// 2D case
-
-	// check, if point has as least 3 different surfs:
-	ARRAY<INDEX_3, PointIndex::BASE> surfonpoint(mesh.GetNP());
-
-	for (int i = 1; i <= mesh.GetNP(); i++)
-	  surfonpoint.Elem(i) = INDEX_3(0,0,0);
-      
-	for (int i = 1; i <= mesh.GetNSeg(); i++)
-	  {
-	    const Segment & seg = mesh.LineSegment(i);
-	    int ind = seg.edgenr;
-
-	    if (seg.singedge_left)
-	      {
-		INDEX_2 i2 (mesh.LineSegment(i).p1, 
-			    mesh.LineSegment(i).p2);
-		edges.Set (i2, 1);
-		edgepoint.Set(i2.I1());
-		edgepoint.Set(i2.I2());
-	      
-		edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domin, i2.I1()), 1);
-		edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domin, i2.I2()), 1);
-	      }
-	    if (seg.singedge_right)
-	      {
-		INDEX_2 i2 (mesh.LineSegment(i).p2, 
-			    mesh.LineSegment(i).p1);
-		edges.Set (i2, 1);
-		edgepoint.Set(i2.I1());
-		edgepoint.Set(i2.I2());
-
-		edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domout, i2.I1()), 1);
-		edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domout, i2.I2()), 1);
-	      }
-	    // (*testout) << "seg = " << ind << ", " << seg.p1 << "-" << seg.p2 << endl;
-
-
-	    if (seg.singedge_left || seg.singedge_right)
-	      {
-		for (int j = 0; j < 2; j++)
-		  {
-		    int pi = (j == 0) ? seg.p1 : seg.p2;
-		    INDEX_3 & i3 = surfonpoint.Elem(pi);
-		    if (ind != i3.I1() &&
-			ind != i3.I2())
-		      {
-			i3.I1() = i3.I2();
-			i3.I2() = ind;
-		      }
-		  }
-	      }
-	  }
-
-
-	for (int i = 1; i <= mesh.GetNP(); i++)
-	  {
-	    // mark points for refinement that are in corners between two anisotropic edges 
-	    if (surfonpoint.Get(i).I1())
-	      {
-		cornerpoint.Set(i);
-		edgepoint.Set(i);
-	      }
-	
-	    // mark points for refinement that are explicity specified in input file
-	    if (mesh.Point(i).IsSingular())
-	      {
-		cornerpoint.Set(i);
-		edgepoint.Set(i);
-	      }
-	  }
-
-	edgepoint.Or (cornerpoint);
-
-	(*testout) << "cornerpoints: " << endl << cornerpoint << endl
-		   << "edgepoints: " << endl << edgepoint << endl;
-      }
-
-
-
-
-    int cnt_undef = 0, cnt_nonimplement = 0;
-    ARRAY<int> misses(10000);
-    misses = 0;
-
-    for (ElementIndex i = 0; i < mesh.GetNE(); i++)
-      {
-	Element & el = mesh[i];
-      
-	HPREF_ELEMENT_TYPE type = HP_NONE;
-	int pnums[8] = { 0 };
-      
-      
-	switch (el.GetType())
-	  {
-	  case TET:
-	    {
-	      int ep1, ep2, ep3, ep4, cp1, cp2, cp3, cp4, fp1, fp2, fp3, fp4;
-	      int isedge1, isedge2, isedge3, isedge4, isedge5, isedge6;
-	      int isfedge1, isfedge2, isfedge3, isfedge4, isfedge5, isfedge6;
-	      int isface1, isface2, isface3, isface4;
-
-	      for (int j = 0; j < 4; j++)
-		for (int k = 0; k < 4; k++)
-		  {
-		    if (j == k) continue;
-		    if (type) break;
-	    
-		    int pi3 = 0;
-		    while (pi3 == j || pi3 == k) pi3++;
-		    int pi4 = 6 - j - k - pi3;
-
-		    // preserve orientation
-		    int sort[4];
-		    sort[0] = j; sort[1] = k; sort[2] = pi3; sort[3] = pi4;
-		    int cnt = 0;
-		    for (int jj = 0; jj < 4; jj++)
-		      for (int kk = 0; kk < 3; kk++)
-			if (sort[kk] > sort[kk+1])
-			  {
-			    cnt++;
-			    Swap (sort[kk], sort[kk+1]);
-			  }
-		    if (cnt % 2 == 1) Swap (pi3, pi4);
-
-		    ep1 = edgepoint.Test (el[j]);
-		    ep2 = edgepoint.Test (el[k]);
-		    ep3 = edgepoint.Test (el[pi3]);
-		    ep4 = edgepoint.Test (el[pi4]);
-
-		    cp1 = cornerpoint.Test (el[j]);
-		    cp2 = cornerpoint.Test (el[k]);
-		    cp3 = cornerpoint.Test (el[pi3]);
-		    cp4 = cornerpoint.Test (el[pi4]);
-	    
-		    isedge1 = edges.Used (INDEX_2::Sort (el[j], el[k]));
-		    isedge2 = edges.Used (INDEX_2::Sort (el[j], el[pi3]));
-		    isedge3 = edges.Used (INDEX_2::Sort (el[j], el[pi4]));
-		    isedge4 = edges.Used (INDEX_2::Sort (el[k], el[pi3]));
-		    isedge5 = edges.Used (INDEX_2::Sort (el[k], el[pi4]));
-		    isedge6 = edges.Used (INDEX_2::Sort (el[pi3], el[pi4]));
-
-		    isface1 = isface2 = isface3 = isface4 = 0;
-		    for (int l = 0; l < 4; l++)
-		      {
-			INDEX_3 i3;
-			switch (l)
-			  {
-			  case 0: i3 = INDEX_3 (el[k], el[pi3], el[pi4]); break;
-			  case 1: i3 = INDEX_3 (el[j], el[pi3], el[pi4]); break;
-			  case 2: i3 = INDEX_3 (el[j], el[k], el[pi4]); break;
-			  case 3: i3 = INDEX_3 (el[j], el[k], el[pi3]); break;
-			  }
-			i3.Sort();
-			if (faces.Used (i3))
-			  {
-			    int domnr = faces.Get(i3);
-			    if (domnr == -1 || domnr == el.GetIndex())
-			      {
-				switch (l)
-				  {
-				  case 0: isface1 = 1; break;
-				  case 1: isface2 = 1; break;
-				  case 2: isface3 = 1; break;
-				  case 3: isface4 = 1; break;
-				  }
-			      }
-			  }
-		      }
-		    /*
-		    isface1 = faces.Used (INDEX_3::Sort (el[k], el[pi3], el[pi4]));
-		    isface2 = faces.Used (INDEX_3::Sort (el[j], el[pi3], el[pi4]));
-		    isface3 = faces.Used (INDEX_3::Sort (el[j], el[k], el[pi4]));
-		    isface4 = faces.Used (INDEX_3::Sort (el[j], el[k], el[pi3]));
-		    */
-
-		    isfedge1 = isfedge2 = isfedge3 = isfedge4 = isfedge5 = isfedge6 = 0;
-		    for (int l = 0; l < 6; l++)
-		      {
-			INDEX_2 i2;
-			switch (l)
-			  {
-			  case 0: i2 = INDEX_2 (el[j], el[k]); break;
-			  case 1: i2 = INDEX_2 (el[j], el[pi3]); break;
-			  case 2: i2 = INDEX_2 (el[j], el[pi4]); break;
-			  case 3: i2 = INDEX_2 (el[k], el[pi3]); break;
-			  case 4: i2 = INDEX_2 (el[k], el[pi4]); break;
-			  case 5: i2 = INDEX_2 (el[pi3], el[pi4]); break;
-			  }
-			i2.Sort();
-			if (face_edges.Used (i2))
-			  {
-			    int domnr = face_edges.Get(i2);
-			    if (domnr == -1 || domnr == el.GetIndex())
-			      {
-				switch (l)
-				  {
-				  case 0: isfedge1 = 1; break;
-				  case 1: isfedge2 = 1; break;
-				  case 2: isfedge3 = 1; break;
-				  case 3: isfedge4 = 1; break;
-				  case 4: isfedge5 = 1; break;
-				  case 5: isfedge6 = 1; break;
-				  }
-			      }
-			  }
-		      }
-		    /*
-		    isfedge1 = face_edges.Used (INDEX_2::Sort (el[j], el[k]));
-		    isfedge2 = face_edges.Used (INDEX_2::Sort (el[j], el[pi3]));
-		    isfedge3 = face_edges.Used (INDEX_2::Sort (el[j], el[pi4]));
-		    isfedge4 = face_edges.Used (INDEX_2::Sort (el[k], el[pi3]));
-		    isfedge5 = face_edges.Used (INDEX_2::Sort (el[k], el[pi4]));
-		    isfedge6 = face_edges.Used (INDEX_2::Sort (el[pi3], el[pi4]));
-		    */
-
-		    fp1 = fp2 = fp3 = fp4 = 0;
-		    for (int l = 0; l < 4; l++)
-		      {
-			int pi;
-			switch (l)
-			  {
-			  case 0: pi = el[j]; break;
-			  case 1: pi = el[k]; break;
-			  case 2: pi = el[pi3]; break;
-			  case 3: pi = el[pi4]; break;
-			  }
-			int domnr = facepoint[pi];
-			if (domnr == -1 || domnr == el.GetIndex())
-			  {
-			    switch (l)
-			      {
-			      case 0: fp1 = 1; break;
-			      case 1: fp2 = 1; break;
-			      case 2: fp3 = 1; break;
-			      case 3: fp4 = 1; break;
-			      }
-			  }
-		      }
-
-		    /*
-		    fp1 = facepoint[el[j]] != 0;
-		    fp2 = facepoint[el[k]] != 0;
-		    fp3 = facepoint[el[pi3]] != 0;
-		    fp4 = facepoint[el[pi4]] != 0;
-		    */
-
-
-		    switch (isface1+isface2+isface3+isface4)
-		      {
-		      case 0:
-			{
-			  isedge1 |= isfedge1;
-			  isedge2 |= isfedge2;
-			  isedge3 |= isfedge3;
-			  isedge4 |= isfedge4;
-			  isedge5 |= isfedge5;
-			  isedge6 |= isfedge6;
-
-			  ep1 |= fp1;
-			  ep2 |= fp2;
-			  ep3 |= fp3;
-			  ep4 |= fp4;
-
-			  switch (isedge1+isedge2+isedge3+isedge4+isedge5+isedge6)
-			    {
-			    case 0:
-			      {		
-				if (!ep1 && !ep2 && !ep3 && !ep4)
-				  type = HP_TET;
-				
-				if (ep1 && !ep2 && !ep3 && !ep4)
-				  type = HP_TET_0E_1V;
-
-				if (ep1 && ep2 && !ep3 && !ep4)
-				  type = HP_TET_0E_2V;
-
-				if (ep1 && ep2 && ep3 && !ep4)
-				  type = HP_TET_0E_3V;
-
-				if (ep1 && ep2 && ep3 && ep4)
-				  type = HP_TET_0E_4V;
-
-				break;
-			      }
-		
-			    case 1:
-			      {
-				if (!isedge1) break;
-		  
-				if (!cp1 && !cp2 && !ep3 && !ep4)
-				  type = HP_TET_1E_0V;
-		    
-				if (cp1 && !cp2 && !ep3 && !ep4)
-				  type = HP_TET_1E_1VA;
-
-				if (!cp1 && !cp2 && !ep3 && ep4)
-				  type = HP_TET_1E_1VB;
-
-				if (cp1 && cp2 && !ep3 && !ep4)
-				  type = HP_TET_1E_2VA;
-
-				if (cp1 && !cp2 && ep3 && !ep4)
-				  type = HP_TET_1E_2VB;
-
-				if (cp1 && !cp2 && !ep3 && ep4)
-				  type = HP_TET_1E_2VC;
-
-				if (!cp1 && !cp2 && ep3 && ep4)
-				  type = HP_TET_1E_2VD;
-
-				if (cp1 && cp2 && ep3 && !ep4)
-				  type = HP_TET_1E_3VA;
-
-				if (cp1 && !cp2 && ep3 && ep4)
-				  type = HP_TET_1E_3VB;
-
-				if (cp1 && cp2 && ep3 && ep4)
-				  type = HP_TET_1E_4V;
-		  
-				break;
-			      }
-			    case 2:
-			      {
-				if (isedge1 && isedge2)
-				  {
-				    if (!cp2 && !cp3 && !ep4)
-				      type = HP_TET_2EA_0V;
-
-				    if (cp2 && !cp3 && !ep4)
-				      type = HP_TET_2EA_1VA;
-				    if (!cp2 && cp3 && !ep4)
-				      type = HP_TET_2EA_1VB;
-
-				    if (!cp2 && !cp3 && ep4)
-				      type = HP_TET_2EA_1VC;
-
-				    if (cp2 && cp3 && !ep4)
-				      type = HP_TET_2EA_2VA;
-				    if (cp2 && !cp3 && ep4)
-				      type = HP_TET_2EA_2VB;
-				    if (!cp2 && cp3 && ep4)
-				      type = HP_TET_2EA_2VC;
-
-				    if (cp2 && cp3 && ep4)
-				      type = HP_TET_2EA_3V;
-				  }
-				if (isedge1 && isedge6)
-				  {
-				    if (!cp1 && !cp2 && !cp3 && !cp4)
-				      type = HP_TET_2EB_0V;
-				    if (cp1 && !cp2 && !cp3 && !cp4)
-				      type = HP_TET_2EB_1V;
-				    if (cp1 && cp2 && !cp3 && !cp4)
-				      type = HP_TET_2EB_2VA;
-				    if (cp1 && !cp2 && cp3 && !cp4)
-				      type = HP_TET_2EB_2VB;
-				    if (cp1 && !cp2 && !cp3 && cp4)
-				      type = HP_TET_2EB_2VC;
-				    if (cp1 && cp2 && cp3 && !cp4)
-				      type = HP_TET_2EB_3V;
-				    if (cp1 && cp2 && cp3 && cp4)
-				      type = HP_TET_2EB_4V;
-				  }
-			      }
-			    case 3:
-			      {
-				if (isedge1 && isedge2 && isedge3)
-				  {
-				    if (!cp2 && !cp3 && !cp4)
-				      type = HP_TET_3EA_0V;
-				    if (cp2 && !cp3 && !cp4)
-				      type = HP_TET_3EA_1V;
-				    if (cp2 && cp3 && !cp4)
-				      type = HP_TET_3EA_2V;
-				    if (cp2 && cp3 && cp4)
-				      type = HP_TET_3EA_3V;
-				  }
-				if (isedge1 && isedge3 && isedge4)
-				  {
-				    if (!cp3 && !cp4)
-				      type = HP_TET_3EB_0V;
-				    if (cp3 && !cp4)
-				      type = HP_TET_3EB_1V;
-				    if (cp3 && cp4)
-				      type = HP_TET_3EB_2V;
-				  }
-				if (isedge1 && isedge2 && isedge5)
-				  {
-				    if (!cp3 && !cp4)
-				      type = HP_TET_3EC_0V;
-				    if (cp3 && !cp4)
-				      type = HP_TET_3EC_1V;
-				    if (cp3 && cp4)
-				      type = HP_TET_3EC_2V;
-				  }
-				break;
-			      }
-			    }
-			  break;
-			}
-
-
-
-		      case 1:  // one singular face
-			{
-			  if (!isface1) break;
-
-			  switch (isfedge1+isfedge2+isfedge3+isedge4+isedge5+isedge6)
-			    {
-			    case 0:
-			      {
-				if (!fp1 && !ep2 && !ep3 && !ep4)
-				  type = HP_TET_1F_0E_0V;
-				if (fp1 && !ep2 && !ep3 && !ep4)
-				  type = HP_TET_1F_0E_1VB;
-				if (!fp1 && ep2 && !ep3 & !ep4)
-				  type = HP_TET_1F_0E_1VA;
-				break;
-			      }
-			    case 1:
-			      {
-				if (isfedge1)
-				  {
-				    if (!ep1 && !ep3 && !ep4)
-				      type = HP_TET_1F_1EA_0V;
-				  }
-				if (isedge4) // V1-V3
-				  {
-				    if (!ep1 && !cp2 && !cp3 && !ep4)
-				      type = HP_TET_1F_1EB_0V;
-				  }
-				break;
-			      }
-			    }
-			  break;
-			}
-
-
-		      case 2:  // one singular face
-			{
-			  if (!isface1 || !isface2) break;
-
-			  switch (isfedge1+isedge2+isedge3+isedge4+isedge5)
-			    {
-			    case 0:
-			      {
-				if (!ep1 && !ep2 && !cp3 && !cp4)
-				  type = HP_TET_2F_0E_0V;
-				break;
-			      }
-			    }
-			  break;
-			}
-
-
-		      }
-
-		    if (type != HP_NONE)
-		      {
-			pnums[0] = el[j];
-			pnums[1] = el[k];
-			pnums[2] = el[pi3];
-			pnums[3] = el[pi4];
-			break;
-		      }
-		  }
-
-	      /*
-		if (type != HP_TET_2EB_2VA)
-		type = HP_NONE;
-	      */
-
-	      if (type == HP_NONE)
-		{
-		  cnt_undef++;
-		  (*testout) << "undefined element" << endl
-			     << "cp = " << cp1 << cp2 << cp3 << cp4 << endl
-			     << "ep = " << ep1 << ep2 << ep3 << ep4 << endl
-			     << "isedge = " << isedge1 << isedge2 << isedge3 
-			     << isedge4 << isedge5 << isedge6 << endl;
-		  cout << "undefined element !!! " << endl;
-		}
-
-	      break;
-	    }
-
-	  case PRISM:
-	    {
-	      int pi1, pi2, pi3, pi4, pi5, pi6;
-	      int ep1, ep2, ep3, ep4, ep5, ep6, cp1, cp2, cp3, cp4, cp5, cp6;
-
-	      int ishedge1, ishedge2, ishedge3, ishedge4, ishedge5, ishedge6;
-	      int isvedge1, isvedge2, isvedge3;
-	    
-	      for (int j = 1; j <= 3; j++)
-		{
-		  if (type) break;
-
-		  pi1 = j;
-		  pi2 = pi1%3 + 1;
-		  pi3 = pi2%3 + 1;
-		  pi4 = pi1+3;
-		  pi5 = pi2+3;
-		  pi6 = pi3+3;
-
-		  ep1 = edgepoint.Test (el.PNum (pi1));
-		  ep2 = edgepoint.Test (el.PNum (pi2));
-		  ep3 = edgepoint.Test (el.PNum (pi3));
-		  ep4 = edgepoint.Test (el.PNum (pi4));
-		  ep5 = edgepoint.Test (el.PNum (pi5));
-		  ep6 = edgepoint.Test (el.PNum (pi6));
-
-		  cp1 = cornerpoint.Test (el.PNum (pi1));
-		  cp2 = cornerpoint.Test (el.PNum (pi2));
-		  cp3 = cornerpoint.Test (el.PNum (pi3));
-		  cp4 = cornerpoint.Test (el.PNum (pi4));
-		  cp5 = cornerpoint.Test (el.PNum (pi5));
-		  cp6 = cornerpoint.Test (el.PNum (pi6));
-	    
-		  INDEX_2 i2 = INDEX_2::Sort(el.PNum (pi1), el.PNum (pi4));
-		  isvedge1 = edges.Used (i2) || ep1 || ep4;
-
-		  i2 = INDEX_2::Sort(el.PNum (pi2), el.PNum (pi5));
-		  isvedge2 = edges.Used (i2) || ep2 || ep5;
-
-		  i2 = INDEX_2::Sort(el.PNum (pi3), el.PNum (pi6));
-		  isvedge3 = edges.Used (i2) || ep3 || ep6;
-
-
-		  ishedge1 = edges.Used (INDEX_2::Sort(el.PNum (pi1), el.PNum (pi2)));
-		  ishedge2 = edges.Used (INDEX_2::Sort(el.PNum (pi2), el.PNum (pi3)));
-		  ishedge3 = edges.Used (INDEX_2::Sort(el.PNum (pi3), el.PNum (pi1)));
-
-
-
-		  switch (ishedge1 + ishedge2 + ishedge3)
-		    {
-		    case 0:
-		      {
-			if (!isvedge1 && !isvedge2 && !isvedge3)
-			  type = HP_PRISM;
-			else if (isvedge1 && !isvedge2 && !isvedge3)
-			  type = HP_PRISM_SINGEDGE;
-			else if (isvedge1 && isvedge2 && !isvedge3)
-			  type = HP_PRISM_SINGEDGE_V12;
-			break;
-		      }
-		    case 1:
-		      {
-			if (ishedge1)
-			  type = HP_PRISM_SINGEDGE_H1;
-			break;
-		      }
-		    case 2:
-		      {
-			if (ishedge1 && ishedge2)
-			  type = HP_PRISM_SINGEDGE_H12;
-			break;
-		      }
-		    }
-
-		  if (type != HP_NONE)
-		    {
-		      cout << "classified element, type = " << type << ", el = "  << el << endl;
-		      pnums[0] = el.PNum (pi1);
-		      pnums[1] = el.PNum (pi2);
-		      pnums[2] = el.PNum (pi3);
-		      pnums[3] = el.PNum (pi4);
-		      pnums[4] = el.PNum (pi5);
-		      pnums[5] = el.PNum (pi6);
-		      break;
-		    }
-		}
-	      break;
-	    }
-	  default:
-	    {
-	      cerr << "hp-refinement not defined for element" << endl;
-	    }
-	  }
-
-
-	if (type == HP_NONE)
-	  {
-	    cout << "element is HP_NONE: " << el << endl;
-	  }
-
-	if (!Get_HPRef_Struct (type)) 
-	  {
-	    (*testout) << "case " << type << " not implemented " << endl;
-	    cnt_nonimplement++;
-	    misses[type]++;
-	  }
-      
-	HPRefElement hpel;
-	hpel.type = type;
-	for (int j = 0; j < 8; j++)
-	  hpel.pnums[j] = pnums[j];
-	hpel.index = el.GetIndex();
-	hpel.level = 1;
-	hpel.coarse_elnr = i;
-
-	static const double points[4][3] = 
-	  { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }, { 0, 0, 0 } };
-	for (int j = 0; j < 4; j++)
-	  for (int k = 0; k < 4; k++)
-	    if (pnums[j] == el[k])
-	      {
-		hpel.param[j][0] = points[k][0];
-		hpel.param[j][1] = points[k][1];
-		hpel.param[j][2] = points[k][2];
-	      }
-
-	elements.Append (hpel);
-      }
-
-    cout << "undefined elements: " << cnt_undef << endl;
-    cout << "non-implemented: " << cnt_nonimplement << endl;
-
-    for (int i = 0; i < misses.Size(); i++)
-      if (misses[i])
-	cout << "missing case " << i << " occured " << misses[i] << " times" << endl;
-
-    for (int i = 1; i <= mesh.GetNSE(); i++)
-      {
-	int j, k, pi3, pi4;
-	Element2d & el = mesh.SurfaceElement(i);
-      
-	HPREF_ELEMENT_TYPE type = HP_NONE;
-	int pnums[8] = { 0 };
-
-	switch (el.GetType())
-	  {
-	  case TRIG:
-	    {
-	      for (j = 1; j <= 3; j++)
-		{
-		  int ep1 = edgepoint.Test (el.PNumMod (j));
-		  int ep2 = edgepoint.Test (el.PNumMod (j+1));
-		  int ep3 = edgepoint.Test (el.PNumMod (j+2));
-		
-		  if (mesh.GetDimension() == 2)
-		    {
-		      ep1 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j)));
-		      ep2 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j+1)));
-		      ep3 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j+2)));
-		    }
-
-		  int cp1 = cornerpoint.Test (el.PNumMod (j));
-		  int cp2 = cornerpoint.Test (el.PNumMod (j+1));
-		  int cp3 = cornerpoint.Test (el.PNumMod (j+2));
-
-		  ep1 |= cp1;
-		  ep2 |= cp2;
-		  ep3 |= cp3;
-		
-		  INDEX_2 i2;
-		  i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
-		  // i2.Sort();
-		  int isedge1 = edges.Used (i2);
-		  i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
-		  // i2.Sort();
-		  int isedge2 = edges.Used (i2);
-		  i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
-		  // i2.Sort();
-		  int isedge3 = edges.Used (i2);
-		
-		  if (isedge1 + isedge2 + isedge3 == 0)
-		    {
-		      if (!ep1 && !ep2 && !ep3)
-			type = HP_TRIG;
-		    
-		      if (ep1 && !ep2 && !ep3)
-			type = HP_TRIG_SINGCORNER;
-		    
-		      if (ep1 && ep2 && !ep3)
-			type = HP_TRIG_SINGCORNER12;
-		    
-		      if (ep1 && ep2 && ep3)
-			{
-			  if (mesh.GetDimension() == 2)
-			    type = HP_TRIG_SINGCORNER123_2D;
-			  else
-			    type = HP_TRIG_SINGCORNER123;
-			}
-		    
-		      if (type != HP_NONE)
-			{
-			  pnums[0] = el.PNumMod (j);
-			  pnums[1] = el.PNumMod (j+1);
-			  pnums[2] = el.PNumMod (j+2);
-			  break;
-			}
-		    }
-		
-		  if (isedge1 && !isedge2 && !isedge3)
-		    {
-		      int code = 0;
-		      if (cp1) code += 1;
-		      if (cp2) code += 2;
-		      if (ep3) code += 4;
-		    
-		      HPREF_ELEMENT_TYPE types[] =
-			{
-			  HP_TRIG_SINGEDGE, 
-			  HP_TRIG_SINGEDGECORNER1, 
-			  HP_TRIG_SINGEDGECORNER2,
-			  HP_TRIG_SINGEDGECORNER12, 
-			  HP_TRIG_SINGEDGECORNER3, 
-			  HP_TRIG_SINGEDGECORNER13, 
-			  HP_TRIG_SINGEDGECORNER23, 
-			  HP_TRIG_SINGEDGECORNER123, 
-			};
-		      type = types[code];
-		      pnums[0] = el.PNumMod (j);
-		      pnums[1] = el.PNumMod (j+1);
-		      pnums[2] = el.PNumMod (j+2);
-		      break;
-		    }
-		
-		
-		  if (isedge1 && !isedge2 && isedge3)
-		    {
-		      if (!cp3)
-			{
-			  if (!cp2) type = HP_TRIG_SINGEDGES;
-			  else      type = HP_TRIG_SINGEDGES2;
-			}
-		      else
-			{
-			  if (!cp2) type = HP_TRIG_SINGEDGES3;
-			  else      type = HP_TRIG_SINGEDGES23;
-			}
-		    
-		      pnums[0] = el.PNumMod (j);
-		      pnums[1] = el.PNumMod (j+1);
-		      pnums[2] = el.PNumMod (j+2);
-		      break;
-		    }
-		
-		  if (isedge1 && isedge2 && isedge3)
-		    {
-		      type = HP_TRIG_3SINGEDGES;
-		      pnums[0] = el.PNumMod (j);
-		      pnums[1] = el.PNumMod (j+1);
-		      pnums[2] = el.PNumMod (j+2);
-		      break;
-		    }
-		}
-	      break;
-	    }
-	  case QUAD:
-	    {
-	      int ep1, ep2, ep3, ep4, cp1, cp2, cp3, cp4;
-	      int isedge1, isedge2, isedge3, isedge4;
-
-	      for (j = 1; j <= 4; j++)
-		{
-		  ep1 = edgepoint.Test (el.PNumMod (j));
-		  ep2 = edgepoint.Test (el.PNumMod (j+1));
-		  ep3 = edgepoint.Test (el.PNumMod (j+2));
-		  ep4 = edgepoint.Test (el.PNumMod (j+3));
-
-		  if (mesh.GetDimension() == 2)
-		    {
-		      ep1 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j)));
-		      ep2 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j+1)));
-		      ep3 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j+2)));
-		      ep4 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j+3)));
-		    }
-
-		  cp1 = cornerpoint.Test (el.PNumMod (j));
-		  cp2 = cornerpoint.Test (el.PNumMod (j+1));
-		  cp3 = cornerpoint.Test (el.PNumMod (j+2));
-		  cp4 = cornerpoint.Test (el.PNumMod (j+3));
-
-		  ep1 |= cp1;
-		  ep2 |= cp2;
-		  ep3 |= cp3;
-		  ep4 |= cp4;
-		
-
-		  INDEX_2 i2;
-		  i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
-		  // i2.Sort();
-		  isedge1 = edges.Used (i2);
-		  i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
-		  // i2.Sort();
-		  isedge2 = edges.Used (i2);
-		  i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
-		  // i2.Sort();
-		  isedge3 = edges.Used (i2);
-		  i2 = INDEX_2(el.PNumMod (j+3), el.PNumMod (j+4));
-		  // i2.Sort();
-		  isedge4 = edges.Used (i2);
-		
-		  int sumcp = cp1 + cp2 + cp3 + cp4;
-		  int sumep = ep1 + ep2 + ep3 + ep4;
-		  int sumedge = isedge1 + isedge2 + isedge3 + isedge4;
-
-		  switch (sumedge)
-		    {
-		    case 0:
-		      {
-			switch (sumep)
-			  {
-			  case 0: 
-			    type = HP_QUAD; 
-			    break;
-			  case 1: 
-			    if (ep1) type = HP_QUAD_SINGCORNER;
-			    break; 
-			  case 2:
-			    {
-			      if (ep1 && ep2) type = HP_QUAD_0E_2VA;
-			      if (ep1 && ep3) type = HP_QUAD_0E_2VB;
-			      break;
-			    }
-			  case 3: 
-			    if (!ep4) type = HP_QUAD_0E_3V; 
-			    break; 
-			  case 4: 
-			    type = HP_QUAD_0E_4V; 
-			    break; 
-			  }
-			break;
-		      }
-		    case 1:
-		      {
-			if (isedge1)
-			  {
-			    switch (cp1+cp2+ep3+ep4)
-			      {
-			      case 0: 
-				type = HP_QUAD_SINGEDGE; 
-				break;
-			      case 1:
-				{
-				  if (cp1) type = HP_QUAD_1E_1VA;
-				  if (cp2) type = HP_QUAD_1E_1VB;
-				  if (ep3) type = HP_QUAD_1E_1VC;
-				  if (ep4) type = HP_QUAD_1E_1VD; 
-				  break; 
-				}
-			      case 2:
-				{
-				  if (cp1 && cp2) type = HP_QUAD_1E_2VA; 
-				  if (cp1 && ep3) type = HP_QUAD_1E_2VB; 
-				  if (cp1 && ep4) type = HP_QUAD_1E_2VC; 
-				  if (cp2 && ep3) type = HP_QUAD_1E_2VD; 
-				  if (cp2 && ep4) type = HP_QUAD_1E_2VE; 
-				  if (ep3 && ep4) type = HP_QUAD_1E_2VF; 
-				  break; 
-				}
-			      case 3:
-				{
-				  if (cp1 && cp2 && ep3) type = HP_QUAD_1E_3VA;
-				  if (cp1 && cp2 && ep4) type = HP_QUAD_1E_3VB;
-				  if (cp1 && ep3 && ep4) type = HP_QUAD_1E_3VC;
-				  if (cp2 && ep3 && ep4) type = HP_QUAD_1E_3VD;
-				  break;
-				}
-			      case 4:
-				{
-				  type = HP_QUAD_1E_4V; 
-				  break;
-				}
-			      }
-			  }
-			break;
-		      }
-		    case 2:
-		      {
-			if (isedge1 && isedge4)
-			  {
-			    if (!cp2 && !ep3 && !cp4)
-			      type = HP_QUAD_2E;
-			  
-			    if (cp2 && !ep3 && !cp4)
-			      type = HP_QUAD_2E_1VA;
-			    if (!cp2 && ep3 && !cp4)
-			      type = HP_QUAD_2E_1VB;
-			    if (!cp2 && !ep3 && cp4)
-			      type = HP_QUAD_2E_1VC;
-
-			    if (cp2 && ep3 && !cp4)
-			      type = HP_QUAD_2E_2VA;
-			    if (cp2 && !ep3 && cp4)
-			      type = HP_QUAD_2E_2VB;
-			    if (!cp2 && ep3 && cp4)
-			      type = HP_QUAD_2E_2VC;
-
-			    if (cp2 && ep3 && cp4)
-			      type = HP_QUAD_2E_3V;
-			  }
-			if (isedge1 && isedge3)
-			  {
-			    switch (sumcp)
-			      {
-			      case 0: 
-				type = HP_QUAD_2EB_0V; break;
-			      case 1:
-				{
-				  if (cp1) type = HP_QUAD_2EB_1VA; 
-				  if (cp2) type = HP_QUAD_2EB_1VB; 
-				  break;
-				}
-			      case 2:
-				{
-				  if (cp1 && cp2) { type = HP_QUAD_2EB_2VA; }
-				  if (cp1 && cp3) { type = HP_QUAD_2EB_2VB; }
-				  if (cp1 && cp4) { type = HP_QUAD_2EB_2VC; }
-				  if (cp2 && cp4) { type = HP_QUAD_2EB_2VD; }
-				  break;
-				}
-			      case 3:
-				{
-				  if (cp1 && cp2 && cp3) { type = HP_QUAD_2EB_3VA; }
-				  if (cp1 && cp2 && cp4) { type = HP_QUAD_2EB_3VB; }
-				  break;
-				}
-			      case 4:
-				{
-				  type = HP_QUAD_2EB_4V; break;
-				}
-			      }
-			  }
-			break;
-		      }
-
-		    case 3:
-		      {
-			if (isedge1 && isedge2 && isedge4)
-			  {
-			    if (!cp3 && !cp4) type = HP_QUAD_3E;
-			    if (cp3 && !cp4) type = HP_QUAD_3E_3VA;
-			    if (!cp3 && cp4) type = HP_QUAD_3E_3VB;
-			    if (cp3 && cp4) type = HP_QUAD_3E_4V;
-			  }
-			break;
-		      }
-
-		    case 4:
-		      {
-			type = HP_QUAD_4E;
-			break;
-		      }
-		    }
-
-		  if (type != HP_NONE)
-		    {
-		      pnums[0] = el.PNumMod (j);
-		      pnums[1] = el.PNumMod (j+1);
-		      pnums[2] = el.PNumMod (j+2);
-		      pnums[3] = el.PNumMod (j+3);
-		      break;
-		    }
-		}
-	      if (type == HP_NONE)
-		{
-		  (*testout) << "undefined element" << endl
-			     << "cp = " << cp1 << cp2 << cp3 << cp4 << endl
-			     << "ep = " << ep1 << ep2 << ep3 << ep4 << endl
-			     << "isedge = " << isedge1 << isedge2 << isedge3 
-			     << isedge4 << endl;
-		}
-	      break;
-	    }
-	  }
-
-	if (type == HP_NONE)
-	  {
-	    cerr << "undefined QUAD type" << endl;
-	    for (j = 0; j < 4; j++)
-	      pnums[j] = el[j];
-	  }
-
-	HPRefElement hpel;
-	hpel.type = type;
-	for (j = 0; j < 8; j++)
-	  hpel.pnums[j] = pnums[j];
-	hpel.index = el.GetIndex();
-	hpel.level = 1;
-	hpel.coarse_elnr = i-1;
-
-
-	static const double points[3][2] = 
-	  { { 1, 0 }, { 0, 1 }, { 0, 0 } };
-	for (j = 0; j < 3; j++)
-	  for (k = 0; k < 3; k++)
-	    if (pnums[j] == el[k])
-	      {
-		hpel.param[j][0] = points[k][0];
-		hpel.param[j][1] = points[k][1];
-	      }
-	elements.Append (hpel);
-      }
-  
-  
-  
-
-  
-
-    for (int i = 1; i <= mesh.GetNSeg(); i++)
-      {
-	Segment & seg = mesh.LineSegment(i);
-      
-	HPREF_ELEMENT_TYPE type = HP_NONE;
-
-	int cp1 = cornerpoint.Test (seg.p1);
-	int cp2 = cornerpoint.Test (seg.p2);
-
-	INDEX_2 i2;
-	i2 = INDEX_2(seg.p1, seg.p2);
-	i2.Sort();
-	if (!edges.Used (i2))
-	  {
-	    cp1 = edgepoint.Test (seg.p1);
-	    cp2 = edgepoint.Test (seg.p2);
-	  }
-
-	HPRefElement hpel;
-	hpel.index = seg.edgenr + 10000 * seg.si;
-	hpel.level = 1;
-      
-	hpel.pnums[0] = seg.p1;
-	hpel.pnums[1] = seg.p2;
-	hpel.param[0][0] = seg.epgeominfo[0].dist;
-	hpel.param[1][0] = seg.epgeominfo[1].dist;
-      
-	if (!cp1 && !cp2)
-	  hpel.type = HP_SEGM;
-	else if (cp1 && !cp2)
-	  hpel.type = HP_SEGM_SINGCORNERL;
-	else if (!cp1 && cp2)
-	  hpel.type = HP_SEGM_SINGCORNERR;
-	else
-	  hpel.type = HP_SEGM_SINGCORNERS;
-
-	(*testout) << "refine segment " << seg << ", hptype= " << hpel.type << endl;
-
-	elements.Append (hpel);
-
-	(*testout) << "add seg: " << endl << seg << endl;
-	(*testout) << "param = " << elements.Last().param[0][0] << ", " << elements.Last().param[1][0] << endl;
-      }
-  }
-
-  
-
-  /* *******************************  DoRefinement *************************************** */
-
-  // parameter "fine": false ... divide elements by a factor of 3/4 to 1/4
-  //                   true  ... divide by 7/8 to 1/8
-
-  void DoRefinement (Mesh & mesh, ARRAY<HPRefElement> & elements,
-		     Refinement * ref, bool fine) 
-  {
-    INDEX_2_HASHTABLE<int> newpts(elements.Size()+1);
-    INDEX_3_HASHTABLE<int> newfacepts(elements.Size()+1);
-  
-    // prepare new points
-  
-    int oldelsize = elements.Size();
-    for (int i = 0; i < oldelsize; i++)
-      {
-	HPRefElement & el = elements[i];
-	HPRef_Struct * hprs = Get_HPRef_Struct (el.type);
-
-	if (!hprs)
-	  {
-	    cout << "Refinementstruct not defined for element " << el.type << endl;
-	    continue;
-	  }
-
-	int j = 0;
-	while (hprs->splitedges[j][0])
-	  {
-	    INDEX_2 i2(el.pnums[hprs->splitedges[j][0]-1],
-		       el.pnums[hprs->splitedges[j][1]-1]);
-	    if (!newpts.Used (i2))
-	      {
-		Point3d np = Center (mesh.Point (i2.I1()),
-				     mesh.Point (i2.I2()));
-		np = Center (mesh.Point (i2.I1()),np);
-		if ( fine ) np = Center (mesh.Point (i2.I1()),np);
-
-		int npi = mesh.AddPoint (np);
-		newpts.Set (i2, npi);
-	      }
-	    j++;
-	  }
-
-
-	j = 0;
-	if (hprs->splitfaces)
-	  while (hprs->splitfaces[j][0])
-	    {
-	      INDEX_3 i3(el.pnums[hprs->splitfaces[j][0]-1],
-			 el.pnums[hprs->splitfaces[j][1]-1],
-			 el.pnums[hprs->splitfaces[j][2]-1]);
-
-	      if (i3.I2() > i3.I3()) Swap (i3.I2(), i3.I3());
-
-	      if (!newfacepts.Used (i3))
-		{
-		  Point3d np = Center (mesh.Point (i3.I2()),
-				       mesh.Point (i3.I3()));
-		  np = Center (mesh.Point (i3.I1()),np);
-		  if ( fine ) np = Center (mesh.Point (i3.I1()),np);
-		  int npi = mesh.AddPoint (np);
-		  newfacepts.Set (i3, npi);
-		}
-	      j++;
-	    }
-      }
-  
-    for (int i = 0; i < oldelsize; i++)
-      {
-	HPRefElement & el = elements[i];
-	HPRef_Struct * hprs = Get_HPRef_Struct (el.type);
-	int newlevel = el.level + 1;
-
-	if (el.type == HP_SEGM ||
-	    el.type == HP_TRIG ||
-	    el.type == HP_QUAD ||
-	    el.type == HP_TET ||
-	    el.type == HP_PRISM ||
-	    el.type == HP_HEX)
-	  newlevel = el.level;
-
-	if (!hprs) continue;
-
-	int newpnums[64];
-	double newparam[64][3];
-
-	int j;
-	for (j = 0; j < 8; j++)
-	  {
-	    newpnums[j] = el.pnums[j];
-	    for (int l = 0; l < 3; l++)
-	      newparam[j][l] = el.param[j][l];
-	  }
-
-
-	// split edges, incl. transferring curvature
-	j = 0;
-	while (hprs->splitedges[j][0])
-	  {
-	    INDEX_2 i2(el.pnums[hprs->splitedges[j][0]-1],
-		       el.pnums[hprs->splitedges[j][1]-1]);
-
-	    int npi = newpts.Get(i2);
-	    newpnums[hprs->splitedges[j][2]-1] = npi;
-
-	    double fac1, fac2;
-	    if ( fine ) { fac1 = 0.875; fac2 = 0.125; }
-	    else { fac1 = 0.75; fac2 = 0.25; }
-
-	    for (int l = 0; l < 3; l++)
-	      newparam[hprs->splitedges[j][2]-1][l] =
-		fac1 * el.param[hprs->splitedges[j][0]-1][l] + 
-		fac2 * el.param[hprs->splitedges[j][1]-1][l];
-	      
-	    j++;
-	  }
-
-	// split faces
-	j = 0;
-	if (hprs->splitfaces)
-	  while (hprs->splitfaces[j][0])
-	    {
-	      INDEX_3 i3(el.pnums[hprs->splitfaces[j][0]-1],
-			 el.pnums[hprs->splitfaces[j][1]-1],
-			 el.pnums[hprs->splitfaces[j][2]-1]);
-	      if (i3.I2() > i3.I3())
-		Swap (i3.I2(), i3.I3());
-	      int npi = newfacepts.Get(i3);
-	      newpnums[hprs->splitfaces[j][3]-1] = npi;
-
-	      double fac1, fac2;
-	      if ( fine ) { fac1 = 0.75; fac2 = 0.125; }
-	      else { fac1 = 0.5; fac2 = 0.25; }
-
-	      for (int l = 0; l < 3; l++)
-		newparam[hprs->splitfaces[j][3]-1][l] =
-		  fac1 * el.param[hprs->splitfaces[j][0]-1][l] + 
-		  fac2 * el.param[hprs->splitfaces[j][1]-1][l] + 
-		  fac2 * el.param[hprs->splitfaces[j][2]-1][l];
-	      j++;
-	    }
-
-	// split elements
-	j = 0;
-	if (hprs->splitelements)
-	  while (hprs->splitelements[j][0])
-	    {
-	      int pi1 = el.pnums[hprs->splitelements[j][0]-1];
-	      Point3d np = 
-		Center (Center (mesh.Point (pi1),
-				mesh.Point (el.pnums[hprs->splitelements[j][1]-1])),
-			Center (mesh.Point (el.pnums[hprs->splitelements[j][2]-1]),
-				mesh.Point (el.pnums[hprs->splitelements[j][3]-1])));
-	      // divide once more, if fine subdivision is wanted
-	      if ( fine ) np = Center (mesh.Point (pi1),np);
-	      int npi = mesh.AddPoint (np);
-	      newpnums[hprs->splitelements[j][4]-1] = npi;
-
-	      double fac1, fac2;
-	      if ( fine ) { fac1 = 0.625; fac2 = 0.125; }
-	      else { fac1 = 0.25; fac2 = 0.25; }
-
-	      for (int l = 0; l < 3; l++)
-		newparam[hprs->splitelements[j][4]-1][l] =
-		  fac1 * el.param[hprs->splitelements[j][0]-1][l] + 
-		  fac2 * el.param[hprs->splitelements[j][1]-1][l] + 
-		  fac2 * el.param[hprs->splitelements[j][2]-1][l] + 
-		  fac2 * el.param[hprs->splitelements[j][3]-1][l];
-
-	      j++;
-	    }
-
-	j = 0;
-	while (hprs->neweltypes[j])
-	  {
-	    HPRefElement newel;
-	    newel.type = hprs->neweltypes[j];
-	    for (int k = 0; k < 8; k++)
-	      newel.pnums[k] = newpnums[hprs->newels[j][k]-1];
-
-	    newel.index = elements[i].index;
-	    newel.coarse_elnr = elements[i].coarse_elnr;
-	    newel.level = newlevel;
-
-	    for (int k = 0; k < 8; k++)  
-	      for (int l = 0; l < 3; l++)
-		newel.param[k][l] = newparam[hprs->newels[j][k]-1][l];
-
-	    if (j == 0) 
-	      elements[i] = newel;
-	    else        
-	      elements.Append (newel);
-
-	    j++;
-	  }
-      }
-  }
-
-
-
-
-
-
-  /* ************************** DoRefineDummies ******************************** */
-
-  void DoRefineDummies (Mesh & mesh, ARRAY<HPRefElement> & elements,
-			Refinement * ref)
-  {
-    int oldelsize = elements.Size();
-
-    for (int i = 0; i < oldelsize; i++)
-      {
-	HPRefElement & el = elements[i];
-	HPRef_Struct * hprs = Get_HPRef_Struct (el.type);
-	if (!hprs) continue;
-
-	if (el.type != HP_DUMMY_QUAD_SINGCORNER &&
-	    el.type != HP_PYRAMID_EDGES &&
-	    el.type != HP_PYRAMID_0E_1V &&
-	    el.type != HP_HEX_0E_1V &&
-	    el.type != HP_HEX_1E_1V &&
-	    el.type != HP_HEX_1E_0V &&
-	    el.type != HP_HEX_3E_0V
-	    ) continue;
-
-	int newlevel = el.level;
-
-	int newpnums[8];
-	int j;
-	for (j = 0; j < 8; j++)
-	  newpnums[j] = el.pnums[j];
-
-	double newparam[8][3];
-	for (j = 0; j < 8; j++)
-	  for (int k = 0; k < 3; k++)
-	    newparam[j][k] = el.param[j][k];
-
-	j = 0;
-	while (hprs->neweltypes[j])
-	  {
-	    HPRefElement newel;
-	    newel.type = hprs->neweltypes[j];
-	    for (int k = 0; k < 8; k++)
-	      newel.pnums[k] = newpnums[hprs->newels[j][k]-1];
-	    newel.index = el.index;
-	    newel.coarse_elnr = el.coarse_elnr;
-	    newel.level = newlevel;
-
-	    for (int k = 0; k < 8; k++)
-	      for (int l = 0; l < 3; l++)
-		newel.param[k][l] = newparam[hprs->newels[j][k]-1][l];
-		
-	    if (j == 0)
-	      elements[i] = newel;
-	    else
-	      elements.Append (newel);
-	    j++;
-	  }
-      }
-  }
-
-
-
-
-
-
-
-  void SubdivideDegeneratedHexes (Mesh & mesh, ARRAY<HPRefElement> & elements)
-  {
-    int oldne = elements.Size();
-    for (int i = 0; i < oldne; i++)
-      if (Get_HPRef_Struct (elements[i].type)->geom == HP_HEX)
-	{
-	  bool common = 0;
-	  for (int j = 0; j < 8; j++)
-	    for (int k = 0; k < j; k++)
-	      if (elements[i].pnums[j] == elements[i].pnums[k])
-		common = 1;
-	  if (common)
-	    {
-	      HPRefElement el = elements[i];
-
-	      Point<3> center(0,0,0);
-	      double newparam[3] = { 0, 0, 0 };
-
-	      for (int j = 0; j < 8; j++)
-		{
-		  center += 0.125 * Vec<3> (mesh[el.pnums[j]]);
-		  for (int l = 0; l < 3; l++)
-		    newparam[l] += 0.125 * el.param[j][l];
-		}
-
-	      int npi = mesh.AddPoint (center);
-
-	      const ELEMENT_FACE * faces = MeshTopology::GetFaces (HEX);
-
-	      for (int j = 0; j < 6; j++)
-		{
-		  ARRAY<int> pts;
-		  for (int k = 0; k < 4; k++)
-		    {
-		      bool same = 0;
-		      for (int l = 0; l < pts.Size(); l++)
-			if (el.pnums[pts[l]] == el.pnums[faces[j][k]-1])
-			  same = 1;
-		      if (!same)
-			pts.Append (faces[j][k]-1);
-
-		    }
-		  
-		  HPRefElement newel = el;
-		  if (pts.Size() == 3)
-		    {
-		      for (int k = 0; k < 3; k++)
-			{
-			  newel.pnums[k] = el.pnums[pts[2-k]];
-			  for (int l = 0; l < 3; l++)
-			    newel.param[k][l] = el.param[pts[2-k]][l];
-			}
-		      newel.pnums[3] = npi;
-		      for (int l = 0; l < 3; l++)
-			newel.param[3][l] = newparam[l];
-
-		      newel.type = HP_TET;
-		    }
-		  else
-		    {
-		      for (int k = 0; k < 4; k++)
-			{
-			  newel.pnums[k] = el.pnums[pts[3-k]];
-			  for (int l = 0; l < 3; l++)
-			    newel.param[k][l] = el.param[pts[3-k]][l];
-			}
-
-		      newel.pnums[4] = npi;
-		      for (int l = 0; l < 3; l++)
-			newel.param[4][l] = newparam[l];
-
-		      newel.type = HP_PYRAMID;
-		    }
-		  
-		  if (j == 0)
-		    elements[i] = newel;
-		  else
-		    elements.Append (newel);
-		}
-	    }
-	}
-  }
-
-
-  void CalcStatistics (ARRAY<HPRefElement> & elements)
-  {
-    return;
-    
-    int i, p;
-    int nsegm = 0, ntrig = 0, nquad = 0;
-    int nhex = 0, nprism = 0, npyramid = 0, ntet = 0;
-    int maxlevel = 0;
-
-    for (i = 1; i <= elements.Size(); i++)
-      {
-	const HPRefElement & el = elements.Get(i);
-	maxlevel = max2 (el.level, maxlevel);
-	switch (Get_HPRef_Struct (el.type)->geom)
-	  {
-	  case HP_SEGM:
-
-	    {
-	      nsegm++;
-	      break;
-	    }
-	  case HP_TRIG:
-	    {
-	      ntrig ++;
-	      break;
-	    }
-	  case HP_QUAD:
-	    {
-	      nquad++;
-	      break;
-	    }
-	  case HP_TET:
-	    {
-	      ntet++;
-	      break;
-	    }
-
-	  case HP_PRISM:
-	    {
-	      nprism++;
-	      break;
-	    }
-
-	  case HP_PYRAMID:
-	    {
-	      npyramid++;
-	      break;
-	    }
-
-	  case HP_HEX:
-	    {	
-	      nhex++;
-	      break;
-	    }
-
-	  default:
-	    {
-	      cerr << "statistics error, unknown element type" << endl;
-	    }
-	  }
-      }
-
-    cout << "level = " << maxlevel << endl;
-    cout << "nsegm = " << nsegm << endl;
-    cout << "ntrig = " << ntrig << ", nquad = " << nquad << endl;
-    cout << "ntet = " << ntet << ", npyr = " << npyramid
-	 << ", nprism = " << nprism << ", nhex = " << nhex << endl;
-
-    return;
-
-    double memcost = 0, cpucost = 0;
-    for (p = 1; p <= 20; p++)
-      {
-	memcost = (ntet + nprism + nhex) * pow (static_cast<double>(p), 6.0);
-	cpucost = (ntet + nprism + nhex) * pow (static_cast<double>(p), 9.0);
-	cout << "costs for p = " << p << ": mem = " << memcost << ", cpu = " << cpucost << endl;
-      }
-
-    double memcosttet = 0;
-    double memcostprism = 0;
-    double memcosthex = 0;
-    double memcostsctet = 0;
-    double memcostscprism = 0;
-    double memcostschex = 0;
-    double cpucosttet = 0;
-    double cpucostprism = 0;
-    double cpucosthex = 0;
-
-    for (i = 1; i <= elements.Size(); i++)
-      {
-	const HPRefElement & el = elements.Get(i);
-	switch (el.type)
-	  {
-	  case HP_TET:
-	  case HP_TET_0E_1V:
-	  case HP_TET_1E_0V:
-	  case HP_TET_1E_1VA:
-	    {
-	      int p1 = maxlevel - el.level + 1;
-	      (*testout) << "p1 = " << p1 << ", P1^6 = " << pow (static_cast<double>(p1), 6.0)
-			 << " (p1-3)^6 = " << pow ( static_cast<double>(max2(p1-3, 0)), 6.0) 
-			 << " p1^3 = " << pow ( static_cast<double>(p1), 3.0) 
-			 << " (p1-3)^3 = " << pow ( static_cast<double>(p1-3), 3.0) 
-			 << " [p1^3-(p1-3)^3]^2 = " << sqr (pow (static_cast<double>(p1),3.0) - pow ( static_cast<double>(p1-3), 3.0))
-			 << endl;
-
-	      p1 /= 2 +1;
-	      memcosttet += pow (static_cast<double>(p1), 6.0);
-	      memcostsctet += pow (static_cast<double>(p1), 6.0) - pow ( static_cast<double>(max2(p1-3, 1)), 6.0);
-	      cpucosttet += pow (static_cast<double>(p1), 9.0);
-	      break;
-	    }
-	  case HP_PRISM:
-	  case HP_PRISM_SINGEDGE:
-	    {
-	      int p1 = maxlevel - el.level + 1;
-	      p1 /= 2 +1;
-	      memcostprism += pow (static_cast<double>(p1), 6.0);
-	      memcostscprism += pow (static_cast<double>(p1), 6.0) - pow ( static_cast<double>(max2(p1-3, 1)), 6.0);
-	      cpucostprism += pow (static_cast<double>(p1), 9.0);
-	      break;
-	    }
-	  case HP_HEX:
-	    {	
-	      int p1 = maxlevel - el.level + 1;
-	      int p2 = maxlevel;
-	      p1 /= 2 +1;
-	      p2 /= 2 +1;
-	      memcosthex += pow (static_cast<double>(p1), 4.0) * pow (static_cast<double>(p2), 2.0);
-	      memcostschex += pow (static_cast<double>(p1), 6.0) - pow ( static_cast<double>(max2(p1-2, 0)), 6.0);
-	      cpucosthex += pow (static_cast<double>(p1), 6.0) * pow (static_cast<double>(p2), 3.0);
-	      break;
-	    }
-	  default:
-	    ;
-	  }
-      }
-    cout << "TET: hp-memcost = " << memcosttet 
-	 << ", scmemcost = " << memcostsctet
-	 << ", cpucost = " << cpucosttet
-	 << endl;
-    cout << "PRI: hp-memcost = " << memcostprism
-	 << ", scmemcost = " << memcostscprism
-	 << ", cpucost = " << cpucostprism << endl;
-    cout << "HEX: hp-memcost = " << memcosthex
-	 << ", scmemcost = " << memcostschex
-	 << ", cpucost = " << cpucosthex << endl;
-  }
-
-
-
-
-
-
-
-  /* ***************************** HPRefinement ********************************** */
-
-  void HPRefinement (Mesh & mesh, Refinement * ref, int levels)
-  {
-    PrintMessage (1, "HP Refinement called, levels = ", levels);
-
-    // ARRAY<HPRefElement> hpelements;
-
-    delete mesh.hpelements;
-    mesh.hpelements = new ARRAY<HPRefElement>;
-
-    mesh.coarsemesh = new Mesh;
-    *mesh.coarsemesh = mesh;
-
-    ARRAY<HPRefElement> & hpelements = *mesh.hpelements;
-
-
-
-    PrepareElements (mesh, hpelements);
-
-    for (int j = 1; j <= levels; j++)
-      {
-	cout << "hp-refine level " << j << flush;
-	// last parameter: true for fine subdivision (7/8 : 1/8), false for 3/4 : 1/4
-	// Please check into CVS only with this parameter set to "true"!
-	DoRefinement (mesh, hpelements, ref, true); // FB 
-	DoRefineDummies (mesh, hpelements, ref);
-	CalcStatistics (hpelements);
-	cout << " done" << endl;
-      }
-
-    SubdivideDegeneratedHexes (mesh, hpelements);
-
-    mesh.ClearSegments();
-    mesh.ClearSurfaceElements();
-    mesh.ClearVolumeElements();
-
-    for (int i = 0; i < hpelements.Size(); i++)
-      {
-	HPRefElement & hpel = hpelements[i];
-	if (Get_HPRef_Struct (hpel.type))
-	  switch (Get_HPRef_Struct (hpel.type) -> geom)
-	    {
-	    case HP_SEGM:
-	      {
-		Segment seg;
-		seg.p1 = hpel.pnums[0];
-		seg.p2 = hpel.pnums[1];
-		// NOTE: only for less than 10000 elements (HACK) !!!
-		seg.edgenr = hpel.index % 10000;
-		seg.si     = hpel.index / 10000;
-		seg.epgeominfo[0].dist = hpel.param[0][0]; 
-		seg.epgeominfo[1].dist = hpel.param[1][0];
-		seg.epgeominfo[0].edgenr = seg.edgenr;
-		seg.epgeominfo[1].edgenr = seg.edgenr;
-		seg.hp_elnr = i;
-		mesh.AddSegment (seg);
-		break;
-	      }
-	    
-
-	    case HP_TRIG:
-	      {
-		Element2d el(3);
-		el.PNum(1) = hpel.pnums[0];
-		el.PNum(2) = hpel.pnums[1];
-		el.PNum(3) = hpel.pnums[2];
-		el.SetIndex (hpel.index);
-		el.hp_elnr = i;
-		mesh.AddSurfaceElement (el);
-		break;
-	      }
-	    case HP_QUAD:
-	      {
-		Element2d el(4);
-		el.PNum(1) = hpel.pnums[0];
-		el.PNum(2) = hpel.pnums[1];
-		el.PNum(3) = hpel.pnums[2];
-		el.PNum(4) = hpel.pnums[3];
-		el.SetIndex (hpel.index);
-		el.hp_elnr = i;
-		mesh.AddSurfaceElement (el);
-		break;
-	      }
-	    case HP_TET:
-	      {
-		Element el(4);
-		el.PNum(1) = hpel.pnums[0];
-		el.PNum(2) = hpel.pnums[1];
-		el.PNum(3) = hpel.pnums[2];
-		el.PNum(4) = hpel.pnums[3];
-		el.SetIndex (hpel.index);
-		el.hp_elnr = i;
-		mesh.AddVolumeElement (el);
-		break;
-	      }
-	    case HP_PRISM:
-	      {
-		Element el(6);
-		el.PNum(1) = hpel.pnums[0];
-		el.PNum(2) = hpel.pnums[1];
-		el.PNum(3) = hpel.pnums[2];
-		el.PNum(4) = hpel.pnums[3];
-		el.PNum(5) = hpel.pnums[4];
-		el.PNum(6) = hpel.pnums[5];
-		el.SetIndex (hpel.index);
-		el.hp_elnr = i;
-		mesh.AddVolumeElement (el);
-		break;
-	      }
-	    
-	    case HP_PYRAMID:
-	      {
-		Element el(5);
-		el.PNum(1) = hpel.pnums[0];
-		el.PNum(2) = hpel.pnums[1];
-		el.PNum(3) = hpel.pnums[2];
-		el.PNum(4) = hpel.pnums[3];
-		el.PNum(5) = hpel.pnums[4];
-		el.SetIndex (hpel.index);
-		el.hp_elnr = i;
-		mesh.AddVolumeElement (el);
-		break;
-	      }
-	    case HP_HEX:
-	      {
-		Element el(8);
-		el.PNum(1) = hpel.pnums[0];
-		el.PNum(2) = hpel.pnums[1];
-		el.PNum(3) = hpel.pnums[2];
-		el.PNum(4) = hpel.pnums[3];
-		el.PNum(5) = hpel.pnums[4];
-		el.PNum(6) = hpel.pnums[5];
-		el.PNum(7) = hpel.pnums[6];
-		el.PNum(8) = hpel.pnums[7];
-		el.SetIndex (hpel.index);
-		el.hp_elnr = i;
-		mesh.AddVolumeElement (el);
-		break;
-	      }
-	    
-	    default:
-	      PrintSysError ("hpref, backconversion failed for element ", 
-			     int(Get_HPRef_Struct (hpel.type) -> geom));
-	    }
-      }
-  
-    mesh.UpdateTopology();
-  }
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/hprefinement.hpp b/contrib/Netgen/libsrc/meshing/hprefinement.hpp
deleted file mode 100644
index df1cc01e8e639d2e85756ae90095d5e15fd66b3e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hprefinement.hpp
+++ /dev/null
@@ -1,227 +0,0 @@
-#ifndef FILE_HPREFINEMENT
-#define FILE_HPREFINEMENT
-
-/**************************************************************************/
-/* File:   hprefinement.hh                                                */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   27. Oct. 2000                                                  */
-/**************************************************************************/
-
-/*
-  HP Refinement
-*/
-
-
-
-
-enum HPREF_ELEMENT_TYPE {
-  HP_NONE=0,
-
-  HP_SEGM = 1,
-  HP_SEGM_SINGCORNERL,
-  HP_SEGM_SINGCORNERR,
-  HP_SEGM_SINGCORNERS,
-
-  HP_TRIG = 10,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGCORNER12,
-  HP_TRIG_SINGCORNER123,
-  HP_TRIG_SINGCORNER123_2D,   // not rotational symmetric
-  HP_TRIG_SINGEDGE = 20,
-  HP_TRIG_SINGEDGECORNER1,   // E = 100, V = 100
-  HP_TRIG_SINGEDGECORNER2,   // E = 100, V = 010
-  HP_TRIG_SINGEDGECORNER12,  // E = 100, V = 110
-  HP_TRIG_SINGEDGECORNER3,
-  HP_TRIG_SINGEDGECORNER13,
-  HP_TRIG_SINGEDGECORNER23,
-  HP_TRIG_SINGEDGECORNER123,
-  HP_TRIG_SINGEDGES = 30,
-  HP_TRIG_SINGEDGES2,
-  HP_TRIG_SINGEDGES3,
-  HP_TRIG_SINGEDGES23,
-  HP_TRIG_3SINGEDGES = 40,
-
-  HP_QUAD = 50,
-  HP_QUAD_SINGCORNER,
-  HP_DUMMY_QUAD_SINGCORNER,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_0E_2VA,  // V = 1100
-  HP_QUAD_0E_2VB,  // V = 1010
-  HP_QUAD_0E_3V,
-  HP_QUAD_0E_4V,
-
-  // one edge: marked edge is always edge from vertex 1 to vertex 2 (E = 1000)
-  HP_QUAD_1E_1VA,  // vertex on beginning of edge: V = 1000
-  HP_QUAD_1E_1VB,  // vertex on end of edge: V = 0100
-  HP_QUAD_1E_1VC,  // V = 0010
-  HP_QUAD_1E_1VD,  // V = 0001
-
-  HP_QUAD_1E_2VA,  // V = 1100
-  HP_QUAD_1E_2VB,  // V = 1010
-  HP_QUAD_1E_2VC,  // V = 1001
-  HP_QUAD_1E_2VD,  // V = 0110
-  HP_QUAD_1E_2VE,  // V = 0101
-  HP_QUAD_1E_2VF,  // V = 0011
-
-  HP_QUAD_1E_3VA,  // V = 1110
-  HP_QUAD_1E_3VB,  // V = 1101
-  HP_QUAD_1E_3VC,  // V = 1011
-  HP_QUAD_1E_3VD,  // V = 0111
-
-  HP_QUAD_1E_4V,   // V = 1111
-
-
-  HP_QUAD_2E,      // E = 1001, V = 1000
-  HP_QUAD_2E_1VA,  // E = 1001, V = 1100
-  HP_QUAD_2E_1VB,  // E = 1001, V = 1010
-  HP_QUAD_2E_1VC,  // E = 1001, V = 1001
-  HP_QUAD_2E_2VA,  // E = 1001, V = 1110
-  HP_QUAD_2E_2VB,  // E = 1001, V = 1101
-  HP_QUAD_2E_2VC,  // E = 1001, V = 1011
-  HP_QUAD_2E_3V,   // E = 1001, V = 1111
-
-  HP_QUAD_2EB_0V,   // E = 1010, V = 0000
-  HP_QUAD_2EB_1VA,  // E = 1010, V = 1000
-  HP_QUAD_2EB_1VB,  // E = 1010, V = 0100
-  HP_QUAD_2EB_2VA,  // E = 1010, V = 1100
-  HP_QUAD_2EB_2VB,  // E = 1010, V = 1010
-  HP_QUAD_2EB_2VC,  // E = 1010, V = 1001
-  HP_QUAD_2EB_2VD,  // E = 1010, V = 0101
-  HP_QUAD_2EB_3VA,  // E = 1010, V = 1110
-  HP_QUAD_2EB_3VB,  // E = 1010, V = 1101
-
-  HP_QUAD_2EB_4V,
-
-
-  HP_QUAD_3E,      // E = 1101, V = 1100
-  HP_QUAD_3E_3VA,  // E = 1101, V = 1110
-  HP_QUAD_3E_3VB,  // E = 1101, V = 1101
-  HP_QUAD_3E_4V,   // E = 1101, V = 1111
-
-  HP_QUAD_4E,
-
-
-  HP_TET = 100,     // no singular vertex/edge
-  HP_TET_0E_1V,     // V1
-  HP_TET_0E_2V,     // V1,2
-  HP_TET_0E_3V,     // V1,2,3  
-  HP_TET_0E_4V,     // V1,2,3,4
-  HP_TET_1E_0V = 200,   // E1-2
-  HP_TET_1E_1VA,    // V1
-  HP_TET_1E_1VB,    // V3
-  HP_TET_1E_2VA,    // V1,2
-  HP_TET_1E_2VB,    // V1,3
-  HP_TET_1E_2VC,    // V1,4
-  HP_TET_1E_2VD,    // V3,4
-  HP_TET_1E_3VA,    // V1,2,3
-  HP_TET_1E_3VB,    // V1,3,4
-  HP_TET_1E_4V,     // V1,2,3,4
-
-
-  // 2 connected edges, additonally marked Vs
-  HP_TET_2EA_0V = 220,    // E1-2, E1-3
-  HP_TET_2EA_1VA,   // V2
-  HP_TET_2EA_1VB,   // V3
-  HP_TET_2EA_1VC,   // V4
-  HP_TET_2EA_2VA,   // V2,3
-  HP_TET_2EA_2VB,   // V2,4
-  HP_TET_2EA_2VC,   // V3,4
-  HP_TET_2EA_3V,    // V2,3,4
-
-  // 2 opposite edges
-  HP_TET_2EB_0V = 230,    // E1-2, E3-4
-  HP_TET_2EB_1V,    // V1
-  HP_TET_2EB_2VA,   // V1,2
-  HP_TET_2EB_2VB,   // V1,3
-  HP_TET_2EB_2VC,   // V1,4
-  HP_TET_2EB_3V,    // V1,2,3
-  HP_TET_2EB_4V,    // V1,2,3,4
-
-  HP_TET_3EA_0V = 400,  // E1-2, E1-3, E1-4, 3 edges connected
-  HP_TET_3EA_1V,        // V2
-  HP_TET_3EA_2V,        // V2,3
-  HP_TET_3EA_3V,        // V2,3,4
-
-  HP_TET_3EB_0V = 420,  // E1-2, E1-4, E2-3  3 edges chain
-  HP_TET_3EB_1V,        // 
-  HP_TET_3EB_2V,        // 
-  HP_TET_3EC_0V = 430,  // 3 edges chain, alter
-  HP_TET_3EC_1V,        // 3 edges chain, alter
-  HP_TET_3EC_2V,        // 3 edges chain, alter
-
-
-  HP_TET_1F_0E_0V = 500,  // 1 singular face
-  HP_TET_1F_0E_1VA,       // 1 sing vertex in face (V2)
-  HP_TET_1F_0E_1VB,       // 1 sing vertex not in face (V1)
-  HP_TET_1F_1EA_0V,       // 1 sing edge not in face
-  HP_TET_1F_1EB_0V,       // 1 sing edge in face
-  HP_TET_2F_0E_0V = 600,  // 2 singular faces
-
-  HP_PRISM = 1000,
-  HP_PRISM_SINGEDGE,
-  HP_PRISM_SINGEDGE_V12,
-  HP_PRISM_SINGEDGE_H1,
-  HP_PRISM_SINGEDGE_H12,
-
-  HP_PRISM_1FA_0E_0V,     // 1 singular trig face
-  HP_PRISM_1FB_0E_0V,     // 1 singular quad face  1-2-4-5
-  HP_PRISM_1FB_1EA_0V,     // 1 singular quad face, edge is 1-2
-
-  HP_PYRAMID = 2000,
-  HP_PYRAMID_0E_1V,
-  HP_PYRAMID_EDGES,
-  HP_PYRAMID_1FB_0E_1VA,  // 1 trig face, top vertex
-
-  HP_HEX = 3000,
-  HP_HEX_0E_1V,
-  HP_HEX_1E_1V,
-  HP_HEX_1E_0V,
-  HP_HEX_3E_0V,
-
-  HP_HEX_1F_0E_0V
-};
-
-
-
-struct HPRef_Struct {
-  HPREF_ELEMENT_TYPE geom;
-  int (*splitedges)[3];
-  int (*splitfaces)[4];
-  int (*splitelements)[5];
-  HPREF_ELEMENT_TYPE * neweltypes;
-  int (*newels)[8];
-};
-
-
-
-
-class HPRefElement
-{
-public:
-  HPRefElement () 
-  {
-    for (int i = 0; i < 8; i++)
-      {
-	pnums[i] = -1;
-	param[i][0] = param[i][1] = param[i][2] = 0;
-      }
-  }
-  HPREF_ELEMENT_TYPE type;
-  PointIndex pnums[8];
-  double param[8][3];
-  int index;
-  int level;
-  int coarse_elnr;
-  //  EdgePointGeomInfo epgeominfo[2];
-};
-
-
-
-extern void HPRefinement (Mesh & mesh, Refinement * ref, int levels);
-
-
-#endif
-
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/improve2.cpp b/contrib/Netgen/libsrc/meshing/improve2.cpp
deleted file mode 100644
index af0ea0ca45589d2fae32d0a298e30ea0c8a2d1a4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve2.cpp
+++ /dev/null
@@ -1,798 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#include <opti.hpp>
-
-#ifndef SMALLLIB
-//#include <visual.hpp>
-#endif
-
-namespace netgen
-{
-
-class Neighbour
-{
-  int nr[3];
-  int orient[3];
-
-public:
-  Neighbour () { nr[0] = nr[1] = nr[2] = -1; orient[0] = orient[1] = orient[2] = 0; }
-
-  void SetNr (int side, int anr) { nr[side-1] = anr; }
-  int GetNr (int side) { return nr[side-1]; }
-
-  void SetOrientation (int side, int aorient) { orient[side-1] = aorient; }
-  int GetOrientation (int side) { return orient[side-1]; }
-};
-
-
-
-
-class trionedge
-{
-public:
-  int tnr;
-  int sidenr;
-
-  trionedge () { tnr = 0; sidenr = 0; }
-  trionedge (int atnr, int asidenr)
-    { tnr = atnr; sidenr = asidenr; }
-};
-
-
-
- 
-void MeshOptimize2d :: EdgeSwapping (Mesh & mesh, int usemetric)
-{
-  //  return; 
-
-  if (!faceindex)
-    {
-      if (usemetric)
-	PrintMessage (3, "Edgeswapping, metric");
-      else
-	PrintMessage (3, "Edgeswapping, topological");
-
-      for (faceindex = 1; faceindex <= mesh.GetNFD(); faceindex++)
-	{
-	  EdgeSwapping (mesh, usemetric);
-
-	  if (multithread.terminate)
-	    throw NgException ("Meshing stopped");
-	}
-
-      faceindex = 0;
-      mesh.CalcSurfacesOfNode();
-      return;
-    }
-
-
-  int i, i2, j, k, j2;
-  bool should;
-  PointIndex pi;
-
-  ARRAY<SurfaceElementIndex> seia;
-  mesh.GetSurfaceElementsOfFace (faceindex, seia);
-
-  for (i = 0; i < seia.Size(); i++)
-    if (mesh[seia[i]].GetNP() != 3)
-      {
-	GenericImprove (mesh);
-	return;
-      }
-
-  int surfnr = mesh.GetFaceDescriptor (faceindex).SurfNr();
-
-  ARRAY<Neighbour> neighbors(mesh.GetNSE());
-  INDEX_2_HASHTABLE<trionedge> other(seia.Size() + 2);
-
-
-  ARRAY<char> swapped(mesh.GetNSE());
-  ARRAY<int,PointIndex::BASE> pdef(mesh.GetNP());
-  ARRAY<double,PointIndex::BASE> pangle(mesh.GetNP());
-
-  SurfaceElementIndex t1, t2;
-  int o1, o2;
-
-  PointIndex pi1, pi2, pi3, pi4;
-  PointGeomInfo gi1, gi2, gi3, gi4;
-
-
-  int nswaps = 0;
-  int e, done;
-  double d;
-  Vec3d nv1, nv2;
-  double horder;
-  double loch;
-  static const double minangle[] = { 0, 1.481, 2.565, 3.627, 4.683, 5.736, 7, 9 };
-
-  pangle = 0;
-
-  for (i = 0; i < seia.Size(); i++)
-    {
-      const Element2d & sel = mesh[seia[i]];
-      for (j = 0; j < 3; j++)
-	{
-	  POINTTYPE typ = mesh.PointType (sel[j]);
-	  if (typ == FIXEDPOINT || typ == EDGEPOINT)
-	    {
-	      pangle[sel[j]] +=
-		Angle (mesh[sel[(j+1)%3]] - mesh[sel[j]],
-		       mesh[sel[(j+2)%3]] - mesh[sel[j]]);
-	    }
-	}
-    }
-
-  for (pi = PointIndex::BASE; 
-       pi < mesh.GetNP()+PointIndex::BASE; pi++)
-    {
-      if (mesh.PointType(pi) == INNERPOINT || mesh.PointType(pi) == SURFACEPOINT)
-	pdef[pi] = -6;
-      else
-	for (j = 0; j < 8; j++)
-	  if (pangle[pi] >= minangle[j])
-	    pdef[pi] = -1-j;
-    }
-
-  for (i = 0; i < seia.Size(); i++)
-    {
-      const Element2d & sel = mesh[seia[i]];
-      for (j = 0; j < 3; j++)
-	pdef[sel[j]]++;
-    }
-
-  for (i = 0; i < seia.Size(); i++)
-    {
-      const Element2d & sel = mesh[seia[i]];
-      for (j = 0; j < 3; j++)
-	{
-	  neighbors[seia[i]].SetNr (j+1, -1);
-	  neighbors[seia[i]].SetOrientation (j+1, 0);
-	}
-    }
-
-  /*
-  ARRAY<Vec3d> normals(mesh.GetNP());
-  for (i = 1; i <= mesh.GetNSE(); i++)
-    {
-      Element2d & hel = mesh.SurfaceElement(i);
-      if (hel.GetIndex() == faceindex)
-	for (k = 1; k <= 3; k++)
-	  {
-	    int pi = hel.PNum(k);
-	    SelectSurfaceOfPoint (mesh.Point(pi), hel.GeomInfoPi(k));
-	    int surfi = mesh.GetFaceDescriptor(faceindex).SurfNr();
-	    GetNormalVector (surfi, mesh.Point(pi), normals.Elem(pi));
-	    normals.Elem(pi) /= normals.Elem(pi).Length();
-	  }
-    }
-  */	    
-
-  
-  for (i = 0; i < seia.Size(); i++)
-    {
-      const Element2d & sel = mesh[seia[i]];
-
-      for (j = 1; j <= 3; j++)
-	{
-	  pi1 = sel.PNumMod(j+1);
-	  pi2 = sel.PNumMod(j+2);
-	  
-	  loch = mesh.GetH(mesh[pi1]);
-	    
-	  INDEX_2 edge(pi1, pi2);
-	  edge.Sort();
-	  
-	  if (mesh.IsSegment (pi1, pi2))
-	    continue;
-	  
-	  /*
-	    if (segments.Used (edge))
-	    continue;
-	  */
-	  INDEX_2 ii2 (pi1, pi2);
-	  if (other.Used (ii2))
-	    {
-	      // INDEX_2 i2s(ii2);
-	      // i2s.Sort();
-	      
-	      i2 = other.Get(ii2).tnr;
-	      j2 = other.Get(ii2).sidenr;
-		
-	      neighbors[seia[i]].SetNr (j, i2);
-	      neighbors[seia[i]].SetOrientation (j, j2);
-	      neighbors[i2].SetNr (j2, seia[i]);
-	      neighbors[i2].SetOrientation (j2, j);
-	    }
-	  else
-	    {
-	      other.Set (INDEX_2 (pi2, pi1), trionedge (seia[i], j));
-	    }
-	}
-    }
-
-  for (i = 0; i < seia.Size(); i++)
-    swapped[seia[i]] = 0;
-
-
-  int t = 4;
-  done = 0;
-  while (!done && t >= 2)
-    {
-      for (i = 0; i < seia.Size(); i++)
-	{
-	  t1 = seia[i];
-
-	  if (mesh[t1].IsDeleted())
-	    continue;
-
-	  if (mesh[t1].GetIndex() != faceindex)
-	    continue;
-
-	  if (multithread.terminate)
-	    throw NgException ("Meshing stopped");
-
-	  for (o1 = 1; o1 <= 3; o1++)
-	    {
-	      t2 = neighbors[t1].GetNr (o1);
-	      o2 = neighbors[t1].GetOrientation (o1);
-
-	      if (t2 == -1) continue;
-	      if (swapped[t1] || swapped[t2]) continue;
-	      
-
-	      pi1 = mesh[t1].PNumMod(o1+1);
-	      pi2 = mesh[t1].PNumMod(o1+2);
-	      pi3 = mesh[t1].PNumMod(o1);
-	      pi4 = mesh[t2].PNumMod(o2);
-	      
-	      gi1 = mesh[t1].GeomInfoPiMod(o1+1);
-	      gi2 = mesh[t1].GeomInfoPiMod(o1+2);
-	      gi3 = mesh[t1].GeomInfoPiMod(o1);
-	      gi4 = mesh[t2].GeomInfoPiMod(o2);
-	      
-	      // normal of old   (new ?????)
-	      nv1 = Cross (mesh.Point(pi3)-mesh.Point(pi4), 
-			   mesh.Point(pi1)-mesh.Point(pi4));
-	      nv2 = Cross (mesh.Point(pi4)-mesh.Point(pi3), 
-			   mesh.Point(pi2)-mesh.Point(pi3));
-
-	      
-	      // normals of swapped  original (???JS)
-	      Vec3d nv3, nv4;
-	      nv3 = Cross (mesh.Point(pi1)-mesh.Point(pi4), 
-			   mesh.Point(pi2)-mesh.Point(pi4));
-	      nv4 = Cross (mesh.Point(pi2)-mesh.Point(pi3), 
-			   mesh.Point(pi1)-mesh.Point(pi3));
-	      
-	      nv3 *= -1;
-	      nv4 *= -1;
-	      nv3.Normalize();
-	      nv4.Normalize();
-
-	      nv1.Normalize();
-	      nv2.Normalize();
-	    
-	      Vec3d nvp3, nvp4;
-	      SelectSurfaceOfPoint (mesh.Point(pi3), gi3);
-	      GetNormalVector (surfnr, mesh.Point(pi3), gi3, nvp3);
-
-	      nvp3.Normalize();
-
-	      SelectSurfaceOfPoint (mesh.Point(pi4), gi4);
-	      GetNormalVector (surfnr, mesh.Point(pi4), gi4, nvp4);
-	    
-	      nvp4.Normalize();
-	      
-	      
-	      
-	      double critval = cos (M_PI / 6);  // 30 degree
-	      bool allowswap = 
-		(nv1 * nvp3 > critval) && 
-		(nv1 * nvp4 > critval) && 
-		(nv2 * nvp3 > critval) && 
-		(nv2 * nvp4 > critval) &&
-		(nvp3 * nv3 > critval) && 
-		(nvp4 * nv4 > critval);
-	      
-
-	      horder = Dist (mesh.Point(pi1), mesh.Point(pi2));
-
-	      if ( // nv1 * nv2 >= 0 &&
-		  nv1.Length() > 1e-3 * horder * horder &&
-		  nv2.Length() > 1e-3 * horder * horder &&
-		  allowswap )
-		{
-		  if (!usemetric)
-		    {
-		      e = pdef[pi1] + pdef[pi2] - pdef[pi3] - pdef[pi4];
-		      d = 
-			Dist2 (mesh.Point(pi1), mesh.Point(pi2)) - 
-			Dist2 (mesh.Point(pi3), mesh.Point(pi4));
-		      
-		      should = e >= t && (e > 2 || d > 0);
-		    }
-		  else
-		    {
-		      should = 
-			CalcTriangleBadness (mesh.Point(pi4), mesh.Point(pi3), mesh.Point(pi1), 
-					     metricweight, loch) +
-			CalcTriangleBadness (mesh.Point(pi3), mesh.Point(pi4), mesh.Point(pi2), 
-					     metricweight, loch) <
-			CalcTriangleBadness (mesh.Point(pi1), mesh.Point(pi2), mesh.Point(pi3), 
-					     metricweight, loch) +
-			CalcTriangleBadness (mesh.Point(pi2), mesh.Point(pi1), mesh.Point(pi4), 
-					     metricweight, loch);
-
-		    }
-
-		  
-		  if (allowswap)
-		    {
-		      Element2d sw1 (pi4, pi3, pi1);
-		      Element2d sw2 (pi3, pi4, pi2);
-
-		      int legal1 = 
-			mesh.LegalTrig (mesh.SurfaceElement (t1)) + 
-			mesh.LegalTrig (mesh.SurfaceElement (t2));
-		      int legal2 = 
-			mesh.LegalTrig (sw1) + mesh.LegalTrig (sw2);
-
-		      if (legal1 < legal2) should = 1;
-		      if (legal2 < legal1) should = 0;
-		    }
-		  
-		  if (should)
-		    {
-		      // do swapping !
-		      
-		      // cout << "swap " << endl;
-
-		      nswaps ++;
-		      
-		    //            testout << "nv1 = " << nv1 << "   nv2 = " << nv2 << endl;
-		      
-		      done = 1;
-		      
-		      mesh[t1].PNum(1) = pi1;
-		      mesh[t1].PNum(2) = pi4;
-		      mesh[t1].PNum(3) = pi3;
-		      
-		      mesh[t2].PNum(1) = pi2;
-		      mesh[t2].PNum(2) = pi3;
-		      mesh[t2].PNum(3) = pi4;
-		      
-		      mesh[t1].GeomInfoPi(1) = gi1;
-		      mesh[t1].GeomInfoPi(2) = gi4;
-		      mesh[t1].GeomInfoPi(3) = gi3;
-		      
-		      mesh[t2].GeomInfoPi(1) = gi2;
-		      mesh[t2].GeomInfoPi(2) = gi3;
-		      mesh[t2].GeomInfoPi(3) = gi4;
-		      
-		      pdef[pi1]--;
-		      pdef[pi2]--;
-		      pdef[pi3]++;
-		      pdef[pi4]++;
-		      
-		      swapped[t1] = 1;
-		      swapped[t2] = 1;
-		    }
-		}
-	    }
-	}
-      t--;
-    }
-
-  mesh.SetNextTimeStamp();
-}
-
-
-
-
-
-
-
- 
-void MeshOptimize2d :: CombineImprove (Mesh & mesh)
-{
-  if (!faceindex)
-    {
-      PrintMessage (3, "Combine improve");
-
-      for (faceindex = 1; faceindex <= mesh.GetNFD(); faceindex++)
-	{
-	  CombineImprove (mesh);
-
-	  if (multithread.terminate)
-	    throw NgException ("Meshing stopped");
-	}
-      faceindex = 0;
-      return;
-    }
-
-
-  int i, j, k, l, i2, j2;
-  PointIndex pi;
-  SurfaceElementIndex sei;
-
-
-  ARRAY<SurfaceElementIndex> seia;
-  mesh.GetSurfaceElementsOfFace (faceindex, seia);
-
-
-  for (i = 0; i < seia.Size(); i++)
-    if (mesh[seia[i]].GetNP() != 3)
-      return;
-
-
-
-  int surfnr = 0;
-  if (faceindex)
-    surfnr = mesh.GetFaceDescriptor (faceindex).SurfNr();
-
-
-  int should;
-  PointIndex pi1, pi2;
-  MeshPoint p1, p2, pnew;
-  double bad1, bad2;
-  Vec3d nv;
-
-  int np = mesh.GetNP();
-  int nse = mesh.GetNSE();
-
-  TABLE<SurfaceElementIndex,PointIndex::BASE> elementsonnode(np); 
-  ARRAY<SurfaceElementIndex> hasonepi, hasbothpi;
-
-  for (i = 0; i < seia.Size(); i++)
-    {
-      Element2d & el = mesh[seia[i]];
-      for (j = 0; j < el.GetNP(); j++)
-	{
-	  elementsonnode.Add (el[j], seia[i]);
-	}      
-    }
-
-
-  ARRAY<int,PointIndex::BASE> fixed(np);
-  fixed = 0;
-
-  SegmentIndex si;
-  for (si = 0; si < mesh.GetNSeg(); si++)
-    {
-      INDEX_2 i2(mesh[si].p1, mesh[si].p2);
-      fixed[i2.I1()] = 1;
-      fixed[i2.I2()] = 1;
-    }
-
-
-  ARRAY<Vec3d,PointIndex::BASE> normals(np);
-
-  for (pi = PointIndex::BASE; 
-       pi < np + PointIndex::BASE; pi++)
-    {
-      if (elementsonnode[pi].Size())
-	{
-	  Element2d & hel = mesh[elementsonnode[pi][0]];
-	  for (k = 0; k < 3; k++)
-	    if (hel[k] == pi)
-	      {
-		SelectSurfaceOfPoint (mesh[pi], hel.GeomInfoPi(k+1));
-		GetNormalVector (surfnr, mesh[pi], hel.GeomInfoPi(k+1), normals[pi]);
-		break;
-	      }
-	  if (k == 3)
-	    {
-	      cerr << "Neuer Fehler von Joachim, code 17121" << endl;
-	    }
-	}
-    }
-
-
-  for (i = 0; i < seia.Size(); i++)
-    {
-
-      sei = seia[i];
-      Element2d & elem = mesh[sei];
-      if (elem.IsDeleted()) continue;
-
-      for (j = 0; j < 3; j++)
-	{
-	  pi1 = elem[j];
-	  pi2 = elem[(j+1) % 3];
-
-	  if (pi1 < PointIndex::BASE || 
-	      pi2 < PointIndex::BASE)
-	    continue;
-
-	  /*
-	  INDEX_2 i2(pi1, pi2);
-	  i2.Sort();
-	  if (segmentht.Used(i2))
-	    continue;
-	  */
-
-	  bool debugflag = 0;
-
-	  if (debugflag)
-	    {
-	      (*testout) << "Combineimprove, face = " << faceindex 
-			 << "pi1 = " << pi1 << " pi2 = " << pi2 << endl;
-	    }
-
-	  /*
-	  // save version:
-	  if (fixed.Get(pi1) || fixed.Get(pi2)) 
-	    continue;
-	  if (pi2 < pi1) swap (pi1, pi2);
-	  */
-
-	  // more general 
-	  if (fixed[pi2]) 
-	    Swap (pi1, pi2);
-
-	  if (fixed[pi2])  
-	    continue;
-
-	  double loch = mesh.GetH (mesh[pi1]);
-
-	  INDEX_2 si2 (pi1, pi2);
-	  si2.Sort();
-
-	  /*	  
-	  if (edgetested.Used (si2))
-	    continue;
-	  edgetested.Set (si2, 1);
-	  */
-
-	  hasonepi.SetSize(0);
-	  hasbothpi.SetSize(0);
-
-	  for (k = 0; k < elementsonnode[pi1].Size(); k++)
-	    {
-	      const Element2d & el2 = mesh[elementsonnode[pi1][k]];
-
-	      if (el2.IsDeleted()) continue;
-
-	      if (el2[0] == pi2 || el2[1] == pi2 || el2[2] == pi2)
-		{
-		  hasbothpi.Append (elementsonnode[pi1][k]);
-		  nv = Cross (Vec3d (mesh[el2[0]], mesh[el2[1]]),
-			      Vec3d (mesh[el2[0]], mesh[el2[2]]));
-		}
-	      else
-		{
-		  hasonepi.Append (elementsonnode[pi1][k]);
-		}
-	    } 
-
-
-	  Element2d & hel = mesh[hasbothpi[0]];
-	  for (k = 0; k < 3; k++)
-	    if (hel[k] == pi1)
-	      {
-		SelectSurfaceOfPoint (mesh[pi1],
-				      hel.GeomInfoPi(k+1));
-		GetNormalVector (surfnr, mesh[pi1], hel.GeomInfoPi(k+1), nv);
-		break;
-	      }
-	  if (k == 3)
-	    {
-	      cerr << "Neuer Fehler von Joachim, code 32434" << endl;
-	    }
-
-
-	  //	  nv = normals.Get(pi1);
-
-
-
-	  for (k = 0; k < elementsonnode[pi2].Size(); k++)
-	    {
-	      const Element2d & el2 = mesh[elementsonnode[pi2][k]];
-	      if (el2.IsDeleted()) continue;
-
-	      if (el2[0] == pi1 || el2[1] == pi1 || el2[2] == pi1)
-		;
-	      else
-		hasonepi.Append (elementsonnode[pi2][k]);
-	    } 
-
-	  bad1 = 0;
-	  int illegal1 = 0, illegal2 = 0;
-	  for (k = 0; k < hasonepi.Size(); k++)
-	    {
-	      const Element2d & el = mesh[hasonepi[k]];
-	      bad1 += CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]],
-					   nv, -1, loch);
-	      illegal1 += 1-mesh.LegalTrig(el);
-	    }
-	  
-	  for (k = 0; k < hasbothpi.Size(); k++)
-	    {
-	      const Element2d & el = mesh[hasbothpi[k]];
-	      bad1 += CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]],
-					   nv, -1, loch);
-	      illegal1 += 1-mesh.LegalTrig(el);
-	    }
-	  bad1 /= (hasonepi.Size()+hasbothpi.Size());
-
-	  p1 = mesh[pi1];
-	  p2 = mesh[pi2];
-
-	  pnew = p1;
-	  mesh[pi1] = pnew;
-	  mesh[pi2] = pnew;
-
-	  bad2 = 0;
-	  for (k = 0; k < hasonepi.Size(); k++)
-	    {
-	      Element2d & el = mesh[hasonepi[k]];
-	      double err = 
-		CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]],
-				     nv, -1, loch);
-	      bad2 += err;
-
-	      Vec3d hnv = Cross (Vec3d (mesh[el[0]],
-					mesh[el[1]]),
-				 Vec3d (mesh[el[0]],
-					mesh[el[2]]));
-	      if (hnv * nv < 0)
-		bad2 += 1e10;
-
-	      for (l = 0; l < 3; l++)
-		if ( (normals[el[l]] * nv) < 0.5)
-		  bad2 += 1e10;
-
-	      illegal2 += 1-mesh.LegalTrig(el);
-	    }
-	  bad2 /= hasonepi.Size();
-
-	  mesh[pi1] = p1;
-	  mesh[pi2] = p2;
-	  
-       
-	  if (debugflag)
-	    {
-	      (*testout) << "bad1 = " << bad1 << ", bad2 = " << bad2 << endl;
-	    }
-
-
-	  bool should = (bad2 < bad1 && bad2 < 1e4);
-	  if (bad2 < 1e4)
-	    {
-	      if (illegal1 > illegal2) should = 1;
-	      if (illegal2 > illegal1) should = 0;
-	    }
-	  
-
-	  if (should)
-	    {
-	      // (*testout) << "combine !" << endl;
-	      // (*testout) << "bad1 = " << bad1 << ", bad2 = " << bad2 << endl;
-
-
-	      mesh[pi1] = pnew;
-	      PointGeomInfo gi;
-	      bool gi_set(false);
-	      
-	      
-	      Element2d *el1p;
-	      l=0;
-	      while(mesh[elementsonnode[pi1][l]].IsDeleted() && l<elementsonnode.EntrySize(pi1)) l++;
-	      if(l<elementsonnode.EntrySize(pi1))
-		el1p = &mesh[elementsonnode[pi1][l]];
-	      else
-		cerr << "OOPS!" << endl;
-
-	      for (l = 0; l < el1p->GetNP(); l++)
-		if ((*el1p)[l] == pi1)
-		  {
-		    gi = el1p->GeomInfoPi (l+1);
-		    gi_set = true;
-		  }
-
-	      // (*testout) << "Connect point " << pi2 << " to " << pi1 << "\n";
-	      for (k = 0; k < elementsonnode[pi2].Size(); k++)
-		{
-		  Element2d & el = mesh[elementsonnode[pi2][k]];
-		  if(el.IsDeleted()) continue;
-		  elementsonnode.Add (pi1, elementsonnode[pi2][k]);
-
-		  bool haspi1 = 0;
-		  for (l = 0; l < el.GetNP(); l++)
-		    if (el[l] == pi1)
-		      haspi1 = 1;
-		  if (haspi1) continue;
-
-		  for (l = 0; l < el.GetNP(); l++)
-		    {
-		      if (el[l] == pi2)
-			{
-			  el[l] = pi1;
-			  el.GeomInfoPi (l+1) = gi;
-			}
-
-		      fixed[el[l]] = 1;
-		    }
-		}
-
-	      /*
-	      for (k = 0; k < hasbothpi.Size(); k++)
-		{
-		  cout << mesh[hasbothpi[k]] << endl;
-		  for (l = 0; l < 3; l++)
-		    cout << mesh[mesh[hasbothpi[k]][l]] << " ";
-		  cout << endl;
-		}
-	      */
-
-	      for (k = 0; k < hasbothpi.Size(); k++)
-		{
-		  mesh[hasbothpi[k]].Delete();
-		  /*
-		  for (l = 0; l < 4; l++)
-		    mesh[hasbothpi[k]][l] = PointIndex::BASE-1;
-		  */
-		}
-
-	    }
-	}
-    }
-
-  //  mesh.Compress();
-  mesh.SetNextTimeStamp();
-}
-
-
-void MeshOptimize2d :: CheckMeshApproximation (Mesh & mesh)
-{
-  // Check angles between elements and normals at corners
-  /*
-  
-  int i, j;
-  int ne = mesh.GetNSE();
-  int surfnr;
-  
-  Vec3d n, ng;
-  ARRAY<Vec3d> ngs(3);
-
-  (*mycout) << "Check Surface Approxiamtion" << endl;
-  (*testout) << "Check Surface Approxiamtion" << endl;
-
-  for (i = 1; i <= ne; i++)
-    {
-      const Element2d & el = mesh.SurfaceElement(i);
-      surfnr = mesh.GetFaceDescriptor (el.GetIndex()).SurfNr();
-      Vec3d n = Cross (mesh.Point (el.PNum(1)) - mesh.Point (el.PNum(2)),
-		       mesh.Point (el.PNum(1)) - mesh.Point (el.PNum(3)));
-      n /= n.Length();
-
-      for (j = 1; j <= el.GetNP(); j++)
-	{
-	  SelectSurfaceOfPoint (mesh.Point(el.PNum(j)), el.GeomInfoPi(j));
-	  GetNormalVector (surfnr, mesh.Point(el.PNum(j)), ng);
-	  ng /= ng.Length();
-	  ngs.Elem(j) = ng;
-
-	  double angle =  (180.0 / M_PI) * Angle (n, ng);
-	  if (angle > 60)
-	    {
-	      (*testout) << "el " << i << " node " << el.PNum(j)
-			 << "has angle = " << angle << endl;
-	    }
-	}	
-
-      for (j = 1; j <= 3; j++)
-	{
-	  double angle =  (180.0 / M_PI) * Angle (ngs.Get(j), ngs.Get(j%3+1));
-	  if (angle > 60)
-	    {
-	      (*testout) << "el " << i << " node-node " 
-			 << ngs.Get(j) << " - " << ngs.Get(j%3+1)
-			 << " has angle = " << angle << endl;
-	    }
-	}
-    }
-  */
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/improve2.hpp b/contrib/Netgen/libsrc/meshing/improve2.hpp
deleted file mode 100644
index 0770a93b0529ceef30c5e3fcf40c9a32631d02f9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve2.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef FILE_IMPROVE2
-#define FILE_IMPROVE2
-
-
-
-///
-class MeshOptimize2d
-{
-  int faceindex;
-  int improveedges;
-  double metricweight;
-  int writestatus;
-
-public:
-  ///
-  MeshOptimize2d ();
-  ///
-  void ImproveMesh (Mesh & mesh2d);
-  void ImproveMeshJacobian (Mesh & mesh2d);
-    
-  void EdgeSwapping (Mesh & mesh, int usemetric);
-  void CombineImprove (Mesh & mesh);
-
-  void GenericImprove (Mesh & mesh);
-
-
-  void SetFaceIndex (int fi) { faceindex = fi; }
-  void SetImproveEdges (int ie) { improveedges = ie; }
-  void SetMetricWeight (double mw) { metricweight = mw; }
-  void SetWriteStatus (int ws) { writestatus = ws; }
-
-  ///
-  virtual void SelectSurfaceOfPoint (const Point3d & p,
-				     const PointGeomInfo & gi);
-  ///
-  virtual void ProjectPoint (INDEX /* surfind */, Point3d & /* p */) const { };
-  ///
-  virtual void ProjectPoint2 (INDEX /* surfind */, INDEX /* surfind2 */, Point3d & /* p */) const { };
-  /// liefert zu einem 3d-Punkt die geominfo (Dreieck) und liefert 1, wenn erfolgreich, 
-  /// 0, wenn nicht (Punkt ausserhalb von chart)
-  virtual int CalcPointGeomInfo(PointGeomInfo& gi, const Point3d& /*p3*/) const
-    { gi.trignum = 1; return 1;};
-
-  virtual int CalcPointGeomInfo(int /* surfind */, PointGeomInfo& gi, const Point3d& p3) const
-    { return CalcPointGeomInfo (gi, p3); }
-
-  ///
-  virtual void GetNormalVector(INDEX surfind, const Point3d & p, PointGeomInfo & gi, Vec3d & n) const;
-  virtual void GetNormalVector(INDEX surfind, const Point3d & p, Vec3d & n) const;
-
-  void CheckMeshApproximation (Mesh & mesh);
-
-
-  ///
-  friend class Opti2SurfaceMinFunction;
-  ///
-  friend class Opti2EdgeMinFunction;
-  ///
-  friend double Opti2FunctionValueGrad (const Vector & x, Vector & grad);
-  ///
-  friend double Opti2EdgeFunctionValueGrad (const Vector & x, Vector & grad);
-
-
-
-};
-
-
-extern void CalcTriangleBadness (double x2, double x3, double y3, 
-				 double metricweight,
-				 double h, double & badness, 
-				 double & g1x, double & g1y);
-
-
-
-
-extern double CalcTriangleBadness (const Point3d & p1, 
-				   const Point3d & p2, 
-				   const Point3d & p3,
-				   double metricweight,
-				   double h);
-
-extern double CalcTriangleBadness (const Point3d & p1, 
-				   const Point3d & p2, 
-				   const Point3d & p3,
-				   const Vec3d & n,
-				   double metricweight,
-				   double h);
-
-#endif
-
-
diff --git a/contrib/Netgen/libsrc/meshing/improve2gen.cpp b/contrib/Netgen/libsrc/meshing/improve2gen.cpp
deleted file mode 100644
index 69f0e23b2797d69a26b538137394a247dcc783c5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve2gen.cpp
+++ /dev/null
@@ -1,441 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#include <opti.hpp>
-
-namespace netgen
-{
-
-  class ImprovementRule
-  {
-  public:
-    ARRAY<Element2d> oldels;
-    ARRAY<Element2d> newels;
-    ARRAY<INDEX_2> deledges;
-    ARRAY<int> incelsonnode;
-    ARRAY<int> reused;
-    int bonus;
-    int onp;
-  };
-
-
-  void MeshOptimize2d :: GenericImprove (Mesh & mesh)
-  {
-    if (!faceindex)
-      {
-	if (writestatus)
-	  PrintMessage (3, "Generic Improve");
-
-	for (faceindex = 1; faceindex <= mesh.GetNFD(); faceindex++)
-	  GenericImprove (mesh);
-      
-	faceindex = 0;
-      }
-
-    // int j, k, l, ri;
-    int np = mesh.GetNP();
-    int ne = mesh.GetNSE();
-    //    SurfaceElementIndex sei;
-
-    bool ok;
-    int olddef, newdef;
-
-    ARRAY<ImprovementRule*> rules;
-    ARRAY<SurfaceElementIndex> elmap;
-    ARRAY<int> elrot;
-    ARRAY<PointIndex> pmap;
-    ARRAY<PointGeomInfo> pgi;
-
-    int surfnr = mesh.GetFaceDescriptor (faceindex).SurfNr();
-  
-    ImprovementRule * r1;
-
-    // 2 triangles to quad
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3));
-    r1->oldels.Append (Element2d (3, 2, 4));
-    r1->newels.Append (Element2d (1, 2, 4, 3));
-    r1->deledges.Append (INDEX_2 (2,3));
-    r1->onp = 4;
-    r1->bonus = 2;
-    rules.Append (r1);
-
-    // 2 quad to 1 quad
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (4, 3, 2, 5));
-    r1->newels.Append (Element2d (1, 2, 5, 4));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->deledges.Append (INDEX_2 (3, 4));
-    r1->onp = 5;
-    r1->bonus = 0;
-    rules.Append (r1);
-
-    // swap quads
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (3, 2, 5, 6));
-    r1->newels.Append (Element2d (1, 6, 3, 4));
-    r1->newels.Append (Element2d (1, 2, 5, 6));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->onp = 6;
-    r1->bonus = 0;
-    rules.Append (r1);
-
-    // three quads to 2
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (2, 5, 6, 3));
-    r1->oldels.Append (Element2d (3, 6, 7, 4));
-    r1->newels.Append (Element2d (1, 2, 5, 4));
-    r1->newels.Append (Element2d (4, 5, 6, 7));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->deledges.Append (INDEX_2 (3, 4));
-    r1->deledges.Append (INDEX_2 (3, 6));
-    r1->onp = 7;
-    r1->bonus = -1;
-    rules.Append (r1);
-
-    // quad + 2 connected trigs to quad
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (2, 5, 3));
-    r1->oldels.Append (Element2d (3, 5, 4));
-    r1->newels.Append (Element2d (1, 2, 5, 4));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->deledges.Append (INDEX_2 (3, 4));
-    r1->deledges.Append (INDEX_2 (3, 5));
-    r1->onp = 5;
-    r1->bonus = 0;
-    rules.Append (r1);
-
-    // quad + 2 non-connected trigs to quad (a and b)
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (2, 6, 3));
-    r1->oldels.Append (Element2d (1, 4, 5));
-    r1->newels.Append (Element2d (1, 3, 4, 5));
-    r1->newels.Append (Element2d (1, 2, 6, 3));
-    r1->deledges.Append (INDEX_2 (1, 4));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->onp = 6;
-    r1->bonus = 0;
-    rules.Append (r1);
-
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (2, 6, 3));
-    r1->oldels.Append (Element2d (1, 4, 5));
-    r1->newels.Append (Element2d (1, 2, 4, 5));
-    r1->newels.Append (Element2d (4, 2, 6, 3));
-    r1->deledges.Append (INDEX_2 (1, 4));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->onp = 6;
-    r1->bonus = 0;
-    rules.Append (r1);
-
-    // two quad + trig -> one quad + trig
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (2, 5, 6, 3));
-    r1->oldels.Append (Element2d (4, 3, 6));
-    r1->newels.Append (Element2d (1, 2, 6, 4));
-    r1->newels.Append (Element2d (2, 5, 6));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->deledges.Append (INDEX_2 (3, 4));
-    r1->deledges.Append (INDEX_2 (3, 6));
-    r1->onp = 6;
-    r1->bonus = -1;
-    rules.Append (r1);
-
-    // swap quad + trig (a and b)
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (2, 5, 3));
-    r1->newels.Append (Element2d (2, 5, 3, 4));
-    r1->newels.Append (Element2d (1, 2, 4));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->onp = 5;
-    r1->bonus = 0;
-    rules.Append (r1);
-
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (2, 5, 3));
-    r1->newels.Append (Element2d (1, 2, 5, 3));
-    r1->newels.Append (Element2d (1, 3, 4));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->onp = 5;
-    r1->bonus = 0;
-    rules.Append (r1);
-
-
-    // 2 quads to quad + 2 trigs
-    r1 = new ImprovementRule;
-    r1->oldels.Append (Element2d (1, 2, 3, 4));
-    r1->oldels.Append (Element2d (3, 2, 5, 6));
-    r1->newels.Append (Element2d (1, 5, 6, 4));
-    r1->newels.Append (Element2d (1, 2, 5));
-    r1->newels.Append (Element2d (4, 6, 3));
-    r1->deledges.Append (INDEX_2 (2, 3));
-    r1->onp = 6;
-    r1->bonus = 0;
-    //    rules.Append (r1);
-
-
-
-
-    ARRAY<int> mapped(rules.Size());
-    ARRAY<int> used(rules.Size());
-    used = 0;
-    mapped = 0;
-
-  
-
-    for (int ri = 0; ri < rules.Size(); ri++)
-      {
-	ImprovementRule & rule = *rules[ri];
-	rule.incelsonnode.SetSize (rule.onp);
-	rule.reused.SetSize (rule.onp);
-
-	for (int j = 1; j <= rule.onp; j++)
-	  {
-	    rule.incelsonnode.Elem(j) = 0;
-	    rule.reused.Elem(j) = 0;
-	  }
-
-	for (int j = 1; j <= rule.oldels.Size(); j++)
-	  {
-	    const Element2d & el = rule.oldels.Elem(j);
-	    for (int k = 1; k <= el.GetNP(); k++)
-	      rule.incelsonnode.Elem(el.PNum(k))--;
-	  }
-
-	for (int j = 1; j <= rule.newels.Size(); j++)
-	  {
-	    const Element2d & el = rule.newels.Elem(j);
-	    for (int k = 1; k <= el.GetNP(); k++)
-	      {
-		rule.incelsonnode.Elem(el.PNum(k))++;
-		rule.reused.Elem(el.PNum(k)) = 1;
-	      }
-	  }
-      }
-
-
-
-  
-    TABLE<int,PointIndex::BASE> elonnode(np);
-    ARRAY<int,PointIndex::BASE> nelonnode(np);
-    TABLE<SurfaceElementIndex> nbels(ne);
-
-    nelonnode = -4;
-
-    for (SurfaceElementIndex sei = 0; sei < ne; sei++)
-      {
-	const Element2d & el = mesh[sei];
-	if (el.GetIndex() == faceindex && !el.IsDeleted())
-	  {
-	    for (int j = 0; j < el.GetNP(); j++)
-	      elonnode.Add (el[j], sei);
-	  }
-	for (int j = 0; j < el.GetNP(); j++)
-	  nelonnode[el[j]]++;
-      }
-
-    for (SurfaceElementIndex sei = 0; sei < ne; sei++)
-      {
-	const Element2d & el = mesh[sei];
-	if (el.GetIndex() == faceindex && !el.IsDeleted())
-	  {
-	    for (int j = 0; j < el.GetNP(); j++)
-	      {
-		for (int k = 0; k < elonnode[el[j]].Size(); k++)
-		  {
-		    int nbel = elonnode[el[j]] [k];
-		    int used = 0;
-		    for (int l = 0; l < nbels[sei].Size(); l++)
-		      if (nbels[sei][l] == nbel)
-			used = 1;
-		    if (!used)
-		      nbels.Add (sei, nbel);
-		  }
-	      }
-	  }
-      }
-
-
-    for (int ri = 0; ri < rules.Size(); ri++)
-      {
-	const ImprovementRule & rule = *rules[ri];
-      
-	elmap.SetSize (rule.oldels.Size());
-	elrot.SetSize (rule.oldels.Size());
-	pmap.SetSize (rule.onp);
-	pgi.SetSize (rule.onp);
-
-
-	for (SurfaceElementIndex sei = 0; sei < ne; sei++)
-	  {
-	    if (multithread.terminate)
-	      break;
-	    if (mesh[sei].IsDeleted()) continue;
-
-	    elmap[0] = sei;
-	    FlatArray<SurfaceElementIndex> neighbours = nbels[sei];
-	    
-	    for (elrot[0] = 0; elrot[0] < mesh[sei].GetNP(); elrot[0]++)
-	      {
-		const Element2d & el0 = mesh[sei];
-		const Element2d & rel0 = rule.oldels[0];
-
-		if (el0.GetIndex() != faceindex) continue;
-		if (el0.IsDeleted()) continue;
-		if (el0.GetNP() != rel0.GetNP()) continue;
-
-
-		pmap = -1;
- 
-		for (int k = 0; k < el0.GetNP(); k++)
-		  {
-		    pmap.Elem(rel0[k]) = el0.PNumMod(k+elrot[0]+1);
-		    pgi.Elem(rel0[k]) = el0.GeomInfoPiMod(k+elrot[0]+1);
-		  }
-		
-		ok = 1;
-		for (int i = 1; i < elmap.Size(); i++)
-		  {
-		    // try to find a mapping for reference-element i
-
-		    const Element2d & rel = rule.oldels[i];
-		    bool possible = 0;
-
-		    for (elmap[i] = 0; elmap[i] < neighbours.Size(); elmap[i]++)
-		      {
-			const Element2d & el = mesh[neighbours[elmap[i]]];
-			if (el.IsDeleted()) continue;
-			if (el.GetNP() != rel.GetNP()) continue;
-
-			for (elrot[i] = 0; elrot[i] < rel.GetNP(); elrot[i]++)
-			  {
-			    possible = 1;
-
-			    for (int k = 0; k < rel.GetNP(); k++)
-			      if (pmap.Elem(rel[k]) != -1 &&
-				  pmap.Elem(rel[k]) != el.PNumMod (k+elrot[i]+1))
-				possible = 0;
-
-			    if (possible) 
-			      {
-				for (int k = 0; k < el.GetNP(); k++)
-				  {
-				    pmap.Elem(rel[k]) = el.PNumMod(k+elrot[i]+1);
-				    pgi.Elem(rel[k]) = el.GeomInfoPiMod(k+elrot[i]+1);
-				  }
-				break;
-			      }
-			  }
-			if (possible) break;
-		      }
-
-		    if (!possible) 
-		      {
-			ok = 0;
-			break;
-		      }
-
-		    elmap[i] = neighbours[elmap[i]];
-		  }
-
-		for(int i=0; ok && i<rule.deledges.Size(); i++)
-		  {
-		    ok = !mesh.IsSegment(pmap.Elem(rule.deledges[i].I1()),
-					 pmap.Elem(rule.deledges[i].I2()));
-		  }
-								    
-								    
-		
-		
-		if (!ok) continue;
-
-		mapped[ri]++;
-
-		olddef = 0;
-		for (int j = 1; j <= pmap.Size(); j++)
-		  olddef += sqr (nelonnode[pmap.Get(j)]);
-		olddef += rule.bonus;
-
-		newdef = 0;
-		for (int j = 1; j <= pmap.Size(); j++)
-		  if (rule.reused.Get(j))
-		    newdef += sqr (nelonnode[pmap.Get(j)] + 
-				   rule.incelsonnode.Get(j));
-
-		if (newdef > olddef)
-		  continue;
-
-		// calc metric badness
-		double bad1 = 0, bad2 = 0;
-		Vec3d n;
-
-		SelectSurfaceOfPoint (mesh.Point(pmap.Get(1)), pgi.Get(1));
-		GetNormalVector (surfnr, mesh.Point(pmap.Get(1)), pgi.Elem(1), n);
-		  
-		for (int j = 1; j <= rule.oldels.Size(); j++)
-		  bad1 += mesh.SurfaceElement(elmap.Get(j)).CalcJacobianBadness (mesh.Points(), n);
-		  
-		// check new element:
-		for (int j = 1; j <= rule.newels.Size(); j++)
-		  {
-		    const Element2d & rnel = rule.newels.Get(j);
-		    Element2d nel(rnel.GetNP());
-		    for (int k = 1; k <= rnel.GetNP(); k++)
-		      nel.PNum(k) = pmap.Get(rnel.PNum(k));
-
-		    bad2 += nel.CalcJacobianBadness (mesh.Points(), n);
-		  }
-
-		if (bad2 > 1e3) continue;
-
-		if (newdef == olddef && bad2 > bad1) continue;
-		  
-
-		// generate new element:
-		for (int j = 1; j <= rule.newels.Size(); j++)
-		  {
-		    const Element2d & rnel = rule.newels.Get(j);
-		    Element2d nel(rnel.GetNP());
-		    nel.SetIndex (faceindex);
-		    for (int k = 1; k <= rnel.GetNP(); k++)
-		      {
-			nel.PNum(k) = pmap.Get(rnel.PNum(k));
-			nel.GeomInfoPi(k) = pgi.Get(rnel.PNum(k));
-		      }
-		      
-		    mesh.AddSurfaceElement(nel);
-		  }
-		  
-		for (int j = 0; j < rule.oldels.Size(); j++)
-		  mesh.DeleteSurfaceElement ( elmap[j] );
-
-		for (int j = 1; j <= pmap.Size(); j++)
-		  nelonnode[pmap.Get(j)] += rule.incelsonnode.Get(j);
-
-		used[ri]++;
-	      }
-	  }
-      }
-
-    mesh.Compress();
-
-    for (int ri = 0; ri < rules.Size(); ri++)
-      {
-	PrintMessage (5, "rule ", ri+1, " ",
-		      mapped[ri], "/", used[ri], " mapped/used");
-      }
-  }
-
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/improve3.cpp b/contrib/Netgen/libsrc/meshing/improve3.cpp
deleted file mode 100644
index 1b9c8c52f6292909f67f657a73acc3545933a153..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve3.cpp
+++ /dev/null
@@ -1,1947 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-
-#ifdef SOLIDGEOM
-#include <csg.hpp>
-#endif
-#include <opti.hpp>
-
-namespace netgen
-{
-
-/*
-  Combine two points to one.
-  Set new point into the center, if both are
-  inner points.
-  Connect inner point to boundary point, if one
-  point is inner point.
-*/
-
-void MeshOptimize3d :: CombineImprove (Mesh & mesh,
-				       OPTIMIZEGOAL goal)
-{
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-
-  TABLE<ElementIndex, PointIndex::BASE> elementsonnode(np); 
-  ARRAY<ElementIndex> hasonepi, hasbothpi;
-
-  ARRAY<double> oneperr;
-  ARRAY<double> elerrs (ne);
-
-  PrintMessage (3, "CombineImprove");
-  (*testout)  << "Start CombineImprove" << "\n";
-
-  //  mesh.CalcSurfacesOfNode ();
-  char * savetask = multithread.task;
-  multithread.task = "Combine Improve";
-
-
-  double totalbad = 0;
-  for (ElementIndex ei = 0; ei < ne; ei++)
-    {
-      double elerr = CalcBad (mesh.Points(), mesh[ei], 0);
-      totalbad += elerr;
-      elerrs[ei] = elerr;
-    }
-
-  if (goal == OPT_QUALITY)
-    {
-      totalbad = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
-      (*testout) << "Total badness = " << totalbad << endl;
-      PrintMessage (5, "Total badness = ", totalbad);
-    }
-
-  for (ElementIndex ei = 0; ei < ne; ei++)
-    if (!mesh[ei].IsDeleted())
-      for (int j = 0; j < mesh[ei].GetNP(); j++)
-	elementsonnode.Add (mesh[ei][j], ei);
-  
-  INDEX_2_HASHTABLE<int> edgetested (np+1);
-
-  int cnt = 0;
-
-  for (ElementIndex ei = 0; ei < ne; ei++)
-    {
-      if (multithread.terminate)
-	break;
-      
-      multithread.percent = 100.0 * (ei+1) / ne;
-
-      if (mesh.ElementType(ei) == FIXEDELEMENT)
-	continue;
-
-      for (int j = 0; j < 6; j++)
-	{
-	  Element & elemi = mesh[ei];
-	  if (elemi.IsDeleted()) continue;
-	  
-	  static const int tetedges[6][2] =
-	    { { 0, 1 }, { 0, 2 }, { 0, 3 },
-	      { 1, 2 }, { 1, 3 }, { 2, 3 } };
-
-	  PointIndex pi1 = elemi[tetedges[j][0]];
-	  PointIndex pi2 = elemi[tetedges[j][1]];
-
-	  if (pi2 < pi1) Swap (pi1, pi2);
-	  
-	  INDEX_2 si2 (pi1, pi2);
-	  si2.Sort();
-	  
-	  if (edgetested.Used (si2)) continue;
-	  edgetested.Set (si2, 1);
-
-
-	  // hasonepoint.SetSize(0);
-	  //	  hasbothpoints.SetSize(0);
-	  hasonepi.SetSize(0);
-	  hasbothpi.SetSize(0);
-
-	  FlatArray<ElementIndex> row1 = elementsonnode[pi1];
-	  for (int k = 0; k < row1.Size(); k++)
-	    {
-	      Element & elem = mesh[row1[k]];
-	      if (elem.IsDeleted()) continue;
-
-	      if (elem[0] == pi2 || elem[1] == pi2 ||
-		  elem[2] == pi2 || elem[3] == pi2)
-		{
-		  hasbothpi.Append (row1[k]);
-		}
-	      else
-		{
-		  hasonepi.Append (row1[k]);
-		}
-	    } 
-	  
-	  FlatArray<ElementIndex> row2 = elementsonnode[pi2];	  
-	  for (int k = 0; k < row2.Size(); k++)
-	    {
-	      Element & elem = mesh[row2[k]];
-	      if (elem.IsDeleted()) continue;
-
-	      if (elem[0] == pi1 || elem[1] == pi1 ||
-		  elem[2] == pi1 || elem[3] == pi1)
-		;
-	      else
-		{
-		  hasonepi.Append (row2[k]);
-		}
-	    } 
-	  
-	  double bad1 = 0;
-	  for (int k = 0; k < hasonepi.Size(); k++)
-	    bad1 += elerrs[hasonepi[k]];
-	  for (int k = 0; k < hasbothpi.Size(); k++)
-	    bad1 += elerrs[hasbothpi[k]];
-	  
-	  MeshPoint p1 = mesh[pi1];
-	  MeshPoint p2 = mesh[pi2];
-	  
-	  // if (mesh.PointType(pi2) != INNERPOINT)
-	  if (p2.Type() != INNERPOINT)
-	    continue;
-	  
-	  MeshPoint pnew;
-	  // if (mesh.PointType(pi1) != INNERPOINT)
-	  if (p1.Type() != INNERPOINT)
-	    pnew = p1;
-	  else
-	    pnew = Center (p1, p2);
-	  
-	  mesh[pi1] = pnew;
-	  mesh[pi2] = pnew;
-
-	  oneperr.SetSize (hasonepi.Size());
-
-	  double bad2 = 0;
-	  for (int k = 0; k < hasonepi.Size(); k++)
-	    {
-	      const Element & elem = mesh[hasonepi[k]];
-	      double err = CalcTetBadness (mesh[elem[0]], mesh[elem[1]],  
-					   mesh[elem[2]], mesh[elem[3]], 0);
-	      bad2 += err;
-	      oneperr[k] = err;
-	    }
-	  
-	  mesh[pi1] = p1;
-	  mesh[pi2] = p2;
-
-
-	  // if (mesh.PointType(pi1) != INNERPOINT)
-	  if (p1.Type() != INNERPOINT)
-	    {
-	      for (int k = 0; k < hasonepi.Size(); k++)
-		{
-		  Element & elem = mesh[hasonepi[k]];
-		  int l;
-		  for (l = 0; l < 4; l++)
-		    if (elem[l] == pi2)
-		      {
-			elem[l] = pi1;
-			break;
-		      }
-		  
-		  elem.flags.illegal_valid = 0;
-		  if (!mesh.LegalTet(elem))
-		    bad2 += 1e4;
-
-		  if (l < 4)
-		    {
-		      elem.flags.illegal_valid = 0;
-		      elem[l] = pi2;
-		    }
-		}
-	    }
-
-	  if (bad2 / hasonepi.Size()  < 
-	      bad1 / (hasonepi.Size()+hasbothpi.Size()))
-	    {
-	      mesh[pi1] = pnew;
-	      cnt++;
-
-	      FlatArray<ElementIndex> row = elementsonnode[pi2];
-	      for (int k = 0; k < row.Size(); k++)
-		{
-		  Element & elem = mesh[row[k]];
-		  if (elem.IsDeleted()) continue;
-
-		  elementsonnode.Add (pi1, row[k]);
-		  for (int l = 0; l < elem.GetNP(); l++)
-		    if (elem[l] == pi2)
-		      elem[l] = pi1;
-		  
-		  elem.flags.illegal_valid = 0;
-		  if (!mesh.LegalTet (elem))
-		    (*testout) << "illegal tet " << elementsonnode[pi2][k] << endl;
-		}
-
-	      for (int k = 0; k < hasonepi.Size(); k++)
-		elerrs[hasonepi[k]] = oneperr[k];
-	      
-	      for (int k = 0; k < hasbothpi.Size(); k++)
-		{
-		  mesh[hasbothpi[k]].flags.illegal_valid = 0;
-		  mesh[hasbothpi[k]].Delete();
-		}
-	    }
-	}
-    }
-
-  mesh.Compress();
-  mesh.MarkIllegalElements();
-
-  PrintMessage (5, cnt, " elements combined");
-  (*testout) << "CombineImprove done" << "\n";
-
-  totalbad = 0;
-  for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-    totalbad += CalcBad (mesh.Points(), mesh[ei], 0);
-
-  if (goal == OPT_QUALITY)
-    {
-      totalbad = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
-      (*testout) << "Total badness = " << totalbad << endl;
-
-      int cntill = 0;
-      int ne = mesh.GetNE();
-      for (ElementIndex ei = 0; ei < ne; ei++)
-	if (!mesh.LegalTet (mesh[ei]))
-	  cntill++;
-
-      PrintMessage (5, cntill, " illegal tets");
-    }
-  multithread.task = savetask;
-} 
-
-
-
-
-
-/*
-  Mesh improvement by edge splitting.
-  If mesh quality is improved by inserting a node into an inner edge,
-  the edge is split into two parts.
-*/
-void MeshOptimize3d :: SplitImprove (Mesh & mesh,
-				     OPTIMIZEGOAL goal)
-{
-  int j, k, l;
-  Point3d p1, p2, pnew;
-
-  ElementIndex ei;
-  SurfaceElementIndex sei;
-  PointIndex pi1, pi2;
-
-  double bad1, bad2, badmax, badlimit;
-
-
-  int cnt = 0;
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-
-  TABLE<ElementIndex,PointIndex::BASE> elementsonnode(np); 
-  ARRAY<ElementIndex> hasbothpoints;
-
-  BitArray origpoint(np), boundp(np);
-  origpoint.Set();
-
-  ARRAY<double> elerrs(ne);
-  BitArray illegaltet(ne);
-  illegaltet.Clear();
-
-  char * savetask = multithread.task;
-  multithread.task = "Split Improve";
-
-
-  PrintMessage (3, "SplitImprove");
-  (*testout)  << "start SplitImprove" << "\n";
-
-  ARRAY<INDEX_3> locfaces;
-
-  INDEX_2_HASHTABLE<int> edgetested (np);
-
-  bad1 = 0;
-  badmax = 0;
-  for (ei = 0; ei < ne; ei++)
-    {
-      elerrs[ei] = CalcBad (mesh.Points(), mesh[ei], 0);
-      bad1 += elerrs[ei];
-      if (elerrs[ei] > badmax) badmax = elerrs[ei];
-    }
-
-  PrintMessage (5, "badmax = ", badmax);
-  badlimit = 0.5 * badmax;
-
-
-  boundp.Clear();
-  for (sei = 0; sei < mesh.GetNSE(); sei++)
-    for (j = 0; j < 3; j++)
-      boundp.Set (mesh[sei][j]);
-
-  if (goal == OPT_QUALITY)
-    {
-      bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
-      (*testout) << "Total badness = " << bad1 << endl;
-    }
-
-  for (ei = 0; ei < ne; ei++)
-    for (j = 0; j < mesh[ei].GetNP(); j++)
-      elementsonnode.Add (mesh[ei][j], ei);
-
-
-  mesh.MarkIllegalElements();
-  if (goal == OPT_QUALITY || goal == OPT_LEGAL)
-    {
-      int cntill = 0;
-      for (ei = 0; ei < ne; ei++)
-	{
-	  //	  if (!LegalTet (volelements.Get(i)))
-	  if (mesh[ei].flags.illegal)
-	    {
-	      cntill++;
-	      illegaltet.Set (ei+1);
-	    }
-	}
-      //      (*mycout) << cntill << " illegal tets" << endl;
-    }
-
-
-  for (ei = 0; ei < ne; ei++)
-    {
-      if (multithread.terminate)
-	break;
-
-      multithread.percent = 100.0 * (ei+1) / ne;
-
-      bool ltestmode = 0;
-
-
-      if (elerrs[ei] < badlimit && !illegaltet.Test(ei+1)) continue;
-
-      if ((goal == OPT_LEGAL) &&
-	  !illegaltet.Test(ei+1) &&
-	  CalcBad (mesh.Points(), mesh[ei], 0) < 1e3) 
-	continue;
-
-      
-      Element & elem = mesh[ei];
-
-      if (ltestmode)
-	{
-	  (*testout) << "test el " << ei << endl;
-	  for (j = 0; j < 4; j++)
-	    (*testout) << elem[j] << " ";
-	  (*testout) << endl;
-	}
-
-
-      for (j = 0; j < 6; j++)
-	{
-
-	  static const int tetedges[6][2] =
-	    { { 0, 1 }, { 0, 2 }, { 0, 3 },
-	      { 1, 2 }, { 1, 3 }, { 2, 3 } };
-
-	  pi1 = elem[tetedges[j][0]];
-	  pi2 = elem[tetedges[j][1]];
-
-	  if (pi2 < pi1) Swap (pi1, pi2);
-	  if (pi2 > elementsonnode.Size()) continue;
-
-	  if (!origpoint.Test(pi1) || !origpoint.Test(pi2))
-	    continue;
-
-  
-	  INDEX_2 i2(pi1, pi2);
-	  i2.Sort();
-
-	  if (mesh.BoundaryEdge (pi1, pi2)) continue;
-
-	  if (edgetested.Used (i2) && !illegaltet.Test(ei+1)) continue;
-	  edgetested.Set (i2, 1);
-
-	  hasbothpoints.SetSize (0);
-	  for (k = 1; k <= elementsonnode.EntrySize(pi1); k++)
-	    {
-	      bool has1 = 0, has2 = 0;
-
-	      ElementIndex elnr = elementsonnode.Get(pi1, k);
-	      Element & el = mesh[elnr];
-
-	      for (l = 0; l < el.GetNP(); l++)
-		{
-		  if (el[l] == pi1) has1 = 1;
-		  if (el[l] == pi2) has2 = 1;
-		}
-	      if (has1 && has2) 
-		{ // only once
-		  for (l = 0; l < hasbothpoints.Size(); l++)
-		    if (hasbothpoints[l] == elnr)
-		      has1 = 0;
-		  
-		  if (has1)
-		    hasbothpoints.Append (elnr);
-		}
-	    }
-	  
-	  bad1 = 0;
-	  for (k = 0; k < hasbothpoints.Size(); k++)
-	    bad1 += CalcBad (mesh.Points(), mesh[hasbothpoints[k]], 0);
-	  
-
-	  bool puretet = 1;
-	  for (k = 0; k < hasbothpoints.Size(); k++)
-	    if (mesh[hasbothpoints[k]].GetType() != TET)
-	      puretet = 0;
-	  if (!puretet) continue;
-
-	  p1 = mesh[pi1];
-	  p2 = mesh[pi2];
-
-	  /*
-	    pnew = Center (p1, p2);
-	  
-	    points.Elem(pi1) = pnew;
-	    bad2 = 0;
-	    for (k = 1; k <= hasbothpoints.Size(); k++)
-	    bad2 += CalcBad (points, 
-	    volelements.Get(hasbothpoints.Get(k)), 0);
-
-	    points.Elem(pi1) = p1;
-	    points.Elem(pi2) = pnew;
-	      
-	    for (k = 1; k <= hasbothpoints.Size(); k++)
-	    bad2 += CalcBad (points, 
-	    volelements.Get(hasbothpoints.Get(k)), 0);
-	    points.Elem(pi2) = p2;
-	  */
-
-
-	  locfaces.SetSize (0);
-	  for (k = 0; k < hasbothpoints.Size(); k++)
-	    {
-	      const Element & el = mesh[hasbothpoints[k]];
-
-	      for (int l = 0; l < 4; l++)
-		if (el[l] == pi1 || el[l] == pi2)
-		  {
-		    INDEX_3 i3;
-		    Element2d face;
-		    el.GetFace (l+1, face);
-		    for (int kk = 1; kk <= 3; kk++)
-		      i3.I(kk) = face.PNum(kk);
-		    locfaces.Append (i3);
-		  }
-	    }
-
-	  PointFunction1 pf (mesh.Points(), locfaces, -1);
-	  OptiParameters par;
-	  par.maxit_linsearch = 50;
-	  par.maxit_bfgs = 20;
-
-	  pnew = Center (p1, p2);
-	  Vector px(3);
-	  px.Elem(1) = pnew.X();
-	  px.Elem(2) = pnew.Y();
-	  px.Elem(3) = pnew.Z();
-
-	  if (elerrs[ei] > 0.1 * badmax)
-	    BFGS (px, pf, par);
-
-	  bad2 = pf.Func (px);
-
-	  pnew.X() = px.Get(1);
-	  pnew.Y() = px.Get(2);
-	  pnew.Z() = px.Get(3);
-
-
-	  int hpinew = mesh.AddPoint (pnew);
-	  //	  ptyps.Append (INNERPOINT);
-
-	  for (k = 0; k < hasbothpoints.Size(); k++)
-	    {
-	      Element & oldel = mesh[hasbothpoints[k]];
-	      Element newel1 = oldel;
-	      Element newel2 = oldel;
-
-	      oldel.flags.illegal_valid = 0;
-	      newel1.flags.illegal_valid = 0;
-	      newel2.flags.illegal_valid = 0;
-	      
-	      for (l = 0; l < 4; l++)
-		{
-		  if (newel1[l] == pi2) newel1[l] = hpinew;
-		  if (newel2[l] == pi1) newel2[l] = hpinew;
-		}
-	      
-	      if (!mesh.LegalTet (oldel)) bad1 += 1e6;
-	      if (!mesh.LegalTet (newel1)) bad2 += 1e6;
-	      if (!mesh.LegalTet (newel2)) bad2 += 1e6;
-	    }	  
-	  
-	  // mesh.PointTypes().DeleteLast();
-	  mesh.Points().DeleteLast();
-
-	  if (bad2 < bad1) 
-	    /*	      (bad1 > 1e4 && boundp.Test(pi1) && boundp.Test(pi2)) */ 
-	    {
-	      cnt++;
-
-	      PointIndex pinew = mesh.AddPoint (pnew);
-	      
-	      for (k = 0; k < hasbothpoints.Size(); k++)
-		{
-		  Element & oldel = mesh[hasbothpoints[k]];
-		  Element newel = oldel;
-
-		  newel.flags.illegal_valid = 0;
-		  oldel.flags.illegal_valid = 0;
-
-		  for (l = 0; l < 4; l++)
-		    {
-		      origpoint.Clear (oldel[l]);
-
-		      if (oldel[l] == pi2) oldel[l] = pinew;
-		      if (newel[l] == pi1) newel[l] = pinew;
-		    }
-		  mesh.AddVolumeElement (newel);
-		}
-	      
-	      j = 10;
-	    }
-	}
-    }
-
-
-  mesh.Compress();
-  PrintMessage (5, cnt, " splits performed");
-
-  (*testout) << "Splitt - Improve done" << "\n";
-
-  if (goal == OPT_QUALITY)
-    {
-      bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
-      (*testout) << "Total badness = " << bad1 << endl;
-
-      int cntill = 0;
-      ne = mesh.GetNE();
-      for (ei = 0; ei < ne; ei++)
-	{
-	  if (!mesh.LegalTet (mesh[ei]))
-	    cntill++;
-	}
-      //      cout << cntill << " illegal tets" << endl;
-    }
-
-  multithread.task = savetask;
-}
-
-
-      
-  
-
-void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal)
-{
-  int j, k, l;
-
-  ElementIndex ei;
-  SurfaceElementIndex sei;
-
-  PointIndex pi1, pi2, pi3, pi4, pi5, pi6;
-  int cnt = 0;
-
-  Element el21(TET), el22(TET), el31(TET), el32(TET), el33(TET);
-  Element el1(TET), el2(TET), el3(TET), el4(TET);
-  Element el1b(TET), el2b(TET), el3b(TET), el4b(TET);
-  
-  double bad1, bad2, bad3;
-
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-
-  
-  // contains at least all elements at node
-  TABLE<ElementIndex,PointIndex::BASE> elementsonnode(np);
-
-  ARRAY<ElementIndex> hasbothpoints;
-
-  PrintMessage (3, "SwapImprove ");
-  (*testout) << "\n" << "Start SwapImprove" << endl;
-
-  char * savetask = multithread.task;
-  multithread.task = "Swap Improve";
-  
-  //  mesh.CalcSurfacesOfNode ();
-  /*
-    for (i = 1; i <= GetNE(); i++)
-    if (volelements.Get(i).PNum(1))
-    if (!LegalTet (volelements.Get(i)))
-    {
-    cout << "detected illegal tet, 1" << endl;
-    (*testout) << "detected illegal tet1: " << i << endl;
-    }
-  */	
-  
-    
-  INDEX_3_HASHTABLE<int> faces(mesh.GetNOpenElements()/3 + 2);
-  if (goal == OPT_CONFORM)
-    {
-      for (int i = 1; i <= mesh.GetNOpenElements(); i++)
-	{
-	  const Element2d & hel = mesh.OpenElement(i);
-	  INDEX_3 face(hel[0], hel[1], hel[2]);
-	  face.Sort();
-	  faces.Set (face, 1);
-	}
-    }
-  
-  // Calculate total badness
-  if (goal == OPT_QUALITY)
-    {
-      bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
-      (*testout) << "Total badness = " << bad1 << endl;
-    }
-  
-  // find elements on node
-  for (ei = 0; ei < ne; ei++)
-    for (j = 0; j < mesh[ei].GetNP(); j++)
-      elementsonnode.Add (mesh[ei][j], ei);
-
-  /*
-    BitArray illegaltet(GetNE());
-    MarkIllegalElements();
-    if (goal == OPT_QUALITY || goal == OPT_LEGAL)
-    {
-    int cntill = 0;
-    for (i = 1; i <= GetNE(); i++)
-    {
-    //	  if (!LegalTet (volelements.Get(i)))
-    if (VolumeElement(i).flags.illegal)
-    {
-    cntill++;
-    illegaltet.Set (i);
-    }
-    }
-    //      (*mycout) << cntill << " illegal tets" << endl;
-    }
-  */
-
-  INDEX_2_HASHTABLE<int> edgeused(2 * ne + 5);
-
-  for (ei = 0; ei < ne; ei++)
-    {
-      if (multithread.terminate)
-	break;
-      
-      multithread.percent = 100.0 * (ei+1) / ne;
-
-      if (mesh.ElementType(ei) == FIXEDELEMENT)
-	continue;
-      
-      if (mesh[ei].IsDeleted())
-	continue;
-
-      if ((goal == OPT_LEGAL) && 
-	  mesh.LegalTet (mesh[ei]) &&
-	  CalcBad (mesh.Points(), mesh[ei], 0) < 1e3)
-	continue;
-
-
-      //      int onlybedges = 1;
-
-      for (j = 0; j < 6; j++)
-	{
-	  // loop over edges
-
-	  const Element & elemi = mesh[ei];
-	  if (elemi.IsDeleted()) continue;
-
-
-	  //	  (*testout) << "check element " << elemi << endl;
-
-	  int mattyp = elemi.GetIndex();
-	  
-	  static const int tetedges[6][2] =
-	    { { 0, 1 }, { 0, 2 }, { 0, 3 },
-	      { 1, 2 }, { 1, 3 }, { 2, 3 } };
-
-	  pi1 = elemi[tetedges[j][0]];
-	  pi2 = elemi[tetedges[j][1]];
-	  
-	  if (pi2 < pi1) Swap (pi1, pi2);
-	 	  
-	  if (mesh.BoundaryEdge (pi1, pi2)) continue;
-
-
-	  INDEX_2 i2 (pi1, pi2);
-	  i2.Sort();
-	  if (edgeused.Used(i2)) continue;
-	  edgeused.Set (i2, 1);
-	  
-	  hasbothpoints.SetSize (0);
-	  for (k = 0; k < elementsonnode[pi1].Size(); k++)
-	    {
-	      bool has1 = 0, has2 = 0;
-	      ElementIndex elnr = elementsonnode[pi1][k];
-	      const Element & elem = mesh[elnr];
-	      
-	      if (elem.IsDeleted()) continue;
-	      
-	      for (l = 0; l < elem.GetNP(); l++)
-		{
-		  if (elem[l] == pi1) has1 = 1;
-		  if (elem[l] == pi2) has2 = 1;
-		}
-
-	      if (has1 && has2) 
-		{ // only once
-		  for (l = 0; l < hasbothpoints.Size(); l++)
-		    if (hasbothpoints[l] == elnr)
-		      has1 = 0;
-		  
-		  if (has1)
-		    hasbothpoints.Append (elnr);
-		}
-	    }
-	  
-	  bool puretet = 1;
-	  for (k = 0; k < hasbothpoints.Size(); k++)
-	    if (mesh[hasbothpoints[k]].GetType () != TET)
-	      puretet = 0;
-	  if (!puretet)
-	    continue;
-
-	  int nsuround = hasbothpoints.Size();
-
-	  if ( nsuround == 3 )
-	    {
-	      Element & elem = mesh[hasbothpoints[0]];
-	      for (l = 0; l < 4; l++)
-		if (elem[l] != pi1 && elem[l] != pi2)
-		  {
-		    pi4 = pi3;
-		    pi3 = elem[l];
-		  }
-	      
-	      el31[0] = pi1;
-	      el31[1] = pi2;
-	      el31[2] = pi3;
-	      el31[3] = pi4;
-	      el31.SetIndex (mattyp);
-	      
-	      if (WrongOrientation (mesh.Points(), el31))
-		{
-		  Swap (pi3, pi4);
-		  el31[2] = pi3;
-		  el31[3] = pi4;
-		}
-	      
-	      pi5 = 0;
-	      for (k = 1; k < 3; k++)
-		{
-		  const Element & elem = mesh[hasbothpoints[k]];
-		  bool has1 = 0;
-		  for (l = 0; l < 4; l++)
-		    if (elem[l] == pi4)
-		      has1 = 1;
-		  if (has1)
-		    {
-		      for (l = 0; l < 4; l++)
-			if (elem[l] != pi1 && elem[l] != pi2 && elem[l] != pi4)
-			  pi5 = elem[l];
-		    }
-		}
-	      
-	      el32[0] = pi1;  
-	      el32[1] = pi2;  
-	      el32[2] = pi4;  
-	      el32[3] = pi5;  
-	      el32.SetIndex (mattyp);
-	      
-	      el33[0] = pi1;  
-	      el33[1] = pi2;  
-	      el33[2] = pi5;  
-	      el33[3] = pi3;  
-	      el33.SetIndex (mattyp);
-	      
-	      elementsonnode.Add (pi4, hasbothpoints[1]);
-	      elementsonnode.Add (pi3, hasbothpoints[2]);
-	      
-	      bad1 = CalcBad (mesh.Points(), el31, 0) + 
-		CalcBad (mesh.Points(), el32, 0) +
-		CalcBad (mesh.Points(), el33, 0);
-
-	      el31.flags.illegal_valid = 0;
-	      el32.flags.illegal_valid = 0;
-	      el33.flags.illegal_valid = 0;
-
-	      if (!mesh.LegalTet(el31) ||
-		  !mesh.LegalTet(el32) ||
-		  !mesh.LegalTet(el33))
-		bad1 += 1e4;
-	      
-	      el21[0] = pi3;
-	      el21[1] = pi4;
-	      el21[2] = pi5;
-	      el21[3] = pi2;
-	      el21.SetIndex (mattyp);
-	      
-	      el22[0] = pi5;
-	      el22[1] = pi4;
-	      el22[2] = pi3;
-	      el22[3] = pi1;
-	      el22.SetIndex (mattyp);	      
-
-	      bad2 = CalcBad (mesh.Points(), el21, 0) + 
-		CalcBad (mesh.Points(), el22, 0);
-
-	      el21.flags.illegal_valid = 0;
-	      el22.flags.illegal_valid = 0;
-
-	      if (!mesh.LegalTet(el21) ||
-		  !mesh.LegalTet(el22))
-		bad2 += 1e4;
-
-
-	      if (goal == OPT_CONFORM && bad2 < 1e4)
-		{
-		  INDEX_3 face(pi3, pi4, pi5);
-		  face.Sort();
-		  if (faces.Used(face))
-		    {
-		      // (*testout) << "3->2 swap, could improve conformity, bad1 = " << bad1
-		      //				 << ", bad2 = " << bad2 << endl;
-		      if (bad2 < 1e4)
-			bad1 = 2 * bad2;
-		    }
-		  /*
-		    else
-		    {
-		    INDEX_2 hi1(pi3, pi4);
-		    hi1.Sort();
-		    INDEX_2 hi2(pi3, pi5);
-		    hi2.Sort();
-		    INDEX_2 hi3(pi4, pi5);
-		    hi3.Sort();
-
-		    if (boundaryedges->Used (hi1) ||
-		    boundaryedges->Used (hi2) ||
-		    boundaryedges->Used (hi3) )
-		    bad1 = 2 * bad2;
-		    }
-		  */
-		}
-
-	      if (bad2 < bad1)
-		{
-		  //		  (*mycout) << "3->2 " << flush;
-		  //		  (*testout) << "3->2 conversion" << endl;
-		  cnt++;
-		  
-
-		  /*
-		  (*testout) << "3->2 swap, old els = " << endl
-			     << mesh[hasbothpoints[0]] << endl
-			     << mesh[hasbothpoints[1]] << endl
-			     << mesh[hasbothpoints[2]] << endl
-			     << "new els = " << endl
-			     << el21 << endl
-			     << el22 << endl;
-		  */
-
-
-		  el21.flags.illegal_valid = 0;
-		  el22.flags.illegal_valid = 0;
-		  mesh[hasbothpoints[0]] = el21;
-		  mesh[hasbothpoints[1]] = el22;
-		  for (l = 0; l < 4; l++)
-		    mesh[hasbothpoints[2]][l] = 0;
-		  mesh[hasbothpoints[2]].Delete();
-
-		  for (k = 0; k < 2; k++)
-		    for (l = 0; l < 4; l++)
-		      elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]);
-		}
-	    }
-	  
-
-	  if (nsuround == 4)
-	    {
-	      const Element & elem1 = mesh[hasbothpoints[0]];
-	      for (l = 0; l < 4; l++)
-		if (elem1[l] != pi1 && elem1[l] != pi2)
-		  {
-		    pi4 = pi3;
-		    pi3 = elem1[l];
-		  }
-	      
-	      el1[0] = pi1; el1[1] = pi2;
-	      el1[2] = pi3; el1[3] = pi4;
-	      el1.SetIndex (mattyp);
-
-	      if (WrongOrientation (mesh.Points(), el1))
-		{
-		  Swap (pi3, pi4);
-		  el1[2] = pi3;
-		  el1[3] = pi4;
-		}
-	      
-	      pi5 = 0;
-	      for (k = 1; k < 4; k++)
-		{
-		  const Element & elem = mesh[hasbothpoints[k]];
-		  bool has1 = 0;
-		  for (l = 0; l < 4; l++)
-		    if (elem[l] == pi4)
-		      has1 = 1;
-		  if (has1)
-		    {
-		      for (l = 0; l < 4; l++)
-			if (elem[l] != pi1 && elem[l] != pi2 && elem[l] != pi4)
-			  pi5 = elem[l];
-		    }
-		}
-	      
-	      pi6 = 0;
-	      for (k = 1; k < 4; k++)
-		{
-		  const Element & elem = mesh[hasbothpoints[k]];
-		  bool has1 = 0;
-		  for (l = 0; l < 4; l++)
-		    if (elem[l] == pi3)
-		      has1 = 1;
-		  if (has1)
-		    {
-		      for (l = 0; l < 4; l++)
-			if (elem[l] != pi1 && elem[l] != pi2 && elem[l] != pi3)
-			  pi6 = elem[l];
-		    }
-		}
-	      
-	      /*
-	      INDEX_2 i22(pi3, pi5);
-	      i22.Sort();
-	      INDEX_2 i23(pi4, pi6);
-	      i23.Sort();
-	      */
-	      
-	      el1[0] = pi1; el1[1] = pi2;  
-	      el1[2] = pi3; el1[3] = pi4; 
-	      el1.SetIndex (mattyp);
-	      
-	      el2[0] = pi1; el2[1] = pi2;  
-	      el2[2] = pi4; el2[3] = pi5;  
-	      el2.SetIndex (mattyp);
-	      
-	      el3[0] = pi1; el3[1] = pi2;  
-	      el3[2] = pi5; el3[3] = pi6;  
-	      el3.SetIndex (mattyp);
-	      
-	      el4[0] = pi1; el4[1] = pi2;  
-	      el4[2] = pi6; el4[3] = pi3;  
-	      el4.SetIndex (mattyp);
-	      
-	      //        elementsonnode.Add (pi4, hasbothpoints.Elem(2));
-	      //        elementsonnode.Add (pi3, hasbothpoints.Elem(3));
-	      
-	      bad1 = CalcBad (mesh.Points(), el1, 0) + 
-		CalcBad (mesh.Points(), el2, 0) +
-		CalcBad (mesh.Points(), el3, 0) + 
-		CalcBad (mesh.Points(), el4, 0);
-	      
-
-	      el1.flags.illegal_valid = 0;
-	      el2.flags.illegal_valid = 0;
-	      el3.flags.illegal_valid = 0;
-	      el4.flags.illegal_valid = 0;
-
-
-	      if (goal != OPT_CONFORM)
-		{
-		  if (!mesh.LegalTet(el1) ||
-		      !mesh.LegalTet(el2) ||
-		      !mesh.LegalTet(el3) ||
-		      !mesh.LegalTet(el4))
-		    bad1 += 1e4;
-		}
-	      
-	      el1[0] = pi3; el1[1] = pi5;  
-	      el1[2] = pi2; el1[3] = pi4; 
-	      el1.SetIndex (mattyp);
-	 
-	      el2[0] = pi3; el2[1] = pi5;  
-	      el2[2] = pi4; el2[3] = pi1;  
-	      el2.SetIndex (mattyp);
-	      
-	      el3[0] = pi3; el3[1] = pi5;  
-	      el3[2] = pi1; el3[3] = pi6;  
-	      el3.SetIndex (mattyp);
-	      
-	      el4[0] = pi3; el4[1] = pi5;  
-	      el4[2] = pi6; el4[3] = pi2;  	
-	      el4.SetIndex (mattyp);
-      
-	      bad2 = CalcBad (mesh.Points(), el1, 0) + 
-		CalcBad (mesh.Points(), el2, 0) +
-		CalcBad (mesh.Points(), el3, 0) + 
-		CalcBad (mesh.Points(), el4, 0);
-
-	      el1.flags.illegal_valid = 0;
-	      el2.flags.illegal_valid = 0;
-	      el3.flags.illegal_valid = 0;
-	      el4.flags.illegal_valid = 0;
-
-	      if (goal != OPT_CONFORM)
-		{
-		  if (!mesh.LegalTet(el1) ||
-		      !mesh.LegalTet(el2) ||
-		      !mesh.LegalTet(el3) ||
-		      !mesh.LegalTet(el4))
-		    bad2 += 1e4;
-		}
-
-	      
-	      el1b[0] = pi4; el1b[1] = pi6;  
-	      el1b[2] = pi3; el1b[3] = pi2; 
-	      el1b.SetIndex (mattyp);
-	      
-	      el2b[0] = pi4; el2b[1] = pi6;  
-	      el2b[2] = pi2; el2b[3] = pi5;  
-	      el2b.SetIndex (mattyp);
-	      
-	      el3b[0] = pi4; el3b[1] = pi6;  
-	      el3b[2] = pi5; el3b[3] = pi1;  
-	      el3b.SetIndex (mattyp);
-	      
-	      el4b[0] = pi4; el4b[1] = pi6;  
-	      el4b[2] = pi1; el4b[3] = pi3;  
-	      el4b.SetIndex (mattyp);
-	      
-	      bad3 = CalcBad (mesh.Points(), el1b, 0) + 
-		CalcBad (mesh.Points(), el2b, 0) +
-		CalcBad (mesh.Points(), el3b, 0) +
-		CalcBad (mesh.Points(), el4b, 0);
-	      
-	      el1b.flags.illegal_valid = 0;
-	      el2b.flags.illegal_valid = 0;
-	      el3b.flags.illegal_valid = 0;
-	      el4b.flags.illegal_valid = 0;
-
-	      if (goal != OPT_CONFORM)
-		{
-		  if (!mesh.LegalTet(el1b) ||
-		      !mesh.LegalTet(el2b) ||
-		      !mesh.LegalTet(el3b) ||
-		      !mesh.LegalTet(el4b))
-		    bad3 += 1e4;
-		}
-
-
-	      /*
-	      int swap2 = (bad2 < bad1) && (bad2 < bad3);
-	      int swap3 = !swap2 && (bad3 < bad1);
-	      
-	      if ( ((bad2 < 10 * bad1) || 
-		    (bad2 < 1e6)) && mesh.BoundaryEdge (pi3, pi5))
-		swap2 = 1;
-	      else  if ( ((bad3 < 10 * bad1) || 
-			  (bad3 < 1e6)) && mesh.BoundaryEdge (pi4, pi6))
-		{
-		  swap3 = 1;
-		  swap2 = 0;
-		}
-	      */
-	      bool swap2, swap3;
-
-	      if (goal != OPT_CONFORM)
-		{
-		  swap2 = (bad2 < bad1) && (bad2 < bad3);
-		  swap3 = !swap2 && (bad3 < bad1);
-		}
-	      else
-		{
-		  if (mesh.BoundaryEdge (pi3, pi5)) bad2 /= 1e6;
-		  if (mesh.BoundaryEdge (pi4, pi6)) bad3 /= 1e6;
-
-		  swap2 = (bad2 < bad1) && (bad2 < bad3);
-		  swap3 = !swap2 && (bad3 < bad1);
-		}
-		
-
-	      if (swap2 || swap3)
-		{
-		  // (*mycout) << "4->4 " << flush;
-		  cnt++;
-		  //		  (*testout) << "4->4 conversion" << "\n";
-		  /*
-		    (*testout) << "bad1 = " << bad1 
-		    << " bad2 = " << bad2
-		    << " bad3 = " << bad3 << "\n";
-		  
-		    (*testout) << "Points: " << pi1 << " " << pi2 << " " << pi3 
-		    << " " << pi4 << " " << pi5 << " " << pi6 << "\n";
-		    (*testout) << "Elements: " 
-		    << hasbothpoints.Get(1) << "  "
-		    << hasbothpoints.Get(2) << "  "
-		    << hasbothpoints.Get(3) << "  "
-		    << hasbothpoints.Get(4) << "  " << "\n";
-		  */
-
-		  /*
-		    {
-		    int i1, j1;
-		    for (i1 = 1; i1 <= 4; i1++)
-		    {
-		    for (j1 = 1; j1 <= 4; j1++)
-		    (*testout) << volelements.Get(hasbothpoints.Get(i1)).PNum(j1)
-		    << "  ";
-		    (*testout) << "\n";
-		    }
-		    }
-		  */
-		}
-	      
-
-	      if (swap2)
-		{
-		  //		  (*mycout) << "bad1 = " << bad1 << " bad2 = " << bad2 << "\n";
-
-
-		  /*
-		  (*testout) << "4->4 swap A, old els = " << endl
-			     << mesh[hasbothpoints[0]] << endl
-			     << mesh[hasbothpoints[1]] << endl
-			     << mesh[hasbothpoints[2]] << endl
-			     << mesh[hasbothpoints[3]] << endl
-			     << "new els = " << endl
-			     << el1 << endl
-			     << el2 << endl
-			     << el3 << endl
-			     << el4 << endl;
-		  */
-
-
-
-		  el1.flags.illegal_valid = 0;
-		  el2.flags.illegal_valid = 0;
-		  el3.flags.illegal_valid = 0;
-		  el4.flags.illegal_valid = 0;
-		  
-		  mesh[hasbothpoints[0]] = el1;
-		  mesh[hasbothpoints[1]] = el2;
-		  mesh[hasbothpoints[2]] = el3;
-		  mesh[hasbothpoints[3]] = el4;
-		  
-		  for (k = 0; k < 4; k++)
-		    for (l = 0; l < 4; l++)
-		      elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]);
-		}
-	      else if (swap3)
-		{
-		  // (*mycout) << "bad1 = " << bad1 << " bad3 = " << bad3 << "\n";
-		  el1b.flags.illegal_valid = 0;
-		  el2b.flags.illegal_valid = 0;
-		  el3b.flags.illegal_valid = 0;
-		  el4b.flags.illegal_valid = 0;
-
-
-		  /*
-		  (*testout) << "4->4 swap A, old els = " << endl
-			     << mesh[hasbothpoints[0]] << endl
-			     << mesh[hasbothpoints[1]] << endl
-			     << mesh[hasbothpoints[2]] << endl
-			     << mesh[hasbothpoints[3]] << endl
-			     << "new els = " << endl
-			     << el1b << endl
-			     << el2b << endl
-			     << el3b << endl
-			     << el4b << endl;
-		  */
-
-
-		  mesh[hasbothpoints[0]] = el1b;
-		  mesh[hasbothpoints[1]] = el2b;
-		  mesh[hasbothpoints[2]] = el3b;
-		  mesh[hasbothpoints[3]] = el4b;
-
-		  for (k = 0; k < 4; k++)
-		    for (l = 0; l < 4; l++)
-		      elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]);
-		}
-	    }
-
-	  if (nsuround >= 5) 
-	    {
-	      Element hel(TET);
-
-	      ArrayMem<PointIndex, 50> suroundpts(nsuround);
-	      ArrayMem<char, 50> tetused(nsuround);
-
-	      Element & elem = mesh[hasbothpoints[0]];
-
-	      for (l = 0; l < 4; l++)
-		if (elem[l] != pi1 && elem[l] != pi2)
-		  {
-		    pi4 = pi3;
-		    pi3 = elem[l];
-		  }
-
-	      hel[0] = pi1;
-	      hel[1] = pi2;
-	      hel[2] = pi3;
-	      hel[3] = pi4;
-	      hel.SetIndex (mattyp);
-	      
-	      if (WrongOrientation (mesh.Points(), hel))
-		{
-		  Swap (pi3, pi4);
-		  hel[2] = pi3;
-		  hel[3] = pi4;
-		}
-
-	      
-	      // suroundpts.SetSize (nsuround);
-	      suroundpts[0] = pi3;
-	      suroundpts[1] = pi4;
-
-	      tetused = 0;
-	      tetused[0] = 1;
-
-	      for (l = 2; l < nsuround; l++)
-		{
-		  int oldpi = suroundpts[l-1];
-		  int newpi = 0;
-
-		  for (k = 0; k < nsuround && !newpi; k++)
-		    if (!tetused[k])
-		      {
-			const Element & nel = mesh[hasbothpoints[k]];
-
-			for (int k2 = 0; k2 < 4 && !newpi; k2++)
-			  if (nel[k2] == oldpi)
-			    {
-			      newpi = 
-				nel[0] + nel[1] + nel[2] + nel[3] 
-				- pi1 - pi2 - oldpi;
-			      
-			      tetused[k] = 1; 
-			      suroundpts[l] = newpi;
-			    }			
-		      }
-		}
-
-	      
-	      double bad1 = 0, bad2;
-	      for (k = 0; k < nsuround; k++)
-		{
-		  hel[0] = pi1;
-		  hel[1] = pi2;
-		  hel[2] = suroundpts[k];
-		  hel[3] = suroundpts[(k+1) % nsuround];
-		  hel.SetIndex (mattyp);
-
-		  bad1 += CalcBad (mesh.Points(), hel, 0);
-		}
-
-	      //  (*testout) << "nsuround = " << nsuround << " bad1 = " << bad1 << endl;
-
-
-	      int bestl = -1;
-	      int confface = -1;
-	      int confedge = -1;
-	      double badopt = bad1;
-
-	      for (l = 0; l < nsuround; l++)
-		{
-		  bad2 = 0;
-
-		  for (k = l+1; k <= nsuround + l - 2; k++)
-		    {
-		      hel[0] = suroundpts[l];
-		      hel[1] = suroundpts[k % nsuround];
-		      hel[2] = suroundpts[(k+1) % nsuround];
-		      hel[3] = pi2;
-
-		      bad2 += CalcBad (mesh.Points(), hel, 0);
-		      hel.flags.illegal_valid = 0;
-		      if (!mesh.LegalTet(hel)) bad2 += 1e4;
-
-		      hel[2] = suroundpts[k % nsuround];
-		      hel[1] = suroundpts[(k+1) % nsuround];
-		      hel[3] = pi1;
-
-		      bad2 += CalcBad (mesh.Points(), hel, 0);
-
-		      hel.flags.illegal_valid = 0;
-		      if (!mesh.LegalTet(hel)) bad2 += 1e4;
-		    }
-		  // (*testout) << "bad2," << l << " = " << bad2 << endl;
-		  
-		  if ( bad2 < badopt )
-		    {
-		      bestl = l;
-		      badopt = bad2;
-		    }
-		  
-		  
-		  if (goal == OPT_CONFORM)
-		       // (bad2 <= 100 * bad1 || bad2 <= 1e6))
-		    {
-		      bool nottoobad =
-			(bad2 <= bad1) ||
-			(bad2 <= 100 * bad1 && bad2 <= 1e18) ||
-			(bad2 <= 1e8);
-		      
-		      for (k = l+1; k <= nsuround + l - 2; k++)
-			{
-			  INDEX_3 hi3(suroundpts[l],
-				      suroundpts[k % nsuround],
-				      suroundpts[(k+1) % nsuround]);
-			  hi3.Sort();
-			  if (faces.Used(hi3))
-			    {
-			      // (*testout) << "could improve face conformity, bad1 = " << bad1
-			      // << ", bad 2 = " << bad2 << ", nottoobad = " << nottoobad << endl;
-			      if (nottoobad)
-				confface = l;
-			    }
-			}
-
-		      for (k = l+2; k <= nsuround+l-2; k++)
-			{
-			  if (mesh.BoundaryEdge (suroundpts[l],
-						 suroundpts[k % nsuround]))
-			    {
-			      /*
-			      *testout << "could improve edge conformity, bad1 = " << bad1
-				   << ", bad 2 = " << bad2 << ", nottoobad = " << nottoobad << endl;
-			      */
-			      if (nottoobad)
-				confedge = l;
-			    }
-			}
-		    }
-		}
-	      
-	      if (confedge != -1)
-		bestl = confedge;
-	      if (confface != -1)
-		bestl = confface;
-
-	      if (bestl != -1)
-		{
-		  // (*mycout) << nsuround << "->" << 2 * (nsuround-2) << " " << flush;
-		  cnt++;
-		  
-		  for (k = bestl+1; k <= nsuround + bestl - 2; k++)
-		    {
-		      int k1;
-
-		      hel[0] = suroundpts[bestl];
-		      hel[1] = suroundpts[k % nsuround];
-		      hel[2] = suroundpts[(k+1) % nsuround];
-		      hel[3] = pi2;
-		      hel.flags.illegal_valid = 0;
-
-		      /*
-		      (*testout) << nsuround << "-swap, new el,top = "
-				 << hel << endl;
-		      */
-		      mesh.AddVolumeElement (hel);
-		      for (k1 = 0; k1 < 4; k1++)
-			elementsonnode.Add (hel[k1], mesh.GetNE()-1);
-		      
-
-		      hel[2] = suroundpts[k % nsuround];
-		      hel[1] = suroundpts[(k+1) % nsuround];
-		      hel[3] = pi1;
-
-		      /*
-		      (*testout) << nsuround << "-swap, new el,bot = "
-				 << hel << endl;
-		      */
-
-		      mesh.AddVolumeElement (hel);
-		      for (k1 = 0; k1 < 4; k1++)
-			elementsonnode.Add (hel[k1], mesh.GetNE()-1);
-		    }		  
-		  
-		  for (k = 0; k < nsuround; k++)
-		    {
-		      Element & rel = mesh[hasbothpoints[k]];
-		      /*
-		      (*testout) << nsuround << "-swap, old el = "
-				 << rel << endl;
-		      */
-		      rel.Delete();
-		      for (int k1 = 0; k1 < 4; k1++)
-			rel[k1] = 0;
-		    }
-		}
-	    }
-	}
-
-      /*
-	if (onlybedges)
-	{
-	(*testout) << "bad tet: " 
-	<< volelements.Get(i)[0] 
-	<< volelements.Get(i)[1] 
-	<< volelements.Get(i)[2] 
-	<< volelements.Get(i)[3] << "\n";
-
-	if (!mesh.LegalTet (volelements.Get(i)))
-	cerr << "Illegal tet" << "\n";
-	}
-      */
-    }
-  //  (*mycout) << endl;
-
-  /*  
-      cout << "edgeused: ";
-      edgeused.PrintMemInfo(cout);
-  */
-  PrintMessage (5, cnt, " swaps performed");
-
-  mesh.Compress ();
-
-  /*
-  if (goal == OPT_QUALITY)
-    {
-      bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
-      //      (*testout) << "Total badness = " << bad1 << endl;
-    }
-  */
-
-  /*
-    for (i = 1; i <= GetNE(); i++)
-    if (volelements.Get(i)[0])
-    if (!mesh.LegalTet (volelements.Get(i)))
-    {
-    cout << "detected illegal tet, 2" << endl;
-    (*testout) << "detected illegal tet1: " << i << endl;
-    }
-  */
-
-  multithread.task = savetask;
-}
-  
-
-
-
-
-
-
-
-/*
-  2 -> 3 conversion
-*/
-
-
-
-void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
-{
-  int j, k, l;
-  ElementIndex ei, eli1, eli2, elnr;
-  SurfaceElementIndex sei;
-  PointIndex pi1, pi2, pi3, pi4, pi5;
-
-  int cnt = 0;
-
-  Element el21(TET), el22(TET), el31(TET), el32(TET), el33(TET);
-
-  double bad1, bad2;
-
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-
-  if (goal == OPT_CONFORM) return;
-
-  // contains at least all elements at node
-  TABLE<ElementIndex, PointIndex::BASE> elementsonnode(np); 
-  TABLE<SurfaceElementIndex, PointIndex::BASE> belementsonnode(np);
-
-  PrintMessage (3, "SwapImprove2 ");
-  (*testout) << "\n" << "Start SwapImprove2" << "\n";
-  //  TestOk();
-
-
-
-  /*
-    CalcSurfacesOfNode ();
-    for (i = 1; i <= GetNE(); i++)
-    if (volelements.Get(i)[0])
-    if (!mesh.LegalTet (volelements.Get(i)))
-    {
-    cout << "detected illegal tet, 1" << endl;
-    (*testout) << "detected illegal tet1: " << i << endl;
-    }
-  */
-
-  
-  // Calculate total badness
-
-  bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
-  (*testout) << "Total badness = " << bad1 << endl;
-  //  cout << "tot bad = " << bad1 << endl;
-
-  // find elements on node
-
-  for (ei = 0; ei < ne; ei++)
-    for (j = 0; j < mesh[ei].GetNP(); j++)
-      elementsonnode.Add (mesh[ei][j], ei);
-
-  for (sei = 0; sei < nse; sei++)
-    for (j = 0; j < 3; j++)
-      belementsonnode.Add (mesh[sei][j], sei);
-
-  for (eli1 = 0; eli1 < ne; eli1++)
-    {
-      if (multithread.terminate)
-	break;
-
-      if (mesh.ElementType (eli1) == FIXEDELEMENT)
-	continue;
-
-      if (mesh[eli1].GetType() != TET)
-	continue;
-
-      if ((goal == OPT_LEGAL) && 
-	  mesh.LegalTet (mesh[eli1]) &&
-	  CalcBad (mesh.Points(), mesh[eli1], 0) < 1e3)
-	continue;
-
-      // cout << "eli = " << eli1 << endl;
-      //      (*testout) << "swapimp2, eli = " << eli1 << "; el = " << mesh[eli1] << endl;
-
-      for (j = 0; j < 4; j++)
-	{
-	  // loop over faces
-      
-	  Element & elem = mesh[eli1];
-	  // if (elem[0] < PointIndex::BASE) continue;
-	  if (elem.IsDeleted()) continue;
-
-	  int mattyp = elem.GetIndex();
-	  
-	  switch (j)
-	    {
-	    case 0:
-	      pi1 = elem.PNum(1); pi2 = elem.PNum(2); 
-	      pi3 = elem.PNum(3); pi4 = elem.PNum(4);
-	      break;
-	    case 1:
-	      pi1 = elem.PNum(1); pi2 = elem.PNum(4); 
-	      pi3 = elem.PNum(2); pi4 = elem.PNum(3);
-	      break;
-	    case 2:
-	      pi1 = elem.PNum(1); pi2 = elem.PNum(3); 
-	      pi3 = elem.PNum(4); pi4 = elem.PNum(2);
-	      break;
-	    case 3:
-	      pi1 = elem.PNum(2); pi2 = elem.PNum(4); 
-	      pi3 = elem.PNum(3); pi4 = elem.PNum(1);
-	      break;
-	    }
-	  
-
-	  bool bface = 0;
-	  for (k = 0; k < belementsonnode[pi1].Size(); k++)
-	    {
-	      const Element2d & bel = 
-		mesh[belementsonnode[pi1][k]];
-
-	      bool bface1 = 1;
-	      for (l = 0; l < 3; l++)
-		if (bel[l] != pi1 && bel[l] != pi2 && bel[l] != pi3)
-		  {
-		    bface1 = 0;
-		    break;
-		  }
-
-	      if (bface1) 
-		{
-		  bface = 1;
-		  break;
-		}
-	    }
-	  
-	  if (bface) continue;
-
-
-	  FlatArray<ElementIndex> row = elementsonnode[pi1];
-	  for (k = 0; k < row.Size(); k++)
-	    {
-	      eli2 = row[k];
-
-	      // cout << "\rei1 = " << eli1 << ", pi1 = " << pi1 << ", k = " << k << ", ei2 = " << eli2 
-	      // << ", getne = " << mesh.GetNE();
-
-	      if ( eli1 != eli2 )
-		{
-		  Element & elem2 = mesh[eli2];
-		  if (elem2.IsDeleted()) continue;
-		  if (elem2.GetType() != TET)
-		    continue;
-		  
-		  int comnodes=0;
-		  for (l = 1; l <= 4; l++)
-		    if (elem2.PNum(l) == pi1 || elem2.PNum(l) == pi2 ||
-			elem2.PNum(l) == pi3)
-		      {
-			comnodes++;
-		      }
-		    else
-		      {
-			pi5 = elem2.PNum(l);
-		      }
-		  
-		  if (comnodes == 3)
-		    {
-		      bad1 = CalcBad (mesh.Points(), elem, 0) + 
-			CalcBad (mesh.Points(), elem2, 0); 
-		      
-		      if (!mesh.LegalTet(elem) || 
-			  !mesh.LegalTet(elem2))
-			bad1 += 1e4;
-
-		      
-		      el31.PNum(1) = pi1;
-		      el31.PNum(2) = pi2;
-		      el31.PNum(3) = pi5;
-		      el31.PNum(4) = pi4;
-		      el31.SetIndex (mattyp);
-		      
-		      el32.PNum(1) = pi2;
-		      el32.PNum(2) = pi3;
-		      el32.PNum(3) = pi5;
-		      el32.PNum(4) = pi4;
-		      el32.SetIndex (mattyp);
-		      
-		      el33.PNum(1) = pi3;
-		      el33.PNum(2) = pi1;
-		      el33.PNum(3) = pi5;
-		      el33.PNum(4) = pi4;
-		      el33.SetIndex (mattyp);
-		      
-		      bad2 = CalcBad (mesh.Points(), el31, 0) + 
-			CalcBad (mesh.Points(), el32, 0) +
-			CalcBad (mesh.Points(), el33, 0); 
-		      
-
-		      el31.flags.illegal_valid = 0;
-		      el32.flags.illegal_valid = 0;
-		      el33.flags.illegal_valid = 0;
-
-		      if (!mesh.LegalTet(el31) || 
-			  !mesh.LegalTet(el32) ||
-			  !mesh.LegalTet(el33))
-			bad2 += 1e4;
-
-
-		      bool do_swap = (bad2 < bad1);
-
-		      if ( ((bad2 < 1e6) || (bad2 < 10 * bad1)) &&
-			   mesh.BoundaryEdge (pi4, pi5))
-			do_swap = 1;
-			   
-		      if (do_swap)
-			{
-			  //			  cout << "do swap, eli1 = " << eli1 << "; eli2 = " << eli2 << endl;
-			  //			  (*mycout) << "2->3 " << flush;
-			  cnt++;
-
-			  el31.flags.illegal_valid = 0;
-			  el32.flags.illegal_valid = 0;
-			  el33.flags.illegal_valid = 0;
-
-			  mesh[eli1] = el31;
-			  mesh[eli2] = el32;
-			  
-			  ElementIndex neli =
-			    mesh.AddVolumeElement (el33);
-			  
-			  /*
-			    if (!LegalTet(el31) || !LegalTet(el32) ||
-			    !LegalTet(el33))
-			    {
-			    cout << "Swap to illegal tets !!!" << endl;
-			    }
-			  */
-			  // cout << "neli = " << neli << endl;
-			  for (l = 0; l < 4; l++)
-			    {
-			      elementsonnode.Add (el31[l], eli1);
-			      elementsonnode.Add (el32[l], eli2);
-			      elementsonnode.Add (el33[l], neli);
-			    }
-
-			  break;
-			}
-		    }
-		}
-	    }
-	}
-    }
-
-
-  PrintMessage (5, cnt, " swaps performed");
-
-
-
-  /*
-    CalcSurfacesOfNode ();
-    for (i = 1; i <= GetNE(); i++)
-    if (volelements.Get(i).PNum(1))
-    if (!LegalTet (volelements.Get(i)))
-    {
-    cout << "detected illegal tet, 2" << endl;
-    (*testout) << "detected illegal tet2: " << i << endl;
-    }
-  */
-
-
-  bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements());
-  (*testout) << "Total badness = " << bad1 << endl;
-  (*testout) << "swapimprove2 done" << "\n";
-  //  (*mycout) << "Vol = " << CalcVolume (points, volelements) << "\n";
-}
-
-
-/*
-  void Mesh :: SwapImprove2 (OPTIMIZEGOAL goal)
-  {
-  int i, j;
-  int eli1, eli2;
-  int mattyp;
-
-  Element el31(4), el32(4), el33(4);
-  double bad1, bad2;
-
-
-  INDEX_3_HASHTABLE<INDEX_2> elsonface (GetNE());
-
-  (*mycout) << "SwapImprove2 " << endl;
-  (*testout) << "\n" << "Start SwapImprove2" << "\n";
-
-  // Calculate total badness
-
-  if (goal == OPT_QUALITY)
-  {
-  double bad1 = CalcTotalBad (points, volelements);
-  (*testout) << "Total badness = " << bad1 << endl;
-  }
-
-  // find elements on node
-
-
-  Element2d face;
-  for (i = 1; i <= GetNE(); i++)
-  if ( (i > eltyps.Size()) || (eltyps.Get(i) != FIXEDELEMENT) )
-  {
-  const Element & el = VolumeElement(i);
-  if (!el.PNum(1)) continue;
-
-  for (j = 1; j <= 4; j++)
-  {
-  el.GetFace (j, face);
-  INDEX_3 i3 (face.PNum(1), face.PNum(2), face.PNum(3));
-  i3.Sort();
-
-
-  int bnr, posnr;
-  if (!elsonface.PositionCreate (i3, bnr, posnr))
-  {
-  INDEX_2 i2;
-  elsonface.GetData (bnr, posnr, i3, i2);
-  i2.I2() = i;
-  elsonface.SetData (bnr, posnr, i3, i2);
-  }
-  else
-  {
-  INDEX_2 i2 (i, 0);
-  elsonface.SetData (bnr, posnr, i3, i2);
-  }
-
-  //  	    if (elsonface.Used (i3))
-  //  	      {
-  //  		INDEX_2 i2 = elsonface.Get(i3);
-  //  		i2.I2() = i;
-  //  		elsonface.Set (i3, i2);
-  //  	      }
-  //  	    else
-  //  	      {
-  //  		INDEX_2 i2 (i, 0);
-  //  		elsonface.Set (i3, i2);
-  //  	      }
-
-  }
-  }
-
-  BitArray original(GetNE());
-  original.Set();
-
-  for (i = 1; i <= GetNSE(); i++)
-  {
-  const Element2d & sface = SurfaceElement(i);
-  INDEX_3 i3 (sface.PNum(1), sface.PNum(2), sface.PNum(3));
-  i3.Sort();
-  INDEX_2 i2(0,0);
-  elsonface.Set (i3, i2);
-  }
-
-
-  for (i = 1; i <= elsonface.GetNBags(); i++)
-  for (j = 1; j <= elsonface.GetBagSize(i); j++)
-  {
-  INDEX_3 i3;
-  INDEX_2 i2;
-  elsonface.GetData (i, j, i3, i2);
-
-
-  int eli1 = i2.I1();
-  int eli2 = i2.I2();
-
-  if (eli1 && eli2 && original.Test(eli1) && original.Test(eli2) )
-  {
-  Element & elem = volelements.Elem(eli1);
-  Element & elem2 = volelements.Elem(eli2);
-
-  int pi1 = i3.I1();
-  int pi2 = i3.I2();
-  int pi3 = i3.I3();
-
-  int pi4 = elem.PNum(1) + elem.PNum(2) + elem.PNum(3) + elem.PNum(4) - pi1 - pi2 - pi3;
-  int pi5 = elem2.PNum(1) + elem2.PNum(2) + elem2.PNum(3) + elem2.PNum(4) - pi1 - pi2 - pi3;
-
-
-
-
-
-
-  el31.PNum(1) = pi1;
-  el31.PNum(2) = pi2;
-  el31.PNum(3) = pi3;
-  el31.PNum(4) = pi4;
-  el31.SetIndex (mattyp);
-	    
-  if (WrongOrientation (points, el31))
-  swap (pi1, pi2);
-
-
-  bad1 = CalcBad (points, elem, 0) + 
-  CalcBad (points, elem2, 0); 
-	    
-  //	    if (!LegalTet(elem) || !LegalTet(elem2))
-  //	      bad1 += 1e4;
-
-	    
-  el31.PNum(1) = pi1;
-  el31.PNum(2) = pi2;
-  el31.PNum(3) = pi5;
-  el31.PNum(4) = pi4;
-  el31.SetIndex (mattyp);
-	    
-  el32.PNum(1) = pi2;
-  el32.PNum(2) = pi3;
-  el32.PNum(3) = pi5;
-  el32.PNum(4) = pi4;
-  el32.SetIndex (mattyp);
-		      
-  el33.PNum(1) = pi3;
-  el33.PNum(2) = pi1;
-  el33.PNum(3) = pi5;
-  el33.PNum(4) = pi4;
-  el33.SetIndex (mattyp);
-	    
-  bad2 = CalcBad (points, el31, 0) + 
-  CalcBad (points, el32, 0) +
-  CalcBad (points, el33, 0); 
-	    
-  //	    if (!LegalTet(el31) || !LegalTet(el32) ||
-  //		!LegalTet(el33))
-  //	      bad2 += 1e4;
-	    
-	    
-  int swap = (bad2 < bad1);
-
-  INDEX_2 hi2b(pi4, pi5);
-  hi2b.Sort();
-	    
-  if ( ((bad2 < 1e6) || (bad2 < 10 * bad1)) &&
-  boundaryedges->Used (hi2b) )
-  swap = 1;
-	    
-  if (swap)
-  {
-  (*mycout) << "2->3 " << flush;
-		
-  volelements.Elem(eli1) = el31;
-  volelements.Elem(eli2) = el32;
-  volelements.Append (el33);
-		
-  original.Clear (eli1);
-  original.Clear (eli2);
-  }
-  }
-  }
-  
-  (*mycout) << endl;
-
-  if (goal == OPT_QUALITY)
-  {
-  bad1 = CalcTotalBad (points, volelements);
-  (*testout) << "Total badness = " << bad1 << endl;
-  }
-
-  //  FindOpenElements ();
-
-  (*testout) << "swapimprove2 done" << "\n";
-  }
-
-*/
-}
diff --git a/contrib/Netgen/libsrc/meshing/improve3.hpp b/contrib/Netgen/libsrc/meshing/improve3.hpp
deleted file mode 100644
index 9b5b2c9bec97fe204c7056322105bedf112ec6a4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve3.hpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef FILE_IMPROVE3
-#define FILE_IMPROVE3
-
-
-
-
-///
-class MeshOptimize3d
-{
-public:
-  void CombineImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
-  void SplitImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
-  void SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
-  void SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
-};
-
-
-
-extern double CalcBad (const Mesh::T_POINTS & points, const Element & elem,
-		       double h);
-
-extern double CalcTotalBad (const Mesh::T_POINTS & points, 
-			    const Mesh::T_VOLELEMENTS & elements);
-
-extern int WrongOrientation (const Mesh::T_POINTS & points, const Element & el);
-
-
-/* Functional depending of inner point inside triangular surface */
-
-
-
-class PointFunction1 : public MinFunction
-{
-  Mesh::T_POINTS & points;
-  const ARRAY<INDEX_3> & faces;
-  double h;
-public:
-  PointFunction1 (Mesh::T_POINTS & apoints, 
-		  const ARRAY<INDEX_3> & afaces,
-		  double ah);
-  
-  virtual double Func (const Vector & x) const;
-  virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;
-  virtual double FuncGrad (const Vector & x, Vector & g) const;
-  virtual double GradStopping (const Vector & x) const;
-};
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/localh.cpp b/contrib/Netgen/libsrc/meshing/localh.cpp
deleted file mode 100644
index 62025737f32177af23b98b688e70b250af8977e0..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/localh.cpp
+++ /dev/null
@@ -1,682 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-
-GradingBox :: GradingBox (const double * ax1, const double * ax2)
-{
-  int i;
-
-  h2 = 0.5 * (ax2[0] - ax1[0]);
-  for (i = 0; i <= 2; i++)
-    {
-      /*
-      x1[i] = ax1[i];
-      x2[i] = ax2[i];
-      */
-      xmid[i] = 0.5 * (ax1[i] + ax2[i]);
-    }
-
-  /*
-  (*testout) << "new box: " << xmid[0] << "-" << xmid[1] << "-" << xmid[2] 
-	     << " h = " << (x2[0] - x1[0]) << endl;
-  */
-
-  for (i = 0; i < 8; i++)
-    childs[i] = NULL;
-  father = NULL;
-
-  flags.cutboundary = 0;
-  flags.isinner = 0;
-  flags.oldcell = 0;
-  flags.pinner = 0;
-
-  //  hopt = x2[0] - x1[0];
-  hopt = 2 * h2;
-}
-
-
-
-BlockAllocator GradingBox :: ball(sizeof (GradingBox));
-
-void * GradingBox :: operator new(size_t)
-{
-  return ball.Alloc();
-}
-
-void GradingBox :: operator delete (void * p)
-{
-  ball.Free (p);
-}
-
-
-
-
-
-
-
-void GradingBox :: DeleteChilds()
-{
-  int i;
-  for (i = 0; i < 8; i++)
-    if (childs[i])
-      {
-	childs[i]->DeleteChilds();
-	delete childs[i];
-	childs[i] = NULL;
-      }
-}
-
-
-LocalH :: LocalH (const Point3d & pmin, const Point3d & pmax, double agrading)
-{
-  double x1[3], x2[3];
-  double hmax;
-  int i;
-
-  boundingbox = Box3d (pmin, pmax);
-  grading = agrading;
-
-  // a small enlargement, non-regular points 
-  double val = 0.0879;
-  for (i = 1; i <= 3; i++)
-    {
-
-      x1[i-1] = (1 + val * i) * pmin.X(i) - val * i * pmax.X(i);
-      x2[i-1] = 1.1 * pmax.X(i) - 0.1 * pmin.X(i);
-    }
-
-  hmax = x2[0] - x1[0];
-  for (i = 1; i <= 2; i++)
-    if (x2[i] - x1[i] > hmax)
-      hmax = x2[i] - x1[i];
-
-  for (i = 0; i <= 2; i++)
-    x2[i] = x1[i] + hmax;
-
-  root = new GradingBox (x1, x2);
-  boxes.Append (root);
-}
-
-LocalH :: ~LocalH ()
-{
-  root->DeleteChilds();
-  delete root;
-}
-
-void LocalH :: Delete ()
-{
-  root->DeleteChilds();
-}
-
-void LocalH :: SetH (const Point3d & p, double h)
-{
-  /*
-  (*testout) << "Set h at " << p << " to " << h << endl;
-  if (h < 1e-8)
-    {
-      cout << "do not set h to " << h << endl;
-      return;
-    }
-  */
-
-  if (fabs (p.X() - root->xmid[0]) > root->h2 ||
-      fabs (p.Y() - root->xmid[1]) > root->h2 ||
-      fabs (p.Z() - root->xmid[2]) > root->h2)
-    return;
-
-  /*      
-  if (p.X() < root->x1[0] || p.X() > root->x2[0] ||
-      p.Y() < root->x1[1] || p.Y() > root->x2[1] ||
-      p.Z() < root->x1[2] || p.Z() > root->x2[2])
-    return;
-  */
-
-
-  if (GetH(p) <= 1.2 * h) return;
-
-
-  GradingBox * box = root;
-  GradingBox * nbox = root;
-  GradingBox * ngb;
-  int childnr;
-  double x1[3], x2[3];
-
-  while (nbox)
-    {
-      box = nbox;
-      childnr = 0;
-      if (p.X() > box->xmid[0]) childnr += 1;
-      if (p.Y() > box->xmid[1]) childnr += 2;
-      if (p.Z() > box->xmid[2]) childnr += 4;
-      nbox = box->childs[childnr];
-    };
-
-
-  while (2 * box->h2 > h)
-    {
-      childnr = 0;
-      if (p.X() > box->xmid[0]) childnr += 1;
-      if (p.Y() > box->xmid[1]) childnr += 2;
-      if (p.Z() > box->xmid[2]) childnr += 4;
-
-      double h2 = box->h2;
-      if (childnr & 1)
-	{
-	  x1[0] = box->xmid[0];
-	  x2[0] = x1[0]+h2;   // box->x2[0];
-	}
-      else
-	{
-	  x2[0] = box->xmid[0];
-	  x1[0] = x2[0]-h2;   // box->x1[0];
-	}
-
-      if (childnr & 2)
-	{
-	  x1[1] = box->xmid[1];
-	  x2[1] = x1[1]+h2;   // box->x2[1];
-	}
-      else
-	{
-	  x2[1] = box->xmid[1];
-	  x1[1] = x2[1]-h2;   // box->x1[1];
-	}
-
-      if (childnr & 4)
-	{
-	  x1[2] = box->xmid[2];
-	  x2[2] = x1[2]+h2;  // box->x2[2];
-	}
-      else
-	{
-	  x2[2] = box->xmid[2];
-	  x1[2] = x2[2]-h2;  // box->x1[2];
-	}
-
-      ngb = new GradingBox (x1, x2);
-      box->childs[childnr] = ngb;
-      ngb->father = box;
-
-      boxes.Append (ngb);
-      box = box->childs[childnr];
-    }
-
-  box->hopt = h;
-
-
-  double hbox = 2 * box->h2;  // box->x2[0] - box->x1[0];
-  double hnp = h + grading * hbox;
-
-  Point3d np;
-  int i;
-  for (i = 1; i <= 3; i++)
-    {
-      np = p;
-      np.X(i) = p.X(i) + hbox;
-      SetH (np, hnp);
-
-      np.X(i) = p.X(i) - hbox;
-      SetH (np, hnp);
-    }
-  /*
-  Point3d np;
-  int i1, i2, i3;
-  for (i1 = -1; i1 <= 1; i1++)
-    for (i2 = -1; i2 <= 1; i2++)
-      for (i3 = -1; i3 <= 1; i3++)
-	{
-	  np.X() = p.X() + hbox * i1;
-	  np.Y() = p.Y() + hbox * i2;
-	  np.Z() = p.Z() + hbox * i3;
-
-	  SetH (np, hnp);
-	}
-  */
-}
-
-
-
-double LocalH :: GetH (const Point3d & x) const
-{
-  const GradingBox * box = root;
-  const GradingBox * nbox;
-  int childnr;
-
-  while (1)
-    {
-      childnr = 0;
-      if (x.X() > box->xmid[0]) childnr += 1;
-      if (x.Y() > box->xmid[1]) childnr += 2;
-      if (x.Z() > box->xmid[2]) childnr += 4;
-      nbox = box->childs[childnr];
-      if (nbox)
-	box = nbox;
-      else
-	{
-	  //	  (*testout) << "diam = " << (box->x2[0] - box->x1[0])
-	  //		     << " h = " << box->hopt << endl;
-	  return box->hopt;
-	}
-    }
-}
-
-
-/// minimal h in box (pmin, pmax)
-double LocalH :: GetMinH (const Point3d & pmin, const Point3d & pmax) const
-{ 
-  Point3d pmin2, pmax2;
-  for (int j = 1; j <= 3; j++)
-    if (pmin.X(j) < pmax.X(j))
-      { pmin2.X(j) = pmin.X(j); pmax2.X(j) = pmax.X(j); }
-    else
-      { pmin2.X(j) = pmax.X(j); pmax2.X(j) = pmin.X(j); }
-
-  return GetMinHRec (pmin2, pmax2, root); 
-}
-
-
-double LocalH :: GetMinHRec (const Point3d & pmin, const Point3d & pmax,
-			     const GradingBox * box) const
-{
-  double h2 = box->h2;
-  if (pmax.X() < box->xmid[0]-h2 || pmin.X() > box->xmid[0]+h2 ||
-      pmax.Y() < box->xmid[1]-h2 || pmin.Y() > box->xmid[1]+h2 ||
-      pmax.Z() < box->xmid[2]-h2 || pmin.Z() > box->xmid[2]+h2)
-    return 1e8;
-  /*
-  if (pmax.X() < box->x1[0] || pmin.X() > box->x2[0] ||
-      pmax.Y() < box->x1[1] || pmin.Y() > box->x2[1] ||
-      pmax.Z() < box->x1[2] || pmin.Z() > box->x2[2])
-    return 1e8;
-  */
-
-      
-  double hmin = 2 * box->h2; // box->x2[0] - box->x1[0];
-  int i;
-  
-  for (i = 0; i <= 7; i++)
-    {
-      if (box->childs[i])
-	{
-	  double hi = GetMinHRec (pmin, pmax, box->childs[i]);
-	  if (hi < hmin)
-	    hmin = hi;
-	}	  
-    }
-
-  return hmin;
-}
-
-
-void LocalH :: CutBoundaryRec (const Point3d & pmin, const Point3d & pmax,
-			       GradingBox * box)
-{
-  double h2 = box->h2;
-  if (pmax.X() < box->xmid[0]-h2 || pmin.X() > box->xmid[0]+h2 ||
-      pmax.Y() < box->xmid[1]-h2 || pmin.Y() > box->xmid[1]+h2 ||
-      pmax.Z() < box->xmid[2]-h2 || pmin.Z() > box->xmid[2]+h2)
-    return;
-  /*
-  if (pmax.X() < box->x1[0] || pmin.X() > box->x2[0] ||
-      pmax.Y() < box->x1[1] || pmin.Y() > box->x2[1] ||
-      pmax.Z() < box->x1[2] || pmin.Z() > box->x2[2])
-    return;
-  */
-
-  box->flags.cutboundary = 1;
-  for (int i = 0; i < 8; i++)
-    if (box->childs[i])
-      CutBoundaryRec (pmin, pmax, box->childs[i]);
-}
-
-
-
-
-void LocalH :: FindInnerBoxes ( // int (*sameside)(const Point3d & p1, const Point3d & p2),
-			       AdFront3 * adfront,
-			       int (*testinner)(const Point3d & p1))
-{
-  int i, j;
-
-  int nf = adfront->GetNF();
-
-  for (i = 0; i < boxes.Size(); i++)
-    boxes[i] -> flags.isinner = 0;
-
-  root->flags.isinner = 0;
-
-  Point3d rpmid(root->xmid[0], root->xmid[1], root->xmid[2]);
-  Vec3d rv(root->h2, root->h2, root->h2);
-  Point3d rx2 = rpmid + rv;
-  Point3d rx1 = rpmid - rv;
-
-
-  root->flags.pinner = !adfront->SameSide (rpmid, rx2);
-  
-  if (testinner)
-    (*testout) << "inner = " << root->flags.pinner << " =?= " 
-	       << testinner(Point3d(root->xmid[0], root->xmid[1], root->xmid[2])) << endl;
-  
-  ARRAY<int> faceinds(nf);
-  ARRAY<Box3d> faceboxes(nf);
-
-  for (i = 1; i <= nf; i++)
-    {
-      faceinds.Elem(i) = i;
-      adfront->GetFaceBoundingBox(i, faceboxes.Elem(i));
-    }
-  
-  for (i = 0; i < 8; i++)
-    FindInnerBoxesRec2 (root->childs[i], adfront, faceboxes, faceinds, nf);
-}
-
-
-void LocalH :: 
-FindInnerBoxesRec2 (GradingBox * box,
-		    class AdFront3 * adfront, 
-		    ARRAY<Box3d> & faceboxes,
-		    ARRAY<int> & faceinds, int nfinbox)
-{
-  if (!box) return;
-  
-  int i, j;
-  
-  GradingBox * father = box -> father;
-  
-  Point3d c(box->xmid[0], box->xmid[1], box->xmid[2]);
-  Vec3d v(box->h2, box->h2, box->h2);
-  Box3d boxc(c-v, c+v);
-
-  Point3d fc(father->xmid[0], father->xmid[1], father->xmid[2]);
-  Vec3d fv(father->h2, father->h2, father->h2);
-  Box3d fboxc(fc-fv, fc+fv);
-
-  Box3d boxcfc(c,fc);
-
-
-  static ARRAY<int> faceused;
-  static ARRAY<int> faceused2;
-  static ARRAY<int> facenotused;
-
-  faceused.SetSize(0);
-  facenotused.SetSize(0);
-  faceused2.SetSize(0);
-
-  for (j = 1; j <= nfinbox; j++)
-    {
-      //      adfront->GetFaceBoundingBox (faceinds.Get(j), facebox);
-      const Box3d & facebox = faceboxes.Get(faceinds.Get(j));
-  
-      if (boxc.Intersect (facebox))
-	faceused.Append(faceinds.Get(j));
-      else
-	facenotused.Append(faceinds.Get(j));
-
-      if (boxcfc.Intersect (facebox))
-	faceused2.Append (faceinds.Get(j));
-    }
-  
-  for (j = 1; j <= faceused.Size(); j++)
-    faceinds.Elem(j) = faceused.Get(j);
-  for (j = 1; j <= facenotused.Size(); j++)
-    faceinds.Elem(j+faceused.Size()) = facenotused.Get(j);
-
-  
-  if (!father->flags.cutboundary)
-    {
-      box->flags.isinner = father->flags.isinner;
-      box->flags.pinner = father->flags.pinner;
-    }
-  else
-    {
-      Point3d cf(father->xmid[0], father->xmid[1], father->xmid[2]);
-      
-      if (father->flags.isinner)
-	box->flags.pinner = 1;
-      else
-	{
-	  if (adfront->SameSide (c, cf, &faceused2))
-	    box->flags.pinner = father->flags.pinner;
-	  else
-	    box->flags.pinner = 1 - father->flags.pinner;
-	}
-      
-      if (box->flags.cutboundary)
-	box->flags.isinner = 0;
-      else
-	box->flags.isinner = box->flags.pinner;
-    }
-
-  int nf = faceused.Size();
-  for (i = 0; i < 8; i++)
-    FindInnerBoxesRec2 (box->childs[i], adfront, faceboxes, faceinds, nf);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-/*
-void LocalH :: FindInnerBoxes ( // int (*sameside)(const Point3d & p1, const Point3d & p2),
-			       AdFront3 * adfront,
-			       int (*testinner)(const Point3d & p1))
-{
-  int i;
-  for (i = 1; i <= boxes.Size(); i++)
-    boxes.Elem(i)->flags.isinner = 0;
-
-  root->flags.isinner = 0;
-
-  Point3d rpmid(root->xmid[0], root->xmid[1], root->xmid[2]);
-  Point3d rx2 = rpmid + Vec3d (root->h2, root->h2, root->h2);
-
-  root->flags.pinner = !adfront->SameSide (rpmid, rx2);
-  
-  if (testinner)
-    (*testout) << "inner = " << root->flags.pinner << " =?= " 
-	       << testinner(Point3d(root->xmid[0], root->xmid[1], root->xmid[2])) << endl;
-  
-
-  for (i = 2; i <= boxes.Size(); i++)
-    {
-      GradingBox * box = boxes.Elem(i);
-      GradingBox * father = box -> father;
-
-      Point3d c(box->xmid[0], box->xmid[1], box->xmid[2]);
-      Vec3d v(box->h2, box->h2, box->h2);
-      Point3d x1 = c-v;
-      Point3d x2 = c+v;
-
-
-      if (!father->flags.cutboundary)
-	{
-	  box->flags.isinner = father->flags.isinner;
-	  box->flags.pinner = father->flags.pinner;
-	}
-      else
-	{
-	  Point3d cf(father->xmid[0], father->xmid[1], father->xmid[2]);
-
-	  if (father->flags.isinner)
-	    box->flags.pinner = 1;
-	  else
-	    {
-	      if (adfront->SameSide (c, cf))
-		box->flags.pinner = father->flags.pinner;
-	      else
-		box->flags.pinner = 1 - father->flags.pinner;
-	    }
-
-	  if (box->flags.cutboundary)
-	    box->flags.isinner = 0;
-	  else
-	    box->flags.isinner = box->flags.pinner;
-	}
-    }
-  //  FindInnerBoxesRec (inner, root);
-}
-*/
-
-
-void LocalH :: FindInnerBoxesRec ( int (*inner)(const Point3d & p),
-				   GradingBox * box)
-{
-  int i;
-  if (box->flags.cutboundary)
-    {
-      for (i = 0; i < 8; i++)
-	if (box->childs[i])
-	  FindInnerBoxesRec (inner, box->childs[i]);
-    }
-  else
-    {
-      if (inner (Point3d (box->xmid[0], box->xmid[1], box->xmid[2])))
-	SetInnerBoxesRec (box);
-    }
-}
-
-
-void LocalH :: SetInnerBoxesRec (GradingBox * box)
-{
-  box->flags.isinner = 1;
-  for (int i = 0; i < 8; i++)
-    if (box->childs[i])
-      ClearFlagsRec (box->childs[i]);
-}
-
-void LocalH :: ClearFlagsRec (GradingBox * box)
-{
-  box->flags.cutboundary = 0;
-  box->flags.isinner = 0;
-  for (int i = 0; i < 8; i++)
-    if (box->childs[i])
-      ClearFlagsRec (box->childs[i]);
-}
-
-
-void LocalH :: WidenRefinement ()
-{
-  int nb = boxes.Size(); 
-  int i;
-  //  (*testout) << "old boxes: " << nb << endl;
-  for (i = 1; i <= nb; i++)
-    {
-      GradingBox * box = boxes.Get(i);
-      //      double h = box->x2[0] - box->x1[0];
-      double h = box->hopt;
-      Point3d c(box->xmid[0], box->xmid[1], box->xmid[2]);
-      //      (*testout) << " i = " << i 
-      //		 << " c = " << c << " h = " << h << endl;
-
-      for (int i1 = -1; i1 <= 1; i1++)
-	for (int i2 = -1; i2 <= 1; i2++)
-	  for (int i3 = -1; i3 <= 1; i3++)
-	    SetH (Point3d (c.X() + i1 * h, 
-			   c.Y() + i2 * h,
-			   c.Z() + i3 * h), 1.001 * h);     
-    }
-}
-
-void LocalH :: GetInnerPoints (ARRAY<Point3d> & points)
-{
-  int i, nb = boxes.Size(); 
-
-  for (i = 1; i <= nb; i++)
-    {
-      GradingBox * box = boxes.Get(i);
-      /*
-      if (box->flags.pinner)
-	points.Append (box->randomip);
-      */
-      //      if (box->flags.pinner)
-      if (box->flags.isinner)
-	{
-	  Point3d c(box->xmid[0], box->xmid[1], box->xmid[2]);
-	  points.Append (c);
-	  /*
-	  cout << "add point " << c << "; h = " << box->hopt
-	       << "; max-min = " << (box->x2[0]-box->x1[0]) << endl;
-	  */
-	}
-    }
-}
-
-
-
-void LocalH :: GetOuterPoints (ARRAY<Point3d> & points)
-{
-  int i, nb = boxes.Size(); 
-
-  for (i = 1; i <= nb; i++)
-    {
-      GradingBox * box = boxes.Get(i);
-      if (!box->flags.isinner &&
-	  !box->flags.cutboundary)
-	{
-	  Point3d c(box->xmid[0], box->xmid[1], box->xmid[2]);
-	  points.Append (c);
-	}
-    }
-}
-
-
-
-void LocalH :: Convexify ()
-{
-  ConvexifyRec (root);
-}
-
-void LocalH :: ConvexifyRec (GradingBox * box)
-{
-  Point3d center(box->xmid[0], box->xmid[1], box->xmid[2]);
-  Point3d hp;
-
-  double size = 2 * box->h2; // box->x2[0] - box->x1[0];
-  double dx = 0.6 * size;
-
-  double maxh = box->hopt;
-  int i;
-
-  
-  
-  for (i = 1; i <= 6; i++)
-    {
-      hp = center;
-      switch (i)
-	{
-	case 1: hp.X() += dx; break;
-	case 2: hp.X() -= dx; break;
-	case 3: hp.Y() += dx; break;
-	case 4: hp.Y() -= dx; break;
-	case 5: hp.Z() += dx; break;
-	case 6: hp.Z() -= dx; break;
-	}
-      
-      double hh = GetH (hp);
-      if (hh > maxh) maxh = hh;
-    }
-
-  if (maxh < 0.95 * box->hopt)
-    SetH (center, maxh);
-
-  for (i = 0; i < 8; i++)
-    if (box->childs[i])
-      ConvexifyRec (box->childs[i]);  
-}
-
-void LocalH :: PrintMemInfo (ostream & ost) const
-{
-  ost << "LocalH: " << boxes.Size() << " boxes of " << sizeof(GradingBox)
-      << " bytes = " << boxes.Size()*sizeof(GradingBox) << " bytes" << endl;
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/localh.hpp b/contrib/Netgen/libsrc/meshing/localh.hpp
deleted file mode 100644
index 7531bc7faf8b71107857cd19606e6cb7764e71b8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/localh.hpp
+++ /dev/null
@@ -1,145 +0,0 @@
-#ifndef LOCALH
-#define LOCALH
-
-/**************************************************************************/
-/* File:   localh.hh                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   29. Jan. 97                                                    */
-/**************************************************************************/
-
-
-
-
-/// box for grading
-class GradingBox
-{
-  /*
-  /// xmin
-  float x1[3];
-  /// xmax
-  float x2[3];
-  */
-  /// xmid
-  float xmid[3];
-  /// half edgelength
-  float h2;
-  ///
-  GradingBox * childs[8];
-  ///
-  GradingBox * father;
-  ///
-  double hopt;
-  ///
-  struct 
-  {
-    unsigned int cutboundary:1;
-    unsigned int isinner:1;
-    unsigned int oldcell:1;
-    unsigned int pinner:1;
-  } flags;
-public:
-  ///
-  GradingBox (const double * ax1, const double * ax2);
-  ///
-  void DeleteChilds();
-  ///
-  friend class LocalH;
-
-
-  static BlockAllocator ball;
-  void * operator new(size_t);
-  void operator delete (void *);
-};
-
-
-
-/**
-   Control of 3D mesh grading
- */
-class LocalH 
-{
-  ///
-  GradingBox * root;
-  ///
-  double grading;
-  ///
-  ARRAY<GradingBox*> boxes;
-  ///
-  Box3d boundingbox;
-public:
-  ///
-  LocalH (const Point3d & pmin, const Point3d & pmax, double grading);
-  ///
-  ~LocalH();
-  ///
-  void Delete();
-  ///
-  void SetGrading (double agrading) { grading = agrading; }
-  ///
-  void SetH (const Point3d & x, double h);
-  ///
-  double GetH (const Point3d & x) const;
-  /// minimal h in box (pmin, pmax)
-  double GetMinH (const Point3d & pmin, const Point3d & pmax) const;
-
-  /// mark boxes intersecting with boundary-box
-  void CutBoundary (const Point3d & pmin, const Point3d & pmax)
-    { CutBoundaryRec (pmin, pmax, root); }
-
-  /// find inner boxes
-  void FindInnerBoxes ( // int (*sameside)(const Point3d & p1, const Point3d & p2),
-		       class AdFront3 * adfront,
-		       int (*testinner)(const Point3d & p1));
-
-  /// clears all flags 
-  void ClearFlags ()
-    { ClearFlagsRec(root); }
-
-  /// widen refinement zone
-  void WidenRefinement ();
-
-  /// get points in inner elements
-  void GetInnerPoints (ARRAY<Point3d> & points);
-
-  /// get points in outer closure
-  void GetOuterPoints (ARRAY<Point3d> & points);
-
-  ///
-  void Convexify ();
-  ///
-  int GetNBoxes () { return boxes.Size(); } 
-  const Box3d & GetBoundingBox () const
-  { return boundingbox; }
-  ///
-  void PrintMemInfo (ostream & ost) const;
-private:
-  /// 
-  double GetMinHRec (const Point3d & pmin, const Point3d & pmax,
-		     const GradingBox * box) const;
-  ///
-  void CutBoundaryRec (const Point3d & pmin, const Point3d & pmax,
-		       GradingBox * box);
-
-  ///
-  void FindInnerBoxesRec ( int (*inner)(const Point3d & p),
-			   GradingBox * box);
-
-  ///
-  void FindInnerBoxesRec2 (GradingBox * box,
-			   class AdFront3 * adfront,
-			   ARRAY<Box3d> & faceboxes,
-			   ARRAY<int> & finds, int nfinbox);
-
-
-  ///
-  void SetInnerBoxesRec (GradingBox * box);
-
-  ///
-  void ClearFlagsRec (GradingBox * box);
-  
-  ///
-  void ConvexifyRec (GradingBox * box);
-};
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/meshclass.cpp b/contrib/Netgen/libsrc/meshing/meshclass.cpp
deleted file mode 100644
index 25c44f337e20539ecdaa77efbef66a65fc1b4996..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshclass.cpp
+++ /dev/null
@@ -1,4744 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-  Mesh :: Mesh ()
-  {
-    boundaryedges = NULL;
-    surfelementht = NULL; 
-    segmentht = NULL;
-
-    lochfunc = NULL;
-    mglevels = 1;
-    elementsearchtree = NULL;
-    elementsearchtreets = NextTimeStamp();
-    majortimestamp = timestamp = NextTimeStamp();
-    hglob = 1e10;
-    numvertices = -1;
-    dimension = 3;
-    topology = new MeshTopology (*this);
-    curvedelems = new CurvedElements (*this);
-    clusters = new AnisotropicClusters (*this);
-    ident = new Identifications (*this);
-
-    hpelements = NULL;
-    coarsemesh = NULL;
-
-  }
-
-  Mesh :: ~Mesh()
-  {
-    delete lochfunc;
-    delete boundaryedges;
-    delete surfelementht;
-    delete segmentht;
-    delete curvedelems;
-    delete clusters;
-    delete topology;
-    delete ident;
-
-    delete coarsemesh;
-    delete hpelements;
-    
-    for (int i = 0; i < materials.Size(); i++)
-      delete [] materials[i];
-  }
-
-
-  Mesh & Mesh :: operator= (const Mesh & mesh2)
-  {
-    points = mesh2.points;
-    eltyps = mesh2.eltyps;
-    segments = mesh2.segments;
-    surfelements = mesh2.surfelements;
-    volelements = mesh2.volelements;
-    lockedpoints = mesh2.lockedpoints;
-    facedecoding = mesh2.facedecoding;
-    dimension = mesh2.dimension;
-    return *this;
-  }
-
-  void Mesh :: DeleteMesh()
-  {
-    points.SetSize(0);
-    // ptyps.SetSize(0);
-    segments.SetSize(0);
-    surfelements.SetSize(0);
-    volelements.SetSize(0);
-    lockedpoints.SetSize(0);
-    surfacesonnode.SetSize(0);
-
-    delete boundaryedges;
-    boundaryedges = NULL;
-
-    openelements.SetSize(0);
-    facedecoding.SetSize(0);
-
-    // ident -> Delete();
-    delete ident;
-    ident = new Identifications (*this);
-    delete topology;
-    topology = new MeshTopology (*this);
-    delete curvedelems;
-    curvedelems = new CurvedElements (*this);
-    delete clusters;
-    clusters = new AnisotropicClusters (*this);
-
-    timestamp = NextTimeStamp();
-  }
-
-
-
-  PointIndex Mesh :: AddPoint (const Point3d & p, int layer)
-  { 
-    NgLock lock(mutex);
-    lock.Lock();
-
-    timestamp = NextTimeStamp();
-
-    PointIndex pi = points.Size() + PointIndex::BASE;
-    points.Append ( MeshPoint (p, layer, INNERPOINT) ); 
-
-    lock.UnLock();
-
-    return pi;
-  }
-
-
-  SegmentIndex Mesh :: AddSegment (const Segment & s)
-  { 
-    NgLock lock(mutex);	
-    lock.Lock();
-    timestamp = NextTimeStamp();
-
-    int maxn = max2 (s.p1, s.p2);
-    maxn += 1-PointIndex::BASE;
-
-    /*
-      if (maxn > ptyps.Size())
-      {
-      int maxo = ptyps.Size();
-      ptyps.SetSize (maxn);
-      for (int i = maxo; i < maxn; i++)
-      ptyps[i] = INNERPOINT;
-      }
-
-      if (ptyps[s.p1] > EDGEPOINT) ptyps[s.p1] = EDGEPOINT;
-      if (ptyps[s.p2] > EDGEPOINT) ptyps[s.p2] = EDGEPOINT;
-    */
-
-    if (maxn <= points.Size())
-      {
-	if (points[s.p1].Type() > EDGEPOINT)
-	  points[s.p1].SetType (EDGEPOINT);
-	if (points[s.p2].Type() > EDGEPOINT)
-	  points[s.p2].SetType (EDGEPOINT);
-      }
-    /*
-      else
-      {
-      cerr << "edge points nrs > points.Size" << endl;
-      }
-    */
-
-    SegmentIndex si = segments.Size();
-    segments.Append (s); 
-  
-    lock.UnLock();
-    return si;
-  }
-
-  SurfaceElementIndex Mesh :: AddSurfaceElement (const Element2d & el)
-  {     
-    NgLock lock(mutex);
-    lock.Lock();
-    timestamp = NextTimeStamp();
-
-    int maxn = el[0];
-    for (int i = 1; i < el.GetNP(); i++)
-      if (el[i] > maxn) maxn = el[i];
-
-    maxn += 1-PointIndex::BASE;
-
-    /*
-      if (maxn > ptyps.Size())
-      {
-      int maxo = ptyps.Size();
-      ptyps.SetSize (maxn);
-      for (i = maxo+PointIndex::BASE; 
-      i < maxn+PointIndex::BASE; i++)
-      ptyps[i] = INNERPOINT;
-      
-      }
-    */
-    if (maxn <= points.Size())
-      {
-	for (int i = 0; i < el.GetNP(); i++)
-	  if (points[el[i]].Type() > SURFACEPOINT)
-	    points[el[i]].SetType(SURFACEPOINT);
-      }
-    /*
-      else
-      {
-      cerr << "surf points nrs > points.Size" << endl;      
-      }
-    */
-
-    SurfaceElementIndex si = surfelements.Size();
-    surfelements.Append (el); 
-
-    lock.UnLock();
-    return si;
-  }
-
-
-  ElementIndex Mesh :: AddVolumeElement (const Element & el)
-  { 
-    NgLock lock(mutex);
-    lock.Lock();
-
-    int maxn = el[0];
-    for (int i = 1; i < el.GetNP(); i++)
-      if (el[i] > maxn) maxn = el[i];
-
-    maxn += 1-PointIndex::BASE;
-
-    /*
-      if (maxn > ptyps.Size())
-      {
-      int maxo = ptyps.Size();
-      ptyps.SetSize (maxn);
-      for (i = maxo+PointIndex::BASE; 
-      i < maxn+PointIndex::BASE; i++)
-      ptyps[i] = INNERPOINT;
-      }
-    */
-    /*
-      if (maxn > points.Size())
-      {
-      cerr << "add vol element before point" << endl;
-      }
-    */
-
-    int ve = volelements.Size();
-
-    volelements.Append (el); 
-    volelements.Last().flags.illegal_valid = 0;
-
-    while (volelements.Size() > eltyps.Size())
-      eltyps.Append (FREEELEMENT);
-  
-    timestamp = NextTimeStamp();
-
-    lock.UnLock();
-    return ve;
-  }
-
-
-
-
-
-
-  void Mesh :: Save (const string & filename) const
-  {
-    int i, j;
-
-    double scale = 1;  // globflags.GetNumFlag ("scale", 1);
-    int inverttets = 0;  // globflags.GetDefineFlag ("inverttets");
-    int invertsurf = 0;  // globflags.GetDefineFlag ("invertsurfacemesh");
-
-    ofstream outfile(filename.c_str());
-
-
-    outfile << "mesh3d" << "\n";
-
-    outfile << "dimension\n" << GetDimension() << "\n";
-
-    outfile << "\n";
-    outfile << "# surfnr    bcnr   domin  domout      np      p1      p2      p3"
-	    << "\n";
-
-    outfile << "surfaceelementsgi" << "\n";
-    //  outfile << "surfaceelements" << "\n";
-    outfile << GetNSE() << "\n";
-
-    SurfaceElementIndex sei;
-    for (sei = 0; sei < GetNSE(); sei++)
-      {
-	if ((*this)[sei].GetIndex())
-	  {
-	    outfile.width(8);
-	    outfile << GetFaceDescriptor((*this)[sei].GetIndex ()).SurfNr()+1;
-	    outfile.width(8);
-	    outfile << GetFaceDescriptor((*this)[sei].GetIndex ()).BCProperty();
-	    outfile.width(8);	  
-	    outfile << GetFaceDescriptor((*this)[sei].GetIndex ()).DomainIn();
-	    outfile.width(8);	  
-	    outfile << GetFaceDescriptor((*this)[sei].GetIndex ()).DomainOut();
-	  }
-	else
-	  outfile << "       0       0       0";
-
-
-	Element2d sel = (*this)[sei];
-	if (invertsurf)
-	  sel.Invert();
-
-	outfile.width(8);
-	outfile << sel.GetNP();
-
-	for (j = 0; j < sel.GetNP(); j++)
-	  {
-	    outfile.width(8);	  
-	    outfile << sel[j];
-	  }
-
-	for (j = 1; j <= sel.GetNP(); j++)
-	  {
-	    outfile.width(7);	  
-	    outfile << " " << sel.GeomInfoPi(j).trignum;
-	  }
-	outfile << endl;
-      }
-
-    outfile << "\n" << "\n";
-    outfile << "#  matnr      np      p1      p2      p3      p4" << "\n";
-    outfile << "volumeelements" << "\n";
-    outfile << GetNE() << "\n";
-
-    for (ElementIndex ei = 0; ei < GetNE(); ei++)
-      {
-	outfile.width(8);
-	outfile << (*this)[ei].GetIndex();
-	outfile.width(8);
-	outfile << (*this)[ei].GetNP();
-
-	Element el = (*this)[ei];
-	if (inverttets)
-	  el.Invert();
-
-	for (j = 0; j < el.GetNP(); j++)
-	  {
-	    outfile.width(8);
-	    outfile << el[j];
-	  }
-	outfile << "\n";
-      }
-
-
-    outfile << "\n" << "\n";
-    outfile << "   surf1   surf2      p1      p2" << "\n";
-    outfile << "edgesegmentsgi2" << "\n";
-    outfile << GetNSeg() << "\n";
-
-    for (i = 1; i <= GetNSeg(); i++)
-      {
-	const Segment & seg = LineSegment (i);
-	outfile.width(8);
-	outfile << seg.si;
-	outfile.width(8);
-	outfile << 0;
-	outfile.width(8);
-	outfile << seg.p1;
-	outfile.width(8);
-	outfile << seg.p2;
-	outfile << " ";
-	outfile.width(8);
-	outfile << seg.geominfo[0].trignum;
-	outfile << " ";
-	outfile.width(8);
-	outfile << seg.geominfo[1].trignum << endl;
-
-	outfile << " ";
-	outfile.width(8);
-	outfile << seg.surfnr1+1;
-	outfile << " ";
-	outfile.width(8);
-	outfile << seg.surfnr2+1;
-	outfile << " ";
-	outfile.width(8);
-	outfile << seg.edgenr;
-	//      outfile << seg.epgeominfo[0].edgenr;
-	/*
-	  outfile.width(8);
-	  outfile << seg.epgeominfo[0].lefttrig;
-	  outfile.width(8);
-	  outfile << seg.epgeominfo[0].righttrig;
-	*/
-	outfile << " ";
-	outfile.width(12);
-	outfile << seg.epgeominfo[0].dist;
-	outfile << " ";
-	outfile.width(8);
-	outfile << seg.epgeominfo[1].edgenr;
-	/*
-	  outfile.width(8);
-	  outfile << seg.epgeominfo[1].lefttrig;
-	  outfile.width(8);
-	  outfile << seg.epgeominfo[1].righttrig;
-	*/
-	outfile << " ";
-	outfile.width(12);
-	outfile << seg.epgeominfo[1].dist;
-
-	outfile << "\n";
-      }
-
-
-    outfile << "\n" << "\n";
-    outfile << "#          X             Y             Z" << "\n";
-    outfile << "points" << "\n";
-    outfile << GetNP() << "\n";
-    outfile.precision(16);
-    outfile.setf (ios::fixed, ios::floatfield);
-    outfile.setf (ios::showpoint);
-
-    PointIndex pi;
-    for (pi = PointIndex::BASE; 
-	 pi < GetNP()+PointIndex::BASE; pi++)
-      {
-	outfile.width(22);
-	outfile << (*this)[pi].X()/scale << "  ";
-	outfile.width(22);
-	outfile << (*this)[pi].Y()/scale << "  ";
-	outfile.width(22);
-	outfile << (*this)[pi].Z()/scale << "\n";
-      }      
-
-    if (ident -> GetMaxNr() > 0)
-      {
-	outfile << "identifications\n";
-	ARRAY<INDEX_2> identpairs;
-	int cnt = 0;
-	for (i = 1; i <= ident -> GetMaxNr(); i++)
-	  {
-	    ident -> GetPairs (i, identpairs);
-	    cnt += identpairs.Size();
-	  }
-	outfile << cnt << "\n";
-	for (i = 1; i <= ident -> GetMaxNr(); i++)
-	  {
-	    ident -> GetPairs (i, identpairs);
-	    for (j = 1; j <= identpairs.Size(); j++)
-	      {
-		outfile.width (8);
-		outfile << identpairs.Get(j).I1();
-		outfile.width (8);
-		outfile << identpairs.Get(j).I2();
-		outfile.width (8);
-		outfile << i << "\n";
-	      }
-	  }
-      }
-
-    int cntmat = 0;
-    for (i = 1; i <= materials.Size(); i++)
-      if (materials.Get(i) && strlen (materials.Get(i)))
-	cntmat++;
-
-    if (cntmat)
-      {
-	outfile << "materials" << endl;
-	outfile << cntmat << endl;
-	for (i = 1; i <= materials.Size(); i++)
-	  if (materials.Get(i) && strlen (materials.Get(i)))
-	    outfile << i << " " << materials.Get(i) << endl;
-      }
-
-    
-    int cnt_sing = 0;
-    for (PointIndex pi = PointIndex::BASE; pi < GetNP()+PointIndex::BASE; pi++)
-      if ((*this)[pi].IsSingular()) cnt_sing++;
-    
-    if (cnt_sing)
-      {
-	outfile << "singular_points" << endl << cnt_sing << endl;
-	for (PointIndex pi = PointIndex::BASE; pi < GetNP()+PointIndex::BASE; pi++)
-	  if ((*this)[pi].IsSingular()) 
-	    outfile << int(pi) << endl;
-      }
-
-    cnt_sing = 0;
-    for (SegmentIndex si = 0; si < GetNSeg(); si++)
-      if ( segments[si].singedge_left ) cnt_sing++;
-    if (cnt_sing)
-      {
-	outfile << "singular_edge_left" << endl << cnt_sing << endl;
-	for (SegmentIndex si = 0; si < GetNSeg(); si++)
-	  if ( segments[si].singedge_left )
-	    outfile << int(si) << endl;
-      }
-
-    cnt_sing = 0;
-    for (SegmentIndex si = 0; si < GetNSeg(); si++)
-      if ( segments[si].singedge_right ) cnt_sing++;
-    if (cnt_sing)
-      {
-	outfile << "singular_edge_right" << endl << cnt_sing << endl;
-	for (SegmentIndex si = 0; si < GetNSeg(); si++)
-	  if ( segments[si].singedge_right )
-	    outfile << int(si) << endl;
-      }
-
-
-    cnt_sing = 0;
-    for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++)
-      if ( GetFaceDescriptor ((*this)[sei].GetIndex()).domin_singular) cnt_sing++;
-    if (cnt_sing)
-      {
-	outfile << "singular_face_inside" << endl << cnt_sing << endl;
-	for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++)
-	  if ( GetFaceDescriptor ((*this)[sei].GetIndex()).domin_singular) 
-	    outfile << int(sei) << endl;
-      }
-
-    cnt_sing = 0;
-    for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++)
-      if ( GetFaceDescriptor ((*this)[sei].GetIndex()).domout_singular) cnt_sing++;
-    if (cnt_sing)
-      {
-	outfile << "singular_face_outside" << endl << cnt_sing << endl;
-	for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++)
-	  if ( GetFaceDescriptor ((*this)[sei].GetIndex()).domout_singular) 
-	    outfile << int(sei) << endl;
-      }
-
-
-  }
-
-
-  void Mesh :: Load (const string & filename)
-  {
-    char str[100];
-    int i, n;
-
-    double scale = 1;  // globflags.GetNumFlag ("scale", 1);
-    int inverttets = 0;  // globflags.GetDefineFlag ("inverttets");
-    int invertsurf = 0;  // globflags.GetDefineFlag ("invertsurfacemesh");
-
-    ifstream infile(filename.c_str());
-    if (!infile.good())
-      throw NgException ("mesh file not found");
-
-    facedecoding.SetSize(0);
-
-    while (infile.good())
-      {
-	infile >> str;
-
-	if (strcmp (str, "dimension") == 0)
-	  {
-	    infile >> dimension;
-	  }
-
-	if (strcmp (str, "surfaceelements") == 0)
-	  {
-	    infile >> n;
-	    PrintMessage (3, n, " surface elements");
-	    for (i = 1; i <= n; i++)
-	      {
-		int j;
-		int surfnr, bcp, domin, domout, nep, faceind = 0;
-
-		infile >> surfnr >> bcp >> domin >> domout;
-		surfnr--;
-
-		for (j = 1; j <= facedecoding.Size(); j++)
-		  if (GetFaceDescriptor(j).SurfNr() == surfnr &&
-		      GetFaceDescriptor(j).BCProperty() == bcp &&
-		      GetFaceDescriptor(j).DomainIn() == domin &&
-		      GetFaceDescriptor(j).DomainOut() == domout)
-		    faceind = j;
-
-		if (!faceind)
-		  {
-		    faceind = AddFaceDescriptor (FaceDescriptor(surfnr, domin, domout, 0));
-		    GetFaceDescriptor(faceind).SetBCProperty (bcp);
-		  }
-
-		infile >> nep;
-		if (!nep) nep = 3;
-
-		Element2d tri(nep);
-		tri.SetIndex(faceind);
-
-		for (j = 1; j <= nep; j++)
-		  infile >> tri.PNum(j);
-
-		if (invertsurf)
-		  tri.Invert();
-
-		AddSurfaceElement (tri);
-	      }
-	  }
-      
-	if (strcmp (str, "surfaceelementsgi") == 0)
-	  {
-	    infile >> n;
-	    PrintMessage (3, n, " surface elements");
-	    for (i = 1; i <= n; i++)
-	      {
-		int j;
-		int surfnr, bcp, domin, domout, nep, faceind = 0;
-		infile >> surfnr >> bcp >> domin >> domout;
-		surfnr--;
-
-		for (j = 1; j <= facedecoding.Size(); j++)
-		  if (GetFaceDescriptor(j).SurfNr() == surfnr &&
-		      GetFaceDescriptor(j).BCProperty() == bcp &&
-		      GetFaceDescriptor(j).DomainIn() == domin &&
-		      GetFaceDescriptor(j).DomainOut() == domout)
-		    faceind = j;
-
-		if (!faceind)
-		  {
-		    faceind = AddFaceDescriptor (FaceDescriptor(surfnr, domin, domout, 0));
-		    GetFaceDescriptor(faceind).SetBCProperty (bcp);
-		  }
-
-		infile >> nep;
-		if (!nep) nep = 3;
-
-		Element2d tri(nep);
-		tri.SetIndex(faceind);
-
-		for (j = 1; j <= nep; j++)
-		  infile >> tri.PNum(j);
-
-		for (j = 1; j <= nep; j++)
-		  infile >> tri.GeomInfoPi(j).trignum;
-
-		if (invertsurf)
-		  tri.Invert();
-
-		AddSurfaceElement (tri);
-	      }
-	  }
-
-	if (strcmp (str, "volumeelements") == 0)
-	  {
-	    infile >> n;
-	    PrintMessage (3, n, " volume elements");
-	    for (i = 1; i <= n; i++)
-	      {
-		Element el;
-		int hi, nep;
-		infile >> hi;
-		if (hi == 0) hi = 1;
-		el.SetIndex(hi);
-		infile >> nep;
-		el.SetNP(nep);
-	      
-		for (int j = 0; j < nep; j++)
-		  infile >> (int&)(el[j]);
-	      
-		if (inverttets)
-		  el.Invert();
-
-		AddVolumeElement (el);
-	      }
-	  }
-    
-
-	if (strcmp (str, "edgesegments") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		Segment seg;
-		int hi;
-		infile >> seg.si >> hi >> seg.p1 >> seg.p2;
-		AddSegment (seg);
-	      }
-	  }
-      
-
-
-	if (strcmp (str, "edgesegmentsgi") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		Segment seg;
-		int hi;
-		infile >> seg.si >> hi >> seg.p1 >> seg.p2
-		       >> seg.geominfo[0].trignum
-		       >> seg.geominfo[1].trignum;
-		AddSegment (seg);
-	      }
-	  }
-	if (strcmp (str, "edgesegmentsgi2") == 0)
-	  {
-	    infile >> n;
-	    PrintMessage (3, n, " curve elements");
-
-	    for (i = 1; i <= n; i++)
-	      {
-		Segment seg;
-		int hi;
-		infile >> seg.si >> hi >> seg.p1 >> seg.p2
-		       >> seg.geominfo[0].trignum
-		       >> seg.geominfo[1].trignum
-		       >> seg.surfnr1 >> seg.surfnr2
-		       >> seg.edgenr
-		  // >> seg.epgeominfo[0].edgenr
-		  //		     >> seg.epgeominfo[0].lefttrig
-		  //		     >> seg.epgeominfo[0].righttrig
-		       >> seg.epgeominfo[0].dist
-		       >> seg.epgeominfo[1].edgenr
-		  //		     >> seg.epgeominfo[1].lefttrig
-		  //		     >> seg.epgeominfo[1].righttrig
-		       >> seg.epgeominfo[1].dist;
-		// seg.edgenr = seg.epgeominfo[0].edgenr;
-		seg.epgeominfo[0].edgenr = seg.epgeominfo[1].edgenr;
-
-		seg.surfnr1--;
-		seg.surfnr2--;
-	      
-		AddSegment (seg);
-	      }
-	  }
-      
-	if (strcmp (str, "points") == 0)
-	  {
-	    infile >> n;
-	    PrintMessage (3, n, " points");
-	    for (i = 1; i <= n; i++)
-	      {
-		Point3d p;
-		infile >> p.X() >> p.Y() >> p.Z();
-		p.X() *= scale;
-		p.Y() *= scale;
-		p.Z() *= scale;
-		AddPoint (p);
-	      }
-	  }
-
-	if (strcmp (str, "identifications") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		PointIndex pi1, pi2;
-		int ind;
-		infile >> pi1 >> pi2 >> ind;
-		ident -> Add (pi1, pi2, ind);
-	      }
-	  }
-	if (strcmp (str, "materials") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		int nr;
-		string mat;
-		infile >> nr >> mat;
-		SetMaterial (nr, mat.c_str());
-	      }
-	  }
-	
-	if (strcmp (str, "singular_points") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		PointIndex pi;
-		infile >> pi;
-		(*this)[pi].SetSingular (1);
-	      }
-	  }
-
-	if (strcmp (str, "singular_edge_left") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		SegmentIndex si;
-		infile >> si;
-		(*this)[si].singedge_left = 1;
-	      }
-	  }
-	if (strcmp (str, "singular_edge_right") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		SegmentIndex si;
-		infile >> si;
-		(*this)[si].singedge_right = 1;
-	      }
-	  }
-
-	if (strcmp (str, "singular_face_inside") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		SurfaceElementIndex sei;
-		infile >> sei;
-		GetFaceDescriptor((*this)[sei].GetIndex()).domin_singular = 1;
-	      }
-	  }
-
-	if (strcmp (str, "singular_face_outside") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		SurfaceElementIndex sei;
-		infile >> sei;
-		GetFaceDescriptor((*this)[sei].GetIndex()).domout_singular = 1;
-	      }
-	  }
-
-
-
-	strcpy (str, "");
-      }
-  
-    CalcSurfacesOfNode ();
-    //  BuildConnectedNodes ();
-    topology -> Update();
-    clusters -> Update();
-  
-    SetNextMajorTimeStamp();
-    //  PrintMemInfo (cout);
-  }
-  
-
-
-
-
-
-  void Mesh :: Merge (const string & filename)
-  {
-    char str[100];
-    int i, n;
-
-    ifstream infile(filename.c_str());
-    if (!infile.good())
-      throw NgException ("mesh file not found");
-
-    int oldnp = GetNP();
-
-    while (infile.good())
-      {
-	infile >> str;
-
-	if (strcmp (str, "surfaceelementsgi") == 0)
-	  {
-	    infile >> n;
-	    PrintMessage (3, n, " surface elements");
-	    for (i = 1; i <= n; i++)
-	      {
-		int j;
-		int surfnr, bcp, domin, domout, nep, faceind = 0;
-		infile >> surfnr >> bcp >> domin >> domout;
-		surfnr--;
-
-		// surfnr = 0;
-		// bcp = 1;
-		domin = 2;
-		domout = 1;
-
-		for (j = 1; j <= facedecoding.Size(); j++)
-		  if (GetFaceDescriptor(j).SurfNr() == surfnr &&
-		      GetFaceDescriptor(j).BCProperty() == bcp &&
-		      GetFaceDescriptor(j).DomainIn() == domin &&
-		      GetFaceDescriptor(j).DomainOut() == domout)
-		    faceind = j;
-
-		if (!faceind)
-		  {
-		    faceind = AddFaceDescriptor (FaceDescriptor(surfnr, domin, domout, 0));
-		    GetFaceDescriptor(faceind).SetBCProperty (bcp);
-		  }
-
-		infile >> nep;
-		if (!nep) nep = 3;
-
-		Element2d tri(nep);
-		tri.SetIndex(faceind);
-
-		for (j = 1; j <= nep; j++)
-		  {
-		    infile >> tri.PNum(j);
-		    tri.PNum(j) = tri.PNum(j) + oldnp;
-		  }
-
-		for (j = 1; j <= nep; j++)
-		  infile >> tri.GeomInfoPi(j).trignum;
-
-		AddSurfaceElement (tri);
-	      }
-	  }
-
-	if (strcmp (str, "points") == 0)
-	  {
-	    infile >> n;
-	    PrintMessage (3, n, " points");
-	    for (i = 1; i <= n; i++)
-	      {
-		Point3d p;
-		infile >> p.X() >> p.Y() >> p.Z();
-		AddPoint (p);
-	      }
-	  }
-
-	strcpy (str, "");
-      }
-  
-    CalcSurfacesOfNode ();
-
-    topology -> Update();
-    clusters -> Update();
-  
-    SetNextMajorTimeStamp();
-  }
-  
-
-
-
-
-
-
-
-   
-
-  bool Mesh :: TestOk () const
-  {
-    for (ElementIndex ei = 0; ei < volelements.Size(); ei++)
-      {
-	for (int j = 0; j < 4; j++)
-	  if ( (*this)[ei][j] <= PointIndex::BASE-1)
-	    {
-	      (*testout) << "El " << ei << " has 0 nodes: ";
-	      for (int k = 0; k < 4; k++)
-		(*testout) << (*this)[ei][k];
-	      break;
-	    }
-      }
-    CheckMesh3D (*this);
-    return 1;
-  }
-
-  void Mesh :: CalcSurfacesOfNode ()
-  {
-    int i, j, k;
-    SurfaceElementIndex sei;
-
-    surfacesonnode.SetSize (GetNP());
-    if (boundaryedges)
-      delete boundaryedges;
-    if (surfelementht)
-      delete surfelementht;
-    if (segmentht)
-      delete segmentht;
-
-    boundaryedges = new INDEX_2_CLOSED_HASHTABLE<int>
-      (3 * (GetNSE() + GetNOpenElements()) + GetNSeg() + 1);
-
-    /*
-      surfelementht = new INDEX_3_HASHTABLE<int> (GetNSE()/4 + 1);
-      segmentht = new INDEX_2_HASHTABLE<int> (GetNSeg() + 1);
-    */
-
-    surfelementht = new INDEX_3_CLOSED_HASHTABLE<int> (3*GetNSE() + 1);
-    segmentht = new INDEX_2_CLOSED_HASHTABLE<int> (3*GetNSeg() + 1);
-
-    for (sei = 0; sei < GetNSE(); sei++)
-      {
-	const Element2d & sel = surfelements[sei];
-	if (sel.IsDeleted()) continue;
-
-	int si = sel.GetIndex();
-      
-	for (j = 0; j < sel.GetNP(); j++)
-	  {
-	    PointIndex pi = sel[j];
-	    bool found = 0;
-	    for (k = 0; k < surfacesonnode[pi].Size(); k++)
-	      if (surfacesonnode[pi][k] == si)
-		{
-		  found = 1;
-		  break;
-		}
-	  
-	    if (!found)
-	      surfacesonnode.Add (pi, si);
-
-	    INDEX_2 i2;
-	    i2.I1() = sel.PNumMod(j+1);
-	    i2.I2() = sel.PNumMod(j+2);
-	    i2.Sort();
-	    if (sel.GetNP() <= 4)
-	      boundaryedges->Set (i2, 1);
-	  }
-      }
-    /*
-      for (sei = 0; sei < GetNSE(); sei++)
-      {
-      const Element2d & sel = surfelements[sei];
-      if (sel.IsDeleted()) continue;
-
-      INDEX_3 i3;
-      i3.I1() = sel.PNum(1);
-      i3.I2() = sel.PNum(2);
-      i3.I3() = sel.PNum(3);
-      i3.Sort();
-      surfelementht -> PrepareSet (i3);
-      }
-
-      surfelementht -> AllocateElements();
-    */
-    for (sei = 0; sei < GetNSE(); sei++)
-      {
-	const Element2d & sel = surfelements[sei];
-	if (sel.IsDeleted()) continue;
-
-	INDEX_3 i3;
-	i3.I1() = sel.PNum(1);
-	i3.I2() = sel.PNum(2);
-	i3.I3() = sel.PNum(3);
-	i3.Sort();
-	surfelementht -> Set (i3, sel.GetIndex());
-      }
-
-    int np = GetNP();
-    // ptyps.SetSize(np);
-    // ptyps = INNERPOINT;
-    for (PointIndex pi = PointIndex::BASE; 
-	 pi < np+PointIndex::BASE; pi++)
-      points[pi].SetType (INNERPOINT);
-
-    if (GetNFD() == 0) //  || GetFaceDescriptor(1).SurfNr() == 0)
-      {
-	for (sei = 0; sei < GetNSE(); sei++)
-	  {
-	    const Element2d & sel = surfelements[sei];
-	    if (sel.IsDeleted()) continue;
-	    for (j = 0;  j < sel.GetNP(); j++)
-	      {
-		PointIndex pi = SurfaceElement(sei)[j];
-		points[pi].SetType(FIXEDPOINT);
-	      }
-	  }
-      }
-    else
-      {
-	for (sei = 0; sei < GetNSE(); sei++)
-	  {
-	    const Element2d & sel = surfelements[sei];
-	    if (sel.IsDeleted()) continue;
-	    for (j = 0; j < sel.GetNP(); j++)
-	      {
-		PointIndex pi = sel[j];
-		int ns = surfacesonnode[pi].Size();
-		if (ns == 1)
-		  points[pi].SetType(SURFACEPOINT);
-		if (ns == 2)
-		  points[pi].SetType(EDGEPOINT);
-		if (ns >= 3)
-		  points[pi].SetType(FIXEDPOINT);
-	      }      
-	  }
-      }
-
-    for (i = 0; i < segments.Size(); i++)
-      {
-	const Segment & seg = segments[i];
-	for (j = 1; j <= 2; j++)
-	  {
-	    PointIndex hi = (j == 1) ? seg.p1 : seg.p2;
-	  
-	    if (points[hi].Type() == INNERPOINT ||
-		points[hi].Type() == SURFACEPOINT)
-	      points[hi].SetType(EDGEPOINT);
-	  }
-      }
-
-
-    for (i = 0; i < lockedpoints.Size(); i++)
-      points[lockedpoints[i]].SetType(FIXEDPOINT);
-  
-    for (i = 0; i < openelements.Size(); i++)
-      {
-	const Element2d & sel = openelements[i];
-	for (j = 0; j < sel.GetNP(); j++)
-	  {
-	    INDEX_2 i2;
-	    i2.I1() = sel.PNumMod(j+1);
-	    i2.I2() = sel.PNumMod(j+2);
-	    i2.Sort();
-	    boundaryedges->Set (i2, 1);
-
-	    points[sel[j]].SetType(FIXEDPOINT);
-	  }
-      }
-
-    eltyps.SetSize (GetNE());
-    eltyps = FREEELEMENT;
-
-    for (i = 0; i < GetNSeg(); i++)
-      {
-	const Segment & seg = segments[i];
-	INDEX_2 i2(seg.p1, seg.p2);
-	i2.Sort();
-
-	boundaryedges -> Set (i2, 2);
-	segmentht -> Set (i2, i);
-      }
-  }
-
-
-  void Mesh :: FixPoints (const BitArray & fixpoints)
-  {
-    if (fixpoints.Size() != GetNP())
-      {
-	cerr << "Mesh::FixPoints: sizes don´t fit" << endl;
-	return;
-      }
-    int np = GetNP();
-    for (int i = 1; i <= np; i++)
-      if (fixpoints.Test(i))
-	{
-	  points.Elem(i).SetType (FIXEDPOINT);
-	}
-  }
-
-
-  void Mesh :: FindOpenElements (int dom)
-  {
-    int i, ii, j, k, l;
-    PointIndex pi;
-    SurfaceElementIndex sei;
-    Element2d hel;
-
-
-    if (1)   
-      { // nodebased 
-
-	int np = GetNP();
-	int ne = GetNE();
-	int nse = GetNSE();
-
-	ARRAY<int,PointIndex::BASE> numonpoint(np);
-
-	Element2d hel;
-
-	numonpoint = 0;
-	ElementIndex ei;
-	for (ei = 0; ei < ne; ei++)
-	  {
-	    const Element & el = (*this)[ei];
-	    if (dom == 0 || dom == el.GetIndex())
-	      {
-		if (el.GetNP() == 4)
-		  {
-		    INDEX_4 i4(el[0], el[1], el[2], el[3]);
-		    i4.Sort();
-		    numonpoint[i4.I1()]++;
-		    numonpoint[i4.I2()]++;
-		  }
-		else
-		  for (j = 0; j < el.GetNP(); j++)
-		    numonpoint[el[j]]++;
-	      }
-	  }
-
-	TABLE<ElementIndex,PointIndex::BASE> elsonpoint(numonpoint);
-	for (ei = 0; ei < ne; ei++)
-	  {
-	    const Element & el = (*this)[ei];
-	    if (dom == 0 || dom == el.GetIndex())
-	      {
-		if (el.GetNP() == 4)
-		  {
-		    INDEX_4 i4(el[0], el[1], el[2], el[3]);
-		    i4.Sort();
-		    elsonpoint.Add (i4.I1(), ei);
-		    elsonpoint.Add (i4.I2(), ei);
-		  }
-		else
-		  for (j = 0; j < el.GetNP(); j++)
-		    elsonpoint.Add (el[j], ei);
-	      }
-	  }
-
-	numonpoint = 0;
-	for (i = 0; i < nse; i++)
-	  {
-	    int ind = surfelements[i].GetIndex();
-	    if (
-		GetFaceDescriptor(ind).DomainIn() && 
-		(dom == 0 || dom == GetFaceDescriptor(ind).DomainIn())
-		||
-		GetFaceDescriptor(ind).DomainOut() && 
-		(dom == 0 || dom == GetFaceDescriptor(ind).DomainOut())
-		)
-	      {
-		hel = surfelements[i];
-		hel.NormalizeNumbering();	  
-		numonpoint[hel[0]]++;
-	      }
-	  }
-
-	TABLE<SurfaceElementIndex,PointIndex::BASE> selsonpoint(numonpoint);
-	for (i = 0; i < nse; i++)
-	  {
-	    int ind = surfelements[i].GetIndex();
-	    if (
-		GetFaceDescriptor(ind).DomainIn() && 
-		(dom == 0 || dom == GetFaceDescriptor(ind).DomainIn())
-		||
-		GetFaceDescriptor(ind).DomainOut() && 
-		(dom == 0 || dom == GetFaceDescriptor(ind).DomainOut())
-		)
-	      {
-		hel = surfelements[i];
-		hel.NormalizeNumbering();	  
-		selsonpoint.Add (hel[0], i);
-	      }
-	  }
-
-
-	INDEX_3_CLOSED_HASHTABLE<INDEX_2> faceht(100);   
-	openelements.SetSize(0);
-      
-	for (pi = PointIndex::BASE; 
-	     pi < np+PointIndex::BASE; pi++)
-	  if (selsonpoint[pi].Size()+elsonpoint[pi].Size())
-	    {
-	      faceht.SetSize (2 * selsonpoint[pi].Size() + 4 * elsonpoint[pi].Size());
-
-	      FlatArray<SurfaceElementIndex> row = selsonpoint[pi];
-	      for (ii = 0; ii < row.Size(); ii++)
-		{
-		  hel = SurfaceElement(row[ii]);
-		  int ind = hel.GetIndex();	  
-  
-		  if (GetFaceDescriptor(ind).DomainIn() && 
-		      (dom == 0 || dom == GetFaceDescriptor(ind).DomainIn()) )
-		    {
-		      hel.NormalizeNumbering();
-		      if (hel.PNum(1) == pi)
-			{
-			  INDEX_3 i3(hel[0], hel[1], hel[2]);
-			  INDEX_2 i2 (GetFaceDescriptor(ind).DomainIn(), 
-				      (hel.GetNP() == 3) 
-				      ? PointIndex (PointIndex::BASE-1)
-				      : hel.PNum(4));
-			  faceht.Set (i3, i2);
-			}
-		    }
-		  if (GetFaceDescriptor(ind).DomainOut() &&
-		      (dom == 0 || dom == GetFaceDescriptor(ind).DomainOut()) )
-		    {
-		      hel.Invert();
-		      hel.NormalizeNumbering();
-		      if (hel.PNum(1) == pi)
-			{
-			  INDEX_3 i3(hel[0], hel[1], hel[2]);
-			  INDEX_2 i2 (GetFaceDescriptor(ind).DomainOut(), 
-				      (hel.GetNP() == 3) 
-				      ? PointIndex (PointIndex::BASE-1)
-				      : hel.PNum(4));
-			  faceht.Set (i3, i2);
-			}
-		    }
-		}
-
-	  
-	      FlatArray<ElementIndex> rowel = elsonpoint[pi];
-	      for (ii = 0; ii < rowel.Size(); ii++)
-		{
-		  const Element & el = VolumeElement(rowel[ii]);
-
-		  if (dom == 0 || el.GetIndex() == dom)
-		    {
-		      for (j = 1; j <= el.GetNFaces(); j++)
-			{
-			  el.GetFace (j, hel);
-			  hel.Invert();
-			  hel.NormalizeNumbering();
-
-			  if (hel[0] == pi)
-			    {
-			      INDEX_3 i3(hel[0], hel[1], hel[2]);
-			  
-			      if (faceht.Used (i3))
-				{
-				  INDEX_2 i2 = faceht.Get(i3);
-				  if (i2.I1() == el.GetIndex())
-				    {
-				      i2.I1() = PointIndex::BASE-1;
-				      faceht.Set (i3, i2);
-				    }
-				  else
-				    {
-				      if (i2.I1() == 0)
-					{
-					  PrintSysError ("more elements on face");
-					  (*testout)  << "more elements on face!!!" << endl;
-					  (*testout) << "el = " << el << endl;
-					  (*testout) << "hel = " << hel << endl;
-					  (*testout) << "face = " << i3 << endl;
-					  (*testout) << "points = " << endl;
-					  for (int jj = 1; jj <= 3; jj++)
-					    (*testout) << "p = " << Point(i3.I(jj)) << endl;
-					}
-				    }
-				}
-			      else
-				{
-				  hel.Invert();
-				  hel.NormalizeNumbering();
-				  INDEX_3 i3(hel[0], hel[1], hel[2]);
-				  INDEX_2 i2(el.GetIndex(), 
-					     (hel.GetNP() == 3) 
-					     ? PointIndex (PointIndex::BASE-1)
-					     : hel[3]);
-				  faceht.Set (i3, i2);
-				}
-			    }
-			}
-		    }
-		}
-
-	      for (i = 1; i <= faceht.Size(); i++)
-		if (faceht.UsedPos (i))
-		  {
-		    INDEX_3 i3;
-		    INDEX_2 i2;
-		    faceht.GetData (i, i3, i2);
-		    if (i2.I1() != PointIndex::BASE-1)
-		      {
-			Element2d tri;
-			tri.SetType ( (i2.I2() == PointIndex::BASE-1) ? TRIG : QUAD);
-			for (l = 0; l < 3; l++)
-			  tri[l] = i3.I(l+1);
-			tri.PNum(4) = i2.I2();
-			tri.SetIndex (i2.I1());
-
-			//	tri.Invert();
-		    
-			openelements.Append (tri);
-		      }
-		  }
-	    }
-      }
-
-
-#ifdef OLD
-
-    else if (GetNE() || 1)
-      {
-	// new version, general elemetns
-	// hash index: pnum1-3
-	// hash data : domain nr, pnum4
-
-	openelements.SetSize(0);
-      
-
-	const int steps = 4;
-
-	for (k = 0; k < steps; k++)
-	  {
-	  
-	    INDEX_3_CLOSED_HASHTABLE<INDEX_2> faceht( (5 * GetNE() + 2 * GetNSE() ) / steps +1);   
-	  
-	    for (i = 1; i <= GetNSE(); i++)
-	      {
-		hel = SurfaceElement(i);
-		int ind = hel.GetIndex();	  
-	      
-	      
-		if (GetFaceDescriptor(ind).DomainIn() && 
-		    (dom == 0 || dom == GetFaceDescriptor(ind).DomainIn()) )
-		  {
-		    hel.Invert();
-		    hel.NormalizeNumbering();
-		    if (hel.PNum(1) % steps == k)
-		      {
-			INDEX_3 i3(hel.PNum(1), hel.PNum(2), hel.PNum(3));
-			INDEX_2 i2 (GetFaceDescriptor(ind).DomainIn(), 
-				    (hel.GetNP() == 3) 
-				    ? PointIndex (PointIndex::BASE-1)
-				    : hel.PNum(4));
-			faceht.Set (i3, i2);
-		      }
-		  }
-		if (GetFaceDescriptor(ind).DomainOut() &&
-		    (dom == 0 || dom == GetFaceDescriptor(ind).DomainOut()) )
-		  {
-		    hel.NormalizeNumbering();
-		    if (hel.PNum(1) % steps == k)
-		      {
-			INDEX_3 i3(hel.PNum(1), hel.PNum(2), hel.PNum(3));
-			INDEX_2 i2 (GetFaceDescriptor(ind).DomainOut(), 
-				    (hel.GetNP() == 3) 
-				    ? PointIndex(0)
-				    : hel.PNum(4));
-			faceht.Set (i3, i2);
-		      }
-		  }
-	      }
-
-	    for (i = 1; i <= GetNE(); i++)
-	      {
-		const Element & el = VolumeElement(i);
-	      
-		if (dom == 0 || el.GetIndex() == dom)
-		  {
-		    for (j = 1; j <= el.GetNFaces(); j++)
-		      {
-			el.GetFace (j, hel);
-		      
-			hel.NormalizeNumbering();
-			if (hel.PNum(1) % steps != k)
-			  continue;
-		      
-			INDEX_3 i3(hel.PNum(1), hel.PNum(2), hel.PNum(3));
-
-			int pos = faceht.Position (i3);
-			if (pos)
-			  {
-			    INDEX_2 i2;
-			    faceht.GetData (pos, i2);
-			    if (i2.I1() == el.GetIndex())
-			      {
-				i2.I1() = 0;
-				faceht.SetData (pos, i2);
-			      }
-			    else
-			      {
-				if (i2.I1() == 0)
-				  PrintSysError ("more elements on face");
-			      }
-			  }
-			else
-			  {
-			    hel.Invert();
-			    hel.NormalizeNumbering();
-			    INDEX_3 i3(hel.PNum(1), hel.PNum(2), hel.PNum(3));
-			    INDEX_2 i2(el.GetIndex(), 
-				       (hel.GetNP() == 3) 
-				       ? PointIndex(0)
-				       : hel.PNum(4));
-			    faceht.Set (i3, i2);
-			  }
-		      }
-		  }
-	      }  
-	  
-	    for (i = 1; i <= faceht.Size(); i++)
-	      if (faceht.UsedPos (i))
-		{
-		  INDEX_3 i3;
-		  INDEX_2 i2;
-		  faceht.GetData (i, i3, i2);
-		  if (i2.I1() != 0)
-		    {
-		      Element2d tri;
-		      tri.SetType ( (i2.I2() == 0) ? TRIG : QUAD);
-		      for (l = 1; l <= 3; l++)
-			tri.PNum(l) = i3.I(l);
-		      tri.PNum(4) = i2.I2();
-		      tri.SetIndex (i2.I1());
-
-		      tri.Invert();
-		    
-		      openelements.Append (tri);
-		    }
-		}
-	    /*
-	      cout << "FindOpenElements, mem = ";
-	      faceht.PrintMemInfo (cout);
-	    */
-	  }
-
-
-
-
-	/*
-	// open hashing version:
-
-	INDEX_3_HASHTABLE<INDEX_2> faceht(4 * GetNE()+GetNSE()+1);   
- 
-	for (i = 1; i <= GetNSE(); i++)
-	{
-	Element2d hel = SurfaceElement(i);
-	int ind = hel.GetIndex();	  
-	  
-
-	if (GetFaceDescriptor(ind).DomainIn() && 
-	(dom == 0 || dom == GetFaceDescriptor(ind).DomainIn()) )
-	{
-	hel.NormalizeNumbering();
-	INDEX_3 i3(hel.PNum(1), hel.PNum(2), hel.PNum(3));
-	INDEX_2 i2 (GetFaceDescriptor(ind).DomainIn(), 
-	(hel.GetNP() == 3) ? 0 : hel.PNum(4));
-	faceht.Set (i3, i2);
-	}
-	if (GetFaceDescriptor(ind).DomainOut() &&
-	(dom == 0 || dom == GetFaceDescriptor(ind).DomainOut()) )
-	{
-	hel.Invert();
-	hel.NormalizeNumbering();
-	INDEX_3 i3(hel.PNum(1), hel.PNum(2), hel.PNum(3));
-	INDEX_2 i2 (GetFaceDescriptor(ind).DomainOut(), 
-	(hel.GetNP() == 3) ? 0 : hel.PNum(4));
-	faceht.Set (i3, i2);
-	}
-	}
-
-	for (i = 1; i <= GetNE(); i++)
-	{
-	const Element & el = VolumeElement(i);
-	//	  INDEX_3 i3;
-
-	if (dom == 0 || el.GetIndex() == dom)
-	{
-	for (j = 1; j <= el.GetNFaces(); j++)
-	{
-	Element2d hel;
-	el.GetFace (j, hel);
-	hel.Invert();
-		  
-	hel.NormalizeNumbering();
-	INDEX_3 i3(hel.PNum(1), hel.PNum(2), hel.PNum(3));
-		  
-	if (faceht.Used (i3))
-	{
-	INDEX_2 i2 = faceht.Get(i3);
-	if (i2.I1() == el.GetIndex())
-	{
-	i2.I1() = 0;
-	faceht.Set (i3, i2);
-	}
-	else
-	{
-	if (i2.I1() == 0)
-	PrintSysError ("more elements on face");
-	}
-	}
-	else
-	{
-	hel.Invert();
-	hel.NormalizeNumbering();
-	INDEX_3 i3(hel.PNum(1), hel.PNum(2), hel.PNum(3));
-	INDEX_2 i2(el.GetIndex(), 
-	(hel.GetNP() == 3) ? 0 : hel.PNum(4));
-	faceht.Set (i3, i2);
-	}
-	}
-	}
-	}  
-
-      
-	openelements.SetSize(0);
-	for (i = 1; i <= faceht.GetNBags(); i++)
-	for (j = 1; j <= faceht.GetBagSize(i); j++)
-	{
-	INDEX_3 i3;
-	INDEX_2 i2;
-	faceht.GetData (i, j, i3, i2);
-	if (i2.I1() != 0)
-	{
-	Element2d tri;
-	tri.SetNP ( (i2.I2() == 0) ? 3 : 4);
-	for (k = 1; k <= 3; k++)
-	tri.PNum(k) = i3.I(k);
-	tri.PNum(4) = i2.I2();
-	tri.SetIndex (i2.I1());
-
-	openelements.Append (tri);
-	}
-	}
-	*/
-
-      }
-    else 
-      {
-	for (i = 1; i <= GetNSE(); i++)
-	  {
-	    Element2d hel = SurfaceElement(i);
-	    int ind = SurfaceElement(i).GetIndex();
-
-	    if (GetFaceDescriptor(ind).DomainIn())
-	      openelements.Append (hel);
-	    if (GetFaceDescriptor(ind).DomainOut())
-	      {
-		hel.Invert();
-		openelements.Append (hel);
-	      }
-	  }
-      }
-#endif
-
-
-    int cnt3 = 0, cnt4 = 0;
-    for (i = 1; i <= openelements.Size(); i++)
-      if (openelements.Elem(i).GetNP() == 3)
-	cnt3++;
-      else
-	cnt4++;
-
-
-    MyStr treequad;
-    if (cnt4)
-      treequad = MyStr(" (") + MyStr(cnt3) + MyStr (" + ") + 
-	MyStr(cnt4) + MyStr(")");
-
-    PrintMessage (5, openelements.Size(), treequad, " open elements");
-
-
-    for (i = 1; i <= openelements.Size(); i++)
-      {
-	const Element2d & sel = openelements.Get(i);
-
-	if (boundaryedges)
-	  for (j = 1; j <= sel.GetNP(); j++)
-	    {
-	      INDEX_2 i2;
-	      i2.I1() = sel.PNumMod(j);
-	      i2.I2() = sel.PNumMod(j+1);
-	      i2.Sort();
-	      boundaryedges->Set (i2, 1);
-	    }
-      
-	for (j = 1; j <= 3; j++)
-	  {
-	    int pi = sel.PNum(j);
-	    if (pi < points.Size()+PointIndex::BASE)
-	      points[pi].SetType (FIXEDPOINT);
-	  }
-      }
-
-
-    for (i = 1; i <= GetNSeg(); i++)
-      {
-	const Segment & seg = LineSegment(i);
-	INDEX_2 i2(seg.p1, seg.p2);
-	i2.Sort();
-
-	if (!boundaryedges->Used (i2))
-	  cerr << "WARNING: no boundedge, but seg edge: " << i2 << endl;
-
-	boundaryedges -> Set (i2, 2);
-	segmentht -> Set (i2, i-1);
-      }
-  }
-
-  int Mesh :: HasOpenQuads () const
-  {
-    int i;
-    int no = GetNOpenElements();
-    for (i = 1; i <= no; i++)
-      if (OpenElement(i).GetNP() == 4)
-	return 1;
-    return 0;
-  }
-
-
-
-
-
-  void Mesh :: FindOpenSegments (int surfnr)
-  {
-    int i, j, k;
-
-    // new version, general elemetns
-    // hash index: pnum1-2
-    // hash data : surfnr,  surfel-nr (pos) or segment nr(neg)
-    INDEX_2_HASHTABLE<INDEX_2> faceht(4 * GetNSE()+GetNSeg()+1);   
-  
-    PrintMessage (5, "Test Opensegments");
-    for (i = 1; i <= GetNSeg(); i++)
-      {
-	const Segment & seg = LineSegment (i);
-
-	if (surfnr == 0 || seg.si == surfnr)
-	  {
-	    INDEX_2 key(seg.p1, seg.p2);
-	    INDEX_2 data(seg.si, -i);
-
-	    if (faceht.Used (key))
-	      {
-		cerr << "ERROR: Segment " << seg << " already used" << endl;
-		(*testout) << "ERROR: Segment " << seg << " already used" << endl;
-	      }
-
-	    faceht.Set (key, data);
-	  }
-      }
-
-
-    for (i = 1; i <= GetNSeg(); i++)
-      {
-	const Segment & seg = LineSegment (i);
-
-	if (surfnr == 0 || seg.si == surfnr)
-	  {
-	    INDEX_2 key(seg.p2, seg.p1);
-	    if (!faceht.Used(key))
-	      {
-		cerr << "ERROR: Segment " << seg << " brother not used" << endl;
-		(*testout) << "ERROR: Segment " << seg << " brother not used" << endl;
-	      }
-	  }
-      }
-
-
-    for (i = 1; i <= GetNSE(); i++)
-      {
-	const Element2d & el = SurfaceElement(i);
-	if (el.IsDeleted()) continue;
-
-	if (surfnr == 0 || el.GetIndex() == surfnr)
-	  {
-	    for (j = 1; j <= el.GetNP(); j++)
-	      {
-		INDEX_2 seg (el.PNumMod(j), el.PNumMod(j+1));
-		INDEX_2 data;
-
-		if (seg.I1() <= 0 || seg.I2() <= 0)
-		  cerr << "seg = " << seg << endl;
-
-		if (faceht.Used(seg))
-		  {
-		    data = faceht.Get(seg);
-		    if (data.I1() == el.GetIndex())
-		      {
-			data.I1() = 0;
-			faceht.Set (seg, data);
-		      }
-		    else
-		      {
-			PrintSysError ("hash table si not fitting for segment: ",
-				       seg.I1(), "-", seg.I2(), " other = ",
-				       data.I2());
-		      }
-		  }
-		else
-		  {
-		    Swap (seg.I1(), seg.I2());
-		    data.I1() = el.GetIndex();
-		    data.I2() = i;
-
-		    faceht.Set (seg, data);
-		  }
-	      }
-	  }
-      }  
-
-    (*testout) << "open segments: " << endl;
-    opensegments.SetSize(0);
-    for (i = 1; i <= faceht.GetNBags(); i++)
-      for (j = 1; j <= faceht.GetBagSize(i); j++)
-	{
-	  INDEX_2 i2;
-	  INDEX_2 data;
-	  faceht.GetData (i, j, i2, data);
-	  if (data.I1())  // surfnr
-	    {
-	      Segment seg;
-	      seg.p1 = i2.I1();
-	      seg.p2 = i2.I2();
-	      seg.si = data.I1();
-
-	      // find geomdata:
-	      if (data.I2() > 0)
-		{
-		  // segment due to triangle
-		  const Element2d & el = SurfaceElement (data.I2());
-		  for (k = 1; k <= el.GetNP(); k++)
-		    {
-		      if (seg.p1 == el.PNum(k))
-			seg.geominfo[0] = el.GeomInfoPi(k);
-		      if (seg.p2 == el.PNum(k))
-			seg.geominfo[1] = el.GeomInfoPi(k);
-		    }
-
-		  (*testout) << "trig seg: ";
-		}
-	      else
-		{
-		  // segment due to line
-		  const Segment & lseg = LineSegment (-data.I2());
-		  seg.geominfo[0] = lseg.geominfo[0];
-		  seg.geominfo[1] = lseg.geominfo[1];
-
-		  (*testout) << "line seg: ";
-		}
-	    
-	      (*testout) << seg.p1 << " - " << seg.p2 
-			 << " len = " << Dist (Point(seg.p1), Point(seg.p2))
-			 << endl;
-
-	      opensegments.Append (seg);
-	      if (seg.geominfo[0].trignum <= 0 || seg.geominfo[1].trignum <= 0)
-		{
-		  (*testout) << "Problem with open segment: " << seg << endl;
-		}
-
-	    }
-	}
-
-    PrintMessage (3, opensegments.Size(), " open segments found");
-    (*testout) << opensegments.Size() << " open segments found" << endl;
-  
-    /*
-      ptyps.SetSize (GetNP());
-      for (i = 1; i <= ptyps.Size(); i++)
-      ptyps.Elem(i) = SURFACEPOINT;
-
-      for (i = 1; i <= GetNSeg(); i++)
-      {
-      const Segment & seg = LineSegment (i);
-      ptyps.Elem(seg.p1) = EDGEPOINT;
-      ptyps.Elem(seg.p2) = EDGEPOINT;
-      }
-      for (i = 1; i <= GetNOpenSegments(); i++)
-      {
-      const Segment & seg = GetOpenSegment (i);
-      ptyps.Elem(seg.p1) = EDGEPOINT;
-      ptyps.Elem(seg.p2) = EDGEPOINT;
-      }
-    */
-    for (i = 1; i <= points.Size(); i++)
-      points.Elem(i).SetType(SURFACEPOINT);
-
-    for (i = 1; i <= GetNSeg(); i++)
-      {
-	const Segment & seg = LineSegment (i);
-	points[seg.p1].SetType(EDGEPOINT);
-	points[seg.p2].SetType(EDGEPOINT);
-      }
-    for (i = 1; i <= GetNOpenSegments(); i++)
-      {
-	const Segment & seg = GetOpenSegment (i);
-	points[seg.p1].SetType (EDGEPOINT);
-	points[seg.p2].SetType (EDGEPOINT);
-      }
-  
-  
-  
-    /*
-
-    for (i = 1; i <= openelements.Size(); i++)
-    {
-    const Element2d & sel = openelements.Get(i);
-
-    if (boundaryedges)
-    for (j = 1; j <= sel.GetNP(); j++)
-    {
-    INDEX_2 i2;
-    i2.I1() = sel.PNumMod(j);
-    i2.I2() = sel.PNumMod(j+1);
-    i2.Sort();
-    boundaryedges->Set (i2, 1);
-    }
-      
-    for (j = 1; j <= 3; j++)
-    {
-    int pi = sel.PNum(j);
-    if (pi <= ptyps.Size())
-    ptyps.Elem(pi) = FIXEDPOINT;
-    }
-    }
-    */
-  }
-
-
-  void Mesh :: RemoveOneLayerSurfaceElements ()
-  {
-    int i, j;
-    int np = GetNP();
-
-    FindOpenSegments();
-    BitArray frontpoints(np);
-
-    frontpoints.Clear();
-    for (i = 1; i <= GetNOpenSegments(); i++)
-      {
-	const Segment & seg = GetOpenSegment(i);
-	frontpoints.Set (seg.p1);
-	frontpoints.Set (seg.p2);
-      }
-
-    for (i = 1; i <= GetNSE(); i++)
-      {
-	Element2d & sel = surfelements.Elem(i);
-	int remove = 0;
-	for (j = 1; j <= sel.GetNP(); j++)
-	  if (frontpoints.Test(sel.PNum(j)))
-	    remove = 1;
-	if (remove)
-	  sel.PNum(1) = 0;
-      }
-
-    for (i = surfelements.Size(); i >= 1; i--)
-      {
-	if (surfelements.Elem(i).PNum(1) == 0)
-	  {
-	    surfelements.Elem(i) = surfelements.Last();
-	    surfelements.DeleteLast();
-	  }
-      }
-    timestamp = NextTimeStamp();
-    //  Compress();
-  }
-
-
-
-
-
-  void Mesh :: FreeOpenElementsEnvironment (int layers)
-  {
-    int i, j, k;
-    PointIndex pi;
-    const int large = 9999;
-    ARRAY<int,PointIndex::BASE> dist(GetNP());
-
-    dist = large;
-
-    for (i = 1; i <= GetNOpenElements(); i++)
-      {
-	const Element2d & face = OpenElement(i);
-	for (j = 1; j <= face.GetNP(); j++)
-	  dist[face.PNum(j)] = 1;
-      }
-
-    for (k = 1; k <= layers; k++)
-      for (i = 1; i <= GetNE(); i++)
-	{
-	  const Element & el = VolumeElement(i);
-	  if (el[0] == -1 || el.IsDeleted()) continue;
-
-	  int elmin = large;
-	  for (j = 0; j < el.GetNP(); j++)
-	    if (dist[el[j]] < elmin)
-	      elmin = dist[el[j]];
-
-	  if (elmin < large)
-	    {
-	      for (j = 0; j < el.GetNP(); j++)
-		if (dist[el[j]] > elmin+1)
-		  dist[el[j]] = elmin+1;
-	    }
-	}
-
-    int cntfree = 0;
-    for (i = 1; i <= GetNE(); i++)
-      {
-	const Element & el = VolumeElement(i);
-	if (el[0] == -1 || el.IsDeleted()) continue;
-	
-	int elmin = large;
-	for (j = 0; j < el.GetNP(); j++)
-	  if (dist[el[j]] < elmin)
-	    elmin = dist[el[j]];
-      
-	eltyps.Elem(i) = (elmin <= layers) ? 
-	  FREEELEMENT : FIXEDELEMENT;
-	if (elmin <= layers)
-	  cntfree++;
-      }
-
-    PrintMessage (5, "free: ", cntfree, ", fixed: ", GetNE()-cntfree);
-    (*testout) << "free: " << cntfree << ", fixed: " << GetNE()-cntfree << endl;
-
-    for (pi = PointIndex::BASE; 
-	 pi < GetNP()+PointIndex::BASE; pi++)
-      {
-	if (dist[pi] > layers+1)
-	  points[pi].SetType(FIXEDPOINT);
-      }
-  }
-
-
-
-  void Mesh :: SetLocalH (const Point3d & pmin, const Point3d & pmax, double grading)
-  {
-    Point3d c = Center (pmin, pmax);
-    double d = max3 (pmax.X()-pmin.X(),
-		     pmax.Y()-pmin.Y(),
-		     pmax.Z()-pmin.Z());
-    d /= 2;
-    Point3d pmin2 = c - Vec3d (d, d, d);
-    Point3d pmax2 = c + Vec3d (d, d, d);
-  
-
-    delete lochfunc;
-    lochfunc = new LocalH (pmin2, pmax2, grading);
-  }
-
-  void Mesh :: RestrictLocalH (const Point3d & p, double hloc)
-  {
-    //cout << "restrict h in " << p << " to " << hloc << endl;
-    if (!lochfunc)
-      {
-	PrintWarning("RestrictLocalH called, creating mesh-size tree");
-
-	Point3d boxmin, boxmax;
-	GetBox (boxmin, boxmax);
-	SetLocalH (boxmin, boxmax, 0.8);
-      }
-
-    lochfunc -> SetH (p, hloc);
-  }
-
-  void Mesh :: RestrictLocalHLine (const Point3d & p1, 
-				   const Point3d & p2,
-				   double hloc)
-  {
-    // cout << "restrict h along " << p1 << " - " << p2 << " to " << hloc << endl;
-    int i;
-    int steps = int (Dist (p1, p2) / hloc) + 2;
-    Vec3d v(p1, p2);
-  
-    for (i = 0; i <= steps; i++)
-      {
-	Point3d p = p1 + (double(i)/double(steps) * v);
-	RestrictLocalH (p, hloc);
-      }
-  }
-
-
-  void Mesh :: SetGlobalH (double h)
-  {
-    hglob = h;
-  }
-
-  double Mesh :: MaxHDomain (int dom) const
-  {
-    if (maxhdomain.Size())
-      return maxhdomain.Get(dom);
-    else
-      return 1e10;
-  }
-
-  void Mesh :: SetMaxHDomain (const ARRAY<double> & mhd)
-  {
-    maxhdomain.SetSize(mhd.Size());
-    for (int i = 1; i <= mhd.Size(); i++)
-      maxhdomain.Elem(i) = mhd.Get(i);
-  }
-
-
-  double Mesh :: GetH (const Point3d & p) const
-  {
-    double hmin = hglob;
-    if (lochfunc)
-      {
-	double hl = lochfunc->GetH (p);
-	if (hl < hglob)
-	  hmin = hl;
-      }
-    return hmin;
-  }
-
-  double Mesh :: GetMinH (const Point3d & pmin, const Point3d & pmax)
-  {
-    double hmin = hglob;
-    if (lochfunc)
-      {
-	double hl = lochfunc->GetMinH (pmin, pmax);
-	if (hl < hmin)
-	  hmin = hl;
-      }
-    return hmin;
-  }
-
-
-
-
-
-  double Mesh :: AverageH (int surfnr) const
-  {
-    int i, j, n;
-    double hi, hsum;
-    double maxh = 0, minh = 1e10;
-
-    hsum = 0;
-    n = 0;
-    for (i = 1; i <= GetNSE(); i++)
-      {
-	const Element2d & el = SurfaceElement(i);
-	if (surfnr == 0 || el.GetIndex() == surfnr)
-	  {
-	    for (j = 1; j <= 3; j++)
-	      {
-		hi = Dist (Point (el.PNumMod(j)), 
-			   Point (el.PNumMod(j+1)));
-
-		hsum += hi;
-
-		if (hi > maxh) maxh = hi;
-		if (hi < minh) minh = hi;
-		n++;
-	      }
-	  }
-      }
-
-    PrintMessage (5, "minh = ", minh, " avh = ", (hsum/n), " maxh = ", maxh);
-    return (hsum / n);
-  }
-
-
-
-  void Mesh :: CalcLocalH () 
-  {
-    if (!lochfunc)
-      {
-	Point3d pmin, pmax;
-	GetBox (pmin, pmax);
-	SetLocalH (pmin, pmax, mparam.grading);
-      }
-
-    PrintMessage (3,
-		  "CalcLocalH: ", 
-		  GetNP(), " Points ", 
-		  GetNE(), " Elements ", 
-		  GetNSE(), " Surface Elements");
-
-
-    int i;
-    for (i = 0; i < GetNSE(); i++)
-      {
-	const Element2d & el = surfelements[i];
-	int j;
-
-	if (el.GetNP() == 3)
-	  {
-	    double hel = -1;
-	    for (j = 1; j <= 3; j++)
-	      {
-		const Point3d & p1 = points[el.PNumMod(j)];
-		const Point3d & p2 = points[el.PNumMod(j+1)];
-	      
-		/*
-		  INDEX_2 i21(el.PNumMod(j), el.PNumMod(j+1));
-		  INDEX_2 i22(el.PNumMod(j+1), el.PNumMod(j));
-		  if (! identifiedpoints->Used (i21) &&
-		  ! identifiedpoints->Used (i22) )
-		*/
-		if (!ident -> UsedSymmetric (el.PNumMod(j),
-					     el.PNumMod(j+1)))
-		  {
-		    double hedge = Dist (p1, p2);
-		    if (hedge > hel)
-		      hel = hedge;
-		    //		  lochfunc->SetH (Center (p1, p2), 2 * Dist (p1, p2));
-		    //		  (*testout) << "trigseth, p1,2 = " << el.PNumMod(j) << ", " << el.PNumMod(j+1) 
-		    //			     << " h = " << (2 * Dist(p1, p2)) << endl;
-		  }
-	      }
-	  
-	    if (hel > 0)
-	      {
-		const Point3d & p1 = points[el.PNum(1)];
-		const Point3d & p2 = points[el.PNum(2)];
-		const Point3d & p3 = points[el.PNum(3)];
-		lochfunc->SetH (Center (p1, p2, p3), hel);
-	      }
-	  }
-	else
-	  {
-	    {
-	      const Point3d & p1 = points[el.PNum(1)];
-	      const Point3d & p2 = points[el.PNum(2)];
-	      lochfunc->SetH (Center (p1, p2), 2 * Dist (p1, p2));
-	    }
-	    {
-	      const Point3d & p1 = points[el.PNum(3)];
-	      const Point3d & p2 = points[el.PNum(4)];
-	      lochfunc->SetH (Center (p1, p2), 2 * Dist (p1, p2));
-	    }
-	  }
-      }
-
-    for (i = 0; i < GetNSeg(); i++)
-      {
-	const Segment & seg = segments[i];
-	const Point3d & p1 = points[seg.p1];
-	const Point3d & p2 = points[seg.p2];
-	/*
-	  INDEX_2 i21(seg.p1, seg.p2);
-	  INDEX_2 i22(seg.p2, seg.p1);
-	  if (identifiedpoints)
-	  if (!identifiedpoints->Used (i21) && !identifiedpoints->Used (i22))
-	*/
-	if (!ident -> UsedSymmetric (seg.p1, seg.p2))
-	  {
-	    lochfunc->SetH (Center (p1, p2), Dist (p1, p2));
-	  }
-      }
-    /*
-      cerr << "do vol" << endl;
-      for (i = 1; i <= GetNE(); i++)
-      {
-      const Element & el = VolumeElement(i);
-      if (el.GetType() == TET)
-      {
-      int j, k;
-      for (j = 2; j <= 4; j++)
-      for (k = 1; k < j; k++)  
-      {
-      const Point3d & p1 = Point (el.PNum(j));
-      const Point3d & p2 = Point (el.PNum(k));
-      lochfunc->SetH (Center (p1, p2), 2 * Dist (p1, p2));
-      (*testout) << "set vol h to " << (2 * Dist (p1, p2)) << endl;
-
-      }
-      }
-      }
-    */
-
-    /*
-      const char * meshsizefilename = 
-      globflags.GetStringFlag ("meshsize", NULL);
-      if (meshsizefilename)
-      {
-      ifstream msf(meshsizefilename);
-      if (msf)
-      {
-      int nmsp;
-      msf >> nmsp;
-      for (i = 1; i <= nmsp; i++)
-      {
-      Point3d pi;
-      double hi;
-      msf >> pi.X() >> pi.Y() >> pi.Z();
-      msf >> hi;
-      lochfunc->SetH (pi, hi);
-      }
-      }
-      }
-    */
-    //  lochfunc -> Convexify();
-    //  lochfunc -> PrintMemInfo (cout);
-  }
-
-
-  void Mesh :: CalcLocalHFromPointDistances(void)
-  {
-    PrintMessage (3, "Calculating local h from point distances");
-  
-    if (!lochfunc)
-      {
-	Point3d pmin, pmax;
-	GetBox (pmin, pmax);
-      
-	SetLocalH (pmin, pmax, mparam.grading);
-      }
-
-    PointIndex i,j;
-    double hl;
-
-  
-    for (i = PointIndex::BASE; 
-	 i < GetNP()+PointIndex::BASE; i++)
-      {
-	for(j=i+1; j<GetNP()+PointIndex::BASE; j++)
-	  {
-	    const Point3d & p1 = points[i];
-	    const Point3d & p2 = points[j];
-	    hl = Dist(p1,p2);
-	    RestrictLocalH(p1,hl);
-	    RestrictLocalH(p2,hl);
-	    //cout << "restricted h at " << p1 << " and " << p2 << " to " << hl << endl;
-	  }
-      }
-  
-
-  }
-
-
-  void Mesh :: CalcLocalHFromSurfaceCurvature (double elperr) 
-  {
-    PrintMessage (3, "Calculating local h from surface curvature");
-
-    if (!lochfunc)
-      {
-	Point3d pmin, pmax;
-	GetBox (pmin, pmax);
-      
-	SetLocalH (pmin, pmax, mparam.grading);
-      }
-
-  
-    INDEX_2_HASHTABLE<int> edges(3 * GetNP() + 2);
-    INDEX_2_HASHTABLE<int> bedges(GetNSeg() + 2);
-    int i, j;
-
-    for (i = 1; i <= GetNSeg(); i++)
-      {
-	const Segment & seg = LineSegment(i);
-	INDEX_2 i2(seg.p1, seg.p2);
-	i2.Sort();
-	bedges.Set (i2, 1);
-      }
-    for (i = 1; i <= GetNSE(); i++)
-      {
-	const Element2d & sel = SurfaceElement(i);
-	if (!sel.PNum(1))
-	  continue;
-	for (j = 1; j <= 3; j++)
-	  {
-	    INDEX_2 i2(sel.PNumMod(j), sel.PNumMod(j+1));
-	    i2.Sort();
-	    if (bedges.Used(i2)) continue;
-
-	    if (edges.Used(i2))
-	      {
-		int other = edges.Get(i2);
-
-		const Element2d & elother = SurfaceElement(other);
-
-		int pi3 = 1;
-		while ( (sel.PNum(pi3) == i2.I1()) || 
-			(sel.PNum(pi3) == i2.I2()))
-		  pi3++;
-		pi3 = sel.PNum(pi3);
-
-		int pi4 = 1;
-		while ( (elother.PNum(pi4) == i2.I1()) || 
-			(elother.PNum(pi4) == i2.I2()))
-		  pi4++;
-		pi4 = elother.PNum(pi4);
-
-		double rad = ComputeCylinderRadius (Point (i2.I1()),
-						    Point (i2.I2()),
-						    Point (pi3), 
-						    Point (pi4));
-	      
-		RestrictLocalHLine (Point(i2.I1()), Point(i2.I2()), rad/elperr);
-
-
-		/*	      
-			     (*testout) << "pi1,2, 3, 4 = " << i2.I1() << ", " << i2.I2() << ", " << pi3 << ", " << pi4
-			     << " p1 = " << Point(i2.I1()) 
-			     << ", p2 = " << Point(i2.I2()) 
-			     //			 << ", p3 = " << Point(pi3) 
-			     //			 << ", p4 = " << Point(pi4) 
-			     << ", rad = " << rad << endl;
-		*/
-	      }
-	    else
-	      edges.Set (i2, i);
-	  }
-      }
-
-
-    // Restrict h due to line segments
-
-    for (i = 1; i <= GetNSeg(); i++)
-      {
-	const Segment & seg = LineSegment(i);
-	const Point3d & p1 = Point(seg.p1);
-	const Point3d & p2 = Point(seg.p2);
-	RestrictLocalH (Center (p1, p2),  Dist (p1, p2));
-      }
-
-
-
-    /*
-
-
-    int i, j;
-    int np = GetNP();
-    int nseg = GetNSeg();
-    int nse = GetNSE();
-  
-    ARRAY<Vec3d> normals(np);
-    BitArray linepoint(np);
-
-    linepoint.Clear();
-    for (i = 1; i <= nseg; i++)
-    {
-    linepoint.Set (LineSegment(i).p1);
-    linepoint.Set (LineSegment(i).p2);
-    }
-
-    for (i = 1; i <= np; i++)
-    normals.Elem(i) = Vec3d(0,0,0);
-
-    for (i = 1; i <= nse; i++)
-    {
-    Element2d & el = SurfaceElement(i);
-    Vec3d nf = Cross (Vec3d (Point (el.PNum(1)), Point(el.PNum(2))),
-    Vec3d (Point (el.PNum(1)), Point(el.PNum(3))));
-    for (j = 1; j <= 3; j++)
-    normals.Elem(el.PNum(j)) += nf;
-    }
-
-    for (i = 1; i <= np; i++)
-    normals.Elem(i) /= (1e-12 + normals.Elem(i).Length());
-
-    for (i = 1; i <= nse; i++)
-    {
-    Element2d & el = SurfaceElement(i);
-    Vec3d nf = Cross (Vec3d (Point (el.PNum(1)), Point(el.PNum(2))),
-    Vec3d (Point (el.PNum(1)), Point(el.PNum(3))));
-    nf /= nf.Length();
-    Point3d c = Center (Point(el.PNum(1)),
-    Point(el.PNum(2)),
-    Point(el.PNum(3)));
-			  
-    for (j = 1; j <= 3; j++)
-    {
-    if (!linepoint.Test (el.PNum(j)))
-    {
-    double dist = Dist (c, Point(el.PNum(j)));
-    double dn = (nf - normals.Get(el.PNum(j))).Length();
-	  
-    RestrictLocalH (Point(el.PNum(j)), dist / (dn+1e-12) /elperr);
-    }
-    }
-    }
-    */
-  }
-
-
-  void Mesh :: RestrictLocalH (resthtype rht, int nr, double loch)
-  {
-    int i;
-    switch (rht)
-      {
-      case RESTRICTH_FACE:
-	{
-	  for (i = 1; i <= GetNSE(); i++)
-	    {
-	      const Element2d & sel = SurfaceElement(i);
-	      if (sel.GetIndex() == nr)
-		RestrictLocalH (RESTRICTH_SURFACEELEMENT, i, loch);
-	    }
-	  break;
-	}
-      case RESTRICTH_EDGE:
-	{
-	  for (i = 1; i <= GetNSeg(); i++)
-	    {
-	      const Segment & seg = LineSegment(i);
-	      if (seg.edgenr == nr)
-		RestrictLocalH (RESTRICTH_SEGMENT, i, loch);
-	    }
-	  break;
-	}
-      case RESTRICTH_POINT:
-	{
-	  RestrictLocalH (Point (nr), loch);
-	  break;
-	}
-
-      case RESTRICTH_SURFACEELEMENT:
-	{
-	  const Element2d & sel = SurfaceElement(nr);
-	  Point3d p = Center (Point(sel.PNum(1)),
-			      Point(sel.PNum(2)),
-			      Point(sel.PNum(3)));
-	  RestrictLocalH (p, loch);
-	  break;
-	}
-      case RESTRICTH_SEGMENT:
-	{
-	  const Segment & seg = LineSegment(nr);
-	  RestrictLocalHLine (Point (seg.p1), Point(seg.p2), loch);
-	  break;
-	}
-      }
-  }
-
-
-  void Mesh :: LoadLocalMeshSize (const char * meshsizefilename)
-  {
-    if (!meshsizefilename) return;
-
-    ifstream msf(meshsizefilename);
-
-    if (!msf) return;
-
-    PrintMessage (3, "Load local mesh-size");
-    int nmsp, nmsl;
-    msf >> nmsp;
-    for (int i = 0; i < nmsp; i++)
-      {
-	Point3d pi;
-	double hi;
-	msf >> pi.X() >> pi.Y() >> pi.Z();
-	msf >> hi;
-	if (!msf.good())
-	  throw NgException ("problem in mesh-size file\n");
-	RestrictLocalH (pi, hi);
-      }
-    msf >> nmsl;
-    for (int i = 0; i < nmsl; i++)
-      {
-	Point3d p1, p2;
-	double hi;
-	msf >> p1.X() >> p1.Y() >> p1.Z();
-	msf >> p2.X() >> p2.Y() >> p2.Z();
-	msf >> hi;
-	if (!msf.good())
-	  throw NgException ("problem in mesh-size file\n");
-	RestrictLocalHLine (p1, p2, hi);
-      }  
-  }
-
-
-
-  void Mesh :: GetBox (Point3d & pmin, Point3d & pmax, int dom) const
-  {
-    if (points.Size() == 0)
-      {
-	pmin = pmax = Point3d(0,0,0);
-	return;
-      }
-
-    if (dom <= 0)
-      {
-	pmin = Point3d (1e10, 1e10, 1e10);
-	pmax = Point3d (-1e10, -1e10, -1e10); 
-
-	for (PointIndex pi = PointIndex::BASE; 
-	     pi < GetNP()+PointIndex::BASE; pi++)
-	  {
-	    pmin.SetToMin ( (*this) [pi] );
-	    pmax.SetToMax ( (*this) [pi] );
-	  }
-      }
-    else
-      {
-	int j, nse = GetNSE();
-	SurfaceElementIndex sei;
-
-	pmin = Point3d (1e10, 1e10, 1e10);
-	pmax = Point3d (-1e10, -1e10, -1e10); 
-	for (sei = 0; sei < nse; sei++)
-	  {
-	    const Element2d & el = (*this)[sei];
-	    if (el.IsDeleted() ) continue;
-
-	    if (dom == -1 || el.GetIndex() == dom)
-	      {
-		for (j = 0; j < 3; j++)
-		  {
-		    pmin.SetToMin ( (*this) [el[j]] );
-		    pmax.SetToMax ( (*this) [el[j]] );
-		  }
-	      }
-	  }
-      }
-
-    if (pmin.X() > 0.5e10)
-      {
-	pmin = pmax = Point3d(0,0,0);
-      }
-  }
-
-
-
-
-  void Mesh :: GetBox (Point3d & pmin, Point3d & pmax, POINTTYPE ptyp) const
-  {
-    if (points.Size() == 0)
-      {
-	pmin = pmax = Point3d(0,0,0);
-	return;
-      }
-
-    pmin = Point3d (1e10, 1e10, 1e10);
-    pmax = Point3d (-1e10, -1e10, -1e10); 
-  
-    for (PointIndex pi = PointIndex::BASE; 
-	 pi < GetNP()+PointIndex::BASE; pi++)
-      if (points[pi].Type() <= ptyp)
-	{
-	  pmin.SetToMin ( (*this) [pi] );
-	  pmax.SetToMax ( (*this) [pi] );
-	}
-  }
-
-
-
-
-  double Mesh :: ElementError (int eli) const
-  {
-    const Element & el = volelements.Get(eli);
-    return CalcTetBadness (points.Get(el[0]), points.Get(el[1]),
-			   points.Get(el[2]), points.Get(el[3]), -1);
-  }
-
-  void Mesh :: AddLockedPoint (PointIndex pi)
-  { 
-    lockedpoints.Append (pi); 
-  }
-
-  void Mesh :: ClearLockedPoints ()
-  { 
-    lockedpoints.SetSize (0); 
-  }
-
-
-
-  void Mesh :: Compress ()
-  {
-    int i, j;
-    ARRAY<int,PointIndex::BASE> op2np(GetNP());
-    ARRAY<MeshPoint> hpoints;
-    BitArrayChar<PointIndex::BASE> pused(GetNP());
-
-    /*
-      (*testout) << "volels: " << endl;
-      for (i = 1; i <= volelements.Size(); i++)
-      {
-      for (j = 1; j <= volelements.Get(i).GetNP(); j++)
-      (*testout) << volelements.Get(i).PNum(j) << " ";
-      (*testout) << endl;
-      }
-      (*testout) << "np: " << GetNP() << endl;
-    */
-
-    for (i = 0; i < volelements.Size(); i++)
-      if (volelements[i][0] <= PointIndex::BASE-1 ||
-	  volelements[i].IsDeleted())
-	{
-	  volelements.Delete(i);
-	  i--;
-	}
-
-
-    for (i = 0; i < surfelements.Size(); i++)
-      if (surfelements[i].IsDeleted())
-	{
-	  surfelements.Delete(i);
-	  i--;
-	}
-
-    for (i = 0; i < segments.Size(); i++)
-      if (segments[i].p1 <= PointIndex::BASE-1)
-	{
-	  segments.Delete(i);
-	  i--;
-	}
-
-    pused.Clear();
-    for (i = 0; i < volelements.Size(); i++)
-      {
-	const Element & el = volelements[i];
-	for (j = 0; j < el.GetNP(); j++)
-	  pused.Set (el[j]);
-      }
-
-    for (i = 0; i < surfelements.Size(); i++)
-      {
-	const Element2d & el = surfelements[i];
-	for (j = 0; j < el.GetNP(); j++)
-	  pused.Set (el[j]);
-      }
-
-    for (i = 0; i < segments.Size(); i++)
-      {
-	const Segment & seg = segments[i];
-	pused.Set (seg.p1);
-	pused.Set (seg.p2);
-      }
-
-    for (i = 0; i < openelements.Size(); i++)
-      {
-	const Element2d & el = openelements[i];
-	for (j = 0; j < el.GetNP(); j++)
-	  pused.Set(el[j]);
-      }
-
-    for (i = 0; i < lockedpoints.Size(); i++)
-      pused.Set (lockedpoints[i]);
-
-
-    /*
-    // compress points doesn´t work for identified points !
-    if (identifiedpoints)
-    {
-    for (i = 1; i <= identifiedpoints->GetNBags(); i++)
-    if (identifiedpoints->GetBagSize(i))
-    {
-    pused.Set ();
-    break;
-    }
-    }
-    */
-    //  pused.Set();
-
-
-    int npi = PointIndex::BASE-1;
-
-    for (i = PointIndex::BASE; 
-	 i < points.Size()+PointIndex::BASE; i++)
-      if (pused.Test(i))
-	{
-	  npi++;
-	  op2np[i] = npi;
-	  hpoints.Append (points[i]);
-	}
-      else
-	op2np[i] = -1;
-
-
-
-    points.SetSize(0);
-    for (i = 0; i < hpoints.Size(); i++)
-      points.Append (hpoints[i]);
-
-
-    for (i = 1; i <= volelements.Size(); i++)
-      {
-	Element & el = VolumeElement(i);
-	for (j = 0; j < el.GetNP(); j++)
-	  el[j] = op2np[el[j]];
-      }
-
-    for (i = 1; i <= surfelements.Size(); i++)
-      {
-	Element2d & el = SurfaceElement(i);
-	for (j = 0; j < el.GetNP(); j++)
-	  el[j] = op2np[el[j]];
-      }
-  
-    for (i = 0; i < segments.Size(); i++)
-      {
-	Segment & seg = segments[i];
-	seg.p1 = op2np[seg.p1];
-	seg.p2 = op2np[seg.p2];
-      }
-
-    for (i = 1; i <= openelements.Size(); i++)
-      {
-	Element2d & el = openelements.Elem(i);
-	for (j = 0; j < el.GetNP(); j++)
-	  el[j] = op2np[el[j]];
-      }  
-
-
-    for (i = 0; i < lockedpoints.Size(); i++)
-      lockedpoints[i] = op2np[lockedpoints[i]];
-
-
-    CalcSurfacesOfNode();
-
-
-    //  FindOpenElements();
-    timestamp = NextTimeStamp();
-
-    /*
-      (*testout) << "compress, done" << endl
-      << "np = " << points.Size()
-      << "ne = " << volelements.Size() << ", type.size = " << eltyps.Size()
-      <<  "volelements = " << volelements << endl;
-    */
-  }
-
-
-  int Mesh :: CheckConsistentBoundary () const
-  {
-    int nf = GetNOpenElements();
-    INDEX_2_HASHTABLE<int> edges(nf+2);
-    int i, j;
-    INDEX_2 i2;
-    int err = 0;
-
-
-    for (i = 1; i <= nf; i++)
-      {
-	const Element2d & sel = OpenElement(i);
-      
-	for (j = 1; j <= sel.GetNP(); j++)
-	  {
-	    i2.I1() = sel.PNumMod(j);
-	    i2.I2() = sel.PNumMod(j+1);
-
-	    int sign = (i2.I2() > i2.I1()) ? 1 : -1;
-	    i2.Sort();
-	    if (!edges.Used (i2))
-	      edges.Set (i2, 0);
-
-	    edges.Set (i2, edges.Get(i2) + sign);
-	    /*
-
-	    if (edges.Used(i2))
-	    {
-	    int hi;
-	    hi = edges.Get(i2);
-	    if (hi != 1) 
-	    err = 1;
-	    edges.Set(i2, 2);
-	    cnt2++;
-	    }
-	    else
-	    {
-	    swap (i2.I1(), i2.I2());
-	    edges.Set(i2, 1);
-	    cnt1++;
-	    }
-	    */
-	  }
-      }
-
-
-    /*
-      if (cnt1 != cnt2)
-      err = 2;
-    */
-
-    for (i = 1; i <= edges.GetNBags(); i++)
-      for (j = 1; j <= edges.GetBagSize(i); j++)
-	{
-	  int cnt = 0;
-	  edges.GetData (i, j, i2, cnt);
-	  if (cnt)
-	    {
-	      PrintError ("Edge ", i2.I1() , " - ", i2.I2(), " multiple times in surface mesh");
-	      err = 2;
-	    }
-	}
-
-    return err;
-  }
-
-
-
-  int Mesh :: CheckOverlappingBoundary () 
-  {
-    int i, j, k;
-
-    Point3d pmin, pmax;
-    GetBox (pmin, pmax);
-    Box3dTree setree(pmin, pmax);
-    ARRAY<int> inters;
-  
-    bool overlap = 0;
-    bool incons_layers = 0;
-
-
-    for (i = 1; i <= GetNSE(); i++)
-      SurfaceElement(i).badel = 0;
-
-
-    for (i = 1; i <= GetNSE(); i++)
-      {
-	const Element2d & tri = SurfaceElement(i);
-      
-	Point3d tpmin (Point(tri[0]));
-	Point3d tpmax (tpmin);
-
-	for (k = 1; k < tri.GetNP(); k++)
-	  {
-	    tpmin.SetToMin (Point (tri[k]));
-	    tpmax.SetToMax (Point (tri[k]));
-	  }
-	Vec3d diag(tpmin, tpmax);
-
-	tpmax = tpmax + 0.1 * diag;
-	tpmin = tpmin - 0.1 * diag;
-
-	setree.Insert (tpmin, tpmax, i);
-      }
-
-    for (i = 1; i <= GetNSE(); i++)
-      {
-	const Element2d & tri = SurfaceElement(i);
-      
-	Point3d tpmin (Point(tri[0]));
-	Point3d tpmax (tpmin);
-
-	for (k = 1; k < tri.GetNP(); k++)
-	  {
-	    tpmin.SetToMin (Point (tri[k]));
-	    tpmax.SetToMax (Point (tri[k]));
-	  }
-
-	setree.GetIntersecting (tpmin, tpmax, inters);
-
-	for (j = 1; j <= inters.Size(); j++)
-	  {
-	    const Element2d & tri2 = SurfaceElement(inters.Get(j));	  
-
-	    if ( (*this)[tri[0]].GetLayer() != (*this)[tri2[0]].GetLayer())
-	      continue;
-
-	    if ( (*this)[tri[0]].GetLayer() != (*this)[tri[1]].GetLayer() ||
-		 (*this)[tri[0]].GetLayer() != (*this)[tri[2]].GetLayer())
-	      {
-		incons_layers = 1;
-		cout << "inconsistent layers in triangle" << endl;
-	      }
-
-
-	    const Point3d *trip1[3], *trip2[3];	  
-	    for (k = 1; k <= 3; k++)
-	      {
-		trip1[k-1] = &Point (tri.PNum(k));
-		trip2[k-1] = &Point (tri2.PNum(k));
-	      }
-
-	    if (IntersectTriangleTriangle (&trip1[0], &trip2[0]))
-	      {
-		overlap = 1;
-		PrintWarning ("Intersecting elements" 
-			      ,i, " and ", inters.Get(j));
-
-		(*testout) << "Intersecting: " << endl;
-		(*testout) << "openelement " << i << " with open element " << inters.Get(j) << endl;
-
-		cout << "el1 = " << tri << endl;
-		cout << "el2 = " << tri2 << endl;
-		cout << "layer1 = " <<  (*this)[tri[0]].GetLayer() << endl;
-		cout << "layer2 = " <<  (*this)[tri2[0]].GetLayer() << endl;
-
-
-		for (k = 1; k <= 3; k++)
-		  (*testout) << tri.PNum(k) << "  ";
-		(*testout) << endl;
-		for (k = 1; k <= 3; k++)
-		  (*testout) << tri2.PNum(k) << "  ";
-		(*testout) << endl;
-
-		for (k = 0; k <= 2; k++)
-		  (*testout) << *trip1[k] << "   ";
-		(*testout) << endl;
-		for (k = 0; k <= 2; k++)
-		  (*testout) << *trip2[k] << "   ";
-		(*testout) << endl;
-
-
-		/*
-		  INDEX_3 i3(tri.PNum(1), tri.PNum(2), tri.PNum(3));
-		  i3.Sort();
-		  for (k = 1; k <= GetNSE(); k++)
-		  {
-		  const Element2d & el2 = SurfaceElement(k);
-		  INDEX_3 i3b(el2.PNum(1), el2.PNum(2), el2.PNum(3));
-		  i3b.Sort();
-		  if (i3 == i3b)
-		  {
-		  SurfaceElement(k).badel = 1;
-		  }
-		  }
-		*/
-		SurfaceElement(i).badel = 1;
-		SurfaceElement(inters.Get(j)).badel = 1;
-	      }
-	  }
-      }
-
-    // bug 'fix'
-    if (incons_layers) overlap = 0;
-
-    return overlap;
-  }
-
-
-  int Mesh :: CheckVolumeMesh () const
-  {
-    PrintMessage (3, "Checking volume mesh");
-  
-    int ne = GetNE();
-    DenseMatrix dtrans(3,3);
-    int i, j;
-
-    PrintMessage (5, "elements: ", ne);
-    for (i = 1; i <= ne; i++)
-      {
-	Element & el = (Element&) VolumeElement(i);
-	el.flags.badel = 0;
-	int nip = el.GetNIP();
-	for (j = 1; j <= nip; j++)
-	  {
-	    el.GetTransformation (j, Points(), dtrans);
-	    double det = dtrans.Det();
-	    if (det > 0)
-	      {
-		PrintError ("Element ", i , " has wrong orientation");
-		el.flags.badel = 1;
-	      }
-	  }
-      }
-
-    return 0;
-  }
-
-
-  bool Mesh :: LegalTrig (const Element2d & el) const
-  {
-    return 1;
-    if ( /* hp */ 1)  // needed for old, simple hp-refinement
-      { 
-	// trigs with 2 or more segments are illegal
-	int i;
-	int nseg = 0;
-
-	if (!segmentht)
-	  {
-	    cerr << "no segmentht allocated" << endl;
-	    return 0;
-	  }
-
-	//      Point3d cp(0.5, 0.5, 0.5);
-	for (i = 1; i <= 3; i++)
-	  {
-	    INDEX_2 i2(el.PNumMod (i), el.PNumMod (i+1));
-	    i2.Sort();
-	    if (segmentht -> Used (i2))
-	      nseg++;
-	  }
-	if (nseg >= 2) 
-	  return 0;
-      }
-    return 1;
-  }
-
-  ///
-  bool Mesh :: LegalTet2 (Element & el) const
-  {
-    //  return 1;
-    // Test, whether 4 points have a common surface plus
-    // at least 4 edges at the boundary
-
-    int i, j, k;
-  
-    // non-tets are always legal
-    if (el.GetType() != TET)
-      {
-	el.SetLegal (1);
-	return 1;
-      }
-
-    // element has at least 2 inner points ---> legal
-    int cnti = 0;
-    for (j = 0; j < 4; j++)
-      if (PointType(el[j]) == INNERPOINT)
-	cnti++;
-    if (cnti >= 2)
-      {
-	el.SetLegal (1);
-	return 1;
-      }
-
-    // which faces are boundary faces ?
-    Element2d face;
-    int bface[4];
-
-    for (i = 1; i <= 4; i++)
-      {
-	el.GetFace (i, face);
-	INDEX_3 i3 (face.PNum(1), face.PNum(2), face.PNum(3));
-	i3.Sort();
-	bface[i-1] = surfelementht->Used (i3);
-      }
-
-    int bedge[4][4];
-    int segedge[4][4];
-    for (i = 0; i < 4; i++)
-      for (j = 0; j < i; j++)
-	{
-	  bool sege = 0, be = 0;
-
-	  INDEX_2 i2(el[i], el[j]);
-	  i2.Sort();
-
-	  /*	
-	    if (boundaryedges -> Used(i2))
-	    {
-	    be = 1;
-	    if (boundaryedges -> Get(i2) == 2)
-	    sege = 1;
-	    }
-	  */
-	  int pos = boundaryedges -> Position(i2);
-	  if (pos)
-	    {
-	      be = 1;
-	      if (boundaryedges -> GetData(pos) == 2)
-		sege = 1;
-	    }
-
-	  segedge[j][i] = segedge[i][j] = sege;
-	  bedge[j][i] = bedge[i][j] = be;
-	}
-
-    // two boundary faces and no edge is illegal
-    for (i = 0; i < 3; i++)
-      for (j = i+1; j < 4; j++)
-	{
-	  if (bface[i] && bface[j])
-	    {
-	      // common nodes:
-	      int pi1 = 0, pi2;
-	      while (pi1 == i || pi1 == j)
-		pi1++;
-	      pi2 = 6 - i - j - pi1;
-	      if (!segedge[pi1][pi2])
-		{
-		  // 2 boundary faces withoud edge in between
-		  el.SetLegal (0);
-		  return 0;
-		}
-	    }
-	}
-
-
-    // three boundary edges meeting in a Surface point
-    for (i = 0; i < 4; i++)
-      {
-	bool alledges = 1;
-	if (PointType(el[i]) == SURFACEPOINT)
-	  {
-	    for (j = 0; j < 4; j++)
-	      if (j != i)
-		{
-		  if (!bedge[i][j])
-		    {
-		      alledges = 0;
-		      break;
-		    }
-		}
-	    if (alledges)
-	      {
-		//	      cout << "tet illegal due to unmarked node" << endl;
-		el.SetLegal (0);
-		return 0;
-	      }
-	  }
-      }
-
-
-    /*  
-	{
-	// having 3 boundary edges and 4 surface nodes ???
-	int nodehasedge[4];
-	int canbe = 1;   // can be that illegal tet
-
-	for (i = 0; i < 4; i++)
-	nodehasedge[i] = 0;
-	for (i = 1; i <= 4; i++)
-	{
-	if (PointType(el.PNum(i)) != SURFACEPOINT)
-	canbe = 0;
-	for (j = i+1; j <= 4; j++)
-	{
-	INDEX_2 i2(el.PNum(i), el.PNum(j));
-	i2.Sort();
-	if (boundaryedges->Used(i2))
-	{
-	nodehasedge[i-1] = 1;
-	nodehasedge[j-1] = 1;
-	}
-
-	}
-	}
-	for (i = 0; i < 4; i++)
-	if (!nodehasedge[i])
-	canbe = 0;
-
-	if (canbe) return 0;
-    
-	}
-    */
-
-    {
-      // two connected edges on surface, but no face
-
-      int ltestmode = 0; // (el.PNum(1) == 10516);
-
-      if (ltestmode)
-	{
-	  (*testout) << "pnums: " << endl;
-	  for (i = 1; i <= 4; i++)
-	    (*testout) << el.PNum(i) << " ";
-	  (*testout) << endl;
-	}
-
-      for (i = 1; i <= 4; i++)
-	if (PointType(el.PNum(i)) == SURFACEPOINT)
-	  for (j = 1; j <= 4; j++)
-	    if (j != i)
-	      for (k = j+1; k <= 4; k++)
-		if (k != i)
-		  {
-		    int fnr = 10 - i - j - k;
-
-		    if (!bface[fnr-1] &&
-			bedge[i-1][j-1] &&
-			bedge[i-1][k-1])
-		      {
-			el.SetLegal (0);
-			return 0;
-		      }
-		    /*
-		      INDEX_2 e1(el.PNum(i), el.PNum(j));
-		      e1.Sort();
-		      INDEX_2 e2(el.PNum(i), el.PNum(k));
-		      e2.Sort();
-		      INDEX_3 face(el.PNum(i), el.PNum(j), el.PNum(k));
-		      face.Sort();
-		  
-		      if (ltestmode)
-		      {
-		      (*testout) << "i, j, k = " << i << ", " << j << ", " << k << endl;
-		      (*testout) << "eij = " << boundaryedges->Used(e1) 
-		      << " eik = " << boundaryedges->Used(e2) 
-		      << " face = " << surfelementht->Used (face) << endl;
-		      
-		      }
-		  
-		      if (boundaryedges->Used(e1) && 
-		      boundaryedges->Used(e2) &&
-		      !surfelementht->Used (face))
-		      {
-		      //		      cout << "tet illegal due to last case" << endl;
-		      el.SetLegal (0);
-		      return 0;
-		      }
-		    */
-		  }
-    
-    }
-
-
-    {
-      // connected surface edge and edge edge, but no face
-
-      for (i = 1; i <= 4; i++)
-	if (PointType(el.PNum(i)) == EDGEPOINT)
-	  for (j = 1; j <= 4; j++)
-	    if (j != i)
-	      for (k = j+1; k <= 4; k++)
-		if (k != i)
-		  {
-		    int fnr = 10 - i - j - k;
-
-		    if (!bface[fnr-1] &&
-			(bedge[i-1][j-1] && segedge[i-1][k-1] ||
-			 segedge[i-1][j-1] && bedge[i-1][k-1]))
-		      {
-			el.SetLegal (0);
-			return 0;
-		      }
-		  }
-    
-    }
-
-
-
-
-
-    
-    el.SetLegal (1);
-    return 1;
-  
-    /*
-      int i1, i2, i3, i4, j;
-      if (PointType(el.PNum(1)) != INNERPOINT && 
-      PointType(el.PNum(2)) != INNERPOINT && 
-      PointType(el.PNum(3)) != INNERPOINT &&
-      PointType(el.PNum(4)) != INNERPOINT)
-      {      
-      for (i1 = 1; i1 <= surfacesonnode.EntrySize(el.PNum(1)); i1++)
-      for (i2 = 1; i2 <= surfacesonnode.EntrySize(el.PNum(2)); i2++)
-      if (surfacesonnode.Get(el.PNum(1), i1) == 
-      surfacesonnode.Get(el.PNum(2), i2))
-      for (i3 = 1; i3 <= surfacesonnode.EntrySize(el.PNum(3)); i3++)
-      if (surfacesonnode.Get(el.PNum(1), i1) == 
-      surfacesonnode.Get(el.PNum(3), i3))
-      for (i4 = 1; i4 <= surfacesonnode.EntrySize(el.PNum(4)); i4++)
-      if (surfacesonnode.Get(el.PNum(1), i1) == 
-      surfacesonnode.Get(el.PNum(4), i4))
-      {
-      int j, numbe = 0;
-      INDEX_2 i2;
-
-      for (j = 1; j <= 6; j++)
-      {
-      switch (j)
-      {
-      case 1:
-      i2.I1() = el.PNum(1);
-      i2.I2() = el.PNum(2); break;
-      case 2: 
-      i2.I1() = el.PNum(1); 
-      i2.I2() = el.PNum(3); break;
-      case 3: 
-      i2.I1() = el.PNum(1); 
-      i2.I2() = el.PNum(4); break;
-      case 4:
-      i2.I1() = el.PNum(2); 
-      i2.I2() = el.PNum(3); break;
-      case 5:
-      i2.I1() = el.PNum(2);
-      i2.I2() = el.PNum(4); break;
-      case 6: 
-      i2.I1() = el.PNum(3); 
-      i2.I2() = el.PNum(4); break;
-      }
-
-      i2.Sort();
-      if (boundaryedges->Used (i2)) numbe++;
-      }
-
-      if (numbe >= 4)
-      {
-      // 			  (*testout) 
-      // 			    << "Tet illegal: " 
-      // 			    << "mat = " << el.GetIndex() << " "
-      // 			    << "surf = " << surfacesonnode.Get(el.PNum(1), i1) 
-      // 			    << " " 
-      // 			    << el.PNum(1) << " "
-      // 			    << el.PNum(2) << " "
-      // 			    << el.PNum(3) << " "
-      // 			    << el.PNum(4) << endl;
-
-      return 0;
-      }
-      }
-      }
-      return 1;
-    */
-  }
-
-
-  int Mesh :: GetNDomains() const
-  {
-    int ndom = 0;
-
-    for (int k = 0; k < facedecoding.Size(); k++)
-      {
-	if (facedecoding[k].DomainIn() > ndom)
-	  ndom = facedecoding[k].DomainIn();
-	if (facedecoding[k].DomainOut() > ndom)
-	  ndom = facedecoding[k].DomainOut();
-      }
-
-    return ndom;
-  }
-
-
-
-  void Mesh :: SurfaceMeshOrientation ()
-  {
-    int i, j;
-    int nse = GetNSE();
-  
-    BitArray used(nse);
-    used.Clear();
-    INDEX_2_HASHTABLE<int> edges(nse+1);
-
-    bool haschanged = 0;
-
-
-    const Element2d & tri = SurfaceElement(1);
-    for (j = 1; j <= 3; j++)
-      {
-	INDEX_2 i2(tri.PNumMod(j), tri.PNumMod(j+1));
-	edges.Set (i2, 1);
-      }
-    used.Set(1);
-
-    bool unused;
-    do
-      {
-	bool changed;
-	do
-	  {
-	    changed = 0;
-	    for (i = 1; i <= nse; i++)
-	      if (!used.Test(i))
-		{
-		  Element2d & el = surfelements.Elem(i);
-		  int found = 0, foundrev = 0;
-		  for (j = 1; j <= 3; j++)
-		    {
-		      INDEX_2 i2(el.PNumMod(j), el.PNumMod(j+1));
-		      if (edges.Used(i2))
-			foundrev = 1;
-		      swap (i2.I1(), i2.I2());
-		      if (edges.Used(i2))
-			found = 1;
-		    }
-		
-		  if (found || foundrev)
-		    {
-		      if (foundrev)
-			swap (el.PNum(2), el.PNum(3));
-		    
-		      changed = 1;
-		      for (j = 1; j <= 3; j++)
-			{
-			  INDEX_2 i2(el.PNumMod(j), el.PNumMod(j+1));
-			  edges.Set (i2, 1);
-			}
-		      used.Set (i);
-		    }
-		}
-	    if (changed)
-	      haschanged = 1;
-	  }
-	while (changed);
-      
-
-	unused = 0;
-	for (i = 1; i <= nse; i++)
-	  if (!used.Test(i))
-	    {
-	      unused = 1;
-	      const Element2d & tri = SurfaceElement(i);
-	      for (j = 1; j <= 3; j++)
-		{
-		  INDEX_2 i2(tri.PNumMod(j), tri.PNumMod(j+1));
-		  edges.Set (i2, 1);
-		}
-	      used.Set(i);
-	      break;
-	    }
-      }
-    while (unused);
-
-    if (haschanged)
-      timestamp = NextTimeStamp();
-  }
-  
-
-  void Mesh :: Split2Tets()
-  {
-    // int oldne, oldnse;
-    // int i, j, k, l;
-  
-    bool has_prisms = 0;
-
-    int oldne = GetNE(); 
-    for (int i = 1; i <= oldne; i++)
-      {
-	Element el = VolumeElement(i);
-
-	if (el.GetType() == PRISM)
-	  {
-	    // prism, to 3 tets
-
-	    // make minimal node to node 1
-	    int minpi=0;
-	    PointIndex minpnum;
-	    minpnum = GetNP() + 1;
-
-	    for (int j = 1; j <= 6; j++)
-	      {
-		if (el.PNum(j) < minpnum)
-		  {
-		    minpnum = el.PNum(j);
-		    minpi = j;
-		  }
-	      }
-
-	    if (minpi >= 4)
-	      {
-		for (int j = 1; j <= 3; j++)
-		  swap (el.PNum(j), el.PNum(j+3));
-		minpi -= 3;
-	      }
-
-	    while (minpi > 1)
-	      {
-		int hi = 0;
-		for (int j = 0; j <= 3; j+= 3)
-		  {
-		    hi = el.PNum(1+j);
-		    el.PNum(1+j) = el.PNum(2+j);
-		    el.PNum(2+j) = el.PNum(3+j);
-		    el.PNum(3+j) = hi;
-		  }
-		minpi--;
-	      }
-
-	    /*
-	      version 1: edge from pi2 to pi6,
-	      version 2: edge from pi3 to pi5,
-	    */
-
-	    static const int ntets[2][12] =
-	      { { 1, 4, 5, 6, 1, 2, 3, 6, 1, 2, 5, 6 },
-		{ 1, 4, 5, 6, 1, 2, 3, 5, 3, 1, 5, 6 } };
-
-	    const int * min2pi;
-
-	    if (min2 (el.PNum(2), el.PNum(6)) <
-		min2 (el.PNum(3), el.PNum(5)))
-	      {
-		min2pi = &ntets[0][0];
-		// (*testout) << "version 1 ";
-	      }
-	    else
-	      {
-		min2pi = &ntets[1][0];
-		// (*testout) << "version 2 ";
-	      }
-
-	  
-	    int firsttet = 1;
-	    for (int j = 1; j <= 3; j++)
-	      {
-		Element nel(4);
-		for (int k = 1; k <= 4; k++)
-		  nel.PNum(k) = el.PNum(min2pi[4 * j + k - 5]);
-		nel.SetIndex (el.GetIndex());
-
-		int legal = 1;
-		for (int k = 1; k <= 3; k++)
-		  for (int l = k+1; l <= 4; l++)
-		    if (nel.PNum(k) == nel.PNum(l))
-		      legal = 0;
-
-		// (*testout) << nel << " ";
-		if (legal)
-		  {
-		    if (firsttet)
-		      {
-			VolumeElement(i) = nel;
-			firsttet = 0;
-		      }
-		    else
-		      {
-			AddVolumeElement(nel);
-		      }
-		  }
-	      }
-	    if (firsttet) (*testout) << "no legal";
-	    (*testout) << endl;
-	  }
-      
-
-
-	else if (el.GetType() == HEX)
-	  {
-	    // hex to A) 2 prisms or B) to 5 tets
-
-	    // make minimal node to node 1
-	    int minpi=0;
-	    PointIndex minpnum;
-	    minpnum = GetNP() + 1;
-
-	    for (int j = 1; j <= 8; j++)
-	      {
-		if (el.PNum(j) < minpnum)
-		  {
-		    minpnum = el.PNum(j);
-		    minpi = j;
-		  }
-	      }
-
-	    if (minpi >= 5)
-	      {
-		for (int j = 1; j <= 4; j++)
-		  swap (el.PNum(j), el.PNum(j+4));
-		minpi -= 4;
-	      }
-
-	    while (minpi > 1)
-	      {
-		int hi = 0;
-		for (int j = 0; j <= 4; j+= 4)
-		  {
-		    hi = el.PNum(1+j);
-		    el.PNum(1+j) = el.PNum(2+j);
-		    el.PNum(2+j) = el.PNum(3+j);
-		    el.PNum(3+j) = el.PNum(4+j);
-		    el.PNum(4+j) = hi;
-		  }
-		minpi--;
-	      }
-
-
-
-	    static const int to_prisms[3][12] =
-	      { { 0, 1, 2, 4, 5, 6, 0, 2, 3, 4, 6, 7 },
-		{ 0, 1, 5, 3, 2, 6, 0, 5, 4, 3, 5, 7 },
-		{ 0, 7, 4, 1, 6, 5, 0, 3, 7, 1, 2, 6 },
-	      };
-
-	    const int * min2pi = 0;
-	    if (min2 (el[4], el[6]) < min2 (el[5], el[7]))
-	      min2pi = &to_prisms[0][0];
-	    else if (min2 (el[3], el[6]) < min2 (el[2], el[7]))
-	      min2pi = &to_prisms[1][0];
-	    else if (min2 (el[1], el[6]) < min2 (el[2], el[5]))
-	      min2pi = &to_prisms[2][0];
-
-	    if (min2pi)
-	      {
-		has_prisms = 1;
-		for (int j = 0; j < 2; j++)
-		  {
-		    Element nel(PRISM);
-		    for (int k = 0; k < 6; k++)
-		      nel[k] = el[min2pi[6*j + k]];
-		    nel.SetIndex (el.GetIndex());
-		  
-		    if (j == 0)
-		      VolumeElement(i) = nel;
-		    else
-		      AddVolumeElement(nel);
-		  }
-	      }
-	    else
-	      {
-		// split to 5 tets
-	      
-		static const int to_tets[20] =
-		  {
-		    1, 2, 0, 5,
-		    3, 0, 2, 7,
-		    4, 5, 7, 0,
-		    6, 7, 5, 2,
-		    0, 2, 7, 5
-		  };
-
-		for (int j = 0; j < 5; j++)
-		  {
-		    Element nel(TET);
-		    for (int k = 0; k < 4; k++)
-		      nel[k] = el[to_tets[4*j + k]];
-		    nel.SetIndex (el.GetIndex());
-		  
-		    if (j == 0)
-		      VolumeElement(i) = nel;
-		    else
-		      AddVolumeElement(nel);
-		  }
-	      
-	      }
-	  }
-      
-
-
-
-      
-	else if (el.GetType() == PYRAMID)
-	  {
-	    // pyramid, to 2 tets
-	  
-	    static const int ntets[2][8] =
-	      { { 1, 2, 3, 5, 1, 3, 4, 5 },
-		{ 1, 2, 4, 5, 4, 2, 3, 5 }};
-
-	    const int * min2pi;
-
-	    if (min2 (el.PNum(1), el.PNum(3)) <
-		min2 (el.PNum(2), el.PNum(4)))
-	      min2pi = &ntets[0][0];
-	    else
-	      min2pi = &ntets[1][0];
-
-
-	    int firsttet = 1;
-	    for (int j = 1; j <= 2; j++)
-	      {
-		Element nel(4);
-		for (int k = 1; k <= 4; k++)
-		  nel.PNum(k) = el.PNum(min2pi[4 * j + k - 5]);
-		nel.SetIndex (el.GetIndex());
-
-
-		int legal = 1;
-		for (int k = 1; k <= 3; k++)
-		  for (int l = k+1; l <= 4; l++)
-		    if (nel.PNum(k) == nel.PNum(l))
-		      legal = 0;
-
-		if (legal)
-		  {
-		    (*testout) << nel << " ";
-		    if (firsttet)
-		      {
-			VolumeElement(i) = nel;
-			firsttet = 0;
-		      }
-		    else
-		      {
-			AddVolumeElement(nel);
-		      }
-		  }
-	      }
-	    (*testout) << endl;
-	  }
-      }
-
-  
-    int oldnse = GetNSE(); 
-    for (int i = 1; i <= oldnse; i++)
-      {
-	Element2d el = SurfaceElement(i);
-	if (el.GetNP() == 4)
-	  {
-	    (*testout) << "split el: " << el << " to ";
-	  
-	    static const int ntris[2][6] =
-	      { { 1, 2, 3, 1, 3, 4 },
-		{ 1, 2, 4, 4, 2, 3 }};
-
-	    const int * min2pi;
-
-	    if (min2 (el.PNum(1), el.PNum(3)) <
-		min2 (el.PNum(2), el.PNum(4)))
-	      min2pi = &ntris[0][0];
-	    else
-	      min2pi = &ntris[1][0];
-
-	    for (int j = 0; j <6; j++)
-	      (*testout) << min2pi[j] << " ";
-
-
-	    int firsttri = 1;
-	    for (int j = 1; j <= 2; j++)
-	      {
-		Element2d nel(3);
-		for (int k = 1; k <= 3; k++)
-		  nel.PNum(k) = el.PNum(min2pi[3 * j + k - 4]);
-		nel.SetIndex (el.GetIndex());
-
-		int legal = 1;
-		for (int k = 1; k <= 2; k++)
-		  for (int l = k+1; l <= 3; l++)
-		    if (nel.PNum(k) == nel.PNum(l))
-		      legal = 0;
-
-		if (legal)
-		  {
-		    (*testout) << nel << " ";
-		    if (firsttri)
-		      {
-			SurfaceElement(i) = nel;
-			firsttri = 0;
-		      }
-		    else
-		      {
-			AddSurfaceElement(nel);
-		      }
-		  }
-	      }
-	    (*testout) << endl;
-
-	  }
-      }
-
-
-    if (has_prisms)
-
-      Split2Tets();
-  
-    else
-      {
-	for (int i = 1; i <= GetNE(); i++)
-	  {
-	    Element & el = VolumeElement(i);
-	    const Point3d & p1 = Point (el.PNum(1));
-	    const Point3d & p2 = Point (el.PNum(2));
-	    const Point3d & p3 = Point (el.PNum(3));
-	    const Point3d & p4 = Point (el.PNum(4));
-	  
-	    double vol = (Vec3d (p1, p2) * 
-			  Cross (Vec3d (p1, p3), Vec3d(p1, p4)));
-	    if (vol > 0)
-	      swap (el.PNum(3), el.PNum(4));
-	  }
-
-	timestamp = NextTimeStamp();
-      }
-  }
-
-  void Mesh :: BuildElementSearchTree ()
-  {
-    if (elementsearchtreets == GetTimeStamp())
-      return;
-
-    NgLock lock(mutex);
-    lock.Lock();
-
-    PrintMessage (4, "Rebuild element searchtree");
-
-    if (elementsearchtree)
-      delete elementsearchtree;
-    elementsearchtree = NULL;
-
-    Box3d box;
-    int i, j;
-    int ne = GetNE();
-    if (!ne) 
-      {
-	lock.UnLock();
-	return;
-      }
-
-    box.SetPoint (Point (VolumeElement(1).PNum(1)));
-    for (i = 1; i <= ne; i++)
-      {
-	const Element & el = VolumeElement(i);
-	for (j = 1; j <= el.GetNP(); j++)
-	  box.AddPoint (Point (el.PNum(j)));
-      }
-  
-    box.Increase (1.01 * box.CalcDiam());
-    elementsearchtree = new Box3dTree (box.PMin(), box.PMax());
-  
-
-
-    for (i = 1; i <= ne; i++)
-      {
-	const Element & el = VolumeElement(i);
-	box.SetPoint (Point (el.PNum(1)));
-	for (j = 1; j <= el.GetNP(); j++)
-	  box.AddPoint (Point (el.PNum(j)));
-
-	elementsearchtree -> Insert (box.PMin(), box.PMax(), i);
-      }
-
-    elementsearchtreets = GetTimeStamp();
-
-    lock.UnLock();
-  }
-
-
-  int Mesh :: GetElementOfPoint (const Point3d & p,
-				 double lami[3],
-				 bool build_searchtree,
-				 const int index) const
-  {
-    if (dimension == 2)
-      {
-	int i, j;
-	Vec3d col1, col2, col3;
-	Vec3d rhs, sol;
-	double eps = 1e-6;
-	int ne;
-      
-	ARRAY<int> locels;
-	if (0)
-	  {
-	    elementsearchtree->GetIntersecting (p, p, locels);
-	    ne = locels.Size();
-	  }
-	else
-	  ne = GetNSE();
-	ARRAY<Element2d> loctrigs;
-	Vec3d nv(0, 0, 1);
-	for (i = 1; i <= ne; i++)
-	  {
-	    int ii;
-	    if (0)
-	      ii = locels.Get(i);
-	    else
-	      ii = i;
-
-	    if((index >= 0) && (index != SurfaceElement(ii).GetIndex())) continue;
-
-	    //SZ 
-	    if(SurfaceElement(ii).GetType()==QUAD)
-	      {
-
-		const Element2d & el = SurfaceElement(ii); 
-	      
-		const Point3d & p1 = Point(el.PNum(1)); 
-		const Point3d & p2 = Point(el.PNum(2));
-		const Point3d & p3 = Point(el.PNum(3));
-		const Point3d & p4 = Point(el.PNum(4)); 
-	      
-		// Coefficients of Bilinear Mapping from Ref-Elem to global Elem
-		// X = a + b x + c y + d x y 
-		Vec3d a = p1; 
-		Vec3d b = p2 - a; 
-		Vec3d c = p4 - a; 
-		Vec3d d = p3 - a - b - c; 
-	      
-		double dxb = d.X()*b.Y()-d.Y()*b.X();
-		double dxc = d.X()*c.Y()-d.Y()*c.X(); 
-		double dxa = d.X()*a.Y()-d.Y()*a.X(); 
-		double dxp = d.X()*p.Y()-d.Y()*p.X(); 
-	      	      
-		double c0,c1,c2,rt; 
-		lami[2]=0.; 
-		double eps = 1.E-12; 
-
-		if(fabs(d.X()) <= eps && fabs(d.Y())<= eps)
-		  {
-		    //Solve Linear System
-		    lami[0]=(c.Y()*(p.X()-a.X())-b.Y()*(p.Y()-a.Y()))/
-		      (b.X()*c.Y() -b.Y()*c.X()); 
-		    lami[1]=(-c.X()*(p.X()-a.X())+b.X()*(p.Y()-a.Y()))/
-		      (b.X()*c.Y() -b.Y()*c.X()); 
-		  } 
-		else
-		  if(fabs(dxb) <= eps) 
-		    {
-		      lami[1] = (dxp-dxa)/dxc;
-		      if(fabs(b.X()-d.X()*lami[1])>=eps)
-			lami[0] = (p.X()-a.X() - c.X()*lami[1])/(b.X()+d.X()*lami[1]); 
-		      else
-			lami[0] = (p.Y()-a.Y() - c.Y()*lami[1])/(b.Y()+d.Y()*lami[1]); 
-		    }
-		  else
-		    if(fabs(dxc) <= eps)
-		      {
-			lami[0] = (dxp-dxa)/dxb;
-			if(fabs(c.X()-d.X()*lami[0])>=eps)
-			  lami[1] = (p.X()-a.X() - b.X()*lami[0])/(c.X()+d.X()*lami[0]); 
-			else
-			  lami[1] = (p.Y()-a.Y() - b.Y()*lami[0])/(c.Y()+d.Y()*lami[0]); 
-		      }
-		    else //Solve quadratic equation
-		      {
-			if(fabs(d.X()) >= eps)
-			  {
-			    c2 = d.X()*dxc;
-			    c1 = d.X()*dxc - c.X()*dxb - d.X()*(dxp-dxa);
-			    c0 = -b.X()*(dxp -dxa) - (a.X()-p.X())*dxb;
-			  }
-			else 
-			  {
-			    c2 = d.Y()*dxc;
-			    c1 = d.Y()*dxc - c.Y()*dxb - d.Y()*(dxp-dxa);
-			    c0 = -b.Y()*(dxp -dxa) - (a.Y()-p.Y())*dxb;
-			  }
-
-			double rt =  c1*c1 - 4*c2*c0;
-			if (rt < 0.) continue; 
-			lami[1] = (-c1 + sqrt(rt))/2/c2;
-			if(lami[1]<=1. && lami[1]>=0.)
-			  {
-			    lami[0] = (dxp - dxa -dxc*lami[1])/dxb;
-			    if(lami[0]<=1. && lami[0]>=0.)
-			      return(ii);
-			  }
-		      
-			lami[1] = (-c1 - sqrt(rt))/2/c2;
-			lami[0] = (dxp - dxa -dxc*lami[1])/dxb;
-		      }
-	      
-		if( lami[0] <= 1.+eps  && lami[0] >= -eps && lami[1]<=1.+eps && lami[1]>=-eps)
-		  return(ii);
-		      
-		continue; 
-	      
-	      }
-	    else
-	      {
-		//	  SurfaceElement(ii).GetTets (loctets);
-		loctrigs.SetSize(1);
-		loctrigs.Elem(1) = SurfaceElement(ii);
-	      
-	      
-	      
-		for (j = 1; j <= loctrigs.Size(); j++)
-		  {
-		    const Element2d & el = loctrigs.Get(j);
-		  
-		  
-		    const Point3d & p1 = Point(el.PNum(1));
-		    const Point3d & p2 = Point(el.PNum(2));
-		    const Point3d & p3 = Point(el.PNum(3));
-		    /*
-		      Box3d box;
-		      box.SetPoint (p1);
-		      box.AddPoint (p2);
-		      box.AddPoint (p3);
-		      box.AddPoint (p4);
-		      if (!box.IsIn (p))
-		      continue;
-		    */
-		    col1 = p2-p1;
-		    col2 = p3-p1;
-		    col3 = nv;
-		    rhs = p - p1;
-		  
-		    SolveLinearSystem (col1, col2, col3, rhs, sol);
-		  
-		    if (sol.X() >= -eps && sol.Y() >= -eps && 
-			sol.X() + sol.Y() <= 1+eps)
-		      {
-			lami[0] = sol.X();
-			lami[1] = sol.Y();
-			lami[2] = sol.Z();
-		      
-			return ii;
-		      }
-		  }
-	      }
-	  }
-	 
-	return 0;
-      }  
-    else
-      
-      {
-	int i, j;
-	Vec3d col1, col2, col3;
-	Vec3d rhs, sol;
-	double eps = 1e-4;
-	int ne;
-      
-	ARRAY<int> locels;
-	if (elementsearchtree || build_searchtree)
-	  {
-	    // update if necessary:
-	    const_cast<Mesh&>(*this).BuildElementSearchTree (); 
-	    elementsearchtree->GetIntersecting (p, p, locels);
-	    ne = locels.Size();
-	  }
-	else
-	  ne = GetNE();
-      
-	ARRAY<Element> loctets;
-	for (i = 1; i <= ne; i++)
-	  {
-	    int ii;
-	    if (elementsearchtree)
-	      ii = locels.Get(i);
-	    else
-	      ii = i;
-	  
-	    VolumeElement(ii).GetTets (loctets);
-	  
-	    for (j = 1; j <= loctets.Size(); j++)
-	      {
-		const Element & el = loctets.Get(j);
-	      
-		const Point3d & p1 = Point(el.PNum(1));
-		const Point3d & p2 = Point(el.PNum(2));
-		const Point3d & p3 = Point(el.PNum(3));
-		const Point3d & p4 = Point(el.PNum(4));
-	      
-		Box3d box;
-		box.SetPoint (p1);
-		box.AddPoint (p2);
-		box.AddPoint (p3);
-		box.AddPoint (p4);
-		if (!box.IsIn (p))
-		  continue;
-	      
-		col1 = p2-p1;
-		col2 = p3-p1;
-		col3 = p4-p1;
-		rhs = p - p1;
-	      
-		SolveLinearSystem (col1, col2, col3, rhs, sol);
-	      
-		if (sol.X() >= -eps && sol.Y() >= -eps && sol.Z() >= -eps &&
-		    sol.X() + sol.Y() + sol.Z() <= 1+eps)
-		  {
-		    ARRAY<Element> loctetsloc;
-		    ARRAY<Point3d> pointsloc;
-
-		    VolumeElement(ii).GetTetsLocal (loctetsloc);
-		    VolumeElement(ii).GetNodesLocalNew (pointsloc);
-
-		    const Element & le = loctetsloc.Get(j);
-		  
-		    Point3d p = 
-		      pointsloc.Get(le.PNum(1)) 
-		      + sol.X() * Vec3d (pointsloc.Get(le.PNum(1)), pointsloc.Get(le.PNum(2))) 
-		      + sol.Y() * Vec3d (pointsloc.Get(le.PNum(1)), pointsloc.Get(le.PNum(3))) 
-		      + sol.Z() * Vec3d (pointsloc.Get(le.PNum(1)), pointsloc.Get(le.PNum(4))) ;
-
-
-		    lami[0] = p.X();
-		    lami[1] = p.Y();
-		    lami[2] = p.Z();
-		    return ii;
-		  }
-	      }
-	  }
-      
-	return 0;
-      }
-  }
-
-
-  void Mesh::GetIntersectingVolEls(const Point3d& p1, const Point3d& p2, 
-				   ARRAY<int> & locels) const
-  {
-    elementsearchtree->GetIntersecting (p1, p2, locels);
-  }
-
-  void Mesh :: SplitIntoParts()
-  {
-    int i, j, dom;
-    int ne = GetNE();
-    int np = GetNP();
-    int nse = GetNSE();
-
-    BitArray surfused(nse);
-    BitArray pused (np);
-
-    surfused.Clear();
-
-    dom = 0;
-  
-    while (1)
-      {
-	int cntd = 1;
-
-	dom++;
-      
-	pused.Clear();
-
-	int found = 0;
-	for (i = 1; i <= nse; i++)
-	  if (!surfused.Test(i))
-	    {
-	      SurfaceElement(i).SetIndex (dom);
-	      for (j = 1; j <= 3; j++)
-		pused.Set (SurfaceElement(i).PNum(j));
-	      found = 1;
-	      cntd = 1;
-	      surfused.Set(i);
-	      break;
-	    }
-
-	if (!found)
-	  break;
-
-	int change;
-	do
-	  {
-	    change = 0;
-	    for (i = 1; i <= nse; i++)
-	      {
-		int is = 0, isnot = 0;
-		for (j = 1; j <= 3; j++)
-		  if (pused.Test(SurfaceElement(i).PNum(j)))
-		    is = 1;
-		  else
-		    isnot = 1;
-	      
-		if (is && isnot)
-		  {
-		    change = 1;
-		    for (j = 1; j <= 3; j++)
-		      pused.Set (SurfaceElement(i).PNum(j));
-		  }
-
-		if (is) 
-		  {
-		    if (!surfused.Test(i))
-		      {
-			surfused.Set(i);
-			SurfaceElement(i).SetIndex (dom);
-			cntd++;
-		      }
-		  }
-	      }
-
-
-	    for (i = 1; i <= ne; i++)
-	      {
-		int is = 0, isnot = 0;
-		for (j = 1; j <= 4; j++)
-		  if (pused.Test(VolumeElement(i).PNum(j)))
-		    is = 1;
-		  else
-		    isnot = 1;
-	      
-		if (is && isnot)
-		  {
-		    change = 1;
-		    for (j = 1; j <= 4; j++)
-		      pused.Set (VolumeElement(i).PNum(j));
-		  }
-
-		if (is)
-		  {
-		    VolumeElement(i).SetIndex (dom);
-		  }
-	      }
-	  }
-	while (change);
-
-	PrintMessage (3, "domain ", dom, " has ", cntd, " surfaceelements");
-      }
-
-    /*
-      facedecoding.SetSize (dom);
-      for (i = 1; i <= dom; i++)
-      {
-      facedecoding.Elem(i).surfnr = 0;
-      facedecoding.Elem(i).domin = i;
-      facedecoding.Elem(i).domout = 0;
-      }
-    */
-    ClearFaceDescriptors();
-    for (i = 1; i <= dom; i++)
-      AddFaceDescriptor (FaceDescriptor (0, i, 0, 0));
-    CalcSurfacesOfNode();
-    timestamp = NextTimeStamp();
-  }
-
-  void Mesh :: SplitSeparatedFaces ()
-  {
-    int fdi;
-    int i, j;
-    int np = GetNP();
-
-    BitArray usedp(np);
-
-    fdi = 1;
-    while (fdi <= GetNFD())
-      {
-	int firstel = 0;
-	for (i = 1; i <= GetNSE(); i++)
-	  if (SurfaceElement(i).GetIndex() == fdi)
-	    {
-	      firstel = i;
-	      break;
-	    }
-	if (!firstel) continue;
-
-	usedp.Clear();
-	for (j = 1; j <= SurfaceElement(firstel).GetNP(); j++)
-	  usedp.Set (SurfaceElement(firstel).PNum(j));
-
-	int changed;
-	do
-	  {
-	    changed = 0;
-	    for (i = 1; i <= GetNSE(); i++)
-	      {
-		const Element2d & el = SurfaceElement(i);
-		if (el.GetIndex() != fdi)
-		  continue;
-
-		int has = 0;
-		int hasno = 0;
-		for (j = 1; j <= el.GetNP(); j++)
-		  {
-		    if (usedp.Test(el.PNum(j)))
-		      has = 1;
-		    else
-		      hasno = 1;
-		  }
-		if (has && hasno)
-		  changed = 1;
-
-		if (has)
-		  for (j = 1; j <= el.GetNP(); j++)
-		    usedp.Set (el.PNum(j));
-	      }
-	  }
-	while (changed);
-
-	int nface = 0;
-	for (i = 1; i <= GetNSE(); i++)
-	  {
-	    Element2d & el = SurfaceElement(i);
-	    if (el.GetIndex() != fdi)
-	      continue;	  
-
-	    int hasno = 0;
-	    for (j = 1; j <= el.GetNP(); j++)
-	      {
-		if (!usedp.Test(el.PNum(j)))
-		  hasno = 1;
-	      }
-	  
-	    if (hasno)
-	      {
-		if (!nface)
-		  {
-		    FaceDescriptor nfd = GetFaceDescriptor(fdi);
-		    nface = AddFaceDescriptor (nfd);
-		  }
-
-		el.SetIndex (nface);
-	      }
-	  }
-	fdi++;
-      }
-  }
-
-
-  void Mesh :: GetSurfaceElementsOfFace (int facenr, ARRAY<SurfaceElementIndex> & sei) const
-  {
-    sei.SetSize (0);
-    for (SurfaceElementIndex i = 0; i < GetNSE(); i++)
-      if ( (*this)[i].GetIndex () == facenr && (*this)[i][0] >= PointIndex::BASE &&
-	   !(*this)[i].IsDeleted() )
-	sei.Append (i);
-  }
-
-
-
-
-  void Mesh :: CalcMinMaxAngle (double badellimit, double * retvalues) 
-  {
-    int i, j;
-    int lpi1, lpi2, lpi3, lpi4;
-    double phimax = 0, phimin = 10;
-    double facephimax = 0, facephimin = 10;
-    int illegaltets = 0, negativetets = 0, badtets = 0;
-
-    for (i = 1; i <= GetNE(); i++)
-      {
-	int badel = 0;
-
-	Element & el = VolumeElement(i);
-
-	if (el.GetType() != TET)
-	  {
-	    VolumeElement(i).flags.badel = 0;
-	    continue;
-	  }
-
-	if (el.Volume(Points()) < 0)
-	  {
-	    badel = 1;
-	    negativetets++;
-	  }
-      
-
-	if (!LegalTet (el)) 
-	  {
-	    badel = 1;
-	    illegaltets++;
-	    (*testout) << "illegal tet: " << i << " ";
-	    for (j = 1; j <= el.GetNP(); j++)
-	      (*testout) << el.PNum(j) << " ";
-	    (*testout) << endl;
-	  }
-      
-	
-	// angles between faces
-	for (lpi1 = 1; lpi1 <= 3; lpi1++)
-	  for (lpi2 = lpi1+1; lpi2 <= 4; lpi2++)
-	    {
-	      lpi3 = 1;
-	      while (lpi3 == lpi1 || lpi3 == lpi2)
-		lpi3++;
-	      lpi4 = 10 - lpi1 - lpi2 - lpi3;
-
-	      const Point3d & p1 = Point (el.PNum(lpi1));
-	      const Point3d & p2 = Point (el.PNum(lpi2));
-	      const Point3d & p3 = Point (el.PNum(lpi3));
-	      const Point3d & p4 = Point (el.PNum(lpi4));
-
-	      Vec3d n(p1, p2);
-	      n /= n.Length();
-	      Vec3d v1(p1, p3);
-	      Vec3d v2(p1, p4);
-
-	      v1 -= (n * v1) * n;
-	      v2 -= (n * v2) * n;
-
-	      double cosphi = (v1 * v2) / (v1.Length() * v2.Length());
-	      double phi = acos (cosphi);
-	      if (phi > phimax) phimax = phi;
-	      if (phi < phimin) phimin = phi;
-
-	      if ((180/M_PI) * phi > badellimit)
-		badel = 1;
-	    }
-
-
-	// angles in faces
-	for (j = 1; j <= 4; j++)
-	  {
-	    Element2d face;
-	    el.GetFace (j, face);
-	    for (lpi1 = 1; lpi1 <= 3; lpi1++)
-	      {
-		lpi2 = lpi1 % 3 + 1;
-		lpi3 = lpi2 % 3 + 1;
-
-		const Point3d & p1 = Point (el.PNum(lpi1));
-		const Point3d & p2 = Point (el.PNum(lpi2));
-		const Point3d & p3 = Point (el.PNum(lpi3));
-
-		Vec3d v1(p1, p2);
-		Vec3d v2(p1, p3);
-		double cosphi = (v1 * v2) / (v1.Length() * v2.Length());
-		double phi = acos (cosphi);
-		if (phi > facephimax) facephimax = phi;
-		if (phi < facephimin) facephimin = phi;
-
-		if ((180/M_PI) * phi > badellimit)
-		  badel = 1;
-
-	      }
-	  }
-
-       
-	VolumeElement(i).flags.badel = badel;
-	if (badel) badtets++;
-      }
-
-    if (!GetNE())
-      {
-	phimin = phimax = facephimin = facephimax = 0;
-      }
-
-    if (!retvalues)
-      {
-	PrintMessage (1, "");
-	PrintMessage (1, "between planes:  phimin = ", (180/M_PI) * phimin,
-		      " phimax = ", (180/M_PI) *phimax);
-	PrintMessage (1, "inside planes:   phimin = ", (180/M_PI) * facephimin,
-		      " phimax = ", (180/M_PI) * facephimax);
-	PrintMessage (1, "");      
-      }
-    else
-      {
-	retvalues[0] = (180/M_PI) * facephimin;
-	retvalues[1] = (180/M_PI) * facephimax;
-	retvalues[2] = (180/M_PI) * phimin;
-	retvalues[3] = (180/M_PI) * phimax;
-      }
-    PrintMessage (3, "negative tets: ", negativetets);
-    PrintMessage (3, "illegal tets:  ", illegaltets);
-    PrintMessage (3, "bad tets:      ", badtets);
-  }
-
-
-  int Mesh :: MarkIllegalElements ()
-  {
-    int cnt = 0;
-    int i;
-
-    for (i = 1; i <= GetNE(); i++)
-      {
-	LegalTet (VolumeElement(i));
-
-	/*
-	  Element & el = VolumeElement(i);
-	  int leg1 = LegalTet (el);
-	  el.flags.illegal_valid = 0;
-	  int leg2 = LegalTet (el);
-
-	  if (leg1 != leg2) 
-	  {
-	  cerr << "legal differs!!" << endl;
-	  (*testout) << "legal differs" << endl;
-	  (*testout) << "elnr = " << i << ", el = " << el
-	  << " leg1 = " << leg1 << ", leg2 = " << leg2 << endl;
-	  }
-      
-	  //      el.flags.illegal = !LegalTet (el);
-	  */
-	cnt += VolumeElement(i).Illegal();
-      }
-    return cnt;
-  }
-
-#ifdef NONE
-  void Mesh :: AddIdentification (int pi1, int pi2, int identnr)
-  {
-    INDEX_2 pair(pi1, pi2);
-    //  pair.Sort();
-    identifiedpoints->Set (pair, identnr);
-    if (identnr > maxidentnr)
-      maxidentnr = identnr;
-    timestamp = NextTimeStamp();
-  }
-
-  int Mesh :: GetIdentification (int pi1, int pi2) const
-  {
-    INDEX_2 pair(pi1, pi2);
-    if (identifiedpoints->Used (pair))
-      return identifiedpoints->Get(pair);
-    else
-      return 0;
-  }
-
-  int Mesh :: GetIdentificationSym (int pi1, int pi2) const
-  {
-    INDEX_2 pair(pi1, pi2);
-    if (identifiedpoints->Used (pair))
-      return identifiedpoints->Get(pair);
-
-    pair = INDEX_2 (pi2, pi1);
-    if (identifiedpoints->Used (pair))
-      return identifiedpoints->Get(pair);
-
-    return 0;
-  }
-
-
-  void Mesh :: GetIdentificationMap (int identnr, ARRAY<int> & identmap) const
-  {
-    int i, j;
-
-    identmap.SetSize (GetNP());
-    for (i = 1; i <= identmap.Size(); i++)
-      identmap.Elem(i) = 0;
-
-    for (i = 1; i <= identifiedpoints->GetNBags(); i++)
-      for (j = 1; j <= identifiedpoints->GetBagSize(i); j++)
-	{
-	  INDEX_2 i2;
-	  int nr;
-	  identifiedpoints->GetData (i, j, i2, nr);
-	
-	  if (nr == identnr)
-	    {
-	      identmap.Elem(i2.I1()) = i2.I2();
-	    }
-	}
-  }
-
-
-  void Mesh :: GetIdentificationPairs (int identnr, ARRAY<INDEX_2> & identpairs) const
-  {
-    int i, j;
-
-    identpairs.SetSize(0);
-
-    for (i = 1; i <= identifiedpoints->GetNBags(); i++)
-      for (j = 1; j <= identifiedpoints->GetBagSize(i); j++)
-	{
-	  INDEX_2 i2;
-	  int nr;
-	  identifiedpoints->GetData (i, j, i2, nr);
-	
-	  if (identnr == 0 || nr == identnr)
-	    identpairs.Append (i2);
-	}
-  }
-#endif
-
-  void Mesh :: ComputeNVertices ()
-  {
-    int i, j, nv;
-    int ne = GetNE();
-    int nse = GetNSE();
-
-    numvertices = 0;
-    for (i = 1; i <= ne; i++)
-      {
-	const Element & el = VolumeElement(i);
-	nv = el.GetNV();
-	for (j = 0; j < nv; j++)
-	  if (el[j] > numvertices)
-	    numvertices = el[j];
-      }
-    for (i = 1; i <= nse; i++)
-      {
-	const Element2d & el = SurfaceElement(i);
-	nv = el.GetNV();
-	for (j = 1; j <= nv; j++)
-	  if (el.PNum(j) > numvertices)
-	    numvertices = el.PNum(j);
-      } 
-
-    numvertices += 1- PointIndex::BASE;
-  }
-
-  int Mesh :: GetNV () const
-  {
-    if (numvertices < 0)
-      return GetNP();
-    else
-      return numvertices;
-  }
-
-  void Mesh :: SetNP (int np)
-  {
-    points.SetSize(np);
-    //  ptyps.SetSize(np);
-
-    int mlold = mlbetweennodes.Size();
-    mlbetweennodes.SetSize(np);
-    if (np > mlold)
-      for (int i = mlold+PointIndex::BASE; 
-	   i < np+PointIndex::BASE; i++)
-	{
-	  mlbetweennodes[i].I1() = PointIndex::BASE-1;
-	  mlbetweennodes[i].I2() = PointIndex::BASE-1;
-	}
-
-    GetIdentifications().SetMaxPointNr (np + PointIndex::BASE-1);
-  }
-
-
-  /*
-    void Mesh :: BuildConnectedNodes ()
-    {
-    if (PureTetMesh())
-    {
-    connectedtonode.SetSize(0);
-    return;
-    }
-
-
-    int i, j, k;
-    int np = GetNP();
-    int ne = GetNE();
-    TABLE<int> conto(np);
-    for (i = 1; i <= ne; i++)
-    {
-    const Element & el = VolumeElement(i);
-
-    if (el.GetType() == PRISM)
-    {
-    for (j = 1; j <= 6; j++)
-    {
-    int n1 = el.PNum (j);
-    int n2 = el.PNum ((j+2)%6+1);
-    //	    if (n1 != n2)
-    {
-    int found = 0;
-    for (k = 1; k <= conto.EntrySize(n1); k++)
-    if (conto.Get(n1, k) == n2)
-    {
-    found = 1;
-    break;
-    }
-    if (!found)
-    conto.Add (n1, n2);
-    }
-    }
-    }
-    else if (el.GetType() == PYRAMID)
-    {
-    for (j = 1; j <= 4; j++)
-    {
-    int n1, n2;
-    switch (j)
-    {
-    case 1: n1 = 1; n2 = 4; break;
-    case 2: n1 = 4; n2 = 1; break;
-    case 3: n1 = 2; n2 = 3; break;
-    case 4: n1 = 3; n2 = 2; break;
-    }
-
-    int found = 0;
-    for (k = 1; k <= conto.EntrySize(n1); k++)
-    if (conto.Get(n1, k) == n2)
-    {
-    found = 1;
-    break;
-    }
-    if (!found)
-    conto.Add (n1, n2);
-    }
-    }
-    }
-  
-    connectedtonode.SetSize(np);
-    for (i = 1; i <= np; i++)
-    connectedtonode.Elem(i) = 0;
-  
-    for (i = 1; i <= np; i++)
-    if (connectedtonode.Elem(i) == 0)
-    {
-    connectedtonode.Elem(i) = i;
-    ConnectToNodeRec (i, i, conto);
-    }
-  
-
-
-    }
-
-    void Mesh :: ConnectToNodeRec (int node, int tonode, 
-    const TABLE<int> & conto)
-    {
-    int i, n2;
-    //  (*testout) << "connect " << node << " to " << tonode << endl;
-    for (i = 1; i <= conto.EntrySize(node); i++)
-    {
-    n2 = conto.Get(node, i);
-    if (!connectedtonode.Get(n2))
-    {
-    connectedtonode.Elem(n2) = tonode;
-    ConnectToNodeRec (n2, tonode, conto);
-    }
-    }
-    }
-  */
-
-
-  bool Mesh :: PureTrigMesh (int faceindex) const
-  {
-    if (!faceindex)
-      return !mparam.quad;
-
-    int i;
-    for (i = 1; i <= GetNSE(); i++)
-      if (SurfaceElement(i).GetIndex() == faceindex &&
-	  SurfaceElement(i).GetNP() != 3)
-	return 0;
-    return 1;
-  }
-
-  bool Mesh :: PureTetMesh () const
-  {
-    for (ElementIndex ei = 0; ei < GetNE(); ei++)
-      if (VolumeElement(ei).GetNP() != 4)
-	return 0;
-    return 1;
-  }
-
-  void Mesh :: UpdateTopology()
-  {
-    topology->Update();
-    clusters->Update();
-  }
-
-
-  void Mesh :: SetMaterial (int domnr, const char * mat)
-  {
-    if (domnr > materials.Size())
-      {
-	int olds = materials.Size();
-	materials.SetSize (domnr);
-	for (int i = olds; i < domnr; i++)
-	  materials[i] = 0;
-      }
-    materials.Elem(domnr) = new char[strlen(mat)+1];
-    strcpy (materials.Elem(domnr), mat);
-  }
-
-  const char * Mesh :: GetMaterial (int domnr) const
-  {
-    if (domnr <= materials.Size())
-      return materials.Get(domnr);
-    return 0;
-  }
-
-
-
-
-
-  void Mesh :: PrintMemInfo (ostream & ost) const
-  {
-    ost << "Mesh Mem:" << endl;
-
-    ost << GetNP() << " Points, of size " 
-	<< sizeof (Point3d) << " + " << sizeof(POINTTYPE) << " = "
-	<< GetNP() * (sizeof (Point3d) + sizeof(POINTTYPE)) << endl;
-
-    ost << GetNSE() << " Surface elements, of size " 
-	<< sizeof (Element2d) << " = " 
-	<< GetNSE() * sizeof(Element2d) << endl;
-
-    ost << GetNE() << " Volume elements, of size " 
-	<< sizeof (Element) << " = " 
-	<< GetNE() * sizeof(Element) << endl;
-
-    ost << "surfs on node:";
-    surfacesonnode.PrintMemInfo (cout);
-  
-    ost << "boundaryedges: ";
-    if (boundaryedges)
-      boundaryedges->PrintMemInfo (cout);
-
-    ost << "surfelementht: ";
-    if (surfelementht)
-      surfelementht->PrintMemInfo (cout);
-  }
-}
diff --git a/contrib/Netgen/libsrc/meshing/meshclass.hpp b/contrib/Netgen/libsrc/meshing/meshclass.hpp
deleted file mode 100644
index 4ad0edbb9bd35a289606886c323e07ae3b479e81..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshclass.hpp
+++ /dev/null
@@ -1,620 +0,0 @@
-#ifndef MESHCLASS
-#define MESHCLASS
-
-/**************************************************************************/
-/* File:   meshclass.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   20. Nov. 99                                                    */
-/**************************************************************************/
-
-/*
-  The mesh class
-*/
-
-
-
-enum resthtype { RESTRICTH_FACE, RESTRICTH_EDGE, 
-		 RESTRICTH_SURFACEELEMENT, RESTRICTH_POINT, RESTRICTH_SEGMENT };
-
-class HPRefElement;
-
-
-/// 2d/3d mesh
-class Mesh
-{
-public:
-  //  typedef MoveableArray<MeshPoint> T_POINTS;
-  //  typedef MoveableArray<Element> T_VOLELEMENTS;
-  //  typedef MoveableArray<Element2d> T_SURFELEMENTS;
-
-  typedef ARRAY<MeshPoint,PointIndex::BASE> T_POINTS;
-  typedef ARRAY<Element> T_VOLELEMENTS;
-  typedef ARRAY<Element2d> T_SURFELEMENTS;
-
-
-private:
-  /// point coordinates
-  T_POINTS points;
-  /// type of point, is set in calcsurfacesofnode
-  //  ARRAY<POINTTYPE,PointIndex::BASE> ptyps;
-  /// type of element, set in calcsurfacesofnode
-  ARRAY<ELEMENTTYPE> eltyps;
-
-  /// line-segments at edges
-  ARRAY<Segment> segments;
-  /// surface elements, 2d-inner elements
-  T_SURFELEMENTS surfelements;
-  /// volume elements
-  T_VOLELEMENTS volelements;
-  /// points will be fixed forever
-  ARRAY<PointIndex> lockedpoints;
-
-
-  /// surface indices at boundary nodes
-  TABLE<int,PointIndex::BASE> surfacesonnode;
-  /// boundary edges  (1..normal bedge, 2..segment)
-  INDEX_2_CLOSED_HASHTABLE<int> * boundaryedges;
-  ///
-  INDEX_2_CLOSED_HASHTABLE<int> * segmentht;
-  ///
-  INDEX_3_CLOSED_HASHTABLE<int> * surfelementht;
-
-  /// faces of rest-solid
-  ARRAY<Element2d> openelements;
-  /// open segmenets for surface meshing  
-  ARRAY<Segment> opensegments;
-
-
-
-  /**
-     Representation of local mesh-size h
-  */
-  LocalH * lochfunc;
-  ///
-  double hglob;
-  ///
-  ARRAY<double> maxhdomain;
-  
-  /**
-     the face-index of the surface element maps into
-     this table.
-  */
-  ARRAY<FaceDescriptor> facedecoding;
-
-  /// sub-domain materials 
-  ARRAY<char*> materials;
-
-  /// Periodic surface, close surface, etc. identifications
-  Identifications * ident;
-
-
-  /// number of vertices (if < 0, use np)
-  int numvertices;
-
-  /// geometric search tree for interval intersection search
-  Box3dTree * elementsearchtree;
-  /// time stamp for tree
-  int elementsearchtreets;
-
-  /// element -> face, element -> edge etc ...
-  class MeshTopology * topology;
-  /// methods for high order elements
-  class CurvedElements * curvedelems;
-  /// nodes identified by close points 
-  class AnisotropicClusters * clusters;
-
-  /// space dimension (2 or 3)
-  int dimension;
-  
-  /// changed by every minor modification (addpoint, ...)
-  int timestamp;
-  /// changed after finishing global algorithm (improve, ...)
-  int majortimestamp;
-
-  /// mesh access semaphor.
-  NgMutex mutex;
-
-
-public:
-
-  // store coarse mesh before hp-refinement
-  ARRAY<HPRefElement> * hpelements;
-  Mesh * coarsemesh;
-  
-  
-  /// number of refinement levels
-  int mglevels;
-  /// refinement hierarchy
-  ARRAY<INDEX_2,PointIndex::BASE> mlbetweennodes;
-  /// parent element of volume element
-  ARRAY<int> mlparentelement;
-  /// parent element of surface element
-  ARRAY<int> mlparentsurfaceelement;
-
-
-
-  ///
-  Mesh();
-  ///
-  ~Mesh();
-
-  Mesh & operator= (const Mesh & mesh2);
-  
-  ///
-  void DeleteMesh();
-  
-  ///
-  void ClearSurfaceElements()
-  { 
-    surfelements.SetSize(0); 
-    timestamp = NextTimeStamp();
-  }
-
-  ///
-  void ClearVolumeElements()
-  {
-    volelements.SetSize(0); 
-    eltyps.SetSize(0);
-    timestamp = NextTimeStamp();
-  }
-
-  ///
-  void ClearSegments()
-  { 
-    segments.SetSize(0); 
-    timestamp = NextTimeStamp();
-  }
-  
-  ///
-  bool TestOk () const;
-
-
-  PointIndex AddPoint (const Point3d & p, int layer = 1);
-  int GetNP () const { return points.Size(); }
-
-  MeshPoint & Point(int i) { return points.Elem(i); }
-  MeshPoint & Point(PointIndex pi) { return points[pi]; }
-  const MeshPoint & Point(int i) const { return points.Get(i); }
-  const MeshPoint & Point(PointIndex pi) const { return points[pi]; }
-
-  const MeshPoint & operator[] (PointIndex pi) const { return points[pi]; }
-  MeshPoint & operator[] (PointIndex pi) { return points[pi]; }
-
-  /*
-  POINTTYPE PointType (int i) const { return ptyps.Get(i); }
-  POINTTYPE PointType (PointIndex pi) const { return ptyps[pi]; }
-  */
-  POINTTYPE PointType (int i) const { return points.Get(i).Type(); }
-  POINTTYPE PointType (PointIndex pi) const { return points[pi].Type(); }
-
-
-  const T_POINTS & Points() const { return points; }
-  T_POINTS & Points() { return points; }
-  // ARRAY<POINTTYPE,PointIndex::BASE> & PointTypes() { return ptyps; }
-
-
-
-
-
-
-  SegmentIndex AddSegment (const Segment & s);
-  void DeleteSegment (int segnr)
-  {
-    segments.Elem(segnr).p1 = PointIndex::BASE-1;
-    segments.Elem(segnr).p2 = PointIndex::BASE-1;
-  }
-
-  int GetNSeg () const { return segments.Size(); }
-  Segment & LineSegment(int i) { return segments.Elem(i); }
-  const Segment & LineSegment(int i) const { return segments.Get(i); }
-
-  Segment & LineSegment(SegmentIndex si) { return segments[si]; }
-  const Segment & LineSegment(SegmentIndex si) const { return segments[si]; }
-  const Segment & operator[] (SegmentIndex si) const { return segments[si]; }
-  Segment & operator[] (SegmentIndex si) { return segments[si]; }
-
-
-
-
-  SurfaceElementIndex AddSurfaceElement (const Element2d & el);
-  void DeleteSurfaceElement (int eli)
-  { 
-    surfelements.Elem(eli).Delete();
-    surfelements.Elem(eli).PNum(1) = -1; 
-    surfelements.Elem(eli).PNum(2) = -1; 
-    surfelements.Elem(eli).PNum(3) = -1; 
-    timestamp = NextTimeStamp();
-  }
-
-  void DeleteSurfaceElement (SurfaceElementIndex eli)
-  {
-    DeleteSurfaceElement (int(eli)+1);
-  }
-
-  int GetNSE () const { return surfelements.Size(); }
-  Element2d & SurfaceElement(int i) { return surfelements.Elem(i); }
-  const Element2d & SurfaceElement(int i) const { return surfelements.Get(i); }
-
-  Element2d & SurfaceElement(SurfaceElementIndex i)
-  { return surfelements[i]; }
-  const Element2d & SurfaceElement(SurfaceElementIndex i) const
-  { return surfelements[i]; }
-
-  const Element2d & operator[] (SurfaceElementIndex ei) const
-  { return surfelements[ei]; }
-  Element2d & operator[] (SurfaceElementIndex ei)
-  { return surfelements[ei]; }
-
-  
-  void GetSurfaceElementsOfFace (int facenr, ARRAY<SurfaceElementIndex> & sei) const;
-
-
-
-  ElementIndex AddVolumeElement (const Element & el);
-
-  int GetNE () const { return volelements.Size(); }
-
-  Element & VolumeElement(int i) { return volelements.Elem(i); }
-  const Element & VolumeElement(int i) const { return volelements.Get(i); }
-  Element & VolumeElement(ElementIndex i) { return volelements[i]; }
-  const Element & VolumeElement(ElementIndex i) const { return volelements[i]; }
-
-  const Element & operator[] (ElementIndex ei) const 
-  { return volelements[ei]; }
-  Element & operator[] (ElementIndex ei)
-  { return volelements[ei]; }
-
-
-
-
-
-  ELEMENTTYPE ElementType (int i) const { return eltyps.Get(i); }
-  ELEMENTTYPE ElementType (ElementIndex i) const { return eltyps[i]; }
-
-  const T_VOLELEMENTS & VolumeElements() const { return volelements; }
-  T_VOLELEMENTS & VolumeElements() { return volelements; }
-
-
-  ///
-  double ElementError (int eli) const;
-
-  /// 
-  void AddLockedPoint (PointIndex pi);
-  ///
-  void ClearLockedPoints ();
-
-  const ARRAY<PointIndex> & LockedPoints() const
-  { return lockedpoints; }
-
-  /// Returns number of domains
-  int GetNDomains() const;
-
-
-  ///
-  int GetDimension() const 
-  { return dimension; }
-  void SetDimension(int dim)
-  { dimension = dim; }
-
-  /// sets internal tables
-  void CalcSurfacesOfNode ();
-
-  /// additional (temporarily) fix points 
-  void FixPoints (const BitArray & fixpoints);
-
-  /**
-     finds elements without neighbour and
-     boundary elements without inner element.
-     Results are stored in openelements.
-     if dom == 0, all sub-domains, else subdomain dom */
-  void FindOpenElements (int dom = 0);
-
-  
-  /**
-     finds segments without surface element,
-     and surface elements without neighbours.
-     store in opensegmentsy
-  */
-  void FindOpenSegments (int surfnr = 0);
-  /**
-     remove one layer of surface elements
-  */
-  void RemoveOneLayerSurfaceElements ();
-
-
-  int GetNOpenSegments () { return opensegments.Size(); }
-  const Segment & GetOpenSegment (int nr) { return opensegments.Get(nr); }
-  
-  /**
-     Checks overlap of boundary
-     return == 1, iff overlap
-  */
-  int CheckOverlappingBoundary ();
-  /**
-     Checks consistent boundary
-     return == 0, everything ok
-  */
-  int CheckConsistentBoundary () const;
-
-  /*
-    checks element orientation
-  */
-  int CheckVolumeMesh () const;
-
-
-  /**
-     finds average h of surface surfnr if surfnr > 0,
-     else of all surfaces.
-  */
-  double AverageH (int surfnr = 0) const;
-  /// Calculates localh 
-  void CalcLocalH ();
-  ///
-  void SetLocalH (const Point3d & pmin, const Point3d & pmax, double grading);
-  ///
-  void RestrictLocalH (const Point3d & p, double hloc);
-  ///
-  void RestrictLocalHLine (const Point3d & p1, const Point3d & p2, 
-			   double hloc);
-  /// number of elements per radius
-  void CalcLocalHFromSurfaceCurvature(double elperr);
-  ///
-  void CalcLocalHFromPointDistances(void);
-  ///
-  void RestrictLocalH (resthtype rht, int nr, double loch);
-  ///
-  void LoadLocalMeshSize (const char * meshsizefilename);
-  ///
-  void SetGlobalH (double h);
-  ///
-  double MaxHDomain (int dom) const;
-  ///
-  void SetMaxHDomain (const ARRAY<double> & mhd);
-  ///
-  double GetH (const Point3d & p) const;
-  ///
-  double GetMinH (const Point3d & pmin, const Point3d & pmax);
-  ///
-  LocalH & LocalHFunction () { return * lochfunc; }
-
-  /// Find bounding box
-  void GetBox (Point3d & pmin, Point3d & pmax, int dom = -1) const;
-
-  /// Find bounding box of points of typ ptyp or less
-  void GetBox (Point3d & pmin, Point3d & pmax, POINTTYPE ptyp ) const;
-
-  ///
-  int GetNOpenElements() const
-  { return openelements.Size(); }
-  ///
-  const Element2d & OpenElement(int i) const
-  { return openelements.Get(i); }
-
-
-  /// are also quads open elements
-  int HasOpenQuads () const;
-
-  /// split into connected pieces
-  void SplitIntoParts ();
-
-  /// 
-  void SplitSeparatedFaces ();
-
-  /// Refines mesh and projects points to true surface
-  // void Refine (int levels, const CSGeometry * geom);
-  
-
-  bool BoundaryEdge (PointIndex pi1, PointIndex pi2) const
-  {
-    INDEX_2 i2 (pi1, pi2);
-    i2.Sort();
-    return boundaryedges->Used (i2);
-  }
-
-  bool IsSegment (PointIndex pi1, PointIndex pi2) const
-  {
-    INDEX_2 i2 (pi1, pi2);
-    i2.Sort();
-    return segmentht->Used (i2);
-  }
-
-  SegmentIndex SegmentNr (PointIndex pi1, PointIndex pi2) const
-  {
-    INDEX_2 i2 (pi1, pi2);
-    i2.Sort();
-    return segmentht->Get (i2);
-  }
-
-
-  /**
-     Remove unused points. etc.
-  */
-  void Compress ();
-
-  ///
-  void Save (const string & filename) const;
-  ///
-  void Load (const string & filename);
-  ///
-  void Merge (const string & filename);
-
-
-  ///
-  void ImproveMesh (OPTIMIZEGOAL goal = OPT_QUALITY);
-
-  ///
-  void ImproveMeshJacobian (OPTIMIZEGOAL goal = OPT_QUALITY);
-  
-
-  /*
-#ifdef SOLIDGEOM
-  /// old
-  void ImproveMesh (const CSGeometry & surfaces, 
-		    OPTIMIZEGOAL goal = OPT_QUALITY);
-#endif  
-  */
-
-  /**
-     free nodes in environment of openelements 
-     for optimiztion
-  */
-  void FreeOpenElementsEnvironment (int layers);
-
-  ///
-  bool LegalTet (Element & el) const
-  {
-    if (el.IllegalValid())
-      return !el.Illegal();
-    return LegalTet2 (el);
-  }
-  ///
-  bool LegalTet2 (Element & el) const;
-
-
-  ///
-  bool LegalTrig (const Element2d & el) const;
-  /**
-     if values non-null, return values in 4-double array:
-     triangle angles min/max, tetangles min/max
-     if null, output results on cout
-  */
-  void CalcMinMaxAngle (double badellimit, double * retvalues = NULL);
-
-  /*
-    Marks elements which are dangerous to refine
-    return: number of illegal elements
-  */
-  int MarkIllegalElements ();
-
-  /// orient surface mesh, for one sub-domain only
-  void SurfaceMeshOrientation ();
-
-  /// convert mixed element mesh to tet-mesh
-  void Split2Tets();
-
-
-  /// build box-search tree
-  void BuildElementSearchTree ();
-  /// gives element of point, barycentric coordinates
-  int GetElementOfPoint (const Point3d & p,
-			 double * lami,
-			 bool build_searchtree = 0,
-			 const int index = -1) const;
-
-  /// give list of vol elements which are int the box(p1,p2)
-  void GetIntersectingVolEls(const Point3d& p1, const Point3d& p2, 
-			     ARRAY<int> & locels) const;
-
-  ///
-  int AddFaceDescriptor(const FaceDescriptor& fd)
-  { return facedecoding.Append(fd); }
-
-
-  ///
-  void SetMaterial (int domnr, const char * mat);
-  ///
-  const char * GetMaterial (int domnr) const;
-    
-
-  ///
-  void ClearFaceDescriptors()
-  { facedecoding.SetSize(0); }
-
-  ///
-  int GetNFD () const
-  { return facedecoding.Size(); }
-
-  const FaceDescriptor & GetFaceDescriptor (int i) const
-  { return facedecoding.Get(i); }
-
-  ///
-  FaceDescriptor & GetFaceDescriptor (int i) 
-  { return facedecoding.Elem(i); }
-
-#ifdef NONE
-  /*
-    Identify points pi1 and pi2, due to
-    identification nr identnr
-  */
-  void AddIdentification (int pi1, int pi2, int identnr);
-
-  int GetIdentification (int pi1, int pi2) const;
-  int GetIdentificationSym (int pi1, int pi2) const;
-  ///
-  INDEX_2_HASHTABLE<int> & GetIdentifiedPoints () 
-  { 
-    return *identifiedpoints; 
-  }
-
-  ///
-  void GetIdentificationMap (int identnr, ARRAY<int> & identmap) const;
-  ///
-  void GetIdentificationPairs (int identnr, ARRAY<INDEX_2> & identpairs) const;
-  ///
-  int GetMaxIdentificationNr () const
-  { 
-    return maxidentnr; 
-  }
-#endif
-
-  /// return periodic, close surface etc. identifications
-  Identifications & GetIdentifications () { return *ident; }
-  /// return periodic, close surface etc. identifications
-  const Identifications & GetIdentifications () const { return *ident; }
-
-
-
-  /// find number of vertices
-  void ComputeNVertices ();
-  /// number of vertices (no edge-midpoints)
-  int GetNV () const;
-  /// remove edge points
-  void SetNP (int np);
-
-  /*
- /// build connected nodes along prism stack
- void BuildConnectedNodes ();
- void ConnectToNodeRec (int node, int tonode, 
- const TABLE<int> & conto);
-  */
-
-  bool PureTrigMesh (int faceindex = 0) const;
-  bool PureTetMesh () const;
-
-
-  const class MeshTopology & GetTopology () const
-  { return *topology; }
-  void UpdateTopology();
-  
-  class CurvedElements & GetCurvedElements () const
-  { return *curvedelems; }
-
-  const class AnisotropicClusters & GetClusters () const
-  { return *clusters; }
-
-
-
-  int GetTimeStamp() const { return timestamp; }
-  void SetNextTimeStamp() 
-  { timestamp = NextTimeStamp(); }
-
-  int GetMajorTimeStamp() const { return majortimestamp; }
-  void SetNextMajorTimeStamp() 
-  { majortimestamp = timestamp = NextTimeStamp(); }
-
-
-  /// return mutex
-  NgMutex & Mutex ()   { return mutex; }
-
-  ///
-  friend void OptimizeRestart (Mesh & mesh3d);
-  ///
-  void PrintMemInfo (ostream & ost) const;
-  /// 
-  friend class Meshing3;
-};
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/meshfunc.cpp b/contrib/Netgen/libsrc/meshing/meshfunc.cpp
deleted file mode 100644
index 90fe9e68c5ad05ad42ea753d1e80c32091ea9c72..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshfunc.cpp
+++ /dev/null
@@ -1,688 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-  extern const char * tetrules[];
-  // extern const char * tetrules2[];
-  extern const char * prismrules2[];
-  extern const char * pyramidrules[];
-  extern const char * pyramidrules2[];
-
-
-  extern double teterrpow; 
-  MESHING3_RESULT MeshVolume (MeshingParameters & mp, Mesh& mesh3d)
-  {
-    int i, oldne;
-    PointIndex pi;
-
-    int meshed;
-    int cntsteps; 
-
-
-    ARRAY<INDEX_2> connectednodes;
-
-    mesh3d.Compress();
-
-    //  mesh3d.PrintMemInfo (cout);
-
-
-
-    if (mesh3d.CheckOverlappingBoundary())
-      throw NgException ("Stop meshing since boundary mesh is overlapping");
-
-
-    int nonconsist = 0;
-    for (int k = 1; k <= mesh3d.GetNDomains(); k++)
-      {
-	PrintMessage (3, "Check subdomain ", k, " / ", mesh3d.GetNDomains());
-
-	mesh3d.FindOpenElements(k);
-
-	/*
-	bool res = mesh3d.CheckOverlappingBoundary();
-	if (res)
-	  {
-	    PrintError ("Surface is overlapping !!");
-	    nonconsist = 1;
-	  }
-	*/
-
-	bool res = mesh3d.CheckConsistentBoundary();
-	if (res)
-	  {
-	    PrintError ("Surface mesh not consistent");
-	    nonconsist = 1;
-	  }
-      }
-
-    if (nonconsist)
-      {
-	PrintError ("Stop meshing since surface mesh not consistent");
-	throw NgException ("Stop meshing since surface mesh not consistent");
-      }
-
-    double globmaxh = mp.maxh;
-
-    for (int k = 1; k <= mesh3d.GetNDomains(); k++)
-      {
-	if (multithread.terminate)
-	  break;
-
-	PrintMessage (2, "");
-	PrintMessage (1, "Meshing subdomain ", k, " of ", mesh3d.GetNDomains());
- 
-	mp.maxh = min2 (globmaxh, mesh3d.MaxHDomain(k));
-
-	mesh3d.CalcSurfacesOfNode();
-	mesh3d.FindOpenElements(k);
-
-	if (!mesh3d.GetNOpenElements())
-	  continue;
-
-	int qstep;
-	for (qstep = 1; qstep <= 3; qstep++)
-	  {
-	    if (mesh3d.HasOpenQuads())
-	      {
-		string rulefile = ngdir;
-
-		const char ** rulep = NULL;
-		switch (qstep)
-		  {
-		  case 1:
-		    rulefile += "/rules/prisms2.rls";
-		    rulep = prismrules2;
-		    break;
-		  case 2: // connect pyramid to triangle
-		    rulefile += "/rules/pyramids2.rls";
-		    rulep = pyramidrules2;
-		    break;
-		  case 3: // connect to vis-a-vis point
-		    rulefile += "/rules/pyramids.rls";
-		    rulep = pyramidrules;
-		    break;
-		  }
-	      
-		//		Meshing3 meshing(rulefile);
-		Meshing3 meshing(rulep); 
-	      
-		MeshingParameters mpquad = mp;
-	      
-		mpquad.giveuptol = 15;
-		mpquad.baseelnp = 4;
-		mpquad.starshapeclass = 100;
-	      
-		for (pi = PointIndex::BASE; 
-		     pi < mesh3d.GetNP()+PointIndex::BASE; pi++)
-		  meshing.AddPoint (mesh3d[pi], pi);
-
-		mesh3d.GetIdentifications().GetPairs (0, connectednodes);
-		for (i = 1; i <= connectednodes.Size(); i++)
-		  meshing.AddConnectedPair (connectednodes.Get(i));
-	      
-		for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-		  {
-		    Element2d hel = mesh3d.OpenElement(i);
-		    meshing.AddBoundaryElement (hel);
-		  }
-	      
-		oldne = mesh3d.GetNE();
-	      
-		meshing.GenerateMesh (mesh3d, mpquad);
-	      
-		for (i = oldne + 1; i <= mesh3d.GetNE(); i++)
-		  mesh3d.VolumeElement(i).SetIndex (k);
-	      
-		(*testout) 
-		  << "mesh has " << mesh3d.GetNE() << " prism ? elements" << endl;
-	      
-		mesh3d.FindOpenElements(k);
-	      }
-	  }
-
-
-	if (mesh3d.HasOpenQuads())
-	  {
-	    PrintSysError ("mesh has still open quads");
-	    throw NgException ("Stop meshing since too many attempts");
-	    // return MESHING3_GIVEUP;
-	  }
-
-
-	if (mp.delaunay && mesh3d.GetNOpenElements())
-	  {
-	    Meshing3 meshing((const char**)NULL);
-	 
-	    mesh3d.FindOpenElements(k);
-	  
-
-	    for (pi = PointIndex::BASE; 
-		 pi < mesh3d.GetNP()+PointIndex::BASE; pi++)
-	      meshing.AddPoint (mesh3d[pi], pi);
-	  
-
-	    for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-	      meshing.AddBoundaryElement (mesh3d.OpenElement(i));
-	  
-	    oldne = mesh3d.GetNE();
-
-	    meshing.Delaunay (mesh3d, mp);
-
-	    for (i = oldne + 1; i <= mesh3d.GetNE(); i++)
-	      mesh3d.VolumeElement(i).SetIndex (k);
-
-	    PrintMessage (3, mesh3d.GetNP(), " points, ",
-			  mesh3d.GetNE(), " elements");
-	  }
-
-
-	cntsteps = 0;
-	do
-	  {
-	    if (multithread.terminate)
-	      break;
-
-	    mesh3d.FindOpenElements(k);
-	    PrintMessage (5, mesh3d.GetNOpenElements(), " open faces");
-	    cntsteps++;
-
-	    if (cntsteps > mp.maxoutersteps) 
-	      throw NgException ("Stop meshing since too many attempts");
-
-	    string rulefile = ngdir + "/tetra.rls";
-	    PrintMessage (1, "start tetmeshing");
-
-	    //	  Meshing3 meshing(rulefile);
-	    Meshing3 meshing(tetrules);
-      
-
-	    for (PointIndex pi = PointIndex::BASE; 
-		 pi < mesh3d.GetNP()+PointIndex::BASE; pi++)
-	      meshing.AddPoint (mesh3d[pi], pi);
-
-	    for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-	      meshing.AddBoundaryElement (mesh3d.OpenElement(i));
-
-
-	    oldne = mesh3d.GetNE();
-
-	    mp.giveuptol = 15; 
-	    mp.sloppy = 5;
-	    meshing.GenerateMesh (mesh3d, mp);
-
-	    for (ElementIndex ei = oldne; ei < mesh3d.GetNE(); ei++)
-	      mesh3d[ei].SetIndex (k);
-	  
-	  
-	    mesh3d.CalcSurfacesOfNode();
-	    mesh3d.FindOpenElements(k);
-	  
-	    teterrpow = 2;
-	    if (mesh3d.GetNOpenElements() != 0)
-	      {
-		meshed = 0;
-		PrintMessage (5, mesh3d.GetNOpenElements(), " open faces found");
-
-		//	      mesh3d.Save ("tmp.vol");
-
-
-		MeshOptimize3d optmesh;
-
-		const char * optstr = "mcmstmcmstmcmstmcm";
-		int j;
-		for (j = 1; j <= strlen(optstr); j++)
-		  {
-		    mesh3d.CalcSurfacesOfNode();
-		    mesh3d.FreeOpenElementsEnvironment(2);
-
-		    switch (optstr[j-1])
-		      {
-		      case 'c': optmesh.CombineImprove(mesh3d, OPT_REST); break;
-		      case 'd': optmesh.SplitImprove(mesh3d, OPT_REST); break;
-		      case 's': optmesh.SwapImprove(mesh3d, OPT_REST); break;
-		      case 't': optmesh.SwapImprove2(mesh3d, OPT_REST); break;
-		      case 'm': mesh3d.ImproveMesh(OPT_REST); break;
-		      }	  
-
-		  }
-
-		mesh3d.FindOpenElements(k);	      
-		PrintMessage (3, "Call remove problem");
-		RemoveProblem (mesh3d);
-		mesh3d.FindOpenElements(k);
-	      }
-	    else
-	      {
-		meshed = 1;
-		PrintMessage (1, "Success !");
-	      }
-	  }
-	while (!meshed);
-
-	PrintMessage (1, mesh3d.GetNP(), " points, ",
-		      mesh3d.GetNE(), " elements");
-      }
-
-    mp.maxh = globmaxh;
-
-    MeshQuality3d (mesh3d);
-
-    return MESHING3_OK;
-  }  
-
-
-
-
-  /*
-
-
-  MESHING3_RESULT MeshVolumeOld (MeshingParameters & mp, Mesh& mesh3d)
-  {
-  int i, k, oldne;
-
-
-  int meshed;
-  int cntsteps; 
-
-
-  PlotStatistics3d * pstat;
-  if (globflags.GetNumFlag("silentflag", 1) <= 2)
-  pstat = new XPlotStatistics3d;
-  else
-  pstat = new TerminalPlotStatistics3d;
-
-  cntsteps = 0;
-  do
-  {
-  cntsteps++;
-  if (cntsteps > mp.maxoutersteps) 
-  {
-  return MESHING3_OUTERSTEPSEXCEEDED;
-  }
-
-
-  int noldp = mesh3d.GetNP();
-      
-      
-  if ( (cntsteps == 1) && globflags.GetDefineFlag ("delaunay"))
-  {
-  cntsteps ++;
-
-  mesh3d.CalcSurfacesOfNode();
-
-
-  for (k = 1; k <= mesh3d.GetNDomains(); k++)
-  {
-  Meshing3 meshing(NULL, pstat);
-
-  mesh3d.FindOpenElements(k);
-	      
-  for (i = 1; i <= noldp; i++)
-  meshing.AddPoint (mesh3d.Point(i), i);
-	      
-  for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-  {
-  if (mesh3d.OpenElement(i).GetIndex() == k)
-  meshing.AddBoundaryElement (mesh3d.OpenElement(i));
-  }
-	      
-  oldne = mesh3d.GetNE();
-  if (globflags.GetDefineFlag ("blockfill"))
-  {
-  if (!globflags.GetDefineFlag ("localh"))
-  meshing.BlockFill 
-  (mesh3d, mp.h * globflags.GetNumFlag ("relblockfillh", 1));
-  else
-  meshing.BlockFillLocalH (mesh3d);
-  }
-	      
-  MeshingParameters mpd;
-  meshing.Delaunay (mesh3d, mpd);
-
-  for (i = oldne + 1; i <= mesh3d.GetNE(); i++)
-  mesh3d.VolumeElement(i).SetIndex (k);
-  }
-  }
-
-  noldp = mesh3d.GetNP();
-
-  mesh3d.CalcSurfacesOfNode();
-  mesh3d.FindOpenElements();
-  for (k = 1; k <= mesh3d.GetNDomains(); k++)
-  {
-  Meshing3 meshing(globflags.GetStringFlag ("rules3d", NULL), pstat);
-      
-  Point3d pmin, pmax;
-  mesh3d.GetBox (pmin, pmax, k);
-	  
-  rot.SetCenter (Center (pmin, pmax));
-
-  for (i = 1; i <= noldp; i++)
-  meshing.AddPoint (mesh3d.Point(i), i);
-
-  for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-  {
-  if (mesh3d.OpenElement(i).GetIndex() == k)
-  meshing.AddBoundaryElement (mesh3d.OpenElement(i));
-  }
-
-  oldne = mesh3d.GetNE();
-
-
-  if ( (cntsteps == 1) && globflags.GetDefineFlag ("blockfill"))
-  {
-  if (!globflags.GetDefineFlag ("localh"))
-  {
-  meshing.BlockFill 
-  (mesh3d, 
-  mp.h * globflags.GetNumFlag ("relblockfillh", 1));
-  }
-  else
-  {
-  meshing.BlockFillLocalH (mesh3d);
-  }
-  }
-
-
-  mp.giveuptol = int(globflags.GetNumFlag ("giveuptol", 15));
-
-  meshing.GenerateMesh (mesh3d, mp);
-
-  for (i = oldne + 1; i <= mesh3d.GetNE(); i++)
-  mesh3d.VolumeElement(i).SetIndex (k);
-  }
-
-
-
-  mesh3d.CalcSurfacesOfNode();
-  mesh3d.FindOpenElements();
-      
-  teterrpow = 2;
-  if (mesh3d.GetNOpenElements() != 0)
-  {
-  meshed = 0;
-  (*mycout) << "Open elements found, old" << endl;
-  const char * optstr = "mcmcmcmcm";
-  int j;
-  for (j = 1; j <= strlen(optstr); j++)
-  switch (optstr[j-1])
-  {
-  case 'c': mesh3d.CombineImprove(); break;
-  case 'd': mesh3d.SplitImprove(); break;
-  case 's': mesh3d.SwapImprove(); break;
-  case 'm': mesh3d.ImproveMesh(2); break;
-  }	  
-	  
-  (*mycout) << "Call remove" << endl;
-  RemoveProblem (mesh3d);
-  (*mycout) << "Problem removed" << endl;
-  }
-  else
-  meshed = 1;
-  }
-  while (!meshed);
-
-  MeshQuality3d (mesh3d);
-
-  return MESHING3_OK;
-  }  
-
-  */
-
-
-  MESHING3_RESULT MeshMixedVolume(MeshingParameters & mp, Mesh& mesh3d)
-  {
-    int i, j;
-    MESHING3_RESULT res;
-    Point3d pmin, pmax;
-
-    mp.giveuptol = 10;
-    mp.baseelnp = 4;
-    mp.starshapeclass = 100;
-
-    //  TerminalPlotStatistics3d pstat;
-  
-    Meshing3 meshing1("pyramids.rls");
-    for (i = 1; i <= mesh3d.GetNP(); i++)
-      meshing1.AddPoint (mesh3d.Point(i), i);
-
-    mesh3d.FindOpenElements();
-    for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-      if (mesh3d.OpenElement(i).GetIndex() == 1)
-	meshing1.AddBoundaryElement (mesh3d.OpenElement(i));
-
-    res = meshing1.GenerateMesh (mesh3d, mp);
-
-    mesh3d.GetBox (pmin, pmax);
-    PrintMessage (1, "Mesh pyramids, res = ", res);
-    if (res)
-      exit (1);
-
-
-    for (i = 1; i <= mesh3d.GetNE(); i++)
-      mesh3d.VolumeElement(i).SetIndex (1);
-
-    // do delaunay
-  
-    mp.baseelnp = 0;
-    mp.starshapeclass = 5;
-
-    Meshing3 meshing2(NULL);
-    for (i = 1; i <= mesh3d.GetNP(); i++)
-      meshing2.AddPoint (mesh3d.Point(i), i);
-    
-    mesh3d.FindOpenElements();
-    for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-      if (mesh3d.OpenElement(i).GetIndex() == 1)
-	meshing2.AddBoundaryElement (mesh3d.OpenElement(i));
-
-    MeshingParameters mpd;
-    meshing2.Delaunay (mesh3d, mpd);
-
-    for (i = 1; i <= mesh3d.GetNE(); i++)
-      mesh3d.VolumeElement(i).SetIndex (1);
-
-
-    mp.baseelnp = 0;
-    mp.giveuptol = 10;
-
-    for (int trials = 1; trials <= 50; trials++)
-      {
-	if (multithread.terminate)
-	  return MESHING3_TERMINATE;
-
-	Meshing3 meshing3("tetra.rls");
-	for (i = 1; i <= mesh3d.GetNP(); i++)
-	  meshing3.AddPoint (mesh3d.Point(i), i);
-      
-	mesh3d.FindOpenElements();
-	for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-	  if (mesh3d.OpenElement(i).GetIndex() == 1)
-	    meshing3.AddBoundaryElement (mesh3d.OpenElement(i));
-      
-	if (trials > 1)
-	  CheckSurfaceMesh2 (mesh3d);
-	res = meshing3.GenerateMesh (mesh3d, mp);
-      
-	for (i = 1; i <= mesh3d.GetNE(); i++)
-	  mesh3d.VolumeElement(i).SetIndex (1);
-
-	if (res == 0) break;
-
-
-
-	for (i = 1; i <= mesh3d.GetNE(); i++)
-	  {
-	    const Element & el = mesh3d.VolumeElement(i);
-	    if (el.GetNP() != 4)
-	      {
-		for (j = 1; j <= el.GetNP(); j++)
-		  mesh3d.AddLockedPoint (el.PNum(j));
-	      }
-	  }
-
-	mesh3d.CalcSurfacesOfNode();
-	mesh3d.FindOpenElements();
-
-	MeshOptimize3d optmesh;
-
-	teterrpow = 2;
-	const char * optstr = "mcmcmcmcm";
-	for (j = 1; j <= strlen(optstr); j++)
-	  switch (optstr[j-1])
-	    {
-	    case 'c': optmesh.CombineImprove(mesh3d, OPT_REST); break;
-	    case 'd': optmesh.SplitImprove(mesh3d); break;
-	    case 's': optmesh.SwapImprove(mesh3d); break;
-	    case 'm': mesh3d.ImproveMesh(); break;
-	    }	  
-	        
-	RemoveProblem (mesh3d);
-      }
-
-
-    PrintMessage (1, "Meshing tets, res = ", res);
-    if (res)
-      {
-	mesh3d.FindOpenElements();
-	PrintSysError (1, "Open elemetns: ", mesh3d.GetNOpenElements());
-	exit (1);
-      }
-
-
-  
-    for (i = 1; i <= mesh3d.GetNE(); i++)
-      {
-	const Element & el = mesh3d.VolumeElement(i);
-	if (el.GetNP() != 4)
-	  {
-	    for (j = 1; j <= el.GetNP(); j++)
-	      mesh3d.AddLockedPoint (el.PNum(j));
-	  }
-      }
-  
-    mesh3d.CalcSurfacesOfNode();
-    mesh3d.FindOpenElements();
-  
-    MeshOptimize3d optmesh;
-
-    teterrpow = 2;
-    const char * optstr = "mcmcmcmcm";
-    for (j = 1; j <= strlen(optstr); j++)
-      switch (optstr[j-1])
-	{
-	case 'c': optmesh.CombineImprove(mesh3d, OPT_REST); break;
-	case 'd': optmesh.SplitImprove(mesh3d); break;
-	case 's': optmesh.SwapImprove(mesh3d); break;
-	case 'm': mesh3d.ImproveMesh(); break;
-	}	  
-
-
-    return MESHING3_OK;
-  }
-
-
-
-
-
-
-
-  MESHING3_RESULT OptimizeVolume (MeshingParameters & mp, 
-				  Mesh & mesh3d)
-    //				  const CSGeometry * geometry)
-  {
-    int i, j;
-
-    PrintMessage (1, "Volume Optimization");
-
-    /*
-      if (!mesh3d.PureTetMesh())
-      return MESHING3_OK;
-    */
-
-    // (*mycout) << "optstring = " << mp.optimize3d << endl;
-    /*
-      const char * optstr = globflags.GetStringFlag ("optimize3d", "cmh");
-      int optsteps = int (globflags.GetNumFlag ("optsteps3d", 2));
-    */
-
-    mesh3d.CalcSurfacesOfNode();
-    for (i = 1; i <= mp.optsteps3d; i++)
-      {
-	if (multithread.terminate)
-	  break;
-
-	MeshOptimize3d optmesh;
-
-	teterrpow = mp.opterrpow;
-	for (j = 1; j <= strlen(mp.optimize3d); j++)
-	  {
-	    if (multithread.terminate)
-	      break;
-
-	    switch (mp.optimize3d[j-1])
-	      {
-	      case 'c': optmesh.CombineImprove(mesh3d, OPT_REST); break;
-	      case 'd': optmesh.SplitImprove(mesh3d); break;
-	      case 's': optmesh.SwapImprove(mesh3d); break;
-	      case 't': optmesh.SwapImprove2(mesh3d); break;
-#ifdef SOLIDGEOM
-	      case 'm': mesh3d.ImproveMesh(*geometry); break;
-	      case 'M': mesh3d.ImproveMesh(*geometry); break;
-#else
-	      case 'm': mesh3d.ImproveMesh(); break;
-	      case 'M': mesh3d.ImproveMesh(); break;
-#endif
-	      
-	      case 'j': mesh3d.ImproveMeshJacobian(); break;
-	      }
-	  }
-	MeshQuality3d (mesh3d);
-      }
-  
-    return MESHING3_OK;
-  }
-
-
-
-
-  void RemoveIllegalElements (Mesh & mesh3d)
-  {
-    int it = 10;
-    int nillegal, oldn;
-    int i;
-
-    PrintMessage (1, "Remove Illegal Elements");
-    // return, if non-pure tet-mesh
-    /*
-      if (!mesh3d.PureTetMesh())
-      return;
-    */
-    mesh3d.CalcSurfacesOfNode();
-
-    nillegal = mesh3d.MarkIllegalElements();
-
-    MeshOptimize3d optmesh;
-    while (nillegal && (it--) > 0)
-      {
-	if (multithread.terminate)
-	  break;
-
-	PrintMessage (5, nillegal, " illegal tets");
-	optmesh.SplitImprove (mesh3d, OPT_LEGAL);
-
-	mesh3d.MarkIllegalElements();  // test
-	optmesh.SwapImprove (mesh3d, OPT_LEGAL);
-	mesh3d.MarkIllegalElements();  // test
-	optmesh.SwapImprove2 (mesh3d, OPT_LEGAL);
-
-	oldn = nillegal;
-	nillegal = mesh3d.MarkIllegalElements();
-
-	if (oldn != nillegal)
-	  it = 10;
-      }
-    PrintMessage (5, nillegal, " illegal tets");
-  }
-}
diff --git a/contrib/Netgen/libsrc/meshing/meshfunc.hpp b/contrib/Netgen/libsrc/meshing/meshfunc.hpp
deleted file mode 100644
index ab2d661050842ae9abb673d9c39091ca4e1aa78e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshfunc.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef FILE_MESHFUNC
-#define FILE_MESHFUNC
-
-/**************************************************************************/
-/* File:   meshfunc.hh                                                    */
-/* Author: Johannes Gerstmayr                                             */
-/* Date:   26. Jan. 98                                                    */
-/**************************************************************************/
-
-
-/*
-  Functions for mesh-generations strategies
- */
-
-class Mesh;
-// class CSGeometry;
-
-/// Build tet-mesh
-MESHING3_RESULT MeshVolume(MeshingParameters & mp, Mesh& mesh3d);
-
-/// Build mixed-element mesh
-MESHING3_RESULT MeshMixedVolume(MeshingParameters & mp, Mesh& mesh3d);
-
-/// Optimize tet-mesh
-MESHING3_RESULT OptimizeVolume(MeshingParameters & mp, Mesh& mesh3d);
-//			       const CSGeometry * geometry = NULL);
-
-void RemoveIllegalElements (Mesh & mesh3d);
-
-
-enum MESHING_STEP { 
-  MESHCONST_ANALYSE = 1,
-  MESHCONST_MESHEDGES = 2,
-  MESHCONST_MESHSURFACE = 3,
-  MESHCONST_OPTSURFACE = 4,
-  MESHCONST_MESHVOLUME = 5,
-  MESHCONST_OPTVOLUME = 6
-};
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/meshfunc2d.cpp b/contrib/Netgen/libsrc/meshing/meshfunc2d.cpp
deleted file mode 100644
index f329d1df764e2e475c83365998a0f0bba8e06091..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshfunc2d.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-  void Optimize2d (Mesh & mesh, MeshingParameters & mp)
-  {
-    int i, j;
-
-    double h = mp.maxh;
-  
-    mesh.CalcSurfacesOfNode();
-
-    const char * optstr = mp.optimize2d;
-    int optsteps = mp.optsteps2d;
-
-    //  cout << "optstr = " << optstr << endl;
-
-    for (i = 1; i <= optsteps; i++)
-      for (j = 1; j <= strlen(optstr); j++)
-	{
-	  if (multithread.terminate) break;
-	  switch (optstr[j-1])
-	    {
-	    case 's': 
-	      {  // topological swap
-		MeshOptimize2d meshopt;
-		meshopt.SetMetricWeight (0);
-		meshopt.EdgeSwapping (mesh, 0);
-		break;
-	      }
-	    case 'S': 
-	      {  // metric swap
-		MeshOptimize2d meshopt;
-		meshopt.SetMetricWeight (0);
-		meshopt.EdgeSwapping (mesh, 1);
-		break;
-	      }
-	    case 'm': 
-	      {
-		MeshOptimize2d meshopt;
-		meshopt.SetMetricWeight (1);
-		meshopt.ImproveMesh(mesh);
-		break;
-	      }
-	    
-	    case 'c': 
-	      {
-		MeshOptimize2d meshopt;
-		meshopt.SetMetricWeight (0.2);
-		meshopt.CombineImprove(mesh);
-		break;
-	      }
-	    default:
-	      cerr << "Optimization code " << optstr[j-1] << " not defined" << endl;
-	    }  
-	}
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/meshing.hpp b/contrib/Netgen/libsrc/meshing/meshing.hpp
deleted file mode 100644
index a4442867b3a323befcbd528f1c80f0dbae204857..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef FILE_MESHING
-#define FILE_MESHING
-
-#include <myadt.hpp>
-#include <gprim.hpp>
-#include <linalg.hpp>
-#include <opti.hpp>
-
-namespace netgen
-{
-
-  class CSGeometry;
-  
-  
-#include "msghandler.hpp"
-
-#include "meshtype.hpp"
-#include "localh.hpp"
-#include "meshclass.hpp"
-#include "global.hpp"
-
-
-#include "meshtool.hpp"
-#include "ruler2.hpp"
-#include "adfront2.hpp"
-#include "meshing2.hpp"
-#include "improve2.hpp"
-
-
-#include "geomsearch.hpp"
-#include "adfront3.hpp"
-#include "ruler3.hpp"
-
-#ifndef SMALLLIB
-#define _INCLUDE_MORE
-#endif
-#ifdef LINUX
-#define _INCLUDE_MORE
-#endif
-
-#ifdef _INCLUDE_MORE
-#include "meshing3.hpp"
-#include "improve3.hpp"
-#endif
-#include "findip.hpp"
-
-#include "topology.hpp"
-#include "curvedelems.hpp"
-#include "clusters.hpp"
-
-#ifdef _INCLUDE_MORE
-#include "meshfunc.hpp"
-#endif
-#include "bisect.hpp"
-#include "hprefinement.hpp"
-#include "boundarylayer.hpp"
-#include "specials.hpp"
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/meshing2.cpp b/contrib/Netgen/libsrc/meshing/meshing2.cpp
deleted file mode 100644
index e7643194c4eee04b5eb680e607a48fd6df79057b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing2.cpp
+++ /dev/null
@@ -1,1864 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-  static void glrender (int wait);
-
-
-  // global variable for visualization
-
-  static ARRAY<Point3d> locpoints;
-  static ARRAY<int> legalpoints;
-  static ARRAY<Point2d> plainpoints;
-  static ARRAY<int> plainzones;
-  static ARRAY<INDEX_2> loclines;
-  static int geomtrig;
-  //static const char * rname;
-  static int cntelem, trials, nfaces;
-  static int oldnl;
-  static int qualclass;
- 
-
-  Meshing2 :: Meshing2 (const Box3d & aboundingbox)
-  {
-    boundingbox = aboundingbox;
-
-    LoadRules (NULL);
-    // LoadRules ("rules/quad.rls");
-    // LoadRules ("rules/triangle.rls");
-
-    adfront = new AdFront2(boundingbox);
-    starttime = GetTime();
-  }
-
-
-  Meshing2 :: ~Meshing2 ()
-  {
-    delete adfront;
-    for (int i = 0; i < rules.Size(); i++)
-      delete rules[i];
-  }
-
-  void Meshing2 :: AddPoint (const Point3d & p, PointIndex globind, 
-			     MultiPointGeomInfo * mgi)
-  {
-    // (*testout) << "add point " << globind << endl;
-    adfront ->AddPoint (p, globind, mgi);
-  }
-
-  void Meshing2 :: AddBoundaryElement (int i1, int i2,
-				       const PointGeomInfo & gi1, const PointGeomInfo & gi2)
-  {
-    //    (*testout) << "add line " << i1 << " - " << i2 << endl;
-    if (!gi1.trignum || !gi2.trignum)
-      {
-	PrintSysError ("addboundaryelement: illegal geominfo");
-      }
-    adfront -> AddLine (i1, i2, gi1, gi2);
-  }
-
-
-
-  void Meshing2 :: StartMesh ()
-  {
-    foundmap.SetSize (rules.Size());
-    canuse.SetSize (rules.Size());
-    ruleused.SetSize (rules.Size());
-
-    foundmap = 0;
-    canuse = 0;
-    ruleused = 0;
-
-    cntelem = 0;
-    trials = 0;
-  }
-
-  void Meshing2 :: EndMesh ()
-  {
-    for (int i = 0; i < ruleused.Size(); i++)
-      (*testout) << setw(4) << ruleused[i]
-		 << " times used rule " << rules[i] -> Name() << endl;
-  }
-
-  void Meshing2 :: SetStartTime (double astarttime)
-  {
-    starttime = astarttime;
-  }
-
-  double Meshing2 :: CalcLocalH (const Point3d & /* p */, double gh) const
-  {
-    return gh;
-  }
-
-
-
-  // should be class variables !!(?)
-  static Vec3d ex, ey;
-  static Point3d globp1;
-
-  void Meshing2 :: DefineTransformation (Point3d & p1, Point3d & p2,
-					 const PointGeomInfo * geominfo1,
-					 const PointGeomInfo * geominfo2)
-  {
-    globp1 = p1;
-    ex = p2 - p1;
-    ex /= ex.Length();
-    ey.X() = -ex.Y();
-    ey.Y() =  ex.X();
-    ey.Z() = 0;
-  }
-
-  void Meshing2 :: TransformToPlain (const Point3d & locpoint, 
-				     const MultiPointGeomInfo & geominf,
-				     Point2d & plainpoint, double h, int & zone)
-  {
-    Vec3d p1p (globp1, locpoint);
-
-    //    p1p = locpoint - globp1;
-    p1p /= h;
-    plainpoint.X() = p1p * ex;
-    plainpoint.Y() = p1p * ey;
-    zone = 0;
-  }
-
-  int Meshing2 :: TransformFromPlain (Point2d & plainpoint,
-				      Point3d & locpoint, 
-				      PointGeomInfo & gi, 
-				      double h)
-  {
-    Vec3d p1p;
-    gi.trignum = 1;
-
-    p1p = plainpoint.X() * ex + plainpoint.Y() * ey;
-    p1p *= h;
-    locpoint = globp1 + p1p;
-    return 0;
-  }
-
-
-  int Meshing2 :: BelongsToActiveChart (const Point3d & p, 
-					const PointGeomInfo & gi)
-  {
-    return 1;
-  }
-
-
-  int Meshing2 :: ComputePointGeomInfo (const Point3d & p, PointGeomInfo & gi)
-  {
-    gi.trignum = 1;
-    return 0;
-  }
-
-
-  int Meshing2 :: ChooseChartPointGeomInfo (const MultiPointGeomInfo & mpgi, 
-					    PointGeomInfo & pgi)
-  {
-    pgi = mpgi.GetPGI(1);
-    return 0;
-  }
-
-
-
-  int Meshing2 :: 
-  IsLineVertexOnChart (const Point3d & p1, const Point3d & p2,
-		       int endpoint, const PointGeomInfo & geominfo)
-  {
-    return 1;
-  }
-
-  void Meshing2 ::
-  GetChartBoundary (ARRAY<Point2d> & points, 
-		    ARRAY<Point3d> & points3d, 
-		    ARRAY<INDEX_2> & lines, double h) const
-  {
-    points.SetSize (0);
-    points3d.SetSize (0);
-    lines.SetSize (0);
-  }
-
-  double Meshing2 :: Area () const
-  {
-    return -1;
-  }
-
-
-
-
-
-  MESHING2_RESULT Meshing2 :: GenerateMesh (Mesh & mesh, double gh, int facenr)
-  {
-    ARRAY<int> pindex, lindex;
-    ARRAY<int> delpoints, dellines;
-
-    ARRAY<PointGeomInfo> upgeominfo;  // unique info
-    ARRAY<MultiPointGeomInfo> mpgeominfo;  // multiple info
-
-    ARRAY<Element2d> locelements;
-
-    int i, k, z1, z2, j, oldnp;
-    SurfaceElementIndex sei;
-    int baselineindex;
-    bool found;
-    int rulenr;
-    int globind;
-    Point3d p1, p2;
-
-    const PointGeomInfo * blgeominfo1;
-    const PointGeomInfo * blgeominfo2;
-
-    bool morerisc;
-    bool debugflag;
-
-    double h, his, hshould;
-
-
-    // test for 3d overlaps
-    Box3dTree surfeltree (boundingbox.PMin(),
-			  boundingbox.PMax());
-
-    ARRAY<int> intersecttrias;
-    ARRAY<Point3d> critpoints;
-
-    // test for doubled edges
-    //INDEX_2_HASHTABLE<int> doubleedge(300000);
-
-
-    testmode = 0;
-
-    StartMesh();
-
-    ARRAY<Point2d> chartboundpoints;
-    ARRAY<Point3d> chartboundpoints3d;
-    ARRAY<INDEX_2> chartboundlines;
-
-    // illegal points: points with more then 50 elements per node
-    int maxlegalpoint, maxlegalline;
-    ARRAY<int,PointIndex::BASE> trigsonnode;
-    ARRAY<int,PointIndex::BASE> illegalpoint;
-
-    trigsonnode.SetSize (mesh.GetNP());
-    illegalpoint.SetSize (mesh.GetNP());
-
-    trigsonnode = 0;
-    illegalpoint = 0;
-  
-
-    double totalarea = Area ();
-    double meshedarea = 0;
-
-    // search tree for surface elements:
-    for (sei = 0; sei < mesh.GetNSE(); sei++)
-      {
-	const Element2d & sel = mesh[sei];
-
-	if (sel.IsDeleted())  continue;
-
-	if (sel.GetIndex() == facenr)
-	  {
-	    const Point3d & sep1 = mesh[sel.PNum(1)];
-	    const Point3d & sep2 = mesh[sel.PNum(2)];
-	    const Point3d & sep3 = mesh[sel.PNum(3)];
-	    Point3d sepmin(sep1), sepmax(sep2);
-	    sepmin.SetToMin (sep2);
-	    sepmin.SetToMin (sep3);
-	    sepmin.SetToMax (sep2);
-	    sepmin.SetToMax (sep3);
-
-	    surfeltree.Insert (sepmin, sepmax, sei);
-	  }
-
-      
-	double trigarea = Cross (Vec3d (mesh.Point (sel.PNum(1)),
-					mesh.Point (sel.PNum(2))),
-				 Vec3d (mesh.Point (sel.PNum(1)),
-					mesh.Point (sel.PNum(3)))).Length() / 2;;
-
-	if (sel.GetNP() == 4)
-	  trigarea += Cross (Vec3d (mesh.Point (sel.PNum(1)),
-				    mesh.Point (sel.PNum(3))),
-			     Vec3d (mesh.Point (sel.PNum(1)),
-				    mesh.Point (sel.PNum(4)))).Length() / 2;;
-	meshedarea += trigarea;
-
-      }
-
-
-    char * savetask = multithread.task;
-    multithread.task = "Surface meshing";
-
-    adfront ->SetStartFront ();
-
-
-    int plotnexttrial = 999;
-    //  starttime = GetTime();
-    while (!adfront ->Empty()) //  && !multithread.terminate)
-      {
-	if (multithread.terminate)
-	  throw NgException ("Meshing stopped");
-
-
-	// known for STL meshing
-	if (totalarea > 0)
-	  multithread.percent = 100 * meshedarea / totalarea;
-	/*
-	  else
-	  multithread.percent = 0;
-	*/
-
-	locpoints.SetSize(0);
-	loclines.SetSize(0);
-	pindex.SetSize(0);
-	lindex.SetSize(0);
-	delpoints.SetSize(0);
-	dellines.SetSize(0);
-	locelements.SetSize(0);
-
-
-
-	// plot statistics
-	if (trials > plotnexttrial)
-	  {
-	    PrintMessage (5, 
-			  "faces = ", nfaces,
-			  " trials = ", trials,
-			  " elements = ", mesh.GetNSE(),
-			  " els/sec = ",
-			  (mesh.GetNSE() / (GetTime() - starttime + 0.0001)));
-	    plotnexttrial += 1000;
-	  }
-
-
-	// unique-pgi, multi-pgi
-	upgeominfo.SetSize(0);
-	mpgeominfo.SetSize(0);
-
-
-	nfaces = adfront->GetNFL();
-	trials ++;
-    
-
-	if (trials % 1000 == 0)
-	  {
-	    (*testout) << "\n";
-	    for (i = 1; i <= canuse.Size(); i++)
-	      {
-		(*testout) << foundmap.Get(i) << "/" 
-			   << canuse.Get(i) << "/"
-			   << ruleused.Get(i) << " map/can/use rule " << rules.Get(i)->Name() << "\n";
-	      }
-	    (*testout) << "\n";
-	  }
-
-
-	baselineindex = adfront -> SelectBaseLine (p1, p2, blgeominfo1, blgeominfo2, qualclass);
-
-	// cout << "baseline = " << baselineindex << ", p1, p2 = " << p1 << ", " << p2 << endl;
-
-	found = 1;
-
-
-	his = Dist (p1, p2);
-
-	Point3d pmid = Center (p1, p2);
-	hshould = CalcLocalH (pmid, mesh.GetH (pmid));
-	if (gh < hshould)
-	  hshould = gh;
-
-	mesh.RestrictLocalH (pmid, hshould);
-
-	h = hshould;
-
-	double hinner = (3 + qualclass) * max2 (his, hshould);
-
-	adfront ->GetLocals (baselineindex, locpoints, mpgeominfo, loclines, 
-			     pindex, lindex, 2*hinner);
-	
-
-	if (qualclass > 200)
-	  {
-	    PrintMessage (3, "give up with qualclass ", qualclass);
-	    PrintMessage (3, "number of frontlines = ", adfront->GetNFL());
-	    // throw NgException ("Give up 2d meshing");
-	    break;
-	  }
-
-	/*
-	if (found && qualclass > 60)
-	  {
-	    found = 0;
-	  }
-	*/
-	//      morerisc = ((qualclass > 20) && (qualclass % 2 == 1));
-	//      morerisc = 1;
-	morerisc = 0;
-
-
-	PointIndex gpi1 = adfront -> GetGlobalIndex (pindex.Get(loclines[0].I1()));
-	PointIndex gpi2 = adfront -> GetGlobalIndex (pindex.Get(loclines[0].I2()));
-
-
-	debugflag = 
-	  debugparam.haltsegment &&
-	  ( (debugparam.haltsegmentp1 == gpi1) && 
-	    (debugparam.haltsegmentp2 == gpi2) || 
-	    (debugparam.haltsegmentp1 == gpi2) && 
-	    (debugparam.haltsegmentp2 == gpi1)) ||
-	  debugparam.haltnode &&
-	  ( (debugparam.haltsegmentp1 == gpi1) ||
-	    (debugparam.haltsegmentp2 == gpi1));
-
-      
-	if (debugparam.haltface && debugparam.haltfacenr == facenr)
-	  {
-	    debugflag = 1;
-	    cout << "set debugflag" << endl;
-	  }
-	
-	if (debugparam.haltlargequalclass && qualclass > 50)
-	  debugflag = 1;
-
-
-	// problem recognition !
-	if (found && 
-	    (gpi1 < illegalpoint.Size()+PointIndex::BASE) && 
-	    (gpi2 < illegalpoint.Size()+PointIndex::BASE) )
-	  {
-	    if (illegalpoint[gpi1] || illegalpoint[gpi2])
-	      found = 0;
-	  }
-
-
-	Point2d p12d, p22d;
-
-	if (found)
-	  {
-	    oldnp = locpoints.Size();
-	    oldnl = loclines.Size();
-	  
-	    if (debugflag)
-	      (*testout) << "define new transformation" << endl;
-
-	    DefineTransformation (p1, p2, blgeominfo1, blgeominfo2);
-	  
-	    plainpoints.SetSize (locpoints.Size());
-	    plainzones.SetSize (locpoints.Size());
-
-	    // (*testout) << endl;
-
-	    //	    (*testout) << "3d->2d transformation" << endl;
-
-	    for (i = 1; i <= locpoints.Size(); i++)
-	      {
-		// (*testout) << "pindex(i) = " << pindex[i-1] << endl;
-		TransformToPlain (locpoints.Get(i), 
-				  mpgeominfo.Get(i),
-				  plainpoints.Elem(i), h, plainzones.Elem(i));
-		//		(*testout) << mpgeominfo.Get(i).GetPGI(1).u << " " << mpgeominfo.Get(i).GetPGI(1).v << " ";
-		//		(*testout) << plainpoints.Get(i).X() << " " << plainpoints.Get(i).Y() << endl;
-	      }
-	    //	    (*testout) << endl << endl << endl;
-
-	    p12d = plainpoints.Get(1);
-	    p22d = plainpoints.Get(2);
-
-	    /*
-	    // last idea on friday
-	    plainzones.Elem(1) = 0;
-	    plainzones.Elem(2) = 0;
-	    */
-
-
-	    /*
-	    // old netgen:
-	    for (i = 2; i <= loclines.Size(); i++)  // don't remove first line
-	    {
-	    z1 = plainzones.Get(loclines.Get(i).I1());
-	    z2 = plainzones.Get(loclines.Get(i).I2());
-	      
-	    if (z1 && z2 && (z1 != z2) || (z1 == -1) || (z2 == -1) )
-	    {
-	    loclines.DeleteElement(i);
-	    lindex.DeleteElement(i);
-	    oldnl--;
-	    i--;
-	    }
-	    }
-
-	    // 	  for (i = 1; i <= plainpoints.Size(); i++)
-	    // 	    if (plainzones.Elem(i) == -1)
-	    // 	      plainpoints.Elem(i) = Point2d (1e4, 1e4);
-	    */
-	  
-
-	  
-	    for (i = 2; i <= loclines.Size(); i++)  // don't remove first line
-	      {
-		// (*testout) << "loclines(i) = " << loclines.Get(i).I1() << " - " << loclines.Get(i).I2() << endl;
-		z1 = plainzones.Get(loclines.Get(i).I1());
-		z2 = plainzones.Get(loclines.Get(i).I2());
-	      
-	      
-		// one inner point, one outer
-		if ( (z1 >= 0) != (z2 >= 0))
-		  {
-		    int innerp = (z1 >= 0) ? 1 : 2;
-		    if (IsLineVertexOnChart (locpoints.Get(loclines.Get(i).I1()),
-					     locpoints.Get(loclines.Get(i).I2()),
-					     innerp,
-					     adfront->GetLineGeomInfo (lindex.Get(i), innerp)))
-		      // pgeominfo.Get(loclines.Get(i).I(innerp))))
-		      {		
-
-			if (!morerisc)
-			  {
-			    // use one end of line
-			    int pini, pouti;
-			    Vec2d v;
-			  
-			    pini = loclines.Get(i).I(innerp);
-			    pouti = loclines.Get(i).I(3-innerp);
-			  
-			    Point2d pin (plainpoints.Get(pini));
-			    Point2d pout (plainpoints.Get(pouti));
-			    v = pout - pin;
-			    double len = v.Length();
-			    if (len <= 1e-6)
-			      (*testout) << "WARNING(js): inner-outer: short vector" << endl;
-			    else
-			      v /= len;
-			  
-			    /*
-			    // don't elongate line towards base-line !!
-			    if (Vec2d (pin, p12d) * v > 0 && 
-			    Vec2d (pin, p22d) * v > 0)
-			    v *= -1;  
-			    */
-
-			    Point2d newpout = pin + 1000 * v;
-			    newpout = pout;
-
-			  
-			    plainpoints.Append (newpout);
-			    Point3d pout3d = locpoints.Get(pouti);
-			    locpoints.Append (pout3d);
-
-			    plainzones.Append (0);
-			    pindex.Append (0);
-			    oldnp++;
-			    loclines.Elem(i).I(3-innerp) = oldnp;
-			  }
-			else
-			  plainzones.Elem(loclines.Get(i).I(3-innerp)) = 0;
-			
-
-			//		  (*testout) << "inner - outer correction" << endl;
-		      }
-		    else
-		      {
-			// remove line
-			loclines.DeleteElement(i);
-			lindex.DeleteElement(i);
-			oldnl--;
-			i--;
-		      }			
-		  }
-	      
-		else if (z1 > 0 && z2 > 0 && (z1 != z2) || (z1 < 0) && (z2 < 0) )
-		  {
-		    loclines.DeleteElement(i);
-		    lindex.DeleteElement(i);
-		    oldnl--;
-		    i--;
-		  }
-	      }
-	  
-
-
-
-
-	    legalpoints.SetSize(plainpoints.Size());
-	    for (i = 1; i <= legalpoints.Size(); i++)
-	      legalpoints.Elem(i) = 1;
-
-
-	    for (i = 1; i <= plainpoints.Size(); i++)
-	      {
-		if (plainzones.Elem(i) < 0)
-		  {
-		    plainpoints.Elem(i) = Point2d (1e4, 1e4);
-		    legalpoints.Elem(i) = 0;
-		  }
-		if (pindex.Elem(i) == 0)
-		  legalpoints.Elem(i) = 0;
-
-		if (plainpoints.Elem(i).Y() < 0)
-		  legalpoints.Elem(i) = 0;
-	      }
-	    /*
-	      for (i = 3; i <= plainpoints.Size(); i++)
-	      if (sqr (plainpoints.Get(i).X()) + sqr (plainpoints.Get(i).Y())
-	      > sqr (2 + 0.2 * qualclass))
-	      legalpoints.Elem(i) = 0;
-	    */  
-
-	    /*	  
-		 int clp = 0;
-		 for (i = 1; i <= plainpoints.Size(); i++)
-		 if (legalpoints.Get(i))
-		 clp++;
-		 (*testout) << "legalpts: " << clp << "/" << plainpoints.Size() << endl; 
-
-		 // sort legal/illegal lines
-		 int lastleg = 2;
-		 int firstilleg = oldnl;
-
-		 while (lastleg < firstilleg)
-		 {
-		 while (legalpoints.Get(loclines.Get(lastleg).I1()) &&
-		 legalpoints.Get(loclines.Get(lastleg).I2()) &&
-		 lastleg < firstilleg)
-		 lastleg++;
-		 while ( ( !legalpoints.Get(loclines.Get(firstilleg).I1()) ||
-		 !legalpoints.Get(loclines.Get(firstilleg).I2())) &&
-		 lastleg < firstilleg)
-		 firstilleg--;
-	      
-		 if (lastleg < firstilleg)
-		 {
-		 swap (loclines.Elem(lastleg), loclines.Elem(firstilleg));
-		 swap (lindex.Elem(lastleg), lindex.Elem(firstilleg));
-		 }
-		 }
-
-		 (*testout) << "leglines " << lastleg << "/" << oldnl << endl;
-	    */
-	
-
-	    GetChartBoundary (chartboundpoints, 
-			      chartboundpoints3d,
-			      chartboundlines, h);
-
-	    oldnp = plainpoints.Size();
-
-	    maxlegalpoint = locpoints.Size();
-	    maxlegalline = loclines.Size();
-
-
-
-	    if (mparam.checkchartboundary)
-	      {
-		for (i = 1; i <= chartboundpoints.Size(); i++)
-		  {
-		    plainpoints.Append (chartboundpoints.Get(i));
-		    locpoints.Append (chartboundpoints3d.Get(i));
-		    legalpoints.Append (0);
-		  }
-	      
-
-		for (i = 1; i <= chartboundlines.Size(); i++)
-		  {
-		    INDEX_2 line (chartboundlines.Get(i).I1()+oldnp,
-				  chartboundlines.Get(i).I2()+oldnp);
-		    loclines.Append (line);
-		    //	      (*testout) << "line: " << line.I1() << "-" << line.I2() << endl;
-		  }
-	      }
-
-	    oldnl = loclines.Size();
-	    oldnp = plainpoints.Size();
-	  }
-
-
-	/*
-	  if (qualclass > 100)
-	  {
-	  multithread.drawing = 1;
-	  glrender(1);
-	  cout << "qualclass 100, nfl = " << adfront->GetNFL() << endl;
-	  }
-	*/
-
-	if (found)
-	  {
-	    rulenr = ApplyRules (plainpoints, legalpoints, maxlegalpoint,
-				 loclines, maxlegalline, locelements,
-				 dellines, qualclass);
-	    //	    (*testout) << "Rule Nr = " << rulenr << endl;
-	    if (!rulenr)
-	      {
-		found = 0;
-		if ( debugflag || debugparam.haltnosuccess )
-		  PrintWarning ("no rule found");
-	      }
-	  }
-      
-	for (i = 1; i <= locelements.Size() && found; i++)
-	  {
-	    const Element2d & el = locelements.Get(i);
-
-	    for (j = 1; j <= el.GetNP(); j++)
-	      if (el.PNum(j) <= oldnp && !pindex.Get(el.PNum(j)))
-		{
-		  found = 0;
-		  PrintSysError ("meshing2, index missing");
-		}
-	  }
-
-
-	if (found)
-	  {
-	    locpoints.SetSize (plainpoints.Size());
-	    upgeominfo.SetSize(locpoints.Size());
-
-	    for (i = oldnp+1; i <= plainpoints.Size(); i++)
-	      {
-		int err =
-		  TransformFromPlain (plainpoints.Elem(i), locpoints.Elem(i), 
-				      upgeominfo.Elem(i), h);
-
-		if (err)
-		  {
-		    found = 0;
-
-		    if ( debugflag || debugparam.haltnosuccess )
-		      PrintSysError ("meshing2, Backtransformation failed");
-
-		    break;
-		  }
-	      }
-	  }
-	  
-
-	//      for (i = 1; i <= oldnl; i++)
-	//        adfront -> ResetClass (lindex[i]);
-
-
-	/*
-	  double violateminh;
-	  if (qualclass <= 10)
-	  violateminh = 3;
-	  else
-	  violateminh = 3 * qualclass;
-
-	  if (uselocalh && found) //  && qualclass <= 10)
-	  {
-	  for (i = 1; i <= locelements.Size(); i++)
-	  {
-	  Point3d pmin = locpoints.Get(locelements.Get(i).PNum(1));
-	  Point3d pmax = pmin;
-	  for (j = 2; j <= 3; j++)
-	  {
-	  const Point3d & hp = 
-	  locpoints.Get(locelements.Get(i).PNum(j));
-	  pmin.SetToMin (hp);
-	  pmax.SetToMax (hp);
-	  }
-	  double minh = mesh.GetMinH (pmin, pmax);
-	  if (h > violateminh * minh)
-	  {
-	  found = 0;
-	  loclines.SetSize (oldnl);
-	  locpoints.SetSize (oldnp);
-	  }
-	  }
-	  }
-	*/
-
-
-	if (found) 
-	  {
-	    double violateminh = 3 + 0.1 * sqr (qualclass);
-	    double minh = 1e8;
-	    double newedgemaxh = 0;
-	    for (i = oldnl+1; i <= loclines.Size(); i++)
-	      {
-		double eh = Dist (locpoints.Get(loclines.Get(i).I1()),
-				  locpoints.Get(loclines.Get(i).I2()));
-		if (eh > newedgemaxh)
-		  newedgemaxh = eh;
-	      }
-
-	    for (i = 1; i <= locelements.Size(); i++)
-	      {
-		Point3d pmin = locpoints.Get(locelements.Get(i).PNum(1));
-		Point3d pmax = pmin;
-		for (j = 2; j <= locelements.Get(i).GetNP(); j++)
-		  {
-		    const Point3d & hp = 
-		      locpoints.Get(locelements.Get(i).PNum(j));
-		    pmin.SetToMin (hp);
-		    pmax.SetToMax (hp);
-		  }
-		double eh = mesh.GetMinH (pmin, pmax);
-		if (eh < minh)
-		  minh = eh;
-	      }
-
-	    for (i = 1; i <= locelements.Size(); i++)
-	      for (j = 1; j <= locelements.Get(i).GetNP(); j++)
-		if (Dist2 (locpoints.Get(locelements.Get(i).PNum(j)), pmid) > hinner*hinner)
-		  found = 0;
-
-	    //	  cout << "violate = " << newedgemaxh / minh << endl;
-	    static double maxviolate = 0;
-	    if (newedgemaxh / minh > maxviolate)
-	      {
-		maxviolate = newedgemaxh / minh;
-		//	      cout << "max minhviolate = " << maxviolate << endl;
-	      }
-
-
-	    if (newedgemaxh > violateminh * minh)
-	      {
-		found = 0;
-		loclines.SetSize (oldnl);
-		locpoints.SetSize (oldnp);
-
-		if ( debugflag || debugparam.haltnosuccess )
-		  PrintSysError ("meshing2, maxh too large");
-
-
-	      }
-	  }
-
-
-
-	/*
-	// test good ComputeLineGeoInfo
-	if (found)
-	{
-	// is line on chart ?
-	for (i = oldnl+1; i <= loclines.Size(); i++)
-	{
-	int gisize;
-	void *geominfo;
-
-	if (ComputeLineGeoInfo (locpoints.Get(loclines.Get(i).I1()),
-	locpoints.Get(loclines.Get(i).I2()),
-	gisize, geominfo))
-	found = 0;
-	}
-	}
-	*/
-
-
-	// changed for OCC meshing
-	if (found)
-	  {
-	    // take geominfo from dellines
-	    // upgeominfo.SetSize(locpoints.Size());
-
-	    /*
-	      for (i = 1; i <= dellines.Size(); i++)
-	      for (j = 1; j <= 2; j++)
-	      {
-	      upgeominfo.Elem(loclines.Get(dellines.Get(i)).I(j)) =
-	      adfront -> GetLineGeomInfo (lindex.Get(dellines.Get(i)), j);
-	      }
-	    */
-
-
-	    for (i = 1; i <= locelements.Size(); i++)
-	      for (j = 1; j <= locelements.Get(i).GetNP(); j++)
-		{
-		  int pi = locelements.Get(i).PNum(j);
-		  if (pi <= oldnp)
-		    {
-		    
-		      if (ChooseChartPointGeomInfo (mpgeominfo.Get(pi), upgeominfo.Elem(pi)))
-			{
-			  // cannot select, compute new one
-			  PrintWarning ("calc point geominfo instead of using");
-			  if (ComputePointGeomInfo (locpoints.Get(pi), upgeominfo.Elem(pi)))
-			    {
-			      found = 0;
-			      PrintSysError ("meshing2d, geominfo failed");
-			    }
-			}
-		    }
-		}
-
-	    /*
-	    // use upgeominfo from ProjectFromPlane
-	    for (i = oldnp+1; i <= locpoints.Size(); i++)
-	    {
-	    if (ComputePointGeomInfo (locpoints.Get(i), upgeominfo.Elem(i)))
-	    {
-	    found = 0;
-	    if ( debugflag || debugparam.haltnosuccess )
-	    PrintSysError ("meshing2d, compute geominfo failed");
-	    }
-	    }
-	    */
-	  }
-
-
-	if (found && mparam.checkoverlap)
-	  {
-	    // cout << "checkoverlap" << endl;
-	    // test for overlaps
-	  
-	    Point3d hullmin(1e10, 1e10, 1e10);
-	    Point3d hullmax(-1e10, -1e10, -1e10);
-	  
-	    for (i = 1; i <= locelements.Size(); i++)
-	      for (j = 1; j <= locelements.Get(i).GetNP(); j++)
-		{
-		  const Point3d & p = locpoints.Get(locelements.Get(i).PNum(j));
-		  hullmin.SetToMin (p);
-		  hullmax.SetToMax (p);
-		}
-	    hullmin += Vec3d (-his, -his, -his);
-	    hullmax += Vec3d ( his,  his,  his);
-
-	    surfeltree.GetIntersecting (hullmin, hullmax, intersecttrias);
-
-	    critpoints.SetSize (0);
-	    for (i = oldnp+1; i <= locpoints.Size(); i++)
-	      critpoints.Append (locpoints.Get(i));
-
-	    for (i = 1; i <= locelements.Size(); i++)
-	      {
-		const Element2d & tri = locelements.Get(i);
-		if (tri.GetNP() == 3)
-		  {
-		    const Point3d & tp1 = locpoints.Get(tri.PNum(1));
-		    const Point3d & tp2 = locpoints.Get(tri.PNum(2));
-		    const Point3d & tp3 = locpoints.Get(tri.PNum(3));
-		  
-		    Vec3d tv1 (tp1, tp2);
-		    Vec3d tv2 (tp1, tp3);
-		  
-		    double lam1, lam2;
-		    for (lam1 = 0.2; lam1 <= 0.8; lam1 += 0.2)
-		      for (lam2 = 0.2; lam2 + lam1 <= 0.8; lam2 += 0.2)
-			{
-			  Point3d hp = tp1 + lam1 * tv1 + lam2 * tv2;
-			  critpoints.Append (hp);
-			}
-		  }
-		else if (tri.GetNP() == 4)
-		  {
-		    const Point3d & tp1 = locpoints.Get(tri.PNum(1));
-		    const Point3d & tp2 = locpoints.Get(tri.PNum(2));
-		    const Point3d & tp3 = locpoints.Get(tri.PNum(3));
-		    const Point3d & tp4 = locpoints.Get(tri.PNum(4));
-		  
-		    double l1, l2;
-		    for (l1 = 0.1; l1 <= 0.9; l1 += 0.1)
-		      for (l2 = 0.1; l2 <= 0.9; l2 += 0.1)
-			{
-			  Point3d hp;
-			  hp.X() = 
-			    (1-l1)*(1-l2) * tp1.X() +
-			    l1*(1-l2) * tp2.X() +
-			    l1*l2 * tp3.X() +
-			    (1-l1)*l2 * tp4.X();
-			  hp.Y() = 
-			    (1-l1)*(1-l2) * tp1.Y() +
-			    l1*(1-l2) * tp2.Y() +
-			    l1*l2 * tp3.Y() +
-			    (1-l1)*l2 * tp4.Y();
-			  hp.Z() = 
-			    (1-l1)*(1-l2) * tp1.Z() +
-			    l1*(1-l2) * tp2.Z() +
-			    l1*l2 * tp3.Z() +
-			    (1-l1)*l2 * tp4.Z();
-
-
-			  critpoints.Append (hp);
-			}
-		  }
-	      }
-	    /*
-	      for (i = oldnl+1; i <= loclines.Size(); i++)
-	      {
-	      Point3d hp = locpoints.Get(loclines.Get(i).I1());
-	      Vec3d hv(hp, locpoints.Get(loclines.Get(i).I2()));
-	      int ncp = 2;
-	      for (j = 1; j <= ncp; j++)
-	      critpoints.Append ( hp + (double(j)/(ncp+1)) * hv);
-	      }
-	    */
-
-
-	    /*
-	      for (i = oldnp+1; i <= locpoints.Size(); i++)
-	      {
-	      const Point3d & p = locpoints.Get(i);
-	    */
-
-
-	    for (i = 1; i <= critpoints.Size(); i++)
-	      {
-		const Point3d & p = critpoints.Get(i);
-		 
-
-		/*
-		  for (j = 1; j <= mesh.GetNSE(); j++)
-		  {
-		*/
-		int jj;
-		for (jj = 1; jj <= intersecttrias.Size(); jj++)
-		  {
-		    j = intersecttrias.Get(jj);
-		    const Element2d & el = mesh.SurfaceElement(j);
-		  
-		    int ntrig = (el.GetNP() == 3) ? 1 : 2;
-
-		    int jl;
-		    for (jl = 1; jl <= ntrig; jl++)
-		      {
-			Point3d tp1, tp2, tp3;
-
-			if (jl == 1)
-			  {
-			    tp1 = mesh.Point(el.PNum(1));
-			    tp2 = mesh.Point(el.PNum(2));
-			    tp3 = mesh.Point(el.PNum(3));
-			  }
-			else
-			  {
-			    tp1 = mesh.Point(el.PNum(1));
-			    tp2 = mesh.Point(el.PNum(3));
-			    tp3 = mesh.Point(el.PNum(4));
-			  }
-
-			int onchart = 0;
-			for (k = 1; k <= el.GetNP(); k++)
-			  if (BelongsToActiveChart (mesh.Point(el.PNum(k)),
-						    el.GeomInfoPi(k)))
-			    onchart = 1;
-			if (!onchart)
-			  continue;
-		      
-			Vec3d e1(tp1, tp2);
-			Vec3d e2(tp1, tp3);
-			Vec3d n = Cross (e1, e2);
-			n /= n.Length();
-			double lam1, lam2, lam3;
-			lam3 = n * Vec3d (tp1, p);
-			LocalCoordinates (e1, e2, Vec3d (tp1, p), lam1, lam2);
-		      
-			if (fabs (lam3) < 0.1 * hshould && 
-			    lam1 > 0 && lam2 > 0 && (lam1 + lam2) < 1)
-			  {
-#ifdef DEVELOP
-			    cout << "overlap" << endl;
-			    (*testout) << "overlap:" << endl
-				       << "tri = " << tp1 << "-" << tp2 << "-" << tp3 << endl
-				       << "point = " << p << endl
-				       << "lam1, 2 = " << lam1 << ", " << lam2 << endl
-				       << "lam3 = " << lam3 << endl;
-			  
-			    //		      cout << "overlap !!!" << endl;
-#endif
-			    for (int k = 1; k <= 5; k++)
-			      adfront -> IncrementClass (lindex.Get(1));
-
-			    found = 0;
-			  
-			    if ( debugflag || debugparam.haltnosuccess )
-			      PrintWarning ("overlapping");
-			  
-			  
-			    if (debugparam.haltoverlap)
-			      {
-				debugflag = 1;
-			      }
-			  
-			    /*
-			      multithread.drawing = 1;
-			      glrender(1);
-			    */
-			  }
-		      }
-		  }
-	      }
-	  }
-
-
-	if (found)
-	  {
-	    // check, whether new front line already exists
-
-	    for (i = oldnl+1; i <= loclines.Size(); i++)
-	      {
-		int nlgpi1 = loclines.Get(i).I1();
-		int nlgpi2 = loclines.Get(i).I2();
-		if (nlgpi1 <= pindex.Size() && nlgpi2 <= pindex.Size())
-		  {
-		    nlgpi1 = adfront->GetGlobalIndex (pindex.Get(nlgpi1));
-		    nlgpi2 = adfront->GetGlobalIndex (pindex.Get(nlgpi2));
-
-		    int exval = adfront->ExistsLine (nlgpi1, nlgpi2);
-		    if (exval)
-		      {
-			cout << "ERROR: new line exits, val = " << exval << endl;
-			(*testout) << "ERROR: new line exits, val = " << exval << endl;
-			found = 0;
-
-
-			if (debugparam.haltexistingline)
-			  debugflag = 1;
-
-		      }
-		  }
-	      }
-	  
-	  }
-
-
-	/*
-	  if (found)
-	  {
-	  // check, whether new triangles insert edges twice
-	  for (i = 1; i <= locelements.Size(); i++)
-	  for (j = 1; j <= 3; j++)
-	  {
-	  int tpi1 = locelements.Get(i).PNumMod (j);
-	  int tpi2 = locelements.Get(i).PNumMod (j+1);
-	  if (tpi1 <= pindex.Size() && tpi2 <= pindex.Size())
-	  {
-	  tpi1 = adfront->GetGlobalIndex (pindex.Get(tpi1));
-	  tpi2 = adfront->GetGlobalIndex (pindex.Get(tpi2));
-
-	  if (doubleedge.Used (INDEX_2(tpi1, tpi2)))
-	  {
-	  if (debugparam.haltexistingline)
-	  debugflag = 1;
-	  cerr << "ERROR Insert edge "
-	  << tpi1 << " - " << tpi2 << " twice !!!" << endl;
-	  found = 0;
-	  }
-	  doubleedge.Set (INDEX_2(tpi1, tpi2), 1);
-	  }
-	  }
-	  }
-	*/
-
-
-	if (found)
-	  {
-	    // everything is ok, perform mesh update
-
-	    ruleused.Elem(rulenr)++;
-
-
-	    pindex.SetSize(locpoints.Size());
-	      
-	    for (i = oldnp+1; i <= locpoints.Size(); i++)
-	      {
-		globind = mesh.AddPoint (locpoints.Get(i));
-		pindex.Elem(i) = adfront -> AddPoint (locpoints.Get(i), globind);
-	      }
-	      
-	    for (i = oldnl+1; i <= loclines.Size(); i++)
-	      {
-		/*
-		  for (j = 1; j <= locpoints.Size(); j++)
-		  {
-		  (*testout) << j << ": " << locpoints.Get(j) << endl;
-		  }
-		*/
-	      
-		/*
-		  ComputeLineGeoInfo (locpoints.Get(loclines.Get(i).I1()),
-		  locpoints.Get(loclines.Get(i).I2()),
-		  gisize, geominfo);
-		*/		  
-
-		if (pindex.Get(loclines.Get(i).I1()) == 0 || 
-		    pindex.Get(loclines.Get(i).I2()) == 0)
-		  {
-		    (*testout) << "pindex is 0" << endl;
-		  }
-
-		if (!upgeominfo.Get(loclines.Get(i).I1()).trignum || 
-		    !upgeominfo.Get(loclines.Get(i).I2()).trignum)
-		  {
-		    cout << "new el: illegal geominfo" << endl;
-		  }
-
-		adfront -> AddLine (pindex.Get(loclines.Get(i).I1()),
-				    pindex.Get(loclines.Get(i).I2()),
-				    upgeominfo.Get(loclines.Get(i).I1()),
-				    upgeominfo.Get(loclines.Get(i).I2()));
-	      }
-	    for (i = 1; i <= locelements.Size(); i++)
-	      {
-		Element2d mtri(locelements.Get(i).GetNP());
-		mtri = locelements.Get(i);
-		mtri.SetIndex (facenr);
-
-
-		// compute triangle geominfo:
-		//	      (*testout) << "triggeominfo: ";
-		for (j = 1; j <= locelements.Get(i).GetNP(); j++)
-		  {
-		    mtri.GeomInfoPi(j) = upgeominfo.Get(locelements.Get(i).PNum(j));
-		    //		  (*testout) << mtri.GeomInfoPi(j).trignum << " ";
-		  }
-		//	      (*testout) << endl;
-
-		for (j = 1; j <= locelements.Get(i).GetNP(); j++)
-		  {
-		    mtri.PNum(j) = 
-		      locelements.Elem(i).PNum(j) =
-		      adfront -> GetGlobalIndex (pindex.Get(locelements.Get(i).PNum(j)));
-		  }
-	      
-		
-	      
-	      
-		mesh.AddSurfaceElement (mtri);
-		cntelem++;
-		//	      cout << "elements: " << cntelem << endl;
-
-
-	      
-
-		const Point3d & sep1 = mesh.Point (mtri.PNum(1));
-		const Point3d & sep2 = mesh.Point (mtri.PNum(2));
-		const Point3d & sep3 = mesh.Point (mtri.PNum(3));
-
-		Point3d sepmin(sep1), sepmax(sep1);
-		for (j = 2; j <= mtri.GetNP(); j++)
-		  {
-		    sepmin.SetToMin (mesh.Point (mtri.PNum(j)));
-		    sepmax.SetToMax (mesh.Point (mtri.PNum(j)));
-		  }
-
-		surfeltree.Insert (sepmin, sepmax, mesh.GetNSE());
-
-
-		double trigarea = Cross (Vec3d (sep1, sep2), 
-					 Vec3d (sep1, sep3)).Length() / 2;
-
-		if (mtri.GetNP() == 4)
-		  {
-		    const Point3d & sep4 = mesh.Point (mtri.PNum(4));
-		    trigarea += Cross (Vec3d (sep1, sep3), 
-				       Vec3d (sep1, sep4)).Length() / 2;
-		  }
-
-		meshedarea += trigarea;
-
-	      
-
-
-		for (j = 1; j <= locelements.Get(i).GetNP(); j++)
-		  {
-		    int gpi = locelements.Get(i).PNum(j);
-
-		    int oldts = trigsonnode.Size();
-		    if (gpi >= oldts+PointIndex::BASE)
-		      {
-			trigsonnode.SetSize (gpi+1-PointIndex::BASE);
-			illegalpoint.SetSize (gpi+1-PointIndex::BASE);
-			for (k = oldts+PointIndex::BASE; 
-			     k <= gpi; k++)
-			  {
-			    trigsonnode[k] = 0;
-			    illegalpoint[k] = 0;
-			  }
-		      }
-
-		    trigsonnode[gpi]++;
-		  
-		    if (trigsonnode[gpi] > 20)
-		      {
-			illegalpoint[gpi] = 1;
-			//		      cout << "illegal point: " << gpi << endl;
-			(*testout) << "illegal point: " << gpi << endl;
-		      }
-
-		    static int mtonnode = 0;
-		    if (trigsonnode[gpi] > mtonnode)
-		      mtonnode = trigsonnode[gpi];
-		  }
-		//	      cout << "els = " << cntelem << " trials = " << trials << endl;
-		//	      if (trials > 100)		return;
-	      }
-	      
-	    for (i = 1; i <= dellines.Size(); i++)
-	      adfront -> DeleteLine (lindex.Get(dellines.Get(i)));
-	      
-	    //	  rname = rules.Get(rulenr)->Name();
-#ifdef MYGRAPH
-	    if (silentflag<3) 
-	      {
-		plotsurf.DrawPnL(locpoints, loclines);
-		plotsurf.Plot(testmode, testmode);
-	      }
-#endif
-
-	    if (morerisc)
-	      {
-		cout << "generated due to morerisc" << endl;
-		//	      multithread.drawing = 1;
-		//	      glrender(1);
-	      }
-
-
-
-	  
-	    if ( debugparam.haltsuccess || debugflag )
-	      {
-		cout << "success of rule" << rules.Get(rulenr)->Name() << endl;
-		multithread.drawing = 1;
-		multithread.testmode = 1;
-		multithread.pause = 1;
-
-
-		/*
-		  extern STLGeometry * stlgeometry;
-		  stlgeometry->ClearMarkedSegs();
-		  for (i = 1; i <= loclines.Size(); i++)
-		  {
-		  stlgeometry->AddMarkedSeg(locpoints.Get(loclines.Get(i).I1()),
-		  locpoints.Get(loclines.Get(i).I2()));
-		  }
-		*/
-
-		(*testout) << "success of rule" << rules.Get(rulenr)->Name() << endl;
-		(*testout) << "trials = " << trials << endl;
-
-		(*testout) << "old number of lines = " << oldnl << endl;
-		for (i = 1; i <= loclines.Size(); i++)
-		  {
-		    (*testout) << "line ";
-		    for (j = 1; j <= 2; j++)
-		      {
-			int hi = 0;
-			if (loclines.Get(i).I(j) >= 1 &&
-			    loclines.Get(i).I(j) <= pindex.Size())
-			  hi = adfront->GetGlobalIndex (pindex.Get(loclines.Get(i).I(j)));
-
-			(*testout) << hi << " ";
-		      }
-		    (*testout) << " : " 
-			       << plainpoints.Get(loclines.Get(i).I1()) << " - "
-			       << plainpoints.Get(loclines.Get(i).I2()) << " 3d: "
-			       << locpoints.Get(loclines.Get(i).I1()) << " - "
-			       << locpoints.Get(loclines.Get(i).I2()) 
-			       << endl;
-		  }
-
-
-
-		glrender(1);
-	      }
-	  }
-	else
-	  {
-	    adfront -> IncrementClass (lindex.Get(1));
-
-	    if ( debugparam.haltnosuccess || debugflag )
-	      {
-		cout << "Problem with seg " << gpi1 << " - " << gpi2
-		     << ", class = " << qualclass << endl;
-
-		(*testout) << "Problem with seg " << gpi1 << " - " << gpi2
-			   << ", class = " << qualclass << endl;
-
-		multithread.drawing = 1;
-		multithread.testmode = 1;
-		multithread.pause = 1;
-
-
-		/*
-		  extern STLGeometry * stlgeometry;
-		  stlgeometry->ClearMarkedSegs();
-		  for (i = 1; i <= loclines.Size(); i++)
-		  {
-		  stlgeometry->AddMarkedSeg(locpoints.Get(loclines.Get(i).I1()),
-		  locpoints.Get(loclines.Get(i).I2()));
-		  }
-		*/
-
-		for (i = 1; i <= loclines.Size(); i++)
-		  {
-		    (*testout) << "line ";
-		    for (j = 1; j <= 2; j++)
-		      {
-			int hi = 0;
-			if (loclines.Get(i).I(j) >= 1 &&
-			    loclines.Get(i).I(j) <= pindex.Size())
-			  hi = adfront->GetGlobalIndex (pindex.Get(loclines.Get(i).I(j)));
-
-			(*testout) << hi << " ";
-		      }
-		    (*testout) << " : " 
-			       << plainpoints.Get(loclines.Get(i).I1()) << " - "
-			       << plainpoints.Get(loclines.Get(i).I2()) << " 3d: "
-			       << locpoints.Get(loclines.Get(i).I1()) << " - "
-			       << locpoints.Get(loclines.Get(i).I2()) 
-			       << endl;
-		  }
-
-
-		/*
-		  cout << "p1gi = " << blgeominfo[0].trignum 
-		  << ", p2gi = " << blgeominfo[1].trignum << endl;
-		*/
-
-		glrender(1);
-	      }
-
-	  
-#ifdef MYGRAPH      
-	    if (silentflag<3)
-	      {
-		if (testmode || trials%2 == 0)
-		  {
-		    plotsurf.DrawPnL(locpoints, loclines);
-		    plotsurf.Plot(testmode, testmode);
-		  }
-	      }
-#endif
-	  }
-
-      }
-
-    PrintMessage (3, "Surface meshing done");
-
-    adfront->PrintOpenSegments (*testout);
-
-    multithread.task = savetask;
-
-
-    //  cout << "surfeltree.depth = " << surfeltree.Tree().Depth() << endl;
-    EndMesh ();
-
-    if (!adfront->Empty())
-      return MESHING2_GIVEUP;
-    
-    return MESHING2_OK;
-  }
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-#ifdef OPENGL
-
-/* *********************** Draw Surface Meshing **************** */
-
-
-#include <visual.hpp>
-#include <stlgeom.hpp>
-
-namespace netgen 
-{
-
-  extern STLGeometry * stlgeometry;
-  extern Mesh * mesh;
-  VisualSceneSurfaceMeshing vssurfacemeshing;
-
-
-
-  void glrender (int wait)
-  {
-    //  cout << "plot adfront" << endl;
-
-    if (multithread.drawing)
-      {
-	//      vssurfacemeshing.Render();
-	Render ();
-      
-	if (wait || multithread.testmode)
-	  {
-	    multithread.pause = 1;
-	  }
-	while (multithread.pause);
-      }
-  }
-
-
-
-  VisualSceneSurfaceMeshing :: VisualSceneSurfaceMeshing ()
-    : VisualScene()
-  {
-    ;
-  }
-
-  VisualSceneSurfaceMeshing :: ~VisualSceneSurfaceMeshing ()
-  {
-    ;
-  }
-
-  void VisualSceneSurfaceMeshing :: DrawScene ()
-  {
-    int i, j, k;
-
-    if (loclines.Size() != changeval)
-      {
-	center = Point<3>(0,0,-5);
-	rad = 0.1;
-  
-	CalcTransformationMatrices();
-	changeval = loclines.Size();
-      }
-
-  glClearColor(backcolor, backcolor, backcolor, 1.0);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  SetLight();
-
-  //  glEnable (GL_COLOR_MATERIAL);
-
-  //  glDisable (GL_SHADING);
-  //  glColor3f (0.0f, 1.0f, 1.0f);
-  //  glLineWidth (1.0f);
-  //  glShadeModel (GL_SMOOTH);
-
-  //  glCallList (linelists.Get(1));
-
-  //  SetLight();
-
-  glPushMatrix();
-  glMultMatrixf (transformationmat);
-
-  glShadeModel (GL_SMOOTH);
-  glDisable (GL_COLOR_MATERIAL);
-  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-
-  glEnable (GL_BLEND);
-  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-  //  glEnable (GL_LIGHTING);
-
-  double shine = vispar.shininess;
-  double transp = vispar.transp;
-
-  glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shine);
-  glLogicOp (GL_COPY);
-
-
-
-  /*
-
-  float mat_col[] = { 0.2, 0.2, 0.8, 1 };
-  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-
-  glPolygonOffset (1, 1);
-  glEnable (GL_POLYGON_OFFSET_FILL);
-
-    float mat_colbl[] = { 0.8, 0.2, 0.2, 1 };
-    float mat_cololdl[] = { 0.2, 0.8, 0.2, 1 };
-    float mat_colnewl[] = { 0.8, 0.8, 0.2, 1 };
-
-
-    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-    glPolygonOffset (1, -1);
-    glLineWidth (3);
-
-    for (i = 1; i <= loclines.Size(); i++)
-      {
-	if (i == 1)
-	  {
-	    glEnable (GL_POLYGON_OFFSET_FILL);
-	    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colbl);
-	  }
-	else if (i <= oldnl) 
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_cololdl);
-	else 
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colnewl);
-
-	int pi1 = loclines.Get(i).I1();
-	int pi2 = loclines.Get(i).I2();
-
-	if (pi1 >= 1 && pi2 >= 1)
-	  {
-	    Point3d p1 = locpoints.Get(pi1);
-	    Point3d p2 = locpoints.Get(pi2);
-	  
-	    glBegin (GL_LINES);
-	    glVertex3f (p1.X(), p1.Y(), p1.Z());
-	    glVertex3f (p2.X(), p2.Y(), p2.Z());
-	    glEnd();
-	  }
-
-	glDisable (GL_POLYGON_OFFSET_FILL);
-      }
-  
-
-    glLineWidth (1);
-
-
-    glPointSize (5);
-    float mat_colp[] = { 1, 0, 0, 1 };
-    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colp);
-    glBegin (GL_POINTS);
-    for (i = 1; i <= locpoints.Size(); i++)
-      {
-	Point3d p = locpoints.Get(i);
-	glVertex3f (p.X(), p.Y(), p.Z());
-      }
-    glEnd();
-
-
-    glPopMatrix();
-  */
-
-    float mat_colp[] = { 1, 0, 0, 1 };
-
-    float mat_col2d1[] = { 1, 0.5, 0.5, 1 };
-    float mat_col2d[] = { 1, 1, 1, 1 };
-    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col2d);
-  
-    double scalex = 0.1, scaley = 0.1;
-
-    glBegin (GL_LINES);
-    for (i = 1; i <= loclines.Size(); i++)
-      {
-	glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col2d);
-	if (i == 1)
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col2d1);
-
-	int pi1 = loclines.Get(i).I1();
-	int pi2 = loclines.Get(i).I2();
-
-	if (pi1 >= 1 && pi2 >= 1)
-	  {
-	    Point2d p1 = plainpoints.Get(pi1);
-	    Point2d p2 = plainpoints.Get(pi2);
-	  
-	    glBegin (GL_LINES);
-	    glVertex3f (scalex * p1.X(), scaley * p1.Y(), -5);
-	    glVertex3f (scalex * p2.X(), scaley * p2.Y(), -5);
-	    glEnd();
-	  }
-      }
-    glEnd ();
-
-
-    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colp);
-    glBegin (GL_POINTS);
-    for (i = 1; i <= plainpoints.Size(); i++)
-      {
-	Point2d p = plainpoints.Get(i);
-	glVertex3f (scalex * p.X(), scaley * p.Y(), -5);
-      }
-    glEnd();
-
-
-
-
-
-
-  glDisable (GL_POLYGON_OFFSET_FILL);
- 
-  glPopMatrix();
-  DrawCoordinateCross ();
-  DrawNetgenLogo ();
-  glFinish();  
-
-  /*
-    glDisable (GL_POLYGON_OFFSET_FILL);
-
-    //  cout << "draw surfacemeshing" << endl;
-    //
-    //  if (changeval != stlgeometry->GetNT())
-    //      BuildScene();
-    //      changeval = stlgeometry->GetNT();
-    
-
-    glClearColor(backcolor, backcolor, backcolor, 1.0);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-    SetLight();
-
-    glPushMatrix();
-    glLoadMatrixf (transmat);
-    glMultMatrixf (rotmat);
-
-    glShadeModel (GL_SMOOTH);
-    glDisable (GL_COLOR_MATERIAL);
-    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-
-    glEnable (GL_BLEND);
-    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-    float mat_spec_col[] = { 1, 1, 1, 1 };
-    glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, mat_spec_col);
-
-    double shine = vispar.shininess;
-    double transp = vispar.transp;
-
-    glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shine);
-    glLogicOp (GL_COPY);
-
-
-    float mat_col[] = { 0.2, 0.2, 0.8, transp };
-    float mat_colrt[] = { 0.2, 0.8, 0.8, transp };
-    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-
-    glPolygonOffset (1, 1);
-    glEnable (GL_POLYGON_OFFSET_FILL);
-
-    glColor3f (1.0f, 1.0f, 1.0f);
-
-    glEnable (GL_NORMALIZE);
-    
-    //  glBegin (GL_TRIANGLES);
-    //      for (j = 1; j <= stlgeometry -> GetNT(); j++)
-    //      {
-    //      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-    //      if (j == geomtrig)
-    //      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colrt);
-	
-
-    //      const STLReadTriangle & tria = stlgeometry -> GetReadTriangle(j);
-    //      glNormal3f (tria.normal.X(),
-    //      tria.normal.Y(),
-    //      tria.normal.Z());
-		  
-    //      for (k = 0; k < 3; k++)
-    //      {
-    //      glVertex3f (tria.pts[k].X(),
-    //      tria.pts[k].Y(),
-    //      tria.pts[k].Z());
-    //      }
-    //      }    
-    //      glEnd ();
-    
-
-
-    glDisable (GL_POLYGON_OFFSET_FILL);
-
-    float mat_colbl[] = { 0.8, 0.2, 0.2, 1 };
-    float mat_cololdl[] = { 0.2, 0.8, 0.2, 1 };
-    float mat_colnewl[] = { 0.8, 0.8, 0.2, 1 };
-
-
-    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-    glPolygonOffset (1, -1);
-    glLineWidth (3);
-
-    for (i = 1; i <= loclines.Size(); i++)
-      {
-	if (i == 1)
-	  {
-	    glEnable (GL_POLYGON_OFFSET_FILL);
-	    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colbl);
-	  }
-	else if (i <= oldnl) 
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_cololdl);
-	else 
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colnewl);
-
-	int pi1 = loclines.Get(i).I1();
-	int pi2 = loclines.Get(i).I2();
-
-	if (pi1 >= 1 && pi2 >= 1)
-	  {
-	    Point3d p1 = locpoints.Get(pi1);
-	    Point3d p2 = locpoints.Get(pi2);
-	  
-	    glBegin (GL_LINES);
-	    glVertex3f (p1.X(), p1.Y(), p1.Z());
-	    glVertex3f (p2.X(), p2.Y(), p2.Z());
-	    glEnd();
-	  }
-
-	glDisable (GL_POLYGON_OFFSET_FILL);
-      }
-
-
-    glLineWidth (1);
-
-
-    glPointSize (5);
-    float mat_colp[] = { 1, 0, 0, 1 };
-    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colp);
-    glBegin (GL_POINTS);
-    for (i = 1; i <= locpoints.Size(); i++)
-      {
-	Point3d p = locpoints.Get(i);
-	glVertex3f (p.X(), p.Y(), p.Z());
-      }
-    glEnd();
-
-
-    glPopMatrix();
-
-
-    float mat_col2d1[] = { 1, 0.5, 0.5, 1 };
-    float mat_col2d[] = { 1, 1, 1, 1 };
-    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col2d);
-  
-    double scalex = 0.1, scaley = 0.1;
-
-    glBegin (GL_LINES);
-    for (i = 1; i <= loclines.Size(); i++)
-      {
-	glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col2d);
-	if (i == 1)
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col2d1);
-
-	int pi1 = loclines.Get(i).I1();
-	int pi2 = loclines.Get(i).I2();
-
-	if (pi1 >= 1 && pi2 >= 1)
-	  {
-	    Point2d p1 = plainpoints.Get(pi1);
-	    Point2d p2 = plainpoints.Get(pi2);
-	  
-	    glBegin (GL_LINES);
-	    glVertex3f (scalex * p1.X(), scaley * p1.Y(), -5);
-	    glVertex3f (scalex * p2.X(), scaley * p2.Y(), -5);
-	    glEnd();
-	  }
-      }
-    glEnd ();
-
-
-    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colp);
-    glBegin (GL_POINTS);
-    for (i = 1; i <= plainpoints.Size(); i++)
-      {
-	Point2d p = plainpoints.Get(i);
-	glVertex3f (scalex * p.X(), scaley * p.Y(), -5);
-      }
-    glEnd();
-
-    glFinish();  
-*/
-  }
-
-
-  void VisualSceneSurfaceMeshing :: BuildScene (int zoomall)
-  {
-    int i, j, k;
-    /*
-      center = stlgeometry -> GetBoundingBox().Center();
-      rad = stlgeometry -> GetBoundingBox().Diam() / 2;
-
-      CalcTransformationMatrices();
-    */
-  }
-
-}
-
-
-#else
-namespace netgen
-{
-  void glrender (int wait)
-  { ; }
-}
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/meshing2.hpp b/contrib/Netgen/libsrc/meshing/meshing2.hpp
deleted file mode 100644
index a68a095d5e3398de684f29ea4774f281a5261bf8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing2.hpp
+++ /dev/null
@@ -1,149 +0,0 @@
-#ifndef FILE_MESHING2
-#define FILE_MESHING2
-
-/**************************************************************************/
-/* File:   meshing2.hpp                                                   */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Okt. 95                                                    */
-/**************************************************************************/
-
-
-
-enum MESHING2_RESULT
-{
-  MESHING2_OK = 0,
-  MESHING2_GIVEUP = 1
-};
-
-
-/*
-   
-The basis class for 2D mesh generation. 
-Has the method GenerateMesh
-
-For surface mesh generation, or non-Euklidean meshing,
-derive from Meshing2, and replace transformation.
-
-*/
-
-class Meshing2
-{
-  /// the current advancing front
-  AdFront2 * adfront;
-  /// rules for mesh generation
-  ARRAY<netrule*> rules;
-  /// statistics
-  ARRAY<int> ruleused, canuse, foundmap;
-  /// 
-  Box3d boundingbox;
-  ///
-  double starttime;
-public:
-  ///
-  Meshing2 (const Box3d & aboundingbox);
-
-  ///
-  virtual ~Meshing2 ();
-
-  /// Load rules, either from file, or compiled rules
-  void LoadRules (const char * filename);
-
-  /// 
-  MESHING2_RESULT GenerateMesh (Mesh & mesh, double gh, int facenr);
-
-  ///
-  void AddPoint (const Point3d & p, PointIndex globind, MultiPointGeomInfo * mgi = NULL);
-
-  ///
-  void AddBoundaryElement (INDEX i1, INDEX i2,
-			   const PointGeomInfo & gi1, const PointGeomInfo & gi2);
-  
-  ///
-  void SetStartTime (double astarttime);
-
-protected:
-  ///
-  virtual void StartMesh ();
-  ///
-  virtual void EndMesh ();
-  ///
-  virtual double CalcLocalH (const Point3d & p, double gh) const;
-
-  ///
-  virtual void DefineTransformation (Point3d & p1, Point3d & p2,
-				     const PointGeomInfo * geominfo1,
-				     const PointGeomInfo * geominfo2);
-  ///
-  virtual void TransformToPlain (const Point3d & locpoint, const MultiPointGeomInfo &  geominfo,
-				 Point2d & plainpoint, double h, int & zone);
-  /// return 0 .. ok
-  /// return >0 .. cannot transform point to true surface
-  virtual int TransformFromPlain (Point2d & plainpoint,
-				  Point3d & locpoint, 
-				  PointGeomInfo & geominfo, 
-				  double h);
-  
-  /// projects to surface
-  /// return 0 .. ok
-  virtual int BelongsToActiveChart (const Point3d & p, 
-				    const PointGeomInfo & gi);
-
-  /// computes geoinfo data for line with respect to
-  /// selected chart
-  virtual int ComputePointGeomInfo (const Point3d & p, 
-				    PointGeomInfo & gi);
-
-  /// Tries to select unique geominfo on active chart
-  /// return 0: success
-  /// return 1: failed
-  virtual int ChooseChartPointGeomInfo (const MultiPointGeomInfo & mpgi, 
-					PointGeomInfo & pgi);
-
-
-
-  /*
-    tests, whether endpoint (= 1 or 2) of line segment p1-p2
-    is inside of the selected chart. The endpoint must be on the
-    chart
-   */
-  virtual int IsLineVertexOnChart (const Point3d & p1, const Point3d & p2,
-				   int endpoint, const PointGeomInfo & geominfo);
-
-  /*
-    get (projected) boundary of current chart
-   */
-  virtual void GetChartBoundary (ARRAY<Point2d> & points, 
-				 ARRAY<Point3d> & points3d,
-				 ARRAY<INDEX_2> & lines, double p) const;
-
-  virtual double Area () const;
-
-
-/** Applies 2D rules.
- Tests all 2D rules */
-  int ApplyRules (ARRAY<Point2d> & lpoints, 
-		  ARRAY<int> & legalpoints,
-		  int maxlegalpoint,
-		  ARRAY<INDEX_2> & llines,
-		  int maxlegelline,
-		  ARRAY<Element2d> & elements, ARRAY<INDEX> & dellines,
-		  int tolerance);
-  
-
-};
-
-
-
-
-
-
-
-
-#endif
-
-
-
-
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/meshing3.cpp b/contrib/Netgen/libsrc/meshing/meshing3.cpp
deleted file mode 100644
index c349b85e79d9b52f4c9a906c66da430bcb86534b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing3.cpp
+++ /dev/null
@@ -1,1260 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-double minother;
-double minwithoutother;
-
-
-
-
-
-MeshingStat3d :: MeshingStat3d ()
-{
-  cntsucc = cnttrials = cntelem = qualclass = 0;
-  vol0 = h = 1;
-  problemindex = 1;
-}  
-  
-
-Meshing3 :: Meshing3 (const string & rulefilename) 
-{
-  tolfak = 1;
-
-  LoadRules (rulefilename.c_str(), NULL);
-  adfront = new AdFront3;
-
-  problems.SetSize (rules.Size());
-  foundmap.SetSize (rules.Size());
-  canuse.SetSize (rules.Size());
-  ruleused.SetSize (rules.Size());
-
-  for (int i = 1; i <= rules.Size(); i++)
-    {
-      problems.Elem(i) = new char[255];
-      foundmap.Elem(i) = 0;
-      canuse.Elem(i) = 0;
-      ruleused.Elem(i) = 0;
-    }
-}
-
-
-Meshing3 :: Meshing3 (const char ** rulep)
-{
-  tolfak = 1;
-
-  LoadRules (NULL, rulep);
-  adfront = new AdFront3;
-
-  problems.SetSize (rules.Size());
-  foundmap.SetSize (rules.Size());
-  canuse.SetSize (rules.Size());
-  ruleused.SetSize (rules.Size());
-
-  for (int i = 0; i < rules.Size(); i++)
-    {
-      problems[i] = new char[255];
-      foundmap[i] = 0;
-      canuse[i]   = 0;
-      ruleused[i] = 0;
-    }
-}
-
-Meshing3 :: ~Meshing3 ()
-{
-  delete adfront;
-  for (int i = 0; i < rules.Size(); i++)
-    {
-      delete [] problems[i];
-      delete rules[i];
-    }
-}
-
-
-
-static double CalcLocH (const ARRAY<Point3d> & locpoints,
-			const ARRAY<Element2d> & locfaces,
-			double h)
-{
-  return h;
-
-  // was war das ????
-  
-  int i, j;
-  double hi, h1, d, dn, sum, weight, wi;
-  Point3d p0, pc;
-  Vec3d n, v1, v2;
-
-  p0.X() = p0.Y() = p0.Z() = 0;
-  for (j = 1; j <= 3; j++)
-    {
-      p0.X() += locpoints.Get(locfaces.Get(1).PNum(j)).X();
-      p0.Y() += locpoints.Get(locfaces.Get(1).PNum(j)).Y();
-      p0.Z() += locpoints.Get(locfaces.Get(1).PNum(j)).Z();
-    }
-  p0.X() /= 3; p0.Y() /= 3; p0.Z() /= 3;
-  
-  v1 = locpoints.Get(locfaces.Get(1).PNum(2)) -
-    locpoints.Get(locfaces.Get(1).PNum(1));
-  v2 = locpoints.Get(locfaces.Get(1).PNum(3)) -
-    locpoints.Get(locfaces.Get(1).PNum(1));
-
-  h1 = v1.Length();
-  n = Cross (v2, v1);
-  n /= n.Length();
-
-  sum = 0;
-  weight = 0;
-
-  for (i = 1; i <= locfaces.Size(); i++)
-    {
-      pc.X() = pc.Y() = pc.Z() = 0;
-      for (j = 1; j <= 3; j++)
-	{
-	  pc.X() += locpoints.Get(locfaces.Get(i).PNum(j)).X();
-	  pc.Y() += locpoints.Get(locfaces.Get(i).PNum(j)).Y();
-	  pc.Z() += locpoints.Get(locfaces.Get(i).PNum(j)).Z();
-	}
-      pc.X() /= 3; pc.Y() /= 3; pc.Z() /= 3;
-
-      d = Dist (p0, pc);
-      dn = n * (pc - p0);
-      hi = Dist (locpoints.Get(locfaces.Get(i).PNum(1)),
-		 locpoints.Get(locfaces.Get(i).PNum(2)));
-		 
-      if (dn > -0.2 * h1)
-	{
-	  wi = 1 / (h1 + d);
-	  wi *= wi;
-	}
-      else
-	wi = 0;
-
-      sum += hi * wi;
-      weight += wi;
-    }
-
-  return sum/weight;
-}
-
-
-PointIndex Meshing3 :: AddPoint (const Point3d & p, PointIndex globind)
-{
-  return adfront -> AddPoint (p, globind);  
-}  
-
-void Meshing3 :: AddBoundaryElement (const Element2d & elem)
-{
-  adfront -> AddFace(elem);
-}  
-
-int Meshing3 :: AddConnectedPair (const INDEX_2 & apair)
-{
-  return adfront -> AddConnectedPair (apair);
-}
-
-MESHING3_RESULT Meshing3 :: 
-GenerateMesh (Mesh & mesh, const MeshingParameters & mp)
-{
-  ARRAY<Point3d> locpoints;      // local points
-  ARRAY<Element2d> locfaces;     // local faces
-  ARRAY<PointIndex> pindex;      // mapping from local to front point numbering
-  ARRAY<int> allowpoint;         // point is allowd ?
-  ARRAY<INDEX> findex;           // mapping from local to front face numbering
-  INDEX_2_HASHTABLE<int> connectedpairs(100);  // connecgted pairs for prism meshing
-
-  ARRAY<Point3d> plainpoints;       // points in reference coordinates
-  ARRAY<int> delpoints, delfaces;   // points and lines to be deleted
-  ARRAY<Element> locelements;       // new generated elements
-
-  int i, j, oldnp, oldnf;
-  int found;
-  referencetransform trans;
-  int rotind;
-  INDEX globind;
-  Point3d inp;
-  float err;
-
-  INDEX locfacesplit;             //index for faces in outer area
-  
-  int loktestmode = 0;
-
-  int uselocalh = mparam.uselocalh;
-
-  int giveuptol = mp.giveuptol; // 
-  MeshingStat3d stat;      // statistics
-  int plotstat_oldne = -1;
-
-  
-  // for star-shaped domain meshing
-  ARRAY<MeshPoint> grouppoints;      
-  ARRAY<Element2d> groupfaces;
-  ARRAY<PointIndex> grouppindex;
-  ARRAY<INDEX> groupfindex;
-  
-  
-  float minerr;
-  int hasfound;
-  double tetvol;
-  int giveup = 0;
-
-  
-  ARRAY<Point3d> tempnewpoints;
-  ARRAY<Element2d> tempnewfaces;
-  ARRAY<int> tempdelfaces;
-  ARRAY<Element> templocelements;
-
-
-  stat.h = mp.maxh;
-
-  adfront->SetStartFront (mp.baseelnp);
-
-
-  found = 0;
-  stat.vol0 = adfront -> Volume();
-  tetvol = 0;
-
-  stat.qualclass = 1;
-
-  while (1)
-    {
-      if (multithread.terminate)
-	throw NgException ("Meshing stopped");
-
-      if (giveup)
-	break;
-
-      // break if advancing front is empty
-      if (!mp.baseelnp && adfront->Empty())
-	break;
-
-      // break, if advancing front has no elements with
-      // mp.baseelnp nodes  
-      if (mp.baseelnp && adfront->Empty (mp.baseelnp))
-	break;
-
-
-      locpoints.SetSize(0);
-      locfaces.SetSize(0);
-      locelements.SetSize(0);
-      pindex.SetSize(0);
-      findex.SetSize(0);
-
-      INDEX_2_HASHTABLE<int> connectedpairs(100);  // connected pairs for prism meshing
-      
-      // select base-element (will be locface[1])
-      // and get local environment of radius (safety * h)
-
-
-      int baseelem = adfront -> SelectBaseElement ();
-      if (mp.baseelnp && adfront->GetFace (baseelem).GetNP() != mp.baseelnp)
-	{
-	  adfront->IncrementClass (baseelem);	  
-	  continue;
-	}
-
-      const Element2d & bel = adfront->GetFace (baseelem);
-      const Point3d & p1 = adfront->GetPoint (bel.PNum(1));
-      const Point3d & p2 = adfront->GetPoint (bel.PNum(2));
-      const Point3d & p3 = adfront->GetPoint (bel.PNum(3));
-
-      (*testout) << endl << "base = " << bel << endl;
-
-
-      Point3d pmid = Center (p1, p2, p3);
-
-      double his = (Dist (p1, p2) + Dist(p1, p3) + Dist(p2, p3)) / 3;
-      double hshould;
-
-      hshould = mesh.GetH (pmid);
-
-      if (adfront->GetFace (baseelem).GetNP() == 4)
-	hshould = max2 (his, hshould);
-
-      double hmax = (his > hshould) ? his : hshould;
-      
-      // qualclass should come from baseelem !!!!!
-      double hinner = hmax * (1 + stat.qualclass);
-      double houter = hmax * (1 + 2 * stat.qualclass);
-      
-      stat.qualclass =
-        adfront -> GetLocals (baseelem, locpoints, locfaces, 
-			      pindex, findex, connectedpairs,
-			      houter, hinner,
-			      locfacesplit);
-
-
-      int pi1 = pindex.Get(locfaces[0].PNum(1));
-      int pi2 = pindex.Get(locfaces[0].PNum(2));
-      int pi3 = pindex.Get(locfaces[0].PNum(3));
-
-      /*      
-      (*testout) << "baseel = " << baseelem << ", ind = " << findex.Get(1) << endl;
-      (*testout) << "pi = " << pi1 << ", " << pi2 << ", " << pi3 << endl;
-      */
-
-      loktestmode = 0;
-      //      testmode = loktestmode;
-      // loktestmode = testmode =  (adfront->GetFace (baseelem).GetNP() == 4) && (rules.Size() == 5);
-
-      if (testmode)
-	{
-	  (*testout) << "baseelem = " << baseelem << " qualclass = " << stat.qualclass << endl;
-	  (*testout) << "locpoints = " << endl << locpoints << endl;
-	  (*testout) << "connected = " << endl << connectedpairs << endl;
-	}
-
-
-
-      // loch = CalcLocH (locpoints, locfaces, h);
-      
-      stat.nff = adfront->GetNF();
-      stat.vol = adfront->Volume();
-      if (stat.vol < 0) break;
-
-      oldnp = locpoints.Size();
-      oldnf = locfaces.Size();
-
-
-      allowpoint.SetSize(locpoints.Size());
-      if (uselocalh && stat.qualclass <= 3)
-	for (i = 1; i <= allowpoint.Size(); i++)
-	  {
-	    allowpoint.Elem(i) =
-	      mesh.GetH (locpoints.Get(i)) > 0.4 * hshould / mp.sloppy;
-	  }
-      else
-	for (i = 1; i <= allowpoint.Size(); i++)	
-	  allowpoint.Elem(i) = 1;
-
-      
-
-
-      
-      if (stat.qualclass >= mp.starshapeclass)   
-	{
-	  // star-shaped domain removing
-
-	  grouppoints.SetSize (0);
-	  groupfaces.SetSize (0);
-	  grouppindex.SetSize (0);
-	  groupfindex.SetSize (0);
-	  
-	  adfront -> GetGroup (findex.Get(1), grouppoints, groupfaces, 
-			       grouppindex, groupfindex);
-
-	  int onlytri = 1;
-	  for (i = 1; i <= groupfaces.Size(); i++)
-	    if (groupfaces.Get(i).GetNP() != 3) 
-	      onlytri = 0;
-
-	  if (onlytri && groupfaces.Size() <= 20 &&
-	      FindInnerPoint (grouppoints, groupfaces, inp))
-	    {
-	      (*testout) << "inner point found" << endl;
-
-	      for (i = 1; i <= groupfaces.Size(); i++)
-		adfront -> DeleteFace (groupfindex.Get(i));
-	      
-	      for (i = 1; i <= groupfaces.Size(); i++)
-		for (j = 1; j <= locfaces.Size(); j++)
-		  if (findex.Get(j) == groupfindex.Get(i))
-		    delfaces.Append (j);
-	      
-	      
-	      delfaces.SetSize (0);
-	      
-	      INDEX npi;
-	      Element newel;
-	      
-	      npi = mesh.AddPoint (inp);
-	      newel.SetNP(4);
-	      newel.PNum(4) = npi;
-	      
-	      
-	      for (i = 1; i <= groupfaces.Size(); i++)
-		{
-		  for (j = 1; j <= 3; j++)
-		    {
-		      newel.PNum(j) = 
-			adfront->GetGlobalIndex 
-			(grouppindex.Get(groupfaces.Get(i).PNum(j)));
-		    }
-		  mesh.AddVolumeElement (newel);
-		}
-	      continue;
-	    }
-	}
-      
-
-
-      found = 0;
-      hasfound = 0;
-      minerr = 1e6;
-
-
-      //      int optother = 0;
-
-      /*
-      for (i = 1; i <= locfaces.Size(); i++)
-	{
-	  (*testout) << "Face " << i << ": ";
-	  for (j = 1; j <= locfaces.Get(i).GetNP(); j++)
-	    (*testout) << pindex.Get(locfaces.Get(i).PNum(j)) << " ";
-	  (*testout) << endl;
-	}
-      for (i = 1; i <= locpoints.Size(); i++)
-	{
-	  (*testout) << "p" << i 
-		     << ", gi = " << pindex.Get(i) 
-		     << " = " << locpoints.Get(i) << endl;
-	}
-	*/
-
-      minother = 1e10;
-      minwithoutother = 1e10;
-
-      for (rotind = 1; rotind <= locfaces.Get(1).GetNP(); rotind++)
-	{
-	  // set transformatino to reference coordinates
-
-	  if (locfaces.Get(1).GetNP() == 3)
-	    {
-	      trans.Set (locpoints.Get(locfaces.Get(1).PNumMod(1+rotind)),
-			 locpoints.Get(locfaces.Get(1).PNumMod(2+rotind)),
-			 locpoints.Get(locfaces.Get(1).PNumMod(3+rotind)), hshould);
-	    }
-	  else
-	    {
-	      trans.Set (locpoints.Get(locfaces.Get(1).PNumMod(1+rotind)),
-			 locpoints.Get(locfaces.Get(1).PNumMod(2+rotind)),
-			 locpoints.Get(locfaces.Get(1).PNumMod(4+rotind)), hshould);
-	    }
-
-	  trans.ToPlain (locpoints, plainpoints);
-
-
-	  for (i = 1; i <= allowpoint.Size(); i++)
-	    {
-	      if (plainpoints.Get(i).Z() > 0)
-		allowpoint.Elem(i) = 0;
-	    }
-
-	  
-	  if (loktestmode)
-	    (*testout) << "plainpoints = " << endl << plainpoints << endl;
-
-	  stat.cnttrials++;
-
-
-	  if (stat.cnttrials % 100 == 0)
-	    {
-	      (*testout) << "\n";
-	      for (i = 1; i <= canuse.Size(); i++)
-	      {
-		(*testout) << foundmap.Get(i) << "/" 
-			   << canuse.Get(i) << "/"
-			   << ruleused.Get(i) << " map/can/use rule " << rules.Get(i)->Name() << "\n";
-	      }
-	      (*testout) << endl;
-	    }
-	  
-	  found = ApplyRules (plainpoints, allowpoint, 
-			      locfaces, locfacesplit, connectedpairs,
-			      locelements, delfaces, 
-			      stat.qualclass, mp.sloppy, rotind, err);
-	  
-	  if (loktestmode)
-	    {
-	      (*testout) << "Applyrules found " << found << endl;
-	    }
-
-	  if (found) stat.cntsucc++;
-
-	  locpoints.SetSize (plainpoints.Size());
-	  for (i = oldnp+1; i <= plainpoints.Size(); i++)
-	    trans.FromPlain (plainpoints.Elem(i), locpoints.Elem(i));
-	  
-
-
-	  // avoid meshing from large to small mesh-size
-
-	  if (uselocalh && found && stat.qualclass <= 3)
-	    {
-	      for (i = 1; i <= locelements.Size(); i++)
-		{
-		  Point3d pmin = locpoints.Get(locelements.Get(i).PNum(1));
-		  Point3d pmax = pmin;
-		  for (j = 2; j <= 4; j++)
-		    {
-		      const Point3d & hp = locpoints.Get(locelements.Get(i).PNum(j));
-		      pmin.SetToMin (hp);
-		      pmax.SetToMax (hp);
-		    }
-
-		  if (mesh.GetMinH (pmin, pmax) < 0.4 * hshould / mp.sloppy)
-		    found = 0;
-		}
-	    }
-	  if (found)
-	    {
-	      for (i = 1; i <= locelements.Size(); i++)
-		for (j = 1; j <= 4; j++)
-		  {
-		    const Point3d & hp = locpoints.Get(locelements.Get(i).PNum(j));
-		    if (Dist (hp, pmid) > hinner)
-		      found = 0;
-		  }
-	    }
-
-
-	  if (found)
-	    ruleused.Elem(found)++;
-
-
-	  if (stat.qualclass > 80)
-	    {
-	      cerr << "Sorry, I failed" << endl;
-	      mesh.Save ("tempvol.out");
-	      exit (1);
-	    }
-	  
-	  
-	  // plotstat->Plot(stat);
-	  
-	  if (stat.cntelem != plotstat_oldne)
-	    {
-	      plotstat_oldne = stat.cntelem;
-
-	      PrintMessageCR (5, "El: ", stat.cntelem,
-			      //	    << " trials: " << stat.cnttrials
-			      " faces: ", stat.nff,
-			      " vol = ", float(100 * stat.vol / stat.vol0));
-  
-	      multithread.percent = 100 -  100.0 * stat.vol / stat.vol0;
-	    }
-
-
-	  if (found && (!hasfound || err < minerr) )
-	    {
-	      
-	      if (testmode)
-		{
-		  (*testout) << "testmode found" << endl;
-		  for (i = 1; i <= plainpoints.Size(); i++)
-		    {
-		      (*testout) << "p";
-		      if (i <= pindex.Size())
-			(*testout) << pindex.Get(i) << ": ";
-		      else
-			(*testout) << "new: ";
-		      (*testout) << plainpoints.Get(i) << endl;
-		    }
-		}
-	      
-	      
-	      
-	      hasfound = found;
-	      minerr = err;
-	      
-	      tempnewpoints.SetSize (0);
-	      for (i = oldnp+1; i <= locpoints.Size(); i++)
-		tempnewpoints.Append (locpoints.Get(i));
-	      
-	      tempnewfaces.SetSize (0);
-	      for (i = oldnf+1; i <= locfaces.Size(); i++)
-		tempnewfaces.Append (locfaces.Get(i));
-	      
-	      tempdelfaces.SetSize (0);
-	      for (i = 1; i <= delfaces.Size(); i++)
-		tempdelfaces.Append (delfaces.Get(i));
-	      
-	      templocelements.SetSize (0);
-	      for (i = 1; i <= locelements.Size(); i++)
-		templocelements.Append (locelements.Get(i));
-
-	      /*
-	      optother =
-		strcmp (problems[found], "other") == 0;
-	      */
-	    }
-	  
-	  locpoints.SetSize (oldnp);
-	  locfaces.SetSize (oldnf);
-	  delfaces.SetSize (0);
-	  locelements.SetSize (0);
-	}
-      
-      
-
-      if (hasfound)
-	{
-
-	  /*
-	  if (optother)
-	    (*testout) << "Other is optimal" << endl;
-
-	  if (minother < minwithoutother)
-	    {
-	      (*testout) << "Other is better, " << minother << " less " << minwithoutother << endl;
-	    }
-	    */
-
-	  for (i = 1; i <= tempnewpoints.Size(); i++)
-	    locpoints.Append (tempnewpoints.Get(i));
-	  for (i = 1; i <= tempnewfaces.Size(); i++)
-	    locfaces.Append (tempnewfaces.Get(i));
-	  for (i = 1; i <= tempdelfaces.Size(); i++)
-	    delfaces.Append (tempdelfaces.Get(i));
-	  for (i = 1; i <= templocelements.Size(); i++)
-	    locelements.Append (templocelements.Get(i));
-
-
-	  if (testmode)
-	    {
-	      (*testout) << "testmode locpoints" << endl;
-	      for (i = 1; i <= locpoints.Size(); i++)
-		{
-		  (*testout) << "p";
-		  if (i <= pindex.Size())
-		    (*testout) << pindex.Get(i) << ": ";
-		  else
-		    (*testout) << "new: ";
-		  (*testout) << locpoints.Get(i) << endl;
-		}
-	    }
-
-
-
-	  pindex.SetSize(locpoints.Size());
-
-	  for (i = oldnp+1; i <= locpoints.Size(); i++)
-	    {
-	      globind = mesh.AddPoint (locpoints.Get(i));
-	      pindex.Elem(i) = adfront -> AddPoint (locpoints.Get(i), globind);
-	    }
-
-	  for (i = 1; i <= locelements.Size(); i++)
-	    {
-	      Point3d * hp1, * hp2, * hp3, * hp4;
-	      hp1 = &locpoints.Elem(locelements.Get(i).PNum(1));
-	      hp2 = &locpoints.Elem(locelements.Get(i).PNum(2));
-	      hp3 = &locpoints.Elem(locelements.Get(i).PNum(3));
-	      hp4 = &locpoints.Elem(locelements.Get(i).PNum(4));
-	      
-	      tetvol += (1.0 / 6.0) * ( Cross ( *hp2 - *hp1, *hp3 - *hp1) * (*hp4 - *hp1) );
-
-	      for (j = 1; j <= locelements.Get(i).NP(); j++)
-		locelements.Elem(i).PNum(j) =
-		  adfront -> GetGlobalIndex (pindex.Get(locelements.Get(i).PNum(j)));
-
-	      mesh.AddVolumeElement (locelements.Get(i));
-	      stat.cntelem++;
-	    }
-
-	  for (i = oldnf+1; i <= locfaces.Size(); i++)
-	    {
-	      for (j = 1; j <= locfaces.Get(i).GetNP(); j++)
-		locfaces.Elem(i).PNum(j) = 
-		  pindex.Get(locfaces.Get(i).PNum(j));
-	      (*testout) << "add face " << locfaces.Get(i) << endl;
-	      adfront->AddFace (locfaces.Get(i));
-	    }
-	  
-	  for (i = 1; i <= delfaces.Size(); i++)
-	    {
-	      adfront->DeleteFace (findex.Get(delfaces.Get(i)));
-	    }
-	}
-      else
-	{
-	  adfront->IncrementClass (findex.Get(1));
-	}
-
-      locelements.SetSize (0);
-      delpoints.SetSize(0);
-      delfaces.SetSize(0);
-
-      if (stat.qualclass >= giveuptol)
-	giveup = 1;
-#ifdef MYGRAPH
-      if (plotvolmesh && plotvolmesh->GiveUp())
-	giveup = 1;
-#endif
-    }
-  
-
-
-  for (i = 1; i <= ruleused.Size(); i++)
-    (*testout) << setw(4) << ruleused.Get(i)
-	       << " times used rule " << rules.Get(i) -> Name() << endl;
-
-
-  if (!mp.baseelnp && adfront->Empty())
-    return MESHING3_OK;
-
-  if (mp.baseelnp && adfront->Empty (mp.baseelnp))
-    return MESHING3_OK;
-
-  if (stat.vol < -1e-15)
-    return MESHING3_NEGVOL;
-
-  return MESHING3_NEGVOL;
-}
-
-
-
-
-enum blocktyp { BLOCKUNDEF, BLOCKINNER, BLOCKBOUND, BLOCKOUTER };
-
-void Meshing3 :: BlockFill (Mesh & mesh, double gh)
-{
-  PrintMessage (3, "Block-filling called (obsolete) ");
-
-  int i, j, i1, i2, i3, j1, j2, j3;
-  int n1, n2, n3, n, min1, min2, min3, max1, max2, max3;
-  int changed, filled;
-  double xmin, xmax, ymin, ymax, zmin, zmax;
-  double xminb, xmaxb, yminb, ymaxb, zminb, zmaxb;
-  double rad = 0.7 * gh;
-  
-  for (i = 1; i <= adfront->GetNP(); i++)
-    {
-      const Point3d & p = adfront->GetPoint(i);
-      if (i == 1)
-	{
-	  xmin = xmax = p.X();
-	  ymin = ymax = p.Y();
-	  zmin = zmax = p.Z();
-	}
-      else
-	{
-	  if (p.X() < xmin) xmin = p.X();
-	  if (p.X() > xmax) xmax = p.X();
-	  if (p.Y() < ymin) ymin = p.Y();
-	  if (p.Y() > ymax) ymax = p.Y();
-	  if (p.Z() < zmin) zmin = p.Z();
-	  if (p.Z() > zmax) zmax = p.Z();
-	}
-    }
-  
-  xmin -= 5 * gh;
-  ymin -= 5 * gh;
-  zmin -= 5 * gh;
-  
-  n1 = int ((xmax-xmin) / gh + 5);
-  n2 = int ((ymax-ymin) / gh + 5);
-  n3 = int ((zmax-zmin) / gh + 5);
-  n = n1 * n2 * n3;
-  
-  PrintMessage (5, "n1 = ", n1, " n2 = ", n2, " n3 = ", n3);
-
-  ARRAY<blocktyp> inner(n);
-  ARRAY<int> pointnr(n), frontpointnr(n);
-
-
-  // initialize inner to 1
-
-  for (i = 1; i <= n; i++)
-    inner.Elem(i) = BLOCKUNDEF;
-
-
-  // set blocks cutting surfaces to 0
-
-  for (i = 1; i <= adfront->GetNF(); i++)
-    {
-      const Element2d & el = adfront->GetFace(i);
-      xminb = xmax; xmaxb = xmin;
-      yminb = ymax; ymaxb = ymin;
-      zminb = zmax; zmaxb = zmin;
-
-      for (j = 1; j <= 3; j++)
-	{
-	  const Point3d & p = adfront->GetPoint (el.PNum(j));
-	  if (p.X() < xminb) xminb = p.X();
-	  if (p.X() > xmaxb) xmaxb = p.X();
-	  if (p.Y() < yminb) yminb = p.Y();
-	  if (p.Y() > ymaxb) ymaxb = p.Y();
-	  if (p.Z() < zminb) zminb = p.Z();
-	  if (p.Z() > zmaxb) zmaxb = p.Z();
-	}
-
-	
-
-      double filldist = 0.2; // globflags.GetNumFlag ("filldist", 0.4);
-      xminb -= filldist * gh;
-      xmaxb += filldist * gh;
-      yminb -= filldist * gh;
-      ymaxb += filldist * gh;
-      zminb -= filldist * gh;
-      zmaxb += filldist * gh;
-
-      min1 = int ((xminb - xmin) / gh) + 1;
-      max1 = int ((xmaxb - xmin) / gh) + 1;
-      min2 = int ((yminb - ymin) / gh) + 1;
-      max2 = int ((ymaxb - ymin) / gh) + 1;
-      min3 = int ((zminb - zmin) / gh) + 1;
-      max3 = int ((zmaxb - zmin) / gh) + 1;
-
-
-      for (i1 = min1; i1 <= max1; i1++)
-	for (i2 = min2; i2 <= max2; i2++)
-	  for (i3 = min3; i3 <= max3; i3++)
-	    inner.Elem(i3 + (i2-1) * n3 + (i1-1) * n2 * n3) = BLOCKBOUND;      
-    }
-
-  
-
-
-  while (1)
-    {
-      int undefi = 0;
-      Point3d undefp;
-
-      for (i1 = 1; i1 <= n1 && !undefi; i1++)
-	for (i2 = 1; i2 <= n2 && !undefi; i2++)
-	  for (i3 = 1; i3 <= n3 && !undefi; i3++)
-	    {
-	      i = i3 + (i2-1) * n3 + (i1-1) * n2 * n3;
-	      if (inner.Elem(i) == BLOCKUNDEF)
-		{
-		  undefi = i;
-		  undefp.X() = xmin + (i1-0.5) * gh;
-		  undefp.Y() = ymin + (i2-0.5) * gh;
-		  undefp.Z() = zmin + (i3-0.5) * gh;
-		}
-	    }
-	      
-      if (!undefi)
-	break;
-
-      //      PrintMessage (5, "Test point: ", undefp);
-      
-      if (adfront -> Inside (undefp))
-	{
-	  //	  (*mycout) << "inner" << endl;
-	  inner.Elem(undefi) = BLOCKINNER;
-	}
-      else
-	{
-	  //	  (*mycout) << "outer" << endl;
-	  inner.Elem(undefi) = BLOCKOUTER;
-	}
-
-      do
-	{
-	  changed = 0;
-	  for (i1 = 1; i1 <= n1; i1++)
-	    for (i2 = 1; i2 <= n2; i2++)
-	      for (i3 = 1; i3 <= n3; i3++)
-		{
-		  i = i3 + (i2-1) * n3 + (i1-1) * n2 * n3;
-
-		  for (int k = 1; k <= 3; k++)
-		    {
-		      switch (k)
-			{
-			case 1: j = i + n2 * n3; break;
-			case 2: j = i + n3; break;
-			case 3: j = i + 1; break;
-			}
-		  
-		      if (j > n1 * n2 * n3) continue;
-
-		      if (inner.Elem(i) == BLOCKOUTER && inner.Elem(j) == BLOCKUNDEF)
-			{
-			  changed = 1;
-			  inner.Elem(j) = BLOCKOUTER;
-			}
-		      if (inner.Elem(j) == BLOCKOUTER && inner.Elem(i) == BLOCKUNDEF)
-			{
-			  changed = 1;
-			  inner.Elem(i) = BLOCKOUTER;
-			}
-		      if (inner.Elem(i) == BLOCKINNER && inner.Elem(j) == BLOCKUNDEF)
-			{
-			  changed = 1;
-			  inner.Elem(j) = BLOCKINNER;
-			}
-		      if (inner.Elem(j) == BLOCKINNER && inner.Elem(i) == BLOCKUNDEF)
-			{
-			  changed = 1;
-			  inner.Elem(i) = BLOCKINNER;
-			}
-		    }
-		}
-	}
-      while (changed); 
-
-    }
-
-
-
-  filled = 0;
-  for (i = 1; i <= n; i++)
-    if (inner.Elem(i) == BLOCKINNER)
-      {
-	filled++;
-      }
-  PrintMessage (5, "Filled blocks: ", filled);
-
-  for (i = 1; i <= n; i++)
-    {
-      pointnr.Elem(i) = 0;
-      frontpointnr.Elem(i) = 0;
-    }
-  
-  for (i1 = 1; i1 <= n1-1; i1++)
-    for (i2 = 1; i2 <= n2-1; i2++)
-      for (i3 = 1; i3 <= n3-1; i3++)
-	{
-	  i = i3 + (i2-1) * n3 + (i1-1) * n2 * n3;
-	  if (inner.Elem(i) == BLOCKINNER)
-	    {
-	      for (j1 = i1; j1 <= i1+1; j1++)
-		for (j2 = i2; j2 <= i2+1; j2++)
-		  for (j3 = i3; j3 <= i3+1; j3++)
-		    {
-		      j = j3 + (j2-1) * n3 + (j1-1) * n2 * n3;
-		      if (pointnr.Get(j) == 0)
-			{
-			  Point3d hp(xmin + (j1-1) * gh, 
-				     ymin + (j2-1) * gh, 
-				     zmin + (j3-1) * gh);
-			  pointnr.Elem(j) = mesh.AddPoint (hp);
-			  frontpointnr.Elem(j) =
-			    AddPoint (hp, pointnr.Elem(j));
-
-			}
-		    }
-	    }
-	}
-
-
-  for (i1 = 2; i1 <= n1-1; i1++)
-    for (i2 = 2; i2 <= n2-1; i2++)
-      for (i3 = 2; i3 <= n3-1; i3++)
-	{
-	  i = i3 + (i2-1) * n3 + (i1-1) * n2 * n3;
-	  if (inner.Elem(i) == BLOCKINNER)
-	    {
-	      int pn[9];
-	      pn[1] = pointnr.Get(i);
-	      pn[2] = pointnr.Get(i+1);
-	      pn[3] = pointnr.Get(i+n3);
-	      pn[4] = pointnr.Get(i+n3+1);
-	      pn[5] = pointnr.Get(i+n2*n3);
-	      pn[6] = pointnr.Get(i+n2*n3+1);
-	      pn[7] = pointnr.Get(i+n2*n3+n3);
-	      pn[8] = pointnr.Get(i+n2*n3+n3+1);
-	      static int elind[][4] =
-	      {
-		{ 1, 8, 2, 4 },
-		{ 1, 8, 4, 3 },
-		{ 1, 8, 3, 7 },
-		{ 1, 8, 7, 5 },
-		{ 1, 8, 5, 6 },
-		{ 1, 8, 6, 2 }
-	      };
-	      for (j = 1; j <= 6; j++)
-		{
-		  Element el(4);
-		  for (int k = 1; k <= 4;  k++)
-		    el.PNum(k) = pn[elind[j-1][k-1]];
-
-		  mesh.AddVolumeElement (el);
-		}
-	    }
-	}
-
-
-
-  for (i1 = 2; i1 <= n1-1; i1++)
-    for (i2 = 2; i2 <= n2-1; i2++)
-      for (i3 = 2; i3 <= n3-1; i3++)
-	{
-	  i = i3 + (i2-1) * n3 + (i1-1) * n2 * n3;
-	  if (inner.Elem(i) == BLOCKINNER)
-	    {    
-	      int pi1, pi2, pi3, pi4;
-
-	      int pn1 = frontpointnr.Get(i);
-	      int pn2 = frontpointnr.Get(i+1);
-	      int pn3 = frontpointnr.Get(i+n3);
-	      int pn4 = frontpointnr.Get(i+n3+1);
-	      int pn5 = frontpointnr.Get(i+n2*n3);
-	      int pn6 = frontpointnr.Get(i+n2*n3+1);
-	      int pn7 = frontpointnr.Get(i+n2*n3+n3);
-	      int pn8 = frontpointnr.Get(i+n2*n3+n3+1);
-
-	      for (int k = 1; k <= 6; k++)
-		{
-		  switch (k)
-		    {
-		    case 1: // j3 = i3+1
-		      j = i + 1;
-		      pi1 = pn2;
-		      pi2 = pn6;
-		      pi3 = pn4;
-		      pi4 = pn8;
-		      break;
-		    case 2: // j3 = i3-1
-		      j = i - 1;
-		      pi1 = pn1;
-		      pi2 = pn3;
-		      pi3 = pn5;
-		      pi4 = pn7;
-		      break;
-		    case 3: // j2 = i2+1
-		      j = i + n3;
-		      pi1 = pn3;
-		      pi2 = pn4;
-		      pi3 = pn7;
-		      pi4 = pn8;
-		      break;
-		    case 4: // j2 = i2-1
-		      j = i - n3;
-		      pi1 = pn1;
-		      pi2 = pn5;
-		      pi3 = pn2;
-		      pi4 = pn6;
-		      break;
-		    case 5: // j1 = i1+1
-		      j = i + n3*n2;
-		      pi1 = pn5;
-		      pi2 = pn7;
-		      pi3 = pn6;
-		      pi4 = pn8;
-		      break;
-		    case 6: // j1 = i1-1
-		      j = i - n3*n2;
-		      pi1 = pn1;
-		      pi2 = pn2;
-		      pi3 = pn3;
-		      pi4 = pn4;
-		      break;
-		    }
-
-		  if (inner.Get(j) == BLOCKBOUND)
-		    {
-		      Element2d face;
-		      face.PNum(1) = pi4;
-		      face.PNum(2) = pi1;
-		      face.PNum(3) = pi3;
-		      AddBoundaryElement (face);
-
-		      face.PNum(1) = pi1;
-		      face.PNum(2) = pi4;
-		      face.PNum(3) = pi2;
-		      AddBoundaryElement (face);
-
-		    }
-		}
-	    }
-	}
-}
-
-
-
-static const AdFront3 * locadfront;
-static int TestInner (const Point3d & p)
-{
-  return locadfront->Inside (p);
-}
-static int TestSameSide (const Point3d & p1, const Point3d & p2)
-{
-  return locadfront->SameSide (p1, p2);
-}
-
-
-
-
-void Meshing3 :: BlockFillLocalH (Mesh & mesh, 
-				  const MeshingParameters & mp)
-{
-  int i, j;
-  
-  double filldist = mp.filldist;
-
-  (*testout) << "blockfill local h" << endl;
-  (*testout) << "rel filldist = " << filldist << endl;
-  PrintMessage (3, "blockfill local h");
-
-  /*  
-  (*mycout) << "boxes: " << mesh.LocalHFunction().GetNBoxes() << endl
-	    << "filldist = " << filldist << endl;
-  */
-  ARRAY<Point3d> npoints;
-  
-  adfront -> CreateTrees();
-
-  Point3d mpmin, mpmax;
-  // mesh.GetBox (mpmin, mpmax);
-  bool firstp = 1;
-
-  double maxh = 0;
-  for (i = 1; i <= adfront->GetNF(); i++)
-    {
-      const Element2d & el = adfront->GetFace(i);
-      for (j = 1; j <= 3; j++)
-	{
-	  const Point3d & p1 = adfront->GetPoint (el.PNumMod(j));
-	  const Point3d & p2 = adfront->GetPoint (el.PNumMod(j+1));
-	  double hi = Dist (p1, p2);
-	  if (hi > maxh) maxh = hi;
-
-	  if (firstp)
-	    {
-	      mpmin = p1;
-	      mpmax = p1;
-	      firstp = 0;
-	    }
-	  else
-	    {
-	      mpmin.SetToMin  (p1);
-	      mpmax.SetToMax  (p1);
-	    }
-	}
-    }
-
-  Point3d mpc = Center (mpmin, mpmax);
-  double d = max3(mpmax.X()-mpmin.X(), 
-		  mpmax.Y()-mpmin.Y(), 
-		  mpmax.Z()-mpmin.Z()) / 2;
-  mpmin = mpc - Vec3d (d, d, d);
-  mpmax = mpc + Vec3d (d, d, d);
-  Box3d meshbox (mpmin, mpmax);
-
-  LocalH loch2 (mpmin, mpmax, 1);
-
-
-  if (mp.maxh < maxh) maxh = mp.maxh;
-
-  int changed;
-  do 
-    {
-      mesh.LocalHFunction().ClearFlags();
-
-      for (i = 1; i <= adfront->GetNF(); i++)
-	{
-	  const Element2d & el = adfront->GetFace(i);
-	  Point3d pmin = adfront->GetPoint (el.PNum(1));
-	  Point3d pmax = pmin;
-	  
-	  for (j = 2; j <= 3; j++)
-	    {
-	      const Point3d & p = adfront->GetPoint (el.PNum(j));
-	      pmin.SetToMin (p);
-	      pmax.SetToMax (p);
-	    }
-	  
-
-	  double filld = filldist * Dist (pmin, pmax);
-	  
-	  pmin = pmin - Vec3d (filld, filld, filld);
-	  pmax = pmax + Vec3d (filld, filld, filld);
-	  //	  (*testout) << "cut : " << pmin << " - " << pmax << endl;
-	  mesh.LocalHFunction().CutBoundary (pmin, pmax);
-	}
-
-      locadfront = adfront;
-      mesh.LocalHFunction().FindInnerBoxes (adfront, NULL);
-
-      npoints.SetSize(0);
-      mesh.LocalHFunction().GetInnerPoints (npoints);
-
-      changed = 0;
-      for (i = 1; i <= npoints.Size(); i++)
-	{
-	  if (mesh.LocalHFunction().GetH(npoints.Get(i)) > 1.5 * maxh)
-	    {
-	      mesh.LocalHFunction().SetH (npoints.Get(i), 
-maxh);
-	      changed = 1;
-	    }
-	}
-    }
-  while (changed);
-
-  if (debugparam.slowchecks)
-    (*testout) << "Blockfill with points: " << endl;
-  for (i = 1; i <= npoints.Size(); i++)
-    {
-      if (meshbox.IsIn (npoints.Get(i)))
-	{
-	  int gpnum = mesh.AddPoint (npoints.Get(i));
-	  adfront->AddPoint (npoints.Get(i), gpnum);
-
-	  if (debugparam.slowchecks)
-	    {
-	      (*testout) << npoints.Get(i) << endl;
-	      if (!adfront->Inside(npoints.Get(i)))
-		{
-		  cout << "add outside point" << endl;
-		  (*testout) << "outside" << endl;
-		}
-	    }
-
-	}
-    }
-
-  
-
-  // find outer points
-  
-  loch2.ClearFlags();
-
-  for (i = 1; i <= adfront->GetNF(); i++)
-    {
-      const Element2d & el = adfront->GetFace(i);
-      Point3d pmin = adfront->GetPoint (el.PNum(1));
-      Point3d pmax = pmin;
-      
-      for (j = 2; j <= 3; j++)
-	{
-	  const Point3d & p = adfront->GetPoint (el.PNum(j));
-	  pmin.SetToMin (p);
-	  pmax.SetToMax (p);
-	}
-      
-      loch2.SetH (Center (pmin, pmax), Dist (pmin, pmax));
-    }
-
-  for (i = 1; i <= adfront->GetNF(); i++)
-    {
-      const Element2d & el = adfront->GetFace(i);
-      Point3d pmin = adfront->GetPoint (el.PNum(1));
-      Point3d pmax = pmin;
-      
-      for (j = 2; j <= 3; j++)
-	{
-	  const Point3d & p = adfront->GetPoint (el.PNum(j));
-	  pmin.SetToMin (p);
-	  pmax.SetToMax (p);
-	}
-      
-      double filld = filldist * Dist (pmin, pmax);
-      pmin = pmin - Vec3d (filld, filld, filld);
-      pmax = pmax + Vec3d (filld, filld, filld);
-      loch2.CutBoundary (pmin, pmax);
-    }
-
-  locadfront = adfront;
-  loch2.FindInnerBoxes (adfront, NULL);
-
-  npoints.SetSize(0);
-  loch2.GetOuterPoints (npoints);
-  
-  for (i = 1; i <= npoints.Size(); i++)
-    {
-      if (meshbox.IsIn (npoints.Get(i)))
-	{
-	  int gpnum = mesh.AddPoint (npoints.Get(i));
-	  adfront->AddPoint (npoints.Get(i), gpnum);
-	}
-    }  
-}
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/meshing3.hpp b/contrib/Netgen/libsrc/meshing/meshing3.hpp
deleted file mode 100644
index 45f44751e3dc63796d9e5b9397118ff1f3659cee..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing3.hpp
+++ /dev/null
@@ -1,128 +0,0 @@
-#ifndef FILE_MESHING3
-#define FILE_MESHING3
-
-
-
-
-enum MESHING3_RESULT
-{
-  MESHING3_OK = 0,
-  MESHING3_GIVEUP = 1,
-  MESHING3_NEGVOL = 2,
-  MESHING3_OUTERSTEPSEXCEEDED = 3,
-  MESHING3_TERMINATE = 4,
-  MESHING3_BADSURFACEMESH = 5
-};
-
-
-/// 3d volume mesh generation
-class Meshing3
-{
-  /// current state of front
-  AdFront3 * adfront;
-  /// 3d generation rules
-  ARRAY<vnetrule*> rules;
-  /// counts how often a rule is used
-  ARRAY<int> ruleused, canuse, foundmap;
-  /// describes, why a rule is not applied
-  ARRAY<char*> problems;
-  /// tolerance criterion
-  double tolfak;
-public:
-  /// 
-  Meshing3 (const string & rulefilename); 
-  /// 
-  Meshing3 (const char ** rulep);
-  ///
-  virtual ~Meshing3 ();
-  
-  ///
-  void LoadRules (const char * filename, const char ** prules);
-  ///
-  MESHING3_RESULT GenerateMesh (Mesh & mesh, const MeshingParameters & mp);
-  
-  ///
-  int ApplyRules (ARRAY<Point3d> & lpoints, ARRAY<int> & allowpoint,
-		  ARRAY<Element2d> & lfaces, INDEX lfacesplit,
-		  INDEX_2_HASHTABLE<int> & connectedpairs,
-		  ARRAY<Element> & elements,
-		  ARRAY<INDEX> & delfaces, int tolerance, 
-		  double sloppy, int rotind1,
-		  float & retminerr);
-  
-  ///
-  PointIndex AddPoint (const Point3d & p, PointIndex globind);
-  ///
-  void AddBoundaryElement (const Element2d & elem);
-  ///
-  int AddConnectedPair (const INDEX_2 & pair);
-  
-  ///
-  void BlockFill (Mesh & mesh, double gh);
-  ///
-  void BlockFillLocalH (Mesh & mesh, const MeshingParameters & mp);
-
-  /// uses points of adfront, and puts new elements into mesh
-  void Delaunay (Mesh & mesh, const MeshingParameters & mp);
-  ///
-  friend class PlotVolMesh;
-  ///
-  friend void TestRules ();
-};
-
-
-
-
-/// status of mesh generation
-class MeshingStat3d
-{
-public:
-  ///
-  MeshingStat3d ();
-  ///
-  int cntsucc;
-  ///
-  int cnttrials;
-  ///
-  int cntelem;
-  ///
-  int nff;
-  ///
-  int qualclass;
-  ///
-  double vol0;
-  ///
-  double vol;
-  ///
-  double h;
-  ///
-  int problemindex;
-};
-
-
-
-
-
-/*
-template <typename POINTARRAY, typename FACEARRAY>
-extern int FindInnerPoint (POINTARRAY & grouppoints,
-			   FACEARRAY & groupfaces,
-			   Point3d & p);
-
-*/
-
-
-
-
-
-#endif
-
-
-
-
-
-
-
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/meshtool.cpp b/contrib/Netgen/libsrc/meshing/meshtool.cpp
deleted file mode 100644
index 89bb2b16dd08e6832493cdc7822fb246a8424541..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshtool.cpp
+++ /dev/null
@@ -1,978 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#include <csg.hpp>
-#include <geometry2d.hpp>
-
-namespace netgen
-{
-
-  int CheckSurfaceMesh (const Mesh & mesh)
-  {
-    PrintMessage (3, "Check Surface mesh");
-
-    int nf = mesh.GetNSE();
-    INDEX_2_HASHTABLE<int> edges(nf+2);
-    int i, j;
-    INDEX_2 i2;
-    int cnt1 = 0, cnt2 = 0;
-
-    for (i = 1; i <= nf; i++)
-      for (j = 1; j <= 3; j++)
-	{
-	  i2.I1() = mesh.SurfaceElement(i).PNumMod(j);
-	  i2.I2() = mesh.SurfaceElement(i).PNumMod(j+1);
-	  if (edges.Used(i2))
-	    {
-	      int hi;
-	      hi = edges.Get(i2);
-	      if (hi != 1) 
-		PrintSysError ("CheckSurfaceMesh, hi = ", hi);
-	      edges.Set(i2, 2);
-	      cnt2++;
-	    }
-	  else
-	    {
-	      Swap (i2.I1(), i2.I2());
-	      edges.Set(i2, 1);
-	      cnt1++;
-	    }
-	}
-  
-
-    if (cnt1 != cnt2)
-      {
-	PrintUserError ("Surface mesh not consistent");
-	//      MyBeep(2);
-	//      (*mycout) << "cnt1 = " << cnt1 << " cnt2 = " << cnt2 << endl;
-	return 0;
-      }
-    return 1;
-  }
-
-
-
-  int CheckSurfaceMesh2 (const Mesh & mesh)
-  {
-    int i, j, k;
-    const Point3d *tri1[3], *tri2[3];
-
-    for (i = 1; i <= mesh.GetNOpenElements(); i++)
-      {
-	PrintDot ();
-	for (j = 1; j < i; j++)
-	  {
-	    for (k = 1; k <= 3; k++)
-	      {
-		tri1[k-1] = &mesh.Point (mesh.OpenElement(i).PNum(k));
-		tri2[k-1] = &mesh.Point (mesh.OpenElement(j).PNum(k));
-	      }
-	    if (IntersectTriangleTriangle (&tri1[0], &tri2[0]))
-	      {
-		PrintSysError ("Surface elements are intersecting");
-		(*testout) << "Intersecting: " << endl;
-		for (k = 0; k <= 2; k++)
-		  (*testout) << *tri1[k] << "   ";
-		(*testout) << endl;
-		for (k = 0; k <= 2; k++)
-		  (*testout) << *tri2[k] << "   ";
-		(*testout) << endl;
-	      }
-
-	  }
-      }
-    return 0;
-  }
-
-
-
-
-
-  static double TriangleQualityInst (const Point3d & p1, const Point3d & p2,
-				     const Point3d & p3)
-  {
-    // quality 0 (worst) .. 1 (optimal)
-
-    Vec3d v1, v2, v3;
-    double s1, s2, s3;
-    double an1, an2, an3;
-
-    v1 = p2 - p1;
-    v2 = p3 - p1;
-    v3 = p3 - p2;
-
-    an1 = Angle (v1, v2);
-    v1 *= -1;
-    an2 = Angle (v1, v3);
-    an3 = Angle (v2, v3);
-
-    s1 = sin (an1/2);
-    s2 = sin (an2/2);
-    s3 = sin (an3/2);
-
-    return 8 * s1 * s2 * s3;
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  void MeshQuality2d (const Mesh & mesh)
-  {
-    int ncl = 20, cl;
-    ARRAY<INDEX> incl(ncl);
-    INDEX i;
-    SurfaceElementIndex sei;
-    double qual;
-
-    incl = 0;
-
-    for (sei = 0; sei < mesh.GetNSE(); sei++)
-      {
-	qual = TriangleQualityInst (mesh[mesh[sei][0]],
-				    mesh[mesh[sei][1]],
-				    mesh[mesh[sei][2]]);
-
-	cl = int ( (ncl-1e-3) * qual ) + 1;
-	incl.Elem(cl)++;
-      }
-
-    (*testout) << endl << endl;
-
-    (*testout) << "Points:           " << mesh.GetNP() << endl;
-    (*testout) << "Surface Elements: " << mesh.GetNSE() << endl;
-
-    (*testout) << endl;
-    (*testout) << "Elements in qualityclasses:" << endl;
-    (*testout).precision(2);
-    for (i = 1; i <= ncl; i++)
-      {
-	(*testout) << setw(4) << double (i-1)/ncl << " - "
-		   << setw(4) << double (i) / ncl << ": "
-		   << incl.Get(i) << endl;
-      }
-  }
-
-
-  static double TetElementQuality (const Point3d & p1, const Point3d & p2,
-				   const Point3d & p3, const Point3d & p4)
-  {
-    double vol, l, l4, l5, l6;
-
-
-    Vec3d v1 = p2 - p1;
-    Vec3d v2 = p3 - p1;
-    Vec3d v3 = p4 - p1;
-
-    vol = fabs ((Cross (v1, v2) * v3)) / 6;
-    l4 = Dist (p2, p3);
-    l5 = Dist (p2, p4);
-    l6 = Dist (p3, p4);
-
-    l = v1.Length() + v2.Length() + v3.Length() + l4 + l5 + l6;
-
-    if (vol <= 1e-8 * l * l * l) return 1e-10;
-
-    return vol/(l*l*l) * 1832.82;    // 6^4 * sqrt(2)
-  }
-
-
-
-
-
-  double teterrpow = 2;
-
-  double CalcTetBadness (const Point3d & p1, const Point3d & p2,
-			 const Point3d & p3, const Point3d & p4, double h)
-  {
-    double vol, l, ll, lll, ll1, ll2, ll3, ll4, ll5, ll6;
-    double err;
-
-    Vec3d v1 (p1, p2);
-    Vec3d v2 (p1, p3);
-    Vec3d v3 (p1, p4);
-
-    vol = -Determinant (v1, v2, v3) / 6;
-
-    ll1 = v1.Length2();
-    ll2 = v2.Length2();
-    ll3 = v3.Length2();
-    ll4 = Dist2 (p2, p3);
-    ll5 = Dist2 (p2, p4);
-    ll6 = Dist2 (p3, p4);
-
-    ll = ll1 + ll2 + ll3 + ll4 + ll5 + ll6;
-    l = sqrt (ll);
-    lll = l * ll;
-
-    if (vol <= 1e-24 * lll)
-      return 1e24;
-
-    err = 0.0080187537 * lll / vol;    // sqrt(216) / (6^4 * sqrt(2))
-
-    if (h > 0)
-      err += ll / (h * h) + 
-	h * h * ( 1 / ll1 + 1 / ll2 + 1 / ll3 + 
-		  1 / ll4 + 1 / ll5 + 1 / ll6 ) - 12;
-
-    return pow (err, teterrpow);
-  }
-
-
-  double CalcTetBadnessGrad (const Point3d & p1, const Point3d & p2,
-			     const Point3d & p3, const Point3d & p4, double h,
-			     int pi, Vec3d & grad)
-  {
-    double vol, l, ll, lll;
-    double err;
-
-    const Point3d *pp1, *pp2, *pp3, *pp4;
-
-    pp1 = &p1;
-    pp2 = &p2;
-    pp3 = &p3;
-    pp4 = &p4;
-  
-    switch (pi)
-      {
-      case 2:
-	{
-	  swap (pp1, pp2);
-	  swap (pp3, pp4);
-	  break;
-	}
-      case 3:
-	{
-	  swap (pp1, pp3);
-	  swap (pp2, pp4);
-	  break;
-	}
-      case 4:
-	{
-	  swap (pp1, pp4);
-	  swap (pp3, pp2);
-	  break;
-	}
-      }
-  
-
-    Vec3d v1 (*pp1, *pp2);
-    Vec3d v2 (*pp1, *pp3);
-    Vec3d v3 (*pp1, *pp4);
-
-    Vec3d v4 (*pp2, *pp3);
-    Vec3d v5 (*pp2, *pp4);
-    Vec3d v6 (*pp3, *pp4);
-
-    vol = -Determinant (v1, v2, v3) / 6;  
-
-    Vec3d gradvol;
-    Cross (v5, v4, gradvol);
-    gradvol *= (-1.0/6.0);
-
-
-    double ll1 = v1.Length2();
-    double ll2 = v2.Length2();
-    double ll3 = v3.Length2();
-    double ll4 = v4.Length2();
-    double ll5 = v5.Length2();
-    double ll6 = v6.Length2();
-
-    ll = ll1 + ll2 + ll3 + ll4 + ll5 + ll6;
-    l = sqrt (ll);
-    lll = l * ll;
-
-    if (vol <= 1e-24 * lll)
-      { 
-	grad = Vec3d (0, 0, 0);
-	return 1e24;
-      }
-
-
-
-    Vec3d gradll1 (*pp2, *pp1);
-    Vec3d gradll2 (*pp3, *pp1);
-    Vec3d gradll3 (*pp4, *pp1);
-    gradll1 *= 2;
-    gradll2 *= 2;
-    gradll3 *= 2;
-
-    Vec3d gradll (gradll1);
-    gradll += gradll2;
-    gradll += gradll3;
-
-
-
-    err = 0.0080187537 * lll / vol; 
-
-
-    gradll *= (0.0080187537 * 1.5 * l / vol);
-    Vec3d graderr(gradll);
-    gradvol *= ( -0.0080187537 * lll / (vol * vol) );
-    graderr += gradvol;
-  
-    if (h > 0)
-      {
-	err += ll / (h*h) + 
-	  h*h * ( 1 / ll1 + 1 / ll2 + 1 / ll3 + 
-		  1 / ll4 + 1 / ll5 + 1 / ll6 ) - 12;
-
-	graderr += (1/(h*h) - h*h/(ll1*ll1)) * gradll1;
-	graderr += (1/(h*h) - h*h/(ll2*ll2)) * gradll2;
-	graderr += (1/(h*h) - h*h/(ll3*ll3)) * gradll3;
-	cout << "?";
-      }
-
-    double errpow = pow (err, teterrpow);
-    grad = (teterrpow * errpow / err) * graderr;
-  
-    return errpow;
-  }
-  
-
-
-
-
-  /*
-
-  double CalcTetBadness (const Point3d & p1, const Point3d & p2,
-  const Point3d & p3, const Point3d & p4, double h)
-  {
-  double vol, l;
-  double err;
-
-
-  Vec3d v1 (p1, p2);
-  Vec3d v2 (p1, p3);
-  Vec3d v3 (p1, p4);
-
-  vol = -Determinant (v1, v2, v3) / 6;
-
-  double l1 = v1.Length();
-  double l2 = v2.Length();
-  double l3 = v3.Length();
-  double l4 = Dist (p2, p3);
-  double l5 = Dist (p2, p4);
-  double l6 = Dist (p3, p4);
-
-  l = l1 + l2 + l3 + l4 + l5 + l6;
-
-  // just for timing
-  // l += 1e-40 * CalcTetBadnessNew (p1, p2, p3, p4, h);
-
-  if (vol <= 1e-24 * l * l * l)
-  { 
-  return 1e24;
-  }
-
-  err = (l*l*l) / (1832.82 * vol);    // 6^4 * sqrt(2)
-  
-  if (h > 0)
-  err += l / h + 
-  h * (1 / l1 + 1/l2 + 1/l3 + 1/l4 + 1/l5 + 1/l6) - 12;
-
-  return pow (err, teterrpow);
-  }
-
-
-  
-  double CalcTetBadnessGrad (const Point3d & p1, const Point3d & p2,
-  const Point3d & p3, const Point3d & p4, double h,
-  int pi, Vec3d & grad)
-  {
-  double vol, l;
-  double err;
-
-  const Point3d *pp1, *pp2, *pp3, *pp4;
-
-  pp1 = &p1;
-  pp2 = &p2;
-  pp3 = &p3;
-  pp4 = &p4;
-  
-  switch (pi)
-  {
-  case 2:
-  {
-  swap (pp1, pp2);
-  swap (pp3, pp4);
-  break;
-  }
-  case 3:
-  {
-  swap (pp1, pp3);
-  swap (pp2, pp4);
-  break;
-  }
-  case 4:
-  {
-  swap (pp1, pp4);
-  swap (pp3, pp2);
-  break;
-  }
-  }
-  
-
-  Vec3d v1 (*pp1, *pp2);
-  Vec3d v2 (*pp1, *pp3);
-  Vec3d v3 (*pp1, *pp4);
-
-  Vec3d v4 (*pp2, *pp3);
-  Vec3d v5 (*pp2, *pp4);
-  Vec3d v6 (*pp3, *pp4);
-
-
-  //   Vec3d n;
-  //   Cross (v1, v2, n);
-  //   vol = - (n * v3) / 6;
-
-
-  vol = -Determinant (v1, v2, v3) / 6;  
-
-  Vec3d gradvol;
-  Cross (v5, v4, gradvol);
-  gradvol *= (-1.0/6.0);
-
-
-  double l1 = v1.Length();
-  double l2 = v2.Length();
-  double l3 = v3.Length();
-  double l4 = v4.Length();
-  double l5 = v5.Length();
-  double l6 = v6.Length();
-
-  l = l1 + l2 + l3 +l4 + l5 + l6;
-
-  Vec3d gradl1 (*pp2, *pp1);
-  Vec3d gradl2 (*pp3, *pp1);
-  Vec3d gradl3 (*pp4, *pp1);
-  gradl1 /= l1;
-  gradl2 /= l2;
-  gradl3 /= l3;
-
-  Vec3d gradl (gradl1);
-  gradl += gradl2;
-  gradl += gradl3;
-
-
-  if (vol <= 1e-24 * l * l * l)
-  { 
-  grad = Vec3d (0, 0, 0);
-  return 1e24;
-  }
-
-
-  double c1 = 1.0 / 1832.82;      // 6^4 * sqrt(2)
-  err = c1 * (l*l*l) / vol; 
-
-
-  gradl *= (c1 * 3 * l * l / vol);
-  Vec3d graderr(gradl);
-  gradvol *= ( -c1 * l * l * l / (vol * vol) );
-  graderr+= gradvol;
-  
-  if (h > 0)
-  {
-  err += l / h + 
-  h * ( 1 / l1 + 1 / l2 + 1 / l3 + 
-  1 / l4 + 1 / l5 + 1 / l6 ) - 12;
-
-  graderr += (1/h - h/(l1*l1)) * gradl1;
-  graderr += (1/h - h/(l2*l2)) * gradl2;
-  graderr += (1/h - h/(l3*l3)) * gradl3;
-  cout << "?";
-  }
-
-  double errpow = pow (err, teterrpow);
-  grad = (teterrpow * errpow / err) * graderr;
-  
-  return errpow;
-  }
-  
-  */
-
-
-
-
-  
-  /*
-    double CalcVolume (const ARRAY<Point3d> & points,
-    const Element & el)
-    {
-    Vec3d v1 = points.Get(el.PNum(2)) - 
-    points.Get(el.PNum(1));
-    Vec3d v2 = points.Get(el.PNum(3)) - 
-    points.Get(el.PNum(1));
-    Vec3d v3 = points.Get(el.PNum(4)) - 
-    points.Get(el.PNum(1)); 
-         
-    return -(Cross (v1, v2) * v3) / 6;	 
-    }  
-  */
-
-  double CalcVolume (const ARRAY<Point3d> & points, 
-		     const ARRAY<Element> & elements)
-  {
-    double vol;
-    Vec3d v1, v2, v3;
-  
-    vol = 0;
-    for (int i = 0; i < elements.Size(); i++)
-      {
-	v1 = points.Get(elements[i][1]) - points.Get(elements[i][0]);
-	v2 = points.Get(elements[i][2]) - points.Get(elements[i][0]);
-	v3 = points.Get(elements[i][3]) - points.Get(elements[i][0]);
-	vol -= (Cross (v1, v2) * v3) / 6;	 
-      }
-    return vol;
-  }
-
-  
-  
-
-  void MeshQuality3d (const Mesh & mesh, ARRAY<int> * inclass)
-  { 
-    int ncl = 20;
-    signed int cl;
-    ARRAY<INDEX> incl(ncl);
-    INDEX i;
-    double qual;
-    double sum = 0;
-    int nontet  = 0;
-
-    for (i = 1; i <= incl.Size(); i++)
-      incl.Elem(i) = 0;
-
-    for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-      {
-	if (mesh[ei].GetType() != TET)
-	  {
-	    nontet++;
-	    continue;
-	  }
-
-	qual = TetElementQuality (mesh.Point(mesh[ei][0]),
-				  mesh.Point(mesh[ei][1]),
-				  mesh.Point(mesh[ei][2]),
-				  mesh.Point(mesh[ei][3]));
-
-	if (qual > 1) qual = 1;
-	cl = int (ncl * qual ) + 1;
-     
-	if (cl < 1) cl = 1; 
-	if (cl > ncl) cl = ncl;
-
-	incl.Elem(cl)++;
-	if (inclass) (*inclass)[ei] = cl;
-	sum += 1/qual;
-      }
-
-    (*testout) << endl << endl;
-    (*testout) << "Points:           " << mesh.GetNP() << endl;
-    (*testout) << "Volume Elements:  " << mesh.GetNE() << endl;
-    if (nontet)
-      (*testout) << nontet << " non tetrahedral elements" << endl;
-    (*testout) << endl;
-
-    (*testout) << "Volume elements in qualityclasses:" << endl;
-    (*testout).precision(2);
-    for (i = 1; i <= ncl; i++)
-      {
-	(*testout) << setw(4) << double (i-1)/ncl << " - "
-		   << setw(4) << double (i) / ncl << ": "
-		   << incl.Get(i) << endl;
-      }
-    (*testout) << "total error: " << sum << endl;
-  }
-
-
-  void SaveEdges (const Mesh & mesh, const char * geomfile, double h, char * filename)
-  {
-    ofstream of (filename);
-    int i;
-    const Segment * seg;
-  
-    of << "edges" << endl;
-    of << geomfile << endl;
-    of << h << endl;
-
-    of << mesh.GetNP() << endl;
-    for (i = 1; i <= mesh.GetNP(); i++)
-      of << mesh.Point(i).X() << " "
-	 << mesh.Point(i).Y() << " "
-	 << mesh.Point(i).Z() << "\n";
-    
-    of << 2 * mesh.GetNSeg() << endl;
-    for (i = 1; i <= mesh.GetNSeg(); i++)
-      {
-	seg = &mesh.LineSegment(i);
-
-	of << seg->p2 << " " << seg->p1 << " " << seg->si << "\n";
-      }
-   
-  }
-
-
-  void SaveSurfaceMesh (const Mesh & mesh,
-			double h,
-			char * filename)
-
-  {
-    INDEX i;
-
-    ofstream outfile(filename);
-
-    outfile << "surfacemesh" << endl;
-    outfile << h << endl;
-
-    outfile << mesh.GetNP() << endl;
-    for (i = 1; i <= mesh.GetNP(); i++)
-      outfile << mesh.Point(i).X() << " "
-	      << mesh.Point(i).Y() << " "
-	      << mesh.Point(i).Z() << endl;
-
-  
-
-    outfile << mesh.GetNSE() << endl;
-    for (i = 1; i <= mesh.GetNSE(); i++)
-      {
-	const Element2d & el = mesh.SurfaceElement(i);
-
-	if (mesh.GetFaceDescriptor(el.GetIndex()).DomainOut() == 0)
-	  outfile << mesh.SurfaceElement(i).PNum(1) << " "
-		  << mesh.SurfaceElement(i).PNum(2) << " "
-		  << mesh.SurfaceElement(i).PNum(3) << endl;
-	if (mesh.GetFaceDescriptor(el.GetIndex()).DomainIn() == 0)
-	  outfile << mesh.SurfaceElement(i).PNum(1) << " "
-		  << mesh.SurfaceElement(i).PNum(3) << " "
-		  << mesh.SurfaceElement(i).PNum(2) << endl;
-      }
-  }
-
-
-#ifdef OLD
-  void Save2DMesh (
-		   const Mesh & mesh2d,
-		   const ARRAY<SplineSegment *> * splines,
-		   ostream & outfile)
-
-  {
-    int i, j;
-    outfile.precision (6);
-  
-    outfile << "areamesh2" << endl;
-
-
-    outfile << endl;
-    outfile << mesh2d.GetNSeg() << endl;
-    for (i = 1; i <= mesh2d.GetNSeg(); i++)
-      outfile << mesh2d.LineSegment(i).si << "        "
-	      << mesh2d.LineSegment(i).p1 << " "
-	      << mesh2d.LineSegment(i).p2 << "  " << endl;
-  
-
-    outfile << mesh2d.GetNSE() << endl;
-    for (i = 1; i <= mesh2d.GetNSE(); i++)
-      {
-	outfile << mesh2d.SurfaceElement(i).GetIndex() << "         ";
-	outfile << mesh2d.SurfaceElement(i).GetNP() << " ";
-	for (j = 1; j <= mesh2d.SurfaceElement(i).GetNP(); j++)
-	  outfile << mesh2d.SurfaceElement(i).PNum(j) << " ";
-	outfile << endl;
-      }
-
-    outfile << mesh2d.GetNP() << endl;
-    for (i = 1; i <= mesh2d.GetNP(); i++)
-      outfile << mesh2d.Point(i).X() << " "
-	      << mesh2d.Point(i).Y() << endl;
-
-    if (splines)
-      {
-	outfile << splines->Size() << endl;
-	for (i = 1; i <= splines->Size(); i++)
-	  splines->Get(i) -> PrintCoeff (outfile);
-      }
-    else
-      outfile << "0" << endl;
-  }
-#endif
-
-
-
-
-
-
-
-
-  void SaveVolumeMesh (const Mesh & mesh, 
-		       const CSGeometry & geometry,
-		       char * filename)
-  {
-    INDEX i;
-
-    ofstream outfile(filename);
-    outfile << "volumemesh" << endl;
-
-    outfile << mesh.GetNSE() << endl;
-    for (i = 1; i <= mesh.GetNSE(); i++)
-      {
-	if (mesh.SurfaceElement(i).GetIndex())
-	  outfile << mesh.GetFaceDescriptor(mesh.SurfaceElement(i).GetIndex ()).SurfNr()
-		  << "\t";
-	else
-	  outfile << "0" << "\t";
-	outfile << mesh.SurfaceElement(i)[0] << " "
-		<< mesh.SurfaceElement(i)[1] << " "
-		<< mesh.SurfaceElement(i)[2] << endl;
-      }
-    outfile << mesh.GetNE() << endl;
-    for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-      outfile << mesh[ei].GetIndex() << "\t"
-	      << mesh[ei][0] << " " << mesh[ei][1] << " "
-	      << mesh[ei][2] << " " << mesh[ei][3] << endl;
-
-    outfile << mesh.GetNP() << endl;
-    for (i = 1; i <= mesh.GetNP(); i++)
-      outfile << mesh.Point(i).X() << " "
-	      << mesh.Point(i).Y() << " "
-	      << mesh.Point(i).Z() << endl;
-
-#ifdef SOLIDGEOM
-    outfile << geometry.GetNSurf() << endl;
-    for (i = 1; i <= geometry.GetNSurf(); i++)
-      geometry.GetSurface(i) -> Print (outfile);
-#endif
-  }
-
-
-
-
-  int CheckCode ()
-  {
-    return 1;
-
-    /*
-      char st[100];
-      ifstream ist("pw");
-
-      if (!ist.good()) return 0;
-      ist >> st;
-      if (strcmp (st, "JKULinz") == 0) return 1;
-      return 0;
-    */
-  }
-
-
-
-  /* ******************** CheckMesh ******************************* */
-
-  /// Checks, whether mesh contains a valid 3d mesh
-  int CheckMesh3D (const Mesh & mesh)
-  {
-    INDEX_3_HASHTABLE<int> faceused(mesh.GetNE()/3);
-    INDEX i;
-    int j, k, l;
-    INDEX_3 i3;
-    int ok = 1;
-    ElementIndex ei;
-
-    for (i = 1; i <= mesh.GetNSE(); i++)
-      {
-	const Element2d & el = mesh.SurfaceElement(i);
-      
-	if (mesh.GetFaceDescriptor(el.GetIndex()).DomainIn() == 0 ||
-	    mesh.GetFaceDescriptor(el.GetIndex()).DomainOut() == 0)
-	  {
-	    for (j = 1; j <= 3; j++)
-	      i3.I(j) = el.PNum(j);
-	  
-	    i3.Sort();
-	    faceused.Set (i3, 1);
-	  }
-      }
-  
-    for (ei = 0; ei < mesh.GetNE(); ei++)
-      {
-	const Element & el = mesh[ei];
-
-	for (j = 1; j <= 4; j++)
-	  {
-	    l = 0;
-	    for (k = 1; k <= 4; k++)
-	      {
-		if (j != k)
-		  {
-		    l++;
-		    i3.I(l) = el.PNum(k);
-		  }
-	      }
-
-	    i3.Sort();
-	    if (faceused.Used(i3))
-	      faceused.Set(i3, faceused.Get(i3)+1);
-	    else
-	      faceused.Set (i3, 1);
-	  }
-      }
-
-
-    for (i = 1; i <= mesh.GetNSE(); i++)
-      {
-	const Element2d & el = mesh.SurfaceElement(i);
-
-	for (j = 1; j <= 3; j++)
-	  i3.I(j) = el.PNum(j);
-      
-	i3.Sort();
-	k = faceused.Get (i3);
-	if (k != 2)
-	  {
-	    ok = 0;
-	    (*testout) << "face " << i << " with points " 
-		       << i3.I1() << "-" << i3.I2() << "-" << i3.I3() 
-		       << " has " << k << " elements" << endl;
-	  }
-      }
-  
-    for (ei = 0; ei < mesh.GetNE(); ei++)
-      {
-	const Element & el = mesh[ei];
-
-	for (j = 1; j <= 4; j++)
-	  {
-	    l = 0;
-	    for (k = 1; k <= 4; k++)
-	      {
-		if (j != k)
-		  {
-		    l++;
-		    i3.I(l) = el.PNum(k);
-		  }
-	      }
-
-	    i3.Sort();
-	    k = faceused.Get(i3);
-	    if (k != 2)
-	      {
-		ok = 0;
-		(*testout) << "element " << ei << " with face " 
-			   << i3.I1() << "-" << i3.I2() << "-"
-			   << i3.I3() 
-			   << " has " << k << " elements" << endl;
-	      }
-	  }
-      }
-
-
-
-
-
-    /*
-      for (i = 1; i <= faceused.GetNBags(); i++)
-      for (j = 1; j <= faceused.GetBagSize(i); j++)
-      {
-      faceused.GetData(i, j, i3, k);
-      if (k != 2)
-      {
-      (*testout) << "Face: " << i3.I1() << "-" 
-      << i3.I2() << "-" << i3.I3() << " has " 
-      << k << " Faces " << endl;
-      cerr << "Face Error" << endl;
-      ok = 0;
-      }
-      }
-    */
-
-
-    if (!ok)
-      {
-	(*testout) << "surfelements: " << endl;
-	for (i = 1; i <= mesh.GetNSE(); i++)
-	  {
-	    const Element2d & el = mesh.SurfaceElement(i);
-	    (*testout) << setw(5) << i << ":" 
-		       << setw(6) << el.GetIndex() 
-		       << setw(6) << el.PNum(1) 
-		       << setw(4) << el.PNum(2) 
-		       << setw(4) << el.PNum(3)  << endl;
-	  }
-	(*testout) << "volelements: " << endl;
-	for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-	  {
-	    const Element & el = mesh[ei];
-	    (*testout) << setw(5) << i << ":" 
-		       << setw(6) << el.GetIndex() 
-		       << setw(6) << el[0] << setw(4) << el[1]
-		       << setw(4) << el[2] << setw(4) << el[3] << endl;
-	  }
-      }
-
-
-    return ok;
-  }
-
-
-
-  void RemoveProblem (Mesh & mesh)
-  {
-    int i, j, k;
-  
-    mesh.FindOpenElements();
-    int np = mesh.GetNP();
-
-    BitArrayChar<PointIndex::BASE> ppoints(np);
-  
-    int ndom = mesh.GetNDomains();
-
-    PrintMessage (3, "Elements before Remove: ", mesh.GetNE());
-    for (k = 1; k <= ndom; k++)
-      {
-	ppoints.Clear();
-      
-	for (i = 1; i <= mesh.GetNOpenElements(); i++)
-	  {
-	    const Element2d & sel = mesh.OpenElement(i);
-	    if (sel.GetIndex() == k)
-	      {
-		for (j = 1; j <= sel.GetNP(); j++)
-		  ppoints.Set (sel.PNum(j));
-	      }
-	  }
-
-	for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-	  {
-	    const Element & el = mesh[ei];
-	    if (el.GetIndex() == k)
-	      {
-		int todel = 0;
-		for (j = 0; j < el.GetNP(); j++)
-		  if (ppoints.Test (el[j]))
-		    todel = 1;
-	      
-		if (el.GetNP() != 4)
-		  todel = 0;
-	      
-		if (todel)
-		  {
-		    mesh[ei].Delete();
-		    // ei--;
-		  }
-	      }
-	  }
-      }
-  
-    mesh.Compress();
-    PrintMessage (3, "Elements after Remove: ", mesh.GetNE());
-  }
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/meshtool.hpp b/contrib/Netgen/libsrc/meshing/meshtool.hpp
deleted file mode 100644
index 1baafe40ff4334537f4046e7be85ff804355e6b7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshtool.hpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef FILE_MESHTOOL
-#define FILE_MESHTOOL
-
-
-///
-extern void MeshQuality2d (const Mesh & mesh);
-
-///
-extern void MeshQuality3d (const Mesh & mesh,
-			   ARRAY<int> * inclass = NULL);
-
-///
-extern void SaveEdges (const Mesh & mesh, 
-		       const char * geomfile, 
-		       double h, 
-		       char * filename);
-
-///
-extern void SaveSurfaceMesh (const Mesh & mesh,
-			     double h,
-			     char * filename);
-/*
-///
-extern void Save2DMesh (
-         const Mesh & mesh2d,
-	 const ARRAY<class SplineSegment*> * splines,
-         ostream & outfile);
-*/
-
-class Surface;
-///
-extern void SaveVolumeMesh (
-         const ARRAY<Point3d> & points,
-         const ARRAY<Element> & elements,
-         const ARRAY<Element> & volelements,
-         const ARRAY<Surface*> & surfaces,
-         char * filename);
-
-///
-void SaveVolumeMesh (const Mesh & mesh, 
-		     const class CSGeometry & geometry,
-		     char * filename);
-
-///
-extern int CheckCode ();
-
-
-///
-extern double CalcTetBadness (const Point3d & p1, 
-			      const Point3d & p2,
-			      const Point3d & p3, 
-			      const Point3d & p4, 
-			      double h);
-///
-extern double CalcTetBadnessGrad (const Point3d & p1, 
-				const Point3d & p2,
-				const Point3d & p3, 
-				const Point3d & p4, 
-				double h, int pi,
-				Vec3d & grad);
-
-
-/** Calculates volume of an element.
-  The volume of the tetrahedron el is computed
- */
-// extern double CalcVolume (const ARRAY<Point3d> & points,
-//        const Element & el);  
-
-/** The total volume of all elements is computed.
-  This function calculates the volume of the mesh */
-extern double CalcVolume (const ARRAY<Point3d> & points, 
-	const ARRAY<Element> & elements);
-
-///
-extern int CheckSurfaceMesh (const Mesh & mesh);
-
-///
-extern int CheckSurfaceMesh2 (const Mesh & mesh);
-///
-extern int CheckMesh3D (const Mesh & mesh);
-///
-extern void RemoveProblem (Mesh & mesh);
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/meshtype.cpp b/contrib/Netgen/libsrc/meshing/meshtype.cpp
deleted file mode 100644
index e26a0b48ce71e8cc1916e58e872d63833fb19894..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshtype.cpp
+++ /dev/null
@@ -1,2233 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-
-
-
-  MultiPointGeomInfo :: MultiPointGeomInfo()
-  {
-    cnt = 0;
-  }
-
-  int MultiPointGeomInfo :: 
-  AddPointGeomInfo (const PointGeomInfo & gi)
-  {
-    for (int k = 0; k < cnt; k++)
-      if (mgi[k].trignum == gi.trignum)
-	return 0;
-  
-    if (cnt < MULTIPOINTGEOMINFO_MAX)
-      {
-	mgi[cnt] = gi;
-	cnt++;
-	return 0;
-      }
-
-    throw NgException ("Please report error: MPGI Size too small\n");
-  }
-  
-
-  void MultiPointGeomInfo :: 
-  Init ()
-  {
-    cnt = 0;
-  }
-
-  void MultiPointGeomInfo :: 
-  DeleteAll ()
-  {
-    cnt = 0;
-  }
-
-
-
-
-  Segment :: Segment() 
-  {
-    p1 = -1;
-    p2 = -1; 
-    edgenr = -1;
-
-    singedge_left = 0;
-    singedge_right = 0;
-    seginfo = 0;
-
-    si = -1;
-
-    domin = -1;
-    domout = -1;
-    tlosurf = -1;
-
-    surfnr1 = -1;
-    surfnr2 = -1;
-    pmid = -1;
-    meshdocval = 0;
-    /*
-    geominfo[0].trignum=-1; 
-    geominfo[1].trignum=-1; 
-
-    epgeominfo[0].edgenr = 1;
-    epgeominfo[0].dist = 0;
-    epgeominfo[1].edgenr = 1;
-    epgeominfo[1].dist = 0;
-    */
-  }    
-
-
-
-  Segment& Segment::operator=(const Segment & other)
-  {
-    p1 = other.p1;
-    p2 = other.p2;
-    edgenr = other.edgenr;
-    singedge_left = other.singedge_left;
-    singedge_right = other.singedge_right;
-    seginfo = other.seginfo;
-    si = other.si;
-    domin = other.domin;
-    domout = other.domout;
-    tlosurf = other.tlosurf;
-    geominfo[0] = other.geominfo[0];
-    geominfo[1] = other.geominfo[1];
-    surfnr1 = other.surfnr1;
-    surfnr2 = other.surfnr2;
-    epgeominfo[0] = other.epgeominfo[0];
-    epgeominfo[1] = other.epgeominfo[1];
-    pmid = other.pmid;
-    meshdocval = other.meshdocval;
-
-    return *this;
-  }
-
-
-  ostream & operator<<(ostream  & s, const Segment & seg)
-  {
-    s << seg.p1 << "(gi=" << seg.geominfo[0].trignum << ") - "
-      << seg.p2 << "(gi=" << seg.geominfo[1].trignum << ")"
-      << " si = " << seg.si;
-    return s;
-  }
-
-  Element2d :: Element2d (int anp)
-  { 
-    for (int i = 0; i < ELEMENT2D_MAXPOINTS; i++)
-      {
-	pnum[i] = 0;
-	geominfo[i].trignum = 0;
-      }
-    np = anp;
-    index = 0;
-    badel = 0;
-    deleted = 0;
-    switch (np)
-      {
-      case 3: typ = TRIG; break;
-      case 4: typ = QUAD; break;
-      case 6: typ = TRIG6; break;
-      case 8: typ = QUAD8; break;
-      }
-    order = 1;
-    refflag = 1;
-  } 
-
-  Element2d :: Element2d (ELEMENT_TYPE atyp)
-  { 
-    for (int i = 0; i < ELEMENT2D_MAXPOINTS; i++)
-      {
-	pnum[i] = 0;
-	geominfo[i].trignum = 0;
-      }
-
-    SetType (atyp);
-
-    index = 0;
-    badel = 0;
-    deleted = 0;
-    order = 1;
-    refflag = 1;
-  } 
-
-
-
-
-  Element2d :: Element2d (int pi1, int pi2, int pi3)
-{
-  pnum[0] = pi1;
-  pnum[1] = pi2;
-  pnum[2] = pi3;
-  np = 3;
-  typ = TRIG;
-  pnum[3] = 0;
-  pnum[4] = 0;
-  pnum[5] = 0;
-  
-  for (int i = 0; i < ELEMENT2D_MAXPOINTS; i++)
-    geominfo[i].trignum = 0;
-  index = 0;
-  badel = 0;
-  refflag = 1;
-  deleted = 0;
-  order = 1;
-}
-
-Element2d :: Element2d (int pi1, int pi2, int pi3, int pi4)
-{
-  pnum[0] = pi1;
-  pnum[1] = pi2;
-  pnum[2] = pi3;
-  pnum[3] = pi4;
-  np = 4;
-  typ = QUAD;
-
-  pnum[4] = 0;
-  pnum[5] = 0;
-  
-  for (int i = 0; i < ELEMENT2D_MAXPOINTS; i++)
-    geominfo[i].trignum = 0;
-  index = 0;
-  badel = 0;
-  refflag = 1;
-  deleted = 0;
-  order = 1;
-}
-
-
-/*
-void Element2d :: SetType (ELEMENT_TYPE atyp)
-{
-  typ = atyp;
-  switch (typ)
-    {
-    case TRIG: np = 3; break;
-    case QUAD: np = 4; break;
-    case TRIG6: np = 6; break;
-    case QUAD6: np = 6; break;
-    default:
-      PrintSysError ("Element2d::SetType, illegal type ", typ);
-    }
-}
-*/
-
-
-void Element2d :: GetBox (const T_POINTS & points, Box3d & box) const
-{
-  box.SetPoint (points.Get(pnum[0]));
-  for (unsigned i = 1; i < np; i++)
-    box.AddPoint (points.Get(pnum[i]));
-}
-
-void Element2d :: Invert2()
-{
-  switch (typ)
-    {
-    case TRIG:
-      {
-	Swap (pnum[1], pnum[2]);
-	break;
-      }
-    case QUAD:
-      {
-	Swap (pnum[0], pnum[3]);
-	Swap (pnum[1], pnum[2]);
-	break;
-      }
-    default:
-      {
-	cerr << "Element2d::Invert2, illegal element type " << int(typ) << endl;
-      }
-    }
-}
-
-int Element2d::HasFace(const Element2d& el) const
-{
-  //nur für tets!!! hannes
-  for (int i = 1; i <= 3; i++)
-    {
-      if (PNumMod(i)   == el[0] && 
-	  PNumMod(i+1) == el[1] && 
-	  PNumMod(i+2) == el[2])
-	{
-	  return 1;
-	}
-    }
-  return 0;
-}
-
-void Element2d :: NormalizeNumbering2 ()
-{
-  if (GetNP() == 3)
-    {
-      PointIndex pi1;
-      if (PNum(1) < PNum(2) && PNum(1) < PNum(3))
-	return;
-      else
-	{
-	  if (PNum(2) < PNum(3))
-	    {
-	      pi1 = PNum(2);
-	      PNum(2) = PNum(3);
-	      PNum(3) = PNum(1);
-	      PNum(1) = pi1;
-	    }
-	  else
-	    {
-	      pi1 = PNum(3);
-	      PNum(3) = PNum(2);
-	      PNum(2) = PNum(1);
-	      PNum(1) = pi1;
-	    }
-	}
-    }
-  else
-    {
-      int mini = 1;
-      for (int i = 2; i <= GetNP(); i++)
-	if (PNum(i) < PNum(mini)) mini = i;
-      
-      Element2d hel = (*this);
-      for (int i = 1; i <= GetNP(); i++)
-	PNum(i) = hel.PNumMod (i+mini-1);
-    }
-}
-
-
-
-
-ARRAY<IntegrationPointData*> ipdtrig;
-ARRAY<IntegrationPointData*> ipdquad;
-
-
-int Element2d :: GetNIP () const
-{
-  int nip;
-  switch (np)
-    {
-    case 3: nip = 1; break;
-    case 4: nip = 4; break;
-    default: nip = 0; break;
-    }
-  return nip;
-}
-
-void Element2d :: 
-GetIntegrationPoint (int ip, Point2d & p, double & weight) const
-{
-  static double eltriqp[1][3] =
-  {
-    { 1.0/3.0, 1.0/3.0, 0.5 }
-  };
-
-  static double elquadqp[4][3] =
-  { 
-    { 0, 0, 0.25 },
-    { 0, 1, 0.25 },
-    { 1, 0, 0.25 },
-    { 1, 1, 0.25 }
-  };
-  
-  double * pp = 0;
-  switch (typ)
-    {
-    case TRIG: pp = &eltriqp[0][0]; break;
-    case QUAD: pp = &elquadqp[ip-1][0]; break;
-    default:
-      PrintSysError ("Element2d::GetIntegrationPoint, illegal type ", typ);
-    }
-
-  p.X() = pp[0];
-  p.Y() = pp[1];
-  weight = pp[2];
-}
-
-void Element2d :: 
-GetTransformation (int ip, const ARRAY<Point2d> & points,
-		   DenseMatrix & trans) const
-{
-  int np = GetNP();
-  static DenseMatrix pmat(2, np), dshape(2, np);
-  pmat.SetSize (2, np);
-  dshape.SetSize (2, np);
-
-  Point2d p;
-  double w;
-
-  GetPointMatrix (points, pmat);
-  GetIntegrationPoint (ip, p, w);
-  GetDShape (p, dshape);
-  
-  CalcABt (pmat, dshape, trans);
-
-  /*
-  (*testout) << "p = " << p  << endl
-	     << "pmat = " << pmat << endl
-	     << "dshape = " << dshape << endl
-	     << "tans = " << trans << endl;
-  */
-}
-
-void Element2d :: 
-GetTransformation (int ip, class DenseMatrix & pmat,
-		   class DenseMatrix & trans) const
-{
-  int np = GetNP();
-
-#ifdef DEBUG
-  if (pmat.Width() != np || pmat.Height() != 2)
-    {
-      (*testout) << "GetTransofrmation: pmat doesn't fit" << endl;
-      return;
-    }
-#endif
-
-  ComputeIntegrationPointData ();
-  DenseMatrix * dshapep;
-  switch (typ)
-    {
-    case TRIG: dshapep = &ipdtrig.Get(ip)->dshape; break;
-    case QUAD: dshapep = &ipdquad.Get(ip)->dshape; break;
-    default:
-      PrintSysError ("Element2d::GetTransformation, illegal type ", typ);
-    }
-  
-  CalcABt (pmat, *dshapep, trans);
-}
-
-
-
-void Element2d :: GetShape (const Point2d & p, Vector & shape) const
-{
-  if (shape.Size() != GetNP())
-    {
-      cerr << "Element::GetShape: Length not fitting" << endl;
-      return;
-    }
-
-  switch (typ)
-    {
-    case TRIG:
-      shape.Elem(1) = 1 - p.X() - p.Y();
-      shape.Elem(2) = p.X();
-      shape.Elem(3) = p.Y();
-      break;
-    case QUAD:
-      shape.Elem(1) = (1-p.X()) * (1-p.Y());
-      shape.Elem(2) = p.X() * (1-p.Y());
-      shape.Elem(3) = p.X() * p.Y();
-      shape.Elem(4) = (1-p.X()) * p.Y();
-      break;
-    default:
-      PrintSysError ("Element2d::GetShape, illegal type ", typ);
-    }
-}
-
-void Element2d :: 
-GetDShape (const Point2d & p, DenseMatrix & dshape) const
-{
-#ifdef DEBUG
-  if (dshape.Height() != 2 || dshape.Width() != np)
-    {
-      PrintSysError ("Element::DShape: Sizes don't fit");
-      return;
-    }
-#endif
-
-  switch (typ)
-    {
-    case TRIG:
-      dshape.Elem(1, 1) = -1;
-      dshape.Elem(1, 2) = 1;
-      dshape.Elem(1, 3) = 0;
-      dshape.Elem(2, 1) = -1;
-      dshape.Elem(2, 2) = 0;
-      dshape.Elem(2, 3) = 1;
-      break;
-    case QUAD:
-      dshape.Elem(1, 1) = -(1-p.Y());
-      dshape.Elem(1, 2) = (1-p.Y());
-      dshape.Elem(1, 3) = p.Y();
-      dshape.Elem(1, 4) = -p.Y();
-      dshape.Elem(2, 1) = -(1-p.X());
-      dshape.Elem(2, 2) = -p.X();
-      dshape.Elem(2, 3) = p.X();
-      dshape.Elem(2, 4) = (1-p.X());
-      break;
-
-    default:
-      PrintSysError ("Element2d::GetDShape, illegal type ", typ);
-    }
-}
-
-
-void Element2d :: 
-GetPointMatrix (const ARRAY<Point2d> & points,
-		DenseMatrix & pmat) const
-{
-  int np = GetNP();
-
-#ifdef DEBUG
-  if (pmat.Width() != np || pmat.Height() != 2)
-    {
-      cerr << "Element::GetPointMatrix: sizes don't fit" << endl;
-      return;
-    }
-#endif
-  
-  for (int i = 1; i <= np; i++)
-    {
-      const Point2d & p = points.Get(PNum(i));
-      pmat.Elem(1, i) = p.X();
-      pmat.Elem(2, i) = p.Y();
-    }
-}
-
-
-
-
-
-double Element2d :: CalcJacobianBadness (const ARRAY<Point2d> & points) const
-{
-  int i, j;
-  int nip = GetNIP();
-  static DenseMatrix trans(2,2);
-  static DenseMatrix pmat;
-  
-  pmat.SetSize (2, GetNP());
-  GetPointMatrix (points, pmat);
-
-  double err = 0;
-  for (i = 1; i <= nip; i++)
-    {
-      GetTransformation (i, pmat, trans);
-
-      // Frobenius norm
-      double frob = 0;
-      for (j = 1; j <= 4; j++)
-	frob += sqr (trans.Get(j));
-      frob = sqrt (frob);
-      frob /= 2;
-
-      double det = trans.Det();
-
-      if (det <= 0)
-	err += 1e12;
-      else
-	err += frob * frob / det;
-    }
-
-  err /= nip;
-  return err;
-}
-
-
-
-static const int qip_table[4][4] =
-  { { 0, 1, 0, 3 },
-    { 0, 1, 1, 2 },
-    { 3, 2, 0, 3 },
-    { 3, 2, 1, 2 }
-  };
-
-double Element2d :: 
-CalcJacobianBadnessDirDeriv (const ARRAY<Point2d> & points,
-			     int pi, Vec2d & dir, double & dd) const
-{
-  if (typ == QUAD)
-    {
-      Mat<2,2> trans, dtrans;
-      Mat<2,4> vmat, pmat;
-      
-      for (int j = 0; j < 4; j++)
-	{
-	  const Point2d & p = points.Get( (*this)[j] );
-	  pmat(0, j) = p.X();
-	  pmat(1, j) = p.Y();
-	}
-
-      vmat = 0.0;
-      vmat(0, pi-1) = dir.X();
-      vmat(1, pi-1) = dir.Y();
-      
-      double err = 0;
-      dd = 0;
-
-      for (int i = 0; i < 4; i++)
-	{
-	  int ix1 = qip_table[i][0];
-	  int ix2 = qip_table[i][1];
-	  int iy1 = qip_table[i][2];
-	  int iy2 = qip_table[i][3];
-	      
-	  trans(0,0) = pmat(0, ix2) - pmat(0,ix1);
-	  trans(1,0) = pmat(1, ix2) - pmat(1,ix1);
-	  trans(0,1) = pmat(0, iy2) - pmat(0,iy1);
-	  trans(1,1) = pmat(1, iy2) - pmat(1,iy1);
-
-	  double det = trans(0,0)*trans(1,1)-trans(1,0)*trans(0,1);
-
-	  if (det <= 0)
-	    {
-	      dd = 0;
-	      return 1e12;
-	    }
-	  
-	  dtrans(0,0) = vmat(0, ix2) - vmat(0,ix1);
-	  dtrans(1,0) = vmat(1, ix2) - vmat(1,ix1);
-	  dtrans(0,1) = vmat(0, iy2) - vmat(0,iy1);
-	  dtrans(1,1) = vmat(1, iy2) - vmat(1,iy1);
-
-
-	  // Frobenius norm
-	  double frob = 0;
-	  for (int j = 0; j < 4; j++) 
-	    frob += sqr (trans(j));
-	  frob = sqrt (frob);
-	  
-	  double dfrob = 0;
-	  for (int j = 0; j < 4; j++)
-	    dfrob += trans(j) * dtrans(j);
-	  dfrob = dfrob / frob;
-	  
-	  frob /= 2;      
-	  dfrob /= 2;
-	  
-	  
-	  // ddet = \sum_j det (m_j)   with m_j = trans, except col j = dtrans
-	  double ddet 
-	    = dtrans(0,0) * trans(1,1) - trans(0,1) * dtrans(1,0)
-	    + trans(0,0) * dtrans(1,1) - dtrans(0,1) * trans(1,0);
-	  
-	  err += frob * frob / det;
-	  dd += (2 * frob * dfrob * det - frob * frob * ddet) / (det * det);
-	}
-      
-      err /= 4;
-      dd /= 4;
-      return err;
-    }
-
-  int nip = GetNIP();
-  static DenseMatrix trans(2,2), dtrans(2,2);
-  static DenseMatrix pmat, vmat;
-  
-  pmat.SetSize (2, GetNP());
-  vmat.SetSize (2, GetNP());
-
-  GetPointMatrix (points, pmat);
-  
-  vmat = 0.0;
-  vmat.Elem(1, pi) = dir.X();
-  vmat.Elem(2, pi) = dir.Y();
-
-
-  double err = 0;
-  dd = 0;
-
-  for (int i = 1; i <= nip; i++)
-    {
-      GetTransformation (i, pmat, trans);
-      GetTransformation (i, vmat, dtrans);
-
-      // Frobenius norm
-      double frob = 0;
-      for (int j = 1; j <= 4; j++)
-	frob += sqr (trans.Get(j));
-      frob = sqrt (frob);
-      
-      double dfrob = 0;
-      for (int j = 1; j <= 4; j++)
-	dfrob += trans.Get(j) * dtrans.Get(j);
-      dfrob = dfrob / frob;
-      
-      frob /= 2;      
-      dfrob /= 2;
-      
-      double det = trans(0,0)*trans(1,1)-trans(1,0)*trans(0,1);
-
-      // ddet = \sum_j det (m_j)   with m_j = trans, except col j = dtrans
-      double ddet 
-	= dtrans(0,0) * trans(1,1) - trans(0,1) * dtrans(1,0)
-	+ trans(0,0) * dtrans(1,1) - dtrans(0,1) * trans(1,0);
-
-      if (det <= 0)
-	err += 1e12;
-      else
-	{
-	  err += frob * frob / det;
-	  dd += (2 * frob * dfrob * det - frob * frob * ddet) / (det * det);
-	}
-    }
-
-  err /= nip;
-  dd /= nip;
-  return err;
-}
-
-
-
-double Element2d :: 
-CalcJacobianBadness (const T_POINTS & points, const Vec3d & n) const
-{
-  int i, j;
-  int nip = GetNIP();
-  static DenseMatrix trans(2,2);
-  static DenseMatrix pmat;
-  
-  pmat.SetSize (2, GetNP());
-
-  Vec3d t1, t2;
-  n.GetNormal(t1);
-  Cross (n, t1, t2);
-
-  for (i = 1; i <= nip; i++)
-    {
-      const Point3d & p = points.Get(PNum(i));
-      pmat.Elem(1, i) = p.X() * t1.X() + p.Y() * t1.Y() + p.Z() * t1.Z();
-      pmat.Elem(2, i) = p.X() * t2.X() + p.Y() * t2.Y() + p.Z() * t2.Z();
-    }
-
-  double err = 0;
-  for (i = 1; i <= nip; i++)
-    {
-      GetTransformation (i, pmat, trans);
-
-      // Frobenius norm
-      double frob = 0;
-      for (j = 1; j <= 4; j++)
-	frob += sqr (trans.Get(j));
-      frob = sqrt (frob);
-      frob /= 2;
-
-      double det = trans.Det();
-      if (det <= 0)
-	err += 1e12;
-      else
-	err += frob * frob / det;
-    }
-
-  err /= nip;
-  return err;
-}
-
-
-
-void Element2d :: ComputeIntegrationPointData () const
-{
-  switch (np)
-    {
-    case 3: if (ipdtrig.Size()) return; break;
-    case 4: if (ipdquad.Size()) return; break;
-    }
-
-  for (int i = 1; i <= GetNIP(); i++)
-    {
-      IntegrationPointData * ipd = new IntegrationPointData;
-      Point2d hp;
-      GetIntegrationPoint (i, hp, ipd->weight);
-      ipd->p.X() = hp.X();
-      ipd->p.Y() = hp.Y();
-      ipd->p.Z() = 0;
-
-      ipd->shape.SetSize(GetNP());
-      ipd->dshape.SetSize(2, GetNP());
-
-      GetShape (hp, ipd->shape);
-      GetDShape (hp, ipd->dshape);
-
-      switch (np)
-	{
-	case 3: ipdtrig.Append (ipd); break;
-	case 4: ipdquad.Append (ipd); break;
-	}
-    }
-}
-
-
-
-
-
-
-
-
-
-
-ostream & operator<<(ostream  & s, const Element2d & el)
-{
-  s << "np = " << el.GetNP();
-  for (int j = 1; j <= el.GetNP(); j++)
-    s << " " << el.PNum(j);
-  return s;
-}
-
-
-ostream & operator<<(ostream  & s, const Element & el)
-{
-  s << "np = " << el.GetNP();
-  for (int j = 0; j < el.GetNP(); j++)
-    s << " " << int(el[j]);
-  return s;
-}
-
-
-Element :: Element ()
-{
-  typ = TET;
-  np = 4;
-  for (int i = 0; i < ELEMENT_MAXPOINTS; i++)
-    pnum[i] = 0;
-  index = 0;
-  flags.marked = 1;
-  flags.badel = 0;
-  flags.reverse = 0;
-  flags.illegal = 0;
-  flags.illegal_valid = 0;
-  flags.badness_valid = 0;
-  flags.refflag = 1;
-  flags.deleted = 0;
-  order = 1;
-  partitionNumber = -1;
-}
-
-
-Element :: Element (int anp)
-{
-  np = anp;
-  int i;
-  for (i = 0; i < ELEMENT_MAXPOINTS; i++)
-    pnum[i] = 0;
-  index = 0;
-  flags.marked = 1;
-  flags.badel = 0;
-  flags.reverse = 0;
-  flags.illegal = 0;
-  flags.illegal_valid = 0;
-  flags.badness_valid = 0;
-  flags.refflag = 1;
-  flags.deleted = 0;
-  switch (np)
-    {
-    case 4: typ = TET; break;
-    case 5: typ = PYRAMID; break;
-    case 6: typ = PRISM; break;
-    case 8: typ = HEX; break;
-    case 10: typ = TET10; break;
-    default: cerr << "Element::Element: unknown element with " << np << " points" << endl;
-    }
-  order = 1;
-}
-
-
-Element :: Element (ELEMENT_TYPE type)
-{
-  SetType (type);
-
-  int i;
-  for (i = 0; i < ELEMENT_MAXPOINTS; i++)
-    pnum[i] = 0;
-  index = 0;
-  flags.marked = 1;
-  flags.badel = 0;
-  flags.reverse = 0;
-  flags.illegal = 0;
-  flags.illegal_valid = 0;
-  flags.badness_valid = 0;
-  flags.refflag = 1;
-  flags.deleted = 0;
-  order = 1;
-}
-
-
-
-
-
-Element & Element :: operator= (const Element & el2)
-{
-  typ = el2.typ;
-  np = el2.np;
-  for (int i = 0; i < ELEMENT_MAXPOINTS; i++)
-    pnum[i] = el2.pnum[i];
-  index = el2.index;
-  flags = el2.flags;
-  order = el2.order;
-  hp_elnr = el2.hp_elnr;
-  return *this;
-}
-
-
-
-void Element :: SetNP (int anp)
-{
-  np = anp; 
-  switch (np)
-    {
-    case 4: typ = TET; break;
-    case 5: typ = PYRAMID; break;
-    case 6: typ = PRISM; break;
-    case 8: typ = HEX; break;
-    case 10: typ = TET10; break;
-      // 
-    default: break;
-      cerr << "Element::SetNP unknown element with " << np << " points" << endl;
-    }
-}
-
-
-
-void Element :: SetType (ELEMENT_TYPE atyp)
-{
-  typ = atyp;
-  switch (atyp)
-    {
-    case TET: np = 4; break;
-    case PYRAMID: np = 5; break;
-    case PRISM: np = 6; break;
-    case HEX: np = 8; break;
-    case TET10: np = 10; break;
-    case PRISM12: np = 12; break;
-    }
-}
-
-
-
-void Element :: Invert()
-{
-  switch (GetNP())
-    {
-    case 4:
-      {
-	Swap (PNum(3), PNum(4));
-	break;
-      }
-    case 5:
-      {
-	Swap (PNum(1), PNum(4));
-	Swap (PNum(2), PNum(3));
-	break;
-      }
-    case 6:
-      {
-	Swap (PNum(1), PNum(4));
-	Swap (PNum(2), PNum(5));
-	Swap (PNum(3), PNum(6));
-	break;
-      }
-    }
-}
-
-
-void Element :: Print (ostream & ost) const
-{
-  ost << np << " Points: ";
-  for (int i = 1; i <= np; i++)
-    ost << pnum[i-1] << " " << endl;
-}
-
-void Element :: GetBox (const T_POINTS & points, Box3d & box) const
-{
-  box.SetPoint (points.Get(PNum(1)));
-  box.AddPoint (points.Get(PNum(2)));
-  box.AddPoint (points.Get(PNum(3)));
-  box.AddPoint (points.Get(PNum(4)));
-}
-
-double Element :: Volume (const T_POINTS & points) const
-{
-  Vec3d v1 = points.Get(PNum(2)) - 
-    points.Get(PNum(1));
-  Vec3d v2 = points.Get(PNum(3)) - 
-    points.Get(PNum(1));
-  Vec3d v3 = points.Get(PNum(4)) - 
-    points.Get(PNum(1)); 
-         
-  return -(Cross (v1, v2) * v3) / 6;	 
-}  
-
-
-void Element :: GetFace2 (int i, Element2d & face) const
-{
-  static const int tetfaces[][5] = 
-  { { 3, 2, 3, 4, 0 },
-    { 3, 3, 1, 4, 0 },
-    { 3, 1, 2, 4, 0 },
-    { 3, 2, 1, 3, 0 } };
-
-  static const int pyramidfaces[][5] =
-  { { 4, 1, 4, 3, 2 },
-    { 3, 1, 2, 5, 0 },
-    { 3, 2, 3, 5, 0 },
-    { 3, 3, 4, 5, 0 },
-    { 3, 4, 1, 5, 0 } };
-
-  static const int prismfaces[][5] =
-  {
-    { 3, 1, 3, 2, 0 },
-    { 3, 4, 5, 6, 0 },
-    { 4, 1, 2, 5, 4 },
-    { 4, 2, 3, 6, 5 },
-    { 4, 3, 1, 4, 6 }
-  };
-
-  switch (np)
-    {
-    case 4: // tet
-    case 10: // tet
-      {
-	face.SetType(TRIG);
-	for (int j = 1; j <= 3; j++)
-	  face.PNum(j) = PNum(tetfaces[i-1][j]);
-	break;
-      }
-    case 5: // pyramid
-      {
-	// face.SetNP(pyramidfaces[i-1][0]);
-	face.SetType ( (i == 1) ? QUAD : TRIG);
-	for (int j = 1; j <= face.GetNP(); j++)
-	  face.PNum(j) = PNum(pyramidfaces[i-1][j]);
-	break;
-      }
-    case 6: // prism
-      {
-	//	face.SetNP(prismfaces[i-1][0]);
-	face.SetType ( (i >= 3) ? QUAD : TRIG);
-	for (int j = 1; j <= face.GetNP(); j++)
-	  face.PNum(j) = PNum(prismfaces[i-1][j]);
-	break;
-      }
-    }
-}
-
-
-
-void Element :: GetTets (ARRAY<Element> & locels) const
-{
-  GetTetsLocal (locels);
-  int i, j;
-  for (i = 1; i <= locels.Size(); i++)
-    for (j = 1; j <= 4; j++)
-      locels.Elem(i).PNum(j) = PNum ( locels.Elem(i).PNum(j) );
-}
-
-void Element :: GetTetsLocal (ARRAY<Element> & locels) const
-{
-  int i, j;
-  locels.SetSize(0);
-  switch (GetType())
-    {
-    case TET:
-      {
-	int linels[1][4] = 
-	{ { 1, 2, 3, 4 },
-	};
-	for (i = 0; i < 1; i++)
-	  {
-	    Element tet(4);
-	    for (j = 1; j <= 4; j++)
-	      tet.PNum(j) = linels[i][j-1];
-	    locels.Append (tet);
-	  }
-	break;
-      }
-    case TET10:
-      {
-	int linels[8][4] = 
-	{ { 1, 5, 6, 7 },
-	  { 5, 2, 8, 9 },
-	  { 6, 8, 3, 10 },
-	  { 7, 9, 10, 4 },
-	  { 5, 6, 7, 9 },
-	  { 5, 6, 9, 8 },
-	  { 6, 7, 9, 10 },
-	  { 6, 8, 10, 9 } };
-	for (i = 0; i < 8; i++)
-	  {
-	    Element tet(4);
-	    for (j = 1; j <= 4; j++)
-	      tet.PNum(j) = linels[i][j-1];
-	    locels.Append (tet);
-	  }
-	break;
-      }
-    case PYRAMID:
-      {
-	int linels[2][4] = 
-	{ { 1, 2, 3, 5 },
-	  { 1, 3, 4, 5 } };
-	for (i = 0; i < 2; i++)
-	  {
-	    Element tet(4);
-	    for (j = 1; j <= 4; j++)
-	      tet.PNum(j) = linels[i][j-1];
-	    locels.Append (tet);
-	  }
-	break;
-      }
-    case PRISM:
-    case PRISM12:
-      {
-	int linels[3][4] = 
-	{ { 1, 2, 3, 4 },
-	  { 4, 2, 3, 5 },
-	  { 6, 5, 4, 3 }
-	};
-	for (i = 0; i < 3; i++)
-	  {
-	    Element tet(4);
-	    for (j = 0; j < 4; j++)
-	      tet[j] = linels[i][j];
-	    locels.Append (tet);
-	  }
-	break;
-      }
-    case HEX:
-      {
-	int linels[6][4] = 
-	{ { 1, 7, 2, 3 },
-	  { 1, 7, 3, 4 },
-	  { 1, 7, 4, 8 },
-	  { 1, 7, 8, 5 },
-	  { 1, 7, 5, 6 },
-	  { 1, 7, 6, 2 }
-	};
-	for (i = 0; i < 6; i++)
-	  {
-	    Element tet(4);
-	    for (j = 0; j < 4; j++)
-	      tet[j] = linels[i][j];
-	    locels.Append (tet);
-	  }
-	break;
-      }
-    default:
-      {
-	cerr << "GetTetsLocal not implemented for el with " << GetNP() << " nodes" << endl;
-      }
-    }
-}
-
-void Element :: GetNodesLocal (ARRAY<Point3d> & points) const
-{
-  const static double tetpoints[4][3] =
-    { { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 }};
-  
-  const static double prismpoints[6][3] =
-    { { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 },
-      { 1, 0, 1 },
-      { 0, 1, 1 } };
-  
-  const static double pyramidpoints[6][3] =
-    { { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 1, 1, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 } };
-  
-  const static double tet10points[10][3] =
-    { { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 },
-      { 0.5, 0, 0 },
-      { 0, 0.5, 0 },
-      { 0, 0, 0.5 },
-      { 0.5, 0.5, 0 },
-      { 0.5, 0, 0.5 },
-      { 0, 0.5, 0.5 } };
-
-  const static double hexpoints[8][3] =
-    { 
-      { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 1, 1, 0 },
-      { 1, 0, 0 },
-      { 0, 0, 1 },
-      { 1, 0, 1 },
-      { 1, 1, 1 },
-      { 1, 0, 1 }
-    };
-  
-  int np, i;
-  const double (*pp)[3];
-  switch (GetType())
-    {
-    case TET:
-      {
-	np = 4;
-	pp = tetpoints;
-	break;
-      }
-    case PRISM:
-    case PRISM12:
-      {
-	np = 6;
-	pp = prismpoints;
-	break;
-      }
-    case TET10:
-      {
-	np = 10;
-	pp = tet10points;
-	break;
-      }
-    case PYRAMID:
-      {
-	np = 5;
-	pp = pyramidpoints;
-	break;
-      }
-    case HEX:
-      {
-	np = 8;
-	pp = hexpoints;
-	break;
-      }
-    default:
-      {
-	cout << "GetNodesLocal not impelemented for element " << GetType() << endl;
-	np = 0;
-      }
-    }
-  
-  points.SetSize(0);
-  for (i = 0; i < np; i++)
-    points.Append (Point3d (pp[i][0], pp[i][1], pp[i][2]));
-}
-
-
-
-
-
-
-
-void Element :: GetNodesLocalNew (ARRAY<Point3d> & points) const
-{
-  const static double tetpoints[4][3] =
-    {      
-      { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 },
-      { 0, 0, 0 }
-    };
-  
-  const static double prismpoints[6][3] =
-    {
-      { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 0 },
-      { 1, 0, 1 },
-      { 0, 1, 1 },
-      { 0, 0, 1 }
-    };
-  
-  const static double pyramidpoints[6][3] =
-    { { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 1, 1, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 } };
-  
-  const static double tet10points[10][3] =
-    { { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 },
-      { 0.5, 0, 0 },
-      { 0, 0.5, 0 },
-      { 0, 0, 0.5 },
-      { 0.5, 0.5, 0 },
-      { 0.5, 0, 0.5 },
-      { 0, 0.5, 0.5 } };
-
-  const static double hexpoints[8][3] =
-    { 
-      { 0, 0, 0 },
-      { 1, 0, 0 },
-      { 1, 1, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 },
-      { 1, 0, 1 },
-      { 1, 1, 1 },
-      { 0, 1, 1 }
-    };
-  
-
-  
-  int np, i;
-  const double (*pp)[3];
-  switch (GetType())
-    {
-    case TET:
-      {
-	np = 4;
-	pp = tetpoints;
-	break;
-      }
-    case PRISM:
-    case PRISM12:
-      {
-	np = 6;
-	pp = prismpoints;
-	break;
-      }
-    case TET10:
-      {
-	np = 10;
-	pp = tet10points;
-	break;
-      }
-    case PYRAMID:
-      {
-	np = 5;
-	pp = pyramidpoints;
-	break;
-      }
-    case HEX:
-      {
-	np = 8;
-	pp = hexpoints;
-	break;
-      }
-    default:
-      {
-	cout << "GetNodesLocal not impelemented for element " << GetType() << endl;
-	np = 0;
-      }
-    }
-  
-  points.SetSize(0);
-  for (i = 0; i < np; i++)
-    points.Append (Point3d (pp[i][0], pp[i][1], pp[i][2]));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void Element :: GetSurfaceTriangles (ARRAY<Element2d> & surftrigs) const
-{
-  static int tet4trigs[][3] = 
-  { { 2, 3, 4 },
-    { 3, 1, 4 },
-    { 1, 2, 4 },
-    { 2, 1, 3 } };
-
-  // just a few:
-  static int tet10trigs[][3] = 
-  { { 2, 8, 9 },
-    { 3, 10, 8},
-    { 4, 9, 10 },
-    { 9, 8, 10 },
-    { 3, 1, 4 },
-    { 1, 2, 4 },
-    { 2, 1, 3 } };
-
-  static int pyramidtrigs[][3] =
-  {
-    { 1, 3, 2 },
-    { 1, 4, 3 },
-    { 1, 2, 5 },
-    { 2, 3, 5 },
-    { 3, 4, 5 },
-    { 4, 1, 5 }
-  };
-
-  static int prismtrigs[][3] =
-    {
-      { 1, 3, 2 },
-      { 4, 5, 6 },
-      { 1, 2, 4 },
-      { 4, 2, 5 },
-      { 2, 3, 5 },
-      { 5, 3, 6 },
-      { 3, 1, 6 },
-      { 6, 1, 4 }
-    };
-  
-  static int hextrigs[][3] = 
-    {
-      { 1, 3, 2 },
-      { 1, 4, 3 }, 
-      { 5, 6, 7 },
-      { 5, 7, 8 },
-      { 1, 2, 6 },
-      { 1, 6, 5 },
-      { 2, 3, 7 },
-      { 2, 7, 6 },
-      { 3, 4, 8 },
-      { 3, 8, 7 },
-      { 4, 1, 8 },
-      { 1, 5, 8 }
-    };
-
-  int j;
-
-  int nf;
-  int (*fp)[3];
-
-  switch (GetType())
-    {
-    case TET:
-      {
-	nf = 4;
-	fp = tet4trigs;
-	break;
-      }
-    case PYRAMID:
-      {
-	nf = 6;
-	fp = pyramidtrigs;
-	break;
-      }
-    case PRISM:
-    case PRISM12:
-      {
-	nf = 8;
-	fp = prismtrigs;
-	break;
-      }
-    case TET10:
-      {
-	nf = 7;
-	fp = tet10trigs;
-	break;
-      }
-    case HEX:
-      {
-	nf = 12;
-	fp = hextrigs;
-	break;
-      }
-    default:
-      {
-	nf = 0;
-	fp = NULL;
-      }
-    }
-
-  
-  surftrigs.SetSize (nf);
-  for (j = 0; j < nf; j++)
-    {
-      surftrigs.Elem(j+1) = Element2d(3);
-      surftrigs.Elem(j+1).PNum(1) = fp[j][0];
-      surftrigs.Elem(j+1).PNum(2) = fp[j][1];
-      surftrigs.Elem(j+1).PNum(3) = fp[j][2];
-    }
-}
-
-
-
-
-
-ARRAY<IntegrationPointData*> ipdtet;
-ARRAY<IntegrationPointData*> ipdtet10;
-
-
-int Element :: GetNIP () const
-{
-  int nip;
-  switch (typ)
-    {
-    case TET: nip = 1; break;
-    case TET10: nip = 8; break;
-    default: nip = 0; break;
-    }
-  return nip;
-}
-
-void Element :: 
-GetIntegrationPoint (int ip, Point3d & p, double & weight) const
-{
-  static double eltetqp[1][4] =
-  {
-    { 0.25, 0.25, 0.25, 1.0/6.0 }
-  };
-
-  static double eltet10qp[8][4] =
-  {
-    { 0.585410196624969, 0.138196601125011, 0.138196601125011, 1.0/24.0 },
-    { 0.138196601125011, 0.585410196624969, 0.138196601125011, 1.0/24.0 },
-    { 0.138196601125011, 0.138196601125011, 0.585410196624969, 1.0/24.0 },
-    { 0.138196601125011, 0.138196601125011, 0.138196601125011, 1.0/24.0 },
-    { 1, 0, 0, 1 },
-    { 0, 1, 0, 1 },
-    { 0, 0, 1, 1 },
-    { 0, 0, 0, 1 },
-  };
-  
-  double * pp;
-  switch (typ)
-    {
-    case TET: pp = &eltetqp[0][0]; break;
-    case TET10: pp = &eltet10qp[ip-1][0]; break;
-    }
-
-  p.X() = pp[0];
-  p.Y() = pp[1];
-  p.Z() = pp[2];
-  weight = pp[3];
-}
-
-void Element :: 
-GetTransformation (int ip, const T_POINTS & points,
-		   DenseMatrix & trans) const
-{
-  int np = GetNP();
-  static DenseMatrix pmat(3, np), dshape(3, np);
-  pmat.SetSize (3, np);
-  dshape.SetSize (3, np);
-
-  Point3d p;
-  double w;
-
-  GetPointMatrix (points, pmat);
-  GetIntegrationPoint (ip, p, w);
-  GetDShape (p, dshape);
-  
-  CalcABt (pmat, dshape, trans);
-
-  /*
-  (*testout) << "p = " << p  << endl
-	     << "pmat = " << pmat << endl
-	     << "dshape = " << dshape << endl
-	     << "tans = " << trans << endl;
-  */
-}
-
-void Element :: 
-GetTransformation (int ip, class DenseMatrix & pmat,
-		   class DenseMatrix & trans) const
-{
-  int np = GetNP();
-
-  if (pmat.Width() != np || pmat.Height() != 3)
-    {
-      (*testout) << "GetTransofrmation: pmat doesn't fit" << endl;
-      return;
-    }
-
-  ComputeIntegrationPointData ();
-  DenseMatrix * dshapep;
-  switch (GetType())
-    {
-    case TET: dshapep = &ipdtet.Get(ip)->dshape; break;
-    case TET10: dshapep = &ipdtet10.Get(ip)->dshape; break;
-    }
-  
-  CalcABt (pmat, *dshapep, trans);
-}
-
-
-
-void Element :: GetShape (const Point3d & p, Vector & shape) const
-{
-  if (shape.Size() != GetNP())
-    {
-      cerr << "Element::GetShape: Length not fitting" << endl;
-      return;
-    }
-
-  switch (typ)
-    {
-    case TET:
-      {
-	shape.Elem(1) = 1 - p.X() - p.Y() - p.Z(); 
-	shape.Elem(2) = p.X();
-	shape.Elem(3) = p.Y();
-	shape.Elem(4) = p.Z();
-	break;
-      }
-    case TET10:
-      {
-	double lam1 = 1 - p.X() - p.Y() - p.Z();
-	double lam2 = p.X();
-	double lam3 = p.Y();
-	double lam4 = p.Z();
-	
-	shape.Elem(5) = 4 * lam1 * lam2;
-	shape.Elem(6) = 4 * lam1 * lam3;
-	shape.Elem(7) = 4 * lam1 * lam4;
-	shape.Elem(8) = 4 * lam2 * lam3;
-	shape.Elem(9) = 4 * lam2 * lam4;
-	shape.Elem(10) = 4 * lam3 * lam4;
-	
-	shape.Elem(1) = lam1 - 
-	  0.5 * (shape.Elem(5) + shape.Elem(6) + shape.Elem(7));
-	shape.Elem(2) = lam2 - 
-	  0.5 * (shape.Elem(5) + shape.Elem(8) + shape.Elem(9));
-	shape.Elem(3) = lam3 - 
-	  0.5 * (shape.Elem(6) + shape.Elem(8) + shape.Elem(10));
-	shape.Elem(4) = lam4 - 
-	  0.5 * (shape.Elem(7) + shape.Elem(9) + shape.Elem(10));
-	break;
-      }
-
-    case PRISM:
-      {
-	Point<3> hp = p; 
-	shape(0) = hp(0) * (1-hp(2));
-	shape(1) = hp(1) * (1-hp(2));
-	shape(2) = (1-hp(0)-hp(1)) * (1-hp(2));
-	shape(3) = hp(0) * hp(2);
-	shape(4) = hp(1) * hp(2);
-	shape(5) = (1-hp(0)-hp(1)) * hp(2);
-	break;
-      }
-    case HEX:
-      {
-	Point<3> hp = p; 
-	shape(0) = (1-hp(0))*(1-hp(1))*(1-hp(2));
-	shape(1) = (  hp(0))*(1-hp(1))*(1-hp(2));
-	shape(2) = (  hp(0))*(  hp(1))*(1-hp(2));
-	shape(3) = (1-hp(0))*(  hp(1))*(1-hp(2));
-	shape(4) = (1-hp(0))*(1-hp(1))*(  hp(2));
-	shape(5) = (  hp(0))*(1-hp(1))*(  hp(2));
-	shape(6) = (  hp(0))*(  hp(1))*(  hp(2));
-	shape(7) = (1-hp(0))*(  hp(1))*(  hp(2));
-	break;
-      }
-    }
-}
-
-
-void Element :: GetShapeNew (const Point<3> & p, FlatVector & shape) const
-{
-  /*
-  if (shape.Size() < GetNP())
-    {
-      cerr << "Element::GetShape: Length not fitting" << endl;
-      return;
-    }
-  */
-
-  switch (typ)
-    {
-    case TET:
-      {
-	shape(0) = p(0);
-	shape(1) = p(1);
-	shape(2) = p(2);
-	shape(3) = 1-p(0)-p(1)-p(2);
-	break;
-      }
-
-    case PYRAMID:
-      {
-	double noz = 1-p(2);
-	if (noz == 0.0) noz = 1e-10;
-
-	double xi  = p(0) / noz;
-	double eta = p(1) / noz;
-	shape(0) = (1-xi)*(1-eta) * (noz);
-	shape(1) = (  xi)*(1-eta) * (noz);
-	shape(2) = (  xi)*(  eta) * (noz);
-	shape(3) = (1-xi)*(  eta) * (noz);
-	shape(4) = p(2);
-	break;
-      }
-
-    case PRISM:
-      {
-	shape(0) = p(0) * (1-p(2));
-	shape(1) = p(1) * (1-p(2));
-	shape(2) = (1-p(0)-p(1)) * (1-p(2));
-	shape(3) = p(0) * p(2);
-	shape(4) = p(1) * p(2);
-	shape(5) = (1-p(0)-p(1)) * p(2);
-	break;
-      }
-    case HEX:
-      {
-	shape(0) = (1-p(0))*(1-p(1))*(1-p(2));
-	shape(1) = (  p(0))*(1-p(1))*(1-p(2));
-	shape(2) = (  p(0))*(  p(1))*(1-p(2));
-	shape(3) = (1-p(0))*(  p(1))*(1-p(2));
-	shape(4) = (1-p(0))*(1-p(1))*(  p(2));
-	shape(5) = (  p(0))*(1-p(1))*(  p(2));
-	shape(6) = (  p(0))*(  p(1))*(  p(2));
-	shape(7) = (1-p(0))*(  p(1))*(  p(2));
-	break;
-      }
-    }
-}
-
-
-
-
-void Element :: 
-GetDShape (const Point3d & p, DenseMatrix & dshape) const
-{
-  int np = GetNP();
-  if (dshape.Height() != 3 || dshape.Width() != np)
-    {
-      cerr << "Element::DShape: Sizes don't fit" << endl;
-      return;
-    }
-
-  int i, j;
-  double eps = 1e-6;
-  Vector shaper(np), shapel(np);
-
-  for (i = 1; i <= 3; i++)
-    {
-      Point3d pr(p), pl(p);
-      pr.X(i) += eps;
-      pl.X(i) -= eps;
-      
-      GetShape (pr, shaper);
-      GetShape (pl, shapel);
-      for (j = 1; j <= np; j++)
-	dshape.Elem(i, j) = (shaper.Get(j) - shapel.Get(j)) / (2 * eps);
-    }
-}
-
-
-
-void Element :: 
-GetDShapeNew (const Point<3> & p, MatrixFixWidth<3> & dshape) const
-{
-  switch (typ)
-    {
-    case TET:
-      {
-	dshape = 0;
-	dshape(0,0) = 1;
-	dshape(1,1) = 1;
-	dshape(2,2) = 1;
-	dshape(3,0) = -1;
-	dshape(3,1) = -1;
-	dshape(3,2) = -1;
-	break;
-      }
-    case PRISM:
-      {
-	dshape = 0;
-	dshape(0,0) = 1-p(2);
-	dshape(0,2) = -p(0);
-	dshape(1,1) = 1-p(2);
-	dshape(1,2) = -p(1);
-	dshape(2,0) = -(1-p(2));
-	dshape(2,1) = -(1-p(2));
-	dshape(2,2) = -(1-p(0)-p(1));
-
-	dshape(3,0) = p(2);
-	dshape(3,2) = p(0);
-	dshape(4,1) = p(2);
-	dshape(4,2) = p(1);
-	dshape(5,0) = -p(2);
-	dshape(5,1) = -p(2);
-	dshape(5,2) = 1-p(0)-p(1);
-	break;
-      }
-
-    default:
-      {
-	int np = GetNP();
-	double eps = 1e-6;
-	Vector shaper(np), shapel(np);
-	
-	for (int i = 1; i <= 3; i++)
-	  {
-	    Point3d pr(p), pl(p);
-	    pr.X(i) += eps;
-	    pl.X(i) -= eps;
-	    
-	    GetShapeNew (pr, shaper);
-	    GetShapeNew (pl, shapel);
-	    for (int j = 1; j <= np; j++)
-	      dshape.Elem(j, i) = (shaper.Get(j) - shapel.Get(j)) / (2 * eps);
-	  }
-      }
-    }
-}
-
-void Element :: 
-GetPointMatrix (const T_POINTS & points,
-		DenseMatrix & pmat) const
-{
-  int np = GetNP();
-  /*
-  if (pmat.Width() != np || pmat.Height() != 3)
-    {
-      cerr << "Element::GetPointMatrix: sizes don't fit" << endl;
-      return;
-    }
-  */
-  for (int i = 1; i <= np; i++)
-    {
-      const Point3d & p = points.Get(PNum(i));
-      pmat.Elem(1, i) = p.X();
-      pmat.Elem(2, i) = p.Y();
-      pmat.Elem(3, i) = p.Z();
-    }
-}
-
-
-
-
-
-
-double Element :: CalcJacobianBadness (const T_POINTS & points) const
-{
-  int i, j;
-  int nip = GetNIP();
-  static DenseMatrix trans(3,3);
-  static DenseMatrix pmat;
-  
-  pmat.SetSize (3, GetNP());
-  GetPointMatrix (points, pmat);
-
-  double err = 0;
-  for (i = 1; i <= nip; i++)
-    {
-      GetTransformation (i, pmat, trans);
-
-      // Frobenius norm
-      double frob = 0;
-      for (j = 1; j <= 9; j++)
-	frob += sqr (trans.Get(j));
-      frob = sqrt (frob);
-      frob /= 3;
-
-      double det = -trans.Det();
-      
-      if (det <= 0)
-	err += 1e12;
-      else
-	err += frob * frob * frob / det;
-    }
-
-  err /= nip;
-  return err;
-}
-
-double Element :: 
-CalcJacobianBadnessDirDeriv (const T_POINTS & points,
-			     int pi, Vec3d & dir, double & dd) const
-{
-  int i, j, k, l;
-  int nip = GetNIP();
-  static DenseMatrix trans(3,3), dtrans(3,3), hmat(3,3);
-  static DenseMatrix pmat, vmat;
-  
-  pmat.SetSize (3, GetNP());
-  vmat.SetSize (3, GetNP());
-
-  GetPointMatrix (points, pmat);
-  
-  for (i = 1; i <= np; i++)
-    for (j = 1; j <= 3; j++)
-      vmat.Elem(j, i) = 0;
-  for (j = 1; j <= 3; j++)
-    vmat.Elem(j, pi) = dir.X(j);
-
-
-
-  double err = 0;
-  dd = 0;
-
-  for (i = 1; i <= nip; i++)
-    {
-      GetTransformation (i, pmat, trans);
-      GetTransformation (i, vmat, dtrans);
-
-
-      // Frobenius norm
-      double frob = 0;
-      for (j = 1; j <= 9; j++)
-	frob += sqr (trans.Get(j));
-      frob = sqrt (frob);
-      
-      double dfrob = 0;
-      for (j = 1; j <= 9; j++)
-	dfrob += trans.Get(j) * dtrans.Get(j);
-      dfrob = dfrob / frob;
-      
-      frob /= 3;      
-      dfrob /= 3;
-
-      
-      double det = trans.Det();
-      double ddet = 0;
-      
-      for (j = 1; j <= 3; j++)
-	{
-	  hmat = trans;
-	  for (k = 1; k <= 3; k++)
-	    hmat.Elem(k, j) = dtrans.Get(k, j);
-	  ddet += hmat.Det();
-	}
-
-
-      det *= -1;
-      ddet *= -1;
-
-      
-      if (det <= 0)
-	err += 1e12;
-      else
-	{
-	  err += frob * frob * frob / det;
-	  dd += (3 * frob * frob * dfrob * det - frob * frob * frob * ddet) / (det * det);
-	}
-    }
-
-  err /= nip;
-  dd /= nip;
-  return err;
-}
-
-
-
-
-
-void Element :: ComputeIntegrationPointData () const
-{
-  switch (GetType())
-    {
-    case TET: if (ipdtet.Size()) return; break;
-    case TET10: if (ipdtet10.Size()) return; break;
-    default:
-      PrintSysError ("Element::ComputeIntegrationPoint, illegal type ", int(typ));
-    }
-
-  int i;
-  for (i = 1; i <= GetNIP(); i++)
-    {
-      IntegrationPointData * ipd = new IntegrationPointData;
-      GetIntegrationPoint (i, ipd->p, ipd->weight);
-      ipd->shape.SetSize(GetNP());
-      ipd->dshape.SetSize(3, GetNP());
-
-      GetShape (ipd->p, ipd->shape);
-      GetDShape (ipd->p, ipd->dshape);
-
-      switch (GetType())
-	{
-	case TET: ipdtet.Append (ipd); break;
-	case TET10: ipdtet10.Append (ipd); break;
-	default:
-	  PrintSysError ("Element::ComputeIntegrationPoint(2), illegal type ", int(typ));
-	}
-    }
-}
-
-
-
-
-
-
-
-
-FaceDescriptor ::  FaceDescriptor()
-{ 
-  surfnr = domin = domout  = bcprop = 0; 
-  domin_singular = domout_singular = 0;
-  tlosurf = -1;
-}
-
-FaceDescriptor :: 
-FaceDescriptor(int surfnri, int domini, int domouti, int tlosurfi)
-{ 
-  surfnr = surfnri; 
-  domin = domini; 
-  domout = domouti;
-  tlosurf = tlosurfi; 
-  bcprop = surfnri;
-  domin_singular = domout_singular = 0;
-}
-
-FaceDescriptor :: FaceDescriptor(const Segment & seg)
-{ 
-  surfnr = seg.si; 
-  domin = seg.domin+1;
-  domout = seg.domout+1;
-  tlosurf = seg.tlosurf+1;
-  bcprop = 0;
-  domin_singular = domout_singular = 0;
-}
-
-int FaceDescriptor ::  SegmentFits (const Segment & seg)
-{
-  return
-    surfnr == seg.si &&
-    domin == seg.domin+1 &&
-    domout == seg.domout+1  &&
-    tlosurf == seg.tlosurf+1;
-}
-
-
-ostream & operator<<(ostream  & s, const FaceDescriptor & fd)
-{
-  s << "surfnr = " << fd.surfnr 
-    << ", domin = " << fd.domin
-    << ", domout = " << fd.domout
-    << ", tlosurf = " << fd.tlosurf
-    << ", bcprop = " << fd.bcprop
-    << ", domin_sing = " << fd.domin_singular
-    << ", domout_sing = " << fd.domout_singular;
-  return s;
-}
-
-
-
-
-
-
-Identifications :: Identifications (Mesh & amesh)
-  : mesh(amesh)
-{
-  identifiedpoints = new INDEX_2_HASHTABLE<int>(100);
-  maxidentnr = 0;
-}
-
-Identifications :: ~Identifications ()
-{
-  delete identifiedpoints;
-}
-
-void Identifications :: Delete ()
-{
-  delete identifiedpoints;
-  identifiedpoints = new INDEX_2_HASHTABLE<int>(100);
-  maxidentnr = 0;
-}
-
-void Identifications :: Add (PointIndex pi1, PointIndex pi2, int identnr)
-{
-  INDEX_2 pair (pi1, pi2);
-  identifiedpoints->Set (pair, identnr);
-  if (identnr > maxidentnr) maxidentnr = identnr;
-  //  timestamp = NextTimeStamp();
-}
-
-int Identifications :: Get (PointIndex pi1, PointIndex pi2) const
-{
-  INDEX_2 pair(pi1, pi2);
-  if (identifiedpoints->Used (pair))
-    return identifiedpoints->Get(pair);
-  else
-    return 0;
-}
-
-int Identifications :: GetSymmetric (PointIndex pi1, PointIndex pi2) const
-{
-  INDEX_2 pair(pi1, pi2);
-  if (identifiedpoints->Used (pair))
-    return identifiedpoints->Get(pair);
-
-  pair = INDEX_2 (pi2, pi1);
-  if (identifiedpoints->Used (pair))
-    return identifiedpoints->Get(pair);
-
-  return 0;
-}
-
-
-void Identifications :: GetMap (int identnr, ARRAY<int,PointIndex::BASE> & identmap) const
-{
-  identmap.SetSize (mesh.GetNP());
-  identmap = 0;
-
-  for (int i = 1; i <= identifiedpoints->GetNBags(); i++)
-    for (int j = 1; j <= identifiedpoints->GetBagSize(i); j++)
-      {
-	INDEX_2 i2;
-	int nr;
-	identifiedpoints->GetData (i, j, i2, nr);
-	
-	if (nr == identnr || !identnr)
-	  identmap.Elem(i2.I1()) = i2.I2();
-      }  
-}
- 
-
-void Identifications :: GetPairs (int identnr, 
-				  ARRAY<INDEX_2> & identpairs) const
-{
-  int i, j;
-  
-  identpairs.SetSize(0);
-  
-  for (i = 1; i <= identifiedpoints->GetNBags(); i++)
-    for (j = 1; j <= identifiedpoints->GetBagSize(i); j++)
-      {
-	INDEX_2 i2;
-	int nr;
-	identifiedpoints->GetData (i, j, i2, nr);
-	
-	if (identnr == 0 || nr == identnr)
-	  identpairs.Append (i2);
-      }  
-}
-
-
-void Identifications :: SetMaxPointNr (int maxpnum)
-{
-  for (int i = 1; i <= identifiedpoints->GetNBags(); i++)
-    for (int j = 1; j <= identifiedpoints->GetBagSize(i); j++)
-      {
-	INDEX_2 i2;
-	int nr;
-	identifiedpoints->GetData (i, j, i2, nr);
-	
-	if (i2.I1() > maxpnum || i2.I2() > maxpnum)
-	  {
-	    i2.I1() = i2.I2() = -1;
-	    identifiedpoints->SetData (i, j, i2, -1);	    
-	  }
-      }
-}
-
-
-
-
-
-MeshingParameters :: MeshingParameters ()
-{
-  optimize3d = "cmdmstm";
-  optsteps3d = 3;
-  optimize2d = "smsmsmSmSmSm";
-  optsteps2d = 3;
-  opterrpow = 2;
-  blockfill = 1;
-  filldist = 0.1;
-  safety = 5;
-  relinnersafety = 3;
-  uselocalh = 1;
-  grading = 0.3;
-  delaunay = 1;
-  maxh = 1e10;
-  meshsizefilename = NULL;
-  startinsurface = 0;
-  checkoverlap = 1;
-  checkchartboundary = 1;
-  curvaturesafety = 2;
-  segmentsperedge = 1;
-  parthread = 0;
-
-  elsizeweight = 0.2;
-  giveuptol = 10;
-  maxoutersteps = 5;
-  starshapeclass = 5;
-  baseelnp = 0;
-  sloppy = 1;
-
-  badellimit = 175;
-  secondorder = 0;
-}
-
-void MeshingParameters :: Print (ostream & ost) const
-{
-  ost << "Meshing parameters: " << endl
-      << "optimize3d = " << optimize3d << endl
-      << "optsteps3d = " << optsteps3d << endl
-      << " optimize2d = " <<  optimize2d << endl
-      << " optsteps2d = " <<  optsteps2d << endl
-      << " opterrpow = " <<  opterrpow << endl
-      << " blockfill = " <<  blockfill << endl
-      << " filldist = " <<  filldist << endl
-      << " safety = " <<  safety << endl
-      << " relinnersafety = " <<  relinnersafety << endl
-      << " uselocalh = " <<  uselocalh << endl
-      << " grading = " <<  grading << endl
-      << " delaunay = " <<  delaunay << endl
-      << " maxh = " <<  maxh << endl;
-  if(meshsizefilename)
-    ost << " meshsizefilename = " <<  meshsizefilename << endl;
-  else
-    ost << " meshsizefilename = NULL" << endl;
-  ost << " startinsurface = " <<  startinsurface << endl
-      << " checkoverlap = " <<  checkoverlap << endl
-      << " checkchartboundary = " <<  checkchartboundary << endl
-      << " curvaturesafety = " <<  curvaturesafety << endl
-      << " segmentsperedge = " <<  segmentsperedge << endl
-      << " parthread = " <<  parthread << endl
-      << " elsizeweight = " <<  elsizeweight << endl
-      << " giveuptol = " <<  giveuptol << endl
-      << " maxoutersteps = " <<  maxoutersteps << endl
-      << " starshapeclass = " <<  starshapeclass << endl
-      << " baseelnp        = " <<  baseelnp        << endl
-      << " sloppy = " <<  sloppy << endl
-      << " badellimit = " <<  badellimit << endl
-      << " secondorder = " <<  secondorder << endl
-      << " elementorder = " <<  elementorder << endl
-      << " quad = " <<  quad << endl
-      << " inverttets = " <<  inverttets << endl
-      << " inverttrigs = " <<  inverttrigs << endl;
-}
-
-void MeshingParameters :: CopyFrom(const MeshingParameters & other)
-{
-  //strcpy(optimize3d,other.optimize3d); 
-  optimize3d = other.optimize3d;
-  optsteps3d = other.optsteps3d;
-  //strcpy(optimize2d,other.optimize2d); 
-  optimize2d = other.optimize2d;
-  optsteps2d = other.optsteps2d;
-  opterrpow = other.opterrpow;
-  blockfill = other.blockfill;
-  filldist = other.filldist;
-  safety = other.safety;
-  relinnersafety = other.relinnersafety;
-  uselocalh = other.uselocalh;
-  grading = other.grading;
-  delaunay = other.delaunay;
-  maxh = other.maxh;
-  //strcpy(const_cast<char*>(meshsizefilename), other.meshsizefilename);
-  //const_cast<char*>(meshsizefilename) = other.meshsizefilename; //???
-  startinsurface = other.startinsurface;
-  checkoverlap = other.checkoverlap;
-  checkchartboundary = other.checkchartboundary;
-  curvaturesafety = other.curvaturesafety;
-  segmentsperedge = other.segmentsperedge;
-  parthread = other.parthread;
-  elsizeweight = other.elsizeweight;
-  giveuptol = other.giveuptol;
-  maxoutersteps = other.maxoutersteps;
-  starshapeclass = other.starshapeclass;
-  baseelnp = other.baseelnp;       
-  sloppy = other.sloppy;
-  badellimit = other.badellimit;
-  secondorder = other.secondorder;
-  elementorder = other.elementorder;
-  quad = other.quad;
-  inverttets = other.inverttets;
-  inverttrigs = other.inverttrigs;
-}
-
-
-DebugParameters :: DebugParameters ()
-{
-  slowchecks = 0;
-  haltsuccess = 0;
-  haltnosuccess = 0;
-  haltlargequalclass = 0;
-  haltsegment = 0;
-  haltsegmentp1 = 0;
-  haltsegmentp2 = 0;
-}
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/meshtype.hpp b/contrib/Netgen/libsrc/meshing/meshtype.hpp
deleted file mode 100644
index 363efd32267000f66885bf7e830e828073c757b1..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshtype.hpp
+++ /dev/null
@@ -1,1025 +0,0 @@
-#ifndef MESHTYPE
-#define MESHTYPE
-
-//#include <algorithm>
-
-/**************************************************************************/
-/* File:   meshtype.hpp                                                   */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Okt. 95                                                    */
-/**************************************************************************/
-
-/*
-    Classes for NETGEN
-*/
-
-
-enum ELEMENT_TYPE { 
-  SEGMENT = 1, SEGMENT3 = 2,
-  TRIG = 10, QUAD=11, TRIG6 = 12, QUAD6 = 13, QUAD8 = 14,
-  TET = 20, TET10 = 21, 
-  PYRAMID = 22, PRISM = 23, PRISM12 = 24,
-  HEX = 25
-};
-
-typedef int ELEMENT_EDGE[2];      // initial point, end point
-typedef int ELEMENT_FACE[4];      // points, last one is -1 for trig
-
-
-#define ELEMENT_MAXPOINTS 12
-#define ELEMENT2D_MAXPOINTS 8
-
-
-enum POINTTYPE { FIXEDPOINT = 1, EDGEPOINT = 2, SURFACEPOINT = 3, INNERPOINT = 4 };
-enum ELEMENTTYPE { FREEELEMENT, FIXEDELEMENT };
-enum OPTIMIZEGOAL { OPT_QUALITY, OPT_CONFORM, OPT_REST, OPT_WORSTCASE, OPT_LEGAL };
-
-
-class Mesh; // Added by Christophe for Gmsh (ISO C++ forbids declaration of 'Mesh' with no type)
-
-// class CSGeometry;
-
-extern int GetTimeStamp();
-extern int NextTimeStamp();
-
-class PointGeomInfo
-{
-public:
-  int trignum;   // for STL Meshing
-  double u, v;   // for OCC Meshing
-
-  PointGeomInfo () 
-    : trignum(-1), u(0), v(0) { ; }
-};
-
-inline ostream & operator<< (ostream & ost, const PointGeomInfo & gi)
-{
-  return (ost << gi.trignum);
-}
-
-
-
-#define MULTIPOINTGEOMINFO_MAX 100
-class MultiPointGeomInfo
-{
-  int cnt;
-  PointGeomInfo mgi[MULTIPOINTGEOMINFO_MAX];
-public:
-  MultiPointGeomInfo ();
-  int AddPointGeomInfo (const PointGeomInfo & gi);
-  void Init ();
-  void DeleteAll ();
-
-  int GetNPGI () const { return cnt; }
-  const PointGeomInfo & GetPGI (int i) const { return mgi[i-1]; }
-};
-
-
-class EdgePointGeomInfo
-{
-public:
-  int edgenr;
-  double dist; 
-  double u, v; // for OCC Meshing
-
-  EdgePointGeomInfo ()
-    : edgenr(0), dist(0.0), u(0.0), v(0.0) { ; }
-
-  EdgePointGeomInfo & operator= (const EdgePointGeomInfo & gi2)
-  {
-    edgenr = gi2.edgenr;  dist = gi2.dist;
-    u = gi2.u; v = gi2.v;
-    return *this;
-  }
-};
-
-inline ostream & operator<< (ostream & ost, const EdgePointGeomInfo & gi)
-{
-  return (ost << gi.edgenr);
-}
-
-
-
-
-
-class PointIndex
-{
-  int i;
-public:
-  PointIndex () { ; }
-  PointIndex (int ai) : i(ai) { ; }
-  PointIndex & operator= (const PointIndex &ai) { i = ai.i; return *this; }
-  PointIndex & operator= (int ai) { i = ai; return *this; }
-  operator int () const { return i; }
-  int GetInt () const { return i; }
-  PointIndex operator++ (int) { int hi = i; i++; return hi; }
-  PointIndex operator-- (int) { int hi = i; i--; return hi; }
-
-#ifdef BASE0
-  enum { BASE = 0 };
-#else
-  enum { BASE = 1 };
-#endif  
-};
-
-inline istream & operator>> (istream & ist, PointIndex & pi)
-{
-  int i; ist >> i; pi = i; return ist;
-}
-
-inline ostream & operator<< (ostream & ost, const PointIndex & pi)
-{
-  return (ost << pi.GetInt());
-}
-
-
-
-
-class ElementIndex
-{
-  int i;
-public:
-  ElementIndex () { ; }
-  ElementIndex (int ai) : i(ai) { ; }
-  ElementIndex & operator= (const ElementIndex & ai) { i = ai.i; return *this; }
-  ElementIndex & operator= (int ai) { i = ai; return *this; }
-  operator int () const { return i; }
-  ElementIndex & operator++ (int) { i++; return *this; }
-  ElementIndex & operator-- (int) { i--; return *this; }
-};
-
-inline istream & operator>> (istream & ist, ElementIndex & pi)
-{
-  int i; ist >> i; pi = i; return ist;
-}
-
-inline ostream & operator<< (ostream & ost, const ElementIndex & pi)
-{
-  return (ost << int(pi));
-}
-
-
-class SurfaceElementIndex
-{
-  int i;
-public:
-  SurfaceElementIndex () { ; }
-  SurfaceElementIndex (int ai) : i(ai) { ; }
-  SurfaceElementIndex & operator= (const SurfaceElementIndex & ai) 
-    { i = ai.i; return *this; }
-  SurfaceElementIndex & operator= (int ai) { i = ai; return *this; }
-  operator int () const { return i; }
-  SurfaceElementIndex & operator++ (int) { i++; return *this; }
-  SurfaceElementIndex & operator-- (int) { i--; return *this; }
-};
-
-inline istream & operator>> (istream & ist, SurfaceElementIndex & pi)
-{
-  int i; ist >> i; pi = i; return ist;
-}
-
-inline ostream & operator<< (ostream & ost, const SurfaceElementIndex & pi)
-{
-  return (ost << int(pi));
-}
-
-class SegmentIndex
-{
-  int i;
-public:
-  SegmentIndex () { ; }
-  SegmentIndex (int ai) : i(ai) { ; }
-  SegmentIndex & operator= (const SegmentIndex & ai) 
-    { i = ai.i; return *this; }
-  SegmentIndex & operator= (int ai) { i = ai; return *this; }
-  operator int () const { return i; }
-  SegmentIndex & operator++ (int) { i++; return *this; }
-  SegmentIndex & operator-- (int) { i--; return *this; }
-};
-
-inline istream & operator>> (istream & ist, SegmentIndex & pi)
-{
-  int i; ist >> i; pi = i; return ist;
-}
-
-inline ostream & operator<< (ostream & ost, const SegmentIndex & pi)
-{
-  return (ost << int(pi));
-}
-
-
-
-
-/**
-   Point in the mesh.
-   Contains layer (a new feature in 4.3 for overlapping meshes.
-   will contain pointtype
- */
-class MeshPoint : public Point3d
-{
-  int layer;
-  bool singular;
-  POINTTYPE type;
-public:
-  MeshPoint () : layer(1), singular(0), type(INNERPOINT) { ; }
-  MeshPoint (const Point3d & ap, int alayer = 1, POINTTYPE apt = INNERPOINT)
-    : Point3d (ap), layer(alayer), singular(0), type(apt) { ; }
-  
-  void SetPoint (const Point3d & ap)
-  { Point3d::operator= (ap); }
-  int GetLayer() const { return layer; }
-
-  bool IsSingular() const { return singular; }
-  void SetSingular(bool s = 1) { singular = s; }
-
-  POINTTYPE Type() const { return type; }
-  void SetType(POINTTYPE at) { type = at; }
-};
-
-
-
-// typedef MoveableArray<MeshPoint> T_POINTS;
-typedef ARRAY<MeshPoint,PointIndex::BASE> T_POINTS;
-
-
-class Element2d;
-ostream & operator<<(ostream  & s, const Element2d & el);
-
-/**
-  Triangle element for surface mesh generation.
- */
-class Element2d
-{ 
-  /// point numbers
-  PointIndex pnum[ELEMENT2D_MAXPOINTS];
-  /// geom info of corner points
-  PointGeomInfo geominfo[ELEMENT2D_MAXPOINTS];
-
-  /// surface nr
-  int index:16;
-  ///
-  ELEMENT_TYPE typ:6;
-  /// number of points
-  unsigned int np:4;
-  bool badel:1;
-  bool refflag:1;  // marked for refinement
-  bool deleted:1;  // element is deleted
-
-  /// order for hp-FEM
-  unsigned int order:6;
-
-
-public:
-  ///
-  Element2d (int anp = 3);
-  ///
-  Element2d (ELEMENT_TYPE type);
-  ///
-  Element2d (int pi1, int pi2, int pi3);
-  ///
-  Element2d (int pi1, int pi2, int pi3, int pi4);
-  ///
-  ELEMENT_TYPE GetType () const { return typ; }
-  /// 
-  void SetType (ELEMENT_TYPE atyp)
-  {
-    typ = atyp;
-    switch (typ)
-      {
-      case TRIG: np = 3; break;
-      case QUAD: np = 4; break;
-      case TRIG6: np = 6; break;
-      case QUAD6: np = 6; break;
-      case QUAD8: np = 8; break;
-      default:
-	PrintSysError ("Element2d::SetType, illegal type ", typ);
-      }
-  }
-  ///
-  int GetNP() const { return np; }
-  ///
-  int GetNV() const
-  {
-    switch (typ)
-      {
-      case TRIG:
-      case TRIG6: return 3;
-
-      case QUAD:
-      case QUAD8:
-      case QUAD6: return 4;
-      default:
-#ifdef DEBUG
-	PrintSysError ("element2d::GetNV not implemented for typ", typ)
-#endif
-	;
-      }
-    return np;
-  }
-
-  ///
-  PointIndex & operator[] (int i) { return pnum[i]; }
-  ///
-  const PointIndex & operator[] (int i) const { return pnum[i]; }
-
-  ///
-  PointIndex & PNum (int i) { return pnum[i-1]; }
-  ///
-  const PointIndex & PNum (int i) const { return pnum[i-1]; }
-  ///
-  PointIndex & PNumMod (int i) { return pnum[(i-1) % np]; }
-  ///
-  const PointIndex & PNumMod (int i) const { return pnum[(i-1) % np]; }
-  ///
-
-  ///
-  PointGeomInfo & GeomInfoPi (int i) { return geominfo[i-1]; }
-  ///
-  const PointGeomInfo & GeomInfoPi (int i) const { return geominfo[i-1]; }
-  ///
-  PointGeomInfo & GeomInfoPiMod (int i) { return geominfo[(i-1) % np]; }
-  ///
-  const PointGeomInfo & GeomInfoPiMod (int i) const { return geominfo[(i-1) % np]; }
-
-
-  void SetIndex (int si) { index = si; }
-  ///
-  int GetIndex () const { return index; }
-
-  int GetOrder () const { return order; }
-  void SetOrder (int aorder) { order = aorder; }
-
-  ///
-  void GetBox (const T_POINTS & points, Box3d & box) const;
-  /// invert orientation
-  inline void Invert ();
-  ///
-  void Invert2 ();
-  /// first point number is smallest
-  inline void NormalizeNumbering ();
-  ///
-  void NormalizeNumbering2 ();
-
-  bool BadElement() const { return badel; }
-
-  friend ostream & operator<<(ostream  & s, const Element2d & el);
-  friend class Mesh;
-
-
-  /// get number of 'integration points'
-  int GetNIP () const;
-  void GetIntegrationPoint (int ip, Point2d & p, double & weight) const;
-  void GetTransformation (int ip, const ARRAY<Point2d> & points,
-			  class DenseMatrix & trans) const;
-  void GetTransformation (int ip, class DenseMatrix & pmat,
-			  class DenseMatrix & trans) const;
-
-  void GetShape (const Point2d & p, class Vector & shape) const;
-  /// matrix 2 * np
-  void GetDShape (const Point2d & p, class DenseMatrix & dshape) const;
-  /// matrix 2 * np
-  void GetPointMatrix (const ARRAY<Point2d> & points,
-		       class DenseMatrix & pmat) const; 
-
-  void ComputeIntegrationPointData () const;
-  
-
-  double CalcJacobianBadness (const ARRAY<Point2d> & points) const;
-  double CalcJacobianBadness (const T_POINTS & points, 
-			      const Vec3d & n) const;
-  double CalcJacobianBadnessDirDeriv (const ARRAY<Point2d> & points,
-				      int pi, Vec2d & dir, double & dd) const;
-
-
-
-  void Delete () { deleted = 1; pnum[0] = pnum[1] = pnum[2] = pnum[3] = PointIndex::BASE-1; }
-  bool IsDeleted () const 
-  {
-#ifdef DEBUG
-    if (pnum[0] < PointIndex::BASE && !deleted)
-      cerr << "Surfelement has illegal pnum, but not marked as deleted" << endl;
-#endif    
-    return deleted; 
-  }
-
-  void SetRefinementFlag (bool rflag = 1) 
-  { refflag = rflag; }
-  bool TestRefinementFlag () const
-  { return refflag; }
-
-  int HasFace(const Element2d& el) const;
-  ///
-  int meshdocval;
-  ///
-  int hp_elnr;
-};
-
-
-
-
-class IntegrationPointData
-{
-public:
-  Point3d p;
-  double weight;
-  Vector shape;
-  DenseMatrix dshape;
-};
-
-
-
-
-class Element;
-ostream & operator<<(ostream  & s, const Element & el);
-
-
-
-/**
-  Volume element
- */
-class Element
-{
-private:
-  /// point numbers
-  PointIndex pnum[ELEMENT_MAXPOINTS];
-  ///
-  ELEMENT_TYPE typ:6;
-  /// number of points (4..tet, 5..pyramid, 6..prism, 8..hex, 10..quad tet, 12..quad prism)
-  int np:5;
-  ///
-  class flagstruct { 
-  public:
-    bool marked:1;  // marked for refinement
-    bool badel:1;   // angles worse then limit
-    bool reverse:1; // for refinement a la Bey
-    bool illegal:1; // illegal, will be split or swaped 
-    bool illegal_valid:1; // is illegal-flag valid ?
-    bool badness_valid:1; // is badness valid ?
-    bool refflag:1;     // mark element for refinement
-    bool deleted:1;   // element is deleted, will be removed from array
-  };
-  /// surface or sub-domain index
-  short int index;
-  /// order for hp-FEM
-  unsigned int order:6;
-  /// stored shape-badness of element
-  float badness;
-  /// number of partition for parallel compution 
-  short int partitionNumber;
-  ///
-  
-public:
-  flagstruct flags;
-
-  ///
-  Element ();
-  ///
-  Element (int anp);
-  ///
-  Element (ELEMENT_TYPE type);
-  ///
-  Element & operator= (const Element & el2);
-  
-  ///
-  void SetNP (int anp);
-  ///
-  void SetType (ELEMENT_TYPE atyp);
-  ///
-  int GetNP () const { return np; }
-  ///
-  int GetNV() const
-  {
-    switch (typ)
-      {
-      case TET: return 4;
-      case TET10: return 4;
-      case PRISM12: return 6;
-      case PRISM: return 6; //SZ 
-      default:
-#ifdef DEBUG
-	PrintSysError ("Element3d::GetNV not implemented for typ ", typ)
-#endif
-	  ;
-      }
-    return np;
-  }
-  // old style:
-  int NP () const { return np; }
-
-  ///
-  ELEMENT_TYPE GetType () const { return typ; }
-
-  ///
-  PointIndex & operator[] (int i) { return pnum[i]; }
-  ///
-  const PointIndex & operator[] (int i) const { return pnum[i]; }
-
-  ///
-  PointIndex & PNum (int i) { return pnum[i-1]; }
-  ///
-  const PointIndex & PNum (int i) const { return pnum[i-1]; }
-  ///
-  PointIndex & PNumMod (int i) { return pnum[(i-1) % np]; }
-  ///
-  const PointIndex & PNumMod (int i) const { return pnum[(i-1) % np]; }
-  
-  ///
-  void SetIndex (int si) { index = si; }
-  ///
-  int GetIndex () const { return index; }
-
-  int GetOrder () const { return order; }
-  void SetOrder (int aorder) { order = aorder; }
-
-  ///
-  void GetBox (const T_POINTS & points, Box3d & box) const;
-  /// Calculates Volume of elemenet
-  double Volume (const T_POINTS & points) const;
-  ///
-  virtual void Print (ostream & ost) const;
-  ///
-  int GetNFaces () const
-    {
-      switch (typ)
-	{
-	case TET: 
-	case TET10: return 4;
-	case PYRAMID: return 5;
-	case PRISM: 
-	case PRISM12: return 5;
-	default:
-#ifdef DEBUG
-	  PrintSysError ("element3d::GetNFaces not implemented for typ", typ)
-#endif
-	    ;
-	}
-      return 0;
-    }
-  ///
-  inline void GetFace (int i, Element2d & face) const;
-  ///
-  void GetFace2 (int i, Element2d & face) const;
-  ///
-  void Invert ();
-
-  /// split into 4 node tets
-  void GetTets (ARRAY<Element> & locels) const;
-  /// split into 4 node tets, local point nrs
-  void GetTetsLocal (ARRAY<Element> & locels) const;
-  /// returns coordinates of nodes
-  void GetNodesLocal (ARRAY<Point3d> & points) const;
-  void GetNodesLocalNew (ARRAY<Point3d> & points) const;
-
-  /// split surface into 3 node trigs
-  void GetSurfaceTriangles (ARRAY<Element2d> & surftrigs) const;
-
-
-  /// get number of 'integration points'
-  int GetNIP () const;
-  void GetIntegrationPoint (int ip, Point3d & p, double & weight) const;
-  void GetTransformation (int ip, const T_POINTS & points,
-			  class DenseMatrix & trans) const;
-  void GetTransformation (int ip, class DenseMatrix & pmat,
-			  class DenseMatrix & trans) const;
-
-  void GetShape (const Point3d & p, class Vector & shape) const;
-  void GetShapeNew (const Point<3> & p, class FlatVector & shape) const;
-  /// matrix 2 * np
-  void GetDShape (const Point3d & p, class DenseMatrix & dshape) const;
-  void GetDShapeNew (const Point<3> & p, class MatrixFixWidth<3> & dshape) const;
-  /// matrix 3 * np
-  void GetPointMatrix (const T_POINTS & points,
-		       class DenseMatrix & pmat) const; 
-
-  void ComputeIntegrationPointData () const;
-  
-
-  double CalcJacobianBadness (const T_POINTS & points) const;
-  double CalcJacobianBadnessDirDeriv (const T_POINTS & points,
-				      int pi, Vec3d & dir, double & dd) const;
-
-  ///
-  friend ostream & operator<<(ostream  & s, const Element & el);
-
-  void SetRefinementFlag (bool rflag = 1) 
-  { flags.refflag = rflag; }
-  int TestRefinementFlag () const
-  { return flags.refflag; }
-
-  int Illegal () const
-    { return flags.illegal; }
-  int IllegalValid () const
-    { return flags.illegal_valid; }
-  void SetIllegal (int aillegal)
-  {
-    flags.illegal = aillegal ? 1 : 0;
-    flags.illegal_valid = 1;
-  }
-  void SetLegal (int alegal)
-  {
-    flags.illegal = alegal ? 0 : 1;
-    flags.illegal_valid = 1;
-  }
-  
-  void Delete () { flags.deleted = 1; }
-  bool IsDeleted () const 
-  { 
-#ifdef DEBUG
-    if (pnum[0] < PointIndex::BASE && !flags.deleted)
-      cerr << "Volelement has illegal pnum, but not marked as deleted" << endl;
-#endif    
-
-    return flags.deleted; 
-  }
-
-  int GetPartition () const { return partitionNumber; }
-  void SetPartition (int nr) { partitionNumber = nr; }; 
-
-  int hp_elnr;
-};
-
-
-class Segment;
-ostream & operator<<(ostream  & s, const Segment & seg);
-
-
-/**
-  Edge segment.
-  */
-class Segment
-{
-public:
-  ///
-  Segment();
-
-  friend ostream & operator<<(ostream  & s, const Segment & seg);
-
-  /// point index 1
-  PointIndex p1;
-  /// point index 2
-  PointIndex p2;    
-  /// edge nr
-  int edgenr;
-  ///
-  unsigned int singedge_left:1;
-  unsigned int singedge_right:1;
-
-  /// 0.. not first segment of segs, 1..first of class, 2..first of class, inverse
-  unsigned int seginfo:2;
-
-  /// surface decoding index
-  int si;          
-  /// domain number inner side
-  int domin;
-  /// domain number outer side
-  int domout;  
-  /// top-level object number of surface
-  int tlosurf;
-  ///
-  PointGeomInfo geominfo[2];
-
-  /// surfaces describing edge
-  int surfnr1, surfnr2;
-  ///
-  EdgePointGeomInfo epgeominfo[2];
-  ///
-  int pmid; // for second order
-  ///
-  int meshdocval;
-
-
-  PointIndex operator[] (int i) const
-  { return (i == 0) ? p1 : p2; }
-
-  PointIndex & operator[] (int i) 
-  { return (i == 0) ? p1 : p2; }
-
-  Segment& operator=(const Segment & other);
-
-  
-  int hp_elnr;
-};
-
-
-// class Surface;  
-class FaceDescriptor;
-ostream & operator<< (ostream  & s, const FaceDescriptor & fd);
-
-///
-class FaceDescriptor
-{
-  /// which surface, 0 if not available
-  int surfnr;
-  /// domain nr inside
-  int domin;
-  /// domain nr outside
-  int domout;
-  /// top level object number of surface
-  int tlosurf;
-  /// boundary condition property
-  int bcprop;
-
-public:
-  FaceDescriptor();
-  FaceDescriptor(int surfnri, int domini, int domouti, int tlosurfi);
-  FaceDescriptor(const Segment & seg);
-
-  int SegmentFits (const Segment & seg);
-
-  int SurfNr () const { return surfnr; }
-  int DomainIn () const { return domin; }
-  int DomainOut () const { return domout; }
-  int TLOSurface () const { return tlosurf; }
-  int BCProperty () const { return bcprop; }
-  void SetSurfNr (int sn) { surfnr = sn; }
-  void SetDomainIn (int di) { domin = di; }
-  void SetDomainOut (int dom) { domout = dom; }
-  void SetBCProperty (int bc) { bcprop = bc; }
-
-  friend ostream & operator<<(ostream  & s, const FaceDescriptor & fd);
-
-
-  ///
-  bool domin_singular;
-  bool domout_singular;
-
-
-};
-
- 
-
-
-
-
-class MeshingParameters
-{
-public:
-  /**
-     3d optimization strategy:
-     // m .. move nodes
-     // M .. move nodes, cheap functional
-     // s .. swap faces
-     // c .. combine elements
-     // d .. divide elements
-     // p .. plot, no pause
-     // P .. plot, Pause
-     // h .. Histogramm, no pause
-     // H .. Histogramm, pause
-  */
-  char * optimize3d;
-  /// number of 3d optimization steps
-  int optsteps3d;
-  /**
-     2d optimization strategy:
-     // s .. swap, opt 6 lines/node
-     // S .. swap, optimal elements
-     // m .. move nodes
-     // p .. plot, no pause
-     // P .. plot, pause
-     // c .. combine
-  **/
-  char * optimize2d;
-  /// number of 2d optimization steps
-  int optsteps2d;
-  /// power of error (to approximate max err optimization)
-  double opterrpow;
-  /// do block filling ?  
-  int blockfill;
-  /// block filling up to distance
-  double filldist;
-  /// radius of local environment (times h)
-  double safety;
-  /// radius of active environment (times h)
-  double relinnersafety;
-  /// use local h ?
-  int uselocalh;
-  /// grading for local h
-  double grading;
-  /// use delaunay meshing
-  int delaunay;
-  /// maximal mesh size
-  double maxh;
-  /// file for meshsize
-  const char * meshsizefilename;
-  /// start surfacemeshing from everywhere in surface
-  int startinsurface;
-  /// check overlapping surfaces (debug)
-  int checkoverlap;
-  /// check chart boundary (sometimes too restrictive)
-  int checkchartboundary;
-  /// safty factor for curvatures (elemetns per radius)
-  double curvaturesafety;
-  /// minimal number of segments per edge
-  double segmentsperedge;
-  /// use parallel threads
-  int parthread;
-  /// weight of element size w.r.t element shape
-  double elsizeweight;
-  /// init with default values
-
-
-  /// from mp3:
-  /// give up quality class
-  int giveuptol;
-  /// maximal outer steps
-  int maxoutersteps;
-  /// class starting star-shape filling
-  int starshapeclass;
-  /// if non-zero, baseelement must have baseelnp points
-  int baseelnp;        
-  /// quality tolerances are handled less careful
-  int sloppy;
-  
-  /// limit for max element angle (150-180)
-  double badellimit;
-
-  ///
-  int secondorder;
-  /// high order element curvature
-  int elementorder;
-  /// quad-dominated surface meshing
-  int quad;
-  ///
-  int inverttets;
-  ///
-  int inverttrigs;
-  ///
-  MeshingParameters ();
-  ///
-  void Print (ostream & ost) const;
-
-  void CopyFrom(const MeshingParameters & other);
-};
-
-class DebugParameters 
-{
-public:
-  ///
-  int debugoutput;
-  /// use slow checks
-  int slowchecks;
-  ///
-  int haltsuccess;
-  ///
-  int haltnosuccess;
-  ///
-  int haltlargequalclass;
-  ///
-  int haltsegment;
-  ///
-  int haltnode;
-  ///
-  int haltsegmentp1;
-  ///
-  int haltsegmentp2;
-  ///
-  int haltexistingline;
-  ///
-  int haltoverlap;
-  ///
-  int haltface;
-  ///
-  int haltfacenr;
-  ///
-  DebugParameters ();
-};
-
-
-
-
-
-
-
-inline void Element2d :: Invert()
-{
-  if (typ == TRIG)
-    Swap (PNum(2), PNum(3));
-  else
-    Invert2();
-}
-
-
-
-
-inline void Element2d :: NormalizeNumbering ()
-{
-  if (GetNP() == 3)
-    {
-      if (PNum(1) < PNum(2) && PNum(1) < PNum(3))
-	return;
-      else
-	{
-	  if (PNum(2) < PNum(3))
-	    {
-	      PointIndex pi1 = PNum(2);
-	      PNum(2) = PNum(3);
-	      PNum(3) = PNum(1);
-	      PNum(1) = pi1;
-	    }
-	  else
-	    {
-	      PointIndex pi1 = PNum(3);
-	      PNum(3) = PNum(2);
-	      PNum(2) = PNum(1);
-	      PNum(1) = pi1;
-	    }
-	}
-    }
-  else
-    NormalizeNumbering2();
-}
-
-
-
-static const int gftetfacesa[4][3] = 
-  { { 1, 2, 3 },
-    { 2, 0, 3 },
-    { 0, 1, 3 },
-    { 1, 0, 2 } };
-
-inline void Element :: GetFace (int i, Element2d & face) const
-{
-  if (typ == TET)
-    {
-      face.SetType(TRIG);
-      face[0] = pnum[gftetfacesa[i-1][0]];
-      face[1] = pnum[gftetfacesa[i-1][1]];
-      face[2] = pnum[gftetfacesa[i-1][2]];
-    }
-  else
-    GetFace2 (i, face);
-}
-
-
-
-
-
-
-
-/**
-   Identification of periodic surfaces, close surfaces, etc. 
- */
-class Identifications
-{
-private:
-  Mesh & mesh;
-
-  /// identify points (thin layers, periodic b.c.)  
-  INDEX_2_HASHTABLE<int> * identifiedpoints;
-
-  /// number of identifications (or, actually used identifications ?)
-  int maxidentnr;
-
-public:
-  ///
-  Identifications (Mesh & amesh);
-  ///
-  ~Identifications ();
-
-  void Delete ();
-
-  /*
-    Identify points pi1 and pi2, due to
-    identification nr identnr
-  */
-  void Add (PointIndex pi1, PointIndex pi2, int identnr);
-
-
-  int Get (PointIndex pi1, PointIndex pi2) const;
-  int GetSymmetric (PointIndex pi1, PointIndex pi2) const;
-  ///
-  INDEX_2_HASHTABLE<int> & GetIdentifiedPoints () 
-  { 
-    return *identifiedpoints; 
-  }
-
-  bool Used (PointIndex pi1, PointIndex pi2)
-  {
-    return identifiedpoints->Used (INDEX_2 (pi1, pi2));
-  }
-
-  bool UsedSymmetric (PointIndex pi1, PointIndex pi2)
-  {
-    return 
-      identifiedpoints->Used (INDEX_2 (pi1, pi2)) ||
-      identifiedpoints->Used (INDEX_2 (pi2, pi1));
-  }
-
-  ///
-  void GetMap (int identnr, ARRAY<int,PointIndex::BASE> & identmap) const;
-  ///
-  void GetPairs (int identnr, ARRAY<INDEX_2> & identpairs) const;
-  ///
-  int GetMaxNr () const { return maxidentnr; }  
-
-  /// remove secondorder
-  void SetMaxPointNr (int maxpnum);
-};
-
-
-
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/msghandler.cpp b/contrib/Netgen/libsrc/meshing/msghandler.cpp
deleted file mode 100644
index 04da502a738faed64696ed004bcdc95639967401..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/msghandler.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-//File for handling warnings, errors, messages
-#include <meshing.hpp>
-
-namespace netgen
-{
-
-int printmessage_importance = 5;
-int printwarnings = 1;
-int printerrors = 1;
-int printdots = 1;
-int printfnstart = 0;
-
-// extern void Ng_PrintDest(const MyStr& s);
-extern void Ng_PrintDest(const char * s);
-
-//the dots for progression of program
-void PrintDot(char ch)
-{
-  if (printdots)
-    {
-      char st[2];
-      st[0] = ch;
-      st[1] = 0;
-      Ng_PrintDest(st);
-    }
-}
-
-void PrintMessage(int importance, 
-		  const MyStr& s1, const MyStr& s2)
-{
-  if (importance <= printmessage_importance)
-    {
-      Ng_PrintDest(MyStr(" ")+s1+s2+MyStr("\n"));
-    }
-}
-
-void PrintMessage(int importance, 
-		  const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4)
-{
-  if (importance <= printmessage_importance)
-    {
-      Ng_PrintDest(MyStr(" ")+s1+s2+s3+s4+MyStr("\n"));
-    }
-}
-
-void PrintMessage(int importance, 
-		  const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-		  const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  if (importance <= printmessage_importance)
-    {
-      Ng_PrintDest(MyStr(" ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\n"));
-    }
-}
-
-void PrintMessageCR(int importance, 
-		    const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-		    const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  if (importance <= printmessage_importance)
-    {
-      Ng_PrintDest(MyStr(" ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\r"));
-    }
-}
-
-void PrintFnStart(const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-		  const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  if (printfnstart)
-    Ng_PrintDest(MyStr(" Start Function: ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\n"));
-}
-
-void PrintWarning(const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-		  const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  if (printwarnings)
-    Ng_PrintDest(MyStr(" WARNING: ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\n"));
-}
-
-void PrintError(const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-		const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  if (printerrors)
-    Ng_PrintDest(MyStr(" ERROR: ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\n"));
-}
-
-void PrintFileError(const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-		    const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  if (printerrors)
-    Ng_PrintDest(MyStr(" FILE ERROR: ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\n"));
-}
-
-void PrintUserError(const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-		const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  Ng_PrintDest(MyStr(" USER ERROR: ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\n"));
-}
-
-void PrintSysError(const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-		const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  if (printerrors)
-    Ng_PrintDest(MyStr(" SYSTEM ERROR: ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\n"));
-}
-
-void PrintTime(const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-	       const MyStr& s5, const MyStr& s6, const MyStr& s7, const MyStr& s8)
-{
-  if (printmessage_importance >= 3)
-    Ng_PrintDest(MyStr(" Time = ")+s1+s2+s3+s4+s5+s6+s7+s8+MyStr("\n"));
-}
-
-
-static ARRAY<MyStr*> msgstatus_stack(0);
-static MyStr msgstatus = "";
-
-
-
-
-void ResetStatus()
-{
-  SetStatMsg("idle");
-
-  for (int i = 0; i < msgstatus_stack.Size(); i++)
-    delete msgstatus_stack[i];
-  msgstatus_stack.SetSize(0);
-
-  // multithread.task = "";
-  multithread.percent = 100.;
-}
-
-void PushStatus(const MyStr& s)
-{
-  msgstatus_stack.Append(new MyStr (s));
-  SetStatMsg(s);
-}
-
-void PushStatusF(const MyStr& s)
-{
-  msgstatus_stack.Append(new MyStr (s));
-  SetStatMsg(s);
-  PrintFnStart(s);
-}
-
-void PopStatus()
-{
-  SetThreadPercent(100.);
-  if (msgstatus_stack.Size())
-    {
-      if (msgstatus_stack.Size() > 1)
-	SetStatMsg (*msgstatus_stack.Last());
-      else
-	SetStatMsg ("");
-      delete msgstatus_stack.Last();
-      msgstatus_stack.SetSize(msgstatus_stack.Size()-1);
-    }
-  else
-    {
-      PrintSysError("PopStatus failed");
-    }
-}
-/*
-void SetStatMsgF(const MyStr& s)
-{
-  PrintFnStart(s);
-  SetStatMsg(s);
-}
-*/
-
-void SetStatMsg(const MyStr& s)
-{
-  msgstatus = s;
-  multithread.task = msgstatus.c_str();  
-}
-
-void SetThreadPercent(double percent)
-{
-  multithread.percent = percent;
-}
-
-
-
-#ifdef SMALLLIB
-void Ng_PrintDest(const char * s){cout << s <<flush;}
-double GetTime(){return 0;}
-void MyError(const char * ch)
-{
-  cerr << ch << endl;
-}
-#endif
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/msghandler.hpp b/contrib/Netgen/libsrc/meshing/msghandler.hpp
deleted file mode 100644
index 7de942519304d488be2745e98c1f16d5529df216..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/msghandler.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef FILE_MSGHANDLER
-#define FILE_MSGHANDLER
-
-/**************************************************************************/
-/* File:   msghandler.hh                                                  */
-/* Author: Johannes Gerstmayr                                             */
-/* Date:   20. Nov. 99                                                    */
-/**************************************************************************/
-
-
-extern void PrintDot(char ch = '.');
-
-
-//Message Pipeline:
-
-//importance: importance of message: 1=very important, 3=middle, 5=low, 7=unimportant
-extern void PrintMessage(int importance, 
-			 const MyStr& s1, const MyStr& s2=MyStr());
-extern void PrintMessage(int importance, 
-			 const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4=MyStr());
-extern void PrintMessage(int importance, 
-			 const MyStr& s1, const MyStr& s2, const MyStr& s3, const MyStr& s4, 
-			 const MyStr& s5, const MyStr& s6=MyStr(), const MyStr& s7=MyStr(), const MyStr& s8=MyStr());
-
-// CR without line-feed
-extern void PrintMessageCR(int importance, 
-			   const MyStr& s1, const MyStr& s2="", const MyStr& s3="", const MyStr& s4="", 
-			   const MyStr& s5="", const MyStr& s6="", const MyStr& s7="", const MyStr& s8="");
-extern void PrintFnStart(const MyStr& s1, const MyStr& s2="", const MyStr& s3="", const MyStr& s4="", 
-			 const MyStr& s5="", const MyStr& s6="", const MyStr& s7="", const MyStr& s8="");
-extern void PrintWarning(const MyStr& s1, const MyStr& s2="", const MyStr& s3="", const MyStr& s4="", 
-			 const MyStr& s5="", const MyStr& s6="", const MyStr& s7="", const MyStr& s8="");
-extern void PrintError(const MyStr& s1, const MyStr& s2="", const MyStr& s3="", const MyStr& s4="", 
-		       const MyStr& s5="", const MyStr& s6="", const MyStr& s7="", const MyStr& s8="");
-extern void PrintFileError(const MyStr& s1, const MyStr& s2="", const MyStr& s3="", const MyStr& s4="", 
-		       const MyStr& s5="", const MyStr& s6="", const MyStr& s7="", const MyStr& s8="");
-extern void PrintSysError(const MyStr& s1, const MyStr& s2="", const MyStr& s3="", const MyStr& s4="", 
-		       const MyStr& s5="", const MyStr& s6="", const MyStr& s7="", const MyStr& s8="");
-extern void PrintUserError(const MyStr& s1, const MyStr& s2="", const MyStr& s3="", const MyStr& s4="", 
-		       const MyStr& s5="", const MyStr& s6="", const MyStr& s7="", const MyStr& s8="");
-extern void PrintTime(const MyStr& s1="", const MyStr& s2="", const MyStr& s3="", const MyStr& s4="", 
-		      const MyStr& s5="", const MyStr& s6="", const MyStr& s7="", const MyStr& s8="");
-extern void SetStatMsg(const MyStr& s);
-
-extern void PushStatus(const MyStr& s);
-extern void PushStatusF(const MyStr& s);
-extern void PopStatus();
-extern void SetThreadPercent(double percent);
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/meshing/netrule2.cpp b/contrib/Netgen/libsrc/meshing/netrule2.cpp
deleted file mode 100644
index c75c69d5218a7311e31624f4e7367173b14ec4b7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/netrule2.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-netrule :: netrule ()
-{
-  name = new char[1];
-  name[0] = char(0);
-  quality = 0;
-}
-
-netrule ::  ~netrule()
-{
-  if(name != NULL) delete [] name;
-  for(int i=0; i<oldutofreearea_i.Size(); i++)
-    delete oldutofreearea_i[i];
-}
-
-
-/*
-void netrule :: GetFreeArea (ARRAY<Point2d> & afreearea)
-  {
-  int i;
-
-  afreearea.SetSize (freearea.Size());
-  for (i = 1; i <= freearea.Size(); i++)
-    afreearea[i] = freearea[i];
-  }
-*/
-
-
-void netrule :: SetFreeZoneTransformation (const Vector & devp, int tolclass)
-{
-  double lam1 = 1.0/tolclass;
-  double lam2 = 1.-lam1;
-
-  double mem1[100], mem2[100], mem3[100];
-
-  int vs = oldutofreearea.Height();
-  FlatVector devfree(vs, mem1);
-  FlatVector devfree1(vs, mem2);
-  FlatVector devfree2(vs, mem3);
-
-  if (tolclass <= oldutofreearea_i.Size())
-    {
-      oldutofreearea_i[tolclass-1] -> Mult (devp, devfree);
-    }
-  else
-    {
-      oldutofreearea.Mult (devp, devfree1);
-      oldutofreearealimit.Mult (devp, devfree2);
-      devfree.Set2 (lam1, devfree1, lam2, devfree2);
-    }
-
-  
-  int fzs = freezone.Size();
-  transfreezone.SetSize (fzs);
-
-  if (fzs > 0)
-    {
-      transfreezone[0].X() = lam1 * freezone[0].X() + lam2 * freezonelimit[0].X() + devfree[0];
-      transfreezone[0].Y() = lam1 * freezone[0].Y() + lam2 * freezonelimit[0].Y() + devfree[1];
-      fzmaxx = fzminx = transfreezone[0].X();
-      fzmaxy = fzminy = transfreezone[0].Y();
-    }
-
-  for (int i = 1; i < fzs; i++)
-    {
-      transfreezone[i].X() = lam1 * freezone[i].X() + lam2 * freezonelimit[i].X() + devfree[2*i];
-      transfreezone[i].Y() = lam1 * freezone[i].Y() + lam2 * freezonelimit[i].Y() + devfree[2*i+1];
-
-      if (transfreezone[i].X() > fzmaxx) fzmaxx = transfreezone[i].X();
-      if (transfreezone[i].X() < fzminx) fzminx = transfreezone[i].X();
-      if (transfreezone[i].Y() > fzmaxy) fzmaxy = transfreezone[i].Y();
-      if (transfreezone[i].Y() < fzminy) fzminy = transfreezone[i].Y();
-    }
-
-  for (int i = 0; i < fzs; i++)
-    {
-      Point2d p1 = transfreezone[i];
-      Point2d p2 = transfreezone[(i+1) % fzs];
-
-      Vec2d vn (p2.Y() - p1.Y(), p1.X() - p2.X());
-
-      double len2 = vn.Length2();
-
-      if (len2 < 1e-10)
-	{
-	  freesetinequ(i, 0) = 0;
-	  freesetinequ(i, 1) = 0;
-	  freesetinequ(i, 2) = -1;
-	}
-      else
-	{
-	  vn /= sqrt (len2);    // should not be necessary
-
-	  freesetinequ(i,0) = vn.X(); 
-	  freesetinequ(i,1) = vn.Y(); 
-	  freesetinequ(i,2) = -(p1.X() * vn.X() + p1.Y() * vn.Y());
-	}
-
-      /*
-      freesetinequ(i,0) = vn.X(); 
-      freesetinequ(i,1) = vn.Y(); 
-      freesetinequ(i,2) = -(p1.X() * vn.X() + p1.Y() * vn.Y());
-      */
-    }
-}
-
-
-/*
-int netrule :: IsInFreeZone2 (const Point2d & p) const
-{
-  for (int i = 0; i < transfreezone.Size(); i++)
-    {
-      if (freesetinequ(i, 0) * p.X() + 
-	  freesetinequ(i, 1) * p.Y() +
-	  freesetinequ(i, 2) > 0) return 0;
-    }
-  return 1;
-}
-*/
-
-int netrule :: IsLineInFreeZone2 (const Point2d & p1, const Point2d & p2) const
-{
-  int i;
-  int left, right, allleft, allright;
-  double nx, ny, nl, c;
-
-  if (p1.X() > fzmaxx && p2.X() > fzmaxx ||
-      p1.X() < fzminx && p2.X() < fzminx ||
-      p1.Y() > fzmaxy && p2.Y() > fzmaxy ||
-      p1.Y() < fzminy && p2.Y() < fzminy) return 0;
-
-  for (i = 1; i <= transfreezone.Size(); i++)
-    {
-      if (freesetinequ.Get(i, 1) * p1.X() + freesetinequ.Get(i, 2) * p1.Y() +
-	  freesetinequ.Get(i, 3) > -1e-6 &&
-	  freesetinequ.Get(i, 1) * p2.X() + freesetinequ.Get(i, 2) * p2.Y() +
-	  freesetinequ.Get(i, 3) > -1e-6
-	  ) return 0;
-    }
-
-  nx =  (p2.Y() - p1.Y());
-  ny = -(p2.X() - p1.X());
-  nl = sqrt (nx * nx + ny * ny);
-  if (nl > 1e-8)
-    {
-      nx /= nl;
-      ny /= nl;
-      c = - (p1.X() * nx + p1.Y() * ny);
-
-      allleft = 1;
-      allright = 1;
-
-      for (i = 1; i <= transfreezone.Size(); i++)
-	{
-	  left  = transfreezone.Get(i).X() * nx + transfreezone.Get(i).Y() + c <  1e-7;
-	  right = transfreezone.Get(i).X() * nx + transfreezone.Get(i).Y() + c > -1e-7;
-
-	  if (!left) allleft = 0;
-	  if (!right) allright = 0;
-	}
-      if (allleft || allright) return 0;
-    }
-
-  return 1;
-}
-
-int netrule :: ConvexFreeZone () const
-{
-  int n = transfreezone.Size();
-  for (int i = 1; i <= n; i++)
-    {
-      if (! CCW (transfreezone.Get(i), 
-		 transfreezone.Get(i % n + 1),
-		 transfreezone.Get( (i+1) % n + 1 ) ) )
-	return 0;
-    }
-  return 1;
-}
-
-
-/*
-float netrule :: CalcPointDist (int pi, const Point2d & p) const
-{
-  float dx = p.X() - points.Get(pi).X();
-  float dy = p.Y() - points.Get(pi).Y();
-  const threefloat * tf = &tolerances.Get(pi);
-
-  return tf->f1 * dx * dx + tf->f2 * dx * dy + tf->f3 * dy * dy;
-}
-*/
-
-float netrule :: CalcLineError (int li, const Vec2d & v) const
-{
-  float dx = v.X() - linevecs.Get(li).X();
-  float dy = v.Y() - linevecs.Get(li).Y();
-
-  const threefloat * tf = &linetolerances.Get(li);
-  return tf->f1 * dx * dx + tf->f2 * dx * dy + tf->f3 * dy * dy;
-}
-
-
-
-
-/*
-int GetNRules ()
-  {
-  return rules.Size();
-  }
-*/
-
-
-
-
-
-
-
-
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/netrule3.cpp b/contrib/Netgen/libsrc/meshing/netrule3.cpp
deleted file mode 100644
index fe6a7417c14af6764c6852beceb9b48b78326dfa..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/netrule3.cpp
+++ /dev/null
@@ -1,1138 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-// #define MARK
-// #include <prof.h>
-
-
-namespace netgen
-{
-
-
-vnetrule :: vnetrule ()
-{
-  name = "";
-  quality = 0;
-}
-
-vnetrule :: ~vnetrule ()
-{
-  if (strlen(name)) delete [] name;
-  for (int i = 1; i <= freefaces.Size(); i++)
-    delete freefaces.Elem(i);
-  for (int i = 1; i <= freesets.Size(); i++)
-    delete freesets.Elem(i);
-  for (int i = 1; i <= freeedges.Size(); i++)
-    delete freeedges.Elem(i);
-  for (int i = 1; i <= freefaceinequ.Size(); i++)
-    delete freefaceinequ.Elem(i);
-  delete oldutofreezone;
-  delete oldutofreezonelimit;
-}
-
-int vnetrule :: TestFlag (char flag) const
-{
-  for (int i = 1; i <= flags.Size(); i++)
-    if (flags.Get(i) == flag) return 1;
-  return 0;
-}
-
-
-void vnetrule :: SetFreeZoneTransformation (const Vector & allp, int tolclass)
-{
-  int i, j;
-  // double nx, ny, nz, v1x, v1y, v1z, v2x, v2y, v2z;
-  double nl;
-  const threeint * ti;
-  int fs;
-
-  double lam1 = 1.0/(2 * tolclass - 1);
-  double lam2 = 1-lam1;
-
-  transfreezone.SetSize (freezone.Size());
-  
-  int np = points.Size();
-  int nfp = freezone.Size();
-  Vector vp(np), vfp1(nfp), vfp2(nfp);
-
-
-  for (i = 1; i <= 3; i++)
-    {
-      for (j = 1; j <= np; j++)
-	vp.Elem(j) = allp.Get(i+3*j-3);
-
-      oldutofreezone->Mult (vp, vfp1);
-      oldutofreezonelimit->Mult (vp, vfp2);
-
-      vfp1 *= lam1;
-      vfp1.Add (lam2, vfp2);
-
-      for (j = 1; j <= nfp; j++)
-	transfreezone.Elem(j).X(i) = vfp1.Elem(j);
-    }
-
-  // MARK(setfz2);
-
-
-  fzbox.SetPoint (transfreezone.Elem(1));
-  for (i = 2; i <= freezone.Size(); i++)
-    fzbox.AddPoint (transfreezone.Elem(i));
-  
-  
-  // MARK(setfz3);
-
-
-  for (fs = 1; fs <= freesets.Size(); fs++)
-    {
-      ARRAY<threeint> & freesetfaces = *freefaces.Get(fs);
-      DenseMatrix & freesetinequ = *freefaceinequ.Get(fs);
-      
-      for (i = 1; i <= freesetfaces.Size(); i++)
-	{
-	  ti = &freesetfaces.Get(i);
-	  const Point3d & p1 = transfreezone.Get(ti->i1);
-	  const Point3d & p2 = transfreezone.Get(ti->i2);
-	  const Point3d & p3 = transfreezone.Get(ti->i3);
-
-	  Vec3d v1(p1, p2);   
-	  Vec3d v2(p1, p3);   
-	  Vec3d n;
-	  Cross (v1, v2, n);
-
-	  nl = n.Length();
-
-	  if (nl < 1e-10)
-	    {
-	      freesetinequ.Set(1, 1, 0);
-	      freesetinequ.Set(1, 2, 0);
-	      freesetinequ.Set(1, 3, 0);
-	      freesetinequ.Set(1, 4, -1);
-	    }
-	  else
-	    {
-	      //	      n /= nl;
-	      
-	      freesetinequ.Set(i, 1, n.X()/nl);
-	      freesetinequ.Set(i, 2, n.Y()/nl);
-	      freesetinequ.Set(i, 3, n.Z()/nl);
-	      freesetinequ.Set(i, 4,
-			       -(p1.X() * n.X() + p1.Y() * n.Y() + p1.Z() * n.Z()) / nl);
-	    }
-	}
-    }
-
-  /*
-  (*testout) << "Transformed freezone: " << endl;
-  for (i = 1; i <= transfreezone.Size(); i++)
-    (*testout) << transfreezone.Get(i) << " ";
-  (*testout) << endl;
-  */
-}
-
-int vnetrule :: ConvexFreeZone () const
-{
-  int i, j, k, fs;
-
-  // (*mycout) << "Convex free zone...\n";
-  
-  int ret1=1;
-  // int ret2=1;
-
-  for (fs = 1; fs <= freesets.Size(); fs++)
-    {
-      const DenseMatrix & freesetinequ = *freefaceinequ.Get(fs);
-
-      // const ARRAY<int> & freeset = *freesets.Get(fs);
-      const ARRAY<twoint> & freesetedges = *freeedges.Get(fs);
-      // const ARRAY<threeint> & freesetfaces = *freefaces.Get(fs);
-      
-      for (i = 1; i <= freesetedges.Size(); i++)
-	{
-	  j = freesetedges.Get(i).i1;    //triangle j with opposite point k
-	  k = freesetedges.Get(i).i2;
-	  
-	  if ( freesetinequ.Get(j, 1) * transfreezone.Get(k).X() +
-	       freesetinequ.Get(j, 2) * transfreezone.Get(k).Y() +
-	       freesetinequ.Get(j, 3) * transfreezone.Get(k).Z() +
-	       freesetinequ.Get(j, 4) > 0 )
-	    {
-	      ret1=0;
-	    }
-	}
-      
-    }
-
-  return ret1;
-}
-
-
-int vnetrule :: IsInFreeZone (const Point3d & p) const
-{
-  int i, fs;
-  char inthis;
-  
-  
-  for (fs = 1; fs <= freesets.Size(); fs++)
-    {
-      inthis = 1;
-      ARRAY<threeint> & freesetfaces = *freefaces.Get(fs);
-      DenseMatrix & freesetinequ = *freefaceinequ.Get(fs);
-      
-      for (i = 1; i <= freesetfaces.Size() && inthis; i++)
-	{
-	  if (freesetinequ.Get(i, 1) * p.X() + freesetinequ.Get(i, 2) * p.Y() +
-	      freesetinequ.Get(i, 3) * p.Z() + freesetinequ.Get(i, 4) > 0)
-	    inthis = 0;
-	}
-      
-      if (inthis) return 1;
-    }
-  
-  return 0;
-}
-
-
-int vnetrule :: IsTriangleInFreeZone (const Point3d & p1, 
-				      const Point3d & p2,
-				      const Point3d & p3, 
-				      const ARRAY<int> & pi, int newone)
-{
-  int fs;
-  int infreeset, cannot = 0;
-
-
-  static ARRAY<int> pfi(3), pfi2(3);
-
-  // convert from local index to freeset index
-  int i, j;
-  for (i = 1; i <= 3; i++)
-    {
-      pfi.Elem(i) = 0;
-      if (pi.Get(i))
-	{
-	  for (j = 1; j <= freezonepi.Size(); j++)
-	    if (freezonepi.Get(j) == pi.Get(i))
-	      pfi.Elem(i) = j;
-	}
-    }
-
-  for (fs = 1; fs <= freesets.Size(); fs++)
-    {
-      const ARRAY<int> & freeseti = *freesets.Get(fs);
-      for (i = 1; i <= 3; i++)
-	{
-	  pfi2.Elem(i) = 0;
-	  for (j = 1; j <= freeseti.Size(); j++)
-	    if (pfi.Get(i) == freeseti.Get(j))
-	      pfi2.Elem(i) = pfi.Get(i);
-	}
-
-      infreeset = IsTriangleInFreeSet(p1, p2, p3, fs, pfi2, newone);
-      if (infreeset == 1) return 1;
-      if (infreeset == -1) cannot = -1;
-    }
-  
-  return cannot;
-}
-
-
-
-int vnetrule :: IsTriangleInFreeSet (const Point3d & p1, const Point3d & p2,
-                                     const Point3d & p3, int fs,
-				     const ARRAY<int> & pi, int newone)
-{
-  int i, ii;
-  Vec3d n;
-  int allleft, allright;
-  int hos1, hos2, hos3, os1, os2, os3;
-  double hf, lam1, lam2, f, c1, c2, alpha;
-  double v1n, v2n, h11, h12, h22, dflam1, dflam2;
-  double lam1old, lam2old, fold;
-  double hpx, hpy, hpz, v1x, v1y, v1z, v2x, v2y, v2z;
-  int act1, act2, act3, it;
-  int cntout;
-  static ARRAY<int> activefaces;
-  int isin;
-  
-
-  // MARK(triinfz);
-  
-  ARRAY<threeint> & freesetfaces = *freefaces.Get(fs);
-  DenseMatrix & freesetinequ = *freefaceinequ.Get(fs);
-  
-
-  int cnt = 0;
-  for (i = 1; i <= 3; i++)
-    if (pi.Get(i)) cnt++;
-
-  /*
-  (*testout) << "trig in free set : " << p1 << " - " << p2 << " - " << p3 << endl;
-  (*testout) << "common points: " << cnt << endl;
-  */
-  if (!newone)
-    cnt = 0;
-
-  if (cnt == 1)
-    {
-      // MARK(triinfz1);
-
-      int upi = 0, lpiu = 0;
-      for (i = 1; i <= 3; i++)
-	if (pi.Get(i))
-	  {
-	    upi = i;
-	    lpiu = pi.Get(i);
-	  }
-
-      Vec3d v1, v2;
-      switch (upi)
-	{
-	case 1:
-	  {
-	    v1 = p2 - p1;
-	    v2 = p3 - p1;
-	    break;
-	  }
-	case 2:
-	  {
-	    v1 = p3 - p2;
-	    v2 = p1 - p2;
-	    break;
-	  }
-	case 3:
-	  {
-	    v1 = p1 - p3;
-	    v2 = p2 - p3;
-	    break;
-	  }
-	}
-
-      v1 /= v1.Length();
-      v2 /= v2.Length();
-      Cross (v1, v2, n);
-      n /= n.Length();
-
-      //      (*testout) << "Test new: " << endl;
-      for (i = 1; i <= freesetfaces.Size(); i++)
-	{
-	  if ( (freesetfaces.Get(i).i1 == lpiu) || 
-	       (freesetfaces.Get(i).i2 == lpiu) ||
-	       (freesetfaces.Get(i).i3 == lpiu) )
-	    {
-	      // freeface has point
-
-
-	      Vec3d a (freesetinequ.Get(i, 1),
-		       freesetinequ.Get(i, 2),
-		       freesetinequ.Get(i, 3));
-	      
-	      //	      if (1 - fabs (a * n) < 1e-8 ) 
-	      //		continue;
-
-	      Vec3d an;
-	      Cross (a, n, an);
-	      double lan = an.Length();
-	      if (lan < 1e-10)
-		continue;
-
-	      an /= lan;
-	      
-	      int out1 = (a * v1) > 0;
-	      int out2 = (a * v2) > 0;
-	      //	      (*testout) << "out1, out2 = " << out1 << ", " << out2 << endl;
-	      if (out1 && out2)
-		return 0;
-
-	      if (!out1 && !out2) 
-		continue;
-
-
-	      //	      if ( ( (an * v1) < 0) &&  ( (an * v2) < 0) )   // falsch !!!!
-	      //		an *= -1;
-
-	      // solve  an = lam1 v1 + lam2 v2
-	      double vii11 = v1 * v1;
-	      double vii12 = v1 * v2;
-	      double vii22 = v2 * v2;
-	      double det = vii11 * vii22 - vii12 * vii12;
-	      if ( fabs (det) < 1e-10 )
-		continue;
-	      double rs1 = an * v1;
-	      double rs2 = an * v2;
-	      
-	      double lam1 = rs1 * vii22 - rs2 * vii12;
-	      double lam2 = rs2 * vii11 - rs1 * vii12;
-
-	      if (fabs (lam1) > fabs (lam2))
-		{
-		  if (lam1 < 0)
-		    an *= -1;
-		}
-	      else
-		{
-		  if (lam2 < 0)
-		    an *= -1;
-		}
-
-
-	      if (lam1 * lam2 < 0 && 0)
-		{
-		  if (fabs (lam1) > 1e-14 && fabs (lam2) > 1e-14)
-		    {
-		      //		      (*mycout) << "lam1 lam2 < 0" << endl;
-		      (*testout) << "lami different" << endl;
-		      (*testout) << "v1 = " << v1 << endl;
-		      (*testout) << "v2 = " << v2 << endl;
-		      (*testout) << "n = " << n << endl;
-		      (*testout) << "a = " << a << endl;
-		      (*testout) << "an = " << an << endl;
-		      (*testout) << "a * v1 = " << (a * v1) << endl;
-		      (*testout) << "a * v2 = " << (a * v2) << endl;
-		      (*testout) << "an * v1 = " << (an * v1) << endl;
-		      (*testout) << "an * v2 = " << (an * v2) << endl;
-		      
-		      (*testout) << "vii = " << vii11 << ", " << vii12 << ", " << vii22 << endl;
-		      (*testout) << "lami = " << lam1 << ", " << lam2 << endl;
-		      (*testout) << "rs = " << rs1 << ", " << rs2 << endl;
-		      continue;
-		    }
-		}
-
-	      if (out1)
-		v1 = an;
-	      else
-		v2 = an;
-	    }
-	}
-      
-      return 1;
-
-      /*
-      (*testout) << "overlap trig " << p1 << p2 << p3 << endl;
-      (*testout) << "upi = " << upi << endl;
-      (*testout) << "v1 = " << v1 << " v2 = " << v2 << endl;
-      */
-
-      switch (upi)
-	{
-	case 1:
-	  {
-	    v1 = p2 - p1;
-	    v2 = p3 - p1;
-	    break;
-	  }
-	case 2:
-	  {
-	    v1 = p3 - p2;
-	    v2 = p1 - p2;
-	    break;
-	  }
-	case 3:
-	  {
-	    v1 = p1 - p3;
-	    v2 = p2 - p3;
-	    break;
-	  }
-	}
-
-      v1 /= v1.Length();
-      v2 /= v2.Length();
-      Cross (v1, v2, n);
-      n /= n.Length();
-
-      //      (*testout) << "orig v1, v2 = " << v1 << ", " << v2 << endl;
-
-      
-      for (i = 1; i <= freesetfaces.Size(); i++)
-	{
-	  if ( (freesetfaces.Get(i).i1 == lpiu) || 
-	       (freesetfaces.Get(i).i2 == lpiu) ||
-	       (freesetfaces.Get(i).i3 == lpiu) )
-	    {
-	      /*
-	      (*testout) << "v1, v2, now = " << v1 << ", " << v2 << endl;
-
-	      // freeface has point
-	      (*testout) << "freesetface: "
-			 << freesetfaces.Get(i).i1 << " "
-			 << freesetfaces.Get(i).i2 << " "
-			 << freesetfaces.Get(i).i3 << " ";
-	      */
-
-	      Vec3d a (freesetinequ.Get(i, 1),
-		       freesetinequ.Get(i, 2),
-		       freesetinequ.Get(i, 3));
-	      //	      (*testout) << "a = " <<  a << endl;
-
-
-	      Vec3d an;
-	      Cross (a, n, an);
-	      double lan = an.Length();
-	      
-	      //	      (*testout) << "an = " << an << endl;
-
-	      if (lan < 1e-10)
-		continue;
-
-	      an /= lan;
-
-	      //	      (*testout) << "a*v1 = " << (a*v1) << " a*v2 = " << (a*v2) << endl;
-	      
-	      int out1 = (a * v1) > 0;
-	      // int out2 = (a * v2) > 0;
-
-
-	      //	      (*testout) << "out1, 2 = " << out1 << ", " << out2 << endl;
-
-	      
-	      double vii11 = v1 * v1;
-	      double vii12 = v1 * v2;
-	      double vii22 = v2 * v2;
-	      double det = vii11 * vii22 - vii12 * vii12;
-	      if ( fabs (det) < 1e-10 )
-		continue;
-	      double rs1 = an * v1;
-	      double rs2 = an * v2;
-	      
-	      double lam1 = rs1 * vii22 - rs2 * vii12;
-	      double lam2 = rs2 * vii11 - rs1 * vii12;
-
-	      //	      (*testout) << "lam1, lam2 = " << lam1 << ", " << lam2 << endl;
-
-
-	      if (fabs (lam1) > fabs (lam2))
-		{
-		  if (lam1 < 0)
-		    an *= -1;
-		}
-	      else
-		{
-		  if (lam2 < 0)
-		    an *= -1;
-		}
-
-
-	      if (lam1 * lam2 < 0)
-		{
-		  if (fabs (lam1) > 1e-14 && fabs (lam2) > 1e-14)
-		    {
-		      //		      (*mycout) << "lam1 lam2 < 0" << endl;
-		      (*testout) << "lami different" << endl;
-		      (*testout) << "v1 = " << v1 << endl;
-		      (*testout) << "v2 = " << v2 << endl;
-		      (*testout) << "n = " << n << endl;
-		      (*testout) << "a = " << a << endl;
-		      (*testout) << "an = " << an << endl;
-		      (*testout) << "a * v1 = " << (a * v1) << endl;
-		      (*testout) << "a * v2 = " << (a * v2) << endl;
-		      (*testout) << "an * v1 = " << (an * v1) << endl;
-		      (*testout) << "an * v2 = " << (an * v2) << endl;
-		      
-		      (*testout) << "vii = " << vii11 << ", " << vii12 << ", " << vii22 << endl;
-		      (*testout) << "lami = " << lam1 << ", " << lam2 << endl;
-		      (*testout) << "rs = " << rs1 << ", " << rs2 << endl;
-		      continue;
-		    }
-		}
-
-	      if (out1)
-		v1 = an;
-	      else
-		v2 = an;
-
-
-
-	    }
-	}
-
-      return 1;
-    }
-
-
-
-  if (cnt == 2)
-    {
-      //      (*testout) << "tripoitns: " << p1 << " " << p2 << " " << p3 << endl;
-
-      // MARK(triinfz2);
-
-      int pi1 = 0, pi2 = 0, pi3 = 0;
-      Vec3d a1, a2;  // outer normals
-      Vec3d trivec;  // vector from common edge to third point of triangle
-      for (i = 1; i <= 3; i++)
-	if (pi.Get(i))
-	  {
-	    pi2 = pi1;
-	    pi1 = pi.Get(i);
-	  }
-	else
-	  pi3 = i;
-
-      switch (pi3)
-	{
-	case 1: trivec = (p1 - p2); break;
-	case 2: trivec = (p2 - p3); break;
-	case 3: trivec = (p3 - p2); break;
-	}
-
-      ARRAY<int> lpi(freezonepi.Size());
-      for (i = 1; i <= lpi.Size(); i++)
-	lpi.Elem(i) = 0;
-      lpi.Elem(pi1) = 1;
-      lpi.Elem(pi2) = 1;
-      
-      int ff1 = 0, ff2 = 0;
-      for (i = 1; i <= freesetfaces.Size(); i++)
-	{
-	  if (lpi.Get(freesetfaces.Get(i).i1) + 
-	      lpi.Get(freesetfaces.Get(i).i2) + 
-	      lpi.Get(freesetfaces.Get(i).i3) == 2)
-	    {
-	      ff2 = ff1;
-	      ff1 = i;
-	    }
-	}
-
-      if (ff2 == 0)
-	return 1;
-
-      a1 = Vec3d (freesetinequ.Get(ff1, 1),
-		  freesetinequ.Get(ff1, 2),
-		  freesetinequ.Get(ff1, 3));
-      a2 = Vec3d (freesetinequ.Get(ff2, 1),
-		  freesetinequ.Get(ff2, 2),
-		  freesetinequ.Get(ff2, 3));
-
-      if ( ( (a1 * trivec) > 0) || ( (a2 * trivec) > 0))
-	return 0;
-
-      return 1;
-    }
-
-
-  if (cnt == 3)
-    {
-      // MARK(triinfz3);  
-
-      ARRAY<int> lpi(freezonepi.Size());
-      for (i = 1; i <= lpi.Size(); i++)
-	lpi.Elem(i) = 0;
-
-      for (i = 1; i <= 3; i++)
-	lpi.Elem(pi.Get(i)) = 1;
-      
-      for (i = 1; i <= freesetfaces.Size(); i++)
-	{
-	  if (lpi.Get(freesetfaces.Get(i).i1) + 
-	      lpi.Get(freesetfaces.Get(i).i2) + 
-	      lpi.Get(freesetfaces.Get(i).i3) == 3)
-	    {
-	      return 0;
-	    }
-	}
-      return 1;
-    }
-
-  // MARK(triinfz0);  
-
-  
-  os1 = os2 = os3 = 0;
-  activefaces.SetSize(0);
-
-  // is point inside ?
-
-  for (i = 1; i <= freesetfaces.Size(); i++)
-    {
-      hos1 = freesetinequ.Get(i, 1) * p1.X() +
-	freesetinequ.Get(i, 2) * p1.Y() +
-	freesetinequ.Get(i, 3) * p1.Z() +
-	freesetinequ.Get(i, 4) > -1E-5;
-      
-      hos2 = freesetinequ.Get(i, 1) * p2.X() +
-	freesetinequ.Get(i, 2) * p2.Y() +
-	freesetinequ.Get(i, 3) * p2.Z() +
-	freesetinequ.Get(i, 4) > -1E-5;
-      
-      hos3 = freesetinequ.Get(i, 1) * p3.X() +
-	freesetinequ.Get(i, 2) * p3.Y() +
-	freesetinequ.Get(i, 3) * p3.Z() +
-	freesetinequ.Get(i, 4) > -1E-5;
-      
-      if (hos1 && hos2 && hos3) return 0;
-      
-      if (hos1) os1 = 1;
-      if (hos2) os2 = 1;
-      if (hos3) os3 = 1;
-      
-      if (hos1 || hos2 || hos3) activefaces.Append (i);
-    }
-  
-  if (!os1 || !os2 || !os3) return 1;
-
-  v1x = p2.X() - p1.X();
-  v1y = p2.Y() - p1.Y();
-  v1z = p2.Z() - p1.Z();
-
-  v2x = p3.X() - p1.X();
-  v2y = p3.Y() - p1.Y();
-  v2z = p3.Z() - p1.Z();
-
-  n.X() = v1y * v2z - v1z * v2y;
-  n.Y() = v1z * v2x - v1x * v2z;
-  n.Z() = v1x * v2y - v1y * v2x;
-  n /= n.Length();
-
-  allleft = allright = 1;
-  for (i = 1; i <= transfreezone.Size() && (allleft || allright); i++)
-    {
-      const Point3d & p = transfreezone.Get(i);
-      float scal = (p.X() - p1.X()) * n.X() +
-	(p.Y() - p1.Y()) * n.Y() +
-	(p.Z() - p1.Z()) * n.Z();
-
-      if ( scal >  1E-8 ) allleft = 0;
-      if ( scal < -1E-8 ) allright = 0;
-    }
-
-  if (allleft || allright) return 0;
-
-
-  lam1old = lam2old = lam1 = lam2 = 1.0 / 3.0;
-
-
-  //  testout << endl << endl << "Start minimizing" << endl;
-
-  it = 0;
-  int minit;
-  minit = 1000;
-  fold = 1E10;
-
-
-
-  while (1)
-    {
-      it++;
-
-      if (it > 1000) return -1;
-
-      if (lam1 < 0) lam1 = 0;
-      if (lam2 < 0) lam2 = 0;
-      if (lam1 + lam2 > 1) lam1 = 1 - lam2;
-
-      if (it > minit)
-	{
-	  (*testout) << "it = " << it << endl;
-	  (*testout) << "lam1/2 = " << lam1 << "  " << lam2 << endl;
-	}
-
-      hpx = p1.X() + lam1 * v1x + lam2 * v2x;
-      hpy = p1.Y() + lam1 * v1y + lam2 * v2y;
-      hpz = p1.Z() + lam1 * v1z + lam2 * v2z;
-
-      f = 0;
-
-      h11 = h12 = h22 = dflam1 = dflam2 = 0;
-      cntout = 0;
-
-      isin = 1;
-
-      for (i = 1; i <= activefaces.Size(); i++)
-	{
-	  ii = activefaces.Get(i);
-
-	  hf = freesetinequ.Get(ii, 1) * hpx +
-	    freesetinequ.Get(ii, 2) * hpy +
-	    freesetinequ.Get(ii, 3) * hpz +
-	    freesetinequ.Get(ii, 4);
-
-	  if (hf > -1E-7) isin = 0;
-
-	  hf += 1E-4;
-	  if (hf > 0)
-	    {
-	      f += hf * hf;
-
-	      v1n = freesetinequ.Get(ii, 1) * v1x +
-		freesetinequ.Get(ii, 2) * v1y +
-		freesetinequ.Get(ii, 3) * v1z;
-	      v2n = freesetinequ.Get(ii, 1) * v2x +
-		freesetinequ.Get(ii, 2) * v2y +
-		freesetinequ.Get(ii, 3) * v2z;
-
-	      h11 += 2 * v1n * v1n;
-	      h12 += 2 * v1n * v2n;
-	      h22 += 2 * v2n * v2n;
-	      dflam1 += 2 * hf * v1n;
-	      dflam2 += 2 * hf * v2n;
-	      cntout++;
-	    }
-	}
-
-      if (isin) return 1;
-
-      if (it > minit)
-	{
-	  (*testout) << "f = " << f
-		     << "  dfdlam = " << dflam1 << "  " << dflam2 << endl;
-	  (*testout) << "h = " << h11 << "  " << h12 << "  " << h22 << endl;
-	  (*testout) << "active: " << cntout << endl;
-	  (*testout) << "lam1-lam1old = " << (lam1 - lam1old) << endl;
-	  (*testout) << "lam2-lam2old = " << (lam2 - lam2old) << endl;
-	}
-
-
-      if (f >= fold)
-	{
-	  lam1 = 0.100000000000000 * lam1 + 0.9000000000000000 * lam1old;
-	  lam2 = 0.100000000000000 * lam2 + 0.9000000000000000 * lam2old;
-	}
-      else
-	{
-	  lam1old = lam1;
-	  lam2old = lam2;
-	  fold = f;
-
-
-	  if (f < 1E-9) return 1;
-
-	  h11 += 1E-10;
-	  h22 += 1E-10;
-	  c1 = - ( h22 * dflam1 - h12 * dflam2) / (h11 * h22 - h12 * h12);
-	  c2 = - (-h12 * dflam1 + h11 * dflam2) / (h11 * h22 - h12 * h12);
-	  alpha = 1;
-
-
-	  if (it > minit)
-	    (*testout) << "c1/2 = " << c1 << "  " << c2 << endl;
-
-	  act1 = lam1 <= 1E-6 && c1 <= 0;
-	  act2 = lam2 <= 1E-6 && c2 <= 0;
-	  act3 = lam1 + lam2 >= 1 - 1E-6 && c1 + c2 >= 0;
-
-	  if (it > minit)
-	    (*testout) << "act1,2,3 = " << act1 << act2 << act3 << endl;
-
-	  if (act1 && act2 || act1 && act3 || act2 && act3) return 0;
-
-	  if (act1)
-	    {
-	      c1 = 0;
-	      c2 = - dflam2 / h22;
-	    }
-
-	  if (act2)
-	    {
-	      c1 = - dflam1 / h11;
-	      c2 = 0;
-	    }
-
-	  if (act3)
-	    {
-	      c1 = - (dflam1 - dflam2) / (h11 + h22 - 2 * h12);
-	      c2 = -c1;
-	    }
-
-	  if (it > minit)
-	    (*testout) << "c1/2 now = " << c1 << "  " << c2 << endl;
-
-
-	  if (f > 100 * sqrt (sqr (c1) + sqr (c2))) return 0;
-
-
-	  if (lam1 + alpha * c1 < 0 && !act1)
-	    alpha = -lam1 / c1;
-	  if (lam2 + alpha * c2 < 0 && !act2)
-	    alpha = -lam2 / c2;
-	  if (lam1 + lam2 + alpha * (c1 + c2) > 1 && !act3)
-	    alpha = (1 - lam1 - lam2) / (c1 + c2);
-
-	  if (it > minit)
-	    (*testout) << "alpha = " << alpha << endl;
-
-	  lam1 += alpha * c1;
-	  lam2 += alpha * c2;
-	}
-    }
-}
-
-
-
-
-int vnetrule :: IsQuadInFreeZone (const Point3d & p1, 
-				  const Point3d & p2,
-				  const Point3d & p3, 
-				  const Point3d & p4, 
-				  const ARRAY<int> & pi, int newone)
-{
-  int fs;
-  int infreeset, cannot = 0;
-
-
-  static ARRAY<int> pfi(4), pfi2(4);
-
-  // convert from local index to freeset index
-  int i, j;
-  for (i = 1; i <= 4; i++)
-    {
-      pfi.Elem(i) = 0;
-      if (pi.Get(i))
-	{
-	  for (j = 1; j <= freezonepi.Size(); j++)
-	    if (freezonepi.Get(j) == pi.Get(i))
-	      pfi.Elem(i) = j;
-	}
-    }
-
-  for (fs = 1; fs <= freesets.Size(); fs++)
-    {
-      const ARRAY<int> & freeseti = *freesets.Get(fs);
-      for (i = 1; i <= 4; i++)
-	{
-	  pfi2.Elem(i) = 0;
-	  for (j = 1; j <= freeseti.Size(); j++)
-	    if (pfi.Get(i) == freeseti.Get(j))
-	      pfi2.Elem(i) = pfi.Get(i);
-	}
-
-      infreeset = IsQuadInFreeSet(p1, p2, p3, p4, fs, pfi2, newone);
-      if (infreeset == 1) return 1;
-      if (infreeset == -1) cannot = -1;
-    }
-  
-  return cannot;
-}
-
-
-int vnetrule :: IsQuadInFreeSet (const Point3d & p1, const Point3d & p2,
-				 const Point3d & p3, const Point3d & p4, 
-				 int fs, const ARRAY<int> & pi, int newone)
-{
-  int i;
-  
-  int cnt = 0;
-  for (i = 1; i <= 4; i++)
-    if (pi.Get(i)) cnt++;
-  
-  /*
-  (*testout) << "test quad in freeset: " << p1 << " - " << p2 << " - " << p3 << " - " << p4 << endl;
-  (*testout) << "pi = ";
-  for (i = 1; i <= pi.Size(); i++)
-    (*testout) << pi.Get(i) << " ";
-  (*testout) << endl;
-  (*testout) << "cnt = " << cnt  << endl;
-  */
-  if (cnt == 4)
-    {
-      return 1;
-    }
-
-  if (cnt == 3)
-    {
-      return 1;
-    }
-
-  static ARRAY<int> pi3(3);
-  int res;
-
-  pi3.Elem(1) = pi.Get(1);
-  pi3.Elem(2) = pi.Get(2);
-  pi3.Elem(3) = pi.Get(3);
-  res = IsTriangleInFreeSet (p1, p2, p3, fs, pi3, newone);
-  if (res) return res;
-
-
-  pi3.Elem(1) = pi.Get(2);
-  pi3.Elem(2) = pi.Get(3);
-  pi3.Elem(3) = pi.Get(4);
-  res = IsTriangleInFreeSet (p2, p3, p4, fs, pi3, newone);
-  if (res) return res;
-
-  pi3.Elem(1) = pi.Get(3);
-  pi3.Elem(2) = pi.Get(4);
-  pi3.Elem(3) = pi.Get(1);
-  res = IsTriangleInFreeSet (p3, p4, p1, fs, pi3, newone);
-  if (res) return res;
-
-  pi3.Elem(1) = pi.Get(4);
-  pi3.Elem(2) = pi.Get(1);
-  pi3.Elem(3) = pi.Get(2);
-  res = IsTriangleInFreeSet (p4, p1, p2, fs, pi3, newone);
-  return res;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-float vnetrule :: CalcPointDist (int pi, const Point3d & p) const
-{
-  float dx = p.X() - points.Get(pi).X();
-  float dy = p.Y() - points.Get(pi).Y();
-  float dz = p.Z() - points.Get(pi).Z();
-  
-  //  const threefloat * tf = &tolerances.Get(pi);
-  //  return tf->f1 * dx * dx + tf->f2 * dx * dy + tf->f3 * dy * dy;
-  return tolerances.Get(pi) * (dx * dx + dy * dy + dz * dz);
-}
-
-
-int vnetrule :: TestOk () const
-{
-  ARRAY<int> cntpused(points.Size());
-  ARRAY<int> edge1, edge2;
-  ARRAY<int> delf(faces.Size());
-  int i, j, k;
-  int pi1, pi2;
-  int found;
-
-  for (i = 1; i <= cntpused.Size(); i++)
-    cntpused.Elem(i) = 0;
-  for (i = 1; i <= faces.Size(); i++)
-    delf.Elem(i) = 0;
-  for (i = 1; i <= delfaces.Size(); i++)
-    delf.Elem(delfaces.Get(i)) = 1;
-
-
-  for (i = 1; i <= faces.Size(); i++)
-    if (delf.Get(i) || i > noldf)
-      for (j = 1; j <= faces.Get(i).GetNP(); j++)
-        cntpused.Elem(faces.Get(i).PNum(j))++;
-
-  for (i = 1; i <= cntpused.Size(); i++)
-    if (cntpused.Get(i) > 0 && cntpused.Get(i) < 2)
-      {
-	return 0;
-      }
-
-
-  //  (*testout) << endl;
-  for (i = 1; i <= faces.Size(); i++)
-    {
-      //      (*testout) << "face " << i << endl;
-      for (j = 1; j <= faces.Get(i).GetNP(); j++)
-	{
-	  pi1 = 0; pi2 = 0;
-	  if (delf.Get(i))
-	    {
-	      pi1 = faces.Get(i).PNumMod(j);
-	      pi2 = faces.Get(i).PNumMod(j+1);
-	    }
-	  if (i > noldf)
-	    {
-	      pi1 = faces.Get(i).PNumMod(j+1);
-	      pi2 = faces.Get(i).PNumMod(j);
-	    }
-
-	  found = 0;
-	  if (pi1)
-	    {
-	      for (k = 1; k <= edge1.Size(); k++)
-		if (edge1.Get(k) == pi1 && edge2.Get(k) == pi2)
-		  {
-		    found = 1;
-		    edge1.DeleteElement(k);
-		    edge2.DeleteElement(k);
-		    k--;
-		    //		    (*testout) << "Del edge " << pi1 << "-" << pi2 << endl;
-		  }
-	      if (!found)
-		{
-		  edge1.Append (pi2);
-		  edge2.Append (pi1);
-		  //		  (*testout) << "Add edge " << pi1 << "-" << pi2 << endl;
-		}
-	    }
-	}
-    }
-
-
-  if (edge1.Size() > 0)
-    {
-      return 0;
-    }
-
-  /*
-    cntpused.SetSize(freezone.Size());
-    for (i = 1; i <= cntpused.Size(); i++)
-    cntpused[i] = 0;
-
-    for (i = 1; i <= freefaces.Size(); i++)
-    {
-    cntpused[freefaces[i].i1]++;
-    cntpused[freefaces[i].i2]++;
-    cntpused[freefaces[i].i3]++;
-    }
-
-    for (i = 1; i <= cntpused.Size(); i++)
-    if (cntpused[i] < 3)
-    {
-    (*mycout) << "Fall 3" << endl;
-    return 0;
-    }
-
-
-
-    for (i = 1; i <= freefaces.Size(); i++)
-    {
-    for (j = 1; j <= 3; j++)
-    {
-    if (j == 1)
-    {
-    pi1 = freefaces[i].i1;
-    pi2 = freefaces[i].i2;
-    }
-    if (j == 2)
-    {
-    pi1 = freefaces[i].i2;
-    pi2 = freefaces[i].i3;
-    }
-    if (j == 3)
-    {
-    pi1 = freefaces[i].i3;
-    pi2 = freefaces[i].i1;
-    }
-
-    found = 0;
-    for (k = 1; k <= edge1.Size(); k++)
-    if (edge1[k] == pi1 && edge2[k] == pi2)
-    {
-    found = 1;
-    edge1.DeleteElement(k);
-    edge2.DeleteElement(k);
-    k--;
-    }
-
-    if (!found)
-    {
-    edge1.Append (pi2);
-    edge2.Append (pi1);
-    }
-    }
-    }
-
-    if (edge1.Size() > 0)
-    {
-    (*mycout) << "Fall 4" << endl;
-    return 0;
-    }
-    */
-  return 1;
-}
-
-
-int vnetrule :: IsDelFace (int fn) const
-{
-  int i;
-  for (i = 1; i <= GetNDelF(); i++)
-    if (GetDelFace(i) == fn) return 1;
-  return 0;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/parser2.cpp b/contrib/Netgen/libsrc/meshing/parser2.cpp
deleted file mode 100644
index 48ef280eb402457217e5abe7e3d117ca97c97773..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/parser2.cpp
+++ /dev/null
@@ -1,559 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-
-void LoadMatrixLine (istream & ist, DenseMatrix & m, int line)
-{
-  char ch;
-  int pnum;
-  float f;
-
-  ist >> ch;
-  while (ch != '}')
-    {
-      ist.putback (ch);
-      ist >> f;
-      ist >> ch;
-      ist >> pnum;
-
-      if (ch == 'x' || ch == 'X')
-	m.Elem(line, 2 * pnum - 1) = f;
-      if (ch == 'y' || ch == 'Y')
-	m.Elem(line, 2 * pnum) = f;
-
-      ist >> ch;
-      if (ch == ',')
-	ist >> ch;
-    }
-}
-
-
-void netrule :: LoadRule (istream & ist)
-{
-  char buf[256];
-  char ch;
-  Point2d p;
-  INDEX_2 lin;
-  int i, j;
-  DenseMatrix tempoldutonewu(20, 20), tempoldutofreearea(20, 20),
-    tempoldutofreearealimit(20, 20);
-
-  tempoldutonewu = 0;
-  tempoldutofreearea = 0;
-  tempoldutofreearealimit = 0;
-
-  noldp = 0;
-  noldl = 0;
-
-  ist.get (buf, sizeof(buf), '"');
-  ist.get (ch);
-  ist.get (buf, sizeof(buf), '"');
-  ist.get (ch);
-
-  if(name != NULL) delete [] name;
-  name = new char[strlen (buf) + 1];
-  strcpy (name, buf);
-  //  (*mycout) << "Rule " << name << " found." << endl;
-
-  do
-    {
-      ist >> buf;
-
-      if (strcmp (buf, "quality") == 0)
-
-	{
-	  ist >> quality;
-	}
-
-      else if (strcmp (buf, "mappoints") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      ist >> p.X();
-	      ist >> ch;    // ','
-	      ist >> p.Y();
-	      ist >> ch;    // ')'
-
-	      points.Append (p);
-	      noldp++;
-
-	      tolerances.SetSize (noldp);
-	      tolerances.Elem(noldp).f1 = 1.0;
-	      tolerances.Elem(noldp).f2 = 0;
-	      tolerances.Elem(noldp).f3 = 1.0;
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == '{')
-		    {
-		      ist >> tolerances.Elem(noldp).f1;
-		      ist >> ch;  // ','
-		      ist >> tolerances.Elem(noldp).f2;
-		      ist >> ch;  // ','
-		      ist >> tolerances.Elem(noldp).f3;
-		      ist >> ch;  // '}'
-		    }
-		  else if (ch == 'd')
-		    {
-		      //            delpoints.Append (noldp);
-		      ist >> ch; // 'e'
-		      ist >> ch; // 'l'
-		    }
-
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-
-      else if (strcmp (buf, "maplines") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      ist >> lin.I1();
-	      ist >> ch;    // ','
-	      ist >> lin.I2();
-	      ist >> ch;    // ')'
-
-	      lines.Append (lin);
-	      linevecs.Append (points.Get(lin.I2()) - points.Get(lin.I1()));
-	      noldl++;
-	      linetolerances.SetSize (noldl);
-	      linetolerances.Elem(noldl).f1 = 0;
-	      linetolerances.Elem(noldl).f2 = 0;
-	      linetolerances.Elem(noldl).f3 = 0;
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == '{')
-		    {
-		      ist >> linetolerances.Elem(noldl).f1;
-		      ist >> ch;  // ','
-		      ist >> linetolerances.Elem(noldl).f2;
-		      ist >> ch;  // ','
-		      ist >> linetolerances.Elem(noldl).f3;
-		      ist >> ch;  // '}'
-		    }
-		  else if (ch == 'd')
-		    {
-		      dellines.Append (noldl);
-		      ist >> ch; // 'e'
-		      ist >> ch; // 'l'
-		    }
-
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "newpoints") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      ist >> p.X();
-	      ist >> ch;    // ','
-	      ist >> p.Y();
-	      ist >> ch;    // ')'
-
-	      points.Append (p);
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == '{')
-		    {
-		      LoadMatrixLine (ist, tempoldutonewu,
-				      2 * (points.Size()-noldp) - 1);
-
-		      ist >> ch; // '{'
-		      LoadMatrixLine (ist, tempoldutonewu,
-				      2 * (points.Size()-noldp));
-		    }
-
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "newlines") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      ist >> lin.I1();
-	      ist >> ch;    // ','
-	      ist >> lin.I2();
-	      ist >> ch;    // ')'
-
-	      lines.Append (lin);
-	      linevecs.Append (points.Get(lin.I2()) - points.Get(lin.I1()));
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "freearea") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      ist >> p.X();
-	      ist >> ch;    // ','
-	      ist >> p.Y();
-	      ist >> ch;    // ')'
-
-	      freezone.Append (p);
-	      freezonelimit.Append (p);
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == '{')
-		    {
-		      LoadMatrixLine (ist, tempoldutofreearea,
-				      2 * freezone.Size() - 1);
-
-		      ist >> ch; // '{'
-		      LoadMatrixLine (ist, tempoldutofreearea,
-				      2 * freezone.Size());
-		    }
-
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  for (i = 1; i <= tempoldutofreearealimit.Height(); i++)
-	    for (j = 1; j <= tempoldutofreearealimit.Width(); j++)
-	      tempoldutofreearealimit.Elem(i,j) =
-		tempoldutofreearea.Elem(i,j);
-
-
-	  ist.putback (ch);
-	}    
-      else if (strcmp (buf, "freearea2") == 0)
-	{
-	  ist >> ch;
-	  int freepi = 0;
-	  tempoldutofreearealimit = 0;
-
-	  while (ch == '(')
-	    {
-	      freepi++;
-
-	      ist >> p.X();
-	      ist >> ch;    // ','
-	      ist >> p.Y();
-	      ist >> ch;    // ')'
-
-	      freezonelimit.Elem(freepi) = p;
-	  
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == '{')
-		    {
-		      LoadMatrixLine (ist, tempoldutofreearealimit,
-				      2 * freepi - 1);
-
-		      ist >> ch; // '{'
-		      LoadMatrixLine (ist, tempoldutofreearealimit,
-				      2 * freepi);
-		    }
-
-		  ist >> ch;
-		}
-	  
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "elements") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      elements.Append (Element2d());
-
-	      ist >> elements.Last().PNum(1);
-	      ist >> ch;    // ','
-	  
-	      if (ch == ',')
-		{
-		  ist >> elements.Last().PNum(2);
-		  ist >> ch;    // ','
-		}
-	      if (ch == ',')
-		{
-		  ist >> elements.Last().PNum(3);
-		  ist >> ch;    // ','
-		}
-	      if (ch == ',')
-		{
-		  elements.Last().SetType (QUAD);
-		  ist >> elements.Last().PNum(4);
-		  ist >> ch;    // ','
-		  
-		  // const Element2d & el = elements.Last();
-		  /*
-		  orientations.Append (threeint(el.PNum(1), el.PNum(2), el.PNum(3)));
-		  orientations.Append (threeint(el.PNum(2), el.PNum(3), el.PNum(4)));
-		  orientations.Append (threeint(el.PNum(3), el.PNum(4), el.PNum(1)));
-		  orientations.Append (threeint(el.PNum(4), el.PNum(1), el.PNum(2)));
-		  */
-		}
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "orientations") == 0)
-
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      //        threeint a = threeint();
-	      orientations.Append (threeint());
-
-	      ist >> orientations.Last().i1;
-	      ist >> ch;    // ','
-	      ist >> orientations.Last().i2;
-	      ist >> ch;    // ','
-	      ist >> orientations.Last().i3;
-	      ist >> ch;    // ','
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "endrule") != 0)
-	{
-	  PrintSysError ("Parser error, unknown token ", buf);
-	}
-    }
-  while (!ist.eof() && strcmp (buf, "endrule") != 0);
-
-  oldutonewu.SetSize (2 * (points.Size() - noldp), 2 * noldp);
-  oldutofreearea.SetSize (2 * freezone.Size(), 2 * noldp);
-  oldutofreearealimit.SetSize (2 * freezone.Size(), 2 * noldp);
-
-  for (i = 1; i <= oldutonewu.Height(); i++)
-    for (j = 1; j <= oldutonewu.Width(); j++)
-      oldutonewu.Elem(i, j) = tempoldutonewu.Elem(i, j);
-
-  for (i = 1; i <= oldutofreearea.Height(); i++)
-    for (j = 1; j <= oldutofreearea.Width(); j++)
-      oldutofreearea.Elem(i, j) = tempoldutofreearea.Elem(i, j);
-
-  for (i = 1; i <= oldutofreearea.Height(); i++)
-    for (j = 1; j <= oldutofreearea.Width(); j++)
-      oldutofreearealimit.Elem(i, j) = tempoldutofreearealimit.Elem(i, j);
-
-  freesetinequ.SetSize (freezone.Size());
-
-
-
-  {
-    char ok;
-    int minn;
-    ARRAY<int> pnearness (noldp);
-
-    for (i = 1; i <= pnearness.Size(); i++)
-      pnearness.Elem(i) = 1000;
-
-    for (j = 1; j <= 2; j++)
-      pnearness.Elem(GetPointNr (1, j)) = 0;
-
-    do
-      {
-	ok = 1;
-
-	for (i = 1; i <= noldl; i++)
-	  {
-	    minn = 1000;
-	    for (j = 1; j <= 2; j++)
-	      minn = min2 (minn, pnearness.Get(GetPointNr (i, j)));
-
-	    for (j = 1; j <= 2; j++)
-	      if (pnearness.Get(GetPointNr (i, j)) > minn+1)
-		{
-		  ok = 0;
-		  pnearness.Elem(GetPointNr (i, j)) = minn+1;
-		}
-	  }
-      }
-    while (!ok);
-
-    lnearness.SetSize (noldl);
-
-    for (i = 1; i <= noldl; i++)
-      {
-	lnearness.Elem(i) = 0;
-	for (j = 1; j <= 2; j++)
-	  lnearness.Elem(i) += pnearness.Get(GetPointNr (i, j));
-      }
-  }
-
-  oldutofreearea_i.SetSize (10);
-  for (i = 0; i < oldutofreearea_i.Size(); i++)
-    {
-      oldutofreearea_i[i] = new DenseMatrix (oldutofreearea.Height(), oldutofreearea.Width());
-      DenseMatrix & mati = *oldutofreearea_i[i];
-      for (int j = 0; j < oldutofreearea.Height(); j++)
-	for (int k = 0; k < oldutofreearea.Width(); k++)
-	  mati(j,k) = 1.0 / (i+1) * oldutofreearea(j,k) + (1 - 1.0/(i+1)) * oldutofreearealimit(j,k);
-    }
-}
-
-
-
-
-extern const char * triarules[];
-extern const char * quadrules[];
-
-void Meshing2 :: LoadRules (const char * filename)
-{
-  char buf[256];
-  istream * ist;
-  char *tr1 = NULL;
-
-  /*
-  ifstream ist (filename);
-  if (!ist.good())
-    {
-      cerr << "Rule description file " << filename << " not found" << endl;
-      exit (1);
-    }
-  */
-
-
-  if (filename)
-    {
-      //      (*mycout) << "rule-filename = " << filename << endl;
-      ist = new ifstream (filename);
-    }
-  else 
-    {
-      /* connect tetrules to one string */
-      const char ** hcp;
-
-      if (!mparam.quad)
-	{
-	  hcp = triarules;
-	  PrintMessage (3, "load internal triangle rules");
-	}
-      else
-	{
-	  hcp = quadrules;
-	  PrintMessage (3, "load internal quad rules");
-	  // LoadRules ("rules/quad.rls");
-	}
-
-      int len = 0;
-      while (*hcp)
-	{
-	  len += strlen (*hcp);
-	  hcp++;
-	}
-      tr1 = new char[len+1];
-      tr1[0] = 0;
-
-
-      if (!mparam.quad)
-	hcp = triarules;
-      else
-	hcp = quadrules;
-
-
-      char * tt1 = tr1;
-      while (*hcp)
-	{
-	  strcat (tt1, *hcp);
-	  tt1 += strlen (*hcp);
-	  hcp++;
-	}
-
-      ist = new istringstream (tr1);
-    }
-
-
-  if (!ist->good())
-    {
-      cerr << "Rule description file " << filename << " not found" << endl;
-      delete ist;
-      exit (1);
-    }
-    
-  while (!ist->eof())
-    {
-      buf[0] = 0;
-      (*ist) >> buf;
-
-      if (strcmp (buf, "rule") == 0)
-	{
-	  netrule * rule = new netrule;
-	  rule -> LoadRule(*ist);
-	  rules.Append (rule);
-	}
-    }
-
-  delete ist;
-  delete [] tr1;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/parser3.cpp b/contrib/Netgen/libsrc/meshing/parser3.cpp
deleted file mode 100644
index 23ee84802e17ee2e39ced378ec4de3edddfcf0f6..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/parser3.cpp
+++ /dev/null
@@ -1,987 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-extern const char * tetrules[];
-
-void LoadVMatrixLine (istream & ist, DenseMatrix & m, int line)
-{
-  char ch;
-  int pnum;
-  float f;
-  
-  ist >> ch;
-  while (ch != '}')
-    {
-      ist.putback (ch);
-      ist >> f;
-      ist >> ch;
-      ist >> pnum;
-      
-      if (ch == 'x' || ch == 'X')
-	m.Elem(line, 3 * pnum - 2) = f;
-      if (ch == 'y' || ch == 'Y')
-	m.Elem(line, 3 * pnum - 1) = f;
-      if (ch == 'z' || ch == 'Z')
-	m.Elem(line, 3 * pnum    ) = f;
-
-      if (ch == 'p' || ch == 'P')
-	{
-	  m.Elem(line  , 3 * pnum-2) = f;
-	  m.Elem(line+1, 3 * pnum-1) = f;
-	  m.Elem(line+2, 3 * pnum  ) = f;
-	}
-
-      ist >> ch;
-      if (ch == ',')
-	ist >> ch;
-    }
-}
-
-
-
-
-
-int vnetrule :: NeighbourTrianglePoint (const threeint & t1, const threeint & t2) const
-{
-  ARRAY<int> tr1(3);
-  ARRAY<int> tr2(3);
-  tr1.Elem(1)=t1.i1;
-  tr1.Elem(2)=t1.i2;
-  tr1.Elem(3)=t1.i3;
-  tr2.Elem(1)=t2.i1;
-  tr2.Elem(2)=t2.i2;
-  tr2.Elem(3)=t2.i3;
-
-
-  int ret=0;
-
-  for (int i=1; i<=3; i++)
-    {
-      for (int j=1; j<=3; j++)
-	{
-	  if ((tr1.Get(i)==tr2.Get(j) && tr1.Get((i%3)+1)==tr2.Get((j%3)+1)) ||
-              (tr1.Get(i)==tr2.Get((j%3)+1) && tr1.Get((i%3)+1)==tr2.Get(j)))
-	    {ret = tr2.Get((j+1)%3+1);}
-	}      
-    }
-
-  return ret;
-
-}
-
-void vnetrule :: LoadRule (istream & ist)
-{
-  char buf[256];
-  char ch, ok;
-  Point3d p;
-  Element2d face;
-  int i, j, i1, i2, i3, fs, ii, ii1, ii2, ii3;
-  twoint edge;
-  DenseMatrix tempoldutonewu(30, 20), 
-    tempoldutofreezone(30, 20),
-    tempoldutofreezonelimit(30, 20),
-    tfz(20, 20),
-    tfzl(20, 20);
-
-  tempoldutonewu = 0;
-  tempoldutofreezone = 0;
-  tfz = 0;
-  tfzl = 0;
-
-
-  noldp = 0;
-  noldf = 0;
-
-  ist.get (buf, sizeof(buf), '"');
-  ist.get (ch);
-  ist.get (buf, sizeof(buf), '"');
-  ist.get (ch);
-
-  name = new char[strlen (buf) + 1];
-  strcpy (name, buf);
-  //  (*mycout) << "Rule " << name << " found." << endl;
-
-  do
-    {
-      ist >> buf;
-
-      if (strcmp (buf, "quality") == 0)
-
-	{
-	  ist >> quality;
-	}
-
-      else if (strcmp (buf, "flags") == 0)
-	{
-	  ist >> ch;
-	  while (ch != ';')
-	    {
-	      flags.Append (ch);
-	      ist >> ch;
-	    }
-	}
-
-      else if (strcmp (buf, "mappoints") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      ist >> p.X();
-	      ist >> ch;    // ','
-	      ist >> p.Y();
-	      ist >> ch;    // ','
-	      ist >> p.Z();
-	      ist >> ch;    // ')'
-
-	      points.Append (p);
-	      noldp++;
-
-	      tolerances.SetSize (noldp);
-	      tolerances.Elem(noldp) = 1;
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == '{')
-		    {
-		      ist >> tolerances.Elem(noldp);
-		      ist >> ch;  // '}'
-		    }
-
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-
-      else if (strcmp (buf, "mapfaces") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      face.SetType(TRIG);
-	      ist >> face.PNum(1);
-	      ist >> ch;    // ','
-	      ist >> face.PNum(2);
-	      ist >> ch;    // ','
-	      ist >> face.PNum(3);
-	      ist >> ch;    // ')' or ','
-	      if (ch == ',')
-		{
-		  face.SetType(QUAD);
-		  ist >> face.PNum(4);
-		  ist >> ch;    // ')' 
-		}
-	      faces.Append (face);
-	      noldf++;
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == 'd')
-		    {
-		      delfaces.Append (noldf);
-		      ist >> ch; // 'e'
-		      ist >> ch; // 'l'
-		    }
-
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "mapedges") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      ist >> edge.i1;
-	      ist >> ch;    // ','
-	      ist >> edge.i2;
-	      ist >> ch;    // ')'
-
-	      edges.Append (edge);
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-
-      else if (strcmp (buf, "newpoints") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      ist >> p.X();
-	      ist >> ch;    // ','
-	      ist >> p.Y();
-	      ist >> ch;    // ','
-	      ist >> p.Z();
-	      ist >> ch;    // ')'
-
-	      points.Append (p);
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == '{')
-		    {
-		      LoadVMatrixLine (ist, tempoldutonewu,
-				       3 * (points.Size()-noldp) - 2);
-
-		      ist >> ch; // '{'
-		      LoadVMatrixLine (ist, tempoldutonewu,
-				       3 * (points.Size()-noldp) - 1);
-
-		      ist >> ch; // '{'
-		      LoadVMatrixLine (ist, tempoldutonewu,
-				       3 * (points.Size()-noldp)    );
-		    }
-
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "newfaces") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      face.SetType(TRIG);
-	      ist >> face.PNum(1);
-	      ist >> ch;    // ','
-	      ist >> face.PNum(2);
-	      ist >> ch;    // ','
-	      ist >> face.PNum(3);
-	      ist >> ch;    // ')' or ','
-	      if (ch == ',')
-		{
-		  face.SetType(QUAD);
-		  ist >> face.PNum(4);
-		  ist >> ch;    // ')' 
-		}
-	      faces.Append (face);
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "freezone") == 0)
-	{
-	  ist >> ch;
-	
-	  while (ch == '(')
-	    {
-	      ist >> p.X();
-	      ist >> ch;    // ','
-	      ist >> p.Y();
-	      ist >> ch;    // ','
-	      ist >> p.Z();
-	      ist >> ch;    // ')'
-	    
-	      freezone.Append (p);
-	    
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  if (ch == '{')
-		    {
-		      LoadVMatrixLine (ist, tempoldutofreezone,
-				       3 * freezone.Size() - 2);
-		    
-		      ist >> ch; // '{'
-		      LoadVMatrixLine (ist, tempoldutofreezone,
-				       3 * freezone.Size() - 1);
-		    
-		      ist >> ch; // '{'
-		      LoadVMatrixLine (ist, tempoldutofreezone,
-				       3 * freezone.Size()    );
-		    }
-		
-		  ist >> ch;
-		}
-	    
-	      ist >> ch;
-	    }
-	
-	  ist.putback (ch);
-	}
-      else if (strcmp (buf, "freezone2") == 0)
-	{
-	  int i, j, k, nfp;
-	  Point3d p;
-
-	  nfp = 0;
-	  ist >> ch;
-
-	  DenseMatrix hm1(3, 50), hm2(50, 50), hm3(50, 50);
-	  hm3 = 0;
-
-	  while (ch == '{')
-	    {
-	      hm1 = 0;
-	      nfp++;
-	      LoadVMatrixLine (ist, hm1, 1);
-
-	      for (i = 1; i <= points.Size(); i++)
-		tfz.Elem(nfp, i) = hm1.Get(1, 3*i-2);
-
-
-	      p.X() = p.Y() = p.Z() = 0;
-	      for (i = 1; i <= points.Size(); i++)
-		{
-		  p.X() += hm1.Get(1, 3*i-2) * points.Get(i).X();
-		  p.Y() += hm1.Get(1, 3*i-2) * points.Get(i).Y();
-		  p.Z() += hm1.Get(1, 3*i-2) * points.Get(i).Z();
-		}
-	      freezone.Append (p);
-	      freezonelimit.Append (p);
-	    
-	      hm2 = 0;
-	      for (i = 1; i <= 3 * noldp; i++)
-		hm2.Elem(i, i) = 1;
-	      for (i = 1; i <= 3 * noldp; i++)
-		for (j = 1; j <= 3 * (points.Size() - noldp); j++)
-		  hm2.Elem(j + 3 * noldp, i) = tempoldutonewu.Get(j, i);
-		  
-	      for (i = 1; i <= 3; i++)
-		for (j = 1; j <= 3 * noldp; j++)
-		  {
-		    double sum = 0;
-		    for (k = 1; k <= 3 * points.Size(); k++)
-		      sum += hm1.Get(i, k) * hm2.Get(k, j);
-		  
-		    hm3.Elem(i + 3 * (nfp-1), j) = sum;
-		  }
-
-	      //	    (*testout) << "freepoint: " << p << endl;
-
-	      while (ch != ';')
-		ist >> ch; 
-
-	      ist >> ch;
-	    }
-
-	  tfzl = tfz;
-
-	  tempoldutofreezone = hm3;
-	  tempoldutofreezonelimit = hm3;
-	  ist.putback(ch);
-	}
-
-      else if (strcmp (buf, "freezonelimit") == 0)
-	{
-	  int i, j, k, nfp;
-	  Point3d p;
-
-	  nfp = 0;
-	  ist >> ch;
-
-	  DenseMatrix hm1(3, 50), hm2(50, 50), hm3(50, 50);
-	  hm3 = 0;
-
-	  while (ch == '{')
-	    {
-	      hm1 = 0;
-	      nfp++;
-	      LoadVMatrixLine (ist, hm1, 1);
-
-	      for (i = 1; i <= points.Size(); i++)
-		tfzl.Elem(nfp, i) = hm1.Get(1, 3*i-2);
-
-
-	      p.X() = p.Y() = p.Z() = 0;
-	      for (i = 1; i <= points.Size(); i++)
-		{
-		  p.X() += hm1.Get(1, 3*i-2) * points.Get(i).X();
-		  p.Y() += hm1.Get(1, 3*i-2) * points.Get(i).Y();
-		  p.Z() += hm1.Get(1, 3*i-2) * points.Get(i).Z();
-		}
-	      freezonelimit.Elem(nfp) = p;
-	    
-	      hm2 = 0;
-	      for (i = 1; i <= 3 * noldp; i++)
-		hm2.Elem(i, i) = 1;
-	      for (i = 1; i <= 3 * noldp; i++)
-		for (j = 1; j <= 3 * (points.Size() - noldp); j++)
-		  hm2.Elem(j + 3 * noldp, i) = tempoldutonewu.Get(j, i);
-		  
-	      for (i = 1; i <= 3; i++)
-		for (j = 1; j <= 3 * noldp; j++)
-		  {
-		    double sum = 0;
-		    for (k = 1; k <= 3 * points.Size(); k++)
-		      sum += hm1.Get(i, k) * hm2.Get(k, j);
-		  
-		    hm3.Elem(i + 3 * (nfp-1), j) = sum;
-		  }
-
-	      //	    (*testout) << "freepoint: " << p << endl;
-
-	      while (ch != ';')
-		ist >> ch; 
-
-	      ist >> ch;
-	    }
-
-	  tempoldutofreezonelimit = hm3;
-	  ist.putback(ch);
-	}
-
-      else if (strcmp (buf, "freeset") == 0)
-	{
-	  freesets.Append (new ARRAY<int>);
-
-	  ist >> ch;
-
-	  while (ch != ';')
-	    {
-	      ist.putback (ch);
-	      ist >> i;
-	      freesets.Last()->Append(i);
-	      ist >> ch;
-	    }
-	}
-
-      else if (strcmp (buf, "elements") == 0)
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      elements.Append (Element(TET));
-
-	      //	      elements.Last().SetNP(1);
-	      ist >> elements.Last().PNum(1);
-	      ist >> ch;    // ','
-
-	      if (ch == ',')
-		{
-		  //		  elements.Last().SetNP(2);
-		  ist >> elements.Last().PNum(2);
-		  ist >> ch;    // ','
-		}
-	      if (ch == ',')
-		{
-		  //		  elements.Last().SetNP(3);
-		  ist >> elements.Last().PNum(3);
-		  ist >> ch;    // ','
-		}
-	      if (ch == ',')
-		{
-		  //		  elements.Last().SetNP(4);
-		  elements.Last().SetType(TET);
-		  ist >> elements.Last().PNum(4);
-		  ist >> ch;    // ','
-		}
-	      if (ch == ',')
-		{
-		  //		  elements.Last().SetNP(5);
-		  elements.Last().SetType(PYRAMID);
-		  ist >> elements.Last().PNum(5);
-		  ist >> ch;    // ','
-		}
-	      if (ch == ',')
-		{
-		  //		  elements.Last().SetNP(6);
-		  elements.Last().SetType(PRISM);
-		  ist >> elements.Last().PNum(6);
-		  ist >> ch;    // ','
-		}
-
-	      /*
-	      orientations.Append (fourint());
-	      orientations.Last().i1 = elements.Last().PNum(1);
-	      orientations.Last().i2 = elements.Last().PNum(2);
-	      orientations.Last().i3 = elements.Last().PNum(3);
-	      orientations.Last().i4 = elements.Last().PNum(4);
-	      */
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-      else if (strcmp (buf, "orientations") == 0)
-
-	{
-	  ist >> ch;
-
-	  while (ch == '(')
-	    {
-	      //        fourint a = fourint();
-	      orientations.Append (fourint());
-
-	      ist >> orientations.Last().i1;
-	      ist >> ch;    // ','
-	      ist >> orientations.Last().i2;
-	      ist >> ch;    // ','
-	      ist >> orientations.Last().i3;
-	      ist >> ch;    // ','
-	      ist >> orientations.Last().i4;
-	      ist >> ch;    // ','
-
-
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  ist >> ch;
-		}
-
-	      ist >> ch;
-	    }
-
-	  ist.putback (ch);
-	}
-
-
-      else if (strcmp (buf, "endrule") != 0)
-	{
-	  PrintSysError ("Parser3d, unknown token " , buf);
-	}
-    }
-  while (!ist.eof() && strcmp (buf, "endrule") != 0);
-
-
-  //  (*testout) << endl;
-  //  (*testout) << Name() << endl;
-  //  (*testout) << "no1 = " << GetNO() << endl;
-
-  oldutonewu.SetSize (3 * (points.Size() - noldp), 3 * noldp);
-  oldutonewu = 0;
-
-  for (i = 1; i <= oldutonewu.Height(); i++)
-    for (j = 1; j <= oldutonewu.Width(); j++)
-      oldutonewu.Elem(i, j) = tempoldutonewu.Elem(i, j);
-
-
-  /*
-    oldutofreezone = new SparseMatrixFlex (3 * freezone.Size(), 3 * noldp);
-    oldutofreezonelimit = new SparseMatrixFlex (3 * freezone.Size(), 3 * noldp);
-
-    oldutofreezone -> SetSymmetric(0);
-    oldutofreezonelimit -> SetSymmetric(0);
-    */
-
-  /*
-    oldutofreezone = new DenseMatrix (3 * freezone.Size(), 3 * noldp);
-    oldutofreezonelimit = new DenseMatrix (3 * freezone.Size(), 3 * noldp);
-  
-    for (i = 1; i <= oldutofreezone->Height(); i++)
-    for (j = 1; j <= oldutofreezone->Width(); j++)
-    //      if (j == 4 || j >= 7)
-    {
-    if (tempoldutofreezone.Elem(i, j))
-    (*oldutofreezone)(i, j) = tempoldutofreezone(i, j);
-    if (tempoldutofreezonelimit.Elem(i, j))
-    (*oldutofreezonelimit)(i, j) = tempoldutofreezonelimit(i, j);
-    }
-    */
-
-
-
-
-  oldutofreezone = new DenseMatrix (freezone.Size(), points.Size());
-  oldutofreezonelimit = new DenseMatrix (freezone.Size(), points.Size());
-  //  oldutofreezone = new SparseMatrixFlex (freezone.Size(), points.Size());
-  //  oldutofreezonelimit = new SparseMatrixFlex (freezone.Size(), points.Size());
-
-  for (i = 1; i <= freezone.Size(); i++)
-    for (j = 1; j <= points.Size(); j++)
-      {
-	if (tfz.Elem(i, j))
-	  (*oldutofreezone).Elem(i, j) = tfz.Elem(i, j);
-	if (tfzl.Elem(i, j))
-	  (*oldutofreezonelimit).Elem(i, j) = tfzl.Elem(i, j);
-      }
-  
-  /*
-  (*testout) << "Rule " << Name() << endl;
-  (*testout) << "oldutofreezone = " << (*oldutofreezone) << endl;
-  (*testout) << "oldutofreezonelimit = " << (*oldutofreezonelimit) << endl;
-  */
-
-  freezonepi.SetSize (freezone.Size());
-  for (i = 1; i <= freezonepi.Size(); i++)
-    freezonepi.Elem(i) = 0;
-  for (i = 1; i <= freezone.Size(); i++)
-    for (j = 1; j <= noldp; j++)
-      if (Dist (freezone.Get(i), points.Get(j)) < 1e-8)
-	freezonepi.Elem(i) = j;
-
-
-
-  
-  for (i = 1; i <= elements.Size(); i++)
-    {
-      if (elements.Elem(i).GetNP() == 4)
-	{
-	  orientations.Append (fourint());
-	  orientations.Last().i1 = elements.Get(i).PNum(1);
-	  orientations.Last().i2 = elements.Get(i).PNum(2);
-	  orientations.Last().i3 = elements.Get(i).PNum(3);
-	  orientations.Last().i4 = elements.Get(i).PNum(4);
-	}
-      if (elements.Elem(i).GetNP() == 5)
-	{
-	  orientations.Append (fourint());
-	  orientations.Last().i1 = elements.Get(i).PNum(1);
-	  orientations.Last().i2 = elements.Get(i).PNum(2);
-	  orientations.Last().i3 = elements.Get(i).PNum(3);
-	  orientations.Last().i4 = elements.Get(i).PNum(5);
-
-	  orientations.Append (fourint());
-	  orientations.Last().i1 = elements.Get(i).PNum(1);
-	  orientations.Last().i2 = elements.Get(i).PNum(3);
-	  orientations.Last().i3 = elements.Get(i).PNum(4);
-	  orientations.Last().i4 = elements.Get(i).PNum(5);
-	}
-    }
-
-
-
-  if (freesets.Size() == 0)
-    {
-      freesets.Append (new ARRAY<int>);
-      for (i = 1; i <= freezone.Size(); i++)
-	freesets.Elem(1)->Append(i);
-    }
-
-
-  //  testout << "Freezone: " << endl;
-
-  //  for (i = 1; i <= freezone.Size(); i++)
-  //    (*testout) << "freepoint: " << freezone.Get(i) << endl;
-  Vector vp(points.Size()), vfp(freezone.Size());
-
-
-  if (quality < 100)
-    {
-      for (i = 1; i <= 3; i++)
-	{
-	  for (j = 1; j <= points.Size(); j++)
-	    vp.Elem(j) = points.Get(j).X(i);
-	  oldutofreezone->Mult(vp, vfp);
-	  for (j = 1; j <= freezone.Size(); j++)
-	    freezone.Elem(j).X(i) = vfp.Get(j);
-	}
-      //      for (i = 1; i <= freezone.Size(); i++)
-      //	(*testout) << "freepoint: " << freezone.Get(i) << endl;
-    }
-
-
-  for (fs = 1; fs <= freesets.Size(); fs++)
-    {
-      freefaces.Append (new ARRAY<threeint>);
-
-      ARRAY<int> & freeset = *freesets.Elem(fs);
-      ARRAY<threeint> & freesetfaces = *freefaces.Last();
-
-      for (ii1 = 1; ii1 <= freeset.Size(); ii1++)
-	for (ii2 = 1; ii2 <= freeset.Size(); ii2++)
-	  for (ii3 = 1; ii3 <= freeset.Size(); ii3++)
-	    if (ii1 < ii2 && ii1 < ii3 && ii2 != ii3)
-	      {
-		i1 = freeset.Get(ii1);
-		i2 = freeset.Get(ii2);
-		i3 = freeset.Get(ii3);
-
-		Vec3d v1, v2, n;
-
-		v1 = freezone.Get(i3) - freezone.Get(i1);
-		v2 = freezone.Get(i2) - freezone.Get(i1);
-		n = Cross (v1, v2);
-		n /= n.Length();
-		//		(*testout) << "i1,2,3 = " << i1 << ", " << i2 << ", " << i3 << endl;
-		//		(*testout) << "v1 = " << v1 << " v2 = " << v2 << " n = " << n << endl;
-		ok = 1;
-		for (ii = 1; ii <= freeset.Size(); ii++)
-		  {
-		    i = freeset.Get(ii);
-		    //		    (*testout) << "i = " << i << endl;
-		    if (i != i1 && i != i2 && i != i3)
-		      if ( (freezone.Get(i) - freezone.Get(i1)) * n < 0 ) ok = 0;
-		  }
-
-		if (ok)
-		  {
-		    freesetfaces.Append (threeint());
-		    freesetfaces.Last().i1 = i1;
-		    freesetfaces.Last().i2 = i2;
-		    freesetfaces.Last().i3 = i3;
-		  }
-	      }
-    }
-
-  for (fs = 1; fs <= freesets.Size(); fs++)
-    {
-      freefaceinequ.Append (new DenseMatrix (freefaces.Get(fs)->Size(), 4));
-    }
-
-
-  {
-    char ok;
-    int minn;
-    //    ARRAY<int> pnearness (noldp);
-    pnearness.SetSize (noldp);
-
-    for (i = 1; i <= pnearness.Size(); i++)
-      pnearness.Elem(i) = INT_MAX/10;
-
-    for (j = 1; j <= GetNP(1); j++)
-      pnearness.Elem(GetPointNr (1, j)) = 0;
-
-    do
-      {
-	ok = 1;
-
-	for (i = 1; i <= noldf; i++)
-	  {
-	    minn = INT_MAX/10;
-	    for (j = 1; j <= GetNP(i); j++)
-	      minn = min2 (minn, pnearness.Get(GetPointNr (i, j)));
-
-	    for (j = 1; j <= GetNP(i); j++)
-	      if (pnearness.Get(GetPointNr (i, j)) > minn+1)
-		{
-		  ok = 0;
-		  pnearness.Elem(GetPointNr (i, j)) = minn+1;
-		}
-	  }
-
-	for (i = 1; i <= elements.Size(); i++)
-	  if (elements.Get(i).GetNP() == 6)
-	    {
-	      for (j = 1; j <= 3; j++)
-		{
-		  int pi1 = elements.Get(i).PNum(j);
-		  int pi2 = elements.Get(i).PNum(j+3);
-
-		  if (pnearness.Get(pi1) > pnearness.Get(pi2)+1)
-		    {
-		      ok = 0;
-		      pnearness.Elem(pi1) = pnearness.Get(pi2)+1;
-		    }
-		  if (pnearness.Get(pi2) > pnearness.Get(pi1)+1)
-		    {
-		      ok = 0;
-		      pnearness.Elem(pi2) = pnearness.Get(pi1)+1;
-		    }
-		}
-	    }
-      }
-    while (!ok);
-
-    int maxpnearness = 0;
-    for (i = 1; i <= pnearness.Size(); i++)
-      maxpnearness = max2 (maxpnearness, pnearness.Get(i));
-
-
-    fnearness.SetSize (noldf);
-
-    for (i = 1; i <= noldf; i++)
-      {
-	fnearness.Elem(i) = 0;
-	for (j = 1; j <= GetNP(i); j++)
-	  fnearness.Elem(i) += pnearness.Get(GetPointNr (i, j));
-      }
-  }
-
-  
-  //Table of edges:
-  for (fs = 1; fs <= freesets.Size(); fs++)
-    {
-      freeedges.Append (new ARRAY<twoint>);
-      
-      //      ARRAY<int> & freeset = *freesets.Get(fs);
-      ARRAY<twoint> & freesetedges = *freeedges.Last();
-      ARRAY<threeint> & freesetfaces = *freefaces.Get(fs);
-      int k,l;
-      INDEX ind;
-      
-      for (k = 1; k <= freesetfaces.Size(); k++)
-	{
-          threeint tr = freesetfaces.Get(k);
-
-	  for (l = k+1; l <= freesetfaces.Size(); l++)
-	    {
-	      ind = NeighbourTrianglePoint(freesetfaces.Get(k), freesetfaces.Get(l));
-	      if (!ind) continue;
-
-	      INDEX_3 f1(freesetfaces.Get(k).i1, 
-			 freesetfaces.Get(k).i2, 
-			 freesetfaces.Get(k).i3);
-	      INDEX_3 f2(freesetfaces.Get(l).i1, 
-			 freesetfaces.Get(l).i2, 
-			 freesetfaces.Get(l).i3);
-	      INDEX_2 edge(0, 0);
-	      for (int f11 = 1; f11 <= 3; f11++)
-		for (int f12 = 1; f12 <= 3; f12++)
-		  if (f11 != f12)
-		    for (int f21 = 1; f21 <= 3; f21++)
-		      for (int f22 = 1; f22 <= 3; f22++)		    
-			if (f1.I(f11) == f2.I(f21) && f1.I(f12) == f2.I(f22))
-			{
-			  edge.I(1) = f1.I(f11);
-			  edge.I(2) = f1.I(f12);
-			}
-	      //	      (*testout) << "edge = " << edge.I(1) << "-" << edge.I(2) << endl;
-	      //	      (*testout) << "ind = " << ind << " edge = " << edge << endl;
-	      for (int eli = 1; eli <= GetNOldF(); eli++)
-		{
-		  if (GetNP(eli) == 4)
-		    {
-		      for (int elr = 1; elr <= 4; elr++)
-			{
-			  if (GetPointNrMod (eli, elr) == edge.I(1) &&
-			      GetPointNrMod (eli, elr+2) == edge.I(2))
-			    {
-			      /*
-			      (*testout) << "edge is diagonal of rectangle" << endl;
-			      (*testout) << "edge = " << edge.I(1) << "-" << edge.I(2) << endl;
-			      (*testout) << "ind = " << ind << endl;
-			      */
-			      ind = 0;
-			    }
-
-			}
-		    }
-		}
-
-	      if (ind)
-		{
-		  /*
-		  (*testout) << "new edge from face " << k 
-			     << " = (" << freesetfaces.Get(k).i1 
-			     << ", " << freesetfaces.Get(k).i2 
-			     << ", " << freesetfaces.Get(k).i3
-			     << "), point " << ind << endl;
-			     */
-		  freesetedges.Append(twoint(k,ind));
-		}
-	    }	
-	}
-    }
-    
-}
-
-
-
-
-
-void Meshing3 :: LoadRules (const char * filename, const char ** prules)
-{
-  char buf[256];
-  istream * ist;
-  char *tr1 = NULL;
-
-  if (filename)
-    {
-      PrintMessage (3, "rule-filename = ", filename);
-      ist = new ifstream (filename);
-    }
-  else 
-    {
-      /* connect tetrules to one string */
-      PrintMessage (3, "Use internal rules");
-      if (!prules) prules = tetrules;
-
-      const char ** hcp = prules; 
-      int len = 0;
-      while (*hcp)
-	{
-	  len += strlen (*hcp);
-	  hcp++;
-	}
-      tr1 = new char[len+1];
-      tr1[0] = 0;
-      hcp = prules; //  tetrules;
-
-
-      char * tt1 = tr1;
-      while (*hcp)
-	{
-	  strcat (tt1, *hcp);
-	  tt1 += strlen (*hcp);	  
-	  hcp++;
-	}
-
-      ist = new istringstream (tr1);
-    }
-  
-  if (!ist->good())
-    {
-      cerr << "Rule description file " << filename << " not found" << endl;
-      delete ist;
-      exit (1);
-    }
-    
-  while (!ist->eof())
-    {
-      buf[0] = 0;
-      (*ist) >> buf;
-	
-      if (strcmp (buf, "rule") == 0)
-	{
-	  vnetrule * rule = new vnetrule;
-	  rule -> LoadRule(*ist);
-	  rules.Append (rule);
-	  if (!rule->TestOk())
-	    {
-	      PrintSysError ("Parser3d: Rule ", rules.Size(), " not ok");
-	      exit (1);
-	    }
-	}
-      else if (strcmp (buf, "tolfak") == 0)
-	{
-	  (*ist) >> tolfak;
-	}
-    }
-  delete ist;
-  delete [] tr1;
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/prism2rls.cpp b/contrib/Netgen/libsrc/meshing/prism2rls.cpp
deleted file mode 100644
index 7e696554c0fef82fbafcb0633917eddcaaf5de27..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/prism2rls.cpp
+++ /dev/null
@@ -1,457 +0,0 @@
-namespace netgen
-{
-const char * prismrules2[] = {
-"tolfak 0.5\n",\
-"\n",\
-"rule \"prism on quad\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(1, 5, 2) del;\n",\
-"(4, 3, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3, 6);\n",\
-"(1, 5, 6, 4);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3, 5);\n",\
-"(1, 3, 4, 6);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.3 P1, -0.1 P2, -0.1 P3, 0.3 P4, 0.3 P5, 0.3 P6 };\n",\
-"{ -0.1 P1, 0.3 P2, 0.3 P3, -0.1 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.25 P1, 0 P2, 0 P3, 0.25 P4, 0.25 P5, 0.25 P6 };\n",\
-"{ 0 P1, 0.25 P2, 0.25 P3, 0 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5 6 7;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 5 6 8;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on quad, one trig\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(1, 5, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3, 6);\n",\
-"(1, 5, 6, 4);\n",\
-"(4, 6, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3, 5);\n",\
-"(1, 3, 4, 6);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.3 P1, -0.1 P2, -0.1 P3, 0.3 P4, 0.3 P5, 0.3 P6 };\n",\
-"{ -0.1 P1, 0.3 P2, 0.3 P3, -0.1 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.25 P1, 0 P2, 0 P3, 0.25 P4, 0.25 P5, 0.25 P6 };\n",\
-"{ 0 P1, 0.25 P2, 0.25 P3, 0 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5 6 7;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 5 6 8;\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on 2 quad\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 5, 6, 3) del;\n",\
-"(1, 5, 2) del;\n",\
-"(4, 3, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 5, 6, 4);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.3 P1, -0.1 P2, -0.1 P3, 0.3 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.25 P1, 0 P2, 0 P3, 0.25 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5 6 7;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 6;\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on 2 quad, one trig\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 5, 6, 3) del;\n",\
-"(1, 5, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 5, 6, 4);\n",\
-"(4, 6, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.3 P1, -0.1 P2, -0.1 P3, 0.3 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.25 P1, 0 P2, 0 P3, 0.25 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5 6 7;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 6;\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on 2 quada\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(5, 1, 4, 6) del;\n",\
-"(1, 5, 2) del;\n",\
-"(4, 3, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3, 6);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ -0.1 P1, 0.3 P2, 0.3 P3, -0.1 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0 P1, 0.25 P2, 0.25 P3, 0 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5 6 7;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 6;\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"fill prism\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 5, 6, 3) del;\n",\
-"(5, 1, 4, 6) del;\n",\
-"(1, 5, 2) del;\n",\
-"(4, 3, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 6;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on 3 quad, one trig\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 5, 6, 3) del;\n",\
-"(5, 1, 4, 6) del;\n",\
-"(1, 5, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(4, 6, 3);\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 6;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"flat prism\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(0.5, 0.866, 0);\n",\
-"(0, 0, -1);\n",\
-"(1, 0, -1);\n",\
-"(0.5, 0.866, -1);\n",\
-"\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(5, 4, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 4);\n",\
-"(4, 2, 5);\n",\
-"(2, 3, 5);\n",\
-"(5, 3, 6);\n",\
-"(3, 1, 6);\n",\
-"(6, 1, 4);\n",\
-"\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 5, 4, 6);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"endrule\n",\
-"\n",\
-0};
-}
diff --git a/contrib/Netgen/libsrc/meshing/prism2rls_2.cpp b/contrib/Netgen/libsrc/meshing/prism2rls_2.cpp
deleted file mode 100644
index baf0bef388bcec25d3c21391d602caf1ba44b39a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/prism2rls_2.cpp
+++ /dev/null
@@ -1,446 +0,0 @@
-namespace netgen
-{
-const char * prismrules2[] = {
-"tolfak 0.5\n",\
-"\n",\
-"rule \"prism on quad\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(1, 5, 2) del;\n",\
-"(4, 3, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3, 6);\n",\
-"(1, 5, 6, 4);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3, 5);\n",\
-"(1, 3, 4, 6);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.3 P1, -0.1 P2, -0.1 P3, 0.3 P4, 0.3 P5, 0.3 P6 };\n",\
-"{ -0.1 P1, 0.3 P2, 0.3 P3, -0.1 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.25 P1, 0 P2, 0 P3, 0.25 P4, 0.25 P5, 0.25 P6 };\n",\
-"{ 0 P1, 0.25 P2, 0.25 P3, 0 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on quad, one trig\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(1, 5, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3, 6);\n",\
-"(1, 5, 6, 4);\n",\
-"(4, 6, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3, 5);\n",\
-"(1, 3, 4, 6);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.3 P1, -0.1 P2, -0.1 P3, 0.3 P4, 0.3 P5, 0.3 P6 };\n",\
-"{ -0.1 P1, 0.3 P2, 0.3 P3, -0.1 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.25 P1, 0 P2, 0 P3, 0.25 P4, 0.25 P5, 0.25 P6 };\n",\
-"{ 0 P1, 0.25 P2, 0.25 P3, 0 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on 2 quad\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 5, 6, 3) del;\n",\
-"(1, 5, 2) del;\n",\
-"(4, 3, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 5, 6, 4);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.3 P1, -0.1 P2, -0.1 P3, 0.3 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.25 P1, 0 P2, 0 P3, 0.25 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5 6 7;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 6;\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on 2 quad, one trig\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 5, 6, 3) del;\n",\
-"(1, 5, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 5, 6, 4);\n",\
-"(4, 6, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.3 P1, -0.1 P2, -0.1 P3, 0.3 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0.25 P1, 0 P2, 0 P3, 0.25 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5 6 7;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 6;\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on 2 quada\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(5, 1, 4, 6) del;\n",\
-"(1, 5, 2) del;\n",\
-"(4, 3, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3, 6);\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ -0.1 P1, 0.3 P2, 0.3 P3, -0.1 P4, 0.3 P5, 0.3 P6 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 0 P1, 0.25 P2, 0.25 P3, 0 P4, 0.25 P5, 0.25 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5 6 7;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 6;\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"fill prism\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 5, 6, 3) del;\n",\
-"(5, 1, 4, 6) del;\n",\
-"(1, 5, 2) del;\n",\
-"(4, 3, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 6;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"prism on 3 quad, one trig\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0, -0.86);\n",\
-"(0.5, 1, -0.86);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 5, 6, 3) del;\n",\
-"(5, 1, 4, 6) del;\n",\
-"(1, 5, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(4, 6, 3);\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 5, 2, 4, 6, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5;\n",\
-"\n",\
-"freeset\n",\
-"2 3 4 6;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"flat prism\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(0.5, 0.866, 0);\n",\
-"(0, 0, -1);\n",\
-"(1, 0, -1);\n",\
-"(0.5, 0.866, -1);\n",\
-"\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(5, 4, 6) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 4);\n",\
-"(4, 2, 5);\n",\
-"(2, 3, 5);\n",\
-"(5, 3, 6);\n",\
-"(3, 1, 6);\n",\
-"(6, 1, 4);\n",\
-"\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 5, 4, 6);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"endrule\n",\
-"\n",\
-0};
-}
diff --git a/contrib/Netgen/libsrc/meshing/pyramid2rls.cpp b/contrib/Netgen/libsrc/meshing/pyramid2rls.cpp
deleted file mode 100644
index a97e7f13e594ee25b0a2308233b15132331d989c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/pyramid2rls.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-namespace netgen
-{
-const char * pyramidrules2[] = {
-"tolfak 0.5\n",\
-"\n",\
-"rule \"Pyramid on quad\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.5, -0.5) \n",\
-"	{ 0.25 X1, 0.25 X2, 0.25 X3, 0.25 X4 } 	\n",\
-"	{ 0.25 Y1, 0.25 Y2, 0.25 Y3, 0.25 Y4 } { };\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 5);\n",\
-"(2, 3, 5);\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1.4 P5, -0.1 P1, -0.1 P2, -0.1 P3, -0.1 P4 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"rule \"small Pyramid on quad\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.5, -0.1 )\n",\
-"	{ 0.25 X1, 0.25 X2, 0.25 X3, 0.25 X4 } \n",\
-"	{ 0.25 Y1, 0.25 Y2, 0.25 Y3, 0.25 Y4 } { };\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 5);\n",\
-"(2, 3, 5);\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1.4 P5, -0.1 P1, -0.1 P2, -0.1 P3, -0.1 P4 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"connect pyramid\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0.5, -0.5);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 5);\n",\
-"(2, 3, 5);\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"pyramid with one trig\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0.5, -0.5);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 1, 5) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(2, 3, 5);\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 0.34 P2, 0.34 P3, 0.34 P5, -0.02 P1 };\n",\
-"{ 0.34 P3, 0.34 P4, 0.34 P5, -0.02 P1 };\n",\
-"{ 0.34 P1, 0.34 P4, 0.34 P5, -0.02 P2 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 0.333 P2, 0.333 P3, 0.334 P5, 0 P1 };\n",\
-"{ 0.333 P3, 0.333 P4, 0.334 P5, 0 P1 };\n",\
-"{ 0.333 P1, 0.333 P4, 0.334 P5, 0 P2 };\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3, 5);\n",\
-"(1, 3, 4, 5);\n",\
-"\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"freeset\n",\
-"2 3 5 6;\n",\
-"freeset\n",\
-"3 4 5 7;\n",\
-"freeset \n",\
-"1 4 5 8;\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"pyramid with two trig\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0.5, -0.5);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 1, 5) del;\n",\
-"(3, 2, 5) del;\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"pyramid with two trig, left\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0.5, -0.5);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 1, 5) del;\n",\
-"(1, 4, 5) del;\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(3, 4, 5);\n",\
-"(2, 3, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-0};
-}
diff --git a/contrib/Netgen/libsrc/meshing/pyramidrls.cpp b/contrib/Netgen/libsrc/meshing/pyramidrls.cpp
deleted file mode 100644
index d4e997c1fea470d99cebb3d21bf815b33d02b745..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/pyramidrls.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-namespace netgen
-{
-const char * pyramidrules[] = {
-"tolfak 0.5\n",\
-"\n",\
-"rule \"Pyramid on quad\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.5, -0.5) \n",\
-"	{ 0.25 X1, 0.25 X2, 0.25 X3, 0.25 X4 } 	\n",\
-"	{ 0.25 Y1, 0.25 Y2, 0.25 Y3, 0.25 Y4 } { };\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 5);\n",\
-"(2, 3, 5);\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1.4 P5, -0.1 P1, -0.1 P2, -0.1 P3, -0.1 P4 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"rule \"small Pyramid on quad\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.5, -0.1 )\n",\
-"	{ 0.25 X1, 0.25 X2, 0.25 X3, 0.25 X4 } \n",\
-"	{ 0.25 Y1, 0.25 Y2, 0.25 Y3, 0.25 Y4 } { };\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 5);\n",\
-"(2, 3, 5);\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1.4 P5, -0.1 P1, -0.1 P2, -0.1 P3, -0.1 P4 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"connect pyramid\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0.5, -0.5);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 5);\n",\
-"(2, 3, 5);\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"pyramid with one trig\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0.5, -0.5);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 1, 5) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(2, 3, 5);\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 0.34 P2, 0.34 P3, 0.34 P5, -0.02 P1 };\n",\
-"{ 0.34 P3, 0.34 P4, 0.34 P5, -0.02 P1 };\n",\
-"{ 0.34 P1, 0.34 P4, 0.34 P5, -0.02 P3 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 0.333 P2, 0.333 P3, 0.334 P5, 0 P1 };\n",\
-"{ 0.333 P3, 0.333 P4, 0.334 P5, 0 P1 };\n",\
-"{ 0.333 P1, 0.333 P4, 0.334 P5, 0 P3 };\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3, 5);\n",\
-"(1, 3, 4, 5);\n",\
-"\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"freeset\n",\
-"2 3 5 6;\n",\
-"freeset\n",\
-"3 4 5 7;\n",\
-"freeset \n",\
-"1 4 5 8;\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"pyramid with two trig\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(1, 1, 0);\n",\
-"(0, 1, 0);\n",\
-"(0.5, 0.5, -0.5);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3, 4) del;\n",\
-"(2, 1, 5) del;\n",\
-"(3, 2, 5) del;\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(3, 4, 5);\n",\
-"(4, 1, 5);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-0};
-}
diff --git a/contrib/Netgen/libsrc/meshing/quadrls.cpp b/contrib/Netgen/libsrc/meshing/quadrls.cpp
deleted file mode 100644
index 57fb010144b031b15a7fac06143fef613b80044a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/quadrls.cpp
+++ /dev/null
@@ -1,765 +0,0 @@
-namespace netgen
-{
-const char * quadrules[] = {
-"rule \"Free Quad (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(1, 1) { 1 X2 } { };\n",\
-"(0, 1) { } { };\n",\
-"\n",\
-"newlines\n",\
-"(3, 2);\n",\
-"(4, 3);\n",\
-"(1, 4);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 1.5) { 1.5 X2 } { };\n",\
-"(-0.5, 1.5) { -0.5 X2 } { };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Free Quad (5)\"\n",\
-"\n",\
-"quality 5\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(1, 1) { 1 X2 } { };\n",\
-"(0, 1) { } { };\n",\
-"\n",\
-"newlines\n",\
-"(3, 2);\n",\
-"(4, 3);\n",\
-"(1, 4);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 1.5) { 1.5 X2 } { };\n",\
-"(-0.5, 1.5) { -0.5 X2 } { };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X2 } { };\n",\
-"(0, 1) { } { };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Quad Right (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0, 1) { } { 1 y3 };\n",\
-"\n",\
-"newlines\n",\
-"(1, 4);\n",\
-"(4, 3);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(-0.5, 1.5) { } { 1.5 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { } { 1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Quad P Right (2)\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0, 1) { -1 X2, 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"newlines\n",\
-"(1, 4);\n",\
-"(4, 3);\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.2, 0.5) { 0.7 X2, 0.5 X3 } { 0.5 Y3 };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(-0.5, 1.5) { -2 X2, 1.5 X3 } { 1.5 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 0.5) { 0.5 X2, 0.5 X3 } { 0.5 Y3 };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { -1 X2, 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"rule \"Quad Right PL (2)\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1);\n",\
-"(0, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(1, 4);\n",\
-"(4, 3);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0.5, 1.2) { -0.1 X2, 0.6 X3, 0.6 X4 } { -0.1 Y2, 0.6 Y3, 0.6 Y4 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"(-0.2, 0.5) { -0.1 X2, -0.1 X3, 0.6 X4 } { -0.1 Y2, -0.1 Y3, 0.6 Y4 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0.5, 1) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"(0, 0.5) { 0.5 X4 } { 0.5 Y4 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3);\n",\
-"(1, 3, 4);\n",\
-"(1, 2, 4);\n",\
-"(4, 2, 3);\n",\
-"\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Left Quad (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(0, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"(1, 1) { 1 X2, 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"newlines\n",\
-"(3, 4);\n",\
-"(4, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 1.5) { 1.5 X2, 1.5 X3 } { 1.5 Y3 };\n",\
-"(0, 1) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X2, 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 4, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Left P Quad (2)\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(0, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(1, 1) { 1 X2, 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"newlines\n",\
-"(1, 3);\n",\
-"(3, 4);\n",\
-"(4, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 1.5) { 1.5 X2, 1.5 X3 } { 1.5 Y3 };\n",\
-"(0, 1) { 1 X3 } { 1 Y3 };\n",\
-"(-0.2, 0.6) { -0.2 X2, 0.6 X3 } { 0.6 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X2, 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 0.5) { 0.5 X3 } { 0.5 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 4, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Left Quad RP (2)\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(0, 1);\n",\
-"(1, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(3, 4);\n",\
-"(4, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.2, 0.5) { 0.6 X2, 0.6 X4, -0.1 X3 } { 0.6 Y2, 0.6 Y4, -0.1 Y3 };\n",\
-"(1, 1) { 1 X4 } { 1 Y4 };\n",\
-"(0.5, 1.2) { -0.1 X2, 0.6 X3, 0.6 X4 } { -0.1 Y2, 0.6 Y3, 0.6 Y4 };\n",\
-"(0, 1) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 0.5) { 0.5 X2, 0.5 X4 } { 0.5 Y2, 0.5 Y4 };\n",\
-"(1, 1) { 1 X4 } { 1 Y4 };\n",\
-"(0.5, 1) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4 };\n",\
-"(0, 1) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 4, 3);\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 4);\n",\
-"(1, 4, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Two left (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1);\n",\
-"(0, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 4) del;\n",\
-"(4, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 0.5) { 0.75 X2, 0.75 X3, -0.25 X4 } { 0.75 Y3, -0.25 Y4 };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 0.5) { 0.5 X2, 0.5 X3 } { 0.5 Y3 };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Two Right (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1);\n",\
-"(0, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"(3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(1, 4);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"(-0.5, 0.5) { -0.25 X2, -0.25 X3, 0.75 X4 } { -0.25 Y3, 0.75 Y4 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"(0, 0.5) { 0.5 X4 } { 0.5 Y4 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Right 120 (1)\"\n",\
-"\n",\
-"quality 1000\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1.5, 0.866);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.866) { 1 X3, -1 X2 } { 1 Y3 };\n",\
-"\n",\
-"newlines\n",\
-"(1, 4);\n",\
-"(4, 3);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"(1, 1.732) { -2 X2, 2 X3 } { 2 Y3 };\n",\
-"(0, 1.732) { -3 X2, 2 X3 } { 2 Y3 };\n",\
-"(-0.5, 0.866) { -2 X2, 1 X3 } {1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 4);\n",\
-"(2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Left 120 (1)\"\n",\
-"\n",\
-"quality 1000\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(-0.5, 0.866);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.866) { 1 X3, 1 X2 } { 1 Y3 };\n",\
-"\n",\
-"newlines\n",\
-"(3, 4);\n",\
-"(4, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 0.866) { 2 X2, 1 X3 } { 1 Y3 };\n",\
-"(1, 1.732) { 2 X2, 2 X3 } { 2 Y3 };\n",\
-"(0, 1.732) { -1 X2, 2 X3 } { 2 Y3 };\n",\
-"(-0.5, 0.866) { 1 X3 } {1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 4);\n",\
-"(2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Left Right (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1);\n",\
-"(0, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"(4, 1) del;\n",\
-"\n",\
-"\n",\
-"newlines\n",\
-"(4, 3);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0.5, 1.5) { -0.25 X2, 0.75 X3, 0.75 X4 } { 0.75 Y3, 0.75 Y4 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0.5, 1) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Fill Quad\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1);\n",\
-"(0, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"(3, 4) del;\n",\
-"(4, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { 1 Y2 };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Fill Triangle\"\n",\
-"\n",\
-"quality 10\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(0.5, 0.86);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"(3, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { 1 Y2 };\n",\
-"(0.5, 0.86) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Right 60 (1)\"\n",\
-"\n",\
-"quality 10\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0) { 0.5, 0, 1.0 };\n",\
-"(0.5, 0.866) { 0.6, 0, 0.8 };\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(1, 3);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"(-0.125, 0.6495) { -0.5 X2, 0.75 X3 } { -0.5 Y2, 0.75 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"(0.25, 0.433) { 0.5 X3 } { 0.5 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Vis A Vis (2)\"\n",\
-"\n",\
-"quality 2\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1);\n",\
-"(0, 1);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(1, 4);\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 0.5) { 0.75 X2, 0.75 X3, -0.25 X4 } { 0.75 Y3, -0.25 Y4 };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"(-0.5, 0.5) { -0.25 X2, -0.25 X3, 0.75 X4 } { -0.25 Y3, 0.75 Y4 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 0.5) { 0.5 X2, 0.5 X3 } { 0.5 Y3 };\n",\
-"(1, 1) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1) { 1 X4 } { 1 Y4 };\n",\
-"(0, 0.5) { 0.5 X4 } { 0.5 Y4 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"orientations\n",\
-"(1, 3, 4);\n",\
-"(2, 3, 4);\n",\
-"(1, 2, 3);\n",\
-"(1, 2, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"2 h Vis A Vis (1)\"\n",\
-"\n",\
-"quality 3000\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1.732);\n",\
-"(0, 1.732);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.866) { 0.25 X3, 0.25 X4 } { 0.25 Y2, 0.25 Y3, 0.25 Y4 };\n",\
-"\n",\
-"newlines\n",\
-"(1, 5);\n",\
-"(5, 4);\n",\
-"(3, 5);\n",\
-"(5, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { 1 Y2 };\n",\
-"(1.5, 0.866) { 0.75 X2, 0.75 X3, -0.25 X4 } { 0.75 Y2, 0.75 Y3, -0.25 Y4 };\n",\
-"(1, 1.732) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1.732) { 1 X4 } { 1 Y4 };\n",\
-"(-0.5, 0.866) { 0.75 X4, -0.25 X2, -0.25 X3 } { 0.75 Y4, -0.25 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 5);\n",\
-"(3, 4, 5);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-0};
-}
diff --git a/contrib/Netgen/libsrc/meshing/refine.cpp b/contrib/Netgen/libsrc/meshing/refine.cpp
deleted file mode 100644
index f7578d33949502dbcdb5fcdf233325a13810ff08..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/refine.cpp
+++ /dev/null
@@ -1,721 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-  void Refinement :: Refine (Mesh & mesh)
-  {
-    // reduce 2nd order
-    mesh.ComputeNVertices();
-    mesh.SetNP(mesh.GetNV());
-
-
-    INDEX_2_HASHTABLE<int> between(mesh.GetNP() + 5);
-      
-    int oldne, oldns, oldnf;
-
-    // refine edges
-
-    ARRAY<EdgePointGeomInfo,PointIndex::BASE> epgi;
-
-    oldns = mesh.GetNSeg();
-    for (SegmentIndex si = 0; si < oldns; si++)
-      {
-	const Segment & el = mesh.LineSegment(si);
-
-	INDEX_2 i2 = INDEX_2::Sort(el.p1, el.p2);
-	PointIndex pinew;
-	EdgePointGeomInfo ngi;
-
-	if (between.Used(i2))
-	  {
-	    pinew = between.Get(i2);
-	    ngi = epgi[pinew]; 
-	  }
-	else
-	  {
-	    Point3d pnew;
-
-	    PointBetween (mesh.Point (el.p1),
-			  mesh.Point (el.p2), 0.5,
-			  el.surfnr1, el.surfnr2,
-			  el.epgeominfo[0], el.epgeominfo[1],
-			  pnew, ngi);
-
-	    pinew = mesh.AddPoint (pnew);
-	    between.Set (i2, pinew);
-
-
-	    if (pinew >= epgi.Size()+PointIndex::BASE)
-	      epgi.SetSize (pinew+1-PointIndex::BASE);
-	    epgi[pinew] = ngi;
-	  }
-
-	Segment ns1 = el;
-	Segment ns2 = el;
-	ns1.p2 = pinew;
-	ns1.epgeominfo[1] = ngi;
-	ns2.p1 = pinew;
-	ns2.epgeominfo[0] = ngi;
-
-	mesh.LineSegment(si) = ns1;
-	mesh.AddSegment (ns2);
-      }
-
-    // refine surface elements
-    ARRAY<PointGeomInfo,PointIndex::BASE> surfgi (8*mesh.GetNP());
-    for (int i = PointIndex::BASE;
-	 i < surfgi.Size()+PointIndex::BASE; i++)
-      surfgi[i].trignum = -1;
-
-
-    oldnf = mesh.GetNSE();
-    for (SurfaceElementIndex sei = 0; sei < oldnf; sei++)
-      {
-	int j, k;
-	const Element2d & el = mesh.SurfaceElement(sei);
-
-	switch (el.GetType())
-	  {
-	  case TRIG:
-	  case TRIG6:
-	    {
-	      ArrayMem<int,6> pnums(6);
-	      ArrayMem<PointGeomInfo,6> pgis(6);
-
-	      static int betw[3][3] =
-		{ { 2, 3, 4 },
-		  { 1, 3, 5 },
-		  { 1, 2, 6 } };
-
-	      for (j = 1; j <= 3; j++)
-		{
-		  pnums.Elem(j) = el.PNum(j);
-		  pgis.Elem(j) = el.GeomInfoPi(j);
-		}
-
-	      for (j = 0; j < 3; j++)
-		{
-		  PointIndex pi1 = pnums.Elem(betw[j][0]);
-		  PointIndex pi2 = pnums.Elem(betw[j][1]);
-
-		  INDEX_2 i2 (pi1, pi2);
-		  i2.Sort();
-
-		  Point3d pb;
-		  PointGeomInfo pgi;
-		  PointBetween (mesh.Point (pi1),
-				mesh.Point (pi2), 0.5,
-				mesh.GetFaceDescriptor(el.GetIndex ()).SurfNr(),
-				el.GeomInfoPi (betw[j][0]),
-				el.GeomInfoPi (betw[j][1]),
-				pb, pgi);
-
-
-		  pgis.Elem(4+j) = pgi;
-		  if (between.Used(i2))
-		    pnums.Elem(4+j) = between.Get(i2);
-		  else
-		    {
-		      pnums.Elem(4+j) = mesh.AddPoint (pb);
-		      between.Set (i2, pnums.Get(4+j));
-		    }
-
-		  if (surfgi.Size() < pnums.Elem(4+j))
-		    surfgi.SetSize (pnums.Elem(4+j));
-		  surfgi.Elem(pnums.Elem(4+j)) = pgis.Elem(4+j);
-		}
-
-
-	      static int reftab[4][3] =
-		{ { 1, 6, 5 },
-		  { 2, 4, 6 },
-		  { 3, 5, 4 },
-		  { 6, 4, 5 } };
-
-	      int ind = el.GetIndex();
-	      for (j = 0; j < 4; j++)
-		{
-		  Element2d nel(TRIG);
-		  for (k = 1; k <= 3; k++)
-		    {
-		      nel.PNum(k) = pnums.Get(reftab[j][k-1]);
-		      nel.GeomInfoPi(k) = pgis.Get(reftab[j][k-1]);
-		    }
-		  nel.SetIndex(ind);
-
-		  if (j == 0)
-		    mesh.SurfaceElement(sei) = nel;
-		  else
-		    mesh.AddSurfaceElement(nel);
-		}
-	      break;
-	    }
-	  case QUAD:
-	  case QUAD6:
-	  case QUAD8:
-	    {
-	      ArrayMem<int,9> pnums(9);
-	      ArrayMem<PointGeomInfo,9> pgis(9);
-
-	      static int betw[5][3] =
-		{ { 1, 2, 5 },
-		  { 2, 3, 6 },
-		  { 3, 4, 7 },
-		  { 1, 4, 8 },
-		  { 1, 3, 9 } };
-
-	      for (j = 1; j <= 4; j++)
-		{
-		  pnums.Elem(j) = el.PNum(j);
-		  pgis.Elem(j) = el.GeomInfoPi(j);
-		}
-
-	      for (j = 0; j < 5; j++)
-		{
-		  int pi1 = pnums.Elem(betw[j][0]);
-		  int pi2 = pnums.Elem(betw[j][1]);
-
-		  INDEX_2 i2 (pi1, pi2);
-		  i2.Sort();
-
-		  if (between.Used(i2))
-		    {
-		      pnums.Elem(5+j) = between.Get(i2);
-		      pgis.Elem(5+j) = surfgi.Get(pnums.Elem(4+j));
-		    }
-		  else
-		    {
-		      Point3d pb;
-		      PointBetween (mesh.Point (pi1),
-				    mesh.Point (pi2), 0.5,
-				    mesh.GetFaceDescriptor(el.GetIndex ()).SurfNr(),
-				    el.GeomInfoPi (betw[j][0]),
-				    el.GeomInfoPi (betw[j][1]),
-				    pb, pgis.Elem(5+j));
-
-		      pnums.Elem(5+j) = mesh.AddPoint (pb);
-
-		      between.Set (i2, pnums.Get(5+j));
-		      
-		      if (surfgi.Size() < pnums.Elem(5+j))
-			surfgi.SetSize (pnums.Elem(5+j));
-		      surfgi.Elem(pnums.Elem(5+j)) = pgis.Elem(5+j);
-		    }
-		}
-
-	      static int reftab[4][4] =
-		{
-		  { 1, 5, 9, 8 },
-		  { 5, 2, 6, 9 },
-		  { 8, 9, 7, 4 },
-		  { 9, 6, 3, 7 } };
-
-	      int ind = el.GetIndex();
-	      for (j = 0; j < 4; j++)
-		{
-		  Element2d nel(QUAD);
-		  for (k = 1; k <= 4; k++)
-		    {
-		      nel.PNum(k) = pnums.Get(reftab[j][k-1]);
-		      nel.GeomInfoPi(k) = pgis.Get(reftab[j][k-1]);
-		    }
-		  nel.SetIndex(ind);
-
-		  if (j == 0)
-		    mesh.SurfaceElement(sei) = nel;
-		  else
-		    mesh.AddSurfaceElement(nel);
-		}
-	      break;
-	    }
-	  default:
-	    PrintSysError ("Refine: undefined surface element type ", int(el.GetType()));
-	  }
-      }
-
-    // refine volume elements
-    oldne = mesh.GetNE();
-    for (ElementIndex ei = 0; ei < oldne; ei++)
-      {
-	int j, k;
-
-	const Element & el = mesh.VolumeElement(ei);
-	switch (el.GetType())
-	  {
-	  case TET:
-	  case TET10:
-	    {
-	     ArrayMem<int,10> pnums(10);
-	     static int betw[6][3] =
-	     { { 1, 2, 5 },
-	       { 1, 3, 6 },
-	       { 1, 4, 7 },
-	       { 2, 3, 8 },
-	       { 2, 4, 9 },
-	       { 3, 4, 10 } };
-
-	     int elrev = el.flags.reverse;
-
-	     for (j = 1; j <= 4; j++)
-	     pnums.Elem(j) = el.PNum(j);
-	     if (elrev)
-	     swap (pnums.Elem(3), pnums.Elem(4));
-
-	     for (j = 0; j < 6; j++)
-	     {
-	       INDEX_2 i2;
-	       i2.I1() = pnums.Get(betw[j][0]);
-	       i2.I2() = pnums.Get(betw[j][1]);
-	       i2.Sort();
-
-	       if (between.Used(i2))
-	          pnums.Elem(5+j) = between.Get(i2);
-	       else
-	       {
-		  pnums.Elem(5+j) = mesh.AddPoint
-		  (Center (mesh.Point(i2.I1()),
-			   mesh.Point(i2.I2())));
-		  between.Set (i2, pnums.Elem(5+j));
-	       }
-	    }
-
-	    static int reftab[8][4] =
-	    { { 1, 5, 6, 7 },
-	      { 5, 2, 8, 9 },
-	      { 6, 8, 3, 10 },
-	      { 7, 9, 10, 4 },
-	      { 5, 6, 7, 9 },
-	      { 5, 6, 9, 8 },
-	      { 6, 7, 9, 10 },
-	      { 6, 8, 10, 9 } };
-	/*
-	  { { 1, 5, 6, 7 },
-	  { 5, 2, 8, 9 },
-	  { 6, 8, 3, 10 },
-	  { 7, 9, 10, 4 },
-	  { 5, 6, 7, 9 },
-	  { 5, 6, 8, 9 },
-	  { 6, 7, 9, 10 },
-	  { 6, 8, 9, 10 } };
-	*/
-	   static int reverse[8] =
-	   {
-	      0, 0, 0, 0, 0, 1, 0, 1
-	   };
-
-	   int ind = el.GetIndex();
-	   for (j = 0; j < 8; j++)
-	   {
-	      Element nel;
-	      for (k = 1; k <= 4; k++)
-	        nel.PNum(k) = pnums.Get(reftab[j][k-1]);
-	      nel.SetIndex(ind);
-	      nel.flags.reverse = reverse[j];
-	      if (elrev)
-	      {
-		nel.flags.reverse = 1 - nel.flags.reverse;
-		swap (nel.PNum(3), nel.PNum(4));
-	      }
-
-	      if (j == 0)
-	        mesh.VolumeElement(ei) = nel;
-	      else
-	        mesh.AddVolumeElement (nel);
-	    }
-	    break;
-          }
-          case HEX:
-          {
-	     ArrayMem<int,27> pnums(27);
-	     static int betw[13][3] =
-	     { { 1, 2, 9 },
-	       { 3, 4, 10 },
-	       { 4, 1, 11 },
-               { 2, 3, 12 },
-	       { 5, 6, 13 },
-	       { 7, 8, 14 },
-	       { 8, 5, 15 },
-	       { 6, 7, 16 },
-	       { 1, 5, 17 },
-	       { 2, 6, 18 },
-	       { 3, 7, 19 },
-	       { 4, 8, 20 },
-	       { 2, 8, 21 },
-	       };
-
-	     static int fbetw[12][3] =
-	     { { 1, 3, 22 },
-	       { 2, 4, 22 },
-	       { 5, 7, 23 },
-               { 6, 8, 23 },
-	       { 1, 6, 24 },
-	       { 2, 5, 24 },
-	       { 2, 7, 25 },
-	       { 3, 6, 25 },
-	       { 3, 8, 26 },
-	       { 4, 7, 26 },
-	       { 1, 8, 27 },
-	       { 4, 5, 27 },
-	       };
-
-
-	     pnums = -1;
-
-	     for (j = 1; j <= 8; j++)
-	     pnums.Elem(j) = el.PNum(j);
-
-
-	     for (j = 0; j < 13; j++)
-	     {
-	       INDEX_2 i2;
-	       i2.I1() = pnums.Get(betw[j][0]);
-	       i2.I2() = pnums.Get(betw[j][1]);
-	       i2.Sort();
-
-	       if (between.Used(i2))
-	          pnums.Elem(9+j) = between.Get(i2);
-	       else
-	       {
-		  pnums.Elem(9+j) = mesh.AddPoint
-		  (Center (mesh.Point(i2.I1()),
-			   mesh.Point(i2.I2())));
-		  between.Set (i2, pnums.Elem(9+j));
-	       }
-	    }
-
-	    for (j = 0; j < 6; j++)
-	    {
-	       INDEX_2 i2a, i2b;
-	       i2a.I1() = pnums.Get(fbetw[2*j][0]);
-	       i2a.I2() = pnums.Get(fbetw[2*j][1]);
-	       i2a.Sort();
-	       i2b.I1() = pnums.Get(fbetw[2*j+1][0]);
-	       i2b.I2() = pnums.Get(fbetw[2*j+1][1]);
-	       i2b.Sort();
-
-	       if (between.Used(i2a))
-		 pnums.Elem(22+j) = between.Get(i2a);
-	       else if (between.Used(i2b))
-		 pnums.Elem(22+j) = between.Get(i2b);
-	       else
-		 {
-		   pnums.Elem(22+j) = mesh.AddPoint
-		     (Center (mesh.Point(i2a.I1()),
-			      mesh.Point(i2a.I2())));
-
-		   between.Set (i2a, pnums.Elem(22+j));
-		 }
-	    }
-
-	    static int reftab[8][8] =
-	    { { 1, 9, 22, 11, 17, 24, 21, 27 },
-	      { 9, 2, 12, 22, 24, 18, 25, 21 },
-	      { 11, 22, 10, 4, 27, 21, 26, 20},
-	      { 22, 12, 3, 10, 21, 25, 19, 26},
-	      { 17, 24, 21, 27, 5, 13, 23, 15},
-	      { 24, 18, 25, 21, 13, 6, 16, 23},
-	      { 27, 21, 26, 20, 15, 23, 14, 8},
-	      { 21, 25, 19, 26, 23, 16, 7, 14} };
-
-
-	   int ind = el.GetIndex();
-	   for (j = 0; j < 8; j++)
-	   {
-	      Element nel(HEX);
-	      for (k = 1; k <= 8; k++)
-	        nel.PNum(k) = pnums.Get(reftab[j][k-1]);
-	      nel.SetIndex(ind);
-
-              if (j == 0)
-	        mesh.VolumeElement(ei) = nel;
-	      else
-	        mesh.AddVolumeElement (nel);
-           }
-           break;
-	  }
-	  case PRISM:
-          {
-	     ArrayMem<int,18> pnums(18);
-	     static int betw[9][3] =
-	     { { 3, 1, 7 },
-	       { 1, 2, 8 },
-	       { 3, 2, 9 },
-               { 6, 4, 10 },
-	       { 4, 5, 11 },
-	       { 6, 5, 12 },
-	       { 1, 4, 13 },
-	       { 3, 6, 14 },
-	       { 2, 5, 15 },
-	       };
-
-	     static int fbetw[6][3] =
-	     { { 1, 6, 16 },
-	       { 3, 4, 16 },
-	       { 1, 5, 17 },
-               { 2, 4, 17 },
-	       { 2, 6, 18 },
-	       { 3, 5, 18 },
-	       };
-
-	     //int elrev = el.flags.reverse;
-	     pnums = -1;
-
-	     for (j = 1; j <= 6; j++)
-	     pnums.Elem(j) = el.PNum(j);
-	    // if (elrev)
-	    // swap (pnums.Elem(3), pnums.Elem(4));
-
-	     for (j = 0; j < 9; j++)
-	     {
-	       INDEX_2 i2;
-	       i2.I1() = pnums.Get(betw[j][0]);
-	       i2.I2() = pnums.Get(betw[j][1]);
-	       i2.Sort();
-
-	       if (between.Used(i2))
-	          pnums.Elem(7+j) = between.Get(i2);
-	       else
-	       {
-		  pnums.Elem(7+j) = mesh.AddPoint
-		  (Center (mesh.Point(i2.I1()),
-			   mesh.Point(i2.I2())));
-		  between.Set (i2, pnums.Elem(7+j));
-	       }
-	    }
-
-	    for (j = 0; j < 3; j++)
-	    {
-	       INDEX_2 i2a, i2b;
-	       i2a.I1() = pnums.Get(fbetw[2*j][0]);
-	       i2a.I2() = pnums.Get(fbetw[2*j][1]);
-	       i2a.Sort();
-	       i2b.I1() = pnums.Get(fbetw[2*j+1][0]);
-	       i2b.I2() = pnums.Get(fbetw[2*j+1][1]);
-	       i2b.Sort();
-
-	       if (between.Used(i2a))
-		 pnums.Elem(16+j) = between.Get(i2a);
-	       else if (between.Used(i2b))
-		 pnums.Elem(16+j) = between.Get(i2b);
-	       else
-		 {
-		   pnums.Elem(16+j) = mesh.AddPoint
-		     (Center (mesh.Point(i2a.I1()),
-			      mesh.Point(i2a.I2())));
-
-		   between.Set (i2a, pnums.Elem(16+j));
-		 }
-	    }
-
-
-	    static int reftab[8][6] =
-	    { { 1, 8, 7, 13, 17, 16 },
-	      { 7, 8, 9, 16, 17, 18 },
-	      { 7, 9, 3, 16, 18, 14 },
-	      { 8, 2, 9, 17, 15, 18 },
-	      { 13, 17, 16, 4, 11, 10 },
-	      { 16, 17, 18, 10, 11, 12 },
-	      { 16, 18, 14, 10, 12, 6 },
-	      { 17, 15, 18, 11, 5, 12 } };
-
-
-	   int ind = el.GetIndex();
-	   for (j = 0; j < 8; j++)
-	   {
-	      Element nel(PRISM);
-	      for (k = 1; k <= 6; k++)
-	        nel.PNum(k) = pnums.Get(reftab[j][k-1]);
-	      nel.SetIndex(ind);
-
-
-	      //nel.flags.reverse = reverse[j];
-	      //if (elrev)
-	     // {
-		//nel.flags.reverse = 1 - nel.flags.reverse;
-		//swap (nel.PNum(3), nel.PNum(4));
-
-
-	      if (j == 0)
-	        mesh.VolumeElement(ei) = nel;
-	      else
-	        mesh.AddVolumeElement (nel);
-           }
-           break;
-	  }
-	  default:
-	    PrintSysError ("Refine: undefined volume element type ", int(el.GetType()));
-        }
-      }
-
-
-    // update identification tables
-    for (int i = 1; i <= mesh.GetIdentifications().GetMaxNr(); i++)
-      {
-	ARRAY<int,PointIndex::BASE> identmap;
-	mesh.GetIdentifications().GetMap (i, identmap);
-
-	for (int j = 1; j <= between.GetNBags(); j++)
-	  for (int k = 1; k <= between.GetBagSize(j); k++)
-	    {
-	      INDEX_2 i2;
-	      int newpi;
-	      between.GetData (j, k, i2, newpi);
-	      INDEX_2 oi2(identmap.Get(i2.I1()),
-			  identmap.Get(i2.I2()));
-	      oi2.Sort();
-	      if (between.Used (oi2))
-		{
-		  int onewpi = between.Get(oi2);
-		  mesh.GetIdentifications().Add (newpi, onewpi, i);
-		}
-	    }
-
-      }
-
-    mesh.ComputeNVertices();
-    return;
-
-    int cnttrials = 10;
-    int wrongels = 0;
-    for (int i = 1; i <= mesh.GetNE(); i++)
-      if (mesh.VolumeElement(i).Volume(mesh.Points()) < 0)
-	{
-	  wrongels++;
-	  mesh.VolumeElement(i).flags.badel = 1;
-	}
-      else
-	mesh.VolumeElement(i).flags.badel = 0;
-
-    if (wrongels)
-      {
-	cout << "WARNING: " << wrongels << " with wrong orientation found" << endl;
-
-	int np = mesh.GetNP();
-	ARRAY<Point3d> should(np);
-	ARRAY<Point3d> can(np);
-	for (int i = 1; i <= np; i++)
-	  {
-	    should.Elem(i) = can.Elem(i) = mesh.Point(i);
-	  }
-	for (int i = 1; i <= between.GetNBags(); i++)
-	  for (int j = 1; j <= between.GetBagSize(i); j++)
-	    {
-	      INDEX_2 parent;
-	      int child;
-	      between.GetData (i, j, parent, child);
-	      can.Elem(child) = Center (can.Elem(parent.I1()),
-					can.Elem(parent.I2()));
-	    }
-
-	BitArray boundp(np);
-	boundp.Clear();
-	for (int i = 1; i <= mesh.GetNSE(); i++)
-	  {
-	    const Element2d & sel = mesh.SurfaceElement(i);
-	    for (int j = 1; j <= sel.GetNP(); j++)
-	      boundp.Set(sel.PNum(j));
-	  }
-
-
-	double lam = 0.5;
-
-	while (lam < 0.9 && cnttrials > 0)
-	  {
-	    lam = 2;
-	    do
-	      {
-		lam *= 0.5;
-		cnttrials--;
-
-		cout << "lam = " << lam << endl;
-
-		for (int i = 1; i <= np; i++)
-		  if (boundp.Test(i))
-		    {
-		      for (int j = 1; j <= 3; j++)
-			mesh.Point(i).X(j) = 
-			  lam * should.Get(i).X(j) +
-			  (1-lam) * can.Get(i).X(j);
-		    }
-		  else
-		    mesh.Point(i) = can.Get(i);
-	      
-
-		BitArray free (mesh.GetNP()), fhelp(mesh.GetNP());
-		free.Clear();
-		for (int i = 1; i <= mesh.GetNE(); i++)
-		  {
-		    const Element & el = mesh.VolumeElement(i);
-		    if (el.Volume(mesh.Points()) < 0)
-		      for (int j = 1; j <= el.GetNP(); j++)
-			free.Set (el.PNum(j));
-		  }
-		for (int k = 1; k <= 3; k++)
-		  {
-		    fhelp.Clear();
-		    for (int i = 1; i <= mesh.GetNE(); i++)
-		      {
-			const Element & el = mesh.VolumeElement(i);
-			int freeel = 0;
-			for (int j = 1; j <= el.GetNP(); j++)
-			  if (free.Test(el.PNum(j)))
-			    freeel = 1;
-			if (freeel)
-			  for (int j = 1; j <= el.GetNP(); j++)
-			    fhelp.Set (el.PNum(j));
-		      }
-		    free.Or (fhelp);
-		  }
-
-		(*testout) << "smooth points: " << endl;
-		for (int i = 1; i <= free.Size(); i++)
-		  if (free.Test(i))
-		    (*testout) << "p " << i << endl;
-
-		(*testout) << "surf points: " << endl;
-		for (int i = 1; i <= mesh.GetNSE(); i++)
-		  for (int j = 1; j <= 3; j++)
-		    (*testout) << mesh.SurfaceElement(i).PNum(j) << endl;
-		  
-
-
-		mesh.CalcSurfacesOfNode();
-		free.Invert();
-		mesh.FixPoints (free);
-		mesh.ImproveMesh (OPT_REST);
-
-
-		wrongels = 0;
-		for (int i = 1; i <= mesh.GetNE(); i++)
-		  {
-		    if (mesh.VolumeElement(i).Volume(mesh.Points()) < 0)
-		      {
-			wrongels++;
-			mesh.VolumeElement(i).flags.badel = 1;
-			(*testout) << "wrong el: ";
-			for (int j = 1; j <= 4; j++)
-			  (*testout) << mesh.VolumeElement(i).PNum(j) << " ";
-			(*testout) << endl;
-		      }
-		    else
-		      mesh.VolumeElement(i).flags.badel = 0;
-		  }
-		cout << "wrongels = " << wrongels << endl;
-	      }
-	    while (wrongels && cnttrials > 0);
-	  
-	    for (int i = 1; i <= np; i++)
-	      can.Elem(i) = mesh.Point(i);
-	  }
-      }
-
-    if (cnttrials <= 0)
-      {
-	cerr << "ERROR: Sorry, reverted elements" << endl;
-      }
- 
-    mesh.ComputeNVertices();
-  }
-}
diff --git a/contrib/Netgen/libsrc/meshing/ruler2.cpp b/contrib/Netgen/libsrc/meshing/ruler2.cpp
deleted file mode 100644
index 82c6dbe57d6b00d4593aaced266aa909246a7cca..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/ruler2.cpp
+++ /dev/null
@@ -1,646 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-namespace netgen
-{
-static double CalcElementBadness (const ARRAY<Point2d> & points,
-				  const Element2d & elem)
-{
-  // badness = sqrt(3) /36 * circumference^2 / area - 1 +
-  //           h / li + li / h - 2
-
-  Vec2d v12, v13, v23;
-  double l12, l13, l23, cir, area;
-  static const double c = sqrt(3.0) / 36;
-
-  v12 = points.Get(elem.PNum(2)) - points.Get(elem.PNum(1));
-  v13 = points.Get(elem.PNum(3)) - points.Get(elem.PNum(1));
-  v23 = points.Get(elem.PNum(3)) - points.Get(elem.PNum(2));
-
-  l12 = v12.Length();
-  l13 = v13.Length();
-  l23 = v23.Length();
-
-  cir = l12 + l13 + l23;
-  area = 0.5 * (v12.X() * v13.Y() - v12.Y() * v13.X());
-  if (area < 1e-6)
-    {
-      return 1e8;
-    }
-
-  if (testmode)
-    {
-      (*testout) << "l = " << l12 << " + " << l13 << " + " << l23 << " = " 
-		 << cir << ", area = " << area << endl;
-      (*testout) << "shapeerr = " << 10 * (c * cir * cir / area - 1) << endl
-		 << "sizeerr = " << 1/l12 + l12 + 1/l13 + l13 + 1/l23 + l23 - 6
-		 << endl;
-    }
-
-  return 10 * (c * cir * cir / area - 1)
-    + 1/l12 + l12 + 1/l13 + l13 + 1/l23 + l23 - 6;
-}
-
-
-
-int Meshing2 ::ApplyRules (ARRAY<Point2d> & lpoints, 
-			   ARRAY<int> & legalpoints,
-			   int maxlegalpoint,
-			   ARRAY<INDEX_2> & llines,
-			   int maxlegalline,
-			   ARRAY<Element2d> & elements,
-			   ARRAY<INDEX> & dellines, int tolerance)
-{
-  int i, j, ri, nlok, npok, incnpok, refpi, locli = 0;
-
-  double maxerr = 0.5 + 0.3 * tolerance;
-  double minelerr = 2 + 0.5 * tolerance * tolerance;
-
-
-  bool ok;
-  int found;   // rule number
-  Vector oldu, newu;
-  Point2d np;
-  Vec2d linevec;
-  int oldnp;
-  INDEX_2 loclin;
-  double hf, elerr;
-  int noldlp, noldll;
-  int loctestmode;
-
-  static ARRAY<int> pused, lused;
-  static ARRAY<int> pmap, lmap, pfixed;
-  static ARRAY<int> pnearness, lnearness;
-  
-  static ARRAY<Point2d> tempnewpoints;
-  static ARRAY<INDEX_2> tempnewlines;
-  static ARRAY<int> tempdellines;
-  static ARRAY<Element2d> tempelements;
-
-
-
-  elements.SetSize (0);
-  dellines.SetSize (0);
-
-  noldlp = lpoints.Size();
-  noldll = llines.Size();
-
-  pused.SetSize (maxlegalpoint);
-  lused.SetSize (maxlegalline);
-  pnearness.SetSize (noldlp);
-  lnearness.SetSize (llines.Size());
-
-
-  testmode = debugparam.debugoutput;
-  loctestmode = testmode;
-
-  if (loctestmode)
-    {
-      (*testout) << endl << endl << "Check new environment" << endl;
-      (*testout) << "tolerance = " << tolerance << endl;
-      for (i = 1; i <= lpoints.Size(); i++)
-	(*testout) << "P" << i << " = " << lpoints.Get(i) << endl;
-      (*testout) << endl;
-      for (i = 1; i <= llines.Size(); i++)
-	(*testout) << "(" << llines.Get(i).I1() << "-" << llines.Get(i).I2() << ")" << endl;
-    }
-
-  // check every rule
-
-  found = 0;
-
-  
-  for (i = 1; i <= noldlp; i++)
-    pnearness.Set(i, 1000);
-  
-  for (j = 1; j <= 2; j++)
-    pnearness.Set(llines.Get(1).I(j), 0);
-    
-
-  do
-    {
-      ok = 1;
-      for (i = 1; i <= maxlegalline; i++)
-	{
-	  const INDEX_2 & hline = llines.Get(i);
-
-	  /*
-	  int minn = INT_MAX-1;
-	  for (j = 1; j <= 2; j++)
-	    {
-	      int hi = pnearness.Get(hline.I(j));
-	      if (hi < minn) minn = hi;
-	    }
-	  */
-	  int minn = pnearness.Get(hline.I1());
-	  int minn2 = pnearness.Get(hline.I2());
-	  if (minn2 < minn)
-	    minn = minn2;
-
-	  /*
-	  for (j = 1; j <= 2; j++)
-	    {
-	      int hpi = hline.I(j);
-	      if (pnearness.Get(hpi) > minn+1)
-		{
-		  ok = 0;
-		  pnearness.Set(hpi, minn+1);
-		}
-	    }
-	  */
-	  int hpi = hline.I1();
-	  if (pnearness.Get(hpi) > minn+1)
-	    {
-	      ok = 0;
-	      pnearness.Set(hpi, minn+1);
-	    }
-	  hpi = hline.I2();
-	  if (pnearness.Get(hpi) > minn+1)
-	    {
-	      ok = 0;
-	      pnearness.Set(hpi, minn+1);
-	    }
-	}
-    }
-  while (!ok);
-  
-  for (i = 1; i <= maxlegalline /* lnearness.Size() */; i++)
-    {
-      lnearness.Set(i, 0);
-      for (j = 1; j <= 2; j++)
-	lnearness.Elem(i) += pnearness.Get(llines.Get(i).I(j));
-    }
-
-
-  for (ri = 1; ri <= rules.Size(); ri++)
-    {
-      netrule * rule = rules.Get(ri);
-
-      if (loctestmode)
-	(*testout) << "Rule " << rule->Name() << endl;
-
-      if (rule->GetQuality() > tolerance) continue;
-
-      pmap.SetSize (rule->GetNP());
-      lmap.SetSize (rule->GetNL());
-      
-      lused = 0;
-      pused = 0;
-      pmap = 0;
-      lmap = 0;
-      /*
-      for (i = 1; i <= lused.Size(); i++)
-	lused.Set (i, 0);
-      for (i = 1; i <= pused.Size(); i++)
-	pused.Set (i, 0);
-      for (i = 1; i <= pmap.Size(); i++)
-	pmap.Set(i, 0);
-      for (i = 1; i <= lmap.Size(); i++)
-	lmap.Set(i, 0);
-      */
-
-      lused[0] = 1;   // .Set (1, 1);
-      lmap[0] = 1;    // .Set (1, 1);
-
-      for (j = 1; j <= 2; j++)
-	{
-	  pmap.Elem(rule->GetPointNr (1, j)) = llines.Get(1).I(j);
-	  pused.Elem(llines.Get(1).I(j))++;
-	}
-
-
-      nlok = 2;
-
-      while (nlok >= 2)
-	{
-
-	  if (nlok <= rule->GetNOldL())
-
-	    {
-	      ok = 0;
-	      while (!ok && lmap.Get(nlok) < maxlegalline  /* llines.Size() */)
-		{
-		  lmap.Elem(nlok)++;
-		  locli = lmap.Get(nlok);
-
-		  if (!lused.Get(locli) && 
-		      lnearness.Get(locli) <= rule->GetLNearness (nlok) )
-		    {
-		      ok = 1;
-
-		      loclin = llines.Get(locli);
-
-		      linevec.X() = lpoints.Get (loclin.I2()).X() -
-			lpoints.Get (loclin.I1()).X();
-		      linevec.Y() = lpoints.Get (loclin.I2()).Y() -
-			lpoints.Get (loclin.I1()).Y();
-
-		      if (rule->CalcLineError (nlok, linevec) > maxerr)
-			  ok = 0;
-
-		      for (j = 1; j <= 2 && ok; j++)
-			{
-			  refpi = rule->GetPointNr (nlok, j);
-
-			  if (pmap.Get(refpi) != 0)
-			    {
-			      if (pmap.Get(refpi) != loclin.I(j))
-				ok = 0;
-			    }
-			  else
-			    {
-			      if (rule->CalcPointDist (refpi, lpoints.Get(loclin.I(j))) > maxerr
-				  || !legalpoints.Get(loclin.I(j))
-				  || pused.Get(loclin.I(j))) ok = 0;
-			    }
-			}
-		    }
-		}
-
-	      if (ok)
-		{
-		  lused.Set (locli, 1);
-		  for (j = 1; j <= 2; j++)
-		    {
-		      pmap.Set(rule->GetPointNr (nlok, j), loclin.I(j));
-		      pused.Elem(loclin.I(j))++;
-		    }
-
-		  nlok++;
-		}
-	      else
-		{
-		  lmap.Elem(nlok) = 0;
-		  nlok--;
-
-		  lused.Set (lmap.Get(nlok), 0);
-		  for (j = 1; j <= 2; j++)
-		    {
-		      pused.Elem(llines.Get(lmap.Get(nlok)).I(j)) --;
-		      if (! pused.Get (llines.Get (lmap.Get (nlok)).I(j)))
-			pmap.Set (rule->GetPointNr (nlok, j), 0);
-		    }
-		}
-	    }
-
-	  else
-
-	    {
-
-	      // all lines are mapped !!
-
-	      // map also all points:
-
-	      npok = 1;
-	      incnpok = 1;
-
-	      pfixed.SetSize (pmap.Size());
-	      for (i = 1; i <= pmap.Size(); i++)
-		pfixed.Elem(i) = (pmap.Get(i) >= 1);
-
-	      while (npok >= 1)
-		{
-
-		  if (npok <= rule->GetNOldP())
-
-		    {
-		      if (pfixed.Get(npok))
-
-			{
-			  if (incnpok)
-			    npok++;
-			  else
-			    npok--;
-			}
-
-		      else
-
-			{
-			  ok = 0;
-
-			  if (pmap.Get(npok))
-			    pused.Elem(pmap.Get(npok))--;
-
-			  while (!ok && pmap.Get(npok) < maxlegalpoint)
-			    {
-			      ok = 1;
-
-			      pmap.Elem(npok)++;
-
-			      if (pused.Get(pmap.Get(npok)))
-				{
-				  ok = 0;
-				}
-			      else
-				{
-				  if (rule->CalcPointDist (npok, lpoints.Get(pmap.Get(npok))) > maxerr 
-				      || !legalpoints.Get(pmap.Get(npok)) 
-				      ) ok = 0;
-				}
-			    }
-
-			  if (ok)
-			    {
-			      pused.Elem(pmap.Get(npok))++;
-			      npok++;
-			      incnpok = 1;
-			    }
-
-			  else
-
-			    {
-			      pmap.Elem(npok) = 0;
-			      npok--;
-			      incnpok = 0;
-			    }
-			}
-		    }
-
-		  else
-
-		    {
-		      if (ok)
-			foundmap.Elem(ri)++; 
-
-		      if (loctestmode)
-			(*testout) << "lines and points mapped" << endl;
-
-
-		      ok = 1;
-
-		      // check orientations
-
-		      for (i = 1; i <= rule->GetNOrientations() && ok; i++)
-			{
-			  if (CW (lpoints.Get(pmap.Get(rule->GetOrientation(i).i1)),
-				  lpoints.Get(pmap.Get(rule->GetOrientation(i).i2)),
-				  lpoints.Get(pmap.Get(rule->GetOrientation(i).i3))) )
-			    {
-			      ok = 0;
-			      if (loctestmode)
-				(*testout) << "Orientation " << i << " not ok" << endl;
-			    }
-			}
-
-		      if (ok)
-			{
-			  oldu.SetSize (2 * rule->GetNOldP());
-			  
-			  for (i = 1; i <= rule->GetNOldP(); i++)
-			    {
-			      Vec2d ui(rule->GetPoint(i), lpoints.Get(pmap.Get(i)));
-			      oldu.Set (2*i-1, ui.X());
-			      oldu.Set (2*i  , ui.Y());
-			    }
-			  
-			  rule -> SetFreeZoneTransformation (oldu, tolerance);
-			}
-		      
-
-		      if (ok && !rule->ConvexFreeZone())
-			{
-			  ok = 0;
-			  if (loctestmode) (*testout) << "freezone not convex" << endl;
-
-			  /*
-			  static int cnt = 0;
-			  cnt++;
-			  if (cnt % 100 == 0)
-			    {
-			      cout << "freezone not convex, cnt = " << cnt << "; rule = " << rule->Name() << endl;
-			      (*testout) << "freezone not convex, cnt = " << cnt << "; rule = " << rule->Name() << endl;
-			      (*testout) << "tol = " << tolerance << endl;
-			      (*testout) << "maxerr = " << maxerr << "; minerr = " << minelerr << endl;
-			      (*testout) << "freezone = " << rule->GetTransFreeZone() << endl;
-			    }
-			  */
-			}
-
-		      // check freezone:
-
-		      for (i = 1; i <= maxlegalpoint && ok; i++)
-			{
-			  if ( !pused.Get(i) &&
-			       rule->IsInFreeZone (lpoints.Get(i)) )
-			    {
-			      ok = 0;
-			      if (loctestmode)
-				(*testout) << "Point " << i << " in freezone" << endl;
-			    }
-			}
-
-
-		      for (i = maxlegalpoint+1; i <= lpoints.Size() && ok; i++)
-			{
-			  if ( rule->IsInFreeZone (lpoints.Get(i)) )
-			    {
-			      ok = 0;
-			      if (loctestmode)
-				(*testout) << "Point " << i << " in freezone" << endl;
-			    }
-			}
-
-		      for (i = 1; i <= maxlegalline && ok; i++)
-			{
-			  if (!lused.Get(i) && 
-			      rule->IsLineInFreeZone (lpoints.Get(llines.Get(i).I1()),
-						      lpoints.Get(llines.Get(i).I2())))
-			    {
-			      ok = 0;
-			      if (loctestmode)
-				(*testout) << "line " << llines.Get(i).I1() << "-"
-					   << llines.Get(i).I2() << " in freezone" << endl;
-			    }
-			}
-		      for (i = maxlegalline+1; i <= llines.Size() && ok; i++)
-			{
-			  if (rule->IsLineInFreeZone (lpoints.Get(llines.Get(i).I1()),
-						      lpoints.Get(llines.Get(i).I2())))
-			    {
-			      ok = 0;
-			      if (loctestmode)
-				(*testout) << "line " << llines.Get(i).I1() << "-"
-					   << llines.Get(i).I2() << " in freezone" << endl;
-			    }
-			}
-
-
-		      /*
-		      // check orientations
-
-		      for (i = 1; i <= rule->GetNOrientations() && ok; i++)
-			{
-			  if (CW (lpoints.Get(pmap.Get(rule->GetOrientation(i).i1)),
-				  lpoints.Get(pmap.Get(rule->GetOrientation(i).i2)),
-				  lpoints.Get(pmap.Get(rule->GetOrientation(i).i3))) )
-			    {
-			      ok = 0;
-			      if (loctestmode)
-				(*testout) << "Orientation " << i << " not ok" << endl;
-			    }
-			}
-		      */
-
-
-		      if (ok)
-			{
-			  if (loctestmode)
-			    (*testout) << "rule ok" << endl;
-
-			  //			  newu = rule->GetOldUToNewU() * oldu;
-			  if (rule->GetNOldP() < rule->GetNP())
-			    {
-			      newu.SetSize (rule->GetOldUToNewU().Height());
-			      rule->GetOldUToNewU().Mult (oldu, newu);
-			    }
-
-			  // Setze neue Punkte:
-
-			  oldnp = rule->GetNOldP();
-
-			  for (i = oldnp + 1; i <= rule->GetNP(); i++)
-			    {
-			      np = rule->GetPoint(i);
-			      np.X() += newu.Elem (2 * (i-oldnp) - 1);
-			      np.Y() += newu.Elem (2 * (i-oldnp));
-
-			      pmap.Elem(i) = lpoints.Append (np);
-			    }
-
-			  // Setze neue Linien:
-
-			  for (i = rule->GetNOldL() + 1; i <= rule->GetNL(); i++)
-			    {
-			      llines.Append (INDEX_2 (pmap.Get(rule->GetPointNr (i, 1)),
-						      pmap.Get(rule->GetPointNr (i, 2))));
-			    }
-
-
-			  // delete old lines:
-
-			  for (i = 1; i <= rule->GetNDelL(); i++)
-			    dellines.Append (lmap.Get(rule->GetDelLine(i)));
-
-			  // insert new elements:
-
-			  for (i = 1; i <= rule->GetNE(); i++)
-			    {
-			      elements.Append (rule->GetElement(i));
-			      for (j = 1; j <= elements.Get(i).GetNP(); j++)
-				elements.Elem(i).PNum(j) = pmap.Get(elements.Get(i).PNum(j));
-			    }
-
-
-			  elerr = 0;
-			  for (i = 1; i <= elements.Size(); i++)
-			    {
-			      if (!mparam.quad)
-				hf = CalcElementBadness (lpoints, elements.Get(i));
-			      else
-				hf = elements.Get(i).CalcJacobianBadness (lpoints) * 5;
-			      if (loctestmode)
-				(*testout) << "r " << rule->Name() << "bad = " << hf << endl;
-			      if (hf > elerr) elerr = hf;
-			    }
-
-			  if (loctestmode)
-			    (*testout) << "error = " << elerr;
-
-
-			  canuse.Elem(ri) ++;
-
-			  if (elerr < minelerr)
-			    {
-
-			      if (loctestmode)
-				{
-				  (*testout) << "rule = " << rule->Name() << endl;
-				  (*testout) << "class = " << tolerance << endl;
-				  (*testout) << "lpoints: " << endl;
-				  for (i = 1; i <= lpoints.Size(); i++)
-				    (*testout) << lpoints.Get(i) << endl;
-				  (*testout) << "llines: " << endl;
-				  for (i = 1; i <= llines.Size(); i++)
-				    (*testout) << llines.Get(i).I1() << " " << llines.Get(i).I2() << endl;
-
-				  (*testout) << "Freezone: ";
-				  for (i = 1; i <= rule -> GetTransFreeZone().Size(); i++)
-				    (*testout) << rule->GetTransFreeZone().Get(i) << endl;
-				}
-
-
-
-			      minelerr = elerr;
-			      found = ri;
-
-			      tempnewpoints.SetSize (0);
-			      for (i = noldlp+1; i <= lpoints.Size(); i++)
-				tempnewpoints.Append (lpoints.Get(i));
-
-			      tempnewlines.SetSize (0);
-			      for (i = noldll+1; i <= llines.Size(); i++)
-				tempnewlines.Append (llines.Get(i));
-
-			      tempdellines.SetSize (0);
-			      for (i = 1; i <= dellines.Size(); i++)
-				tempdellines.Append (dellines.Get(i));
-
-			      tempelements.SetSize (0);
-			      for (i = 1; i <= elements.Size(); i++)
-				tempelements.Append (elements.Get(i));
-			    }
-
-			  lpoints.SetSize (noldlp);
-			  llines.SetSize (noldll);
-			  dellines.SetSize (0);
-			  elements.SetSize (0);
-			  ok = 0;
-
-			}
-
-
-		      npok = rule->GetNOldP();
-		      incnpok = 0;
-		    }
-		}
-
-	      nlok = rule->GetNOldL();
-
-	      lused.Set (lmap.Get(nlok), 0);
-
-	      for (j = 1; j <= 2; j++)
-		{
-		  refpi = rule->GetPointNr (nlok, j);
-		  pused.Elem(pmap.Get(refpi))--;
-
-		  if (pused.Get(pmap.Get(refpi)) == 0)
-		    {
-		      pmap.Set(refpi, 0);
-		    }
-		}
-	    }
-	}
-    }
-
-
-  if (found)
-    {
-      for (i = 0; i < tempnewpoints.Size(); i++)
-	lpoints.Append (tempnewpoints[i]);
-      for (i = 0; i < tempnewlines.Size(); i++)
-	llines.Append (tempnewlines[i]);
-      for (i = 0; i < tempdellines.Size(); i++)
-	dellines.Append (tempdellines[i]);
-      for (i = 0; i < tempelements.Size(); i++)
-	elements.Append (tempelements[i]);
-    }
-
-
-  return found;
-}
-
-
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/ruler2.hpp b/contrib/Netgen/libsrc/meshing/ruler2.hpp
deleted file mode 100644
index 4ef855d4ec7cce1dfa140cfd6941f1aee29abacb..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/ruler2.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-#ifndef FILE_NETRULE
-#define FILE_NETRULE
-
-///
-class netrule
-{
-private:
-  ///
-  typedef struct tf 
-  { float f1, f2, f3; }   threefloat;
-  
-  class threeint 
-  { 
-  public: int i1, i2, i3; 
-    threeint() { } 
-    threeint(int ai1, int ai2, int ai3) 
-    { i1 = ai1; i2 = ai2; i3 = ai3; } 
-  };
-
-
-  ///
-  int quality;
-  ///
-  char * name;
-  ///
-  ARRAY<Point2d> points;
-  ///
-  ARRAY<INDEX_2> lines;
-  ///
-  ARRAY<Point2d> freezone, freezonelimit;
-  ///
-  ARRAY<Point2d> transfreezone;
-
-  ///
-  ARRAY<int> dellines;
-  ///
-  ARRAY<Element2d> elements;
-  ///
-  ARRAY<threefloat> tolerances, linetolerances;
-  ///
-  ARRAY<threeint> orientations;
-  ///
-  DenseMatrix oldutonewu, oldutofreearea, oldutofreearealimit;
-  ///
-  ARRAY<DenseMatrix*> oldutofreearea_i;
-  ///
-  MatrixFixWidth<3> freesetinequ;
-
-  ///
-  ARRAY<Vec2d> linevecs;
-
-  ///
-  int noldp, noldl;
-  ///
-  float fzminx, fzmaxx, fzminy, fzmaxy;
-
-  /// topological distance of line to base element
-  ARRAY<int> lnearness;
-
-public:
-
-  ///
-  netrule ();
-  ///
-  ~netrule();
-
-  ///
-  int GetNP () const { return points.Size(); }
-  ///
-  int GetNL () const { return lines.Size(); }
-  ///
-  int GetNE () const { return elements.Size(); }
-  ///
-  int GetNOldP () const { return noldp; }
-  ///
-  int GetNOldL () const { return noldl; }
-  ///
-  int GetNDelL () const { return dellines.Size(); }
-  ///
-  int GetNOrientations () const { return orientations.Size(); }
-  ///
-  int GetQuality () const { return quality; }
-  ///
-  int GetLNearness (int li) const { return lnearness.Get(li); }
-
-  ///
-  const Point2d & GetPoint (int i) const { return points.Get(i); }
-  ///
-  const INDEX_2 & GetLine (int i) const { return lines.Get(i); }
-  ///
-  const Element2d & GetElement (int i) const { return elements.Get(i); }
-  ///
-  const threeint & GetOrientation (int i) const { return orientations.Get(i); }
-  ///
-  int GetDelLine (int i) const { return dellines.Get(i); }
-
-  ///
-  void GetFreeZone (ARRAY<Point2d> & afreearea);
-  ///
-
-  double CalcPointDist (int pi, const Point2d & p) const
-  {
-    double dx = p.X() - points.Get(pi).X();
-    double dy = p.Y() - points.Get(pi).Y();
-    const threefloat * tf = &tolerances.Get(pi);
-    return tf->f1 * dx * dx + tf->f2 * dx * dy + tf->f3 * dy * dy;
-  }
-
-  ///
-  float CalcLineError (int li, const Vec2d & v) const;
-
-  ///
-  void SetFreeZoneTransformation (const Vector & u, int tolclass);
-
-  ///
-  bool IsInFreeZone (const Point2d & p) const
-  {
-    if (p.X() < fzminx || p.X() > fzmaxx ||
-	p.Y() < fzminy || p.Y() > fzmaxy) return 0;
-
-    for (int i = 0; i < transfreezone.Size(); i++)
-      {
-	if (freesetinequ(i, 0) * p.X() + 
-	    freesetinequ(i, 1) * p.Y() +
-	    freesetinequ(i, 2) > 0) return 0;
-      }
-    return 1;
-  }
-
-  ///
-  int IsLineInFreeZone (const Point2d & p1, const Point2d & p2) const
-  {
-    if (p1.X() > fzmaxx && p2.X() > fzmaxx ||
-	p1.X() < fzminx && p2.X() < fzminx ||
-	p1.Y() > fzmaxy && p2.Y() > fzmaxy ||
-	p1.Y() < fzminy && p2.Y() < fzminy) return 0;
-    return IsLineInFreeZone2 (p1, p2);
-  }
-  ///
-  int IsLineInFreeZone2 (const Point2d & p1, const Point2d & p2) const;
-  ///
-  int ConvexFreeZone () const;
-  ///
-  const ARRAY<Point2d> & GetTransFreeZone () { return transfreezone; }
-
-  ///
-  int GetPointNr (int ln, int endp) const { return lines.Get(ln).I(endp); }
-
-  ///
-  const DenseMatrix & GetOldUToNewU () const { return oldutonewu; }
-  ///
-  const DenseMatrix & GetOldUToFreeArea () const { return oldutofreearea; }
-  ///
-  const char * Name () const { return name; }
-
-  ///
-  void LoadRule (istream & ist);
-};
-
-
-
-/** Draws 2D rules.
-    Visual testing of 2D meshing rules */
-extern void DrawRules ();
-#endif
-
diff --git a/contrib/Netgen/libsrc/meshing/ruler3.cpp b/contrib/Netgen/libsrc/meshing/ruler3.cpp
deleted file mode 100644
index 48ba5bc4653913c058b135029f3239d1abb57ad6..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/ruler3.cpp
+++ /dev/null
@@ -1,1176 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-// #define MARK
-// #include <prof.h>
-
-namespace netgen
-{
-extern double minother;
-extern double minwithoutother;
-
-
-static double CalcElementBadness (const ARRAY<Point3d> & points,
-				  const Element & elem)
-{
-  double vol, l, l4, l5, l6;
-  if (elem.GetNP() != 4) 
-    {
-      if (elem.GetNP() == 5)
-	{
-	  double z = points.Get(elem.PNum(5)).Z();
-	  if (z > -1e-8) return 1e8;
-	  return (-1 / z) - z; //  - 2;
-	}
-      return 0;
-    }
-  
-  Vec3d v1 = points.Get(elem.PNum(2)) - points.Get(elem.PNum(1));
-  Vec3d v2 = points.Get(elem.PNum(3)) - points.Get(elem.PNum(1));
-  Vec3d v3 = points.Get(elem.PNum(4)) - points.Get(elem.PNum(1));
-  
-  vol = - (Cross (v1, v2) * v3);
-  l4 = Dist (points.Get(elem.PNum(2)), points.Get(elem.PNum(3)));
-  l5 = Dist (points.Get(elem.PNum(2)), points.Get(elem.PNum(4)));
-  l6 = Dist (points.Get(elem.PNum(3)), points.Get(elem.PNum(4)));
-
-  l = v1.Length() + v2.Length() + v3.Length() + l4 + l5 + l6;
-  
-  //  testout << "vol = " << vol << " l = " << l << endl;
-  if (vol < 1e-8) return 1e10;
-  //  (*testout) << "l^3/vol = " << (l*l*l / vol) << endl;
-  
-  double err = pow (l*l*l/vol, 1.0/3.0) / 12;
-  return err;
-}
-
-
-
-
-
-
-int Meshing3 :: ApplyRules 
-(
- ARRAY<Point3d> & lpoints,     // in: local points, out: old+new local points
- ARRAY<int> & allowpoint,      // in: 1 .. it is allowed to use pointi
- ARRAY<Element2d> & lfaces,    // in: local faces, out: old+new local faces
- INDEX lfacesplit,	       // for local faces in outer radius
- INDEX_2_HASHTABLE<int> & connectedpairs,  // connected pairs for prism-meshing
- ARRAY<Element> & elements,    // out: new elements
- ARRAY<INDEX> & delfaces,      // out: face indices of faces to delete
- int tolerance,                // quality class: 1 best 
- double sloppy,                // quality strength
- int rotind1,                  // how to rotate base element
- float & retminerr             // element error 
- )
-
-{
-  int i, j, k, ri, nfok, npok, incnpok, refpi, locpi, locfi, locfr;
-  int hi, minn, hpi;
-  float hf, err, minerr, teterr, minteterr;
-  char ok, found, hc;
-  vnetrule * rule;
-  Vector oldu, newu, newu1, newu2, allp;
-  Vec3d ui;
-  Point3d np;
-  int oldnp, noldlp, noldlf;
-  const Element2d * locface = NULL;
-  int loktestmode;
-  
-  static ARRAY<int> pused;       // point is already mapped
-  static ARRAY<int> fused;       // face is already mapped
-  static ARRAY<int> pmap;        // map of reference point to local point
-  static ARRAY<int> pfixed;      // ???
-  static ARRAY<int> fmapi;       // face in reference is mapped to face nr ...
-  static ARRAY<int> fmapr;       // face in reference is rotated to map 
-  static ARRAY<Point3d> transfreezone;  // transformed free-zone
-  static INDEX cnt = 0;
-  INDEX_2_HASHTABLE<int> ledges(lfaces.Size());  // edges in local environment
-  
-  static ARRAY<Point3d> tempnewpoints;
-  static ARRAY<Element2d> tempnewfaces;
-  static ARRAY<int> tempdelfaces;
-  static ARRAY<Element> tempelements;
-  static ARRAY<Box3d> triboxes;         // bounding boxes of local faces
-
-
-  static ARRAY<int> pnearness;
-  static ARRAY<int> fnearness;
-  
-  cnt++;
-  
-  delfaces.SetSize (0);
-  elements.SetSize (0);
-
-
-  // determine topological distance of faces and points to
-  // base element
-
-
-  pnearness.SetSize (lpoints.Size());
-  fnearness.SetSize (lfacesplit);
-
-  for (i = 1; i <= pnearness.Size(); i++)
-    pnearness.Set(i, INT_MAX/10);
-
-  for (j = 1; j <= lfaces.Get(1).GetNP(); j++)
-    pnearness.Set(lfaces.Get(1).PNum(j), 0);
-
-
-  // MARK(appl1);
-  do
-    {
-      ok = 1;
-      
-      for (i = 1; i <= lfacesplit; i++)
-	{
-	  const Element2d & hface = lfaces.Get(i);
-
-	  minn = INT_MAX-1;
-	  for (j = 1; j <= hface.GetNP(); j++)
-	    {
-	      hi = pnearness.Get(hface.PNum(j));
-	      if (hi < minn) minn = hi;
-	    }
-	  
-	  for (j = 1; j <= hface.GetNP(); j++)
-	    {
-	      hpi = hface.PNum(j);
-	      if (pnearness.Get(hpi) > minn+1)
-		{
-		  ok = 0;
-		  pnearness.Set(hpi, minn+1);
-		}
-	    }
-	}
-
-      for (i = 1; i <= connectedpairs.GetNBags(); i++)
-	for (j = 1; j <= connectedpairs.GetBagSize(i); j++)
-	  {
-	    INDEX_2 edge;
-	    int val;
-	    connectedpairs.GetData (i, j, edge, val);
-
-	    
-	    if (edge.I1() > pnearness.Size() ||
-		edge.I2() > pnearness.Size() ||
-		edge.I1() < 1 ||
-		edge.I2() < 1)
-	      {
-		cerr << "pair out of range" << endl;
-		exit (1);
-	      }
-		
-	    if (pnearness.Get(edge.I1()) >
-		pnearness.Get(edge.I2()) + 1)
-	      {
-		;
-		ok = 0;
-		pnearness.Elem(edge.I1()) = 
-		  pnearness.Get(edge.I2()) + 1;
-	      }
-	    if (pnearness.Get(edge.I2()) >
-		pnearness.Get(edge.I1()) + 1)
-	      {
-		;
-		ok = 0;
-		pnearness.Elem(edge.I2()) = 
-		  pnearness.Get(edge.I1()) + 1;
-	      }
-	  }
-    }
-  while (!ok);
-
-  
-  for (i = 1; i <= fnearness.Size(); i++)
-    {
-      fnearness.Set(i, 0);
-      for (j = 1; j <= lfaces.Get(i).GetNP(); j++)
-	fnearness.Elem(i) += pnearness.Get(lfaces.Get(i).PNum(j));
-    }
-
-
-  // MARK(appl2);
-
-  // find bounding boxes of faces
-
-  triboxes.SetSize (lfaces.Size());
-  for (i = 1; i <= lfaces.Size(); i++)
-    {
-      const Element2d & face = lfaces.Get(i);
-      triboxes.Elem(i).SetPoint (lpoints.Get(face.PNum(1)));
-      for (j = 2; j <= face.GetNP(); j++)
-	triboxes.Elem(i).AddPoint (lpoints.Get(face.PNum(j)));
-    }
-
-  // MARK(appl3);  
-
-  /*
-  for (j = 1; j <= lfacesplit; j++)
-    for (k = 1; k <= lfaces.Get(j).GetNP(); k++)
-      {
-	INDEX_2 i2;
-	i2.I1() = lfaces.Get(j).PNumMod(k);
-	i2.I2() = lfaces.Get(j).PNumMod(k+1);
-	i2.Sort();
-	ledges.Set (i2, 1);
-      }
-  */  
-  
-  for (j = 1; j <= lfacesplit; j++)
-    {
-      const Element2d & face = lfaces.Get(j);
-      int newp, oldp;
-
-      newp = face.PNum(face.GetNP());
-      for (k = 1; k <= face.GetNP(); k++)
-	{
-	  oldp = newp;
-	  newp = face.PNum(k);
-	  
-	  INDEX_2 i2(oldp, newp);
-	  i2.Sort();
-	  ledges.Set (i2, 1);
-	}
-    }
-
-
-  pused.SetSize (lpoints.Size());
-  fused.SetSize (lfaces.Size());
-  
-
-
-  found = 0;
-  minerr = tolfak * tolerance * tolerance;
-  minteterr = sloppy * tolerance;
-
-  if (testmode)
-    (*testout) << "cnt = " << cnt << " class = " << tolerance << endl;
-
-
-  // check each rule:
-
-  // MARK(applyml);
-
-  for (ri = 1; ri <= rules.Size(); ri++)
-    { 
-      sprintf (problems.Elem(ri), "");
-
-      rule = rules.Get(ri);
-      
-      if (rule->GetNP(1) != lfaces.Get(1).GetNP())
-	continue;
-
-      if (rule->GetQuality() > tolerance)
-	{
-	  if (testmode)
-	    sprintf (problems.Elem(ri), "Quality not ok");
-	  continue;
-	}
-      
-      if (testmode)
-	sprintf (problems.Elem(ri), "no mapping found");
-      
-      loktestmode = testmode || rule->TestFlag ('t');
-      /*
-      if (tolerance > 8)
-	loktestmode = 1;
-      */
-
-      if (loktestmode)
-	(*testout) << "Rule " << ri << " = " << rule->Name() << endl;
-      
-      pmap.SetSize (rule->GetNP());
-      fmapi.SetSize (rule->GetNF());
-      fmapr.SetSize (rule->GetNF());
-      
-      for (i = 1; i <= lfaces.Size(); i++)
-	fused.Set (i, 0);
-      for (i = 1; i <= lpoints.Size(); i++)
-	pused.Set (i, 0);
-      for (i = 1; i <= pmap.Size(); i++)
-	pmap.Set(i, 0);
-      for (i = 1; i <= fmapi.Size(); i++)
-	fmapi.Set(i, 0);
-      for (i = 1; i <= fmapr.Size(); i++)
-	fmapr.Set(i, rule->GetNP(i));
-      
-      fused.Set (1, 1);
-      
-      fmapi.Set (1, 1);
-      fmapr.Set (1, rotind1);
-
-      
-      for (j = 1; j <= lfaces.Get(1).GetNP(); j++)
-	{
-	  locpi = lfaces.Get(1).PNumMod (j+rotind1);
-	  pmap.Set (rule->GetPointNr (1, j), locpi);
-	  pused.Elem(locpi)++;
-	}
-
-
-
-      /*
-	map all faces
-	nfok .. first nfok-1 faces are mapped properly
-	*/
-
-      nfok = 2;
-      while (nfok >= 2)
-	{
-	  
-	  if (nfok <= rule->GetNOldF())
-	    {
-	      // not all faces mapped
-
-	      ok = 0;
-	      locfi = fmapi.Get(nfok);
-	      locfr = fmapr.Get(nfok);
-
-	      int actfnp = rule->GetNP(nfok);
-
-	      while (!ok)
-		{
-		  locfr++;
-		  if (locfr == actfnp + 1)
-		    {
-		      locfr = 1;
-		      locfi++;
-		      if (locfi > lfacesplit) break;
-		    }
-		  
-		  
-		  if (fnearness.Get(locfi) > rule->GetFNearness (nfok) ||
-		      fused.Get(locfi) ||
-		      actfnp != lfaces.Get(locfi).GetNP() )
-		    {
-		      // face not feasible in any rotation
-
-		      locfr = actfnp;
-		    }
-		  else
-		    {
-		      
-		      ok = 1;
-		      
-		      locface = &lfaces.Get(locfi);
-
-		      
-		      // reference point already mapped differently ?
-		      for (j = 1; j <= actfnp && ok; j++)
-			{
-			  locpi = pmap.Get(rule->GetPointNr (nfok, j));
-			  
-			  if (locpi && locpi != locface->PNumMod(j+locfr))
-			    ok = 0;
-			}
-		      
-		      // local point already used or point outside tolerance ?
-		      for (j = 1; j <= actfnp && ok; j++)
-			{
-			  refpi = rule->GetPointNr (nfok, j);
-			  
-			  if (pmap.Get(refpi) == 0)
-			    {
-			      locpi = locface->PNumMod (j + locfr);
-
-			      if (pused.Get(locpi))
-				ok = 0;
-			      else
-				{
-				  const Point3d & lp = lpoints.Get(locpi);
-				  const Point3d & rp = rule->GetPoint(refpi);
-
-				  if ( Dist2 (lp, rp) * rule->PointDistFactor(refpi) > minerr)
-				    ok = 0;
-				}
-			    }
-			}
-		    }
-		}
-	      
-	      
-	      if (ok)
-		{
-		  // map face nfok
-
-		  fmapi.Set (nfok, locfi);
-		  fmapr.Set (nfok, locfr);
-		  fused.Set (locfi, 1);
-		  
-		  for (j = 1; j <= rule->GetNP (nfok); j++)
-		    {
-		      locpi = locface->PNumMod(j+locfr);
-		      
-		      if (rule->GetPointNr (nfok, j) <= 3 &&
-			  pmap.Get(rule->GetPointNr(nfok, j)) != locpi)
-			(*testout) << "change face1 point, mark1" << endl;
-		      
-		      pmap.Set(rule->GetPointNr (nfok, j), locpi);
-		      pused.Elem(locpi)++;
-		    }
-		  
-		  nfok++;
-		}
-	      else
-		{
-		  // backtrack one face
-		  fmapi.Set (nfok, 0);
-		  fmapr.Set (nfok, rule->GetNP(nfok));
-		  nfok--;
-		  
-		  fused.Set (fmapi.Get(nfok), 0);
-		  for (j = 1; j <= rule->GetNP (nfok); j++)
-		    {
-		      refpi = rule->GetPointNr (nfok, j);
-		      pused.Elem(pmap.Get(refpi))--;
-		      
-		      if (pused.Get(pmap.Get(refpi)) == 0)
-			{
-			  pmap.Set(refpi, 0);
-			}
-		    }
-		}
-	    }
-	  
-	  else
-	    
-	    { 
-
-	      // all faces are mapped
-	      // now map all isolated points:
-	      
-	      if (loktestmode)
-		{
-		  (*testout) << "Faces Ok" << endl;
-		  sprintf (problems.Elem(ri), "Faces Ok");
-		}
-	      
-	      npok = 1;
-	      incnpok = 1;
-	      
-	      pfixed.SetSize (pmap.Size());
-	      for (i = 1; i <= pmap.Size(); i++)
-		pfixed.Set(i, (pmap.Get(i) != 0) );
-	      
-	      while (npok >= 1)
-		{
-		  
-		  if (npok <= rule->GetNOldP())
-		    {
-		      
-		      if (pfixed.Get(npok))
-			
-			{
-			  if (incnpok)
-			    npok++;
-			  else
-			    npok--;
-			}
-		      
-		      else
-			
-			{
-			  locpi = pmap.Elem(npok);
-			  ok = 0;
-			  
-			  if (locpi)
-			    pused.Elem(locpi)--;
-			  
-			  while (!ok && locpi < lpoints.Size())
-			    {
-			      ok = 1;
-			      locpi++;
-			      
-			      if (pused.Get(locpi) || !allowpoint.Get(locpi) ||
-				  pnearness.Get(locpi) > rule->GetPNearness(npok))
-				{
-				  ok = 0;
-				}
-			      else
-				{
-				  const Point3d & lp = lpoints.Get(locpi);
-				  const Point3d & rp = rule->GetPoint(npok);
-
-				  if ( Dist2 (lp, rp) * rule->PointDistFactor(npok) > minerr)
-				    ok = 0;
-				}
-			    }
-			  
-			  
-			  if (ok)
-			    {
-			      pmap.Set (npok, locpi);
-			      
-			      if (npok <= 3)
-				(*testout) << "set face1 point, mark3" << endl;
-			      
-			      pused.Elem(locpi)++;
-			      npok++;
-			      incnpok = 1;
-			    }
-			  
-			  else
-			    
-			    {
-			      pmap.Set (npok, 0);
-			      
-			      if (npok <= 3)
-				(*testout) << "set face1 point, mark4" << endl;
-			      
-			      npok--;
-			      incnpok = 0;
-			    }
-			}
-		    }
-		  
-		  else
-		    
-		    {
-		      
-		      // all points are mapped
-		      
-		      if (loktestmode)
-			{
-			  (*testout) << "Mapping found!!: Rule " << rule->Name() << endl;
-			  for (i = 1; i <= pmap.Size(); i++)
-			    (*testout) << pmap.Get(i) << " ";
-			  (*testout) << endl;
-			  sprintf (problems.Elem(ri), "mapping found");
-			  (*testout) << rule->GetNP(1) << " = " << lfaces.Get(1).GetNP() << endl;
-			}
-		      
-		      ok = 1;
-		      
-		      
-		      // check mapedges:
-		      
-		      for (i = 1; i <= rule->GetNEd(); i++)
-			{
-			  int i1, i2;
-			  i1 = pmap.Get(rule->GetEdge(i).i1);
-			  i2 = pmap.Get(rule->GetEdge(i).i2);
-
-			  INDEX_2 in2(i1, i2);
-			  in2.Sort();
-			  if (!ledges.Used (in2)) ok = 0;
-			}
-
-
-		      // check prism edges:
-		      for (i = 1; i <= rule->GetNE(); i++)
-			{
-			  const Element & el = rule->GetElement (i);
-			  if (el.GetType() == PRISM) 
-			    { 
-			      for (j = 1; j <= 3; j++)
-				{
-				  int i1, i2;
-				  i1 = pmap.Get(el.PNum(j));
-				  i2 = pmap.Get(el.PNum(j+3));
-				  
-				  INDEX_2 in2(i1, i2);
-				  in2.Sort();
-				  if (!connectedpairs.Used (in2)) ok = 0;
-				}
-			    }
-			  if (el.GetType() == PYRAMID) 
-			    { 
-			      if (loktestmode)
-				(*testout) << "map pyramid, rule = " << rule->Name() << endl;
-			      for (j = 1; j <= 2; j++)
-				{
-				  INDEX_2 in2;
-				  if (j == 1)
-				    {
-				      in2.I1() = pmap.Get(el.PNum(2));
-				      in2.I2() = pmap.Get(el.PNum(3));
-				    }
-				  else
-				    {
-				      in2.I1() = pmap.Get(el.PNum(1));
-				      in2.I2() = pmap.Get(el.PNum(4));
-				    }
-				  in2.Sort();
-				  if (!connectedpairs.Used (in2)) 
-				    {
-				      ok = 0;
-				      if (loktestmode)
-					(*testout) << "no pair" << endl;
-				    }
-				}
-			    }
-
-			}
-		      
-
-		      
-		      for (i = rule->GetNOldF() + 1; i <= rule->GetNF(); i++)
-			fmapi.Set(i, 0);
-		      
-
-		      if (ok)
-			{
-			  foundmap.Elem(ri)++;
-			}
-
-		      
-
-
-		      // deviation of existing points
-
-		      oldu.SetSize (3 * rule->GetNOldP());
-		      newu.SetSize (3 * (rule->GetNP() - rule->GetNOldP()));
-		      allp.SetSize (3 * rule->GetNP());
-		      
-		      for (i = 1; i <= rule->GetNOldP(); i++)
-			{
-			  const Point3d & lp = lpoints.Get(pmap.Get(i));
-			  const Point3d & rp = rule->GetPoint(i);
-			  oldu.Set (3*i-2, lp.X()-rp.X());
-			  oldu.Set (3*i-1, lp.Y()-rp.Y());
-			  oldu.Set (3*i  , lp.Z()-rp.Z());
-			  
-			  allp.Set (3*i-2, lp.X());
-			  allp.Set (3*i-1, lp.Y());
-			  allp.Set (3*i  , lp.Z());
-			}
-
-		      if (rule->GetNP() > rule->GetNOldP())
-			{
-			  newu.SetSize (rule->GetOldUToNewU().Height());
-			  rule->GetOldUToNewU().Mult (oldu, newu);
-			}
-
-		      //		      int idiff = 3 * (rule->GetNP()-rule->GetNOldP());
-		      int idiff = 3 * rule->GetNOldP();
-		      for (i = rule->GetNOldP()+1; i <= rule->GetNP(); i++)
-			{
-			  const Point3d & rp = rule->GetPoint(i);
-			  allp.Set (3*i-2, rp.X() + newu.Get(3*i-2 - idiff));
-			  allp.Set (3*i-1, rp.Y() + newu.Get(3*i-1 - idiff));
-			  allp.Set (3*i  , rp.Z() + newu.Get(3*i   - idiff));
-			}
-		      
-		      rule->SetFreeZoneTransformation (allp, 
-						       tolerance + int(sloppy));
-
-		      if (!rule->ConvexFreeZone())
-			{
-			  ok = 0;
-			  sprintf (problems.Elem(ri), "Freezone not convex");
-
-			  if (loktestmode)
-			    (*testout) << "Freezone not convex" << endl;
-			}
-
-		      if (loktestmode)
-			{
-			  const ARRAY<Point3d> & fz = rule->GetTransFreeZone();
-			  (*testout) << "Freezone: " << endl;
-			  for (i = 1; i <= fz.Size(); i++)
-			    (*testout) << fz.Get(i) << endl;
-			}
-		      
-
-		      // check freezone:
-		      
-		      for (i = 1; i <= lpoints.Size(); i++)
-			{
-			  if ( !pused.Get(i) )
-			    {
-			      const Point3d & lp = lpoints.Get(i);
-
-			      if (rule->fzbox.IsIn (lp))
-				{
-				  if (rule->IsInFreeZone(lp))
-				    {
-				      if (loktestmode)
-					{
-					  (*testout) << "Point " << i 
-						     << " in Freezone" << endl;
-					  sprintf (problems.Elem(ri), 
-						   "locpoint %d in Freezone", i);
-					}
-				      ok = 0;
-				      break;
-				    }
-				}
-			    }
-			}
-
-		      for (i = 1; i <= lfaces.Size() && ok; i++)
-			{
-			  static ARRAY<int> lpi(4);
-
-			  if (!fused.Get(i))
-			    { 
-			      int triin;
-			      const Element2d & lfacei = lfaces.Get(i);
-
-			      if (!triboxes.Elem(i).Intersect (rule->fzbox))
-				triin = 0;
-			      else
-				{
-				  int li, lj;
-				  for (li = 1; li <= lfacei.GetNP(); li++)
-				    {
-				      int lpii = 0;
-				      int pi = lfacei.PNum(li);
-				      for (lj = 1; lj <= rule->GetNOldP(); lj++)
-					if (pmap.Get(lj) == pi)
-					  lpii = lj;
-				      lpi.Elem(li) = lpii;
-				    }
-
-
-				  if (lfacei.GetNP() == 3)
-				    {
-				      triin = rule->IsTriangleInFreeZone 
-					(
-					 lpoints.Get(lfacei.PNum(1)),
-					 lpoints.Get(lfacei.PNum(2)),
-					 lpoints.Get(lfacei.PNum(3)), lpi, 1
-					 );
-				    }
-				  else
-				    {
-				      triin = rule->IsQuadInFreeZone 
-					(
-					 lpoints.Get(lfacei.PNum(1)),
-					 lpoints.Get(lfacei.PNum(2)),
-					 lpoints.Get(lfacei.PNum(3)), 
-					 lpoints.Get(lfacei.PNum(4)), 
-					 lpi, 1
-					 );
-				    }
-				}
-
-
-			      if (triin == -1)
-				{
-				  ok = 0;
-				}
-			      
-			      if (triin == 1)
-				{
-#ifdef TEST_JS
-				  ok = 0;
-
-				  if (loktestmode)
-				    {
-				      (*testout) << "El with " << lfaces.Get(i).GetNP() << " points in freezone: "
-						 << lfaces.Get(i).PNum(1) << " - " 
-						 << lfaces.Get(i).PNum(2) << " - "
-						 << lfaces.Get(i).PNum(3) << " - "
-						 << lfaces.Get(i).PNum(4) << endl;
-				      for (int lj = 1; lj <= lfaces.Get(i).GetNP(); lj++)
-					(*testout) << lpoints.Get(lfaces.Get(i).PNum(lj)) << " ";
-
-				      (*testout) << endl;
-
-				      sprintf (problems.Elem(ri), "triangle (%d, %d, %d) in Freezone",
-					       lfaces.Get(i).PNum(1), lfaces.Get(i).PNum(2),
-					       lfaces.Get(i).PNum(3));
-				    }
-#else
-				  if (loktestmode)
-				    {
-				      if (lfacei.GetNP() == 3)
-					{
-					  (*testout) << "Triangle in freezone: "
-						     << lfacei.PNum(1) << " - " 
-						     << lfacei.PNum(2) << " - "
-						     << lfacei.PNum(3) 
-						     << ", or "
-						     << lpoints.Get(lfacei.PNum(1)) << " - " 
-						     << lpoints.Get(lfacei.PNum(2)) << " - "
-						     << lpoints.Get(lfacei.PNum(3)) 
-						     << endl;
-					  (*testout) << "lpi = " << lpi.Get(1) << ", " 
-						     << lpi.Get(2) << ", " << lpi.Get(3) << endl;
-					}
-				      else
-					  (*testout) << "Quad in freezone: "
-						     << lfacei.PNum(1) << " - " 
-						     << lfacei.PNum(2) << " - "
-						     << lfacei.PNum(3) << " - "
-						     << lfacei.PNum(4) 
-						     << ", or "
-						     << lpoints.Get(lfacei.PNum(1)) << " - " 
-						     << lpoints.Get(lfacei.PNum(2)) << " - "
-						     << lpoints.Get(lfacei.PNum(3)) << " - "
-						     << lpoints.Get(lfacei.PNum(4)) 
-						     << endl;
-
-				      sprintf (problems.Elem(ri), "triangle (%d, %d, %d) in Freezone",
-					       int(lfaces.Get(i).PNum(1)), 
-					       int(lfaces.Get(i).PNum(2)),
-					       int(lfaces.Get(i).PNum(3)));
-				    }	
-
-				  hc = 0;
-				  for (k = rule->GetNOldF() + 1; k <= rule->GetNF(); k++)
-				    {
-				      if (rule->GetPointNr(k, 1) <= rule->GetNOldP() &&
-					  rule->GetPointNr(k, 2) <= rule->GetNOldP() &&
-					  rule->GetPointNr(k, 3) <= rule->GetNOldP())
-					{
-					  for (j = 1; j <= 3; j++)
-					    if (lfaces.Get(i).PNumMod(j  ) == pmap.Get(rule->GetPointNr(k, 1)) &&
-						lfaces.Get(i).PNumMod(j+1) == pmap.Get(rule->GetPointNr(k, 3)) &&
-						lfaces.Get(i).PNumMod(j+2) == pmap.Get(rule->GetPointNr(k, 2)))
-					      {
-						fmapi.Elem(k) = i;
-						hc = 1;
-
-						
- // 						(*testout) << "found from other side: " 
-//  							   << rule->Name() 
-//  							   << " ( " << pmap.Get (rule->GetPointNr(k, 1))
-//  							   << " - " << pmap.Get (rule->GetPointNr(k, 2))
-//  							   << " - " << pmap.Get (rule->GetPointNr(k, 3)) << " ) "
-//  							   << endl;
-
-						strcpy (problems.Elem(ri), "other");
-					      }
-					}
-				    }
-				  
-				  if (!hc)
-				    {
-				      if (loktestmode)
-					{
-					  (*testout) << "Triangle in freezone: "
-						     << lfaces.Get(i).PNum(1) << " - " 
-						     << lfaces.Get(i).PNum(2) << " - "
-						     << lfaces.Get(i).PNum(3) << endl;
-
-					  sprintf (problems.Elem(ri), "triangle (%d, %d, %d) in Freezone",
-						   int (lfaces.Get(i).PNum(1)), 
-						   int (lfaces.Get(i).PNum(2)),
-						   int (lfaces.Get(i).PNum(3)));
-					}
-				      ok = 0;
-				    }
-#endif
-				}
-			    }
-			   
-			}
-
-		      
-		      if (ok)
-			{
-			  err = 0;
-			  for (i = 1; i <= rule->GetNOldP(); i++)
-			    {
-			      hf = rule->CalcPointDist (i, lpoints.Get(pmap.Get(i)));
-			      if (hf > err) err = hf;
-			    }
-			  
-			  
-			  if (loktestmode)
-			    {
-			      (*testout) << "Rule ok" << endl;
-			      sprintf (problems.Elem(ri), "Rule ok, err = %f", err);
-			    }
-
-
-			  // MARK(m2);			  
-			  //			  newu = rule->GetOldUToNewU() * oldu;
-
-			  // set new points:
-			  
-			  oldnp = rule->GetNOldP();
-			  noldlp = lpoints.Size();
-			  noldlf = lfaces.Size();
-			  
-			  
-			  for (i = oldnp + 1; i <= rule->GetNP(); i++)
-			    {
-			      np = rule->GetPoint(i);
-			      np.X() += newu.Elem (3 * (i-oldnp) - 2);
-			      np.Y() += newu.Elem (3 * (i-oldnp) - 1);
-			      np.Z() += newu.Elem (3 * (i-oldnp));
-			      
-			      pmap.Elem(i) = lpoints.Append (np);
-			    }
-			  
-			  // Set new Faces:
-			  
-			  for (i = rule->GetNOldF() + 1; i <= rule->GetNF(); i++)
-			    if (!fmapi.Get(i))
-			      {
-				Element2d nface(rule->GetNP(i));
-				for (j = 1; j <= nface.GetNP(); j++)
-				  nface.PNum(j) = pmap.Get(rule->GetPointNr (i, j));
-				
-				lfaces.Append (nface);
-			      }
-			  
-			  
-			  // Delete old Faces:
-
-			  for (i = 1; i <= rule->GetNDelF(); i++)
-			    delfaces.Append (fmapi.Get(rule->GetDelFace(i)));
-			  for (i = rule->GetNOldF()+1; i <= rule->GetNF(); i++)
-			    if (fmapi.Get(i))
-			      {
-				delfaces.Append (fmapi.Get(i));
-				fmapi.Elem(i) = 0;
-			      }
-			  
-
-			  // check orientation
-			  for (i = 1; i <= rule->GetNO() && ok; i++)
-			    {
-			      const fourint * fouri;
-			      
-			      fouri = &rule->GetOrientation(i);
-			      Vec3d v1 (lpoints.Get(pmap.Get(fouri->i1)), 
-					lpoints.Get(pmap.Get(fouri->i2)));
-			      Vec3d v2 (lpoints.Get(pmap.Get(fouri->i1)), 
-					lpoints.Get(pmap.Get(fouri->i3)));
-			      Vec3d v3 (lpoints.Get(pmap.Get(fouri->i1)), 
-					lpoints.Get(pmap.Get(fouri->i4)));
-
-			      Vec3d n;
-			      Cross (v1, v2, n);
-			      if (n * v3 > -1e-7)
-				{
-				  if (loktestmode)
-				    {
-				      sprintf (problems.Elem(ri), "Orientation wrong");
-				      (*testout) << "Orientation wrong" << endl;
-				    }
-				  ok = 0;
-				}
-			    }
-
-			  
-
-			  // new points in free-zone ?
-			  for (i = rule->GetNOldP() + 1; i <= rule->GetNP() && ok; i++)
-			    if (!rule->IsInFreeZone (lpoints.Get(pmap.Get(i))))
-			      {
-				if (loktestmode)
-				  {
-				    (*testout) << "Newpoint " << lpoints.Get(pmap.Get(i))
-					       << " outside convex hull" << endl;
-				    sprintf (problems.Elem(ri), "newpoint outside convex hull");
-				  }
-				ok = 0;
-				
-			      }
-			  
-			  // insert new elements
-			  
-			  for (i = 1; i <= rule->GetNE(); i++)
-			    {
-			      elements.Append (rule->GetElement(i));
-			      for (j = 1; j <= elements.Get(i).NP(); j++)
-				elements.Elem(i).PNum(j) = pmap.Get(elements.Get(i).PNum(j));
-			    }
-			  
-
-			  // Calculate Element badness
-			  
-			  teterr = 0;
-			  for (i = 1; i <= elements.Size(); i++)
-			    {
-			      hf = CalcElementBadness (lpoints, elements.Get(i));
-			      if (hf > teterr) teterr = hf;
-			    }
-
-			  /*
-			    // keine gute Erfahrung am 25.1.2000, js
-			  if (ok && teterr < 100 &&
-			      (rule->TestFlag('b') || tolerance > 10) )
-			    {
-			      (*mycout) << "Reset teterr " 
-				   << rule->Name() 
-				   << " err = " << teterr 
-				   << endl;
-			      teterr = 1;
-			    }
-			  */
-
-			  // compare edgelength
-			  if (rule->TestFlag('l'))
-			    {
-			      double oldlen = 0;
-			      double newlen = 0;
-
-			      for (i = 1; i <= rule->GetNDelF(); i++)
-				{
-				  const Element2d & face = 
-				    rule->GetFace (rule->GetDelFace(i));
-				  for (j = 1; j <= 3; j++)
-				    {
-				      const Point3d & p1 =
-					lpoints.Get(pmap.Get(face.PNumMod(j)));
-				      const Point3d & p2 =
-					lpoints.Get(pmap.Get(face.PNumMod(j+1)));
-				      oldlen += Dist(p1, p2);
-				    }
-				}
-
-			      for (i = rule->GetNOldF()+1; i <= rule->GetNF(); i++)
-				{
-				  const Element2d & face = rule->GetFace (i);
-				  for (j = 1; j <= 3; j++)
-				    {
-				      const Point3d & p1 =
-					lpoints.Get(pmap.Get(face.PNumMod(j)));
-				      const Point3d & p2 =
-					lpoints.Get(pmap.Get(face.PNumMod(j+1)));
-				      newlen += Dist(p1, p2);
-				    }
-				}
-
-			      if (oldlen < newlen) 
-				{
-				  ok = 0;
-				  if (loktestmode)
-				    sprintf (problems.Elem(ri), "oldlen < newlen");
-				}
-			    }
-			  
-
-			  if (loktestmode)
-			    (*testout) << "ok = " << int(ok) 
-				       << "teterr = " << teterr 
-				       << "minteterr = " << minteterr << endl;
-
-
-			  if (ok && teterr < tolerance)
-			    {
-			      canuse.Elem(ri) ++;
-			      /*
-			      (*testout) << "can use rule " << rule->Name() 
-					 << ", err = " << teterr << endl;
-			      for (i = 1; i <= pmap.Size(); i++)
-				(*testout) << pmap.Get(i) << " ";
-			      (*testout) << endl;
-			      */
-
-			      if (strcmp (problems.Elem(ri), "other") == 0)
-				{
-				  if (teterr < minother)
-				    minother = teterr;
-				}
-			      else
-				{
-				  if (teterr < minwithoutother)
-				    minwithoutother = teterr;
-				}
-			    }
-
-			  if (ok && teterr < minteterr)
-			    {
-
-			      if (loktestmode)
-				(*testout) << "use rule" << endl;
-
-			      found = ri;
-			      minteterr = teterr;
-			      
-			      if (testmode)
-				{
-				  for (i = 1; i <= rule->GetNOldP(); i++)
-				    {
-				      (*testout) << "P" << i << ": Ref: "
-						 << rule->GetPoint (i) << "  is: "
-						 << lpoints.Get(pmap.Get(i)) << endl;
-				    }
-				}
-			      
-			      tempnewpoints.SetSize (0);
-			      for (i = noldlp+1; i <= lpoints.Size(); i++)
-				tempnewpoints.Append (lpoints.Get(i));
-			      
-			      tempnewfaces.SetSize (0);
-			      for (i = noldlf+1; i <= lfaces.Size(); i++)
-				tempnewfaces.Append (lfaces.Get(i));
-
-			      tempdelfaces.SetSize (0);
-			      for (i = 1; i <= delfaces.Size(); i++)
-				tempdelfaces.Append (delfaces.Get(i));
-			      
-			      tempelements.SetSize (0);
-			      for (i = 1; i <= elements.Size(); i++)
-				tempelements.Append (elements.Get(i));
-			    }
-			  
-			  lpoints.SetSize (noldlp);
-			  lfaces.SetSize (noldlf);
-			  delfaces.SetSize (0);
-			  elements.SetSize (0);
-			}
-		      
-		      npok = rule->GetNOldP();
-		      incnpok = 0;
-		    }
-		}
-	      
-	      nfok = rule->GetNOldF();
-	      
-	      for (j = 1; j <= rule->GetNP (nfok); j++)
-		{
-		  refpi = rule->GetPointNr (nfok, j);
-		  pused.Elem(pmap.Get(refpi))--;
-		  
-		  if (pused.Get(pmap.Get(refpi)) == 0)
-		    {
-		      pmap.Set(refpi, 0);
-		    }
-		}
-	      
-	    }
-	}
-      if (loktestmode)
-	(*testout) << "end rule" << endl;
-    }
-
-  //  (*testout) << "end" << endl;
-
-  // if successfull, reload best choice
-  
-  if (found)
-    {
-
-#ifdef debug
-      // if face in advancing front ???
-      for (i = 1; i <= tempnewfaces.Size(); i++)
-	{
-	  hc = 1;
-	  for (k = 1; k <= lfaces.Size() && hc; k++)
-	    for (j = 1; j <= 3 && hc; j++)
-	      if (tempnewfaces.Elem(i).PNumMod(j  ) == lfaces.Get(k).PNum(1) &&
-		  tempnewfaces.Elem(i).PNumMod(j+1) == lfaces.Get(k).PNum(3) &&
-		  tempnewfaces.Elem(i).PNumMod(j+2) == lfaces.Get(k).PNum(2))
-		{
-		  tempdelfaces.Append(k);
-		  tempnewfaces.Elem(i).PNum(1) = 0;
-		  hc = 0;
-		  cerr << "Ruler-reload necessary" << endl;
-		}
-	}
-#endif
-      
-      for (i = 1; i <= tempnewpoints.Size(); i++)
-	lpoints.Append (tempnewpoints.Get(i));
-      for (i = 1; i <= tempnewfaces.Size(); i++)
-	if (tempnewfaces.Get(i).PNum(1))
-	  lfaces.Append (tempnewfaces.Get(i));
-      for (i = 1; i <= tempdelfaces.Size(); i++)
-	delfaces.Append (tempdelfaces.Get(i));
-      for (i = 1; i <= tempelements.Size(); i++)
-	elements.Append (tempelements.Get(i));
-    }
-  
-  retminerr = minerr;
-  return found;
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/ruler3.hpp b/contrib/Netgen/libsrc/meshing/ruler3.hpp
deleted file mode 100644
index 483d83ed4ebf9d3b5e4fd1e7acaee36b3dcbcb38..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/ruler3.hpp
+++ /dev/null
@@ -1,210 +0,0 @@
-#ifndef FILE_RULER3
-#define FILE_RULER3
-
-
-/**
-  3D element generation rule.
- */
-class vnetrule
-{
-private:
-  /// rule is applicable for quality classes above this value
-  int quality;
-  /// name of rule
-  char * name;
-  /// point coordinates in reference position
-  ARRAY<Point3d> points;
-  /// old and new faces in reference numbering
-  ARRAY<Element2d> faces;
-  /// additional edges of rule
-  ARRAY<twoint> edges;
-
-  /// points of freezone in reference coordinates
-  ARRAY<Point3d> freezone;
-  /// points of freezone in reference coordinates if tolcalss to infty
-  ARRAY<Point3d> freezonelimit;
-  /// point index, if point equal to mappoint, otherwise 0
-  ARRAY<int> freezonepi;
-  /// faces of each convex part of freezone
-  ARRAY<ARRAY<threeint>*> freefaces;
-  /// set of points of each convex part of freezone
-  ARRAY<ARRAY<int>*> freesets;
-  /// points of transformed freezone
-  ARRAY<Point3d> transfreezone;
-  /// edges of each convex part of freezone
-  ARRAY<ARRAY<twoint>*> freeedges;
-
-  /// face numbers to be deleted
-  ARRAY<int> delfaces;
-  /// elements to be generated
-  ARRAY<Element> elements;
-  /// tolerances for points and faces (used ??)
-  ARRAY<double> tolerances, linetolerances;
-  /// transformation matrix 
-  DenseMatrix oldutonewu;
-  /// transformation matrix: deviation old point to dev. freezone
-  DenseMatrix * oldutofreezone;
-  /** transformation matrix: deviation old point to dev. freezone, 
-    quality class to infinity */
-  DenseMatrix * oldutofreezonelimit;
-
-  // can be deleted:
-  // BaseMatrix *outf, *outfl;
-
-  /**
-    a point is outside of convex part of freezone, 
-    iff mat * (point, 1) >= 0 for each component (correct ?)
-    */
-  ARRAY<DenseMatrix*> freefaceinequ;
-  /// 
-  ARRAY<fourint> orientations;
-  /**
-    flags specified in rule-description file:
-    t .. test rule
-    */
-  ARRAY<char> flags;
-
-  /**
-    topological distance of face to base element
-    non-connected: > 100  (??) 
-    */
-  ARRAY<int> fnearness;
-  ARRAY<int> pnearness;
-  int maxpnearness;
-
-  /// number of old points in rule
-  int noldp;
-  /// number of new poitns in rule
-  int noldf;
-  /// box containing free-zone
-public:  
-  // double fzminx, fzmaxx, fzminy, fzmaxy, fzminz, fzmaxz;
-  Box3d fzbox;
-
-public:
-  
-  ///
-  vnetrule ();
-  ///
-  ~vnetrule ();
-  ///
-  int GetNP () const { return points.Size(); }
-  ///
-  int GetNF () const { return faces.Size(); }
-  ///
-  int GetNE () const { return elements.Size(); }
-  ///
-  int GetNO () const { return orientations.Size(); }
-  ///
-  int GetNEd () const { return edges.Size(); }
-  ///
-  int GetNOldP () const { return noldp; }
-  ///
-  int GetNOldF () const { return noldf; }
-  ///
-  int GetNDelF () const { return delfaces.Size(); }
-  ///
-  int GetQuality () const { return quality; }
-  ///
-  int GetFNearness (int fi) const { return fnearness.Get(fi); }
-  ///
-  int GetPNearness (int pi) const { return pnearness.Get(pi); }
-  ///
-  int GetMaxPNearness () const { return maxpnearness; }
-
-
-  ///
-  const Point3d & GetPoint (int i) const { return points.Get(i); }
-  ///
-  const Element2d & GetFace (int i) const { return faces.Get(i); }
-  ///
-  const Element & GetElement (int i) const { return elements.Get(i); }
-  ///
-  const twoint & GetEdge (int i) const { return edges.Get(i); }
-  ///
-  int GetDelFace (int i) const { return delfaces.Get(i); }
-  ///
-  int IsDelFace (int fn) const;
-  
-  ///
-  float CalcPointDist (int pi, const Point3d & p) const;
-  ///
-  double PointDistFactor (int pi) const
-    {
-      return tolerances.Get(pi);
-    }
-  ///
-  void SetFreeZoneTransformation (const Vector & allp,
-				  int tolclass);
-  ///
-  int IsInFreeZone (const Point3d & p) const;
-  /**
-    0 not in free-zone
-    1 in free-zone
-    -1 maybe 
-   */
-  int IsTriangleInFreeZone (const Point3d & p1, const Point3d & p2,
-                            const Point3d & p3, const ARRAY<int> & pi, int newone);
-  ///
-  int IsQuadInFreeZone (const Point3d & p1, const Point3d & p2,
-			const Point3d & p3, const Point3d & p4,
-			const ARRAY<int> & pi, int newone);
-  ///
-  int IsTriangleInFreeSet (const Point3d & p1, const Point3d & p2,
-                           const Point3d & p3, int fs, const ARRAY<int> & pi, int newone);
-
-  ///
-  int IsQuadInFreeSet (const Point3d & p1, const Point3d & p2,
-		       const Point3d & p3, const Point3d & p4,
-		       int fs, const ARRAY<int> & pi, int newone);
-  
-  ///
-  int ConvexFreeZone () const;
-  
-  /// if t1 and t2 are neighbourtriangles, NTP returns the opposite Point of t1 in t2
-  int NeighbourTrianglePoint (const threeint & t1, const threeint & t2) const;
-  ///
-  const Point3d & GetTransFreeZone (int i) { return transfreezone.Get(i); }
-
-  ///
-  int GetNP (int fn) const
-  { return faces.Get(fn).GetNP(); }
-  ///
-  int GetPointNr (int fn, int endp) const
-  { return faces.Get(fn).PNum(endp); }
-  ///
-  int GetPointNrMod (int fn, int endp) const
-  { return faces.Get(fn).PNumMod(endp); }
-  ///
-  const fourint & GetOrientation (int i) { return orientations.Get(i); }
-
-  ///
-  int TestFlag (char flag) const;
-
-  ///
-  const DenseMatrix & GetOldUToNewU () const { return oldutonewu; }
-  //
-  //  const DenseMatrix & GetOldUToFreeZone () const { return oldutofreezone; }
-  //
-  //  const DenseMatrix & GetOldUToFreeZoneLimit () const 
-  //    { return oldutofreezonelimit; }
-  ///
-  const char * Name () const { return name; }
-  ///
-  void LoadRule (istream & ist);
-
-  ///
-  const ARRAY<Point3d> & GetTransFreeZone () { return transfreezone; }
-  ///
-  int TestOk () const;
-
-  ///
-  friend void TestRules ();
-  ///
-  //  friend void Plot3DRule (const ROT3D & r, char key);
-};
-
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/meshing/secondorder.cpp b/contrib/Netgen/libsrc/meshing/secondorder.cpp
deleted file mode 100644
index d260eb20d786b49cf62a2f038c7ac3f6d9123ec9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/secondorder.cpp
+++ /dev/null
@@ -1,496 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-
-
-
-  Refinement :: Refinement ()
-  {
-    ;
-  }
-
-  Refinement :: ~Refinement ()
-  {
-    ;
-  }
-  
-  void Refinement :: MakeSecondOrder (Mesh & mesh)
-  {
-    int nseg, nse, ne;
-
-    mesh.ComputeNVertices();
-    mesh.SetNP(mesh.GetNV());
-  
-    INDEX_2_HASHTABLE<int> between(mesh.GetNP() + 5);
-
-
-    bool thinlayers = 0;
-    for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-      if (mesh[ei].GetType() == PRISM ||
-	  mesh[ei].GetType() == PRISM12)
-	thinlayers = 1;
-    
-
-    nseg = mesh.GetNSeg();
-    for (SegmentIndex si = 0; si < nseg; si++)
-      {
-	Segment & el = mesh.LineSegment(si);
-
-	INDEX_2 i2 = INDEX_2::Sort (el.p1, el.p2);
-
-	if (between.Used(i2))
-	  el.pmid = between.Get(i2);
-	else
-	  {
-	    Point3d pb;
-	    EdgePointGeomInfo ngi;
-	    PointBetween (mesh.Point (el.p1),
-			  mesh.Point (el.p2), 0.5,
-			  el.surfnr1, el.surfnr2,
-			  el.epgeominfo[0], el.epgeominfo[1],
-			  pb, ngi);
-	  
-	    el.pmid = mesh.AddPoint (pb);
-	    between.Set (i2, el.pmid);
-	  }
-      }
-
-    // refine surface elements
-    nse = mesh.GetNSE();
-    for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-      {
-	int j;
-	const Element2d & el = mesh.SurfaceElement(sei);
-
-	int onp;
-      
-	Element2d newel;
-	newel.SetIndex (el.GetIndex());
-
-	static int betw_trig[3][3] =
-	  { { 1, 2, 3 },
-	    { 0, 2, 4 },
-	    { 0, 1, 5 } };
-	static int betw_quad6[2][3] =
-	  { { 0, 1, 4 },
-	    { 3, 2, 5 } };
-	static int betw_quad8[4][3] =
-	  { { 0, 1, 4 },
-	    { 3, 2, 5 },
-	    { 0, 3, 6 },
-	    { 1, 2, 7 } };
-	int (*betw)[3];
-      
-	switch (el.GetType())
-	  {
-	  case TRIG:
-	  case TRIG6:
-	    {
-	      betw = betw_trig;
-	      newel.SetType (TRIG6);
-	      onp = 3;
-	      break;
-	    }
-	  case QUAD:
-	  case QUAD6: 
-	  case QUAD8:
-	    {
-	      if (thinlayers)
-		{
-		  betw = betw_quad6;
-		  newel.SetType (QUAD6);
-		}
-	      else
-		{
-		  betw = betw_quad8;
-		  newel.SetType (QUAD8);
-		}
-	      onp = 4;
-	      break;
-	    }
-	  default:
-	    PrintSysError ("Unhandled element in secondorder:", int(el.GetType()));
-	  }
-
-	for (j = 0; j < onp; j++)
-	  newel[j] = el[j];
-      
-	int nnp = newel.GetNP();
-	for (j = 0; j < nnp-onp; j++)
-	  {
-	    int pi1 = newel[betw[j][0]];
-	    int pi2 = newel[betw[j][1]];
-	  
-	    INDEX_2 i2 = INDEX_2::Sort (pi1, pi2);
-	  
-	    if (between.Used(i2))
-	      newel[onp+j] = between.Get(i2);
-	    else
-	      {
-		Point3d pb;
-		PointGeomInfo newgi;
-		PointBetween (mesh.Point (pi1),
-			      mesh.Point (pi2), 0.5, 
-			      mesh.GetFaceDescriptor(el.GetIndex ()).SurfNr(),
-			      el.GeomInfoPi (betw[j][0]+1),
-			      el.GeomInfoPi (betw[j][1]+1),
-			      pb, newgi);
-
-		newel[onp+j] = mesh.AddPoint (pb);
-		between.Set (i2, newel[onp+j]);
-	      }
-	  }
-      
-	mesh.SurfaceElement(sei) = newel;
-      }
-
- 
-    //    int i, j;
-
-
-
-    // refine volume elements
-    ne = mesh.GetNE();
-    for (int i = 1; i <= ne; i++)
-      {
-	int j;
-	const Element & el = mesh.VolumeElement(i);
-	int onp;
-
-	Element newel;
-	newel.SetIndex (el.GetIndex());
-
-	static int betw_tet[6][3] =
-	  { { 1, 2, 5 },
-	    { 1, 3, 6 },
-	    { 1, 4, 7 },
-	    { 2, 3, 8 },
-	    { 2, 4, 9 },
-	    { 3, 4, 10 } };
-	static int betw_prism[6][3] =
-	  {
-	    { 1, 3, 7 },
-	    { 1, 2, 8 },
-	    { 2, 3, 9 },
-	    { 4, 6, 10 },
-	    { 4, 5, 11 },
-	    { 5, 6, 12 },
-	  };
-	int (*betw)[3];
-
-	switch (el.GetType())
-	  {
-	  case TET:
-	  case TET10:
-	    {
-	      betw = betw_tet;
-	      newel.SetType (TET10);
-	      onp = 4;
-	      break;
-	    }
-	  case PRISM:
-	  case PRISM12:
-	    {
-	      betw = betw_prism;
-	      newel.SetType (PRISM12);
-	      onp = 6;
-	      break;
-	    }
-	  default:
-	    PrintSysError ("MakeSecondOrder, illegal vol type ", el.GetType());
-	  }
-
-
-	for (int j = 1; j <= onp; j++)
-	  newel.PNum(j) = el.PNum(j);
-	int nnp = newel.GetNP();
-
-	for (int j = 0; j < nnp-onp; j++)
-	  {
-	    INDEX_2 i2(newel.PNum(betw[j][0]),
-		       newel.PNum(betw[j][1]));
-	    i2.Sort();
-	  
-	    if (between.Used(i2))
-	      newel.PNum(onp+1+j) = between.Get(i2);
-	    else
-	      {
-		newel.PNum(onp+1+j) = mesh.AddPoint
-		  (Center (mesh.Point(i2.I1()),
-			   mesh.Point(i2.I2())));
-		between.Set (i2, newel.PNum(onp+1+j));
-	      }
-	  }
-
-	mesh.VolumeElement (i) = newel;
-      }
-
-
-    // makes problems after linear mesh refinement, since
-    // 2nd order identifications are not removed
-    // update identification tables
-    for (int i = 1; i <= mesh.GetIdentifications().GetMaxNr(); i++)
-      {
-	ARRAY<int,PointIndex::BASE> identmap;
-	mesh.GetIdentifications().GetMap (i, identmap);
-
-	for (INDEX_2_HASHTABLE<int>::Iterator it = between.Begin();
-	     it != between.End(); it++)
-	  {
-	      INDEX_2 i2;
-	      int newpi;
-	      between.GetData (it, i2, newpi);
-	      INDEX_2 oi2(identmap.Get(i2.I1()),
-			  identmap.Get(i2.I2()));
-	      oi2.Sort();
-	      if (between.Used (oi2))
-		{
-		  int onewpi = between.Get(oi2);
-		  mesh.GetIdentifications().Add (newpi, onewpi, i);
-		}
-	  }
-
-	/*
-	for (int j = 1; j <= between.GetNBags(); j++)
-	  for (int k = 1; k <= between.GetBagSize(j); k++)
-	    {
-	      INDEX_2 i2;
-	      int newpi;
-	      between.GetData (j, k, i2, newpi);
-	      INDEX_2 oi2(identmap.Get(i2.I1()),
-			  identmap.Get(i2.I2()));
-	      oi2.Sort();
-	      if (between.Used (oi2))
-		{
-		  int onewpi = between.Get(oi2);
-		  mesh.GetIdentifications().Add (newpi, onewpi, i);
-		}
-	    }
-	*/
-      }
-
-
-    //  mesh.mglevels++;
-    int oldsize = mesh.mlbetweennodes.Size();
-    mesh.mlbetweennodes.SetSize(mesh.GetNP());
-    for (int i = oldsize; i < mesh.GetNP(); i++)
-      mesh.mlbetweennodes[i] = INDEX_2(0,0);
-
-    /*
-    for (i = 1; i <= between.GetNBags(); i++)
-      for (j = 1; j <= between.GetBagSize(i); j++)
-	{
-	  INDEX_2 oldp;
-	  int newp;
-	  between.GetData (i, j, oldp, newp);
-	  mesh.mlbetweennodes.Elem(newp) = oldp;
-	}
-    */
-
-    for (INDEX_2_HASHTABLE<int>::Iterator it = between.Begin();
-	 it != between.End(); it++)
-      {
-	mesh.mlbetweennodes[between.GetData (it)] = between.GetHash(it);
-      }
-
-    mesh.ComputeNVertices();
-  
-    //  ValidateSecondOrder (mesh);
-  }
-
-
-  void Refinement :: ValidateSecondOrder (Mesh & mesh)
-  {
-    PrintMessage (3, "Validate mesh");
-    int np = mesh.GetNP();
-    int ne = mesh.GetNE();
-    // int i, j;
-    ARRAY<INDEX_2> parents(np);
-  
-    for (int i = 1; i <= np; i++)
-      parents.Elem(i) = INDEX_2(0,0);
-
-    for (int i = 1; i <= ne; i++)
-      {
-	const Element & el = mesh.VolumeElement(i);
-	if (el.GetType() == TET10)
-	  {
-	    static int betweentab[6][3] =
-	      { { 1, 2, 5 },
-		{ 1, 3, 6 },
-		{ 1, 4, 7 },
-		{ 2, 3, 8 },
-		{ 2, 4, 9 },
-		{ 3, 4, 10 } };
-	    for (int j = 0; j < 6; j++)
-	      {
-		int f1 = el.PNum (betweentab[j][0]);
-		int f2 = el.PNum (betweentab[j][1]);
-		int son = el.PNum (betweentab[j][2]);
-		parents.Elem(son).I1() = f1;
-		parents.Elem(son).I2() = f2;
-	      }
-	  }
-      }
-
-    ValidateRefinedMesh (mesh, parents);
-  }
-
-
-  void Refinement ::
-  ValidateRefinedMesh (Mesh & mesh, 
-		       ARRAY<INDEX_2> & parents)
-  {
-    // int i, j, k;
-  
-    // homotopy method
-
-    int ne = mesh.GetNE();
-
-    int cnttrials = 100;
-    int wrongels = 0;
-    for (int i = 1; i <= ne; i++)
-      if (mesh.VolumeElement(i).CalcJacobianBadness (mesh.Points()) > 1e10)
-	{
-	  wrongels++;
-	  mesh.VolumeElement(i).flags.badel = 1;
-	}
-      else
-	mesh.VolumeElement(i).flags.badel = 0;
-
-    double facok = 0;
-    double factry;
-
-    BitArray illegalels(ne);
-    illegalels.Clear();
-
-      
-    if (wrongels)
-      {
-	cout << "WARNING: " << wrongels << " illegal element(s) found" << endl;
-
-	int np = mesh.GetNP();
-	ARRAY<Point3d> should(np);
-	ARRAY<Point3d> can(np);
-
-	for (int i = 1; i <= np; i++)
-	  {
-	    should.Elem(i) = can.Elem(i) = mesh.Point(i);
-	  }
-
-	for (int i = 1; i <= parents.Size(); i++)
-	  {
-	    if (parents.Get(i).I1())
-	      can.Elem(i) = Center (can.Elem(parents.Get(i).I1()),
-				    can.Elem(parents.Get(i).I2()));
-	  }
-
-	BitArray boundp(np);
-	boundp.Clear();
-	for (int i = 1; i <= mesh.GetNSE(); i++)
-	  {
-	    const Element2d & sel = mesh.SurfaceElement(i);
-	    for (int j = 1; j <= sel.GetNP(); j++)
-	      boundp.Set(sel.PNum(j));
-	  }
-
-
-	(*testout) << "bpoints:" << endl;
-	for (int i = 1; i <= np; i++)
-	  if (boundp.Test(i))
-	    (*testout) << i << endl;
-
-	double lam = 0.5;
-
-	while (facok < 1-1e-8 && cnttrials > 0)
-	  {
-	    lam *= 4;
-	    if (lam > 2) lam = 2;
-
-	    do
-	      {
-		//	      cout << "trials: " << cnttrials << endl;
-		lam *= 0.5;
-		cnttrials--;
-
-		cout << "lam = " << lam << endl;
-
-		factry = lam + (1-lam) * facok;
-		cout << "trying: " << factry << endl;
-
-		for (int i = 1; i <= np; i++)
-		  if (boundp.Test(i))
-		    {
-		      for (int j = 1; j <= 3; j++)
-			mesh.Point(i).X(j) = 
-			  lam * should.Get(i).X(j) +
-			  (1-lam) * can.Get(i).X(j);
-		    }
-		  else
-		    mesh.Point(i) = can.Get(i);
-	      
-		//	      (*testout) << "bad els: " << endl;
-		wrongels = 0;
-		for (int i = 1; i <= ne; i++)
-		  {
-		    if (!illegalels.Test(i) && 
-			mesh.VolumeElement(i).
-			CalcJacobianBadness(mesh.Points()) > 1e10)
-		      {
-			wrongels++;
-			Element & el = mesh.VolumeElement(i);
-			el.flags.badel = 1;
-		     
-		      
-			if (lam < 1e-4)
-			  illegalels.Set(i);
- 
-
-			/*
-			  (*testout) << i << ": ";
-			  for (j = 1; j <= el.GetNP(); j++)
-			  (*testout) << el.PNum(j) << " ";
-			  (*testout) << endl;
-			*/
-		      }
-		    else
-		      mesh.VolumeElement(i).flags.badel = 0;
-		  }
-		cout << "wrongels = " << wrongels << endl;
-	      }
-	    while (wrongels && cnttrials > 0);
-
-	    mesh.CalcSurfacesOfNode();
-	    mesh.ImproveMeshJacobian (OPT_WORSTCASE);	      
-	  
-	    facok = factry;
-	    for (int i = 1; i <= np; i++)
-	      can.Elem(i) = mesh.Point(i);
-	  }
-      }
-
-
-      
-    for (int i = 1; i <= ne; i++)
-      {
-	if (illegalels.Test(i))
-	  {
-	    cout << "illegal element: " << i << endl;
-	    mesh.VolumeElement(i).flags.badel = 1;	
-	  }
-	else
-	  mesh.VolumeElement(i).flags.badel = 0;	
-      }
-  
-    /*
-      if (cnttrials <= 0)
-      {
-      cerr << "ERROR: Sorry, illegal elements:" << endl;
-      }
-    */
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/smoothing2.cpp b/contrib/Netgen/libsrc/meshing/smoothing2.cpp
deleted file mode 100644
index d26b20ad5d1c6fc764a6de512fa8824586f19037..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/smoothing2.cpp
+++ /dev/null
@@ -1,922 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#include <opti.hpp>
-
-namespace netgen
-{
-
-  static const MeshOptimize2d * meshthis;
-
-
-#ifdef OLD
-
-  void CalcTriangleBadness (double x2, double x3, double y3, double metricweight,
-				   double h, double & badness, double & g1x, double & g1y)
-  {
-    // badness = sqrt(3.0) /36 * circumference^2 / area - 1 
-    // p1 = (0, 0), p2 = (x2, 0), p3 = (x3, y3);
-
-    Vec2d v23;
-    double l12, l13, l23, cir, area;
-    static const double c = sqrt(3.0) / 36;
-    double c1, c2, c3, c4;
-
-    v23.X() = x3 - x2;
-    v23.Y() = y3;
-
-    l12 = x2;
-    l13 = sqrt (x3*x3 + y3*y3);
-    l23 = v23.Length();
-
-    cir = l12 + l13 + l23;
-    area = 0.5 * x2 * y3;
-
-    if (area <= 1e-24 * cir * cir)
-      {
-	g1x = 0;
-	g1y = 0;
-	badness = 1e10;
-	return;
-      }
-
-    badness = c * cir * cir / area - 1;
-
-    c1 = 2 * c * cir / area;
-    c2 = 0.5 * c * cir * cir / (area * area);
-
-    g1x = c1 * ( - 1 - x3 / l13) - c2 * (-v23.Y());
-    g1y = c1 * (     - y3 / l13) - c2 * ( v23.X());
-  
-    //  metricweight = 0.1;
-    if (metricweight > 0)
-      {
-	// area = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
-	// add:  metricweight * (area / h^2 + h^2 / area - 2)
-      
-	const double area = x2 * y3;
-	const double dareax1 = -y3; 
-	const double dareay1 = x3 - x2; 
-
-	const double areahh = area / (h * h);
-	const double fac = metricweight * (areahh - 1 / areahh) / area;
-
-	badness += metricweight * (areahh + 1 / areahh - 2);
-	g1x += fac * dareax1;
-	g1y += fac * dareay1; 
-      
-	/*
-	// add: metricweight * (l1^2/h^2 + l2^2/h^2 + l3^2/h2 + h^2/l1^2 + h^2/l2^2 + h^2/l3^2 - 6)
-	double h2 = h*h;
-	double l1 = x2*x2;
-	double l2 = x3*x3+y3*y3;
-	double l3 = (x2-x3)*(x2-x3)+y3*y3;
-	double dl1dx = 2*(-x2);
-	double dl1dy = 0;
-	double dl2dx = -2*x3;
-	double dl2dy = -2*y3;
-
-	badness += (l1/h2 + l2/h2 + l3/h2 +h2/l1 + h2/l2 + h2/l3-6) * metricweight;
-
-	g1x += metricweight * (dl1dx/h2-h2/(l1*l1)*dl1dx + dl2dx/h2-h2/(l2*l2)*dl2dx);
-	g1y += metricweight * (dl1dy/h2-h2/(l1*l1)*dl1dy + dl2dy/h2-h2/(l2*l2)*dl2dy);
-	*/
-      }
-  }
-
-#endif
-
-
-  /*
-  static const double c_trig = sqrt(3.0) / 12;
-  static const double c_trig4 = sqrt(3.0) / 3;
-  */
-  static const double c_trig = 0.14433756;
-  static const double c_trig4 = 0.57735026;
-
-  inline double CalcTriangleBadness (double x2, double x3, double y3, 
-				     double metricweight, double h)
-  {
-    // badness = sqrt(3.0) / 12 * (\sum l_i^2) / area - 1 
-    // p1 = (0, 0), p2 = (x2, 0), p3 = (x3, y3);
-
-    double cir_2 = (x2*x2 + x3*x3 + y3*y3 - x2*x3);
-    double area = x2 * y3;
-    
-    if (area <= 1e-24 * cir_2)
-      return 1e10;
-    
-    double badness = c_trig4 * cir_2 / area - 1;
-    
-    if (metricweight > 0)
-      {
-	// add:  metricweight * (area / h^2 + h^2 / area - 2)
-
-	double areahh = area / (h * h);
-	badness += metricweight * (areahh + 1 / areahh - 2);
-      }
-    return badness;
-  }
-
-
-  
-  inline void CalcTriangleBadness (double x2, double x3, double y3, double metricweight,
-				   double h, double & badness, double & g1x, double & g1y)
-  {
-    // old: badness = sqrt(3.0) /36 * circumference^2 / area - 1 
-    // badness = sqrt(3.0) / 12 * (\sum l_i^2) / area - 1 
-    // p1 = (0, 0), p2 = (x2, 0), p3 = (x3, y3);
-
-
-    double cir_2 = 2* (x2*x2 + x3*x3 + y3*y3 - x2*x3);
-    double area = 0.5 * x2 * y3;
-
-    if (area <= 1e-24 * cir_2)
-      {
-	g1x = 0;
-	g1y = 0;
-	badness = 1e10;
-	return;
-      }
-
-    badness = c_trig * cir_2 / area - 1;
-
-    double c1 = -2 * c_trig / area;
-    double c2 = 0.5 * c_trig * cir_2 / (area * area);
-    g1x = c1 * (x2 + x3) + c2 * y3;
-    g1y = c1 * (y3)      + c2 * (x2-x3); 
-
-    if (metricweight > 0)
-      {
-	// area = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
-	// add:  metricweight * (area / h^2 + h^2 / area - 2)
-      
-	double area = x2 * y3;
-	double dareax1 = -y3; 
-	double dareay1 = x3 - x2; 
-
-	double areahh = area / (h * h);
-	double fac = metricweight * (areahh - 1 / areahh) / area;
-
-	badness += metricweight * (areahh + 1 / areahh - 2);
-	g1x += fac * dareax1;
-	g1y += fac * dareay1; 
-      }
-  }
-
-
-
-
-
-
-
-
-
-#ifdef OLD
-  double CalcTriangleBadness (const Point3d & p1, 
-			      const Point3d & p2, 
-			      const Point3d & p3,
-			      double metricweight,
-			      double h)
-  {
-    double badness;
-    double g1x, g1y;
-  
-    Vec3d e1 (p1, p2);
-    Vec3d e2 (p1, p3);
-  
-    double e1l = e1.Length() + 1e-24;
-    e1 /= e1l;
-    double e1e2 = (e1 * e2);
-    e2.Add (-e1e2, e1);
-    double e2l = e2.Length();
-  
-    CalcTriangleBadness ( e1l, e1e2, e2l,
-			  metricweight, h, badness, g1x, g1y);
-    return badness;
-  }
-#endif
-
-
-
-
-  double CalcTriangleBadness (const Point3d & p1, 
-			      const Point3d & p2, 
-			      const Point3d & p3,
-			      double metricweight,
-			      double h)
-  {
-    // badness = sqrt(3.0) / 12 * (\sum l_i^2) / area - 1 
-    // p1 = (0, 0), p2 = (x2, 0), p3 = (x3, y3);
-
-    Vec3d e12(p1,p2);
-    Vec3d e13(p1,p3);
-    Vec3d e23(p2,p3);
-  
-    double l12_2 = e12.Length2();
-    double l13_2 = e13.Length2();
-    double l23_2 = e23.Length2();
-
-    double cir_2 = l12_2 + l13_2 + l23_2;
-    Vec3d area_v = Cross (e12, e13);
-    double area = 0.5 * area_v.Length();
-
-    if (area <= 1e-24 * cir_2)
-      return 1e10;
-
-    double badness = c_trig * cir_2 / area - 1;
-
-    if (metricweight > 0)
-      {
-	// area = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
-	// add:  metricweight * (area / h^2 + h^2 / area - 2)
-
-	const double areahh = area / (h * h);
-	badness += metricweight * (areahh + 1 / areahh - 2);
-      }
-
-    return badness;
-  }
-
-
-  double CalcTriangleBadness (const Point3d & p1, 
-			      const Point3d & p2, 
-			      const Point3d & p3,
-			      const Vec3d & n,
-			      double metricweight,
-			      double h)
-  {
-    Vec3d v1 (p1, p2);
-    Vec3d v2 (p1, p3);
-
-    Vec3d e1 = v1;
-    Vec3d e2 = v2;
-
-    e1 -= (e1 * n) * n;
-    e1 /= (e1.Length() + 1e-24);
-    e2 = Cross (n, e1);
-
-    return CalcTriangleBadness ( (e1 * v1), (e1 * v2), (e2 * v2), 
-				 metricweight, h);
-  }
-
-
-
-
-
-  static MeshPoint sp1; 
-  static PointGeomInfo gi1;
-  static Vec3d n, t1, t2;
-  static ARRAY<SurfaceElementIndex> locelements(0);
-  static ARRAY<int> locrots(0);
-  static ARRAY<double> lochs(0);
-  // static int locerr2;
-  static double locmetricweight = 0;
-  static double loch;
-  static int surfi, surfi2;
-  static int uselocalh;
-
-
-  class Opti2SurfaceMinFunction : public MinFunction
-  {
-    const Mesh & mesh;
-  public:
-    Opti2SurfaceMinFunction (const Mesh & amesh)
-      : mesh(amesh)
-    { } ;
-    virtual double FuncGrad (const Vector & x, Vector & g) const;
-    virtual double Func (const Vector & x) const;
-  };
-  
-  double Opti2SurfaceMinFunction :: 
-  Func (const Vector & x) const
-  {
-    Vector g(x.Size());
-    return FuncGrad (x, g);
-  }
-
-
-  double Opti2SurfaceMinFunction :: 
-  FuncGrad (const Vector & x, Vector & grad) const
-  {
-    Vec3d n, vgrad;
-    Point3d pp1;
-    double g1x, g1y;
-    double badness, hbadness;
-
-    vgrad = 0;
-    badness = 0;
-
-    meshthis -> GetNormalVector (surfi, sp1, gi1, n);
-
-    pp1 = sp1;
-    pp1.Add2 (x.Get(1), t1, x.Get(2), t2);
-
-    //  meshthis -> ProjectPoint (surfi, pp1);
-    // meshthis -> GetNormalVector (surfi, pp1, n);
-
-    for (int j = 0; j < locelements.Size(); j++)
-      {
-	int roti = locrots[j];
-	const Element2d & bel = mesh[locelements[j]];
-
-	Vec3d e1(pp1, mesh[bel.PNumMod(roti + 1)]);
-	Vec3d e2(pp1, mesh[bel.PNumMod(roti + 2)]);
-
-	if (uselocalh) loch = lochs[j];
-
-	double e1l = e1.Length();
-	if (Determinant(e1, e2, n) > 1e-8 * e1l * e2.Length())
-	  {
-	    e1 /= e1l;
-	    double e1e2 = e1 * e2;
-	    e2.Add (-e1e2, e1);
-	    double e2l = e2.Length();
-
-	    CalcTriangleBadness ( e1l, e1e2, e2l, locmetricweight, loch,
-				  hbadness, g1x, g1y);
-
-	    badness += hbadness;
-	    vgrad.Add2 (g1x, e1, g1y / e2l, e2);
-	  }
-	else
-	  badness += 1e8;
-      }
-
-    vgrad.Add (-(vgrad * n), n);
-
-    grad.Elem(1) = vgrad * t1;
-    grad.Elem(2) = vgrad * t2;
-    return badness;
-  }
-
-
-  class Opti2EdgeMinFunction : public MinFunction
-  {
-    const Mesh & mesh;
-  public:
-    Opti2EdgeMinFunction (const Mesh & amesh)
-      : mesh(amesh) { } ;
-
-    virtual double FuncGrad (const Vector & x, Vector & g) const;
-    virtual double Func (const Vector & x) const;
-  };
-
-  double Opti2EdgeMinFunction :: Func (const Vector & x) const
-  {
-    Vector g(x.Size());
-    return FuncGrad (x, g);
-  }
-
-  double Opti2EdgeMinFunction :: FuncGrad (const Vector & x, Vector & grad) const
-  {
-    int j, rot;
-    Vec3d n1, n2, v1, v2, e1, e2, vgrad;
-    Point3d pp1;
-    Vec2d g1;
-    double badness, hbadness;
-
-    vgrad.X() = 0;
-    vgrad.Y() = 0;
-    vgrad.Z() = 0;
-    badness = 0;
-
-    pp1 = sp1 + x.Get(1) * t1;
-    meshthis -> ProjectPoint2 (surfi, surfi2, pp1);
-
-    for (j = 0; j < locelements.Size(); j++)
-      {
-	rot = locrots[j];
-	const Element2d & bel = mesh[locelements[j]];
-
-	v1 = mesh[bel.PNumMod(rot + 1)] - pp1;
-	v2 = mesh[bel.PNumMod(rot + 2)] - pp1;
-
-	e1 = v1;
-	e2 = v2;
-	e1 /= e1.Length();
-	e2 -= (e1 * e2) * e1;
-	e2 /= e2.Length();
-
-	if (uselocalh) loch = lochs[j];
-	CalcTriangleBadness ( (e1 * v1), (e1 * v2), (e2 * v2), locmetricweight, loch,
-			      hbadness, g1.X(), g1.Y());
-
-	badness += hbadness;
-
-	vgrad.X() += g1.X() * e1.X() + g1.Y() * e2.X();
-	vgrad.Y() += g1.X() * e1.Y() + g1.Y() * e2.Y();
-	vgrad.Z() += g1.X() * e1.Z() + g1.Y() * e2.Z();
-      }
-
-    meshthis -> GetNormalVector (surfi, pp1, n1);
-    meshthis -> GetNormalVector (surfi2, pp1, n2);
-
-    v1 = Cross (n1, n2);
-    v1 /= v1.Length();
-
-    grad.Elem(1) = (vgrad * v1) * (t1 * v1);
-
-    return badness;
-  }
-
-
-
-
-  class Opti2SurfaceMinFunctionJacobian : public MinFunction
-  {
-    const Mesh & mesh;
-  public:
-    Opti2SurfaceMinFunctionJacobian (const Mesh & amesh)
-      : mesh(amesh)
-    { } ;
-    virtual double FuncGrad (const Vector & x, Vector & g) const;
-    virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;
-    virtual double Func (const Vector & x) const;
-  };
-  
-  double Opti2SurfaceMinFunctionJacobian :: 
-  Func (const Vector & x) const
-  {
-    Vector g(x.Size());
-    return FuncGrad (x, g);
-  }
-
-
-  double Opti2SurfaceMinFunctionJacobian :: 
-  FuncGrad (const Vector & x, Vector & grad) const
-  {
-    // from 2d:
-
-    int j, k, lpi, gpi;
-    Vec3d n, vgrad;
-    Point3d pp1;
-    Vec2d g1, vdir;
-    double badness, hbadness, hbad, hderiv;
-
-    vgrad = 0;
-    badness = 0;
-
-    meshthis -> GetNormalVector (surfi, sp1, gi1, n);
-
-    pp1 = sp1;
-    pp1.Add2 (x.Get(1), t1, x.Get(2), t2);
-
-    //  meshthis -> ProjectPoint (surfi, pp1);
-    //  meshthis -> GetNormalVector (surfi, pp1, n);
-
-    static ARRAY<Point2d> pts2d;
-    pts2d.SetSize(mesh.GetNP());
-
-    grad = 0;
-
-    for (j = 1; j <= locelements.Size(); j++)
-      {
-	lpi = locrots.Get(j);
-	const Element2d & bel = 
-	  mesh[locelements.Get(j)];
-      
-	gpi = bel.PNum(lpi);
-
-	for (k = 1; k <= bel.GetNP(); k++)
-	  {
-	    PointIndex pi = bel.PNum(k);
-	    pts2d.Elem(pi) = Point2d (t1 * (mesh.Point(pi) - sp1), 
-				      t2 * (mesh.Point(pi) - sp1)); 
-	  }				    
-	pts2d.Elem(gpi) = Point2d (x.Get(1), x.Get(2));
-      
-
-	for (k = 1; k <= 2; k++)
-	  {
-	    if (k == 1)
-	      vdir = Vec2d (1, 0);
-	    else
-	      vdir = Vec2d (0, 1);
-	  
-	    hbad = bel.
-	      CalcJacobianBadnessDirDeriv (pts2d, lpi, vdir, hderiv);
-
-	    grad.Elem(k) += hderiv;
-	    if (k == 1)
-	      badness += hbad;
-	  }
-      }
-
-
-    /*
-      vgrad.Add (-(vgrad * n), n);
-
-      grad.Elem(1) = vgrad * t1;
-      grad.Elem(2) = vgrad * t2;
-    */
-    return badness;
-  }
-
-
-
-
-  double Opti2SurfaceMinFunctionJacobian :: 
-  FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
-  {
-    // from 2d:
-
-    int j, k, lpi, gpi;
-    Vec3d n, vgrad;
-    Point3d pp1;
-    Vec2d g1, vdir;
-    double badness, hbadness, hbad, hderiv;
-
-    vgrad = 0;
-    badness = 0;
-
-    meshthis -> GetNormalVector (surfi, sp1, gi1, n);
-
-    pp1 = sp1;
-    pp1.Add2 (x.Get(1), t1, x.Get(2), t2);
-
-    static ARRAY<Point2d> pts2d;
-    pts2d.SetSize(mesh.GetNP());
-
-    deriv = 0;
-
-    for (j = 1; j <= locelements.Size(); j++)
-      {
-	lpi = locrots.Get(j);
-	const Element2d & bel = 
-	  mesh[locelements.Get(j)];
-      
-	gpi = bel.PNum(lpi);
-
-	for (k = 1; k <= bel.GetNP(); k++)
-	  {
-	    PointIndex pi = bel.PNum(k);
-	    pts2d.Elem(pi) = Point2d (t1 * (mesh.Point(pi) - sp1), 
-				      t2 * (mesh.Point(pi) - sp1)); 
-	  }				    
-	pts2d.Elem(gpi) = Point2d (x.Get(1), x.Get(2));
-      
-
-	vdir = Vec2d (dir(0), dir(1));
-	  
-	hbad = bel.
-	  CalcJacobianBadnessDirDeriv (pts2d, lpi, vdir, hderiv);
-      
-	deriv += hderiv;
-	badness += hbad;
-      }
-
-
-    return badness;
-  }
-
-
-
-
-
-
-
-  MeshOptimize2d dummy;
-
-  MeshOptimize2d :: MeshOptimize2d ()
-  {
-    SetFaceIndex (0);
-    SetImproveEdges (0);
-    SetMetricWeight (0);
-    SetWriteStatus (1);
-  }
-
-
-  void MeshOptimize2d :: SelectSurfaceOfPoint (const Point3d & p,
-					       const PointGeomInfo & gi)
-  {
-    ;
-  }
-
-  void MeshOptimize2d :: ImproveMesh (Mesh & mesh)
-  {
-    if (!faceindex)
-      {
-	PrintMessage (3, "Smoothing");
-
-	for (faceindex = 1; faceindex <= mesh.GetNFD(); faceindex++)
-	  {
-	    ImproveMesh (mesh);
-	    if (multithread.terminate)
-	      throw NgException ("Meshing stopped");
-	  }
-	faceindex = 0;
-	return;
-      }
- 
-    CheckMeshApproximation (mesh);
-
-    int i, j, k, surfi3;
-    SurfaceElementIndex sei;
-
-    ARRAY<SurfaceElementIndex> seia;
-    mesh.GetSurfaceElementsOfFace (faceindex, seia);
-
-    bool mixed = 0;
-    for (i = 0; i < seia.Size(); i++)
-      if (mesh[seia[i]].GetNP() != 3)
-	{
-	  mixed = 1;
-	  break;
-	}
-
-
-    int loci;
-    double fact;
-    int moveisok;
-
-    PointGeomInfo ngi;
-    Point3d origp;
-
-    Vec3d n1, n2;
-    Vector x(2), xedge(1);
-
-    ARRAY<MeshPoint, PointIndex::BASE> savepoints(mesh.GetNP());
-    uselocalh = mparam.uselocalh;
-
-    ARRAY<int, PointIndex::BASE> nelementsonpoint(mesh.GetNP());
-    nelementsonpoint = 0;
-
-    for (i = 0; i < seia.Size(); i++)
-      {
-	const Element2d & el = mesh[seia[i]];
-	for (j = 0; j < el.GetNP(); j++)
-	  nelementsonpoint[el[j]]++;
-      }
-
-
-    TABLE<SurfaceElementIndex,PointIndex::BASE> elementsonpoint(nelementsonpoint);
-    for (i = 0; i < seia.Size(); i++)
-      {
-	const Element2d & el = mesh[seia[i]];
-	for (j = 0; j < el.GetNP(); j++)
-	  elementsonpoint.Add (el[j], seia[i]);
-      }
-
-    loch = mparam.maxh;
-    locmetricweight = metricweight;
-    meshthis = this;
-
-    Opti2SurfaceMinFunction surfminf(mesh);
-    Opti2EdgeMinFunction edgeminf(mesh);
-    Opti2SurfaceMinFunctionJacobian surfminfj(mesh);
-
-    OptiParameters par;
-    par.maxit_linsearch = 8;
-    par.maxit_bfgs = 5;
-
-    /*
-      if (improveedges)
-      for (i = 1; i <= mesh.GetNP(); i++)
-      if (mesh.PointType(i) == EDGEPOINT)
-      {
-      continue;
-      PrintDot ();
-      sp1 = mesh.Point(i);
-	  
-      locelements.SetSize(0);
-      locrots.SetSize (0);
-      lochs.SetSize (0);
-      surfi = surfi2 = surfi3 = 0;
-	  
-      for (j = 0; j < elementsonpoint[i].Size(); j++)
-      {
-      sei = elementsonpoint[i][j];
-      const Element2d * bel = &mesh[sei];
-	      
-      if (!surfi)
-      surfi = mesh.GetFaceDescriptor(bel->GetIndex()).SurfNr();
-      else if (surfi != mesh.GetFaceDescriptor(bel->GetIndex()).SurfNr())
-      {
-      if (surfi2 != 0 && surfi2 != 
-      mesh.GetFaceDescriptor(bel->GetIndex()).SurfNr())
-      surfi3 = mesh.GetFaceDescriptor(bel->GetIndex()).SurfNr();
-      else
-      surfi2 = mesh.GetFaceDescriptor(bel->GetIndex()).SurfNr();
-      }
-	      
-      locelements.Append (sei);
-	      
-      if (bel->PNum(1) == i)
-      locrots.Append (1);
-      else if (bel->PNum(2) == i)
-      locrots.Append (2);
-      else
-      locrots.Append (3);
-
-      if (uselocalh)
-      {
-      Point3d pmid = Center (mesh.Point(bel->PNum(1)),
-      mesh.Point(bel->PNum(2)),
-      mesh.Point(bel->PNum(3)));
-      lochs.Append (mesh.GetH(pmid));
-      }
-      }
-	  
-      if (surfi2 && !surfi3)
-      {
-      GetNormalVector (surfi, sp1, n1);
-      GetNormalVector (surfi2, sp1, n2);
-      t1 = Cross (n1, n2);
-	      
-      xedge = 0;
-      BFGS (xedge, edgeminf, par, 1e-6);
-	      
-      mesh.Point(i).X() += xedge.Get(1) * t1.X();
-      mesh.Point(i).Y() += xedge.Get(1) * t1.Y();
-      mesh.Point(i).Z() += xedge.Get(1) * t1.Z();
-      ProjectPoint2 (surfi, surfi2, mesh.Point(i));
-      }
-      }
-    */
-
-
-    bool printeddot = 0;
-    char plotchar = '.';
-    int modplot = 1;
-    if (mesh.GetNP() > 1000)
-      {
-	plotchar = '+';
-	modplot = 10;
-      }
-    if (mesh.GetNP() > 10000)
-      {
-	plotchar = 'o';
-	modplot = 100;
-      }
-    int cnt = 0;
-
-    for (PointIndex pi = PointIndex::BASE; 
-	 pi < mesh.GetNP()+PointIndex::BASE; pi++)
-
-      if (mesh.PointType(pi) == SURFACEPOINT)
-	{
-	  if (multithread.terminate)
-	    throw NgException ("Meshing stopped");
-	
-	  if (pi ==  3679)
-	    (*testout) << " old: " << mesh[pi] << endl;
-
-
-	  cnt++;
-	  if (cnt % modplot == 0 && writestatus)
-	    {
-	      printeddot = 1;
-	      PrintDot (plotchar);
-	    }
-	
-	  if (elementsonpoint[pi].Size() == 0)
-	    continue;
-	
-	  sp1 = mesh[pi];
-
-	  Element2d & hel = mesh[elementsonpoint[pi][0]];
-
-	  int hpi = 0;
-	  for (j = 1; j <= hel.GetNP(); j++)
-	    if (hel.PNum(j) == pi)
-	      {
-		hpi = j;
-		break;
-	      }
-
-	  gi1 = hel.GeomInfoPi(hpi);
-	  SelectSurfaceOfPoint (sp1, gi1);
-	  
-	  locelements.SetSize(0);
-	  locrots.SetSize (0);
-	  lochs.SetSize (0);
-	
-	  for (j = 0; j < elementsonpoint[pi].Size(); j++)
-	    {
-	      sei = elementsonpoint[pi][j];
-	      const Element2d & bel = mesh[sei];
-	      surfi = mesh.GetFaceDescriptor(bel.GetIndex()).SurfNr();
-	    
-	      locelements.Append (sei);
-	    
-	      for (k = 1; k <= bel.GetNP(); k++)
-		if (bel.PNum(k) == pi)
-		  {
-		    locrots.Append (k);
-		    break;
-		  }
-	      
-	      if (uselocalh)
-		{
-		  Point3d pmid = Center (mesh[bel[0]], mesh[bel[1]], mesh[bel[2]]);
-		  lochs.Append (mesh.GetH(pmid));
-		}
-	    }
-
-	  
-	  GetNormalVector (surfi, sp1, gi1, n);
-	  n.GetNormal (t1);
-	  t2 = Cross (n, t1);
-	  
-	  // save points, and project to tangential plane
-	  for (j = 0; j < locelements.Size(); j++)
-	    {
-	      const Element2d & el = mesh[locelements[j]];
-	      for (k = 0; k < el.GetNP(); k++)
-		savepoints[el[k]] = mesh[el[k]];
-	    }
-
-	  for (j = 0; j < locelements.Size(); j++)
-	    {
-	      const Element2d & el = mesh[locelements[j]];
-	      for (k = 0; k < el.GetNP(); k++)
-		{
-		  PointIndex hpi = el[k];
-		  double lam = n * (mesh[hpi] - sp1);
-		  mesh[hpi] -= lam * n;
-		}
-	    }
-	  
-	  x = 0;
-
-	  if (mixed)
-	    BFGS (x, surfminfj, par, 1e-6);
-	  else
-	    BFGS (x, surfminf, par, 1e-6);
-
-	  origp = mesh[pi];
-	  loci = 1;
-	  fact = 1;
-	  moveisok = 0;
-
-	  // restore other points
-	  for (j = 0; j < locelements.Size(); j++)
-	    {
-	      const Element2d & el = mesh[locelements[j]];
-	      for (k = 0; k < el.GetNP(); k++)
-		{
-		  PointIndex hpi = el[k];
-		  if (hpi != pi) mesh[hpi] = savepoints[hpi];
-		}
-	    }
-	  
-	  
-	  //optimizer loop (if not whole distance is not possible, move only a bit!!!!)
-	  while (loci <= 5 && !moveisok)
-	    {
-	      loci ++;
-	      mesh[pi].X() = origp.X() + (x.Get(1) * t1.X() + x.Get(2) * t2.X())*fact;
-	      mesh[pi].Y() = origp.Y() + (x.Get(1) * t1.Y() + x.Get(2) * t2.Y())*fact;
-	      mesh[pi].Z() = origp.Z() + (x.Get(1) * t1.Z() + x.Get(2) * t2.Z())*fact;
-	      fact = fact/2.;
-
-	      if (pi ==  3679)
-		(*testout) << " before proj: " << mesh[pi] << endl;
-
-	      ProjectPoint (surfi, mesh[pi]);
-
-	      if (pi ==  3679)
-		{
-		  (*testout) << " after proj: " << mesh[pi] << endl;
-		  (*testout) << "surfi =" << surfi << endl;
-		}
-	    
-	      moveisok = CalcPointGeomInfo(surfi, ngi, mesh[pi]); 
-	      // point lies on same chart in stlsurface
-	    
-	      if (moveisok)
-		{
-		  for (j = 0; j < locelements.Size(); j++)
-		    mesh[locelements[j]].GeomInfoPi(locrots[j]) = ngi;
-		}
-	      else
-		{
-		  mesh[pi] = origp;
-		}
-	    
-	    }
-
-	  if (pi ==  3679)
-	    (*testout) << " new: " << mesh[pi] << endl;
-	}
-  
-
-    if (printeddot)
-      PrintDot ('\n');
-  
-    CheckMeshApproximation (mesh);
-    mesh.SetNextTimeStamp();
-  }
-
-  void MeshOptimize2d :: GetNormalVector(INDEX /* surfind */, const Point3d & p, Vec3d & nv) const
-  {
-    nv = Vec3d (0, 0, 1);
-  }
-
-  void MeshOptimize2d :: GetNormalVector(INDEX surfind, const Point3d & p, PointGeomInfo & gi, Vec3d & n) const
-  {
-    GetNormalVector (surfind, p, n);
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/smoothing3.cpp b/contrib/Netgen/libsrc/meshing/smoothing3.cpp
deleted file mode 100644
index 61c1910884f2915ccbe46b297b7b296877ac880e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/smoothing3.cpp
+++ /dev/null
@@ -1,1546 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#ifdef SOLIDGEOM
-#include <csg.hpp>
-#endif
-#include <opti.hpp>
-
-
-namespace netgen
-{
-  
-
-  PointFunction1 :: PointFunction1 (Mesh::T_POINTS & apoints, 
-				    const ARRAY<INDEX_3> & afaces,
-				    double ah)
-    : points(apoints), faces(afaces)
-  {
-    h = ah;
-  }
-  
-
-  double PointFunction1 :: Func (const Vector & vp) const
-  {
-    int j;
-    double badness = 0;
-    Point3d pp(vp(0), vp(1), vp(2));
-
-    for (j = 0; j < faces.Size(); j++)
-      {
-	const INDEX_3 & el = faces[j];
-
-	double bad = CalcTetBadness (points[el.I1()], 
-				     points[el.I3()], 
-				     points[el.I2()], 
-				     pp, 0);
-	badness += bad;
-      }
- 
-    return badness;
-  }
-
-
-
-  double PointFunction1 :: 
-  FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
-  {
-    static Vector hx(3);
-    static double eps = 1e-6;
-
-    double dirlen = dir.L2Norm();
-    if (dirlen < 1e-14)
-      {
-	deriv = 0;
-	return Func(x);
-      }
-
-    hx.Set(1, x);
-    hx.Add(eps * h / dirlen, dir);
-    double fr = Func (hx);
-    hx.Set(1, x);
-    hx.Add(-eps * h / dirlen, dir);
-    double fl = Func (hx);
-
-    deriv = (fr - fl) / (2 * eps * h) * dirlen;
-
-    return Func(x);
-  }
-
-
-  double PointFunction1 :: FuncGrad (const Vector & x, Vector & g) const
-  {
-    static Vector hx(3);
-    static double eps = 1e-6;
-
-    hx = x;
-    for (int i = 1; i <= 3; i++)
-      {
-	hx.Elem(i) = x.Get(i) + eps * h;
-	double fr = Func (hx);
-	hx.Elem(i) = x.Get(i) - eps * h;
-	double fl = Func (hx);
-	hx.Elem(i) = x.Get(i);
-
-	g.Elem(i) = (fr - fl) / (2 * eps * h);
-      }
-
-    return Func(x);
-  }
-
-  double PointFunction1 :: GradStopping (const Vector & x) const
-  {
-    double f = Func(x);
-    return 1e-8 * f * f;
-  }
-
-
-
-
-  /* Cheap Functional depending of inner point inside triangular surface */
-
-  class CheapPointFunction1 : public MinFunction
-  {
-    Mesh::T_POINTS & points;
-    const ARRAY<INDEX_3> & faces;
-    DenseMatrix m;
-    double h;
-  public:
-    CheapPointFunction1 (Mesh::T_POINTS & apoints, 
-			 const ARRAY<INDEX_3> & afaces,
-			 double ah);
-  
-    virtual double Func (const Vector & x) const;
-    virtual double FuncGrad (const Vector & x, Vector & g) const;
-  };
-
-  CheapPointFunction1 :: CheapPointFunction1 (Mesh::T_POINTS & apoints, 
-					      const ARRAY<INDEX_3> & afaces,
-					      double ah)
-    : points(apoints), faces(afaces)
-  {
-    h = ah;
-  
-
-    int i, nf = faces.Size();
-
-    m.SetSize (nf, 4);
-  
-    for (i = 1; i <= nf; i++)
-      {
-	const Point3d & p1 = points[faces.Get(i).I1()];
-	const Point3d & p2 = points[faces.Get(i).I2()];
-	const Point3d & p3 = points[faces.Get(i).I3()];
-	Vec3d v1 (p1, p2);
-	Vec3d v2 (p1, p3);
-	Vec3d n;
-	Cross (v1, v2, n);
-	n /= n.Length();
-
-	m.Elem(i, 1) = n.X();
-	m.Elem(i, 2) = n.Y();
-	m.Elem(i, 3) = n.Z();
-	m.Elem(i, 4) = - (n.X() * p1.X() + n.Y() * p1.Y() + n.Z() * p1.Z());
-      } 
-  }
-  
-
-  double CheapPointFunction1 :: Func (const Vector & vp) const
-  {
-
-    /*
-      int j;
-      double badness = 0;
-      Point3d pp(vp.Get(1), vp.Get(2), vp.Get(3));
-
-      for (j = 1; j <= faces.Size(); j++)
-      {
-      const INDEX_3 & el = faces.Get(j);
-
-      double bad = CalcTetBadness (points.Get(el.I1()), 
-      points.Get(el.I3()), 
-      points.Get(el.I2()), 
-      pp, 0);
-      badness += bad;
-      }
-    */
-
-    int i;
-    double badness = 0;
-    static Vector hv(4);
-    static Vector res;
-    res.SetSize (m.Height());
-
-    for (i = 1;i <= 3; i++)
-      hv.Elem(i) = vp.Get(i);
-    hv.Elem(4) = 1;
-    m.Mult (hv, res);
-
-    for (i = 1; i <= res.Size(); i++)
-      {
-	if (res.Get(i) < 1e-10)
-	  badness += 1e24;
-	else
-	  badness += 1 / res.Get(i);
-      }
- 
-    return badness;
-  }
-
-
-  double CheapPointFunction1 :: FuncGrad (const Vector & x, Vector & g) const
-  {
-    static Vector hx(3);
-    static double eps = 1e-6;
-
-    hx = x;
-    for (int i = 1; i <= 3; i++)
-      {
-	hx.Elem(i) = x.Get(i) + eps * h;
-	double fr = Func (hx);
-	hx.Elem(i) = x.Get(i) - eps * h;
-	double fl = Func (hx);
-	hx.Elem(i) = x.Get(i);
-
-	g.Elem(i) = (fr - fl) / (2 * eps * h);
-      }
-
-    return Func(x);
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  /* ************* PointFunction **************************** */
-
-
-  class PointFunction 
-  {
-  public:
-    Mesh::T_POINTS & points;
-    const Mesh::T_VOLELEMENTS & elements;
-    TABLE<INDEX,PointIndex::BASE> elementsonpoint;
-    PointIndex actpind;
-    double h;
-  
-  public:
-    PointFunction (Mesh::T_POINTS & apoints, 
-		   const Mesh::T_VOLELEMENTS & aelements);
-  
-    virtual void SetPointIndex (PointIndex aactpind);
-    void SetLocalH (double ah) { h = ah; }
-    double GetLocalH () const { return h; }
-    virtual double PointFunctionValue (const Point3d & pp) const;
-    virtual double PointFunctionValueGrad (const Point3d & pp, Vector & grad) const;
-    virtual double PointFunctionValueDeriv (const Point3d & pp, const Vec3d & dir, double & deriv) const;
-
-    int MovePointToInner ();
-  };
-
-
-  PointFunction :: PointFunction (Mesh::T_POINTS & apoints, 
-				  const Mesh::T_VOLELEMENTS & aelements)
-    : points(apoints), elements(aelements), elementsonpoint(apoints.Size())
-  {
-    INDEX i;
-    int j;
-  
-    for (i = 1; i <= elements.Size(); i++)
-      {
-	if (elements.Get(i).NP() == 4)
-	  for (j = 1; j <= elements.Get(i).NP(); j++)
-	    elementsonpoint.Add (elements.Get(i).PNum(j), i);  
-      }
-  }
-
-  void PointFunction :: SetPointIndex (PointIndex aactpind)
-  {
-    actpind = aactpind; 
-  }  
-
-  double PointFunction :: PointFunctionValue (const Point3d & pp) const
-  {
-    int j;
-    INDEX eli;
-    const Element * el;
-    double badness;
-    //  ARRAY<const Point3d*> p(4);
-    Point3d hp;
-
-    badness = 0;
-
-    hp = points[actpind];
-    points[actpind] = pp;
-
-    for (j = 0; j < elementsonpoint[actpind].Size(); j++)
-      {
-	eli = elementsonpoint[actpind][j];
-	el = &elements.Get(eli);
-	badness += CalcTetBadness (points[el->PNum(1)], 
-				   points[el->PNum(2)], 
-				   points[el->PNum(3)], 
-				   points[el->PNum(4)], -1);
-      }
-  
-    points[actpind] = hp; 
-    return badness;
-  }
-
-
-  double PointFunction :: PointFunctionValueGrad (const Point3d & pp, Vector & grad) const
-  {
-    double f, delta = h * 1e-6;
-    Point3d hpp;
-
-    f = PointFunctionValue (pp);
-
-    /*
-      hpp = pp;
-      hpp.X() = pp.X() + delta;
-      fr = PointFunctionValue (hpp);
-      hpp.X() = pp.X() - delta;
-      fl = PointFunctionValue (hpp);
-      grad.Elem(1) = (fr - fl) / (2 * delta);
-
-      hpp = pp;
-      hpp.Y() = pp.Y() + delta;
-      fr = PointFunctionValue (hpp);
-      hpp.Y() = pp.Y() - delta;
-      fl = PointFunctionValue (hpp);
-      grad.Elem(2) = (fr - fl) / (2 * delta);
-
-      hpp = pp;
-      hpp.Z() = pp.Z() + delta;
-      fr = PointFunctionValue (hpp);
-      hpp.Z() = pp.Z() - delta;
-      fl = PointFunctionValue (hpp);
-      grad.Elem(3) = (fr - fl) / (2 * delta);
-    */
-
-
-
-    // new gradient calculation
-    int j, k;
-    INDEX eli;
-    //  double badness;
-    Point3d hp;
-    Vec3d vgradi, vgrad(0,0,0);
-
-    //  badness = 0;
-
-    hp = points[actpind];
-    points[actpind] = pp;
-
-    for (j = 0; j < elementsonpoint[actpind].Size(); j++)
-      {
-	eli = elementsonpoint[actpind][j];
-	const Element & el = elements.Get(eli);
-
-	for (k = 1; k <= 4; k++)
-	  if (el.PNum(k) == actpind)
-	    {
-	      CalcTetBadnessGrad (points[el.PNum(1)], 
-				  points[el.PNum(2)], 
-				  points[el.PNum(3)], 
-				  points[el.PNum(4)], -1, k, vgradi);
-	      vgrad += vgradi;
-	    }
-      }
-    points[actpind] = hp; 
-
-    for (j = 1; j <= 3; j++)
-      grad.Elem(j) = vgrad.X(j);
-
-    return f;
-  }
-
-
-  double PointFunction :: PointFunctionValueDeriv (const Point3d & pp, const Vec3d & dir,
-						   double & deriv) const
-  {
-    double f;
-    Point3d hpp;
-
-    Vec3d dirn (dir);
-    double ldir = dir.Length();
-
-    int j, k;
-    INDEX eli;
-    //  double badness;
-    Point3d hp;
-    Vec3d vgradi, vgrad(0,0,0);
-
-    //  badness = 0;
-
-    hp = points[actpind];
-    points[actpind] = pp;
-    f = 0;
-
-    for (j = 0; j < elementsonpoint[actpind].Size(); j++)
-      {
-	eli = elementsonpoint[actpind][j];
-	const Element & el = elements.Get(eli);
-
-	for (k = 1; k <= 4; k++)
-	  if (el.PNum(k) == actpind)
-	    {
-	      f += CalcTetBadnessGrad (points[el.PNum(1)], 
-				       points[el.PNum(2)], 
-				       points[el.PNum(3)], 
-				       points[el.PNum(4)], -1, k, vgradi);
-
-	      vgrad += vgradi;
-	    }
-      }
-
-    points[actpind] = hp; 
-    deriv = dir * vgrad;
-    return f;
-  }
-
-  int PointFunction :: MovePointToInner ()
-  {
-    int j, k;
-
-    // try point movement 
-    ARRAY<Element2d> faces;
-  
-    for (j = 0; j < elementsonpoint[actpind].Size(); j++)
-      {
-	const Element & el = 
-	  elements.Get(elementsonpoint[actpind][j]);
-      
-	for (k = 1; k <= 4; k++)
-	  if (el.PNum(k) == actpind)
-	    {
-	      Element2d face;
-	      el.GetFace (k, face);
-	      Swap (face.PNum(2), face.PNum(3));
-	      faces.Append (face);
-	    }
-      }
-  
-    Point3d hp;
-    int hi = FindInnerPoint (points, faces, hp);
-    if (hi)
-      {
-	cout << "inner point found" << endl;
-	points[actpind] = hp;
-      }
-    else
-      cout << "no inner point found" << endl;
-  
-    return hi;
-  }
-
-
-
-
-
-
-  class CheapPointFunction : public PointFunction
-  {
-    DenseMatrix m;
-  public:
-    CheapPointFunction (Mesh::T_POINTS & apoints, 
-			const Mesh::T_VOLELEMENTS & aelements);
-    virtual void SetPointIndex (PointIndex aactpind);
-    virtual double PointFunctionValue (const Point3d & pp) const;
-    virtual double PointFunctionValueGrad (const Point3d & pp, Vector & grad) const;
-  };
-
-
-  CheapPointFunction :: CheapPointFunction (Mesh::T_POINTS & apoints, 
-					    const Mesh::T_VOLELEMENTS & aelements)
-    : PointFunction (apoints, aelements)
-  {
-    ;
-  }
-
-
-  void CheapPointFunction :: SetPointIndex (PointIndex aactpind)
-  {
-    actpind = aactpind; 
-
-    int n = elementsonpoint[actpind].Size();
-    int i, j;
-    int pi1, pi2, pi3;
-
-    m.SetSize (n, 4);
-
-    for (i = 0; i < n; i++)
-      {
-	pi1 = 0;
-	pi2 = 0;
-	pi3 = 0;
-
-	const Element & el = elements.Get (elementsonpoint[actpind][i]);
-	for (j = 1; j <= 4; j++)
-	  if (el.PNum(j) != actpind)
-	    {
-	      pi3 = pi2;
-	      pi2 = pi1;
-	      pi1 = el.PNum(j);
-	    }
-
-	const Point3d & p1 = points[pi1];
-	Vec3d v1 (p1, points[pi2]);
-	Vec3d v2 (p1, points[pi3]);
-	Vec3d n;
-	Cross (v1, v2, n);
-	n /= n.Length();
-
-	Vec3d v (p1, points[actpind]);
-	double c = v * n;
-      
-	if (c < 0)
-	  n *= -1;    
-      
-	// n is inner normal
-
-	m.Elem(i, 1) = n.X();
-	m.Elem(i, 2) = n.Y();
-	m.Elem(i, 3) = n.Z();
-	m.Elem(i, 4) = - (n.X() * p1.X() + n.Y() * p1.Y() + n.Z() * p1.Z());
-      }
-  }
-
-  double CheapPointFunction :: PointFunctionValue (const Point3d & pp) const
-  {
-    static Vector p4(4);
-    static Vector di;
-    int n = m.Height();
-
-    p4.Elem(1) = pp.X();
-    p4.Elem(2) = pp.Y();
-    p4.Elem(3) = pp.Z();
-    p4.Elem(4) = 1;
-
-    di.SetSize (n);
-    m.Mult (p4, di);
-  
-    double sum = 0;
-    for (int i = 1; i <= n; i++)
-      {
-	if (di.Get(i) > 0)
-	  sum += 1 / di.Get(i);
-	else
-	  return 1e16;
-      }
-    return sum;
-  }
-
-
-
-
-  double CheapPointFunction :: PointFunctionValueGrad (const Point3d & pp, Vector & grad) const
-  {
-    static Vector p4(4);
-    static Vector di;
-
-    grad.SetSize (3);
-    int n = m.Height();
-
-    p4.Elem(1) = pp.X();
-    p4.Elem(2) = pp.Y();
-    p4.Elem(3) = pp.Z();
-    p4.Elem(4) = 1;
-
-    di.SetSize (n);
-    m.Mult (p4, di);
-  
-    double sum = 0;
-    grad = 0;
-    for (int i = 1; i <= n; i++)
-      {
-	if (di.Get(i) > 0)
-	  {
-	    double idi = 1 / di.Get(i);
-	    sum += idi;
-	    grad.Elem(1) -= idi * idi * m.Get(i, 1);
-	    grad.Elem(2) -= idi * idi * m.Get(i, 2);
-	    grad.Elem(3) -= idi * idi * m.Get(i, 3);
-	  }
-	else
-	  {
-	    return 1e16;
-	  }
-      }
-    return sum;
-  }
-
-
-
-
-
-
-
-
-  class Opti3FreeMinFunction : public MinFunction
-  { 
-    const PointFunction & pf;
-    Point3d sp1;
-  
-  public:
-    Opti3FreeMinFunction (const PointFunction & apf);
-    void SetPoint (const Point3d & asp1) { sp1 = asp1; }
-    virtual double Func (const Vector & x) const;
-    virtual double FuncGrad (const Vector & x, Vector & g) const;
-    virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;  
-    virtual double GradStopping (const Vector & x) const;
-    virtual void ApproximateHesse (const Vector & x,
-				   DenseMatrix & hesse) const;
-  };
-
-
-
-  Opti3FreeMinFunction :: Opti3FreeMinFunction (const PointFunction & apf)
-    : pf(apf)
-  {
-    ;
-  }
-
-
-  double Opti3FreeMinFunction :: Func (const Vector & x) const
-  {
-    Point3d pp;
-    pp.X() = sp1.X() + x.Get(1);
-    pp.Y() = sp1.Y() + x.Get(2);
-    pp.Z() = sp1.Z() + x.Get(3);
-
-    return pf.PointFunctionValue (pp);
-  }
-  
-  double Opti3FreeMinFunction :: FuncGrad (const Vector & x, Vector & grad) const
-  {
-    Point3d pp;
-    pp.X() = sp1.X() + x.Get(1);
-    pp.Y() = sp1.Y() + x.Get(2);
-    pp.Z() = sp1.Z() + x.Get(3);
-
-    return pf.PointFunctionValueGrad (pp, grad);
-  }
-
-  double Opti3FreeMinFunction :: FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
-  {
-    Point3d pp;
-    pp.X() = sp1.X() + x.Get(1);
-    pp.Y() = sp1.Y() + x.Get(2);
-    pp.Z() = sp1.Z() + x.Get(3);
-
-    Vec3d vdir;
-    vdir.X() = dir.Get(1);
-    vdir.Y() = dir.Get(2);
-    vdir.Z() = dir.Get(3);
-
-    return pf.PointFunctionValueDeriv (pp, vdir, deriv);
-  }
-
-  double Opti3FreeMinFunction :: GradStopping (const Vector & x) const
-  {
-    double f = Func(x);
-    return 1e-3 * f / pf.GetLocalH();
-  }
-
-
-  void Opti3FreeMinFunction :: ApproximateHesse (const Vector & x,
-						 DenseMatrix & hesse) const
-  {
-    int n = x.Size();
-    int i, j;
-
-    static Vector hx;
-    hx.SetSize(n);
-
-    double eps = 1e-8;
-    double f, f11, f12, f21, f22;
-
-    f = Func(x);
-
-  
-    for (i = 1; i <= n; i++)
-      {
-	for (j = 1; j < i; j++)
-	  {
-	    /*
-	      hx = x;
-	      hx.Elem(i) = x.Get(i) + eps;
-	      hx.Elem(j) = x.Get(j) + eps;
-	      f11 = Func(hx);
-	      hx.Elem(i) = x.Get(i) + eps;
-	      hx.Elem(j) = x.Get(j) - eps;
-	      f12 = Func(hx);
-	      hx.Elem(i) = x.Get(i) - eps;
-	      hx.Elem(j) = x.Get(j) + eps;
-	      f21 = Func(hx);
-	      hx.Elem(i) = x.Get(i) - eps;
-	      hx.Elem(j) = x.Get(j) - eps;
-	      f22 = Func(hx);
-	    */
-	    hesse.Elem(i, j) = hesse.Elem(j, i) = 0;
-	    //	    (f11 + f22 - f12 - f21) / (2 * eps * eps);
-	  }
-
-	hx = x;
-	hx.Elem(i) = x.Get(i) + eps;
-	f11 = Func(hx);
-	hx.Elem(i) = x.Get(i) - eps;
-	f22 = Func(hx);
-
-	hesse.Elem(i, i) = (f11 + f22 - 2 * f) / (eps * eps) + 1e-12;
-      }
-  }
-
-
-
-
-
-
-#ifdef SOLIDGEOM
-  class Opti3SurfaceMinFunction : public MinFunction
-  {
-    const PointFunction & pf;
-    Point3d sp1;
-    const Surface * surf;
-    Vec3d t1, t2;
-  
-  public:
-    Opti3SurfaceMinFunction (const PointFunction & apf);
-  
-    void SetPoint (const Surface * asurf, const Point3d & asp1);
-
-    void CalcNewPoint (const Vector & x, Point3d & np) const; 
-    virtual double Func (const Vector & x) const;
-    virtual double FuncGrad (const Vector & x, Vector & g) const;
-  };
-
-
-  Opti3SurfaceMinFunction :: Opti3SurfaceMinFunction (const PointFunction & apf)
-    : MinFunction(), pf(apf)
-  {
-    ;
-  }
-
-  void Opti3SurfaceMinFunction :: SetPoint (const Surface * asurf, const Point3d & asp1)
-  { 
-    Vec3d n;
-    sp1 = asp1; 
-    surf = asurf;
-  
-    Vec<3> hn;
-    surf -> GetNormalVector (sp1, hn);
-    n = hn;
-
-    n.GetNormal (t1);
-    t1 /= t1.Length();
-    t2 = Cross (n, t1);
-  }
-
-  
-  void Opti3SurfaceMinFunction :: CalcNewPoint (const Vector & x, 
-						Point3d & np) const
-  {
-    np.X() = sp1.X() + x.Get(1) * t1.X() + x.Get(2) * t2.X();
-    np.Y() = sp1.Y() + x.Get(1) * t1.Y() + x.Get(2) * t2.Y();
-    np.Z() = sp1.Z() + x.Get(1) * t1.Z() + x.Get(2) * t2.Z();
-
-    Point<3> hnp = np;
-    surf -> Project (hnp);
-    np = hnp;
-  }
-
-
-  double Opti3SurfaceMinFunction :: Func (const Vector & x) const
-  {
-    Point3d pp1;
-
-    CalcNewPoint (x, pp1);
-    return pf.PointFunctionValue (pp1);
-  }
-
-
-
-  double Opti3SurfaceMinFunction :: FuncGrad (const Vector & x, Vector & grad) const
-  {
-    Vec3d n, vgrad;
-    Point3d pp1;
-    double badness;
-    static Vector freegrad(3);
-
-    CalcNewPoint (x, pp1);
-
-    badness = pf.PointFunctionValueGrad (pp1, freegrad);
-    vgrad.X() = freegrad.Get(1);
-    vgrad.Y() = freegrad.Get(2);
-    vgrad.Z() = freegrad.Get(3);
-
-    Vec<3> hn;
-    surf -> GetNormalVector (pp1, hn);
-    n = hn;
-
-    vgrad -= (vgrad * n) * n;
-
-    grad.Elem(1) = vgrad * t1;
-    grad.Elem(2) = vgrad * t2;
-    
-    return badness;
-  }
-#endif
-  
-  
-  
-
-
-  
-  
-  
-#ifdef SOLIDGEOM
-  class Opti3EdgeMinFunction : public MinFunction
-  {
-    const PointFunction & pf;
-    Point3d sp1;
-    const Surface *surf1, *surf2;
-    Vec3d t1;
-  
-  public:
-    Opti3EdgeMinFunction (const PointFunction & apf);
-  
-    void SetPoint (const Surface * asurf1, const Surface * asurf2,
-		   const Point3d & asp1);
-    void CalcNewPoint (const Vector & x, Point3d & np) const; 
-    virtual double FuncGrad (const Vector & x, Vector & g) const;
-    virtual double Func (const Vector & x) const;
-  };
-
-  Opti3EdgeMinFunction :: Opti3EdgeMinFunction (const PointFunction & apf)
-    : MinFunction(), pf(apf)
-  {
-    ;
-  }
-  
-  void Opti3EdgeMinFunction :: SetPoint (const Surface * asurf1, 
-					 const Surface * asurf2, 
-					 const Point3d & asp1) 
-  { 
-    Vec3d n1, n2;
-    sp1 = asp1; 
-    surf1 = asurf1;
-    surf2 = asurf2;
-
-    Vec<3> hn1, hn2;
-    surf1 -> GetNormalVector (sp1, hn1);
-    surf2 -> GetNormalVector (sp1, hn2);
-    n1 = hn1;
-    n2 = hn2;
-    t1 = Cross (n1, n2);
-  }
-
-  void Opti3EdgeMinFunction :: CalcNewPoint (const Vector & x,
-					     Point3d & np) const
-{
-  np.X() = sp1.X() + x.Get(1) * t1.X();
-  np.Y() = sp1.Y() + x.Get(1) * t1.Y();
-  np.Z() = sp1.Z() + x.Get(1) * t1.Z();
-  Point<3> hnp = np;
-  ProjectToEdge (surf1, surf2, hnp);
-  np = hnp;
-}   
-
-double Opti3EdgeMinFunction :: Func (const Vector & x) const
-{
-  Vector g(x.Size());
-  return FuncGrad (x, g);
-}
-
-
-double Opti3EdgeMinFunction :: FuncGrad (const Vector & x, Vector & grad) const
-{
-  Vec3d n1, n2, v1, vgrad;
-  Point3d pp1;
-  double badness;
-  static Vector freegrad(3);
-
-  CalcNewPoint (x, pp1);
-
-
-  badness = pf.PointFunctionValueGrad (pp1, freegrad);
-
-  vgrad.X() = freegrad.Get(1);
-  vgrad.Y() = freegrad.Get(2);
-  vgrad.Z() = freegrad.Get(3);
-
-  Vec<3> hn1, hn2;
-  surf1 -> GetNormalVector (pp1, hn1);
-  surf2 -> GetNormalVector (pp1, hn2);
-  n1 = hn1;
-  n2 = hn2;
-
-  v1 = Cross (n1, n2);
-  v1 /= v1.Length();
-
-  grad.Elem(1) = (vgrad * v1) * (t1 * v1);
-  return badness;
-}
-#endif
-
-
-
-
-double CalcBad (const Mesh::T_POINTS & points, const Element & elem,
-		double h)
-{
-  if (elem.GetType() == TET)
-    return CalcTetBadness (points[elem.PNum(1)], 
-			   points[elem.PNum(2)],  
-			   points[elem.PNum(3)],  
-			   points[elem.PNum(4)], h);  
-  return 0;
-}
-
-
-extern double teterrpow;
-double CalcTotalBad (const Mesh::T_POINTS & points, 
-		     const Mesh::T_VOLELEMENTS & elements)
-{
-  int i;
-  double sum = 0;
-  double elbad;
-  
-  tets_in_qualclass.SetSize(20);
-  for (i = 1; i <= 20; i++)
-    tets_in_qualclass.Elem(i) = 0;
-
-
-  for (i = 1; i <= elements.Size(); i++)
-    {
-      elbad = pow (CalcBad (points, elements.Get(i), 0), 1/teterrpow);
-
-      int qualclass = int (20 / elbad + 1);
-      if (qualclass < 1) qualclass = 1;
-      if (qualclass > 20) qualclass = 20;
-      tets_in_qualclass.Elem(qualclass)++;
-
-      sum += elbad;
-    }
-  return sum;
-}
-
-int WrongOrientation (const Mesh::T_POINTS & points, const Element & el)
-{
-  const Point3d & p1 = points[el.PNum(1)];
-  const Point3d & p2 = points[el.PNum(2)];
-  const Point3d & p3 = points[el.PNum(3)];
-  const Point3d & p4 = points[el.PNum(4)];
-
-  Vec3d v1(p1, p2);
-  Vec3d v2(p1, p3);
-  Vec3d v3(p1, p4);
-  Vec3d n;
-
-  Cross (v1, v2, n);
-  double vol = n * v3;
-
-  return (vol > 0);
-}
-
-
-
-
-
-
-
-
-
-
-
-/* ************* JacobianPointFunction **************************** */
-
-
-
-
-class JacobianPointFunction : public MinFunction
-{
-public:
-  Mesh::T_POINTS & points;
-  const Mesh::T_VOLELEMENTS & elements;
-  TABLE<INDEX> elementsonpoint;
-  PointIndex actpind;
-  
-public:
-  JacobianPointFunction (Mesh::T_POINTS & apoints, 
-			 const Mesh::T_VOLELEMENTS & aelements);
-  
-  virtual void SetPointIndex (PointIndex aactpind);
-  virtual double Func (const Vector & x) const;
-  virtual double FuncGrad (const Vector & x, Vector & g) const;
-  virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;
-};
-
-
-JacobianPointFunction :: 
-JacobianPointFunction (Mesh::T_POINTS & apoints, 
-		       const Mesh::T_VOLELEMENTS & aelements)
-  : points(apoints), elements(aelements), elementsonpoint(apoints.Size())
-{
-  INDEX i;
-  int j;
-  
-  for (i = 1; i <= elements.Size(); i++)
-    {
-      for (j = 1; j <= elements.Get(i).NP(); j++)
-	elementsonpoint.Add1 (elements.Get(i).PNum(j), i);  
-    }
-}
-
-void JacobianPointFunction :: SetPointIndex (PointIndex aactpind)
-{
-  actpind = aactpind; 
-}  
-
-
-double JacobianPointFunction :: Func (const Vector & v) const
-{
-  int j;
-  double badness = 0;
-
-  Point3d hp = points.Elem(actpind);
-  points.Elem(actpind) = hp + Vec3d (v.Get(1), v.Get(2), v.Get(3));
-
-  for (j = 1; j <= elementsonpoint.EntrySize(actpind); j++)
-    {
-      int eli = elementsonpoint.Get(actpind, j);
-      badness += elements.Get(eli).CalcJacobianBadness (points);
-    }
-  
-  points.Elem(actpind) = hp; 
-
-  return badness;
-}
-
-
-
-
-
-double JacobianPointFunction :: 
-FuncGrad (const Vector & x, Vector & g) const
-{
-  int j, k;
-  int lpi;
-  double badness = 0, hbad;
-
-  Point3d hp = points.Elem(actpind);
-  points.Elem(actpind) = hp + Vec3d (x.Get(1), x.Get(2), x.Get(3));
-
-  double hderiv;
-  Vec3d vdir;
-  g.SetSize(3);
-  g = 0;
-
-  for (j = 1; j <= elementsonpoint.EntrySize(actpind); j++)
-    {
-      int eli = elementsonpoint.Get(actpind, j);
-      const Element & el = elements.Get(eli);
-
-      lpi = 0;
-      for (k = 1; k <= el.GetNP(); k++)
-	if (el.PNum(k) == actpind)
-	  lpi = k;
-      if (!lpi) cerr << "loc point not found" << endl;
-
-      for (k = 1; k <= 3; k++)
-	{
-	  vdir = Vec3d(0,0,0);
-	  vdir.X(k) = 1;
-
-	  hbad = elements.Get(eli).
-	    CalcJacobianBadnessDirDeriv (points, lpi, vdir, hderiv);
-	  g.Elem(k) += hderiv;
-	  if (k == 1)
-	    badness += hbad;
-	}
-    }
-  
-  points.Elem(actpind) = hp; 
-
-  return badness;
-}
-
-
-double JacobianPointFunction :: 
-FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
-{
-  int j, k;
-  int lpi;
-  double badness = 0;
-
-  Point3d hp = points.Elem(actpind);
-  points.Elem(actpind) = hp + Vec3d (x.Get(1), x.Get(2), x.Get(3));
-
-  double hderiv;
-  deriv = 0;
-  Vec3d vdir(dir.Get(1), dir.Get(2), dir.Get(3));
-
-  for (j = 1; j <= elementsonpoint.EntrySize(actpind); j++)
-    {
-      int eli = elementsonpoint.Get(actpind, j);
-      const Element & el = elements.Get(eli);
-
-      lpi = 0;
-      for (k = 1; k <= el.GetNP(); k++)
-	if (el.PNum(k) == actpind)
-	  lpi = k;
-      if (!lpi) cerr << "loc point not found" << endl;
-
-      badness += elements.Get(eli).
-	CalcJacobianBadnessDirDeriv (points, lpi, vdir, hderiv);
-      deriv += hderiv;
-    }
-  
-  points.Elem(actpind) = hp; 
-
-  return badness;
-  
-  /*
-    (*testout) << "bad1 = " << badness << " der = " << deriv << endl;
-
-
-
-    static Vector hx(3);
-    static double eps = 1e-6;
-
-    double dirlen = dir.L2Norm();
-    if (dirlen < 1e-14)
-    {
-    deriv = 0;
-    return Func(x);
-    }
-
-    hx.Set(1, x);
-    hx.Add(eps / dirlen, dir);
-    double fr = Func (hx);
-    hx.Set(1, x);
-    hx.Add(-eps / dirlen, dir);
-    double fl = Func (hx);
-
-    deriv = (fr - fl) / (2 * eps) * dirlen;
-
-
-    (*testout) << "bad2 = " << Func(x) << " der = " << deriv << endl;
-
-
-    return Func(x);
-  */
-}
-
-
-
-
-
-
-
-
-
-
-#ifdef SOLIDGEOMxxxx
-void Mesh :: ImproveMesh (const CSGeometry & geometry, OPTIMIZEGOAL goal)
-{
-  INDEX i, eli;
-  int j;
-  int typ = 1;
-
-  if (!&geometry || geometry.GetNSurf() == 0)
-    {
-      ImproveMesh (goal);
-      return;
-    }
-
-  char * savetask = multithread.task;
-  multithread.task = "Smooth Mesh";
-
-
-  TABLE<INDEX> surfelementsonpoint(points.Size());
-  Vector x(3), xsurf(2), xedge(1);
-  int surf, surf1, surf2, surf3;
-
-  int uselocalh = mparam.uselocalh;
-
-  (*testout).precision(8);
-  (*testout) << "Improve Mesh" << "\n";
-  PrintMessage (3, "ImproveMesh");
-  //  (*mycout) << "Vol = " << CalcVolume (points, volelements) << endl;
-
-
-  for (i = 1; i <= surfelements.Size(); i++)
-    for (j = 1; j <= 3; j++)
-      surfelementsonpoint.Add1 (surfelements.Get(i).PNum(j), i);
-
-
-  PointFunction * pf;
-  if (typ == 1)
-    pf = new PointFunction(points, volelements);
-  else
-    pf = new CheapPointFunction(points, volelements);
-
-  //  pf->SetLocalH (h);
-  
-  Opti3FreeMinFunction freeminf(*pf);
-  Opti3SurfaceMinFunction surfminf(*pf);
-  Opti3EdgeMinFunction edgeminf(*pf);
-  
-  OptiParameters par;
-  par.maxit_linsearch = 20;
-  par.maxit_bfgs = 20;
-
-
-
-  for (i = 1; i <= points.Size(); i++)
-    {
-      //      if (ptyps.Get(i) == FIXEDPOINT) continue;
-      if (ptyps.Get(i) != INNERPOINT) continue;
-
-      if (multithread.terminate)
-	throw NgException ("Meshing stopped");
-      /*
-      if (multithread.terminate)
-	break;
-      */
-      multithread.percent = 100.0 * i /points.Size();
-
-      if (points.Size() < 1000)
-	PrintDot ();
-      else
-	if (i % 10 == 0)
-	  PrintDot ('+');
-      
-      //    (*testout) << "Now point " << i << "\n";
-      //    (*testout) << "Old: " << points.Get(i) << "\n";
-
-      pf->SetPointIndex (i);
-
-      //      if (uselocalh)
-      {
-	double lh = GetH (points.Get(i));
-	pf->SetLocalH (GetH (points.Get(i)));
-	par.typx = lh / 10;
-	//	  (*testout) << "lh(" << points.Get(i) << ") = " << lh << "\n";
-      }
-
-      surf1 = surf2 = surf3 = 0;
-
-      for (j = 1; j <= surfelementsonpoint.EntrySize(i); j++)
-	{
-	  eli = surfelementsonpoint.Get(i, j);
-	  int surfi = surfelements.Get(eli).GetIndex();
-
-	  if (surfi)
-	    {
-	      surf = GetFaceDescriptor(surfi).SurfNr();
-	    
-	      if (!surf1)
-		surf1 = surf;
-	      else if (surf1 != surf)
-		{
-		  if (!surf2)
-		    surf2 = surf;
-		  else if (surf2 != surf)
-		    surf3 = surf;
-		}
-	    }
-	  else
-	    {
-	      surf1 = surf2 = surf3 = 1;   // simulates corner point
-	    }
-	}
-
-
-      if (surf2 && !surf3)
-	{
-	  //      (*testout) << "On Edge" << "\n";
-	  /*
-	    xedge = 0;
-	    edgeminf.SetPoint (geometry.GetSurface(surf1),
-	    geometry.GetSurface(surf2), 
-	    points.Elem(i));
-	    BFGS (xedge, edgeminf, par);
-
-	    edgeminf.CalcNewPoint (xedge, points.Elem(i));
-	  */
-	}
-
-      if (surf1 && !surf2)
-	{
-	  //      (*testout) << "In Surface" << "\n";
-	  /*
-	    xsurf = 0;
-	    surfminf.SetPoint (geometry.GetSurface(surf1),
-	    points.Get(i));
-	    BFGS (xsurf, surfminf, par);
-   
-	    surfminf.CalcNewPoint (xsurf, points.Elem(i));
-	  */
-	}
- 
-      if (!surf1)
-	{
-	  //      (*testout) << "In Volume" << "\n";
-	  x = 0;
-	  freeminf.SetPoint (points.Elem(i));
-	  //	  par.typx = 
-	  BFGS (x, freeminf, par);
-
-	  points.Elem(i).X() += x.Get(1);
-	  points.Elem(i).Y() += x.Get(2);
-	  points.Elem(i).Z() += x.Get(3);
-	}
-      
-      //    (*testout) << "New Point: " << points.Elem(i) << "\n" << "\n";
-    
-    }
-  PrintDot ('\n');
-  //  (*mycout) << "Vol = " << CalcVolume (points, volelements) << endl;
-
-  multithread.task = savetask;
-
-}
-#endif
-
-  
-void Mesh :: ImproveMesh (OPTIMIZEGOAL goal)
-{
-  int typ = 1;
-  int j;
-  
-  (*testout) << "Improve Mesh" << "\n";
-  PrintMessage (3, "ImproveMesh");
-
-  int np = GetNP();
-  int ne = GetNE();
-
-
-  ARRAY<double,PointIndex::BASE> perrs(np);
-  perrs = 1.0;
-
-  double bad1 = 0;
-  double badmax = 0;
-
-  if (goal == OPT_QUALITY)
-    {
-      for (int i = 1; i <= ne; i++)
-	{
-	  const Element & el = VolumeElement(i);
-	  if (el.GetType() != TET)
-	    continue;
-	  
-	  double hbad = CalcBad (points, el, 0);
-	  for (j = 0; j < 4; j++)
-	    perrs[el[j]] += hbad;
-	  
-	  bad1 += hbad;
-	}
-      
-      for (PointIndex i = PointIndex::BASE; i < np+PointIndex::BASE; i++)
-	if (perrs[i] > badmax) 
-	  badmax = perrs[i];
-      badmax = 0;
-    }
-
-  if (goal == OPT_QUALITY)
-    {
-      bad1 = CalcTotalBad (points, volelements);
-      (*testout) << "Total badness = " << bad1 << endl;
-      PrintMessage (5, "Total badness = ", bad1);
-    }
-  
-  Vector x(3);
-  
-  (*testout).precision(8);
-  
-  int uselocalh = mparam.uselocalh;
-
-
-  PointFunction * pf;
-
-  if (typ == 1)
-    pf = new PointFunction(points, volelements);
-  else
-    pf = new CheapPointFunction(points, volelements);
-
-  //  pf->SetLocalH (h);
-  
-  Opti3FreeMinFunction freeminf(*pf);
-
-  OptiParameters par;
-  par.maxit_linsearch = 20;
-  par.maxit_bfgs = 20;
-
-
-  char * savetask = multithread.task;
-  multithread.task = "Smooth Mesh";
-  
-  for (PointIndex i = PointIndex::BASE; 
-       i < points.Size()+PointIndex::BASE; i++)
-    if (PointType(i) == INNERPOINT && perrs[i] > 0.01 * badmax)
-      {
-	if (multithread.terminate)
-	  throw NgException ("Meshing stopped");
-
-	multithread.percent = 100.0 * (i+1-PointIndex::BASE) / points.Size();
-
-	if (points.Size() < 1000)
-	  PrintDot ();
-	else
-	  if ( (i+1-PointIndex::BASE) % 10 == 0)
-	    PrintDot ('+');
-
-	double lh = GetH(points[i]);
-	pf->SetLocalH (lh);
-	par.typx = lh;
-
-	freeminf.SetPoint (points[i]);
-	pf->SetPointIndex (i);
-
-	x = 0;
-	int pok;
-	pok = freeminf.Func (x) < 1e10; 
-
-	if (!pok)
-	  {
-	    pok = pf->MovePointToInner ();
-
-	    freeminf.SetPoint (points[i]);
-	    pf->SetPointIndex (i);
-	  }
-
-	if (pok)
-	  {
-	    BFGS (x, freeminf, par);
-	    
-	    points[i].X() += x.Get(1);
-	    points[i].Y() += x.Get(2);
-	    points[i].Z() += x.Get(3);
-	  }
-      }
-  PrintDot ('\n');
-  
-  
-  delete pf;
-
-  multithread.task = savetask;
-
-  if (goal == OPT_QUALITY)
-    {
-      bad1 = CalcTotalBad (points, volelements);
-      (*testout) << "Total badness = " << bad1 << endl;
-      PrintMessage (5, "Total badness = ", bad1);
-    }
-}
-
-
-
-
-// Improve Condition number of Jacobian, any elements  
-void Mesh :: ImproveMeshJacobian (OPTIMIZEGOAL goal)
-{
-  int i, j;
-  
-  (*testout) << "Improve Mesh Jacobian" << "\n";
-  PrintMessage (3, "ImproveMesh Jacobian");
-
-  int np = GetNP();
-  int ne = GetNE();
-
-  
-  Vector x(3);
-  
-  (*testout).precision(8);
-  
-  JacobianPointFunction pf(points, volelements);
-  
-
-  OptiParameters par;
-  par.maxit_linsearch = 20;
-  par.maxit_bfgs = 20;
-  
-  BitArray badnodes(np);
-  badnodes.Clear();
-
-  for (i = 1; i <= ne; i++)
-    {
-      const Element & el = VolumeElement(i);
-      double bad = el.CalcJacobianBadness (Points());
-      if (bad > 1)
-	for (j = 1; j <= el.GetNP(); j++)
-	  badnodes.Set (el.PNum(j));
-    }
-
-
-  char * savetask = multithread.task;
-  multithread.task = "Smooth Mesh Jacobian";
-  
-  for (i = 1; i <= points.Size(); i++)
-    if (PointType(i) == INNERPOINT)
-      {
-
-	(*testout) << "improvejac, p = " << i << endl;
-
-	if (goal == OPT_WORSTCASE && !badnodes.Test(i))
-	  continue;
-	//	(*testout) << "smoot p " << i << endl;
-
-	/*
-	if (multithread.terminate)
-	  break;
-	*/
-	if (multithread.terminate)
-	  throw NgException ("Meshing stopped");
-
-	multithread.percent = 100.0 * i / points.Size();
-
-	if (points.Size() < 1000)
-	  PrintDot ();
-	else
-	  if (i % 10 == 0)
-	    PrintDot ('+');
-
-	double lh = GetH(points.Get(i));
-	par.typx = lh;
-
-	pf.SetPointIndex (i);
-
-	x = 0;
-	int pok = (pf.Func (x) < 1e10); 
-
-	if (pok)
-	  {
-	    BFGS (x, pf, par);
-
-	    points.Elem(i).X() += x.Get(1);
-	    points.Elem(i).Y() += x.Get(2);
-	    points.Elem(i).Z() += x.Get(3);
-	  }
-	else
-	  {
-	    cout << "el not ok" << endl;
-	  }
-      }
-  PrintDot ('\n');
-  
-
-  multithread.task = savetask;
-}
-
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/specials.cpp b/contrib/Netgen/libsrc/meshing/specials.cpp
deleted file mode 100644
index ae9877cc2ef2b550d2e942f9bdd55c0fae54d642..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/specials.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-
-// A special function for Hermann Landes, Erlangen
-
-
-void CutOffAndCombine (Mesh & mesh, const Mesh & othermesh)
-{
-  int i, j;
-  int nse = othermesh.GetNSE();
-  int onp = othermesh.GetNP();
-
-  int ne = mesh.GetNE();
-
-  PrintMessage (1, "other mesh has ",
-		othermesh.GetNP(), " points, ",
-		othermesh.GetNSE(), " surface elements.");
-
-  ARRAY<Box3d> otherbounds(nse);  
-  Box3d otherbox;
-
-  double maxh = 0;
-  for (i = 1; i <= nse; i++)
-    {
-      const Element2d & sel = othermesh.SurfaceElement(i);
-      sel.GetBox(othermesh.Points(), otherbounds.Elem(i));
-
-      double loch = othermesh.GetH (othermesh.Point (sel.PNum(1)));
-      otherbounds.Elem(i).Increase(loch);
-      if (loch > maxh) maxh = loch;
-    }
-
-  otherbox.SetPoint (othermesh.Point(1));
-  for (i = 1; i <= othermesh.GetNP(); i++)
-    otherbox.AddPoint (othermesh.Point(i));
-  otherbox.Increase (maxh);
-
-  for (i = 1; i <= ne; i++)
-    {
-      Box3d box;
-      int remove = 0;
-
-      const Element & el = mesh.VolumeElement(i);
-      el.GetBox(mesh.Points(), box);
-
-      if (i % 10000 == 0)
-	cout << "+" << flush;
-
-      if (box.Intersect(otherbox))
-	{
-	  for (j = 1; j <= nse && !remove; j++)
-	    if (box.Intersect(otherbounds.Get(j)))
-	      remove = 1;
-	}
-
-      if (remove)
-	mesh.VolumeElement(i).Delete();
-    }
-  cout << endl;
-
-  BitArray connected(mesh.GetNP());
-  connected.Clear();
-  for (i = 1; i <= mesh.GetNSE(); i++)
-    {
-      const Element2d & el = mesh.SurfaceElement(i);
-      for (j = 1; j <= 3; j++)
-	connected.Set(el.PNum(j));
-    }
-  
-  bool changed;
-  do
-    {
-      changed = 0;
-      for (i = 1; i <= mesh.GetNE(); i++)
-	{
-	  const Element & el = mesh.VolumeElement(i);
-	  int has = 0, hasnot = 0;
-	  if (el[0])
-	    {
-	      for (j = 0; j < 4; j++)
-		{
-		  if (connected.Test(el[j]))
-		    has = 1;
-		  else
-		    hasnot = 1;
-		}
-	      if (has && hasnot)
-		{
-		  changed = 1;
-		  for (j = 0; j < 4; j++)
-		    connected.Set (el[j]);
-		}
-	    }
-	}
-      cout << "." << flush;
-    }
-  while (changed);
-  cout << endl;
-
-  for (i = 1; i <= mesh.GetNE(); i++)
-    {
-      const Element & el = mesh.VolumeElement(i);
-      int hasnot = 0;
-      if (el[0])
-	{
-	  for (j = 0; j < 4; j++)
-	    {
-	      if (!connected.Test(el[j]))
-		hasnot = 1;
-	    }
-	  if (hasnot)
-	    mesh.VolumeElement(i).Delete();
-	}
-    }
-
-  mesh.Compress();
-  
-  mesh.FindOpenElements();
-  BitArray locked(mesh.GetNP());
-  locked.Set();
-  for (i = 1; i <= mesh.GetNOpenElements(); i++)
-    for (j = 1; j <= 3; j++)
-      locked.Clear (mesh.OpenElement(i).PNum(j));
-
-  for (i = 1; i <= locked.Size(); i++)
-    if (locked.Test(i))
-      {
-	mesh.AddLockedPoint (i);
-      }
-
-
-
-  
-  ARRAY<int> pmat(onp);
-
-  for (i = 1; i <= onp; i++)
-    pmat.Elem(i) = mesh.AddPoint (othermesh.Point(i));
-
-  int fnum = 
-    mesh.AddFaceDescriptor (FaceDescriptor(0,0,1,0));
-
-  for (i = 1; i <= othermesh.GetNSE(); i++)
-    {
-      Element2d tri = othermesh.SurfaceElement(i);
-      for (j = 1; j <= 3; j++)
-	tri.PNum(j) = pmat.Get(tri.PNum(j));
-      tri.SetIndex(fnum);
-      mesh.AddSurfaceElement (tri);
-    }
-
-  for (i = 1; i <= onp; i++)
-    mesh.AddLockedPoint (pmat.Elem(i));
-
-  mesh.CalcSurfacesOfNode();
-  mesh.CalcLocalH();
-}
-
-
-
-
-void HelmholtzMesh (Mesh & mesh)
-{
-  int i, j;
-  double ri, ra, rinf;
-
-  cout << "ri = ";
-  cin >> ri;
-  cout << "ra = ";
-  cin >> ra;
-  cout << "rinf = ";
-  cin >> rinf;
-
-  double det = ri * ra * rinf - ri * ri * rinf;
-  double a = (ri - rinf) / det;
-  double b = (ri*ri - ra * rinf) / det;
-  for (i = 1; i <= mesh.GetNP(); i++)
-    {
-      Point3d & p = mesh.Point(i);
-      double rold = sqrt (sqr(p.X()) + sqr(p.Y()) + sqr(p.Z()));
-      if (rold < ri) continue;
-
-      double rnew = 1 / (a * rold - b);
-      double fac = rnew / rold;
-      p.X() *= fac;
-      p.Y() *= fac;
-      p.Z() *= fac;
-    }
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/specials.hpp b/contrib/Netgen/libsrc/meshing/specials.hpp
deleted file mode 100644
index 700ba4596bf705f260ca5d7b355d5bd35c96fe7b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/specials.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef FILE_SPECIALS
-#define FILE_SPECIALS
-
-/*
-
-  Very special implementations ..
-  
- */
-
-
-///
-extern void CutOffAndCombine (Mesh & mesh, const Mesh & othermesh);
-
-extern void HelmholtzMesh (Mesh & mesh);
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/tetrarls.cpp b/contrib/Netgen/libsrc/meshing/tetrarls.cpp
deleted file mode 100644
index cb28648b6a641e8d50527d51dac512f0d9273847..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/tetrarls.cpp
+++ /dev/null
@@ -1,1466 +0,0 @@
-namespace netgen
-{
-const char * tetrules[] = {
-"tolfak 0.5\n",\
-"\n",\
-"rule \"Free Tetrahedron\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0);\n",\
-"(0.5, 0.866, 0);\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.288, -0.816)\n",\
-"	{ 0.333 X1, 0.333 X2, 0.333 X3 }\n",\
-"	{ 0.333 Y1, 0.333 Y2, 0.333 Y3 } { };\n",\
-"\n",\
-"newfaces\n",\
-"(4, 1, 2);\n",\
-"(4, 2, 3);\n",\
-"(4, 3, 1);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1.6 P4, -0.2 P1, -0.2 P2, -0.2 P3 };\n",\
-"{ -0.5 P1, 0.5 P2, 0.5 P3, 0.5 P4 };\n",\
-"{ 0.5 P1, -0.5 P2, 0.5 P3, 0.5 P4 };\n",\
-"{ 0.5 P1, 0.5 P2, -0.5 P3, 0.5 P4 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron 60\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"flags c;\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 } ;\n",\
-"(0.5, 0.866, 0) { 0.5 };\n",\
-"(0.5, 0.288, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 4, 3);\n",\
-"(4, 2, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ -0.35 P1, 0.45 P2, 0.45 P3, 0.45 P4 };\n",\
-"{ 0.45 P1, -0.35 P2, 0.45 P3, 0.45 P4 };\n",\
-"{ -0.05 P1, -0.05 P2, 0.7 P3, 0.4 P4 };\n",\
-"\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.3333 P2, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.65 P3, 0.35 P4 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron 60 with edge(1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"flags c;\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.8 };\n",\
-"(0.5, 0.866, 0) { 0.8 };\n",\
-"(0.5, 0.288, -0.816) { 0.8 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"\n",\
-"mapedges\n",\
-"(3, 4);\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 4, 3);\n",\
-"(4, 2, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.4 P1, 0.4 P4, 0.4 P3, -0.2 P2 };\n",\
-"{ 0.4 P2, 0.4 P4, 0.4 P3, -0.2 P1 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P4, 0.3334 P3 };\n",\
-"{ 0.3333 P2, 0.3333 P4, 0.3334 P3 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron Vis a Vis Point (1)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 0.866, 0) { 0.5 };\n",\
-"(0.5, 0.288, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(4, 3, 1);\n",\
-"(4, 2, 3);\n",\
-"(4, 1, 2);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ -0.5 P1, 0.5 P2, 0.5 P3, 0.5 P4 };\n",\
-"{ 0.5 P1, -0.5 P2, 0.5 P3, 0.5 P4 };\n",\
-"{ 0.5 P1, 0.5 P2, -0.5 P3, 0.5 P4 };\n",\
-"{ 0.8 P1, -0.1 P2, -0.1 P3, 0.4 P4 };\n",\
-"{ -0.1 P1, 0.8 P2, -0.1 P3, 0.4 P4 };\n",\
-"{ -0.1 P1, -0.1 P2, 0.8 P3, 0.4 P4 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.3333 P2, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P2, 0.3334 P4 };\n",\
-"{ 0.7 P1, 0.3 P4 };\n",\
-"{ 0.7 P2, 0.3 P4 };\n",\
-"{ 0.7 P3, 0.3 P4 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron Vis a Vis Point with edge(1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 0.866, 0) { 0.5 };\n",\
-"(0.5, 0.288, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"\n",\
-"mapedges\n",\
-"(1, 4);\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(4, 3, 1);\n",\
-"(4, 2, 3);\n",\
-"(4, 1, 2);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ -0.35 P1, 0.45 P2, 0.45 P3, 0.45 P4 };\n",\
-"{ 0.45 P1, -0.35 P2, 0.45 P3, 0.45 P4 };\n",\
-"{ 0.45 P1, 0.45 P2, -0.35 P3, 0.45 P4 };\n",\
-"{ -0.05 P1, 0.7 P2, -0.05 P3, 0.4 P4 };\n",\
-"{ -0.05 P1, -0.05 P2, 0.7 P3, 0.4 P4 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.3333 P2, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P2, 0.3334 P4 };\n",\
-"{ 0.65 P2, 0.35 P4 };\n",\
-"{ 0.65 P3, 0.35 P4 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron Vis a Vis Point with 2 edges (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 0.866, 0) { 0.5 };\n",\
-"(0.5, 0.288, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"\n",\
-"mapedges\n",\
-"(1, 4);\n",\
-"(2, 4);\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(4, 3, 1);\n",\
-"(4, 2, 3);\n",\
-"(4, 1, 2);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ -0.35 P1, 0.45 P2, 0.45 P3, 0.45 P4 };\n",\
-"{ 0.45 P1, -0.35 P2, 0.45 P3, 0.45 P4 };\n",\
-"{ 0.45 P1, 0.45 P2, -0.35 P3, 0.45 P4 };\n",\
-"{ -0.05 P1, -0.05 P2, 0.7 P3, 0.4 P4 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.3333 P2, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P2, 0.3334 P4 };\n",\
-"{ 0.65 P3, 0.35 P4 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron Vis a Vis Point with 3 edges (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 0.866, 0) { 0.5 };\n",\
-"(0.5, 0.288, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"\n",\
-"mapedges\n",\
-"(1, 4);\n",\
-"(2, 4);\n",\
-"(3, 4);\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(4, 3, 1);\n",\
-"(4, 2, 3);\n",\
-"(4, 1, 2);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ -0.35 P1, 0.45 P2, 0.45 P3, 0.45 P4 };\n",\
-"{ 0.45 P1, -0.35 P2, 0.45 P3, 0.45 P4 };\n",\
-"{ 0.45 P1, 0.45 P2, -0.35 P3, 0.45 P4 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.3333 P2, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P3, 0.3334 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P2, 0.3334 P4 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron Vis a Vis Triangle (1)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 0.866, 0) { 0.5 };\n",\
-"(0, 0, -0.816) { 0.5 };\n",\
-"(1, 0, -0.816) { 0.5 };\n",\
-"(0.5, 0.866, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(4, 6, 5) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 4);\n",\
-"(2, 5, 4);\n",\
-"(2, 3, 6);\n",\
-"(2, 6, 5);\n",\
-"(3, 1, 4);\n",\
-"(3, 4, 6);\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"(4, 2, 3, 6);\n",\
-"(4, 2, 6, 5);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ -0.2 P1, 0.35 P2, 0.35 P3, -0.2 P4, 0.35 P5, 0.35 P6 };\n",\
-"{ 0.35 P1, -0.2 P2, 0.35 P3, 0.35 P4, -0.2 P5, 0.35 P6 };\n",\
-"{ 0.35 P1, 0.35 P2, -0.2 P3, 0.35 P4, 0.35 P5, -0.2 P6 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Octaeder 1\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.95 };\n",\
-"(0.5, 0.866, 0) { 0.95 };\n",\
-"(0.5, -0.288, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(1, 0.578, -0.816) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4} { 0.5 Z3, 0.5 Z4 };\n",\
-"(0, 0.578, -0.816) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4} { 0.5 Z3, 0.5 Z4 };\n",\
-"\n",\
-"newfaces\n",\
-"(2, 3, 5);\n",\
-"(3, 1, 6);\n",\
-"(3, 6, 5);\n",\
-"(2, 5, 4);\n",\
-"(1, 4, 6);\n",\
-"(4, 5, 6);\n",\
-"\n",\
-"elements\n",\
-"(3, 4, 1, 2);\n",\
-"(3, 4, 2, 5);\n",\
-"(3, 4, 5, 6);\n",\
-"(3, 4, 6, 1);\n",\
-"\n",\
-"freezone\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 X2 } { } { };\n",\
-"(0.5, 0.866, 0) { 1 X3 } { 1 Y3 } { };\n",\
-"(0.5, -0.288, -0.816) { 1 X4 } { 1 Y4 } { 1 Z4 };\n",\
-"(-0.5, 1, -1.5) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4 } { 1 Z4 };\n",\
-"( 1.5, 1, -1.5) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4 } { 1 Z4 };\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Octaeder 2\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.95 };\n",\
-"(0.5, 0.866, 0) { 0.95 };\n",\
-"(0.5, -0.288, -0.816) { 0.5 };\n",\
-"(1, 0.578, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0, 0.578, -0.816) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4} { 0.5 Z3, 0.5 Z4 };\n",\
-"\n",\
-"newfaces\n",\
-"(2, 3, 5);\n",\
-"(3, 1, 6);\n",\
-"(3, 6, 5);\n",\
-"(2, 5, 4);\n",\
-"(1, 4, 6);\n",\
-"(4, 5, 6);\n",\
-"\n",\
-"elements\n",\
-"(3, 4, 1, 2);\n",\
-"(3, 4, 2, 5);\n",\
-"(3, 4, 5, 6);\n",\
-"(3, 4, 6, 1);\n",\
-"\n",\
-"freezone\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 X2 } { } { };\n",\
-"(0.5, 0.866, 0) { 1 X3 } { 1 Y3 } { };\n",\
-"(0.5, -0.288, -0.816) { 1 X4 } { 1 Y4 } { 1 Z4 };\n",\
-"(1, 0.578, -0.816) { 1 X5 } { 1 Y5 } { 1 Z5 };\n",\
-"\n",\
-"(0.9, 0.097, -0.544) { 0.333 X2, 0.333 X4, 0.333 X5 }\n",\
-"                     { 0.333 Y2, 0.333 Y4, 0.333 Y5 }\n",\
-"                     { 0.333 Z2, 0.333 Z4, 0.333 Z5 };\n",\
-"(0.9, 0.481, -0.272) { 0.333 X2, 0.333 X3, 0.333 X5 }\n",\
-"                     { 0.333 Y2, 0.333 Y3, 0.333 Y5 }\n",\
-"                     { 0.333 Z2, 0.333 Z3, 0.333 Z5 };\n",\
-"\n",\
-"(-0.5, 1, -1.5) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4 } { 0.5 Z4, 0.5 Z5 };\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"rule \"Octaeder 2a\"\n",\
-"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.95 };\n",\
-"(0.5, 0.866, 0) { 0.95 };\n",\
-"(0.5, -0.288, -0.816) { 0.5 };\n",\
-"(1, 0.578, -0.816) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(3, 2, 5) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0, 0.578, -0.816)\n",\
-"	{ -1 X2, 1 X3, 1 X4 }\n",\
-"	{ -1 Y2, 1 Y3, 1 Y4 }\n",\
-"	{ -1 Z2, 1 Z3, 1 Z4 };\n",\
-"\n",\
-"newfaces\n",\
-"(1, 2, 4);\n",\
-"(3, 1, 6);\n",\
-"(3, 6, 5);\n",\
-"(2, 5, 4);\n",\
-"(1, 4, 6);\n",\
-"(4, 5, 6);\n",\
-"\n",\
-"elements\n",\
-"(3, 4, 1, 2);\n",\
-"(3, 4, 2, 5);\n",\
-"(3, 4, 5, 6);\n",\
-"(3, 4, 6, 1);\n",\
-"\n",\
-"freezone\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 X2 } { } { };\n",\
-"(0.5, 0.866, 0) { 1 X3 } { 1 Y3 } { };\n",\
-"(0.5, -0.288, -0.816) { 1 X4 } { 1 Y4 } { 1 Z4 };\n",\
-"(1, 0.578, -0.816) { 1 X5 } { 1 Y5 } { 1 Z5 };\n",\
-"\n",\
-"(0.9, 0.097, -0.544) { 0.333 X2, 0.333 X4, 0.333 X5 }\n",\
-"                     { 0.333 Y2, 0.333 Y4, 0.333 Y5 }\n",\
-"                     { 0.333 Z2, 0.333 Z4, 0.333 Z5 };\n",\
-"\n",\
-"(0.5, -0.097, -0.272) { 0.333 X2, 0.333 X4, 0.333 X1 }\n",\
-"                     { 0.333 Y2, 0.333 Y4, 0.333 Y1 }\n",\
-"                     { 0.333 Z2, 0.333 Z4, 0.333 Z1 };\n",\
-"\n",\
-"(-0.5, 1, -1.5) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4 } { 0.5 Z4, 0.5 Z5 };\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Pyramid 1\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 };\n",\
-"(0.5, 0.866, 0) { 1 };\n",\
-"(0.5, -0.288, -0.816) { 1 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(1, 0.578, -0.816) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4} { 0.5 Z3, 0.5 Z4 };\n",\
-"\n",\
-"newfaces\n",\
-"(1, 4, 3);\n",\
-"(2, 3, 5);\n",\
-"(2, 5, 4);\n",\
-"(4, 5, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"(4, 2, 3, 5);\n",\
-"\n",\
-"\n",\
-"freezone\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 X2 } { } { };\n",\
-"(0.5, 0.866, 0) { 1 X3 } { 1 Y3 } { };\n",\
-"(0.5, -0.288, -0.816) { 1 X4 } { 1 Y4 } { 1 Z4 };\n",\
-"(0, 1, -1) { 0.5 X3, 0.5 X4 } { 1 Y3 } { 1 Z4 };\n",\
-"(1.5, 1, -1.5) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4} { 0.5 Z3, 0.5 Z4 };\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron 2 times 60\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.3 };\n",\
-"(0.5, 0.866, 0) { 0.3 };\n",\
-"(0.5, 0.288, -0.816) { 0.3 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(2, 4, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"(1, 4, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.4 P1, 0.4 P4, 0.4 P3, -0.2 P2 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 0.3333 P1, 0.3333 P3, 0.3334 P4 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Fill Tetrahedron (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.2 };\n",\
-"(0.5, 0.866, 0) { 0.2 };\n",\
-"(0.5, 0.288, -0.816) { 0.2 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(2, 4, 3) del;\n",\
-"(3, 4, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newfaces\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron 120 (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 };\n",\
-"(0.5, 0.866, 0) { 1 };\n",\
-"(0.5, -0.674, -0.544) { 1 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.288, -0.816)\n",\
-"	{ -0.5 X1, -0.5 X2, 1 X3, 1 X4 }\n",\
-"	{ -0.5 Y1, -0.5 Y2, 1 Y3, 1 Y4}\n",\
-"	{ -0.5 Z1, -0.5 Z2, 1 Z3, 1 Z4};\n",\
-"\n",\
-"newfaces\n",\
-"(1, 5, 3);\n",\
-"(3, 5, 2);\n",\
-"(1, 4, 5);\n",\
-"(2, 5, 4);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 5);\n",\
-"(1, 4, 2, 5);\n",\
-"\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1.3 P5, -0.3 P1 };\n",\
-"{ 1.3 P5, -0.3 P2 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P5 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron 2 times 120 (1)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 };\n",\
-"(0.5, 0.866, 0) { 1 };\n",\
-"(0.5, -0.674, -0.544) { 0.8 };\n",\
-"(1.334, 0.77, -0.544) { 0.8 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(3, 2, 5) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.288, -0.816) { 0.25 X1, -0.5 X2, 0.25 X3, 0.5 X4, 0.5 X5 }\n",\
-"		 { 0.25 Y1, -0.5 Y2, 0.25 Y3, 0.5 Y4, 0.5 Y5 }\n",\
-"		 { 0.25 Z1, -0.5 Z2, 0.25 Z3, 0.5 Z4, 0.5 Z5 };\n",\
-"\n",\
-"newfaces\n",\
-"(6, 3, 1);\n",\
-"(6, 1, 4);\n",\
-"(6, 4, 2);\n",\
-"(6, 2, 5);\n",\
-"(6, 5, 3);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 6);\n",\
-"(1, 4, 2, 6);\n",\
-"(2, 5, 3, 6);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1.4 P6, -0.4 P2 };\n",\
-"{ 1.4 P6, -0.4 P1 };\n",\
-"{ 1.4 P6, -0.4 P3 };\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"four Tetrahedron non convex (4)\"\n",\
-"\n",\
-"quality 4\n",\
-"flags l;\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.1 };\n",\
-"(0.5, 1, 0) { 0.1 };\n",\
-"(0.5, 0, -1) { 0.1 };\n",\
-"(0.5, 0.3, -0.3) { 0.1 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(1, 5, 4) del;\n",\
-"(1, 3, 5) del;\n",\
-"\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.1, -0.1)\n",\
-"	 { 0.333 X1, 0.333 X2, 0.334 X5 }\n",\
-"	 { 0.333 Y1, 0.333 Y2, 0.334 Y5 }\n",\
-"	 { 0.333 Z1, 0.333 Z2, 0.334 Z5 };\n",\
-"\n",\
-"newfaces\n",\
-"(6, 2, 3) del;\n",\
-"(6, 4, 2) del;\n",\
-"(6, 5, 4) del;\n",\
-"(6, 3, 5) del;\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 6);\n",\
-"(1, 4, 2, 6);\n",\
-"(1, 5, 4, 6);\n",\
-"(1, 3, 5, 6);\n",\
-"\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1.5 P6, -0.5 P1 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"\n",\
-"\n",\
-"\n",\
-"freeset\n",\
-"1 6 2 3;\n",\
-"\n",\
-"freeset\n",\
-"1 6 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 6 5 4;\n",\
-"\n",\
-"freeset\n",\
-"1 6 4 2;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"five Tetrahedron non convex (4)\"\n",\
-"\n",\
-"quality 4\n",\
-"flags l;\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 1, 0) { 0.5 };\n",\
-"(0, 0.8, -0.2) { 0.5 };\n",\
-"(0, 0.2, -0.8) { 0.5 };\n",\
-"(0.5, 0, -1) { 0.5 };\n",\
-"\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 3, 4) del;\n",\
-"(1, 4, 5) del;\n",\
-"(1, 5, 6) del;\n",\
-"(1, 6, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.1, 0.1, -0.1)\n",\
-"	 { 0.75 X1, 0.05 X2, 0.05 X3, 0.05 X4, 0.05 X5, 0.05 X6 }\n",\
-"	 { 0.75 Y1, 0.05 Y2, 0.05 Y3, 0.05 Y4, 0.05 Y5, 0.05 Y6 }\n",\
-"	 { 0.75 Z1, 0.05 Z2, 0.05 Z3, 0.05 Z4, 0.05 Z5, 0.05 Z6 };\n",\
-"\n",\
-"newfaces\n",\
-"(7, 2, 3);\n",\
-"(7, 3, 4);\n",\
-"(7, 4, 5);\n",\
-"(7, 5, 6);\n",\
-"(7, 6, 2);\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 7);\n",\
-"(1, 3, 4, 7);\n",\
-"(1, 4, 5, 7);\n",\
-"(1, 5, 6, 7);\n",\
-"(1, 6, 2, 7);\n",\
-"\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 1.5 P7, -0.5 P1 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"{ 1 P7 };\n",\
-"\n",\
-"\n",\
-"\n",\
-"freeset\n",\
-"1 7 2 3;\n",\
-"\n",\
-"freeset\n",\
-"1 7 3 4;\n",\
-"\n",\
-"freeset\n",\
-"1 7 4 5;\n",\
-"\n",\
-"freeset\n",\
-"1 7 5 6;\n",\
-"\n",\
-"freeset\n",\
-"1 7 6 2;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"four Tetrahedron non convex (6)\"\n",\
-"\n",\
-"quality 6\n",\
-"flags l;\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 1, 0) { 0.5 };\n",\
-"(0.5, 0, -1) { 0.5 };\n",\
-"(0.5, 0.3, -0.3) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(1, 5, 4) del;\n",\
-"(1, 3, 5) del;\n",\
-"\n",\
-"\n",\
-"newpoints\n",\
-"(0.095, 0.003, -0.003)\n",\
-"	 { 0.9 X1, 0.09 X2, 0.01 X5 }\n",\
-"	 { 0.9 Y1, 0.09 Y2, 0.01 Y5 }\n",\
-"	 { 0.9 Z1, 0.09 Z2, 0.01 Z5 };\n",\
-"\n",\
-"newfaces\n",\
-"(6, 2, 3) del;\n",\
-"(6, 4, 2) del;\n",\
-"(6, 5, 4) del;\n",\
-"(6, 3, 5) del;\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 6);\n",\
-"(1, 4, 2, 6);\n",\
-"(1, 5, 4, 6);\n",\
-"(1, 3, 5, 6);\n",\
-"\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1.499 P6, -0.5 P1, 0.001 P2 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"\n",\
-"\n",\
-"\n",\
-"freeset\n",\
-"1 6 2 3;\n",\
-"\n",\
-"freeset\n",\
-"1 6 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 6 5 4;\n",\
-"\n",\
-"freeset\n",\
-"1 6 4 2;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"four Tetrahedron non convex (6)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 1, 0) { 0.5 };\n",\
-"(0.5, 0, -1) { 0.5 };\n",\
-"(0.5, 0.4, -0.4) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(4, 5, 2) del;\n",\
-"(5, 3, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.925, 0.02, -0.02)\n",\
-"	 { 0.05 X1, 0.9 X2, 0.05 X5 }\n",\
-"	 { 0.05 Y1, 0.9 Y2, 0.05 Y5 }\n",\
-"	 { 0.05 Z1, 0.9 Z2, 0.05 Z5 };\n",\
-"\n",\
-"newfaces\n",\
-"(3, 1, 6);\n",\
-"(1, 4, 6);\n",\
-"(4, 5, 6);\n",\
-"(5, 3, 6);\n",\
-"\n",\
-"elements\n",\
-"(3, 1, 2, 6);\n",\
-"(1, 4, 2, 6);\n",\
-"(4, 5, 2, 6);\n",\
-"(5, 3, 2, 6);\n",\
-"\n",\
-"orientations\n",\
-"(3, 1, 2, 5);\n",\
-"(1, 4, 2, 5);\n",\
-"(2, 4, 5, 1);\n",\
-"(3, 2, 5, 1);\n",\
-"(5, 4, 2, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1.5 P6, -0.5 P2 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"{ 1 P6 };\n",\
-"\n",\
-"freeset\n",\
-"3 1 2 6;\n",\
-"\n",\
-"freeset\n",\
-"1 4 2 6;\n",\
-"\n",\
-"freeset\n",\
-"4 5 2 6;\n",\
-"\n",\
-"freeset\n",\
-"5 3 2 6;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"three Tetrahedron non convex (4)\"\n",\
-"\n",\
-"quality 4\n",\
-"flags l;\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 1, 0) { 0.5 };\n",\
-"(0.5, 0, -1) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(1, 3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.25, -0.25)\n",\
-"	 { 0.25 X1, 0.25 X2, 0.25 X3, 0.25 X4 }\n",\
-"	 { 0.25 Y1, 0.25 Y2, 0.25 Y3, 0.25 Y4 }\n",\
-"	 { 0.25 Z1, 0.25 Z2, 0.25 Z3, 0.25 Z4 };\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3);\n",\
-"(5, 4, 2);\n",\
-"(5, 3, 4);\n",\
-"\n",\
-"elements\n",\
-"(2, 3, 1, 5);\n",\
-"(3, 4, 1, 5);\n",\
-"(4, 2, 1, 5;\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 4, 3);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1.5 P5, -0.5 P1 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"freeset\n",\
-"1 4 2 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"three Tetrahedron non convex (6)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 1, 0) { 0.5 };\n",\
-"(0.5, 0, -1) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(1, 3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.2, 0.1, -0.1)\n",\
-"	 { 0.7 X1, 0.1 X2, 0.1 X3, 0.1 X4 }\n",\
-"	 { 0.7 Y1, 0.1 Y2, 0.1 Y3, 0.1 Y4 }\n",\
-"	 { 0.7 Z1, 0.1 Z2, 0.1 Z3, 0.1 Z4 };\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3);\n",\
-"(5, 4, 2);\n",\
-"(5, 3, 4);\n",\
-"\n",\
-"elements\n",\
-"(2, 3, 1, 5);\n",\
-"(3, 4, 1, 5);\n",\
-"(4, 2, 1, 5;\n",\
-"\n",\
-"orientations\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1.5 P5, -0.5 P1 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 3 4 5;\n",\
-"\n",\
-"freeset\n",\
-"1 4 2 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"four Tetrahedron non convex (6)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 1, 0) { 0.5 };\n",\
-"(0.5, 0, -1) { 0.5 };\n",\
-"(0.5, 0.4, -0.4) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"(4, 5, 2) del;\n",\
-"(5, 3, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.7, 0.08, -0.08) { 0.6 X2, 0.2 X5 } { 0.2 Y5 } { 0.2 Z5 };\n",\
-"\n",\
-"newfaces\n",\
-"(3, 1, 6);\n",\
-"(1, 4, 6);\n",\
-"(4, 5, 6);\n",\
-"(5, 3, 6);\n",\
-"\n",\
-"elements\n",\
-"(3, 1, 2, 6);\n",\
-"(1, 4, 2, 6);\n",\
-"(4, 5, 2, 6);\n",\
-"(5, 3, 2, 6);\n",\
-"\n",\
-"\n",\
-"orientations\n",\
-"(3, 1, 2, 5);\n",\
-"(5, 1, 2, 4);\n",\
-"\n",\
-"freezone\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 X2 } { } { };\n",\
-"(0.5, 1, 0) { 1 X3 } { 1 Y3 } { };\n",\
-"(0.5, 0, -1) { 1 X4 } { 1 Y4 } { 1 Z4 };\n",\
-"(0.5, 0.4, -0.4) { 1 X5 } { 1 Y5 } { 1 Z5 };\n",\
-"(0.55, 0.12, -0.12) { 0.4 X2, 0.3 X5 } { 0.3 Y5 } { 0.3 Z5 };\n",\
-"\n",\
-"freeset\n",\
-"3 1 2 6;\n",\
-"\n",\
-"freeset\n",\
-"1 4 2 6;\n",\
-"\n",\
-"freeset\n",\
-"4 5 2 6;\n",\
-"\n",\
-"freeset\n",\
-"5 3 2 6;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron 2 in 60 (12)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 0.5 };\n",\
-"(0.5, 1, 0) { 0.5 };\n",\
-"(0.5, 0, -1) { 0.5 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.1, -0.1)\n",\
-"	{ 0.4 X1, 0.4 X2, 0.1 X3, 0.1 X4 }\n",\
-"	{ 0.4 Y1, 0.4 Y2, 0.1 Y3, 0.1 Y4 }\n",\
-"	{ 0.4 Z1, 0.4 Z2, 0.1 Z3, 0.1 Z4 };\n",\
-"\n",\
-"newfaces\n",\
-"(5, 2, 3);\n",\
-"(5, 3, 1);\n",\
-"(5, 4, 2);\n",\
-"(5, 1, 4);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 5);\n",\
-"(1, 2, 5, 4);\n",\
-"\n",\
-"freezone2\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1.5 P5, -0.25 P1, -0.25 P2 };\n",\
-"\n",\
-"freezonelimit\n",\
-"{ 1 P1 };\n",\
-"{ 1 P2 };\n",\
-"{ 1 P3 };\n",\
-"{ 1 P4 };\n",\
-"{ 1 P5 };\n",\
-"\n",\
-"freeset\n",\
-"1 2 3 5;\n",\
-"\n",\
-"freeset\n",\
-"1 2 4 5;\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Tetrahedron 120, but more than 180 (13)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 };\n",\
-"(0.5, 0.866, 0) { 1 };\n",\
-"(0.5, -0.866, 0) { 1 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"(1, 4, 2);\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0, -0.3) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4} { 0.5 Z3, 0.5 Z4 };\n",\
-"\n",\
-"newfaces\n",\
-"(1, 5, 3);\n",\
-"(3, 5, 2);\n",\
-"(2, 5, 1);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 5);\n",\
-"\n",\
-"\n",\
-"freezone\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 X2 } { } { };\n",\
-"(0.5, 0.866, 0) { 1 X3 } { 1 Y3 } { };\n",\
-"(0.5, -0.1, -0.4)  { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4} { 0.5 Z3, 0.5 Z4 };\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Free Tetrahedron (14)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1.0 };\n",\
-"(0.5, 0.866, 0) { 1.0 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.288, -0.2) { 0.333 X2, 0.333 X3 } { 0.333 Y3 } { };\n",\
-"\n",\
-"newfaces\n",\
-"(4, 1, 2);\n",\
-"(4, 2, 3);\n",\
-"(4, 3, 1);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"freezone\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 X2 } { } { };\n",\
-"(0.5, 0.866, 0) { 1 X3 } { 1 Y3 } { };\n",\
-"(0.5, 0.288, -0.25) { 0.333 X2, 0.333 X3 } { 0.333 Y3 } { };\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Free Tetrahedron (15)\"\n",\
-"\n",\
-"quality 100\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1.0 };\n",\
-"(0.5, 0.866, 0) { 1.0 };\n",\
-"\n",\
-"mapfaces\n",\
-"(1, 2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.288, -0.1) { 0.333 X2, 0.333 X3 } { 0.333 Y3 } { };\n",\
-"\n",\
-"newfaces\n",\
-"(4, 1, 2);\n",\
-"(4, 2, 3);\n",\
-"(4, 3, 1);\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3, 4);\n",\
-"\n",\
-"freezone\n",\
-"(0, 0, 0);\n",\
-"(1, 0, 0) { 1 X2 } { } { };\n",\
-"(0.5, 0.866, 0) { 1 X3 } { 1 Y3 } { };\n",\
-"(0.5, 0.288, -0.15) { 0.333 X2, 0.333 X3 } { 0.333 Y3 } { };\n",\
-"\n",\
-"endrule\n",
-0};
-}
diff --git a/contrib/Netgen/libsrc/meshing/topology.cpp b/contrib/Netgen/libsrc/meshing/topology.cpp
deleted file mode 100644
index 9c0e79d531d6cfe863fe5a152a60eba7efba97c3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/topology.cpp
+++ /dev/null
@@ -1,1595 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-
-namespace netgen
-{
-
-MeshTopology ::  MeshTopology (const Mesh & amesh)
-  : mesh(amesh)
-{
-  buildedges = 1;
-  buildfaces = 1;
-  vert2element = 0;
-  vert2surfelement = 0;
-  vert2segment = 0;
-  timestamp = -1;
-
-  edge2vert.SetName ("edge2vert");
-  face2vert.SetName ("face2vert");
-  edges.SetName ("el2edge");
-  faces.SetName ("el2face");
-  surfedges.SetName ("surfel2edge");
-  segedges.SetName ("segment2edge");
-  surffaces.SetName ("surfel2face");
-  surf2volelement.SetName ("surfel2el");
-  face2surfel.SetName ("face2surfel");
-}
-
-MeshTopology :: ~MeshTopology ()
-{
-  delete vert2element;
-  delete vert2surfelement;
-  delete vert2segment;
-}
-
-void MeshTopology :: Update()
-{
-  int i, j, k;
-
-  if (timestamp > mesh.GetTimeStamp()) return;
-
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-  int nseg = mesh.GetNSeg();
-  int np = mesh.GetNP();
-  int nv = mesh.GetNV();
-  int nfa = 0;
-  int ned = edge2vert.Size();
-
-  PrintMessage (3, "Update mesh topology");
-
-  (*testout) << "ne   = " << ne << endl;
-  (*testout) << "nse  = " << nse << endl;
-  (*testout) << "nseg = " << nseg << endl;
-  (*testout) << "np   = " << np << endl;
-  (*testout) << "nv   = " << nv << endl;
- 
-  delete vert2element;
-  delete vert2surfelement;
-  delete vert2segment;
-  ARRAY<int,PointIndex::BASE> cnt(nv);
-  ARRAY<int> vnums;
-
-  (*testout) << "tables deleted" << endl;
-
-  /*
-    generate:
-    vertex to element 
-    vertex to surface element
-    vertex to segment 
-   */
-
-  cnt = 0;
-  for (i = 1; i <= ne; i++)
-    {
-      const Element & el = mesh.VolumeElement(i);
-      int nelv = el.GetNV();
-      for (j = 1; j <= nelv; j++)
-	cnt[el.PNum(j)]++;
-    }
-
-  vert2element = new TABLE<int,PointIndex::BASE> (cnt);
-  for (i = 1; i <= ne; i++)
-    {
-      const Element & el = mesh.VolumeElement(i);
-      int nelv = el.GetNV();
-      for (j = 1; j <= nelv; j++)
-	vert2element->AddSave (el.PNum(j), i);
-    }
-
-  cnt = 0;
-  for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-    {
-      const Element2d & el = mesh[sei];
-      int nelv = el.GetNV();
-      for (j = 0; j < nelv; j++)
-	cnt[el[j]]++;
-    }
-
-  vert2surfelement = new TABLE<int,PointIndex::BASE> (cnt);
-  for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-    {
-      const Element2d & el = mesh[sei];
-      int nelv = el.GetNV();
-      for (j = 0; j < nelv; j++)
-	vert2surfelement->AddSave (el[j], sei+1);
-    }
-
-
-  cnt = 0;
-  for (i = 1; i <= nseg; i++)
-    {
-      const Segment & seg = mesh.LineSegment(i);
-      cnt[seg.p1]++;
-      cnt[seg.p2]++;
-    }
-
-  vert2segment = new TABLE<int,PointIndex::BASE> (cnt);
-  for (i = 1; i <= nseg; i++)
-    {
-      const Segment & seg = mesh.LineSegment(i);
-      vert2segment->AddSave (seg.p1, i);
-      vert2segment->AddSave (seg.p2, i);
-    }
-
-
-
-
-  if (buildedges)
-    {
-      PrintMessage (5, "Update edges ");
-      
-      edges.SetSize(ne);
-      surfedges.SetSize(nse); 
-      segedges.SetSize(nseg);
-
-      for (i = 1; i <= ne; i++)
-	for (j = 0; j < 12; j++)
-	  edges.Elem(i)[j] = 0;
-      for (i = 1; i <= nse; i++)
-	for (j = 0; j < 4; j++)
-	  surfedges.Elem(i)[j] = 0;
-
-      // keep existing edges
-      cnt = 0;
-      for (i = 0; i < edge2vert.Size(); i++)
-	cnt[edge2vert[i][0]]++;
-      TABLE<int,PointIndex::BASE> vert2edge (cnt);
-      for (i = 0; i < edge2vert.Size(); i++)
-	vert2edge.AddSave (edge2vert[i][0], i+1);
-
-      // ensure all coarse grid and intermediate level edges
-      cnt = 0;
-      for (i = 1; i <= mesh.mlbetweennodes.Size(); i++)
-	{
-	  int pa[2];
-	  pa[0] = mesh.mlbetweennodes.Get(i).I1();
-	  pa[1] = mesh.mlbetweennodes.Get(i).I2();
-	  if (pa[0] > pa[1]) Swap (pa[0], pa[1]);
-	  if (pa[0] > 0)
-	    cnt.Elem(pa[0])++;
-	}
-      TABLE<int,PointIndex::BASE> vert2vertcoarse (cnt);
-      for (i = 1; i <= mesh.mlbetweennodes.Size(); i++)
-	{
-	  int pa[2];
-	  pa[0] = mesh.mlbetweennodes.Get(i).I1();
-	  pa[1] = mesh.mlbetweennodes.Get(i).I2();
-	  if (pa[0] > pa[1]) swap (pa[0], pa[1]);
-	  if (pa[0] > 0)
-	    vert2vertcoarse.AddSave1 (pa[0], pa[1]);
-	}
-
-
-      ARRAY<int,PointIndex::BASE> edgenr(nv), edgeflag(nv);
-      for (i = PointIndex::BASE; i < nv+PointIndex::BASE; i++)
-	edgeflag[i] = 0;
-      ned = edge2vert.Size();
-      ARRAY<INDEX_3> missing;
-
-      for (i = 1; i <= nv; i++)
-	{
-	  for (j = 1; j <= vert2edge.EntrySize(i); j++)
-	    {
-	      int ednr = vert2edge.Get(i,j);
-	      int i2 = edge2vert.Get(ednr)[1];
-	      edgeflag.Elem(i2) = i;
-	      edgenr.Elem(i2) = ednr;
-	    }
-	  for (j = 1; j <= vert2vertcoarse.EntrySize(i); j++)
-	    {
-	      int v2 = vert2vertcoarse.Get(i,j);
-	      if (edgeflag.Get(v2) < i)
-		{
-		  ned++;
-		  edgenr.Elem(v2) = ned;
-		  edgeflag.Elem(v2) = i;
-		  missing.Append (INDEX_3(i,v2,ned));
-		}
-	    }
-
-	  for (j = 1; j <= vert2element->EntrySize(i); j++)
-	    {
-	      int elnr = vert2element->Get(i,j);
-	      const Element & el = mesh.VolumeElement (elnr);
-
-	      int neledges = GetNEdges (el.GetType());
-	      const ELEMENT_EDGE * eledges = GetEdges (el.GetType());
-	  
-	      for (k = 0; k < neledges; k++)
-		{
-		  INDEX_2 edge(el.PNum(eledges[k][0]),
-			       el.PNum(eledges[k][1]));
-	      
-		  int edgedir = (edge.I1() > edge.I2());
-		  if (edgedir) swap (edge.I1(), edge.I2());
-	     
-		  if (edge.I1() != i)
-		    continue;
-	     
-		  if (edgeflag.Get (edge.I2()) < i)
-		    {
-		      ned++;
-		      edgenr.Elem(edge.I2()) = ned;
-		      edgeflag.Elem(edge.I2()) = i;
-		    }
-
-		  int edgenum = edgenr.Elem(edge.I2());
-		  if (edgedir) edgenum *= -1;
-		  edges.Elem(elnr)[k] = edgenum;
-		}
-	    }
-
-	  for (j = 1; j <= vert2surfelement->EntrySize(i); j++)
-	    {
-	      int elnr = vert2surfelement->Get(i,j);
-	      const Element2d & el = mesh.SurfaceElement (elnr);
-
-	      int neledges = GetNEdges (el.GetType());
-	      const ELEMENT_EDGE * eledges = GetEdges (el.GetType());
-	  
-	      for (k = 0; k < neledges; k++)
-		{
-		  INDEX_2 edge(el.PNum(eledges[k][0]),
-			       el.PNum(eledges[k][1]));
-	      
-		  int edgedir = (edge.I1() > edge.I2());
-		  if (edgedir) swap (edge.I1(), edge.I2());
-	     
-		  if (edge.I1() != i)
-		    continue;
-	     
-		  if (edgeflag.Get (edge.I2()) < i)
-		    {
-		      ned++;
-		      edgenr.Elem(edge.I2()) = ned;
-		      edgeflag.Elem(edge.I2()) = i;
-		    }
-	      
-		  int edgenum = edgenr.Elem(edge.I2());
-		  if (edgedir) edgenum *= -1;
-		  surfedges.Elem(elnr)[k] = edgenum;
-		}
-	    }
-
-	  for (j = 1; j <= vert2segment->EntrySize(i); j++)
-	    {
-	      int elnr = vert2segment->Get(i,j);
-	      const Segment & el = mesh.LineSegment (elnr);
-
-	      INDEX_2 edge(el.p1, el.p2);
-	      
-	      int edgedir = (edge.I1() > edge.I2());
-	      if (edgedir) swap (edge.I1(), edge.I2());
-	      
-	      if (edge.I1() != i)
-		continue;
-	     
-	      if (edgeflag.Get (edge.I2()) < i)
-		{
-		  ned++;
-		  edgenr.Elem(edge.I2()) = ned;
-		  edgeflag.Elem(edge.I2()) = i;
-		}   
- 	      int edgenum = edgenr.Elem(edge.I2());
-
-	      if (edgedir) edgenum *= -1;
-	      segedges.Elem(elnr) = edgenum;
-	    }
-	}
-
-
-      edge2vert.SetSize (ned);
-      for (i = 1; i <= ne; i++)
-	{
-	  const Element & el = mesh.VolumeElement (i);
-      
-	  int neledges = GetNEdges (el.GetType());
-	  const ELEMENT_EDGE * eledges = GetEdges (el.GetType());
-	  
-	  for (k = 0; k < neledges; k++)
-	    {
-	      INDEX_2 edge(el.PNum(eledges[k][0]),
-			   el.PNum(eledges[k][1]));
-	  
-	      int edgedir = (edge.I1() > edge.I2());
-	      if (edgedir) swap (edge.I1(), edge.I2());
-
-	      int edgenum = abs (edges.Elem(i)[k]);
-
-	      edge2vert.Elem(edgenum)[0] = edge.I1();
-	      edge2vert.Elem(edgenum)[1] = edge.I2();
-	    }
-	}
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement (i);
-      
-	  int neledges = GetNEdges (el.GetType());
-	  const ELEMENT_EDGE * eledges = GetEdges (el.GetType());
-	  
-	  for (k = 0; k < neledges; k++)
-	    {
-	      INDEX_2 edge(el.PNum(eledges[k][0]),
-			   el.PNum(eledges[k][1]));
-	  
-	      int edgedir = (edge.I1() > edge.I2());
-	      if (edgedir) swap (edge.I1(), edge.I2());
-
-	      int edgenum = abs (surfedges.Elem(i)[k]);
-
-	      edge2vert.Elem(edgenum)[0] = edge.I1();
-	      edge2vert.Elem(edgenum)[1] = edge.I2();
-	    }
-	}
-
-      for (i = 1; i <= nseg; i++)
-	{
-	  const Segment & el = mesh.LineSegment (i);
-      
-	  INDEX_2 edge(el.p1, el.p2);
-	  int edgedir = (edge.I1() > edge.I2());
-	  if (edgedir) swap (edge.I1(), edge.I2());
-	  
-	  int edgenum = abs (segedges.Elem(i));
-	  
-	  edge2vert.Elem(edgenum)[0] = edge.I1();
-	  edge2vert.Elem(edgenum)[1] = edge.I2();
-	}
-
-      for (i = 1; i <= missing.Size(); i++)
-	{
-	  INDEX_3 i3 = missing.Get(i);
-	  edge2vert.Elem(i3.I3())[0] = i3.I1();
-	  edge2vert.Elem(i3.I3())[1] = i3.I2();
-	}
-	
-      /*
-      (*testout) << "edge table:" << endl;
-      (*testout) << "edge2vert:" << endl;
-      for (i = 1; i <= edge2vert.Size(); i++)
-	  (*testout) << "edge " << i << ", v1,2 = " << edge2vert.Elem(i)[0] << ", " << edge2vert.Elem(i)[1] << endl;
-      (*testout) << "surfedges:" << endl;
-      for (i = 1; i <= surfedges.Size(); i++)
-	  (*testout) << "el " << i << ", edges = " 
-		     << surfedges.Elem(i)[0] << ", "
-		     << surfedges.Elem(i)[1] << ", "
-		     << surfedges.Elem(i)[2] << endl;
-      */
-    }
-
-
-  //  cout << "build edges done" << endl;
-
-#ifdef OLD
-  if (buildedges == 2)
-    { // old style with hash-table
-      edges.SetSize(ne);
-      surfedges.SetSize(nse); 
-      INDEX_2_HASHTABLE<int> vert2edge(ne+nse+1);
-      
-      // keep coarse grid edges
-      for (i = 1; i <= ned; i++)
-	{
-	  INDEX_2 edge (edge2vert.Get(i)[0],
-			edge2vert.Get(i)[1]);
-	  edge.Sort ();
-	  vert2edge.Set (edge, i);
-	}
-      
-      
-      
-      for (i = 1; i <= ne; i++)
-	{
-	  const Element & el = mesh.VolumeElement(i);
-	  
-	  int neledges = GetNEdges (el.GetType());
-	  const ELEMENT_EDGE * eledges = GetEdges (el.GetType());
-	  
-	  for (j = 0; j < 12; j++)
-	    edges.Elem(i)[j] = 0;
-	  for (j = 0; j < neledges; j++)
-	    {
-	      int edgenum;
-	      int edgedir;
-	      
-	      INDEX_2 edge(el.PNum(eledges[j][0]),
-			   el.PNum(eledges[j][1]));
-	      
-	      edgedir = (edge.I1() > edge.I2());
-	      if (edgedir) swap (edge.I1(), edge.I2());
-	      
-	      if (vert2edge.Used (edge))
-		edgenum = vert2edge.Get(edge);
-	      else
-		{
-		  ned++;
-		  vert2edge.Set (edge, ned);
-		  edgenum = ned;
-		  /*
-		  edge2vert.SetSize(edge2vert.Size()+1);
-		  edge2vert.Last()[0] = edge.I1();
-		  edge2vert.Last()[1] = edge.I2();
-		  */
-		  edge2vert.Append (edge);
-		}
-	      
-	      if (edgedir) edgenum *= -1;
-	      edges.Elem(i)[j] = edgenum;
-	    }
-	}
-      
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement(i);
-	  
-	  int neledges = GetNEdges (el.GetType());
-	  const ELEMENT_EDGE * eledges = GetEdges (el.GetType());
-	  
-	  for (j = 0; j < 4; j++)
-	    surfedges.Elem(i)[j] = 0;
-	  for (j = 0; j < neledges; j++)
-	    {
-	      int edgenum;
-	      int edgedir;
-	      
-	      INDEX_2 edge(el.PNum(eledges[j][0]),
-			   el.PNum(eledges[j][1]));
-	      
-	      edgedir = (edge.I1() > edge.I2());
-	      if (edgedir) swap (edge.I1(), edge.I2());
-	      
-	      if (vert2edge.Used (edge))
-		edgenum = vert2edge.Get(edge);
-	      else
-		{
-		  ned++;
-		  vert2edge.Set (edge, ned);
-		  edgenum = ned;
-		  
-		  /*
-		  edge2vert.SetSize(edge2vert.Size()+1);
-		  edge2vert.Last()[0] = edge.I1();
-		  edge2vert.Last()[1] = edge.I2();
-		  */
-		  edge2vert.Append (edge);
-		  if (mesh.GetDimension() == 3 && mesh.GetNE())
-		    cerr << "surface edge: should be in use: "
-			 << edge.I1() << "-" << edge.I2() << endl;
-		}
-	      
-	      if (edgedir) edgenum *= -1;
-	      surfedges.Elem(i)[j] = edgenum;
-	    }
-	}
-      
-      
-      // find edges only in intermediate level
-      
-      for (i = 1; i <= np; i++)
-	{
-	  int parents[2];
-	  
-	  if (i <= mesh.mlbetweennodes.Size())
-	    {
-	      parents[0] = mesh.mlbetweennodes.Get(i).I1();
-	      parents[1] = mesh.mlbetweennodes.Get(i).I2();
-	    }
-	  else
-	    parents[0] = parents[1] = 0;
-	  
-	  if (parents[0] && parents[1])
-	    {
-	      INDEX_2 edge(parents[0], parents[1]);
-	      int edgedir = (edge.I1() > edge.I2());
-	      if (edgedir) swap (edge.I1(), edge.I2());
-	      
-	      if (!vert2edge.Used (edge))
-		{
-		  ned++;
-		  vert2edge.Set (edge, ned);
-		  /*
-		  edge2vert.SetSize(edge2vert.Size()+1);
-		  edge2vert.Last()[0] = edge.I1();
-		  edge2vert.Last()[1] = edge.I2();
-		  */
-		  edge2vert.Append (edge);
-		}
-	    }
-	}
-      
-      /*
-	cout << "edge2vert: ";
-	edge2vert.PrintMemInfo(cout);
-	cout << "edges: ";
-	edges.PrintMemInfo(cout);
-	cout << "hashtable: ";
-	vert2edge.PrintMemInfo(cout);
-      */
-
-      if (mesh.GetDimension() == 2)
-	{
-	  surffaces.SetSize(mesh.GetNSeg());
-	  for (i = 1; i <= mesh.GetNSeg(); i++)
-	    {
-	      const Segment & seg = mesh.LineSegment (i);
-
-	      INDEX_2 edge(seg.p1, seg.p2);
-	      int edgenum;
-	      int edgedir = (edge.I1() > edge.I2());
-	      if (edgedir) swap (edge.I1(), edge.I2());
-	      
-	      if (vert2edge.Used (edge))
-		edgenum = vert2edge.Get(edge);
-	      else
-		{
-		  ned++;
-		  vert2edge.Set (edge, ned);
-		  edgenum = ned;
-		  
-		  /*
-		  edge2vert.SetSize(edge2vert.Size()+1);
-		  edge2vert.Last()[0] = edge.I1();
-		  edge2vert.Last()[1] = edge.I2();
-		  */
-		  edge2vert.Append (edge);
-		}
-	      
-
-	      if (edgedir) edgenum *= -1;
-	      surffaces.Elem(i) = edgenum;
-	    }
-	}
-    }
-
-#endif  
-  
-
-  // generate faces
-  if (buildfaces) //  && mesh.GetDimension() == 3)
-    {
-      PrintMessage (5, "Update faces ");
-
-      faces.SetSize(ne);
-      surffaces.SetSize(nse);
-      
-      // face2vert.SetSize(0);  // keep old faces
-      nfa = face2vert.Size();
-      // INDEX_3_HASHTABLE<int> vert2face(ne+nse+1);
-      INDEX_3_CLOSED_HASHTABLE<int> vert2face(8*ne+2*nse+nfa+2);
-
-      for (i = 1; i <= face2vert.Size(); i++)
-	{
-	  INDEX_3 f;
-	  f.I1() = face2vert.Get(i)[0];
-	  f.I2() = face2vert.Get(i)[1];
-	  f.I3() = face2vert.Get(i)[2];
-	  vert2face.Set (f, i);
-	}
-      
-      for (i = 1; i <= ne; i++)
-	{
-	  const Element & el = mesh.VolumeElement (i);
-	  
-	  int nelfaces = GetNFaces (el.GetType());
-	  const ELEMENT_FACE * elfaces = GetFaces (el.GetType());
-	  
-	  for (j = 0; j < 6; j++)
-	    faces.Elem(i)[j] = 0;
-	  for (j = 0; j < nelfaces; j++)
-	    if (elfaces[j][3] == 0)
-	      
-	      { // triangle
-		
-		int facenum;
-		int facedir;
-		
-		INDEX_3 face(el.PNum(elfaces[j][0]),
-			     el.PNum(elfaces[j][1]),
-			     el.PNum(elfaces[j][2]));
-		
-		facedir = 0;
-		if (face.I1() > face.I2())
-		  {
-		    swap (face.I1(), face.I2());
-		    facedir += 1;
-		  }
-		if (face.I2() > face.I3())
-		  {
-		    swap (face.I2(), face.I3());
-		    facedir += 2;
-		  }
-		if (face.I1() > face.I2())
-		  {
-		    swap (face.I1(), face.I2());
-		    facedir += 4;
-		  }
-		
-		if (vert2face.Used (face))
-		  facenum = vert2face.Get(face);
-		else
-		  {
-		    nfa++;
-		    vert2face.Set (face, nfa);
-		    facenum = nfa;
-		    
-		    INDEX_4 hface;
-		    face2vert.Append (hface);
-		    // face2vert.SetSize(face2vert.Size()+1);
-		    face2vert.Last()[0] = face.I1();
-		    face2vert.Last()[1] = face.I2();
-		    face2vert.Last()[2] = face.I3();
-		    face2vert.Last()[3] = 0;
-
-		  }
-		
-		faces.Elem(i)[j] = 8*(facenum-1)+facedir+1;
-	      }
-	  
-	    else
-	      
-	      {
-		// quad
-		int facenum;
-		int facedir;
-		INDEX_4Q face4(el.PNum(elfaces[j][0]),
-			       el.PNum(elfaces[j][1]),
-			       el.PNum(elfaces[j][2]),
-			       el.PNum(elfaces[j][3]));
-		
-		facedir = 0;
-		if (min2 (face4.I1(), face4.I2()) > 
-		    min2 (face4.I4(), face4.I3())) 
-		  {  // z - flip
-		    facedir += 1; 
-		    swap (face4.I1(), face4.I4());
-		    swap (face4.I2(), face4.I3());
-		  }
-		if (min2 (face4.I1(), face4.I4()) >
-		    min2 (face4.I2(), face4.I3())) 
-		  {  // x - flip
-		    facedir += 2; 
-		    swap (face4.I1(), face4.I2());
-		    swap (face4.I3(), face4.I4());
-		  }
-		if (face4.I2() > face4.I4())
-		  {  // diagonal flip
-		    facedir += 4; 
-		    swap (face4.I2(), face4.I4());
-		  }
-		//		face4.Sort();
-		
-		INDEX_3 face(face4.I1(), face4.I2(), face4.I3());
-		
-		if (vert2face.Used (face))
-		  {
-		    facenum = vert2face.Get(face);
-		  }
-		else
-		  {
-		    nfa++;
-		    vert2face.Set (face, nfa);
-		    facenum = nfa;
-
-		    // face2vert.SetSize(face2vert.Size()+1);
-
-		    INDEX_4 hface;
-		    face2vert.Append (hface);
-		    face2vert.Last()[0] = face4.I1();
-		    face2vert.Last()[1] = face4.I2();
-		    face2vert.Last()[2] = face4.I3();
-		    face2vert.Last()[3] = face4.I4();
-
-		  }
-		
-		faces.Elem(i)[j] = 8*(facenum-1)+facedir+1;
-	      }
-	}
-
-      face2surfel.SetSize(nfa+nse);
-      for (i = 1; i <= face2surfel.Size(); i++)
-	face2surfel.Elem(i) = 0;
-
-      for (i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement (i);
-	  
-	  const ELEMENT_FACE * elfaces = GetFaces (el.GetType());
-	  
-	  if (elfaces[0][3] == 0)
-	    
-	    { // triangle
-	      
-	      int facenum;
-	      int facedir;
-	      
-	      INDEX_3 face(el.PNum(elfaces[0][0]),
-			   el.PNum(elfaces[0][1]),
-			   el.PNum(elfaces[0][2]));
-	      
-	      facedir = 0;
-	      if (face.I1() > face.I2())
-		{
-		  swap (face.I1(), face.I2());
-		  facedir += 1;
-		}
-	      if (face.I2() > face.I3())
-		{
-		  swap (face.I2(), face.I3());
-		  facedir += 2;
-		}
-	      if (face.I1() > face.I2())
-		{
-		  swap (face.I1(), face.I2());
-		  facedir += 4;
-		}
-	      
-	      if (vert2face.Used (face))
-		facenum = vert2face.Get(face);
-	      else
-		{
-		  nfa++;
-		  vert2face.Set (face, nfa);
-		  facenum = nfa;
-		  
-		  // face2vert.SetSize(face2vert.Size()+1);
-		  INDEX_4 hface;
-		  face2vert.Append (hface);
-		  face2vert.Last()[0] = face.I1();
-		  face2vert.Last()[1] = face.I2();
-		  face2vert.Last()[2] = face.I3();
-		  face2vert.Last()[3] = 0;
-		}
-	      
-	      surffaces.Elem(i) = 8*(facenum-1)+facedir+1;
-	      face2surfel.Elem(facenum) = i;
-	    }
-	  
-	  else
-	    
-	    {
-	      // quad
-	      int facenum;
-	      int facedir;
-	      
-	      INDEX_4Q face4(el.PNum(elfaces[0][0]),
-			     el.PNum(elfaces[0][1]),
-			     el.PNum(elfaces[0][2]),
-			     el.PNum(elfaces[0][3]));
-
-	      facedir = 0;
-	      if (min2 (face4.I1(), face4.I2()) > 
-		  min2 (face4.I4(), face4.I3())) 
-		{  // z - orientation
-		  facedir += 1; 
-		  swap (face4.I1(), face4.I4());
-		  swap (face4.I2(), face4.I3());
-		}
-	      if (min2 (face4.I1(), face4.I4()) >
-		  min2 (face4.I2(), face4.I3())) 
-		{  // x - orientation
-		  facedir += 2; 
-		  swap (face4.I1(), face4.I2());
-		  swap (face4.I3(), face4.I4());
-		}
-	      if (face4.I2() > face4.I4())
-		{ 
-		  facedir += 4; 
-		  swap (face4.I2(), face4.I4());
-		}
-	      
-	      INDEX_3 face(face4.I1(), face4.I2(), face4.I3());
-	      
-	      if (vert2face.Used (face))
-		facenum = vert2face.Get(face);
-	      else
-		{
-		  nfa++;
-		  vert2face.Set (face, nfa);
-		  facenum = nfa;
-		  
-		  // face2vert.SetSize(face2vert.Size()+1);
-		  INDEX_4 hface;
-		  face2vert.Append (hface);
-		  face2vert.Last()[0] = face4.I1();
-		  face2vert.Last()[1] = face4.I2();
-		  face2vert.Last()[2] = face4.I3();
-		  face2vert.Last()[3] = face4.I3();
-		}
-	      
-	      surffaces.Elem(i) = 8*(facenum-1)+facedir+1;
-	      face2surfel.Elem(facenum) = i;
-	    }
-	}
-
-      surf2volelement.SetSize (nse);
-      for (i = 1; i <= nse; i++)
-	{
-	  surf2volelement.Elem(i)[0] = 0;
-	  surf2volelement.Elem(i)[1] = 0;
-	}
-      for (i = 1; i <= ne; i++)
-	for (j = 0; j < 6; j++)
-	  {
-	    int fnum = (faces.Get(i)[j]-1) / 8 + 1;
-	    if (fnum > 0 && face2surfel.Elem(fnum))
-	      {
-		int sel = face2surfel.Elem(fnum);
-		surf2volelement.Elem(sel)[1] = 
-		  surf2volelement.Elem(sel)[0];
-		surf2volelement.Elem(sel)[0] = i;
-	      }
-	  }
-
-
-      face2vert.SetAllocSize (face2vert.Size());
-
-      /*
-	cout << "face2vert: ";
-	face2vert.PrintMemInfo(cout);
-	cout << "faces: ";
-	faces.PrintMemInfo(cout);
-	cout << "hashtable: ";
-	vert2face.PrintMemInfo(cout);
-      */
-
-
-      ARRAY<char> face_els(nfa), face_surfels(nfa);
-      face_els = 0;
-      face_surfels = 0;
-      ARRAY<int> hfaces;
-      for (i = 1; i <= ne; i++)
-	{
-	  GetElementFaces (i, hfaces);
-	  for (j = 0; j < hfaces.Size(); j++)
-	    face_els[hfaces[j]-1]++;
-	}
-      for (i = 1; i <= nse; i++)
-	face_surfels[GetSurfaceElementFace (i)-1]++;
-
-      if (ne)
-	{
-	  int cnt_err = 0;
-	  for (i = 0; i < nfa; i++)
-	    {
-	      (*testout) << "face " << i << " has " << int(face_els[i]) << " els, " 
-			 << int(face_surfels[i]) << " surfels, tot = "
-			 << face_els[i] + face_surfels[i] << endl; 
-	      
-	      if (face_els[i] + face_surfels[i] == 1)
-		{
-		  cnt_err++;
-		  (*testout) << "illegal face : " << i << endl;
-		  (*testout) << "points = " << face2vert[i] << endl;
-		  (*testout) << "pos = ";
-		  for (int j = 0; j < 4; j++)
-		    if (face2vert[i].I(j+1) >= 1)
-		      (*testout) << mesh[(PointIndex)face2vert[i].I(j+1)] << " ";
-		  (*testout) << endl;
-		}
-	    }
-	  if (cnt_err)
-	    cout << cnt_err << " elements are not matching !!!" << endl;
-	}
-    }
-  
-  /*
-    for (i = 1; i <= ne; i++)
-    {
-    (*testout) << "Element " << i << endl;
-    (*testout) << "edges: " << endl;
-    for (j = 0; j < 9; j++)
-    (*testout) << edges.Elem(i)[j] << " ";
-    (*testout) << "faces: " << endl;
-    for (j = 0; j < 6; j++)
-    (*testout) << faces.Elem(i)[j] << " ";
-    }
-  */
-  timestamp = NextTimeStamp();
-}
-
- 
-
-
-int MeshTopology :: GetNVertices (ELEMENT_TYPE et)
-{
-  switch (et)
-    {
-    case SEGMENT:
-    case SEGMENT3:
-      return 2;
-
-    case TRIG:
-    case TRIG6:
-      return 3;
-
-    case QUAD:
-    case QUAD6:
-    case QUAD8:
-      return 4;
-
-    case TET:
-    case TET10:
-      return 4;
-
-    case PYRAMID:
-      return 5;
-
-    case PRISM:
-    case PRISM12:
-      return 6;
-
-    case HEX:
-      return 8;
-
-    default:
-      cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-int MeshTopology :: GetNEdges (ELEMENT_TYPE et)
-{
-  switch (et)
-    {
-    case SEGMENT:
-    case SEGMENT3:
-      return 1;
-
-    case TRIG:
-    case TRIG6:
-      return 3;
-
-    case QUAD:
-    case QUAD6:
-    case QUAD8:
-      return 4;
-
-    case TET:
-    case TET10:
-      return 6;
-
-    case PYRAMID:
-      return 8;
-
-    case PRISM:
-    case PRISM12:
-      return 9;
-
-    case HEX:
-      return 12;
-
-    default:
-      cerr << "Ng_ME_GetNEdges, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-
-int MeshTopology :: GetNFaces (ELEMENT_TYPE et)
-{
-  switch (et)
-    {
-    case SEGMENT:
-    case SEGMENT3:
-      return 0;
-
-    case TRIG:
-    case TRIG6:
-      return 1;
-
-    case QUAD:
-    case QUAD6:
-    case QUAD8:
-      return 1;
-
-    case TET:
-    case TET10:
-      return 4;
-
-    case PYRAMID:
-      return 5;
-
-    case PRISM:
-    case PRISM12:
-      return 5;
-
-    case HEX:
-      return 6;
-
-    default:
-      cerr << "Ng_ME_GetNVertices, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-
-
-
-const Point3d * MeshTopology :: GetVertices (ELEMENT_TYPE et)
-{
-  static Point3d segm_points [] = 
-    { Point3d (1, 0, 0),
-      Point3d (0, 0, 0) };
-  
-  static Point3d trig_points [] = 
-    { Point3d ( 1, 0, 0 ),
-      Point3d ( 0, 1, 0 ),
-      Point3d ( 0, 0, 0 ) };
-
-  static Point3d quad_points [] = 
-    { Point3d ( 0, 0, 0 ),
-      Point3d ( 1, 0, 0 ),
-      Point3d ( 1, 1, 0 ),
-      Point3d ( 0, 1, 0 ) };
-
-  static Point3d tet_points [] = 
-    { Point3d ( 1, 0, 0 ),
-      Point3d ( 0, 1, 0 ),
-      Point3d ( 0, 0, 1 ),
-      Point3d ( 0, 0, 0 ) };
-
-  static Point3d pyramid_points [] =
-    {
-      Point3d ( 0, 0, 0 ),
-      Point3d ( 1, 0, 0 ),
-      Point3d ( 1, 1, 0 ),
-      Point3d ( 0, 1, 0 ),
-      Point3d ( 0, 0, 1-1e-7 ),
-    };    
-  
-  static Point3d prism_points[] = 
-    {
-      Point3d ( 1, 0, 0 ),
-      Point3d ( 0, 1, 0 ),
-      Point3d ( 0, 0, 0 ),
-      Point3d ( 1, 0, 1 ),
-      Point3d ( 0, 1, 1 ),
-      Point3d ( 0, 0, 1 )
-    };
-
-
-  static Point3d hex_points [] = 
-    { Point3d ( 0, 0, 0 ),
-      Point3d ( 1, 0, 0 ),
-      Point3d ( 1, 1, 0 ),
-      Point3d ( 0, 1, 0 ),
-      Point3d ( 0, 0, 1 ),
-      Point3d ( 1, 0, 1 ),
-      Point3d ( 1, 1, 1 ),
-      Point3d ( 0, 1, 1 ) };
-
-
-  switch (et)
-    {
-    case SEGMENT:
-    case SEGMENT3:
-      return segm_points;
-
-    case TRIG:
-    case TRIG6:
-      return trig_points;
-
-    case QUAD:
-    case QUAD6:
-    case QUAD8:
-      return quad_points;
-
-    case TET:
-    case TET10:
-      return tet_points;
-
-    case PYRAMID:
-      return pyramid_points;
-
-    case PRISM:
-    case PRISM12:
-      return prism_points;
-
-    case HEX:
-      return hex_points;
-    default:
-      cerr << "Ng_ME_GetVertices, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-
-
-
-const ELEMENT_EDGE * MeshTopology :: GetEdges (ELEMENT_TYPE et)
-{
-  static int segm_edges[1][2] =
-    { { 1, 2 }};
-
-  static int trig_edges[3][2] =
-    { { 3, 1 },
-      { 2, 3 },        
-      { 1, 2 }};
-
-  static int quad_edges[4][2] =
-    { { 1, 2 },
-      { 3, 4 },
-      { 4, 1 },
-      { 2, 3 }};
-
-
-  static int tet_edges[6][2] =
-    { { 4, 1 },
-      { 4, 2 },
-      { 4, 3 }, 
-      { 1, 2 },
-      { 1, 3 },
-      { 2, 3 }};
-
-  static int prism_edges[9][2] =
-    { { 3, 1 },
-      { 1, 2 },
-      { 3, 2 },
-      { 6, 4 },
-      { 4, 5 },
-      { 6, 5 },
-      { 3, 6 },
-      { 1, 4 },
-      { 2, 5 }};
-
-  static int pyramid_edges[8][2] =
-    { { 1, 2 },
-      { 2, 3 },
-      { 1, 4 },
-      { 4, 3 },
-      { 1, 5 },
-      { 2, 5 },
-      { 3, 5 },
-      { 4, 5 }};
-
-  static int hex_edges[12][2] =
-    {
-      { 1, 2 },
-      { 3, 4 },
-      { 4, 1 },
-      { 2, 3 },
-      { 5, 6 },
-      { 7, 8 },
-      { 8, 5 },
-      { 6, 7 },
-      { 1, 5 },
-      { 2, 6 },
-      { 3, 7 },
-      { 4, 8 },
-    };
-
-  switch (et)
-    {
-    case SEGMENT:
-    case SEGMENT3:
-      return segm_edges;
-
-    case TRIG:
-    case TRIG6:
-      return trig_edges;
-
-    case QUAD:
-    case QUAD6:
-    case QUAD8:
-      return quad_edges;
-
-    case TET:
-    case TET10:
-      return tet_edges;
-
-    case PYRAMID:
-      return pyramid_edges;
-
-    case PRISM:
-    case PRISM12:
-      return prism_edges;
-
-    case HEX:
-      return hex_edges;
-    default:
-      cerr << "Ng_ME_GetEdges, illegal element type " << et << endl;
-    }
-   return 0;  
-}
-
-
-const ELEMENT_FACE * MeshTopology :: GetFaces (ELEMENT_TYPE et)
-{
-  static int trig_faces[1][4] = 
-    { { 1, 2, 3, 0 } };
-  static int quad_faces[1][4] = 
-    { { 1, 2, 3, 4 } };
-
-  static int tet_faces[4][4] =
-    { { 4, 2, 3, 0 },
-      { 4, 3, 1, 0 },
-      { 4, 1, 2, 0 },
-      { 1, 3, 2, 0 } };
-  
-  static int prism_faces[5][4] =
-    {
-      { 1, 3, 2, 0 },
-      { 4, 5, 6, 0 },
-      { 3, 1, 4, 6 },
-      { 1, 2, 5, 4 },
-      { 2, 3, 6, 5 } 
-    };
-
-  static int pyramid_faces[5][4] =
-    {
-      { 1, 2, 5, 0 },
-      { 2, 3, 5, 0 },
-      { 3, 4, 5, 0 },
-      { 4, 1, 5, 0 },
-      { 1, 4, 3, 2 } 
-    };
-
-  static int hex_faces[6][4] =
-    {
-      { 1, 4, 3, 2 },
-      { 5, 6, 7, 8 },
-      { 1, 2, 6, 5 },
-      { 2, 3, 7, 6 },
-      { 3, 4, 8, 7 },
-      { 4, 1, 5, 8 }
-    };
-
-
-  
-  switch (et)
-    {
-    case TRIG:
-    case TRIG6:
-      return trig_faces;
-
-    case QUAD:
-    case QUAD6:
-    case QUAD8:
-      return quad_faces;
-
-
-    case TET:
-    case TET10:
-      return tet_faces;
-
-    case PRISM:
-    case PRISM12:
-      return prism_faces;
-
-    case PYRAMID:
-      return pyramid_faces;
-
-    case SEGMENT:
-    case SEGMENT3:
-
-    case HEX:
-      return hex_faces;
-
-    default:
-      cerr << "Ng_ME_GetVertices, illegal element type " << et << endl;
-    }
-  return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-void MeshTopology :: GetElementEdges (int elnr, ARRAY<int> & eledges) const
-{
-  int ned = GetNEdges (mesh.VolumeElement(elnr).GetType());
-  eledges.SetSize (ned);
-  for (int i = 0; i < ned; i++)
-    eledges[i] = abs (edges.Get(elnr)[i]);
-}
-void MeshTopology :: GetElementFaces (int elnr, ARRAY<int> & elfaces) const
-{
-  int i;
-  int nfa = GetNFaces (mesh.VolumeElement(elnr).GetType());
-  elfaces.SetSize (nfa);
-  for (i = 1; i <= nfa; i++)
-    elfaces.Elem(i) = (faces.Get(elnr)[i-1]-1) / 8 + 1;
-}
-
-void MeshTopology :: GetElementEdgeOrientations (int elnr, ARRAY<int> & eorient) const
-{
-  int i;
-  int ned = GetNEdges (mesh.VolumeElement(elnr).GetType());
-  eorient.SetSize (ned);
-  for (i = 1; i <= ned; i++)
-    eorient.Elem(i) = (edges.Get(elnr)[i-1] > 0) ? 1 : -1;
-}
-
-void MeshTopology :: GetElementFaceOrientations (int elnr, ARRAY<int> & forient) const
-{
-  int i;
-  int nfa = GetNFaces (mesh.VolumeElement(elnr).GetType());
-  forient.SetSize (nfa);
-  for (i = 1; i <= nfa; i++)
-    forient.Elem(i) = (faces.Get(elnr)[i-1]-1) % 8;
-}
-
-
-
-int MeshTopology :: GetElementEdges (int elnr, int * eledges, int * orient) const
-{
-  int i;
-  //  int ned = GetNEdges (mesh.VolumeElement(elnr).GetType());
-
-  if (mesh.GetDimension()==3 || 1)
-    {
-      if (orient)
-	{
-	  for (i = 0; i < 12; i++)
-	    {
-	      if (!edges.Get(elnr)[i]) return i;
-	      eledges[i] = abs (edges.Get(elnr)[i]);
-	      orient[i] = (edges.Get(elnr)[i] > 0 ) ? 1 : -1;
-	    }
-	}
-      else
-	{
-	  for (i = 0; i < 12; i++)
-	    {
-	      if (!edges.Get(elnr)[i]) return i;
-	      eledges[i] = abs (edges.Get(elnr)[i]);
-	    }
-	}
-      return 12;
-    }
-  else
-    {
-      if (orient)
-	{
-	  for (i = 0; i < 4; i++)
-	    {
-	      if (!surfedges.Get(elnr)[i]) return i;
-	      eledges[i] = abs (surfedges.Get(elnr)[i]);
-	      orient[i] = (surfedges.Get(elnr)[i] > 0 ) ? 1 : -1;
-	    }
-	}
-      else
-	{
-	  if (!surfedges.Get(elnr)[i]) return i;
-	  for (i = 0; i < 4; i++)
-	    eledges[i] = abs (surfedges.Get(elnr)[i]);
-	}
-      return 4;
-      //      return GetSurfaceElementEdges (elnr, eledges, orient);
-    }
-}
-
-int MeshTopology :: GetElementFaces (int elnr, int * elfaces, int * orient) const
-{
-  int i;
-  //  int nfa = GetNFaces (mesh.VolumeElement(elnr).GetType());
-  if (orient)
-    {
-      for (i = 0; i < 6; i++)
-	{
-	  if (!faces.Get(elnr)[i]) return i;
-	  elfaces[i] = (faces.Get(elnr)[i]-1) / 8 + 1;
-	  orient[i] = (faces.Get(elnr)[i]-1) % 8;
-	}
-    }
-  else
-    {
-      for (i = 0; i < 6; i++)
-	{
-	  if (!faces.Get(elnr)[i]) return i;
-	  elfaces[i] = (faces.Get(elnr)[i]-1) / 8 + 1;
-	}
-    }
-  return 6;
-}
-
-void MeshTopology :: GetSurfaceElementEdges (int elnr, ARRAY<int> & eledges) const
-{
-  int i;
-  if (mesh.GetDimension()==3 || 1)
-    {
-      int ned = GetNEdges (mesh.SurfaceElement(elnr).GetType());
-      eledges.SetSize (ned);
-      for (i = 1; i <= ned; i++)
-	eledges.Elem(i) = abs (surfedges.Get(elnr)[i-1]);
-    }
-  else
-    {
-      cout << "surfeledge(" << elnr << ") = " << flush;
-      eledges.SetSize(1); 
-      eledges.Elem(1) = abs (segedges.Get(elnr));
-      cout << eledges.Elem(1) << endl;
-    }
-}
-
-int MeshTopology :: GetSurfaceElementFace (int elnr) const
-{
-  return (surffaces.Get(elnr)-1) / 8 + 1;  
-}
-
-void MeshTopology :: 
-GetSurfaceElementEdgeOrientations (int elnr, ARRAY<int> & eorient) const
-{
-  int ned = GetNEdges (mesh.SurfaceElement(elnr).GetType());
-  eorient.SetSize (ned);
-  for (int i = 1; i <= ned; i++)
-    eorient.Elem(i) = (surfedges.Get(elnr)[i-1] > 0) ? 1 : -1;
-}
-
-int MeshTopology :: GetSurfaceElementFaceOrientation (int elnr) const
-{
-  return (surffaces.Get(elnr)-1) % 8;
-}
-
-int MeshTopology :: GetSurfaceElementEdges (int elnr, int * eledges, int * orient) const
-{
-  int i;
-  if (mesh.GetDimension() == 3 || 1)
-    {
-      if (orient)
-	{
-	  for (i = 0; i < 4; i++)
-	    {
-	      if (!surfedges.Get(elnr)[i]) return i;
-	      eledges[i] = abs (surfedges.Get(elnr)[i]);
-	      orient[i] = (surfedges.Get(elnr)[i] > 0 ) ? 1 : -1;
-	    }
-	}
-      else
-	{
-	  for (i = 0; i < 4; i++)
-	    {
-	      if (!surfedges.Get(elnr)[i]) return i;
-	      eledges[i] = abs (surfedges.Get(elnr)[i]);
-	    }
-	}
-      return 4;
-    }
-  else
-    {
-      eledges[0] = abs (segedges.Get(elnr));
-      if (orient)
-	orient[0] = segedges.Get(elnr) > 0 ? 1 : -1;
-    }
-  return 1;
-}
-
-
-void MeshTopology :: GetFaceVertices (int fnr, ARRAY<int> & vertices) const
-{
-  vertices.SetSize(4);
-  int i;
-  for (i = 1; i <= 4; i++)
-    vertices.Elem(i) = face2vert.Get(fnr)[i-1];
-  if (vertices.Elem(4) == 0)
-    vertices.SetSize(3);
-}
-
-void MeshTopology :: GetFaceVertices (int fnr, int * vertices) const
-{
-  for (int i = 0; i <= 3; i++)
-    vertices[i] = face2vert.Get(fnr)[i];
-}
-
-
-void MeshTopology :: GetEdgeVertices (int ednr, int & v1, int & v2) const
-{
-  v1 = edge2vert.Get(ednr)[0];
-  v2 = edge2vert.Get(ednr)[1];
-}
-
-
-void MeshTopology :: GetFaceEdges (int fnr, ARRAY<int> & edges) const
-{
-  ArrayMem<int,4> pi(4);
-  ArrayMem<int,12> eledges;
-
-  edges.SetSize (0);
-  GetFaceVertices (fnr, pi);
-
-  //  GetVertexElements (pi[0], els);
-  FlatArray<int> els = GetVertexElements (pi[0]);
-
-  // find one element having all vertices of the face
-  for (int i = 0; i < els.Size(); i++)
-    {
-      const Element & el = mesh.VolumeElement(els[i]);
-
-      int cntv = 0;
-      for (int j = 0; j < el.GetNV(); j++)
-	for (int k = 0; k < pi.Size(); k++)
-	  if (el[j] == pi[k])
-	    cntv++;
-
-      if (cntv == pi.Size())
-	{
-	  GetElementEdges (els[i], eledges);
-	  
-	  for (int j = 0; j < eledges.Size(); j++)
-	    {
-	      int vi1, vi2;
-	      GetEdgeVertices (eledges[j], vi1, vi2);
-	      bool has1 = 0;
-	      bool has2 = 0;
-	      for (int k = 0; k < pi.Size(); k++)
-		{
-		  if (vi1 == pi[k]) has1 = 1;
-		  if (vi2 == pi[k]) has2 = 1;
-		}
-	      if (has1 && has2)
-		edges.Append (eledges[j]);
-	    }
-
-          return;
-	}
-    }
-}
-
-
-ELEMENT_TYPE MeshTopology :: GetFaceType (int fnr) const
-{
-  if (face2vert.Get(fnr)[3] == 0) return TRIG; else return QUAD;
-}
-
-
-void MeshTopology :: GetVertexElements (int vnr, ARRAY<int> & elements) const
-{
-  if (vert2element)
-    {
-      int i;
-      int ne = vert2element->EntrySize(vnr);
-      elements.SetSize(ne);
-      for (i = 1; i <= ne; i++)
-	elements.Elem(i) = vert2element->Get(vnr, i);
-    }
-}
-
-
-FlatArray<int> MeshTopology :: GetVertexElements (int vnr) const
-{
-  if (vert2element)
-    return (*vert2element)[vnr];
-  return FlatArray<int> (0,0);
-}
-
-FlatArray<int> MeshTopology :: GetVertexSurfaceElements (int vnr) const
-{
-  if (vert2surfelement)
-    return (*vert2surfelement)[vnr];
-  return FlatArray<int> (0,0);
-}
-
-
-void MeshTopology :: GetVertexSurfaceElements( int vnr, 
-					       ARRAY<int>& elements ) const
-{
-  if (vert2surfelement)
-    {
-      int i;
-      int ne = vert2surfelement->EntrySize(vnr);
-      elements.SetSize(ne);
-      for (i = 1; i <= ne; i++)
-	elements.Elem(i) = vert2surfelement->Get(vnr, i);
-    }
-}
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/topology.hpp b/contrib/Netgen/libsrc/meshing/topology.hpp
deleted file mode 100644
index 3c5ac1397f3def2aea703bbf3b47daf003d559be..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/topology.hpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef TOPOLOGY
-#define TOPOLOGY
-
-/**************************************************************************/
-/* File:   topology.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   27. Apr. 01                                                    */
-/**************************************************************************/
-
-/*
-    Mesh topology
-    (Elements, Faces, Edges, Vertices
-*/
-
-
-class MeshTopology
-{
-  const Mesh & mesh;
-  int buildedges;
-  int buildfaces;
-
-  MoveableArray<INDEX_2> edge2vert;
-  MoveableArray<INDEX_4> face2vert;
-  MoveableArray<int[12]> edges;
-  MoveableArray<int[6]> faces;
-  MoveableArray<int[4]> surfedges;
-  MoveableArray<int> segedges;
-  MoveableArray<int> surffaces;
-  MoveableArray<INDEX_2> surf2volelement;
-  MoveableArray<int> face2surfel;
-  TABLE<int,PointIndex::BASE> *vert2element;
-  TABLE<int,PointIndex::BASE> *vert2surfelement;
-  TABLE<int,PointIndex::BASE> *vert2segment;
-  int timestamp;
-public:
-  MeshTopology (const Mesh & amesh);
-  ~MeshTopology ();
-
-  void SetBuildEdges (int be)
-  { buildedges = be; }
-  void SetBuildFaces (int bf)
-  { buildfaces = bf; }
-
-  int HasEdges () const
-  { return buildedges; }
-  int HasFaces () const
-  { return buildedges; }
-
-  void Update();
-
-
-  int GetNEdges () const
-  { return edge2vert.Size(); }
-  int GetNFaces () const
-  { return face2vert.Size(); }
-
-  static int GetNVertices (ELEMENT_TYPE et);
-  static int GetNEdges (ELEMENT_TYPE et);
-  static int GetNFaces (ELEMENT_TYPE et);
-
-  static const Point3d * GetVertices (ELEMENT_TYPE et);
-  static const ELEMENT_EDGE * GetEdges (ELEMENT_TYPE et);
-  static const ELEMENT_FACE * GetFaces (ELEMENT_TYPE et);
-
-
-  
-  int GetSegmentEdge (int segnr) const { return abs(segedges[segnr-1]); }
-  int GetSegmentEdgeOrientation (int segnr) const { return sgn(segedges[segnr-1]); }
-
-  void GetSegmentEdge (int segnr, int & enr, int & orient) const
-  {
-    enr = abs(segedges.Get(segnr));
-    orient = segedges.Get(segnr) > 0 ? 1 : -1;
-  }
-
-  void GetElementEdges (int elnr, ARRAY<int> & edges) const;
-  void GetElementFaces (int elnr, ARRAY<int> & faces) const;
-  void GetElementEdgeOrientations (int elnr, ARRAY<int> & eorient) const;
-  void GetElementFaceOrientations (int elnr, ARRAY<int> & forient) const;
-
-  int GetElementEdges (int elnr, int * edges, int * orient) const;
-  int GetElementFaces (int elnr, int * faces, int * orient) const;
-
-  void GetFaceVertices (int fnr, ARRAY<int> & vertices) const;
-  void GetFaceVertices (int fnr, int * vertices) const;
-  void GetEdgeVertices (int fnr, int & v1, int & v2) const;
-  void GetFaceEdges (int fnr, ARRAY<int> & edges) const;
-
-  ELEMENT_TYPE GetFaceType (int fnr) const;
-
-  void GetSurfaceElementEdges (int elnr, ARRAY<int> & edges) const;
-  int GetSurfaceElementFace (int elnr) const;
-  void GetSurfaceElementEdgeOrientations (int elnr, ARRAY<int> & eorient) const;
-  int GetSurfaceElementFaceOrientation (int elnr) const;
-
-  int GetSurfaceElementEdges (int elnr, int * edges, int * orient) const;
-
-  void GetSurface2VolumeElement (int selnr, int & elnr1, int & elnr2) const
-  { 
-    elnr1 = surf2volelement.Get(selnr)[0];
-    elnr2 = surf2volelement.Get(selnr)[1];
-  }
-
-  int GetFace2SurfaceElement (int fnr) const { return face2surfel[fnr-1]; }
-  
-  void GetVertexElements (int vnr, ARRAY<int> & elements) const;
-  FlatArray<int> GetVertexElements (int vnr) const;
-
-  void GetVertexSurfaceElements( int vnr, ARRAY<int>& elements ) const;
-  FlatArray<int> GetVertexSurfaceElements (int vnr) const;
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/triarls.cpp b/contrib/Netgen/libsrc/meshing/triarls.cpp
deleted file mode 100644
index 923763306d3fe05bdc9835fdfe3875ee2a853e3c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/triarls.cpp
+++ /dev/null
@@ -1,468 +0,0 @@
-namespace netgen
-{
-const char * triarules[] = {
-"rule \"Free Triangle (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0) { 1.0, 0, 1.0 };\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.866) { 0.5 X2 } { };\n",\
-"\n",\
-"newlines\n",\
-"(1, 3);\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 0.7) { 0.5 X2 } { };\n",\
-"(0.5, 1.5) { 0.5 X2 } { };\n",\
-"(-0.5, 0.7) { 0.5 X2 } { };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.5, 0.866) { 0.5 X2 } { };\n",\
-"(0.5, 0.866) { 0.5 X2 } { };\n",\
-"(0.5, 0.866) { 0.5 X2 } { };\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"rule \"Free Triangle (5)\"\n",\
-"\n",\
-"quality 5\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0) { 1.0, 0, 1.0 };\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.5) { 0.5 X2 } { };\n",\
-"\n",\
-"newlines\n",\
-"(1, 3);\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 0.7) { 1 X2 } { };\n",\
-"(0, 0.7) { } { };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.5, 0.5) { 0.5 X2 } { };\n",\
-"(0.5, 0.5) { 0.5 X2 } { };\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Free Triangle (10)\"\n",\
-"\n",\
-"quality 10\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0) { 1.0, 0, 1.0 };\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.3) { 0.5 X2 } { };\n",\
-"\n",\
-"newlines\n",\
-"(1, 3);\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 0.5) { 1 X2 } { };\n",\
-"(0, 0.5) { } { };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.5, 0.3) { 0.5 X2 } { };\n",\
-"(0.5, 0.3) { 0.5 X2 } { };\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Free Triangle (20)\"\n",\
-"\n",\
-"quality 20\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0) { 1.0, 0, 1.0 };\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.1) { 0.5 X2 } { };\n",\
-"\n",\
-"newlines\n",\
-"(1, 3);\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1, 0.2) { 1 X2 } { };\n",\
-"(0, 0.2) { } { };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.5, 0.1) { 0.5 X2 } { };\n",\
-"(0.5, 0.1) { 0.5 X2 } { };\n",\
-"\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Right 60 (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0) { 0.5, 0, 1.0 };\n",\
-"(0.5, 0.866) { 0.6, 0, 0.8 };\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(1, 3);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"(-0.125, 0.6495) { -0.5 X2, 0.75 X3 } { -0.5 Y2, 0.75 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"(0.25, 0.433) { 0.5 X3 } { 0.5 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Left 60 (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(0.5, 0.866);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.125, 0.6495) { 0.75 X2, 0.75 X3 } { 0.75 Y3 };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.75, 0.433) { 0.5 X2, 0.5 X3 } { 0.5 Y2, 0.5 Y3 };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Right 120 (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1.5, 0.866);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.866) { 1 X3, -1 X2 } { 1 Y3 };\n",\
-"\n",\
-"newlines\n",\
-"(1, 4);\n",\
-"(4, 3);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"(1, 1.732) { -2 X2, 2 X3 } { 2 Y3 };\n",\
-"(0, 1.732) { -3 X2, 2 X3 } { 2 Y3 };\n",\
-"(-0.5, 0.866) { -2 X2, 1 X3 } {1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 4);\n",\
-"(2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Left 120 (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(-0.5, 0.866);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.866) { 1 X3, 1 X2 } { 1 Y3 };\n",\
-"\n",\
-"newlines\n",\
-"(3, 4);\n",\
-"(4, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 0.866) { 2 X2, 1 X3 } { 1 Y3 };\n",\
-"(1, 1.732) { 2 X2, 2 X3 } { 2 Y3 };\n",\
-"(0, 1.732) { -1 X2, 2 X3 } { 2 Y3 };\n",\
-"(-0.5, 0.866) { 1 X3 } {1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 4);\n",\
-"(2, 3, 4);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Left Right 120 (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(-0.5, 0.866);\n",\
-"(1.5, 0.866);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 1) del;\n",\
-"(2, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.866) { 0.5 X3, 0.5 X4 } { 0.5 Y3, 0.5 Y4 };\n",\
-"\n",\
-"newlines\n",\
-"(3, 5);\n",\
-"(5, 4);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.5, 0.866) { 1 X4 } { 1 Y4 };\n",\
-"(1, 1.299) { -0.5 X2, 0.375 X3, 1.125 X4 } { -0.5 Y2, 0.375 Y3, 1.125 Y4 };\n",\
-"(0, 1.299) { 1.125 X3, 0.375 X4 } { 1.125 Y3, 0.375 Y4 };\n",\
-"(-0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 5);\n",\
-"(3, 1, 5);\n",\
-"(2, 4, 5);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"rule \"Fill Triangle\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(0.5, 0.866);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(2, 3) del;\n",\
-"(3, 1) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { 1 Y2 };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"Vis A Vis (1)\"\n",\
-"\n",\
-"quality 1\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(0.5, 0.866);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"\n",\
-"newpoints\n",\
-"\n",\
-"newlines\n",\
-"(1, 3);\n",\
-"(3, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(1.2, 0.693) { 0.8 X2, 0.8 X3 } { 0.8 Y2, 0.8 Y3 };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"(-0.2, 0.693) { -0.6 X2, 0.8 X3 } { -0.6 Y2, 0.8 Y3 };\n",\
-"\n",\
-"freearea2\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { };\n",\
-"(0.75, 0.433) { 0.5 X2, 0.5 X3 } { 0.5 Y2, 0.5 Y3 };\n",\
-"(0.5, 0.866) { 1 X3 } { 1 Y3 };\n",\
-"(0.25, 0.433) { 0.5 X3 } { 0.5 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 3);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"rule \"2 h Vis A Vis (1)\"\n",\
-"\n",\
-"quality 3\n",\
-"\n",\
-"mappoints\n",\
-"(0, 0);\n",\
-"(1, 0);\n",\
-"(1, 1.732);\n",\
-"(0, 1.732);\n",\
-"\n",\
-"maplines\n",\
-"(1, 2) del;\n",\
-"(3, 4) del;\n",\
-"\n",\
-"newpoints\n",\
-"(0.5, 0.866) { 0.25 X3, 0.25 X4 } { 0.25 Y2, 0.25 Y3, 0.25 Y4 };\n",\
-"\n",\
-"newlines\n",\
-"(1, 5);\n",\
-"(5, 4);\n",\
-"(3, 5);\n",\
-"(5, 2);\n",\
-"\n",\
-"freearea\n",\
-"(0, 0);\n",\
-"(1, 0) { 1 X2 } { 1 Y2 };\n",\
-"(1.5, 0.866) { 0.75 X2, 0.75 X3, -0.25 X4 } { 0.75 Y2, 0.75 Y3, -0.25 Y4 };\n",\
-"(1, 1.732) { 1 X3 } { 1 Y3 };\n",\
-"(0, 1.732) { 1 X4 } { 1 Y4 };\n",\
-"(-0.5, 0.866) { 0.75 X4, -0.25 X2, -0.25 X3 } { 0.75 Y4, -0.25 Y3 };\n",\
-"\n",\
-"elements\n",\
-"(1, 2, 5);\n",\
-"(3, 4, 5);\n",\
-"\n",\
-"endrule\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-"\n",\
-0};
-}
diff --git a/contrib/Netgen/libsrc/meshing/zrefine.cpp b/contrib/Netgen/libsrc/meshing/zrefine.cpp
deleted file mode 100644
index 7b4d4804a95b07851c329f7718a5707449ea70e8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/zrefine.cpp
+++ /dev/null
@@ -1,735 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-#include <csg.hpp>
-
-namespace netgen
-{
-
-  // find singular edges
-  void SelectSingularEdges (const Mesh & mesh, const CSGeometry & geom, 
-			    INDEX_2_HASHTABLE<int> & singedges,
-			    ZRefinementOptions & opt)
-  {
-    int i, j;
-
-    // edges selected in csg input file
-    for (i = 1; i <= geom.singedges.Size(); i++)
-      {
-	const SingularEdge & se = *geom.singedges.Get(i);
-	for (j = 1; j <= se.segms.Size(); j++)
-	  {
-	    INDEX_2 i2 = se.segms.Get(j);
-	    singedges.Set (i2, 1);
-	  }
-      }
-
-    // edges interactively selected
-    for (i = 1; i <= mesh.GetNSeg(); i++)
-      {
-	const Segment & seg = mesh.LineSegment(i);
-	if (seg.singedge_left || seg.singedge_right)
-	  {
-	    INDEX_2 i2(seg.p1, seg.p2);
-	    i2.Sort();
-	    singedges.Set (i2, 1);
-	  }
-      }
-  }
-
-
-  /**
-     Convert elements (vol-tets, surf-trigs) into prisms/quads
-  */
-  void MakePrismsSingEdge (Mesh & mesh, INDEX_2_HASHTABLE<int> & singedges)
-  {
-    int i, j, k;
-
-    // volume elements
-    for (i = 1; i <= mesh.GetNE(); i++)
-      {
-	Element & el = mesh.VolumeElement(i);
-	if (el.GetType() != TET) continue;
-
-	for (j = 1; j <= 3; j++)
-	  for (k = j+1; k <= 4; k++)
-	    {
-	      INDEX_2 edge(el.PNum(j), el.PNum(k));
-	      edge.Sort();
-	      if (singedges.Used (edge))
-		{
-		  int pi3 = 1, pi4 = 1;
-		  while (pi3 == j || pi3 == k) pi3++;
-		  pi4 = 10 - j - k - pi3;
-		
-		  int p3 = el.PNum(pi3);
-		  int p4 = el.PNum(pi4);
-
-		  el.SetType(PRISM);
-		  el.PNum(1) = edge.I1();
-		  el.PNum(2) = p3;
-		  el.PNum(3) = p4;
-		  el.PNum(4) = edge.I2();
-		  el.PNum(5) = p3;
-		  el.PNum(6) = p4;
-		}
-	    }
-      }
-
-    // surface elements
-    for (i = 1; i <= mesh.GetNSE(); i++)
-      {
-	Element2d & el = mesh.SurfaceElement(i);
-	if (el.GetType() != TRIG) continue;
-
-	for (j = 1; j <= 3; j++)
-	  {
-	    k = (j % 3) + 1;
-	    INDEX_2 edge(el.PNum(j), el.PNum(k));
-	    edge.Sort();
-
-	    if (singedges.Used (edge))
-	      {
-		int pi3 = 6-j-k;
-		int p3 = el.PNum(pi3);
-		int p1 = el.PNum(j);
-		int p2 = el.PNum(k);
-
-		el.SetType(QUAD);
-		el.PNum(1) = p2;
-		el.PNum(2) = p3;
-		el.PNum(3) = p3;
-		el.PNum(4) = p1;
-	      }
-	  }
-      }
-  }
-
-
-  /*
-    Convert tets and pyramids next to close (identified) points into prisms
-  */
-  void MakePrismsClosePoints (Mesh & mesh)
-  {
-    int i, j, k;
-    for (i = 1; i <= mesh.GetNE(); i++)
-      {
-	Element & el = mesh.VolumeElement(i);
-	if (el.GetType() == TET)
-	  {
-	    for (j = 1; j <= 3; j++)
-	      for (k = j+1; k <= 4; k++)
-		{
-		  INDEX_2 edge(el.PNum(j), el.PNum(k));
-		  edge.Sort();
-		  if (mesh.GetIdentifications().GetSymmetric (el.PNum(j), el.PNum(k)))
-		    {
-		      int pi3 = 1, pi4 = 1;
-		      while (pi3 == j || pi3 == k) pi3++;
-		      pi4 = 10 - j - k - pi3;
-		    
-		      int p3 = el.PNum(pi3);
-		      int p4 = el.PNum(pi4);
-		    
-		      el.SetType(PRISM);
-		      el.PNum(1) = edge.I1();
-		      el.PNum(2) = p3;
-		      el.PNum(3) = p4;
-		      el.PNum(4) = edge.I2();
-		      el.PNum(5) = p3;
-		      el.PNum(6) = p4;
-		    }
-		}
-	  }
-
-	if (el.GetType() == PYRAMID)
-	  {
-	    // pyramid, base face = 1,2,3,4
-	  
-	    for (j = 0; j <= 1; j++)
-	      {
-		int pi1 = el.PNum( (j+0) % 4 + 1);
-		int pi2 = el.PNum( (j+1) % 4 + 1);
-		int pi3 = el.PNum( (j+2) % 4 + 1);
-		int pi4 = el.PNum( (j+3) % 4 + 1);
-		int pi5 = el.PNum(5);
-
-		INDEX_2 edge1(pi1, pi4);
-		INDEX_2 edge2(pi2, pi3);
-		edge1.Sort();
-		edge2.Sort();
-		if (mesh.GetIdentifications().GetSymmetric (pi1, pi4) &&
-		    mesh.GetIdentifications().GetSymmetric (pi2, pi3))
-		  {
-		    int p3 = el.PNum(pi3);
-		    int p4 = el.PNum(pi4);
-		  
-		    el.SetType(PRISM);
-		    el.PNum(1) = pi1;
-		    el.PNum(2) = pi2;
-		    el.PNum(3) = pi5;
-		    el.PNum(4) = pi4;
-		    el.PNum(5) = pi3;
-		    el.PNum(6) = pi5;
-		  }
-	      }
-	  }
-      }
-  
-    for (i = 1; i <= mesh.GetNSE(); i++)
-      {
-	Element2d & el = mesh.SurfaceElement(i);
-	if (el.GetType() != TRIG) continue;
-
-	for (j = 1; j <= 3; j++)
-	  {
-	    k = (j % 3) + 1;
-	    INDEX_2 edge(el.PNum(j), el.PNum(k));
-	    edge.Sort();
-
-	    if (mesh.GetIdentifications().GetSymmetric (el.PNum(j), el.PNum(k)))
-	      {
-		int pi3 = 6-j-k;
-		int p3 = el.PNum(pi3);
-		int p1 = el.PNum(j);
-		int p2 = el.PNum(k);
-
-		el.SetType(QUAD);
-		el.PNum(1) = p2;
-		el.PNum(2) = p3;
-		el.PNum(3) = p3;
-		el.PNum(4) = p1;
-	      }
-	  }
-      }
-  }
-
-
-
-#ifdef OLD
-  void MakeCornerNodes (Mesh & mesh,
-			INDEX_HASHTABLE<int> & cornernodes)
-  {
-    int i, j;
-    int nseg = mesh.GetNSeg();
-    ARRAY<int> edgesonpoint(mesh.GetNP());
-    for (i = 1; i <= mesh.GetNP(); i++)
-      edgesonpoint.Elem(i) = 0;
-
-    for (i = 1; i <= nseg; i++)
-      {
-	for (j = 1; j <= 2; j++)
-	  {
-	    int pi = (j == 1) ? 
-	      mesh.LineSegment(i).p1 :
-	      mesh.LineSegment(i).p2;
-	    edgesonpoint.Elem(pi)++;
-	  }
-      }
-
-    /*
-      cout << "cornernodes: ";
-      for (i = 1; i <= edgesonpoint.Size(); i++)
-      if (edgesonpoint.Get(i) >= 6)
-      {
-      cornernodes.Set (i, 1);
-      cout << i << " ";
-      }
-      cout << endl;
-    */
-    //  cornernodes.Set (5, 1);
-  }
-#endif
-
-
-  void RefinePrisms (Mesh & mesh, const CSGeometry * geom, 
-		     ZRefinementOptions & opt)
-  {
-    int i, j, k;
-    bool found, change;
-    int cnt = 0;
-
-
-    // markers for z-refinement:  p1, p2, levels  
-    // p1-p2 is an edge to be refined
-    ARRAY<INDEX_3> ref_uniform;
-    ARRAY<INDEX_3> ref_singular;
-    ARRAY<INDEX_4 > ref_slices;
-
-    BitArray first_id(geom->identifications.Size());
-    first_id.Set();
-
-  
-    INDEX_2_HASHTABLE<int> & identpts = 
-      mesh.GetIdentifications().GetIdentifiedPoints ();
-
-    if (&identpts)
-      {
-	for (i = 1; i <= identpts.GetNBags(); i++)
-	  for (j = 1; j <= identpts.GetBagSize(i); j++)
-	    {
-	      INDEX_2 pair;
-	      int idnr;
-	      identpts.GetData(i, j, pair, idnr);
-	      const CloseSurfaceIdentification * csid = 
-		dynamic_cast<const CloseSurfaceIdentification*> 
-		(geom->identifications.Get(idnr));
-	      if (csid)
-		{
-		  if (!csid->GetSlices().Size())
-		    {
-		      if (first_id.Test (idnr))
-			{
-			  first_id.Clear(idnr);
-			  ref_uniform.Append (INDEX_3 (pair.I1(), pair.I2(), csid->RefLevels()));
-			  ref_singular.Append (INDEX_3 (pair.I1(), pair.I2(), csid->RefLevels1()));
-			  ref_singular.Append (INDEX_3 (pair.I2(), pair.I1(), csid->RefLevels2()));
-			}
-		    }
-		  else
-		    {
-		      const ARRAY<double> & slices = csid->GetSlices();
-		      INDEX_4 i4;
-		      i4[0] = pair.I1();
-		      i4[1] = pair.I2();
-		      i4[2] = idnr;
-		      i4[3] = csid->GetSlices().Size();
-		      ref_slices.Append (i4);
-		    }
-		}
-	    }
-      }
-
-  
-  
-    ARRAY<EdgePointGeomInfo> epgi;
-
-    while (1)
-      {
-	cnt++;
-	PrintMessage (3, "Z-Refinement, level = ", cnt);
-	INDEX_2_HASHTABLE<int> refedges(mesh.GetNSE()+1);
-
-
-	found = 0;
-	// mark prisms due to close surface flags:
-	int oldsize = ref_uniform.Size();
-	for (i = 1; i <= oldsize; i++)
-	  {
-	    int pi1 = ref_uniform.Get(i).I1();
-	    int pi2 = ref_uniform.Get(i).I2();
-	    int levels = ref_uniform.Get(i).I3();
-
-	    if (levels > 0)
-	      {
-		const Point3d & p1 = mesh.Point(pi1);
-		const Point3d & p2 = mesh.Point(pi2);
-		int npi;
-	      
-		INDEX_2 edge(pi1, pi2);
-		edge.Sort();
-		if (!refedges.Used(edge))
-		  {
-		    Point3d np = Center (p1, p2);
-		    npi = mesh.AddPoint (np);
-		    refedges.Set (edge, npi);
-		    found = 1;
-		  }
-
-		ref_uniform.Elem(i) = INDEX_3(pi1, npi, levels-1);
-		ref_uniform.Append (INDEX_3(pi2, npi, levels-1));
-	      }
-	  }
-	for (i = 1; i <= ref_singular.Size(); i++)
-	  {
-	    int pi1 = ref_singular.Get(i).I1();
-	    int pi2 = ref_singular.Get(i).I2();
-	    int levels = ref_singular.Get(i).I3();
-
-	    if (levels > 0)
-	      {
-		const Point3d & p1 = mesh.Point(pi1);
-		const Point3d & p2 = mesh.Point(pi2);
-		int npi;
-	      
-		INDEX_2 edge(pi1, pi2);
-		edge.Sort();
-		if (!refedges.Used(edge))
-		  {
-		    Point3d np = Center (p1, p2);
-		    npi = mesh.AddPoint (np);
-		    refedges.Set (edge, npi);
-		    found = 1;
-		  }
-		else
-		  npi = refedges.Get (edge);
-
-		ref_singular.Elem(i) = INDEX_3(pi1, npi, levels-1);
-	      }
-	  }
-
-	for (i = 1; i <= ref_slices.Size(); i++)
-	  {
-	    int pi1 = ref_slices.Get(i)[0];
-	    int pi2 = ref_slices.Get(i)[1];
-	    int idnr = ref_slices.Get(i)[2];
-	    int slicenr = ref_slices.Get(i)[3];
-
-	    if (slicenr > 0)
-	      {
-		const Point3d & p1 = mesh.Point(pi1);
-		const Point3d & p2 = mesh.Point(pi2);
-		int npi;
-
-		const CloseSurfaceIdentification * csid = 
-		  dynamic_cast<const CloseSurfaceIdentification*> 
-		  (geom->identifications.Get(idnr));
-
-	      
-		INDEX_2 edge(pi1, pi2);
-		edge.Sort();
-		if (!refedges.Used(edge))
-		  {
-		    const ARRAY<double> & slices = csid->GetSlices();
-		    double slicefac = slices.Get(slicenr);
-		    double slicefaclast = 
-		      (slicenr == slices.Size()) ? 1 : slices.Get(slicenr+1);
-		    
-		    Point3d np = p1 + (slicefac / slicefaclast) * (p2-p1);
-		    npi = mesh.AddPoint (np);
-		    refedges.Set (edge, npi);
-		    found = 1;
-		  }
-		else
-		  npi = refedges.Get (edge);
-		
-		ref_slices.Elem(i)[1] = npi;
-		ref_slices.Elem(i)[3] --;
-	      }
-	  }
-
-
-
-
-	for (i = 1; i <= mesh.GetNE(); i++)
-	  {
-	    Element & el = mesh.VolumeElement (i);
-	    if (el.GetType() != PRISM)
-	      continue;
-
-	    for (j = 1; j <= 3; j++)
-	      {
-		int pi1 = el.PNum(j);
-		int pi2 = el.PNum(j+3);
-		const Point3d & p1 = mesh.Point(pi1);
-		const Point3d & p2 = mesh.Point(pi2);
-
-		bool ref = 0;
-
-		/*
-		  if (Dist (p1, p2) > mesh.GetH (Center (p1, p2)))
-		  ref = 1;
-		*/
-
-		/*
-		  if (cnt <= opt.minref)
-		  ref = 1;
-		*/
-
-		/*
-		  if ((pi1 == 460 || pi2 == 460 ||
-		  pi1 == 461 || pi2 == 461) && cnt <= 8) ref = 1;
-		*/
-		if (ref == 1)
-		  {
-		    INDEX_2 edge(pi1, pi2);
-		    edge.Sort();
-		    if (!refedges.Used(edge))
-		      {
-			Point3d np = Center (p1, p2);
-			int npi = mesh.AddPoint (np);
-			refedges.Set (edge, npi);
-			found = 1;
-		      }
-		  }
-	      }
-	  }
-      
-	if (!found) break;
-
-	// build closure:
-	PrintMessage (5, "start closure");
-	do
-	  {
-	    PrintMessage (5, "start loop");
-	    change = 0;
-	    for (i = 1; i <= mesh.GetNE(); i++)
-	      {
-		Element & el = mesh.VolumeElement (i);
-		if (el.GetType() != PRISM)
-		  continue;
-	      
-		bool hasref = 0, hasnonref = 0;
-		for (j = 1; j <= 3; j++)
-		  {
-		    int pi1 = el.PNum(j);
-		    int pi2 = el.PNum(j+3);
-		    if (pi1 != pi2)
-		      {
-			INDEX_2 edge(pi1, pi2);
-			edge.Sort();
-			if (refedges.Used(edge))
-			  hasref = 1;
-			else 
-			  hasnonref = 1;
-		      }
-		  }
-
-		if (hasref && hasnonref)
-		  {
-		    //		  cout << "el " << i << " in closure" << endl;
-		    change = 1;
-		    for (j = 1; j <= 3; j++)
-		      {
-			int pi1 = el.PNum(j);
-			int pi2 = el.PNum(j+3);
-			const Point3d & p1 = mesh.Point(pi1);
-			const Point3d & p2 = mesh.Point(pi2);
-		      
-			INDEX_2 edge(pi1, pi2);
-			edge.Sort();
-			if (!refedges.Used(edge))
-			  {
-			    Point3d np = Center (p1, p2);
-			    int npi = mesh.AddPoint (np);
-			    refedges.Set (edge, npi);
-			  }
-		      }
-		  }
-	      }
-	  }
-	while (change);
-
-	PrintMessage (5, "Do segments");
-
-	//      (*testout) << "closure formed, np = " << mesh.GetNP() << endl;
-
-	int oldns = mesh.GetNSeg();
-
-	for (i = 1; i <= oldns; i++)
-	  {
-	    const Segment & el = mesh.LineSegment(i);
-
-	    INDEX_2 i2(el.p1, el.p2);
-	    i2.Sort();
-	  
-	    int pnew;
-	    EdgePointGeomInfo ngi;
-      
-	    if (refedges.Used(i2))
-	      {
-		pnew = refedges.Get(i2);
-		//	      ngi = epgi.Get(pnew);
-	      }
-	    else
-	      {
-		continue;
-
-		// 	      Point3d pb;
-
-		// 	      /*
-		// 	      geom->PointBetween (mesh.Point (el.p1),
-		// 				  mesh.Point (el.p2),
-		// 				  el.surfnr1, el.surfnr2,
-		// 				  el.epgeominfo[0], el.epgeominfo[1],
-		// 				  pb, ngi);
-		// 	      */
-		// 	      pb = Center (mesh.Point (el.p1), mesh.Point (el.p2));
-
-		// 	      pnew = mesh.AddPoint (pb);
-	      
-		// 	      refedges.Set (i2, pnew);
-	      
-		// 	      if (pnew > epgi.Size())
-		// 		epgi.SetSize (pnew);
-		// 	      epgi.Elem(pnew) = ngi;
-	      }
-	  
-	    Segment ns1 = el;
-	    Segment ns2 = el;
-	    ns1.p2 = pnew;
-	    ns1.epgeominfo[1] = ngi;
-	    ns2.p1 = pnew;
-	    ns2.epgeominfo[0] = ngi;
-
-	    mesh.LineSegment(i) = ns1;
-	    mesh.AddSegment (ns2);
-	  }
-      
-	PrintMessage (5, "Segments done, NSeg = ", mesh.GetNSeg());
-
-	// do refinement
-	int oldne = mesh.GetNE();
-	for (i = 1; i <= oldne; i++)
-	  {
-	    Element & el = mesh.VolumeElement (i);
-	    if (el.GetNP() != 6)
-	      continue;
-
-	    int npi[3];
-	    for (j = 1; j <= 3; j++)
-	      {
-		int pi1 = el.PNum(j);
-		int pi2 = el.PNum(j+3);
-
-		if (pi1 == pi2)
-		  npi[j-1] = pi1;
-		else
-		  {
-		    INDEX_2 edge(pi1, pi2);
-		    edge.Sort();
-		    if (refedges.Used (edge))
-		      npi[j-1] = refedges.Get(edge);
-		    else
-		      {
-			/*
-			  (*testout) << "ERROR: prism " << i << " has hanging node !!" 
-			  << ", edge = " << edge << endl;
-			  cerr << "ERROR: prism " << i << " has hanging node !!" << endl;
-			*/
-			npi[j-1] = 0;
-		      }
-		  }
-	      }
-
-	    if (npi[0])
-	      {
-		Element nel1(6), nel2(6);
-		for (j = 1; j <= 3; j++)
-		  {
-		    nel1.PNum(j) = el.PNum(j);
-		    nel1.PNum(j+3) = npi[j-1];
-		    nel2.PNum(j) = npi[j-1];
-		    nel2.PNum(j+3) = el.PNum(j+3);
-		  }
-		nel1.SetIndex (el.GetIndex());
-		nel2.SetIndex (el.GetIndex());
-		mesh.VolumeElement (i) = nel1;
-		mesh.AddVolumeElement (nel2);
-	      }
-	  }
-
-      
-	PrintMessage (5, "Elements done, NE = ", mesh.GetNE());
-
-
-	// do surface elements
-	int oldnse = mesh.GetNSE();
-	//      cout << "oldnse = " << oldnse << endl;
-	for (i = 1; i <= oldnse; i++)
-	  {
-	    Element2d & el = mesh.SurfaceElement (i);
-	    if (el.GetType() != QUAD)
-	      continue;
-
-	    int index = el.GetIndex();
-	    int npi[2];
-	    for (j = 1; j <= 2; j++)
-	      {
-		int pi1, pi2;
-
-		if (j == 1)
-		  {
-		    pi1 = el.PNum(1);
-		    pi2 = el.PNum(4);
-		  }
-		else
-		  {
-		    pi1 = el.PNum(2);
-		    pi2 = el.PNum(3);
-		  }
-
-		if (pi1 == pi2)
-		  npi[j-1] = pi1;
-		else
-		  {
-		    INDEX_2 edge(pi1, pi2);
-		    edge.Sort();
-		    if (refedges.Used (edge))
-		      npi[j-1] = refedges.Get(edge);
-		    else
-		      {
-			npi[j-1] = 0;
-		      }
-		  }
-	      }
-
-	    if (npi[0])
-	      {
-		Element2d nel1(QUAD), nel2(QUAD);
-		for (j = 1; j <= 4; j++)
-		  {
-		    nel1.PNum(j) = el.PNum(j);
-		    nel2.PNum(j) = el.PNum(j);
-		  }
-		nel1.PNum(3) = npi[1];
-		nel1.PNum(4) = npi[0];
-		nel2.PNum(1) = npi[0];
-		nel2.PNum(2) = npi[1];
-		/*
-		  for (j = 1; j <= 2; j++)
-		  {
-		  nel1.PNum(j) = el.PNum(j);
-		  nel1.PNum(j+2) = npi[j-1];
-		  nel2.PNum(j) = npi[j-1];
-		  nel2.PNum(j+2) = el.PNum(j+2);
-		  }
-		*/
-		nel1.SetIndex (el.GetIndex());
-		nel2.SetIndex (el.GetIndex());
-
-		mesh.SurfaceElement (i) = nel1;
-		mesh.AddSurfaceElement (nel2);
-
-		int si = mesh.GetFaceDescriptor (index).SurfNr();
-
-		Point<3> hp = mesh.Point(npi[0]);
-		geom->GetSurface(si)->Project (hp);
-		mesh.Point (npi[0]).SetPoint (hp);
-
-		hp = mesh.Point(npi[1]);
-		geom->GetSurface(si)->Project (hp);
-		mesh.Point (npi[1]).SetPoint (hp);
-
-		//	      geom->GetSurface(si)->Project (mesh.Point(npi[0]));
-		//	      geom->GetSurface(si)->Project (mesh.Point(npi[1]));
-	      }
-	  }
-
-	PrintMessage (5, "Surface elements done, NSE = ", mesh.GetNSE());
-
-      }
-  }
-
-
-
-  void ZRefinement (Mesh & mesh, const CSGeometry * geom,
-		    ZRefinementOptions & opt)
-  {
-    INDEX_2_HASHTABLE<int> singedges(mesh.GetNSeg());
-
-    SelectSingularEdges (mesh, *geom, singedges, opt);
-    MakePrismsSingEdge (mesh, singedges);
-    MakePrismsClosePoints (mesh);
-
-    RefinePrisms (mesh, geom, opt);
-  }
-
-
-
-  ZRefinementOptions :: ZRefinementOptions()
-  {
-    minref = 0;
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/occ/Makefile b/contrib/Netgen/libsrc/occ/Makefile
deleted file mode 100644
index 6fe1d8bc0d79e445c446fa6e985616638b629e89..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/occ/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# Makefile for open cascade library
-#
-src =  occgeom.cpp occmeshsurf.cpp occgenmesh.cpp
-
-lib = occ
-libpath = libsrc/occ
-#
-#
-include ../makefile.inc
-
diff --git a/contrib/Netgen/libsrc/occ/occgenmesh.cpp b/contrib/Netgen/libsrc/occ/occgenmesh.cpp
deleted file mode 100644
index 822edf36815ff8ba64489838d57fdc67c7a6596e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/occ/occgenmesh.cpp
+++ /dev/null
@@ -1,1245 +0,0 @@
-#ifdef OCCGEOMETRY
-
-#include <mystdlib.h>
-#include <occgeom.hpp>
-#include <meshing.hpp>
-
-#include <stlgeom.hpp>
-
-
-namespace netgen
-{
-
-#include "occmeshsurf.hpp"
-
-#define TCL_OK 0
-#define TCL_ERROR 1
-
-extern STLParameters stlparam;
-
-#define DIVIDEEDGESECTIONS 1000
-#define IGNORECURVELENGTH 1e-4
-
- 
-void DivideEdge (TopoDS_Edge & edge,
-		 ARRAY<MeshPoint> & ps,
-		 ARRAY<double> & params,
-		 Mesh & mesh)
-{
-  double s0, s1;
-  int j;
-  double maxh = mparam.maxh;
-  int nsubedges = 1;  
-  gp_Pnt pnt, oldpnt;
-  double svalue[DIVIDEEDGESECTIONS];
-
-  GProp_GProps system;
-  BRepGProp::LinearProperties(edge, system);
-  double L = system.Mass();
-
-  Handle(Geom_Curve) c = BRep_Tool::Curve(edge, s0, s1);
-
-  double hvalue[DIVIDEEDGESECTIONS+1];
-  hvalue[0] = 0;
-  pnt = c->Value(s0);
-
-  double olddist = 0;
-  double dist = 0;
-
-  for (int i = 1; i <= DIVIDEEDGESECTIONS; i++)
-    {
-      oldpnt = pnt;
-      pnt = c->Value(s0+(i/double(DIVIDEEDGESECTIONS))*(s1-s0));
-      hvalue[i] = hvalue[i-1] +
-	1.0/mesh.GetH(Point3d(pnt.X(), pnt.Y(), pnt.Z()))*
-	pnt.Distance(oldpnt);
-
-      olddist = dist;
-      dist = pnt.Distance(oldpnt);
-    }
-
-  //  nsubedges = int(ceil(hvalue[DIVIDEEDGESECTIONS]));
-  nsubedges = max (1, int(floor(hvalue[DIVIDEEDGESECTIONS]+0.5)));
-
-  ps.SetSize(nsubedges-1);
-  params.SetSize(nsubedges+1);
-
-  int i = 1;
-  int i1 = 0;
-  do
-    {
-      if (hvalue[i1]/hvalue[DIVIDEEDGESECTIONS]*nsubedges >= i)
-	{
-	  params[i] = s0+(i1/double(DIVIDEEDGESECTIONS))*(s1-s0);
-	  pnt = c->Value(params[i]);
-	  ps[i-1] = MeshPoint (Point3d(pnt.X(), pnt.Y(), pnt.Z()));
-	  i++;
-	}
-      i1++;
-      if (i1 > DIVIDEEDGESECTIONS)
-	{
-	  nsubedges = i;
-	  ps.SetSize(nsubedges-1);
-	  params.SetSize(nsubedges+1);
-	  cout << "divide edge: local h too small" << endl;
-	}
-    } while (i < nsubedges);
-
-  params[0] = s0;
-  params[nsubedges] = s1;
-
-  if (params[nsubedges] <= params[nsubedges-1])
-    {
-      cout << "CORRECTED" << endl;
-      ps.SetSize (nsubedges-2);
-      params.SetSize (nsubedges);
-      params[nsubedges] = s1;
-    }
-}
- 
-
-
-
-static void FindEdges (OCCGeometry & geom, Mesh & mesh)
-{
-  int i, j;
-  
-  char * savetask = multithread.task;
-  multithread.task = "Edge meshing";
-
-  (*testout) << "edge meshing" << endl;
-
-  TopExp_Explorer exp0, exp01, exp1, exp2, exp3;
-  
-  int nvertices = geom.vmap.Extent();
-  int nedges = geom.emap.Extent();
-  for (i = 1; i <= nvertices; i++)
-    {
-      gp_Pnt pnt = BRep_Tool::Pnt (TopoDS::Vertex(geom.vmap(i)));
-      MeshPoint mp( Point3d(pnt.X(), pnt.Y(), pnt.Z()) );
-
-      /*
-      int exists = 0;
-			
-      for (j = 1; !exists && (j <= mesh.GetNP()); j++)
-	if ((mesh.Point(j)-Point<3>(mp)).Length() < 1e-6)
-	  exists = 1;
-      
-      if (!exists)
-      */
-
-      mesh.AddPoint (mp);
-    }
-  
-  int facenr = 0;
-  int edgenr = 0;
-  
-  int total = 0;
-  int solidnr = 0;
-
-  ARRAY<int> face2solid;
-  face2solid.SetSize (geom.fmap.Extent());
-  face2solid = 0;
-
-  /*
-  for (exp0.Init(geom.shape, TopAbs_SOLID); exp0.More(); exp0.Next())
-    {
-      solidnr++;
-      for (exp01.Init(exp0.Current(), TopAbs_SHELL); exp01.More(); exp01.Next())
-	{
-	  TopoDS_Shape shell = exp01.Current();
-	  for (exp1.Init(shell, TopAbs_FACE); exp1.More(); exp1.Next())
-	    {
-	      TopoDS_Face face = TopoDS::Face(exp1.Current());
-	      facenr = geom.fmap.FindIndex(face);
-	      face2solid[facenr-1] = solidnr;
-	    
-	      for (exp2.Init (face, TopAbs_WIRE); exp2.More(); exp2.Next())
-		{
-		  TopoDS_Shape wire = exp2.Current();
-		  
-		  for (exp3.Init (wire, TopAbs_EDGE); exp3.More(); exp3.Next())
-		    {
-		      total++;
-		    }
-		}
-	    }
-	  }
-      }
-  */
-
-  for (exp0.Init(geom.shape, TopAbs_SOLID); exp0.More(); exp0.Next())
-    {
-      solidnr++;
-      for (exp1.Init(exp0.Current(), TopAbs_FACE); exp1.More(); exp1.Next())
-	{
-	  TopoDS_Face face = TopoDS::Face(exp1.Current());
-	  facenr = geom.fmap.FindIndex(face);
-	  face2solid[facenr-1] = solidnr;
-	}
-      }
-
-
-  for (int i3 = 1; i3 <= geom.fmap.Extent(); i3++)
-    for (exp2.Init (geom.fmap(i3), TopAbs_WIRE); exp2.More(); exp2.Next())
-      for (exp3.Init (exp2.Current(), TopAbs_EDGE); exp3.More(); exp3.Next())
-	total++;
-	   
-
-  int curr = 0;
-
-  
-  solidnr = 0;
-  /*
-  for (exp0.Init(geom.shape, TopAbs_SOLID); exp0.More(); exp0.Next())
-    {
-      solidnr++;
-      for (exp01.Init(exp0.Current(), TopAbs_SHELL); exp01.More(); exp01.Next())
-	{
-	  TopoDS_Shape shell = exp01.Current();
-	  
-	  for (exp1.Init(shell, TopAbs_FACE); exp1.More(); exp1.Next())
-	    {
-	      
-	      TopoDS_Face face = TopoDS::Face(exp1.Current());
-  */
-	      
-  for (int i3 = 1; i3 <= geom.fmap.Extent(); i3++)
-    
-      
-	{
-	  {
-	    {
-	      TopoDS_Face face = TopoDS::Face(geom.fmap(i3));
-	      solidnr = face2solid[i3-1];
-	      
-	      
-	      facenr = geom.fmap.FindIndex (face);
-	      
-	      mesh.AddFaceDescriptor (FaceDescriptor(facenr, solidnr, 0, 0));
-	      Handle(Geom_Surface) occface = BRep_Tool::Surface(face);
-	      
-	      for (exp2.Init (face, TopAbs_WIRE); exp2.More(); exp2.Next())
-		{
-		  TopoDS_Shape wire = exp2.Current();
-		  
-		  for (exp3.Init (wire, TopAbs_EDGE); exp3.More(); exp3.Next())
-		    {
-		      curr++;
- 
-		      multithread.percent = 100 * curr / (double) total;
-		      if (multithread.terminate) return;
-
-		      TopoDS_Edge edge = TopoDS::Edge (exp3.Current());
-		      if (BRep_Tool::Degenerated(edge)) continue;
-
-		      if (geom.vmap.FindIndex(TopExp::FirstVertex (edge)) == 
-			  geom.vmap.FindIndex(TopExp::LastVertex (edge)))
-			{
-			  GProp_GProps system;
-			  BRepGProp::LinearProperties(edge, system);
-
-			  if (system.Mass() < 1e-5)
-			    {
-			      cout << "ignoring edge " << geom.emap.FindIndex (edge)
-				   << ". closed edge with length < 1e-5" << endl;
-			      continue;
-			    }
-			}
-
-
-		      Handle(Geom2d_Curve) cof;
-		      double s0, s1;
-		      cof = BRep_Tool::CurveOnSurface (edge, face, s0, s1);
-
-		      int geomedgenr = geom.emap.FindIndex(edge);
-
-		      ARRAY <MeshPoint> mp;
-		      ARRAY <double> params;
-
-		      DivideEdge (edge, mp, params, mesh);
-
-		    
-		      ARRAY <int> pnums;
-		      pnums.SetSize (mp.Size()+2);
-		    
-		      pnums[0] = geom.vmap.FindIndex (TopExp::FirstVertex (edge));
-		      pnums[pnums.Size()-1] = geom.vmap.FindIndex (TopExp::LastVertex (edge));
-
-		      for (i = 1; i <= mp.Size(); i++)
-			{
-			  int exists = 0;
-			
-			  for (j = 1; !exists && (j <= mesh.GetNP()-nvertices); j++)
-			    if ((mesh.Point(nvertices+j)-Point<3>(mp[i-1])).Length() < 1e-6) exists = 1;
-
-			  if (exists)
-			    {
-			      pnums[i] = nvertices+j-1;
-			    }
-			  else
-			    {
-			      mesh.AddPoint (mp[i-1]);
-			      pnums[i] = mesh.GetNP();
-			    }
-			}
-		    
-		      for (i = 1; i <= mp.Size()+1; i++)
-			{
-			  edgenr++;
-			  Segment seg;
-			
-			  seg.p1 = pnums[i-1];
-			  seg.p2 = pnums[i];
-			  seg.edgenr = edgenr;
-			  seg.si = facenr;
-			  seg.epgeominfo[0].dist = params[i-1];
-			  seg.epgeominfo[1].dist = params[i];
-			  seg.epgeominfo[0].edgenr = geomedgenr;
-			  seg.epgeominfo[1].edgenr = geomedgenr;
-			
-			  gp_Pnt2d p2d;
-			  p2d = cof->Value(params[i-1]);
-			  //			if (i == 1) p2d = cof->Value(s0);
-			  seg.epgeominfo[0].u = p2d.X();
-			  seg.epgeominfo[0].v = p2d.Y();
-			  p2d = cof->Value(params[i]);
-			  //			if (i == mp.Size()+1) p2d = cof -> Value(s1);
-			  seg.epgeominfo[1].u = p2d.X();
-			  seg.epgeominfo[1].v = p2d.Y();
-
-			  /*
-			    if (occface->IsUPeriodic())
-			    {
-			    cout << "U Periodic" << endl;
-			    if (fabs(seg.epgeominfo[1].u-seg.epgeominfo[0].u) >
-			    fabs(seg.epgeominfo[1].u-
-			    (seg.epgeominfo[0].u-occface->UPeriod())))
-			    seg.epgeominfo[0].u = p2d.X()+occface->UPeriod();
-
-			    if (fabs(seg.epgeominfo[1].u-seg.epgeominfo[0].u) >
-			    fabs(seg.epgeominfo[1].u-
-			    (seg.epgeominfo[0].u+occface->UPeriod())))
-			    seg.epgeominfo[0].u = p2d.X()-occface->UPeriod();
-			    }
-
-			    if (occface->IsVPeriodic())
-			    {
-			    cout << "V Periodic" << endl;
-			    if (fabs(seg.epgeominfo[1].v-seg.epgeominfo[0].v) >
-			    fabs(seg.epgeominfo[1].v-
-			    (seg.epgeominfo[0].v-occface->VPeriod())))
-			    seg.epgeominfo[0].v = p2d.Y()+occface->VPeriod();
-
-			    if (fabs(seg.epgeominfo[1].v-seg.epgeominfo[0].v) >
-			    fabs(seg.epgeominfo[1].v-
-			    (seg.epgeominfo[0].v+occface->VPeriod())))
-			    seg.epgeominfo[0].v = p2d.Y()-occface->VPeriod();
-			    }
-			  */
-			
-			  if (edge.Orientation() == TopAbs_REVERSED)
-			    {
-			      swap (seg.p1, seg.p2);
-			      swap (seg.epgeominfo[0].dist, seg.epgeominfo[1].dist);
-			      swap (seg.epgeominfo[0].u, seg.epgeominfo[1].u);
-			      swap (seg.epgeominfo[0].v, seg.epgeominfo[1].v);
-			    }
-
-			  mesh.AddSegment (seg);
-
-			}
-		    }
-		}
-	    }
-	}
-    }
-  mesh.CalcSurfacesOfNode();
-  multithread.task = savetask;
-}  
-
-
-
-
-static void OCCMeshSurface (OCCGeometry & geom, Mesh & mesh, int perfstepsend)
-{
-  int i, j, k;
-  int changed;
-
-  char * savetask = multithread.task;
-  multithread.task = "Surface meshing";
-  
-  geom.facemeshstatus = 0;
-
-  int noldp = mesh.GetNP();
-
-  double starttime = GetTime();
-
-  ARRAY<int> glob2loc(noldp);
-
-  int projecttype = PARAMETERSPACE;
-  
-  //int projecttype = PLANESPACE;
-
-  int notrys = 1;
-
-  int surfmesherror = 0;
-
-  for (k = 1; k <= mesh.GetNFD(); k++)
-    {
-      (*testout) << "mesh face " << k << endl;
-      multithread.percent = 100 * k / (mesh.GetNFD()+1e-10);
-      geom.facemeshstatus[k-1] = -1;
-
-      
-      /*
-      if (k != 138)
-	{
-	  cout << "skipped" << endl;
-	  continue;
-	}
-      */
-    
-      FaceDescriptor & fd = mesh.GetFaceDescriptor(k);
-
-      int oldnf = mesh.GetNSE();
-
-      Box<3> bb = geom.GetBoundingBox();
- 
-      Meshing2OCCSurfaces meshing(TopoDS::Face(geom.fmap(k)), bb, projecttype); 
-
-      if (meshing.GetProjectionType() == PLANESPACE)
-	PrintMessage (2, "Face ", k, " / ", mesh.GetNFD(), " (plane space projection)");
-      else
-	PrintMessage (2, "Face ", k, " / ", mesh.GetNFD(), " (parameter space projection)");
-
-      if (surfmesherror)
-	cout << "Surface meshing error occured before (in " << surfmesherror << " faces)" << endl;
-
-      //      Meshing2OCCSurfaces meshing(f2, bb); 
-      meshing.SetStartTime (starttime);
-
-      (*testout) << "Face " << k << endl << endl;
-
-
-      if (meshing.GetProjectionType() == PLANESPACE)
-	{
-	  int cntp = 0;
-	  glob2loc = 0;
-	  for (i = 1; i <= mesh.GetNSeg(); i++)
-	    {
-	      Segment & seg = mesh.LineSegment(i);
-	      if (seg.si == k)
-		{
-		  for (j = 1; j <= 2; j++)
-		    {
-		      int pi = (j == 1) ? seg.p1 : seg.p2;
-		      if (!glob2loc.Get(pi))
-			{
-			  meshing.AddPoint (mesh.Point(pi), pi);
-			  cntp++;
-			  glob2loc.Elem(pi) = cntp;
-			}
-		    }
-		}
-	    }
-	  
-	  for (i = 1; i <= mesh.GetNSeg(); i++)
-	    {
-	      Segment & seg = mesh.LineSegment(i);
-	      if (seg.si == k)
-		{
-		  PointGeomInfo gi0, gi1;
-		  gi0.trignum = gi1.trignum = k;
-		  gi0.u = seg.epgeominfo[0].u;
-		  gi0.v = seg.epgeominfo[0].v;
-		  gi1.u = seg.epgeominfo[1].u;
-		  gi1.v = seg.epgeominfo[1].v;
-		  
-		  meshing.AddBoundaryElement (glob2loc.Get(seg.p1), glob2loc.Get(seg.p2), gi0, gi1);
-		  (*testout) << gi0.u << " " << gi0.v << endl;
-		  (*testout) << gi1.u << " " << gi1.v << endl;
-		}
-	    }
-	}
-      else
-	{
-	  int cntp = 0;
-	  
-	  for (i = 1; i <= mesh.GetNSeg(); i++)
-	    if (mesh.LineSegment(i).si == k)
-	      cntp+=2;
-	  
-	  
-	  ARRAY< PointGeomInfo > gis;
-	  
-	  gis.SetAllocSize (cntp);
-	  gis.SetSize (0);
-	  
-	  for (i = 1; i <= mesh.GetNSeg(); i++)
-	    {
-	      Segment & seg = mesh.LineSegment(i);
-	      if (seg.si == k)
-		{
-		  PointGeomInfo gi0, gi1;
-		  gi0.trignum = gi1.trignum = k;
-		  gi0.u = seg.epgeominfo[0].u;
-		  gi0.v = seg.epgeominfo[0].v;
-		  gi1.u = seg.epgeominfo[1].u;
-		  gi1.v = seg.epgeominfo[1].v;
-		  
-		  int locpnum[2] = {0, 0};
-		  
-		  for (j = 0; j < 2; j++)
-		    {
-		      PointGeomInfo gi = (j == 0) ? gi0 : gi1;
-		      
-		      int l;
-		      for (l = 0; l < gis.Size() && locpnum[j] == 0; l++)
-			{
-			  double dist = sqr (gis[l].u-gi.u)+sqr(gis[l].v-gi.v);
-
-			  if (dist < 1e-10)
-			    locpnum[j] = l+1;
-			}
-		      
-		      if (locpnum[j] == 0)
-			{
-			  int pi = (j == 0) ? seg.p1 : seg.p2;
-			  meshing.AddPoint (mesh.Point(pi), pi);
-
-			  gis.SetSize (gis.Size()+1);
-			  gis[l] = gi;
-			  locpnum[j] = l+1;
-			}
-		    }
-		  
-		  meshing.AddBoundaryElement (locpnum[0], locpnum[1], gi0, gi1);
-		  (*testout) << gi0.u << " " << gi0.v << endl;
-		  (*testout) << gi1.u << " " << gi1.v << endl;
-	      
-		}
-	    }
-	}
-
-
-
-
-
-
-      double maxh = mparam.maxh;
-      mparam.checkoverlap = 0;
-      //      int noldpoints = mesh->GetNP();
-      int noldsurfel = mesh.GetNSE();
-
-      MESHING2_RESULT res;
-
-      try {
-        res = meshing.GenerateMesh (mesh, maxh, k);
-      }
-
-      catch (SingularMatrixException)
-	{
-	  (*myerr) << "Singular Matrix" << endl;
-	  res = MESHING2_GIVEUP;
-	}
-
-      catch (UVBoundsException)
-	{
-	  (*myerr) << "UV bounds exceeded" << endl;
-	  res = MESHING2_GIVEUP;
-	}
-
-      projecttype = PARAMETERSPACE;
-
-      if (res != MESHING2_OK)
-	{
-	  if (notrys == 1)
-	    {
-	      for (int i = noldsurfel+1; i <= mesh.GetNSE(); i++)
-		mesh.DeleteSurfaceElement (i);
-	      
-	      mesh.Compress();
-
-	      cout << "retry Surface " << k << endl;
-
-	      k--;
-	      projecttype*=-1;
-	      notrys++;
-	      continue;
-	    }
-	  else
-	    {
-	      geom.facemeshstatus[k-1] = -1;
-	      PrintError ("Problem in Surface mesh generation");
-	      surfmesherror++;
-	      //	      throw NgException ("Problem in Surface mesh generation");
-	    }
-	}
-      else
-	{
-	  geom.facemeshstatus[k-1] = 1;
- 	}
-
-      notrys = 1;
-      
-      for (i = oldnf+1; i <= mesh.GetNSE(); i++)
-	mesh.SurfaceElement(i).SetIndex (k);
-
-    }
-
-  if (surfmesherror)
-    {
-      cout << "WARNING! NOT ALL FACES HAVED BEEN MESHED" << endl;
-      cout << "SURFACE MESHING ERROR OCCURED IN " << surfmesherror << " FACES:" << endl;
-      for (int i = 1; i <= geom.fmap.Extent(); i++)
-	  if (geom.facemeshstatus[i-1] == -1)
-	    cout << "Face " << i << endl;
-      cout << endl;
-      cout << "for more information open IGES/STEP Topology Explorer" << endl;
-      throw NgException ("Problem in Surface mesh generation");
-    }
-
-
-  if (multithread.terminate || perfstepsend < MESHCONST_OPTSURFACE)
-    return;
-
-  multithread.task = "Optimizing surface";
-  
-  for (k = 1; k <= mesh.GetNFD(); k++)
-    {
-      (*testout) << "optimize face " << k << endl;
-      multithread.percent = 100 * k / (mesh.GetNFD()+1e-10);
-      
-      FaceDescriptor & fd = mesh.GetFaceDescriptor(k);
-      
-      PrintMessage (1, "Optimize Surface ", k);
-      for (i = 1; i <= mparam.optsteps2d; i++)
-	{
-	  if (multithread.terminate) return;
-	  
-	  {
-	    MeshOptimize2dOCCSurfaces meshopt(geom);
-	    meshopt.SetFaceIndex (k);
-	    meshopt.SetImproveEdges (0);
-	    meshopt.SetMetricWeight (0.2);
-	    meshopt.SetWriteStatus (0);
-	    
-	    meshopt.EdgeSwapping (mesh, (i > mparam.optsteps2d/2));
-	  }
-	  
-	  if (multithread.terminate) return;
-	  {
-	    MeshOptimize2dOCCSurfaces meshopt(geom);
-	    meshopt.SetFaceIndex (k);
-	    meshopt.SetImproveEdges (0);
-	    meshopt.SetMetricWeight (0.2);
-	    meshopt.SetWriteStatus (0);
-	    
-	    meshopt.ImproveMesh (mesh);
-	  }
-	  
-	  {
-	    MeshOptimize2dOCCSurfaces meshopt(geom);
-	    meshopt.SetFaceIndex (k);
-	    meshopt.SetImproveEdges (0);
-	    meshopt.SetMetricWeight (0.2);
-	    meshopt.SetWriteStatus (0);
-	    
-	    meshopt.CombineImprove (mesh);
-	  }
-	  
-	  if (multithread.terminate) return;
-	  {
-	    MeshOptimize2dOCCSurfaces meshopt(geom);
-	    meshopt.SetFaceIndex (k);
-	    meshopt.SetImproveEdges (0);
-	    meshopt.SetMetricWeight (0.2);
-	    meshopt.SetWriteStatus (0);
-	    
-	    meshopt.ImproveMesh (mesh);
-	  }
-	}
-      
-    }
-  
-  
-  mesh.CalcSurfacesOfNode();
-  mesh.Compress();
-
-  multithread.task = savetask;
-}
-
-double ComputeH (double kappa)
-{
-  double hret;
-  kappa *= mparam.curvaturesafety;
-  
-  if (mparam.maxh * kappa < 1)
-    hret = mparam.maxh;
-  else
-    hret = 1 / kappa;
-  
-  if (mparam.maxh < hret)
-    hret = mparam.maxh;
-  
-  return (hret);
-}
-
-
-class Line
-{
-public:
-  Point<3> p0, p1;
-  double Dist (Line l)
-  {
-    Vec<3> n = p1-p0;
-    Vec<3> q = l.p1-l.p0;
-    double nq = n*q;
-    
-    Point<3> p = p0 + 0.5*n;
-    double lambda = (p-l.p0)*n / nq;
-
-    if (lambda >= 0 && lambda <= 1)
-      {
-	double d = (p-l.p0-lambda*q).Length();
-	//        if (d < 1e-3) d = 1e99;
-	return d;
-      }
-    else
-      return 1e99;
-  }
-  
-  double Length ()
-  {
-    return (p1-p0).Length();
-  };
-};
-
-
-
-void RestrictHTriangle (gp_Pnt2d & par0, gp_Pnt2d & par1, gp_Pnt2d & par2,
-			BRepLProp_SLProps * prop, Mesh & mesh, double maxside, int depth, double h = 0)
-{
-  gp_Pnt2d parmid;
-
-  parmid.SetX(0.3*(par0.X()+par1.X()+par2.X()));
-  parmid.SetY(0.3*(par0.Y()+par1.Y()+par2.Y()));
-  
-  if (depth == 0)
-    {
-      prop->SetParameters (parmid.X(), parmid.Y());
-      if (!prop->IsCurvatureDefined())
-	{
-	  (*testout) << "curvature not defined!" << endl;
-	  return;
-	}
-      double curvature = max(fabs(prop->MinCurvature()), fabs(prop->MaxCurvature()));
-      if (curvature < 1e-3)
-	{
-	  (*testout) << "curvature too small (" << curvature << ")!" << endl;
-	  //	  return;
-	}
-      h = ComputeH (curvature+1e-10);
-    }
-  
-  if (h < maxside)
-    {
-      gp_Pnt2d pm0;
-      gp_Pnt2d pm1;
-      gp_Pnt2d pm2;
-      
-      pm0.SetX(0.5*(par1.X()+par2.X())); pm0.SetY(0.5*(par1.Y()+par2.Y()));
-      pm1.SetX(0.5*(par0.X()+par2.X())); pm1.SetY(0.5*(par0.Y()+par2.Y()));
-      pm2.SetX(0.5*(par1.X()+par0.X())); pm2.SetY(0.5*(par1.Y()+par0.Y()));
-
-      RestrictHTriangle (pm0, pm1, pm2, prop, mesh, maxside/2, depth+1, h);
-      RestrictHTriangle (par0, pm1, pm2, prop, mesh, maxside/2, depth+1, h);
-      RestrictHTriangle (par1, pm0, pm2, prop, mesh, maxside/2, depth+1, h);
-      RestrictHTriangle (par2, pm1, pm0, prop, mesh, maxside/2, depth+1, h);
-    }
-  else
-    {
-      prop->SetParameters (parmid.X(), parmid.Y());
-      gp_Pnt pnt = prop->Value();
-      Point3d p3d(pnt.X(), pnt.Y(), pnt.Z());
-      mesh.RestrictLocalH (p3d, h);
-
-      prop->SetParameters (par0.X(), par0.Y());
-      pnt = prop->Value();
-      p3d = Point3d(pnt.X(), pnt.Y(), pnt.Z());
-      mesh.RestrictLocalH (p3d, h);
-
-      prop->SetParameters (par1.X(), par1.Y());
-      pnt = prop->Value();
-      p3d = Point3d(pnt.X(), pnt.Y(), pnt.Z());
-      mesh.RestrictLocalH (p3d, h);
-
-      prop->SetParameters (par2.X(), par2.Y());
-      pnt = prop->Value();
-      p3d = Point3d(pnt.X(), pnt.Y(), pnt.Z());
-      mesh.RestrictLocalH (p3d, h);
-
-      //      (*testout) << "p = " << p3d << ", h = " << h << ", maxside = " << maxside << endl;
-      /*
-      (*testout) << pnt.X() << " " << pnt.Y() << " " << pnt.Z() << endl;
-
-      prop->SetParameters (par0.X(), par0.Y());
-      pnt = prop->Value();
-      (*testout) << pnt.X() << " " << pnt.Y() << " " << pnt.Z() << endl;
-
-      prop->SetParameters (par1.X(), par1.Y());
-      pnt = prop->Value();
-      (*testout) << pnt.X() << " " << pnt.Y() << " " << pnt.Z() << endl;
-
-      prop->SetParameters (par2.X(), par2.Y());
-      pnt = prop->Value();
-      (*testout) << pnt.X() << " " << pnt.Y() << " " << pnt.Z() << endl;
-      */
-    }
-}
-
-
-
-
-int OCCGenerateMesh (OCCGeometry & geom,
-		  Mesh *& mesh,
-		  int perfstepsstart, int perfstepsend,
-		  char * optstr)
-{
-  int i, j;
-
-  multithread.percent = 0;
-
-  if (perfstepsstart <= MESHCONST_ANALYSE)
-    {
-      delete mesh;
-      mesh = new Mesh();
-
-      mesh->SetGlobalH (mparam.maxh);
-
-      ARRAY<double> maxhdom;
-      maxhdom.SetSize (geom.NrSolids());
-      maxhdom = mparam.maxh;
-      
-      mesh->SetMaxHDomain (maxhdom);
-      
-      Box<3> bb = geom.GetBoundingBox();
-      bb.Increase (bb.Diam()/10);
-      
-      mesh->SetLocalH (bb.PMin(), bb.PMax(), 0.5);
-    
-
-      if (mparam.uselocalh)
-	{
-
-	  char * savetask = multithread.task;
-	  multithread.percent = 0;
-
-	  mesh->SetLocalH (bb.PMin(), bb.PMax(), mparam.grading);
-
-	  int nedges = geom.emap.Extent();
-	  int i;
-
-	  double maxedgelen = 0;
-	  double minedgelen = 1e99;
-
-	  
-	  multithread.task = "Setting local mesh size (elements per edge)";
-
-	  // setting elements per edge
-
-	  for (i = 1; i <= nedges && !multithread.terminate; i++)
-	    {
-	      TopoDS_Edge e = TopoDS::Edge (geom.emap(i));
-	      multithread.percent = 100 * (i-1)/double(nedges);
-	      if (BRep_Tool::Degenerated(e)) continue;
-
-	      GProp_GProps system;	       
-	      BRepGProp::LinearProperties(e, system);
-	      double len = system.Mass();
-
-	      if (len < IGNORECURVELENGTH)
-		{
-		  (*testout) << "ignored" << endl;
-		  continue;
-		}
-
-
-	      double localh = len/mparam.segmentsperedge;
-	      double s0, s1;
-	      Handle(Geom_Curve) c = BRep_Tool::Curve(e, s0, s1);
-
-	      maxedgelen = max (maxedgelen, len);
-	      minedgelen = min (minedgelen, len);
-
-	      int j;
-	      int maxj = (int) ceil (localh);
-	      for (j = 0; j <= localh; j++)
-		{
-		  gp_Pnt pnt = c->Value (s0+double(j)/maxj*(s1-s0));
-		  mesh->RestrictLocalH (Point3d(pnt.X(), pnt.Y(), pnt.Z()), localh);
-		}
-	    }
-
-
-
-
-	  multithread.task = "Setting local mesh size (edge curvature)";
-
-	  
-	  // setting edge curvature
-
-	  //	  int nsections = 10;
-	  int nsections = 20;
-
-	  for (i = 1; i <= nedges && !multithread.terminate; i++)
-	    {
-	      multithread.percent = 100 * (i-1)/double(nedges);
-	      TopoDS_Edge edge = TopoDS::Edge (geom.emap(i));
-	      if (BRep_Tool::Degenerated(edge)) continue;
-	      double s0, s1;
-	      Handle(Geom_Curve) c = BRep_Tool::Curve(edge, s0, s1);
-	      BRepAdaptor_Curve brepc(edge);
- 	      BRepLProp_CLProps prop(brepc, 2, 1e-5);
-	      
-	      int j;
-	      for (j = 1; j <= nsections; j++)
-		//	      for (j = 0; j < nsections; j++)
-		{
-		  double s = s0 + j/(double) nsections * (s1-s0);
-		  prop.SetParameter (s);
-		  double curvature = prop.Curvature();
-
-		  if (curvature >= 1e99) continue;
-
-		  gp_Pnt pnt = c->Value (s);
-
-		  mesh->RestrictLocalH (Point3d(pnt.X(), pnt.Y(), pnt.Z()),
-					ComputeH (fabs(curvature)));		  
-		}
-	    }
-
-	  
-
-	  multithread.task = "Setting local mesh size (face curvature)";
-
-	  // setting face curvature
-	  
-	  int nfaces = geom.fmap.Extent();
-	  
-	  for (i = 1; i <= nfaces && !multithread.terminate; i++)
-	    {
-	      multithread.percent = 100 * (i-1)/double(nfaces);
-	      TopoDS_Face face = TopoDS::Face(geom.fmap(i));
-	      TopLoc_Location loc;
-	      Handle(Geom_Surface) surf = BRep_Tool::Surface (face);
-	      Handle(Poly_Triangulation) triangulation = BRep_Tool::Triangulation (face, loc);
-	      if (triangulation.IsNull()) continue;
-	      
-	      BRepAdaptor_Surface sf(face, Standard_True);
-	      BRepLProp_SLProps prop(sf, 2, 1e-5);
-
-	      int ntriangles = triangulation -> NbTriangles();
-	      for (j = 1; j <= ntriangles; j++)
-		{
-		  int k;
-		  gp_Pnt p[3];
-		  gp_Pnt2d par[3];
-
-		  for (k = 1; k <=3; k++)
-		    {
-		      int n = triangulation->Triangles()(j)(k);
-		      p[k-1] = triangulation->Nodes()(n).Transformed(loc);
-		      par[k-1] = triangulation->UVNodes()(n);
-		    }
-
-		  double maxside = 0;
-		  maxside = max (maxside, p[0].Distance(p[1]));
-		  maxside = max (maxside, p[0].Distance(p[2]));
-		  maxside = max (maxside, p[1].Distance(p[2]));
-
-		  RestrictHTriangle (par[0], par[1], par[2], &prop, *mesh, maxside, 0);
-		}
-	    }
-
-
-
-	  // setting close edges
-
-	  if (stlparam.resthcloseedgeenable)
-	    {
-	      multithread.task = "Setting local mesh size (close edges)";
-	      
-	      int sections = 100;
-	      
-	      ARRAY<Line> lines(sections*nedges);
-	      
-	      Box3dTree* searchtree =
-		new Box3dTree (bb.PMin(), bb.PMax());
-	      
-	      int nlines = 0;
-	      for (int i = 1; i <= nedges && !multithread.terminate; i++)
-		{
-		  TopoDS_Edge edge = TopoDS::Edge (geom.emap(i));
-		  if (BRep_Tool::Degenerated(edge)) continue;
-
-		  double s0, s1;
-		  Handle(Geom_Curve) c = BRep_Tool::Curve(edge, s0, s1);
-		  BRepAdaptor_Curve brepc(edge);
-		  BRepLProp_CLProps prop(brepc, 1, 1e-5);
-		  prop.SetParameter (s0);
-
-		  gp_Vec d0 = prop.D1().Normalized();
-		  double s_start = s0;
-		  int count = 0;
-		  for (int j = 1; j <= sections; j++)
-		    {
-		      double s = s0 + (s1-s0)*(double)j/(double)sections;
-		      prop.SetParameter (s);
-		      gp_Vec d1 = prop.D1().Normalized();
-		      double cosalpha = fabs(d0*d1);
-		      if ((j == sections) || (cosalpha < cos(10.0/180.0*M_PI)))
-			{
-			  count++;
-			  gp_Pnt p0 = c->Value (s_start);
-			  gp_Pnt p1 = c->Value (s);
-			  lines[nlines].p0 = Point<3> (p0.X(), p0.Y(), p0.Z());
-			  lines[nlines].p1 = Point<3> (p1.X(), p1.Y(), p1.Z());
-		      
-			  Box3d box;
-			  box.SetPoint (Point3d(lines[nlines].p0));
-			  box.AddPoint (Point3d(lines[nlines].p1));
-
-			  searchtree->Insert (box.PMin(), box.PMax(), nlines+1);
-			  nlines++;
-
-			  s_start = s;
-			  d0 = d1;
-			}
-		    }
-		}
-		
-	      ARRAY<int> linenums;
-	      
-	      for (int i = 0; i < nlines; i++)
-		{
-		  multithread.percent = (100*i)/double(nlines);
-		  Line & line = lines[i];
-		  
-		  Box3d box;
-		  box.SetPoint (Point3d(line.p0));
-		  box.AddPoint (Point3d(line.p1));
-		  double maxhline = max (mesh->GetH(box.PMin()),
-					 mesh->GetH(box.PMax()));
-		  box.Increase(maxhline);
-
-		  double mindist = 1e99;
-		  linenums.SetSize(0);
-		  searchtree->GetIntersecting(box.PMin(),box.PMax(),linenums);
-
-		  for (int j = 0; j < linenums.Size(); j++)
-		    {
-		      int num = linenums[j]-1;
-		      if (i == num) continue;
-		      if ((line.p0-lines[num].p0).Length2() < 1e-15) continue;
-		      if ((line.p0-lines[num].p1).Length2() < 1e-15) continue;
-		      if ((line.p1-lines[num].p0).Length2() < 1e-15) continue;
-		      if ((line.p1-lines[num].p1).Length2() < 1e-15) continue;
-		      mindist = min (mindist, line.Dist(lines[num]));
-		    }
-		  
-		  mindist *= stlparam.resthcloseedgefac;
-
-		  if (mindist < 1e-3) 
-		    {
-		      (*testout) << "extremely small local h: " << mindist
-				 << " --> setting to 1e-3" << endl;
-		      mindist = 1e-3;
-		    }
-
-		  mesh->RestrictLocalHLine(line.p0, line.p1, mindist);
-		}
-	    }
-				   
-
-
-	  multithread.task = savetask;
-
-	}
-    }
-
-
-  if (multithread.terminate || perfstepsend <= MESHCONST_ANALYSE) 
-    return TCL_OK;
-
-  if (perfstepsstart <= MESHCONST_MESHEDGES)
-    {
-      FindEdges (geom, *mesh);
-
-      /*
-      cout << "Removing redundant points" << endl;
-      
-      int i, j;
-      int np = mesh->GetNP();
-      ARRAY<int> equalto;
-
-      equalto.SetSize (np);
-      equalto = 0;
-
-      for (i = 1; i <= np; i++)
-	{
-	  for (j = i+1; j <= np; j++)
-	    {
-	      if (!equalto[j-1] && (Dist2 (mesh->Point(i), mesh->Point(j)) < 1e-12))
-		equalto[j-1] = i;
-	    }
-	}
-
-      for (i = 1; i <= np; i++)
-	if (equalto[i-1])
-	  {
-	    cout << "Point " << i << " is equal to Point " << equalto[i-1] << endl;
-	    for (j = 1; j <= mesh->GetNSeg(); j++)
-	      {
-		Segment & seg = mesh->LineSegment(j);
-		if (seg.p1 == i) seg.p1 = equalto[i-1];
-		if (seg.p2 == i) seg.p2 = equalto[i-1];
-	      }
-	  }
-
-      cout << "Removing degenerated segments" << endl;
-      for (j = 1; j <= mesh->GetNSeg(); j++)
-	{
-	  Segment & seg = mesh->LineSegment(j);
-	  if (seg.p1 == seg.p2)
-	    {
-	      mesh->DeleteSegment(j);
-	      cout << "Deleting Segment " << j << endl;
-	    }
-	}
-
-      mesh->Compress();
-      */
-
-      /*
-      for (int i = 1; i <= geom.fmap.Extent(); i++)
-	{
-	  Handle(Geom_Surface) hf1 =
-	    BRep_Tool::Surface(TopoDS::Face(geom.fmap(i)));
-	  for (int j = i+1; j <= geom.fmap.Extent(); j++)
-	    {
-	      Handle(Geom_Surface) hf2 = 
-		BRep_Tool::Surface(TopoDS::Face(geom.fmap(j)));
-	      if (hf1 == hf2) cout << "face " << i << " and face " << j << " lie on same surface" << endl;
-	    }
-	}
-      */
-
-
-
-#ifdef LOG_STREAM      
-      (*logout) << "Edges meshed" << endl
-		<< "time = " << GetTime() << " sec" << endl
-		<< "points: " << mesh->GetNP() << endl;
-#endif
-    }
-
-   if (multithread.terminate || perfstepsend <= MESHCONST_MESHEDGES)
-    return TCL_OK;
-
-  if (perfstepsstart <= MESHCONST_MESHSURFACE)
-    {
-      OCCMeshSurface (geom, *mesh, perfstepsend);  
-      if (multithread.terminate) return TCL_OK;
-      
-#ifdef LOG_STREAM
-      (*logout) << "Surfaces meshed" << endl
-		<< "time = " << GetTime() << " sec" << endl
-		<< "points: " << mesh->GetNP() << endl;
-#endif      
-      
-#ifdef STAT_STREAM
-      (*statout) << mesh->GetNSeg() << " & "
-		 << mesh->GetNSE() << " & - &" 
-		 << GetTime() << " & " << endl;
-#endif  
-      
-      //      MeshQuality2d (*mesh);
-      mesh->CalcSurfacesOfNode();
-    }
-
-  if (multithread.terminate || perfstepsend <= MESHCONST_OPTSURFACE)
-    return TCL_OK;
-  
-
-  if (perfstepsstart <= MESHCONST_MESHVOLUME)
-    {
-      multithread.task = "Volume meshing";
-      
-      MESHING3_RESULT res =
-	MeshVolume (mparam, *mesh);
-
-      if (res != MESHING3_OK) return TCL_ERROR;
-      
-      if (multithread.terminate) return TCL_OK;
-      
-      RemoveIllegalElements (*mesh);
-      if (multithread.terminate) return TCL_OK;
-
-      MeshQuality3d (*mesh);
-      
-#ifdef STAT_STREAM
-      (*statout) << GetTime() << " & ";
-#endif      
-      
-#ifdef LOG_STREAM
-      (*logout) << "Volume meshed" << endl
-		<< "time = " << GetTime() << " sec" << endl
-	    << "points: " << mesh->GetNP() << endl;
-#endif
-    }
-
-  if (multithread.terminate || perfstepsend <= MESHCONST_MESHVOLUME)
-    return TCL_OK;
-
-
-  if (perfstepsstart <= MESHCONST_OPTVOLUME)
-    {
-      multithread.task = "Volume optimization";
-      
-      OptimizeVolume (mparam, *mesh);
-      if (multithread.terminate) return TCL_OK;
-      
-#ifdef STAT_STREAM
-      (*statout) << GetTime() << " & "
-		 << mesh->GetNE() << " & "
-		 << mesh->GetNP() << " " << '\\' << '\\' << " \\" << "hline" << endl;
-#endif      
-
-#ifdef LOG_STREAM      
-      (*logout) << "Volume optimized" << endl
-		<< "time = " << GetTime() << " sec" << endl
-	    << "points: " << mesh->GetNP() << endl;
-#endif
-
-     
-      cout << "Optimization complete" << endl;
-      
-    }
-
-  (*testout) << "NP: " << mesh->GetNP() << endl;
-  for (i = 1; i <= mesh->GetNP(); i++)
-      (*testout) << mesh->Point(i) << endl;
- 
-  (*testout) << endl << "NSegments: " << mesh->GetNSeg() << endl;
-  for (i = 1; i <= mesh->GetNSeg(); i++)
-    (*testout) << mesh->LineSegment(i) << endl;
-   
-
-
-  return TCL_OK;
-}
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/occ/occgeom.cpp b/contrib/Netgen/libsrc/occ/occgeom.cpp
deleted file mode 100644
index e24f52fa0a03fa0f8ad4673461e86f0bcb5cd74e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/occ/occgeom.cpp
+++ /dev/null
@@ -1,1102 +0,0 @@
-#ifdef OCCGEOMETRY
-
-#include <mystdlib.h>
-#include <occgeom.hpp>  
-#include "ShapeAnalysis_ShapeTolerance.hxx"
-#include "ShapeAnalysis_ShapeContents.hxx"
-#include "ShapeAnalysis_CheckSmallFace.hxx"
-#include "ShapeAnalysis_DataMapOfShapeListOfReal.hxx"
-#include "BRepAlgoAPI_Fuse.hxx"
-#include "BRepCheck_Analyzer.hxx"
-#include "BRepLib.hxx"
-#include "ShapeBuild_ReShape.hxx"
-#include "ShapeFix.hxx"
-#include "ShapeFix_FixSmallFace.hxx"
-
-
-namespace netgen
-{
-
-void OCCGeometry :: PrintNrShapes ()
-{
-  TopExp_Explorer e;
-  int count = 0;
-  for (e.Init(shape, TopAbs_COMPSOLID); e.More(); e.Next()) count++;
-  cout << "CompSolids: " << count << endl;
-
-  cout << "Solids    : " << somap.Extent() << endl;
-  cout << "Shells    : " << shmap.Extent() << endl;
-  cout << "Faces     : " << fmap.Extent() << endl;
-  cout << "Edges     : " << emap.Extent() << endl;
-  cout << "Vertices  : " << vmap.Extent() << endl;
-}
-
-
-void PrintContents (OCCGeometry * geom)
-{
-  ShapeAnalysis_ShapeContents cont;
-  cont.Clear();
-  cont.Perform(geom->shape);
-
-  (*testout) << "OCC CONTENTS" << endl;
-  (*testout) << "============" << endl;
-  (*testout) << "SOLIDS   : " << cont.NbSolids() << endl;
-  (*testout) << "SHELLS   : " << cont.NbShells() << endl;
-  (*testout) << "FACES    : " << cont.NbFaces() << endl;
-  (*testout) << "WIRES    : " << cont.NbWires() << endl;
-  (*testout) << "EDGES    : " << cont.NbEdges() << endl;
-  (*testout) << "VERTICES : " << cont.NbVertices() << endl;
-
-  TopExp_Explorer e;
-  int count = 0;
-  for (e.Init(geom->shape, TopAbs_COMPOUND); e.More(); e.Next())
-    count++;
-  (*testout) << "Compounds: " << count << endl;
-
-  count = 0;
-  for (e.Init(geom->shape, TopAbs_COMPSOLID); e.More(); e.Next())
-    count++;
-  (*testout) << "CompSolids: " << count << endl;
-
-  (*testout) << endl;
-
-  cout << "Highest entry in topology hierarchy: " << endl;
-  if (count)
-    cout << count << " composite solid(s)" << endl;
-  else
-    if (geom->somap.Extent())
-      cout << geom->somap.Extent() << " solid(s)" << endl;
-    else
-      if (geom->shmap.Extent())
-	cout << geom->shmap.Extent() << " shells(s)" << endl;
-      else
-	if (geom->fmap.Extent())
-	  cout << geom->fmap.Extent() << " face(s)" << endl;
-	else
-	  if (geom->wmap.Extent())
-	    cout << geom->wmap.Extent() << " wire(s)" << endl;
-	  else
-	    if (geom->emap.Extent())
-	      cout << geom->emap.Extent() << " edge(s)" << endl;
-	    else
-	      if (geom->vmap.Extent())
-		cout << geom->vmap.Extent() << " vertices(s)" << endl;
-	      else
-		cout << "no entities" << endl;
-
-}
-
-
-
-void OCCGeometry :: HealGeometry ()
-{
-  int nrc = 0, nrcs = 0,
-    nrso = somap.Extent(),
-    nrsh = shmap.Extent(),
-    nrf = fmap.Extent(),
-    nrw = wmap.Extent(),
-    nre = emap.Extent(),
-    nrv = vmap.Extent();
-
-  TopExp_Explorer e;
-  for (e.Init(shape, TopAbs_COMPOUND); e.More(); e.Next()) nrc++;
-  for (e.Init(shape, TopAbs_COMPSOLID); e.More(); e.Next()) nrcs++;
-
-  double surfacecont = 0;
-
-  for (int i = 1; i <= fmap.Extent(); i++)
-    {
-      GProp_GProps system;
-      BRepGProp::LinearProperties(fmap(i), system);
-      surfacecont += system.Mass();
-    }
-
-  cout << "Starting geometry healing procedure (tolerance: " << tolerance << ")" << endl
-       << "-----------------------------------" << endl;
-
-  if (fixsmalledges)
-    {
-      cout << endl << "- fixing small edges" << endl;
-
-      Handle(ShapeFix_Wire) sfw;
-      Handle_ShapeBuild_ReShape rebuild = new ShapeBuild_ReShape;
-      rebuild->Apply(shape);
-
-      for (int i = 1; i <= fmap.Extent(); i++)
-	{
-	  TopExp_Explorer exp1;
-	  for (exp1.Init (fmap(i), TopAbs_WIRE); exp1.More(); exp1.Next())
-	    {
-	      TopoDS_Wire oldwire = TopoDS::Wire(exp1.Current());
-	      sfw = new ShapeFix_Wire (oldwire, TopoDS::Face(fmap(i)),tolerance);
-	      sfw->ModifyTopologyMode() = Standard_True;
-
-	      if (sfw->FixSmall (false, tolerance))
-		{
-		  cout << "Fixed small edge in wire " << wmap.FindIndex (oldwire) << endl;
-		  TopoDS_Wire newwire = sfw->Wire();
-		  rebuild->Replace(oldwire, newwire, Standard_False);
-		}
-	      if ((sfw->StatusSmall(ShapeExtend_FAIL1)) ||
-		  (sfw->StatusSmall(ShapeExtend_FAIL2)) ||
-		  (sfw->StatusSmall(ShapeExtend_FAIL3)))
-		cout << "Failed to fix small edge in wire " << wmap.FindIndex (oldwire) << endl;
-
-	      
-	    }
-	}
-
-      shape = rebuild->Apply(shape);
-
-
-
-      {
-      Handle_ShapeBuild_ReShape rebuild = new ShapeBuild_ReShape;
-      rebuild->Apply(shape);
-      TopExp_Explorer exp1;
-      for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
-	{
-	  TopoDS_Edge edge = TopoDS::Edge(exp1.Current());
-	  if (vmap.FindIndex(TopExp::FirstVertex (edge)) == 
-	      vmap.FindIndex(TopExp::LastVertex (edge)))
-	    {
-	      GProp_GProps system;
-	      BRepGProp::LinearProperties(edge, system);
-	      if (system.Mass() < tolerance)
-		{
-		  cout << "removing degenerated edge " << emap.FindIndex(edge) << endl;
-		  rebuild->Remove(edge, false);
-		}
-	    }
-	}
-      shape = rebuild->Apply(shape);
-      }
-
-
-      Handle(ShapeFix_Wireframe) sfwf = new ShapeFix_Wireframe;
-      sfwf->SetPrecision(tolerance);
-      sfwf->Load (shape);
-
-      if (sfwf->FixSmallEdges())
-	{
-	  cout << endl << "- fixing wire frames" << endl;  
-	  if (sfwf->StatusSmallEdges(ShapeExtend_OK)) cout << "no small edges found" << endl;
-	  if (sfwf->StatusSmallEdges(ShapeExtend_DONE1)) cout << "some small edges fixed" << endl;
-	  if (sfwf->StatusSmallEdges(ShapeExtend_FAIL1)) cout << "failed to fix some small edges" << endl;
-	}
-  
-
-      if (sfwf->FixWireGaps())
-	{
-	  cout << endl << "- fixing wire gaps" << endl;
-	  if (sfwf->StatusWireGaps(ShapeExtend_OK)) cout << "no gaps found" << endl;
-	  if (sfwf->StatusWireGaps(ShapeExtend_DONE1)) cout << "some 2D gaps fixed" << endl;
-	  if (sfwf->StatusWireGaps(ShapeExtend_DONE2)) cout << "some 3D gaps fixed" << endl;
-	  if (sfwf->StatusWireGaps(ShapeExtend_FAIL1)) cout << "failed to fix some 2D gaps" << endl;
-	  if (sfwf->StatusWireGaps(ShapeExtend_FAIL2)) cout << "failed to fix some 3D gaps" << endl;
-	}
-      
-
-      shape = sfwf->Shape();
-    }
-
-
-
-
-
-  if (fixspotstripfaces)
-    {
-  
-      cout << endl << "- fixing spot and strip faces" << endl;
-      Handle(ShapeFix_FixSmallFace) sffsm = new ShapeFix_FixSmallFace();
-      sffsm -> Init (shape);
-      sffsm -> SetPrecision (tolerance);
-      sffsm -> Perform();
-      
-      shape = sffsm -> FixShape();
-    }
-
-  if (sewfaces)
-    {
-      cout << endl << "- sewing faces" << endl;
-
-      TopExp_Explorer exp0;
-
-      BRepOffsetAPI_Sewing sewedObj(tolerance);
-
-      for (exp0.Init (shape, TopAbs_FACE); exp0.More(); exp0.Next())
-	{
-	  TopoDS_Face face = TopoDS::Face (exp0.Current());
-	  sewedObj.Add (face);
-	}
-      
-      sewedObj.Perform();
-  
-      if (!sewedObj.SewedShape().IsNull())
-	shape = sewedObj.SewedShape();
-      else
-	cout << " not possible";
-    }
-
-  if (makesolids)
-    {  
-      cout << endl << "- making solids" << endl;
-      
-      TopExp_Explorer exp0;
-
-      BRepBuilderAPI_MakeSolid ms;
-      int count = 0;
-      for (exp0.Init(shape, TopAbs_SHELL); exp0.More(); exp0.Next())
-	{
-	  count++;
-	  ms.Add (TopoDS::Shell(exp0.Current()));
-	}
-      
-      if (!count)
-	{
-	  cout << " not possible (no shells)" << endl;
-	}
-      else
-	{
-	  BRepCheck_Analyzer ba(ms);
-	  if (ba.IsValid ())
-	    {
-	      Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape;
-	      sfs->Init (ms);
-	      sfs->SetPrecision(tolerance);
-	      sfs->SetMaxTolerance(tolerance);
-	      sfs->Perform();
-	      shape = sfs->Shape();
-	      
-	      for (exp0.Init(shape, TopAbs_SOLID); exp0.More(); exp0.Next())
-		{
-		  TopoDS_Solid solid = TopoDS::Solid(exp0.Current());
-		  TopoDS_Solid newsolid = solid;
-		  BRepLib::OrientClosedSolid (newsolid);
-		  Handle_ShapeBuild_ReShape rebuild = new ShapeBuild_ReShape;
-		  //		  rebuild->Apply(shape);
-		  rebuild->Replace(solid, newsolid, Standard_False);
-		  TopoDS_Shape newshape = rebuild->Apply(shape, TopAbs_COMPSOLID, 1);
-		  //		  TopoDS_Shape newshape = rebuild->Apply(shape);
-		  shape = newshape;
-		}
-	    }
-	  else
-	    cout << " not possible" << endl;
-	}
-    }
-
-  BuildFMap();
-
-  double newsurfacecont = 0;
-
-  for (int i = 1; i <= fmap.Extent(); i++)
-    {
-      GProp_GProps system;
-      BRepGProp::LinearProperties(fmap(i), system);
-      newsurfacecont += system.Mass();
-    }
-
-  int nnrc = 0, nnrcs = 0,
-    nnrso = somap.Extent(),
-    nnrsh = shmap.Extent(),
-    nnrf = fmap.Extent(),
-    nnrw = wmap.Extent(),
-    nnre = emap.Extent(),
-    nnrv = vmap.Extent();
-
-  for (e.Init(shape, TopAbs_COMPOUND); e.More(); e.Next()) nnrc++;
-  for (e.Init(shape, TopAbs_COMPSOLID); e.More(); e.Next()) nnrcs++;
-
-  cout << "-----------------------------------" << endl;
-  cout << "Compounds       : " << nnrc << " (" << nrc << ")" << endl;
-  cout << "Composite solids: " << nnrcs << " (" << nrcs << ")" << endl;
-  cout << "Solids          : " << nnrso << " (" << nrso << ")" << endl;
-  cout << "Shells          : " << nnrsh << " (" << nrsh << ")" << endl;
-  cout << "Wires           : " << nnrw << " (" << nrw << ")" << endl;
-  cout << "Faces           : " << nnrf << " (" << nrf << ")" << endl;
-  cout << "Edges           : " << nnre << " (" << nre << ")" << endl;
-  cout << "Vertices        : " << nnrv << " (" << nrv << ")" << endl;
-  cout << endl;
-  cout << "Totol surface area : " << newsurfacecont << " (" << surfacecont << ")" << endl;
-  cout << endl;
-
-}
- 
-
-
-
-void OCCGeometry :: BuildFMap()
-{
-  somap.Clear();
-  shmap.Clear();
-  fmap.Clear();
-  wmap.Clear();
-  emap.Clear();
-  vmap.Clear();
-  
-  TopExp_Explorer exp0, exp1, exp2, exp3, exp4, exp5;
-  
-  for (exp0.Init(shape, TopAbs_SOLID);
-       exp0.More(); exp0.Next())
-    {
-      TopoDS_Solid solid = TopoDS::Solid (exp0.Current());
-      
-      if (somap.FindIndex(TopoDS::Solid (exp0.Current())) < 1)
-	{
-	  somap.Add (TopoDS::Solid (exp0.Current()));
-	  
-	  for (exp1.Init(exp0.Current(), TopAbs_SHELL);
-	       exp1.More(); exp1.Next())
-	    {
-	      TopoDS_Shell shell = TopoDS::Shell (exp1.Current().Composed (exp0.Current().Orientation()));
-	      if (shmap.FindIndex(shell) < 1)
-		{
-		  shmap.Add (shell);
-		  
-		  for (exp2.Init(shell, TopAbs_FACE);
-		       exp2.More(); exp2.Next())
-		    {
-		      TopoDS_Face face = TopoDS::Face(exp2.Current().Composed(shell.Orientation()));
-		      if (fmap.FindIndex(face) < 1)
-			{
-			  fmap.Add (face);
-			  
-			  for (exp3.Init(exp2.Current(), TopAbs_WIRE);
-			       exp3.More(); exp3.Next())
-			    {
-			      TopoDS_Wire wire = TopoDS::Wire (exp3.Current().Composed(face.Orientation()));
-			      if (wmap.FindIndex(wire) < 1)
-				{
-				  wmap.Add (wire);
-				  
-				  for (exp4.Init(exp3.Current(), TopAbs_EDGE);
-				       exp4.More(); exp4.Next())
-				    {
-				      TopoDS_Edge edge = TopoDS::Edge(exp4.Current().Composed(wire.Orientation()));
-				      if (emap.FindIndex(edge) < 1)
-					{
-					  emap.Add (edge);
-					  for (exp5.Init(exp4.Current(), TopAbs_VERTEX);
-					       exp5.More(); exp5.Next())
-					    {
-					      TopoDS_Vertex vertex = TopoDS::Vertex(exp5.Current());
-					      if (vmap.FindIndex(vertex) < 1)
-						vmap.Add (vertex);
-					    }
-					}
-				    }
-				}
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-  
-  // Free Shells
-  for (exp1.Init(exp0.Current(), TopAbs_SHELL, TopAbs_SOLID);
-       exp1.More(); exp1.Next())
-    {
-      TopoDS_Shape shell = exp1.Current().Composed (exp0.Current().Orientation());
-      if (shmap.FindIndex(shell) < 1)
-	{
-	  shmap.Add (shell);
-	  
-	  for (exp2.Init(shell, TopAbs_FACE);
-	       exp2.More(); exp2.Next())
-	    {
-	      TopoDS_Face face = TopoDS::Face(exp2.Current().Composed(shell.Orientation()));
-	      if (fmap.FindIndex(face) < 1)
-		{
-		  fmap.Add (face);
-		  
-		  for (exp3.Init(exp2.Current(), TopAbs_WIRE);
-		       exp3.More(); exp3.Next())
-		    {
-		      TopoDS_Wire wire = TopoDS::Wire (exp3.Current());
-		      if (wmap.FindIndex(wire) < 1)
-			{
-			  wmap.Add (wire);
-			  
-			  for (exp4.Init(exp3.Current(), TopAbs_EDGE);
-			       exp4.More(); exp4.Next())
-			    {
-			      TopoDS_Edge edge = TopoDS::Edge(exp4.Current());
-			      if (emap.FindIndex(edge) < 1)
-				{
-				  emap.Add (edge);
-				  for (exp5.Init(exp4.Current(), TopAbs_VERTEX);
-				       exp5.More(); exp5.Next())
-				    {
-				      TopoDS_Vertex vertex = TopoDS::Vertex(exp5.Current());
-				      if (vmap.FindIndex(vertex) < 1)
-					vmap.Add (vertex);
-				    }
-				}
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-  
-  
-  // Free Faces
-  
-  for (exp2.Init(shape, TopAbs_FACE, TopAbs_SHELL);
-       exp2.More(); exp2.Next())
-    {
-      TopoDS_Face face = TopoDS::Face(exp2.Current());
-      if (fmap.FindIndex(face) < 1)
-	{
-	  fmap.Add (face);
-	  
-	  for (exp3.Init(exp2.Current(), TopAbs_WIRE);
-	       exp3.More(); exp3.Next())
-	    {
-	      TopoDS_Wire wire = TopoDS::Wire (exp3.Current());
-	      if (wmap.FindIndex(wire) < 1)
-		{
-		  wmap.Add (wire);
-		  
-		  for (exp4.Init(exp3.Current(), TopAbs_EDGE);
-		       exp4.More(); exp4.Next())
-		    {
-		      TopoDS_Edge edge = TopoDS::Edge(exp4.Current());
-		      if (emap.FindIndex(edge) < 1)
-			{
-			  emap.Add (edge);
-			  for (exp5.Init(exp4.Current(), TopAbs_VERTEX);
-			       exp5.More(); exp5.Next())
-			    {
-			      TopoDS_Vertex vertex = TopoDS::Vertex(exp5.Current());
-			      if (vmap.FindIndex(vertex) < 1)
-				vmap.Add (vertex);
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-
-
-  // Free Wires
-  
-  for (exp3.Init(shape, TopAbs_WIRE, TopAbs_FACE);
-       exp3.More(); exp3.Next())
-    {
-      TopoDS_Wire wire = TopoDS::Wire (exp3.Current());
-      if (wmap.FindIndex(wire) < 1)
-	{
-	  wmap.Add (wire);
-	  
-	  for (exp4.Init(exp3.Current(), TopAbs_EDGE);
-	       exp4.More(); exp4.Next())
-	    {
-	      TopoDS_Edge edge = TopoDS::Edge(exp4.Current());
-	      if (emap.FindIndex(edge) < 1)
-		{
-		  emap.Add (edge);
-		  for (exp5.Init(exp4.Current(), TopAbs_VERTEX);
-		       exp5.More(); exp5.Next())
-		    {
-		      TopoDS_Vertex vertex = TopoDS::Vertex(exp5.Current());
-		      if (vmap.FindIndex(vertex) < 1)
-			vmap.Add (vertex);
-		    }
-		}
-	    }
-	}
-    }
-
-
-  // Free Edges
-  
-  for (exp4.Init(shape, TopAbs_EDGE, TopAbs_WIRE);
-       exp4.More(); exp4.Next())
-    {
-      TopoDS_Edge edge = TopoDS::Edge(exp4.Current());
-      if (emap.FindIndex(edge) < 1)
-	{
-	  emap.Add (edge);
-	  for (exp5.Init(exp4.Current(), TopAbs_VERTEX);
-	       exp5.More(); exp5.Next())
-	    {
-	      TopoDS_Vertex vertex = TopoDS::Vertex(exp5.Current());
-	      if (vmap.FindIndex(vertex) < 1)
-		vmap.Add (vertex);
-	    }
-	}
-    }
-
-
-  // Free Vertices
-  
-  for (exp5.Init(shape, TopAbs_VERTEX, TopAbs_EDGE);
-       exp5.More(); exp5.Next())
-    {
-      TopoDS_Vertex vertex = TopoDS::Vertex(exp5.Current());
-      if (vmap.FindIndex(vertex) < 1)
-	vmap.Add (vertex);
-    }
-
-
-
-  
-  facemeshstatus.SetSize (fmap.Extent());
-  facemeshstatus = 0;
-
-  fvispar.SetSize (fmap.Extent());
-  evispar.SetSize (emap.Extent());
-  vvispar.SetSize (vmap.Extent());
-}
-
-
-
-void OCCGeometry :: SewFaces ()
-{
-  (*testout) << "Trying to sew faces ..." << endl;
-  cout << "Trying to sew faces ..." << flush;
-
-  BRepOffsetAPI_Sewing sewedObj(1);
-  //  BRepOffsetAPI_Sewing sewedObj(healingtolerance);
-
-  for (int i = 1; i <= fmap.Extent(); i++)
-    {
-      TopoDS_Face face = TopoDS::Face (fmap(i));
-      sewedObj.Add (face);
-    }
-  
-  sewedObj.Perform();
-  
-  if (!sewedObj.SewedShape().IsNull())
-    {
-      shape = sewedObj.SewedShape();
-      cout << " done" << endl;
-    }
-  else
-    cout << " not possible";
-  
-  /*
-  ShapeUpgrade_ShellSewing sewing;
-  TopoDS_Shape sh = sewing.ApplySewing (shape);
-  shape = sh;
-  */
-}
-
-
-
-
-
-void OCCGeometry :: MakeSolid ()
-{
-  TopExp_Explorer exp0;
-
-  (*testout) << "Trying to build solids ..." << endl;
-  cout << "Trying to build solids ..." << flush;
-
-  BRepBuilderAPI_MakeSolid ms;
-  int count = 0;
-  for (exp0.Init(shape, TopAbs_SHELL); exp0.More(); exp0.Next())
-    {
-      count++;
-      ms.Add (TopoDS::Shell(exp0.Current()));
-    }
-
-  if (!count)
-    {
-     cout << " not possible (no shells)" << endl;
-     return;
-    }
-
-  BRepCheck_Analyzer ba(ms);
-  if (ba.IsValid ())
-    {
-      Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape;
-      sfs->Init (ms);
-  
-      sfs->SetPrecision(1e-5);
-      sfs->SetMaxTolerance(1e-5);
-      
-      sfs->Perform();
-
-      shape = sfs->Shape();
-      
-      for (exp0.Init(shape, TopAbs_SOLID); exp0.More(); exp0.Next())
-	{
-	  TopoDS_Solid solid = TopoDS::Solid(exp0.Current());
-	  TopoDS_Solid newsolid = solid;
-	  BRepLib::OrientClosedSolid (newsolid);
-	  Handle_ShapeBuild_ReShape rebuild = new ShapeBuild_ReShape;
-	  //	  rebuild->Apply(shape);
-	  rebuild->Replace(solid, newsolid, Standard_False);
-	  //	  TopoDS_Shape newshape = rebuild->Apply(shape);
-	  
-	  TopoDS_Shape newshape = rebuild->Apply(shape, TopAbs_SHAPE, 1);
-	  shape = newshape;
-	}
-      
-      cout << " done" << endl;
-    }
-  else
-    cout << " not possible" << endl;
-}
-
-
-void OCCGeometry :: BuildVisualizationMesh ()
-{
-  cout << "Preparing visualization (deflection = " << vispar.occdeflection << ") ... " << flush;
-  BRepTools::Clean (shape);
-  BRepMesh_IncrementalMesh::BRepMesh_IncrementalMesh (shape, vispar.occdeflection, true);
-  cout << "done" << endl;
-  
-  Bnd_Box bb;
-  BRepBndLib::Add (shape, bb);
-  
-  double x1,y1,z1,x2,y2,z2;
-  bb.Get (x1,y1,z1,x2,y2,z2);
-  Point<3> p1 = Point<3> (x1,y1,z1);
-  Point<3> p2 = Point<3> (x2,y2,z2);
-  
-  (*testout) << "Bounding Box = [" << p1 << " - " << p2 << "]" << endl;
-  boundingbox = Box<3> (p1,p2);
-  SetCenter();
-}
-
-
-
-  bool OCCGeometry :: FastProject (int surfi, Point<3> & ap, double& u, double& v) const
-  {
-    gp_Pnt p(ap(0), ap(1), ap(2));
-  
-    Handle(Geom_Surface) surface = BRep_Tool::Surface(TopoDS::Face(fmap(surfi)));
-  
-    gp_Pnt x = surface->Value (u,v);
-  
-    if (p.SquareDistance(x) <= sqr(PROJECTION_TOLERANCE)) return true;
-  
-    gp_Vec du, dv;
-  
-    surface->D1(u,v,x,du,dv);
-  
-    int count = 0;
-  
-    gp_Pnt xold;
-    gp_Vec n;
-    double det, lambda, mu;
-  
-    do {
-      count++;
-  
-      n = du^dv;
-  
-      det = Det3 (n.X(), du.X(), dv.X(),
-		  n.Y(), du.Y(), dv.Y(),
-		  n.Z(), du.Z(), dv.Z());
-  
-      if (det < 1e-15) return false; 
-  
-      lambda = Det3 (n.X(), p.X()-x.X(), dv.X(),
-		     n.Y(), p.Y()-x.Y(), dv.Y(),
-		     n.Z(), p.Z()-x.Z(), dv.Z())/det;
-  
-      mu     = Det3 (n.X(), du.X(), p.X()-x.X(),
-		     n.Y(), du.Y(), p.Y()-x.Y(),
-		     n.Z(), du.Z(), p.Z()-x.Z())/det;
-    
-      u += lambda;
-      v += mu;
-  
-      xold = x;
-      surface->D1(u,v,x,du,dv);
-  
-    } while (xold.SquareDistance(x) > sqr(PROJECTION_TOLERANCE) && count < 50);
-
-//    (*testout) << "FastProject count: " << count << endl;
-  
-    if (count == 50) return false;
-  
-    ap = Point<3> (x.X(), x.Y(), x.Z());
-  
-    return true;
-  }
-
-
-OCCGeometry * LoadOCC_IGES (const char * filename)
-{
-  OCCGeometry * occgeo;
-  occgeo = new OCCGeometry;
-  
-  IGESControl_Reader reader;
-  
-#ifdef OCC52
-  Standard_Integer stat = reader.ReadFile((char*)filename);
-#else
-  Standard_Integer stat = reader.LoadFile((char*)filename);
-  reader.Clear();
-#endif
-  
-#ifdef OCC52
-  reader.TransferRoots(); // Tranlate IGES -> OCC
-#else
-  reader.TransferRoots(Standard_False); // Tranlate IGES -> OCC
-#endif
-
-  occgeo->shape = reader.OneShape();
-  occgeo->changed = 1;
-  occgeo->BuildFMap();
-  occgeo->BuildVisualizationMesh();
-  PrintContents (occgeo);
-
-  return occgeo;
-}
-
-OCCGeometry * LoadOCC_STEP (const char * filename)
-{
-  OCCGeometry * occgeo;
-  occgeo = new OCCGeometry;
-  
-  STEPControl_Reader reader;
-  Standard_Integer stat = reader.ReadFile((char*)filename);
-  Standard_Integer nb = reader.NbRootsForTransfer();
-  reader.TransferRoots (); // Tranlate STEP -> OCC
-  occgeo->shape = reader.OneShape();
-  occgeo->changed = 1;
-  occgeo->BuildFMap();
-  occgeo->BuildVisualizationMesh();
-  PrintContents (occgeo);
-
-  return occgeo;
-}
-
-char * shapesname[] =
-  {" ", "CompSolids", "Solids", "Shells",
-   "Faces", "Wires", "Edges", "Vertices"};
-
-char * shapename[] =
-  {" ", "CompSolid", "Solid", "Shell",
-   "Face", "Wire", "Edge", "Vertex"};
-
-char * orientationstring[] =
-  {"+", "-"};
-
-void OCCGeometry :: RecursiveTopologyTree (const TopoDS_Shape & sh,
-					   stringstream & str,
-					   TopAbs_ShapeEnum l,
-					   bool isfree,
-					   const char * lname)
-{
-  if (l > TopAbs_VERTEX) return;
-
-  TopExp_Explorer e;
-  int count = 0;
-  int count2;
-
-  if (isfree)
-    e.Init(sh, l, TopAbs_ShapeEnum(l-1));
-  else
-    e.Init(sh, l);
-
-  for (; e.More(); e.Next())
-    {
-      count++;
-
-      stringstream lname2;
-      lname2 << lname << "/" << shapename[l] << count;
-      str << lname2.str() << " ";
-
-      switch (e.Current().ShapeType())
-	{
-	case TopAbs_SOLID:
-	  count2 = somap.FindIndex(TopoDS::Solid(e.Current())); break;
-	case TopAbs_SHELL:
-	  count2 = shmap.FindIndex(TopoDS::Shell(e.Current())); break;
-	case TopAbs_FACE:
-	  count2 = fmap.FindIndex(TopoDS::Face(e.Current())); break;
-	case TopAbs_WIRE:
-	  count2 = wmap.FindIndex(TopoDS::Wire(e.Current())); break;
-	case TopAbs_EDGE:
-	  count2 = emap.FindIndex(TopoDS::Edge(e.Current())); break;
-	case TopAbs_VERTEX:
-	  count2 = vmap.FindIndex(TopoDS::Vertex(e.Current())); break;
-	}
-      
-      int nrsubshapes = 0;
-      
-      if (l <= TopAbs_WIRE)
-	{
-	  TopExp_Explorer e2;
-	  for (e2.Init (e.Current(), TopAbs_ShapeEnum (l+1));
-	       e2.More(); e2.Next())
-	    nrsubshapes++;
-	}
-      
-      str << "{" << shapename[l] << " " << count2;
-      
-      if (l <= TopAbs_EDGE)
-	{
-	  str << " (" << orientationstring[e.Current().Orientation()];
-	  if (nrsubshapes != 0) str << ", " << nrsubshapes;
-	  str << ") } ";
-	}
-      else
-	str << " } ";
-
-      RecursiveTopologyTree (e.Current(), str, TopAbs_ShapeEnum (l+1),
-			     false, (char*)lname2.str().c_str());
-      
-    }
-}
-
-void OCCGeometry :: GetTopologyTree (stringstream & str)
-{
-  cout << "Building topology tree ... " << flush;
-  RecursiveTopologyTree (shape, str, TopAbs_COMPSOLID, false, "CompSolids");
-  RecursiveTopologyTree (shape, str, TopAbs_SOLID, true, "FreeSolids");
-  RecursiveTopologyTree (shape, str, TopAbs_SHELL, true, "FreeShells");
-  RecursiveTopologyTree (shape, str, TopAbs_FACE, true, "FreeFaces");
-  RecursiveTopologyTree (shape, str, TopAbs_WIRE, true, "FreeWires");
-  RecursiveTopologyTree (shape, str, TopAbs_EDGE, true, "FreeEdges");
-  RecursiveTopologyTree (shape, str, TopAbs_VERTEX, true, "FreeVertices");
-  str << flush;
-  //  cout << "done" << endl;
-}
-
-void OCCGeometry :: CheckIrregularEntities(stringstream & str)
-{
-  ShapeAnalysis_CheckSmallFace csm;
-
-  csm.SetTolerance (1e-6);
-
-  TopTools_DataMapOfShapeListOfShape mapEdges;
-  ShapeAnalysis_DataMapOfShapeListOfReal mapParam;
-  TopoDS_Compound theAllVert;
-
-  int spotfaces = 0;
-  int stripsupportfaces = 0;
-  int singlestripfaces = 0;
-  int stripfaces = 0;
-  int facessplitbyvertices = 0;
-  int stretchedpinfaces = 0;
-  int smoothpinfaces = 0;
-  int twistedfaces = 0;
-  int edgessamebutnotidentified = 0;
-
-  cout << "checking faces ... " << flush;
-
-  int i;
-  for (i = 1; i <= fmap.Extent(); i++)
-    {
-      TopoDS_Face face = TopoDS::Face (fmap(i));
-      TopoDS_Edge e1, e2;
-
-      if (csm.CheckSpotFace (face))
-	{
-	  if (!spotfaces++)
-	    str << "SpotFace {Spot face} ";
-
-	  (*testout) << "Face " << i << " is a spot face" << endl;
-	  str << "SpotFace/Face" << i << " ";
-	  str << "{Face " << i << " } ";
-	}
-
-      if (csm.IsStripSupport (face))
-	{
-	  if (!stripsupportfaces++)
-	    str << "StripSupportFace {Strip support face} ";
-
-	  (*testout) << "Face " << i << " has strip support" << endl;
-	  str << "StripSupportFace/Face" << i << " ";
-	  str << "{Face " << i << " } ";
-	}
-
-      if (csm.CheckSingleStrip(face, e1, e2))
-	{
-	  if (!singlestripfaces++)
-	    str << "SingleStripFace {Single strip face} ";
-
-	  (*testout) << "Face " << i << " is a single strip (edge " << emap.FindIndex(e1)
-	       << " and edge " << emap.FindIndex(e2) << " are identical)" << endl;
-	  str << "SingleStripFace/Face" << i << " ";
-	  str << "{Face " << i << " (edge " << emap.FindIndex(e1)
-	       << " and edge " << emap.FindIndex(e2) << " are identical)} ";
-	}
-
-      if (csm.CheckStripFace(face, e1, e2))
-	{
-	  if (!stripfaces++)
-	    str << "StripFace {Strip face} ";
-
-	  (*testout) << "Face " << i << " is a strip (edge " << emap.FindIndex(e1)
-		     << " and edge " << emap.FindIndex(e2)
-		     << " are identical)" << endl;
-	  str << "StripFace/Face" << i << " ";
-	  str << "{Face " << i << " (edge " << emap.FindIndex(e1)
-	      << " and edge " << emap.FindIndex(e2) << " are identical)} ";
-	}
-
-      if (int count = csm.CheckSplittingVertices(face, mapEdges, mapParam, theAllVert))
-	{
-	  if (!facessplitbyvertices++)
-	    str << "FaceSplitByVertices {Face split by vertices} ";
-
-	  (*testout) << "Face " << i << " is split by " << count
-		     << " vertex/vertices " << endl;
-	  str << "FaceSplitByVertices/Face" << i << " ";
-	  str << "{Face " << i << " (split by " << count << "vertex/vertices)} ";
-	}
-      
-      int whatrow, sens;
-      if (int type = csm.CheckPin (face, whatrow, sens))
-	{
-	  if (type == 1)
-	    {
-	      if (!smoothpinfaces++)
-		str << "SmoothPinFace {Smooth pin face} ";
-
-	      (*testout) << "Face " << i << " is a smooth pin" << endl;
-	      str << "SmoothPinFace/Face" << i << " ";
-	      str << "{Face " << i << " } ";
-	    }
-	  else
-	    {
-	      if (!stretchedpinfaces++)
-		str << "StretchedPinFace {Stretched pin face} ";
-
-	      (*testout) << "Face " << i << " is a streched pin" << endl;
-	      str << "StretchedPinFace/Face" << i << " ";
-	      str << "{Face " << i << " } ";
-	    }
-	}
-
-      double paramu, paramv;
-      if (csm.CheckTwisted (face, paramu, paramv))
-	{
-	  if (!twistedfaces++)
-	    str << "TwistedFace {Twisted face} ";
-
-	  (*testout) << "Face " << i << " is twisted" << endl;
-	  str << "TwistedFace/Face" << i << " ";
-	  str << "{Face " << i << " } ";
-	}
-    }
-
-  cout << "done" << endl;
-  cout << "checking edges ... " << flush;
-
-  double dmax;
-  int cnt = 0;
-  ARRAY <double> edgeLengths;
-  ARRAY <int> order;
-  edgeLengths.SetSize (emap.Extent());
-  order.SetSize (emap.Extent());
-
-  for (i = 1; i <= emap.Extent(); i++)
-    {
-      TopoDS_Edge edge1 = TopoDS::Edge (emap(i));
-      GProp_GProps system;
-      BRepGProp::LinearProperties(edge1, system);
-      edgeLengths[i-1] = system.Mass();
-      /*
-      int j;
-      for (j = i+1; j <= emap.Extent(); j++)
-	{
-	  TopoDS_Edge edge2 = TopoDS::Edge (emap(j));
-
-	  if (csm.CheckStripEdges(edge1, edge2, csm.Tolerance(), dmax))
-	    {
-	      if (!edgessamebutnotidentified++)
-		str << "EdgesSameButNotIdentified {Edges same but not identified} ";
-
-	      cnt++;
-	      (*testout) << "Edge " << i << " and edge " << j
-			 << " are on one strip (same but not identified)" << endl;
-	      str << "EdgesSameButNotIdentified/Edge" << cnt << " ";
-	      str << "{Edge " << i << " and Edge " << j << "} ";
-	    }
-	}
-      */
-    }
-
-  Sort (edgeLengths, order);
-
-  str << "ShortestEdges {Shortest edges} ";
-  for (i = 1; i <= min(20, emap.Extent()); i++)
-    {
-      str << "ShortestEdges/Edge" << i;
-      str << " {Edge " << order[i-1] << " (L=" << edgeLengths[order[i-1]-1] << ")} ";
-    }
-
-  str << flush;
-
-  cout << "done" << endl;
-
-  /*
-  for (i = 1; i <= shmap.Extent(); i++)
-    {
-      TopoDS_Shell shell = TopoDS::Shell (shmap(i));
-      if (!shell.Closed()) 
-	cout << "Shell " << i << " is not closed" << endl;
-      if (shell.Infinite()) 
-	cout << "Shell " << i << " is infinite" << endl;
-
-      BRepCheck_Analyzer ba(shell);
-      if (!ba.IsValid ())
-	cout << "Shell " << i << " is not valid" << endl;
-    }
-
-  for (i = 1; i <= somap.Extent(); i++)
-    {
-      TopoDS_Solid solid = TopoDS::Solid (somap(i));
-      if (!solid.Closed()) 
-	cout << "Solid " << i << " is not closed" << endl;
-      if (solid.Infinite()) 
-	cout << "Solid " << i << " is infinite" << endl;
-
-      BRepCheck_Analyzer ba(solid);
-      if (!ba.IsValid ())
-	cout << "Solid " << i << " is not valid" << endl;
-    }
-  */
-
-
-}
-
-
-void OCCGeometry :: GetUnmeshedFaceInfo (stringstream & str)
-{
-  for (int i = 1; i <= fmap.Extent(); i++)
-    {
-      if (facemeshstatus[i-1] == -1)
-	str << "Face" << i << " {Face " << i << " } ";
-    }
-  str << flush;
-}
-
-void OCCGeometry :: GetNotDrawableFaces (stringstream & str)
-{
-  for (int i = 1; i <= fmap.Extent(); i++)
-    {
-      if (!fvispar[i-1].IsDrawable())
-	str << "Face" << i << " {Face " << i << " } ";
-    }
-  str << flush;
-}
-
-bool OCCGeometry :: ErrorInSurfaceMeshing ()
-{
-  for (int i = 1; i <= fmap.Extent(); i++)
-    if (facemeshstatus[i-1] == -1)
-      return true;
-
-  return false;
-}
-
-}
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/occ/occgeom.hpp b/contrib/Netgen/libsrc/occ/occgeom.hpp
deleted file mode 100644
index 5082ab3b9144efb55bf8fdb1becf306e995d9058..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/occ/occgeom.hpp
+++ /dev/null
@@ -1,279 +0,0 @@
-#ifndef FILE_OCCGEOM
-#define FILE_OCCGEOM
-
-/* *************************************************************************/
-/* File:   occgeom.hpp                                                     */
-/* Author: Robert Gaisbauer                                                */
-/* Date:   26. May  03                                                     */
-/* *************************************************************************/
-
-#ifdef OCCGEOMETRY
-
-#include <meshing.hpp>
-
-#include "BRep_Tool.hxx"
-#include "Geom_Curve.hxx"
-#include "Geom2d_Curve.hxx"
-#include "Geom_Surface.hxx"
-#include "GeomAPI_ProjectPointOnSurf.hxx"
-#include "GeomAPI_ProjectPointOnCurve.hxx"
-#include "BRepTools.hxx"
-#include "TopExp.hxx"
-#include "BRepBuilderAPI_MakeVertex.hxx"
-#include "BRepBuilderAPI_MakeShell.hxx"
-#include "BRepBuilderAPI_MakeSolid.hxx"
-#include "BRepOffsetAPI_Sewing.hxx"
-#include "BRepLProp_SLProps.hxx"
-#include "BRepAdaptor_Surface.hxx"
-#include "Poly_Triangulation.hxx"
-#include "Poly_Array1OfTriangle.hxx"
-#include "TColgp_Array1OfPnt2d.hxx"
-#include "Poly_Triangle.hxx"
-#include "GProp_GProps.hxx"
-#include "BRepGProp.hxx"
-#include "Geom_Surface.hxx"
-#include "TopExp.hxx"
-#include "gp_Pnt.hxx"
-#include "TopoDS.hxx"
-#include "TopoDS_Solid.hxx"
-#include "TopExp_Explorer.hxx"
-#include "BRep_Tool.hxx"
-#include "Geom_Curve.hxx"
-#include "Geom2d_Curve.hxx"
-#include "Geom_Surface.hxx"
-#include "GeomAPI_ProjectPointOnSurf.hxx"
-#include "GeomAPI_ProjectPointOnCurve.hxx"
-#include "TopoDS_Wire.hxx"
-#include "BRepTools_WireExplorer.hxx"
-#include "BRepTools.hxx"
-#include "TopTools_IndexedMapOfShape.hxx"
-#include "TopExp.hxx"
-#include "BRepBuilderAPI_MakeVertex.hxx"
-#include "BRepBuilderAPI_MakeShell.hxx"
-#include "BRepBuilderAPI_MakeSolid.hxx"
-#include "BRepOffsetAPI_Sewing.hxx"
-#include "BRepLProp_CLProps.hxx"
-#include "BRepLProp_SLProps.hxx"
-#include "BRepAdaptor_Surface.hxx"
-#include "BRepAdaptor_Curve.hxx"
-#include "Poly_Triangulation.hxx"
-#include "Poly_Array1OfTriangle.hxx"
-#include "TColgp_Array1OfPnt2d.hxx"
-#include "Poly_Triangle.hxx"
-#include "GProp_GProps.hxx"
-#include "BRepGProp.hxx"
-#include "IGESControl_Reader.hxx"
-#include "STEPControl_Reader.hxx"
-#include "TopoDS_Shape.hxx"
-#include "TopoDS_Face.hxx"
-#include "IGESToBRep_Reader.hxx"
-#include "Interface_Static.hxx"
-#include "GeomAPI_ExtremaCurveCurve.hxx"
-#include "Standard_ErrorHandler.hxx"
-#include "Standard_Failure.hxx"
-#include "ShapeUpgrade_ShellSewing.hxx"
-#include "ShapeFix_Shape.hxx"
-#include "ShapeFix_Wireframe.hxx"
-#include "BRepMesh.hxx"
-#include "BRepMesh_IncrementalMesh.hxx"
-#include "BRepBndLib.hxx"
-#include "Bnd_Box.hxx"
-#include "ShapeAnalysis.hxx"
-#include "ShapeBuild_ReShape.hxx"
-#include "IGESControl_Writer.hxx"
-#include "STEPControl_Writer.hxx"
-#include "StlAPI_Writer.hxx"
-#include "STEPControl_StepModelType.hxx"
-
-namespace netgen
-{
-
-#include "../visualization/vispar.hpp"
-  //  class VisualizationParameters;
-  //  extern VisualizationParameters vispar;
-
-
-#include "occmeshsurf.hpp"
-
-#define PROJECTION_TOLERANCE 1e-10
-
-
-#define ENTITYISVISIBLE 1
-#define ENTITYISHIGHLIGHTED 2
-#define ENTITYISDRAWABLE 4
-
-class EntityVisualizationCode
-{
-  int code;
-
-public:
-
-  EntityVisualizationCode()
-  { code = ENTITYISVISIBLE + !ENTITYISHIGHLIGHTED + ENTITYISDRAWABLE; }
-
-  int IsVisible ()
-  { return code & ENTITYISVISIBLE; }
-
-  int IsHighlighted ()
-  { return code & ENTITYISHIGHLIGHTED; }
-
-  int IsDrawable ()
-  { return code & ENTITYISDRAWABLE; }
-
-  void Show ()
-  { code |= ENTITYISVISIBLE; }
-
-  void Hide ()
-  { code &= ~ENTITYISVISIBLE; }
-
-  void Highlight ()
-  { code |= ENTITYISHIGHLIGHTED; }
-
-  void Lowlight ()
-  { code &= ~ENTITYISHIGHLIGHTED; }
-
-  void SetDrawable ()
-  { code |= ENTITYISDRAWABLE; }
-
-  void SetNotDrawable ()
-  { code &= ~ENTITYISDRAWABLE; }
-};
-
-
-
-inline double Det3 (double a00, double a01, double a02,
-		    double a10, double a11, double a12,
-		    double a20, double a21, double a22)
-{
-  return a00*a11*a22 + a01*a12*a20 + a10*a21*a02 - a20*a11*a02 - a10*a01*a22 - a21*a12*a00;
-}
-
-
-
-#define OCCGEOMETRYVISUALIZATIONNOCHANGE   0
-#define OCCGEOMETRYVISUALIZATIONFULLCHANGE 1
-  // == compute transformation matrices and redraw
-#define OCCGEOMETRYVISUALIZATIONHALFCHANGE 2
-  // == redraw
-
-class OCCGeometry
-{
-  Point<3> center;
-
-public:
-  TopoDS_Shape shape;
-  TopTools_IndexedMapOfShape fmap, emap, vmap, somap, shmap, wmap;
-  Box<3> boundingbox;
-
-  int changed; 
-  ARRAY<int> facemeshstatus;
-
-  ARRAY<EntityVisualizationCode> fvispar, evispar, vvispar;
-
-  double tolerance;
-  bool fixsmalledges;
-  bool fixspotstripfaces;
-  bool sewfaces;
-  bool makesolids;
-
-
-  OCCGeometry()
-  {
-    somap.Clear();
-    shmap.Clear();
-    fmap.Clear();
-    wmap.Clear();
-    emap.Clear();
-    vmap.Clear();
-  }
-
-
-  void BuildFMap();
-
-  Box<3> GetBoundingBox()
-  { return boundingbox; }
-
-  int NrSolids()
-  { return somap.Extent(); }
-
-  void SetCenter()
-  { center = boundingbox.Center(); }
-
-  Point<3> Center()
-  { return center; }
-
-  void Project (int surfi, Point<3> & p) const
-  {
-    static int cnt = 0;
-    if (++cnt % 1000 == 0) cout << "Project cnt = " << cnt << endl;
-
-    gp_Pnt pnt(p(0), p(1), p(2));
-
-    GeomAPI_ProjectPointOnSurf proj(pnt, BRep_Tool::Surface(TopoDS::Face(fmap(surfi))));
-    if (proj.NbPoints() == 0)
-      {
-	cout << "Projection fails" << endl;
-      }
-    else
-      {
-	pnt = proj.NearestPoint();
-	p = Point<3> (pnt.X(), pnt.Y(), pnt.Z());
-      }
-  }
-
-  bool FastProject (int surfi, Point<3> & ap, double& u, double& v) const;
-
- 
-  OCCSurface GetSurface (int surfi)
-  {
-    cout << "OCCGeometry::GetSurface using PLANESPACE" << endl;
-    return OCCSurface (TopoDS::Face(fmap(surfi)), PLANESPACE);
-  }
-  
-
-  void BuildVisualizationMesh ();
-
-  void RecursiveTopologyTree (const TopoDS_Shape & sh,
-			      stringstream & str,
-			      TopAbs_ShapeEnum l,
-			      bool free,
-			      const char * lname);
-
-  void GetTopologyTree (stringstream & str);
-
-  void PrintNrShapes ();
-
-  void CheckIrregularEntities (stringstream & str);
-
-  void SewFaces();
-
-  void MakeSolid();
-
-  void HealGeometry();
-
-  void LowLightAll()
-  {
-    for (int i = 1; i <= fmap.Extent(); i++)
-      fvispar[i-1].Lowlight();
-    for (int i = 1; i <= emap.Extent(); i++)
-      evispar[i-1].Lowlight();
-    for (int i = 1; i <= vmap.Extent(); i++)
-      vvispar[i-1].Lowlight();
-  }
-
-  void GetUnmeshedFaceInfo (stringstream & str);
-  void GetNotDrawableFaces (stringstream & str);
-  bool ErrorInSurfaceMeshing ();
-};
-
-
-void PrintContents (OCCGeometry * geom);
-
-OCCGeometry * LoadOCC_IGES (const char * filename);
-OCCGeometry * LoadOCC_STEP (const char * filename);
-
-}
-
-#endif
-
-#endif
diff --git a/contrib/Netgen/libsrc/occ/occmeshsurf.cpp b/contrib/Netgen/libsrc/occ/occmeshsurf.cpp
deleted file mode 100644
index 98b17733abca07389eaeae942fbdc200a8e76abe..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/occ/occmeshsurf.cpp
+++ /dev/null
@@ -1,592 +0,0 @@
-#ifdef OCCGEOMETRY
-
-#include <mystdlib.h>
-
-#include <occgeom.hpp>
-#include <meshing.hpp>
-
-
-namespace netgen
-{
-#include "occmeshsurf.hpp"
-
-
-void OCCSurface :: GetNormalVector (const Point<3> & p, 
-				    const PointGeomInfo & geominfo,
-				    Vec<3> & n) const
-{
-  gp_Pnt pnt;
-  gp_Vec du, dv;
-
-  /*
-  double gu = geominfo.u;
-  double gv = geominfo.v;
-
-  if (fabs (gu) < 1e-3) gu = 0;
-  if (fabs (gv) < 1e-3) gv = 0;
-
-  occface->D1(gu,gv,pnt,du,dv);
-  */
-
-  occface->D1(geominfo.u,geominfo.v,pnt,du,dv);
-
-  n = Cross (Vec<3>(du.X(), du.Y(), du.Z()),
-	     Vec<3>(dv.X(), dv.Y(), dv.Z()));
-  n.Normalize();
-
-  if (orient == TopAbs_REVERSED) n = -1*n;
-  //  (*testout) << "GetNormalVector" << endl;
-}
-
-
-void OCCSurface :: DefineTangentialPlane (const Point<3> & ap1,
-					  const PointGeomInfo & geominfo1,
-					  const Point<3> & ap2,
-					  const PointGeomInfo & geominfo2)
-{
-  if (projecttype == PLANESPACE)
-    {
-      p1 = ap1; p2 = ap2;
-
-      //      cout << "p1 = " << p1 << endl;
-      //      cout << "p2 = " << p2 << endl;
-      
-      GetNormalVector (p1, geominfo1, ez);
-      
-      ex = p2 - p1;
-      ex -= (ex * ez) * ez;
-      ex.Normalize();
-      ey = Cross (ez, ex); 
-
-      GetNormalVector (p2, geominfo2, n2);
-  
-      nmid = 0.5*(n2+ez);
-      
-      ez = nmid;
-      ez.Normalize(); 
-      
-      ex = (p2 - p1).Normalize();
-      ez -= (ez * ex) * ex;
-      ez.Normalize();
-      ey = Cross (ez, ex);
-      nmid = ez;
-    }
-  else
-    {
-      if ( (geominfo1.u < umin) ||
-	   (geominfo1.u > umax) ||
-	   (geominfo2.u < umin) ||
-	   (geominfo2.u > umax) ||
-	   (geominfo1.v < vmin) ||
-	   (geominfo1.v > vmax) ||
-	   (geominfo2.v < vmin) ||
-	   (geominfo2.v > vmax) ) throw UVBoundsException();
-	  
-
-      p1 = ap1; p2 = ap2;
-      psp1 = Point<2>(geominfo1.u, geominfo1.v);
-      psp2 = Point<2>(geominfo2.u, geominfo2.v);
-      
-      Vec<3> n;
-      GetNormalVector (p1, geominfo1, n);
-
-      gp_Pnt pnt;
-      gp_Vec du, dv;
-      occface->D1 (geominfo1.u, geominfo1.v, pnt, du, dv);
-
-      DenseMatrix D1(3,2), D1T(2,3), DDTinv(2,2);
-      D1(0,0) = du.X(); D1(1,0) = du.Y(); D1(2,0) = du.Z();
-      D1(0,1) = dv.X(); D1(1,1) = dv.Y(); D1(2,1) = dv.Z();
-
-      /*
-      (*testout) << "DefineTangentialPlane" << endl
-		 << "---------------------" << endl;
-      (*testout) << "D1 = " << endl << D1 << endl;
-      */
-
-      Transpose (D1, D1T);
-      DenseMatrix D1TD1(3,3);
-
-      D1TD1 = D1T*D1;
-      if (D1TD1.Det() == 0) throw SingularMatrixException();
-      
-      CalcInverse (D1TD1, DDTinv);
-      DenseMatrix Y(3,2);
-      Vec<3> y1 = (ap2-ap1).Normalize();
-      Vec<3> y2 = Cross(n, y1).Normalize();
-      for (int i = 0; i < 3; i++)
-	{
-	  Y(i,0) = y1(i);
-	  Y(i,1) = y2(i);
-	}
-
-      DenseMatrix A(2,2);
-      A = DDTinv * D1T * Y;
-      DenseMatrix Ainv(2,2);
-
-      if (A.Det() == 0) throw SingularMatrixException();
-
-      CalcInverse (A, Ainv);
-
-      for (int i = 0; i < 2; i++)
-	for (int j = 0; j < 2; j++)
-	  {
-	    Amat(i,j) = A(i,j);
-	    Amatinv(i,j) = Ainv(i,j);
-	  }
-
-      Vec<2> temp = Amatinv * (psp2-psp1);
-      
-
-      double r = temp.Length();
-      //      double alpha = -acos (temp(0)/r);
-      double alpha = -atan2 (temp(1),temp(0));
-      DenseMatrix R(2,2);
-      R(0,0) = cos (alpha);
-      R(1,0) = -sin (alpha);
-      R(0,1) = sin (alpha);
-      R(1,1) = cos (alpha);
-
-
-      A = A*R;
-
-      if (A.Det() == 0) throw SingularMatrixException();
-
-      CalcInverse (A, Ainv);
-    
-
-      for (int i = 0; i < 2; i++)
-	for (int j = 0; j < 2; j++)
-	  {
-	    Amat(i,j) = A(i,j);
-	    Amatinv(i,j) = Ainv(i,j);
-	  }
-
-      temp = Amatinv * (psp2-psp1);
-      
-    };
- 
-}
-
-
-void OCCSurface :: ToPlane (const Point<3> & p3d,
-			    const PointGeomInfo & geominfo,
-			    Point<2> & pplane, 
-			    double h, int & zone) const
-{
-  if (projecttype == PLANESPACE)
-    {
-      Vec<3> p1p, n;
-      GetNormalVector (p3d, geominfo, n);
-      
-      p1p = p3d - p1;
-      pplane(0) = (p1p * ex) / h;
-      pplane(1) = (p1p * ey) / h;
-      
-      if (n * nmid < 0)
-	zone = -1;
-      else
-	zone = 0;
-    }
-  else
-    {
-      pplane = Point<2>(geominfo.u, geominfo.v);
-      //      (*testout) << "(u,v) = " << geominfo.u << ", " << geominfo.v << endl;
-      pplane = Point<2> (1/h * (Amatinv * (pplane-psp1)));
-      //      pplane = Point<2> (h * (Amatinv * (pplane-psp1)));
-      //      pplane = Point<2> (1/h * ((pplane-psp1)));
-
-      zone = 0;
-    };
-}	
-
-
-void OCCSurface :: FromPlane (const Point<2> & pplane, 
-			      Point<3> & p3d,
-			      PointGeomInfo & gi,
-			      double h) 
-{ 
-  if (projecttype == PLANESPACE)
-    {
-      //      cout << "2d   : " << pplane << endl;
-      p3d = p1 + (h * pplane(0)) * ex + (h * pplane(1)) * ey;
-      //      cout << "3d   : " << p3d << endl;
-      Project (p3d, gi);  
-      //      cout << "proj : " << p3d << endl;
-    }
-  else
-    {
-      //      Point<2> pspnew = Point<2>(1/h * (Amat * Vec<2>(pplane)) + Vec<2>(psp1));
-      Point<2> pspnew = Point<2>(h * (Amat * Vec<2>(pplane)) + Vec<2>(psp1));
-      //      Point<2> pspnew = Point<2>(h * (Vec<2>(pplane)) + Vec<2>(psp1));
-      gi.u = pspnew(0);
-      gi.v = pspnew(1);
-      gi.trignum = 1;
-      gp_Pnt val = occface->Value (gi.u, gi.v);
-      p3d = Point<3> (val.X(), val.Y(), val.Z());
-    };
-}
-
-
-
-void OCCSurface :: Project (Point<3> & p, PointGeomInfo & gi)
-{
-  //   static int cnt = 0;
-  //  if (cnt++ % 1000 == 0) cout << "********************************************** OCCSurfce :: Project, cnt = " << cnt << endl;
-  
- gp_Pnt pnt(p(0), p(1), p(2));
-
-  //  cout << "pnt = " << pnt.X() << ", " << pnt.Y() << ", " << pnt.Z() << endl;
-
-  GeomAPI_ProjectPointOnSurf proj(pnt, occface, umin, umax, vmin, vmax);
-
-  if (!proj.NbPoints())
-    {
-      cout << "Project Point on Surface FAIL" << endl;
-      throw UVBoundsException();
-    }
-
-  
-  /*
-  cout << "NP = " << proj.NbPoints() << endl;
-
-  for (int i = 1; i <= proj.NbPoints(); i++)
-    {
-      gp_Pnt pnt2 = proj.Point(i);
-      Point<3> p2 = Point<3> (pnt2.X(), pnt2.Y(), pnt2.Z());
-      cout << i << ". p = " << p2 << ", dist = " << (p2-p).Length() << endl;
-    }
-  */
-
-  pnt = proj.NearestPoint();
-  proj.LowerDistanceParameters (gi.u, gi.v);
-  gi.trignum = 1;
-
-  p = Point<3> (pnt.X(), pnt.Y(), pnt.Z());
-}
-
-
-Meshing2OCCSurfaces :: Meshing2OCCSurfaces (const TopoDS_Shape & asurf,
-					    const Box<3> & abb, int aprojecttype)
-  : Meshing2(Box3d(abb.PMin(), abb.PMax())), surface(TopoDS::Face(asurf), aprojecttype)
-{
-  ;
-}
-
-
-void Meshing2OCCSurfaces :: DefineTransformation (Point3d & p1, Point3d & p2,
-						  const PointGeomInfo * geominfo1,
-						  const PointGeomInfo * geominfo2)
-{
-  ((OCCSurface&)surface).DefineTangentialPlane (p1, *geominfo1, p2, *geominfo2);
-}
- 
-void Meshing2OCCSurfaces :: TransformToPlain (const Point3d & locpoint, 
-					   const MultiPointGeomInfo & geominfo,
-					   Point2d & planepoint, 
-					   double h, int & zone)
-{
-  Point<2> hp;
-  surface.ToPlane (locpoint, geominfo.GetPGI(1), hp, h, zone);
-  planepoint.X() = hp(0);
-  planepoint.Y() = hp(1);
-}
-
-int Meshing2OCCSurfaces :: TransformFromPlain (Point2d & planepoint,
-					       Point3d & locpoint,
-					       PointGeomInfo & gi,
-					       double h)
-{
-  Point<3> hp;
-  Point<2> hp2 (planepoint.X(), planepoint.Y());
-  surface.FromPlane (hp2, hp, gi, h);
-  locpoint = hp;
-  return 0;
-}
-
-
-
-double Meshing2OCCSurfaces :: CalcLocalH (const Point3d & p, double gh) const
-{
-  return gh;
-}
-
-
-
-
-
-
-MeshOptimize2dOCCSurfaces :: MeshOptimize2dOCCSurfaces (const OCCGeometry & ageometry)
-  : MeshOptimize2d(), geometry(ageometry)
-{
-  ;
-}
-
-
-void MeshOptimize2dOCCSurfaces :: ProjectPoint (INDEX surfind, Point3d & p) const
-{
-  Point<3> hp = p;
-  geometry.Project (surfind, hp);
-  p = hp;
-}
-
-void MeshOptimize2dOCCSurfaces :: ProjectPoint2 (INDEX surfind, INDEX surfind2, 
-					      Point3d & p) const
-{
-  TopExp_Explorer exp0, exp1;
-  bool done = false;
-  Handle(Geom_Curve) c;
-
-  for (exp0.Init(geometry.fmap(surfind), TopAbs_EDGE); !done && exp0.More(); exp0.Next())
-    for (exp1.Init(geometry.fmap(surfind2), TopAbs_EDGE); !done && exp1.More(); exp1.Next())
-      {
-	if (TopoDS::Edge(exp0.Current()).IsSame(TopoDS::Edge(exp1.Current())))
-	  {
-	    done = true;
-	    double s0, s1;
-	    c = BRep_Tool::Curve(TopoDS::Edge(exp0.Current()), s0, s1);
-	  }
-      }
-  
-  gp_Pnt pnt(p.X(), p.Y(), p.Z());
-  GeomAPI_ProjectPointOnCurve proj(pnt, c);
-  pnt = proj.NearestPoint();  
-  p.X() = pnt.X();
-  p.Y() = pnt.Y();
-  p.Z() = pnt.Z();
-	
-}
-
-void MeshOptimize2dOCCSurfaces :: 
-GetNormalVector(INDEX surfind, const Point3d & p, PointGeomInfo & geominfo, Vec3d & n) const
-{
-  gp_Pnt pnt;
-  gp_Vec du, dv;
-
-  Handle(Geom_Surface) occface;
-  occface = BRep_Tool::Surface(TopoDS::Face(geometry.fmap(surfind)));
-
-  occface->D1(geominfo.u,geominfo.v,pnt,du,dv);
-
-  n = Cross (Vec<3>(du.X(), du.Y(), du.Z()),
-	     Vec<3>(dv.X(), dv.Y(), dv.Z()));
-  n.Normalize();
-
-  if (geometry.fmap(surfind).Orientation() == TopAbs_REVERSED) n = -1*n;  
-  
-  //  GetNormalVector (surfind, p, n);
-}
-
-
-void MeshOptimize2dOCCSurfaces :: 
-GetNormalVector(INDEX surfind, const Point3d & p, Vec3d & n) const
-{
-  //  static int cnt = 0;
-  //  if (cnt++ % 1000 == 0) cout << "GetNV cnt = " << cnt << endl;
-  Standard_Real u,v;
-
-  gp_Pnt pnt(p.X(), p.Y(), p.Z());
-
-  Handle(Geom_Surface) occface;
-  occface = BRep_Tool::Surface(TopoDS::Face(geometry.fmap(surfind)));
-
-  GeomAPI_ProjectPointOnSurf proj(pnt, occface);
-
-  if (proj.NbPoints() < 1)
-    {
-      cout << "ERROR: OCCSurface :: GetNormalVector: GeomAPI_ProjectPointOnSurf failed!"
-	   << endl;
-      cout << p << endl;
-      return;
-    }
- 
-  proj.LowerDistanceParameters (u, v);
-
-  gp_Vec du, dv;
-  occface->D1(u,v,pnt,du,dv);
-
-  /*
-  if (!occface->IsCNu (1) || !occface->IsCNv (1))
-    (*testout) << "SurfOpt: Differentiation FAIL" << endl;
-  */
-
-  n = Cross (Vec3d(du.X(), du.Y(), du.Z()),
-	     Vec3d(dv.X(), dv.Y(), dv.Z()));
-  n.Normalize();
-
-  if (geometry.fmap(surfind).Orientation() == TopAbs_REVERSED) n = -1*n;  
-}
-
-
-int MeshOptimize2dOCCSurfaces :: 
-CalcPointGeomInfo(int surfind, PointGeomInfo& gi, const Point3d& p) const
-{
-  Standard_Real u,v;
-
-  gp_Pnt pnt(p.X(), p.Y(), p.Z());
-
-  Handle(Geom_Surface) occface;
-  occface = BRep_Tool::Surface(TopoDS::Face(geometry.fmap(surfind)));
-
-  GeomAPI_ProjectPointOnSurf proj(pnt, occface);
-
-  if (proj.NbPoints() < 1)
-    {
-      cout << "ERROR: OCCSurface :: GetNormalVector: GeomAPI_ProjectPointOnSurf failed!"
-	   << endl;
-      cout << p << endl;
-      return 0;
-    }
- 
-  proj.LowerDistanceParameters (u, v);  
-
-  gi.u = u;
-  gi.v = v;
-  return 1;
-}
-
-
-
-
-
-
-OCCRefinementSurfaces :: OCCRefinementSurfaces (const OCCGeometry & ageometry)
-  : Refinement(), geometry(ageometry)
-{
-  ;
-}
-
-OCCRefinementSurfaces :: ~OCCRefinementSurfaces ()
-{
-  ;
-}
-
-/*
-inline double Det3 (double a00, double a01, double a02,
-		    double a10, double a11, double a12,
-		    double a20, double a21, double a22)
-{
-  return a00*a11*a22 + a01*a12*a20 + a10*a21*a02 - a20*a11*a02 - a10*a01*a22 - a21*a12*a00;
-}
-
-bool ProjectToSurface (gp_Pnt & p, Handle(Geom_Surface) surface, double& u, double& v)
-{
-  gp_Pnt x = surface->Value (u,v);
-
-  if (p.SquareDistance(x) <= sqr(PROJECTION_TOLERANCE)) return true;
-
-  gp_Vec du, dv;
-
-  surface->D1(u,v,x,du,dv);
-
-  int count = 0;
-
-  gp_Pnt xold;
-  gp_Vec n;
-  double det, lambda, mu;
-
-  do {
-    count++;
-
-    n = du^dv;
-
-    det = Det3 (n.X(), du.X(), dv.X(),
-		n.Y(), du.Y(), dv.Y(),
-		n.Z(), du.Z(), dv.Z());
-
-    if (det < 1e-15) return false; 
-
-    lambda = Det3 (n.X(), p.X()-x.X(), dv.X(),
-	           n.Y(), p.Y()-x.Y(), dv.Y(),
-		   n.Z(), p.Z()-x.Z(), dv.Z())/det;
-
-    mu     = Det3 (n.X(), du.X(), p.X()-x.X(),
-		   n.Y(), du.Y(), p.Y()-x.Y(),
-		   n.Z(), du.Z(), p.Z()-x.Z())/det;
-  
-    u += lambda;
-    v += mu;
-
-    xold = x;
-    surface->D1(u,v,x,du,dv);
-
-  } while (xold.SquareDistance(x) > sqr(PROJECTION_TOLERANCE) || count > 50);
-
-  if (count > 50) return false;
-
-  p = x;
-
-  return true;
-}
-*/
-
-void OCCRefinementSurfaces :: 
-PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-	      int surfi, 
-	      const PointGeomInfo & gi1, 
-	      const PointGeomInfo & gi2,
-	      Point3d & newp, PointGeomInfo & newgi)
-{
-  Point<3> hnewp;
-  hnewp = p1+secpoint*(p2-p1);
-
-  if (surfi > 0)
-    {
-      
-      double u = gi1.u+secpoint*(gi2.u-gi1.u);
-      double v = gi1.v+secpoint*(gi2.v-gi1.v);
- 
-      if (!geometry.FastProject (surfi, hnewp, u, v))
-	{
-	  cout << "Fast projection to surface fails! Using OCC projection" << endl;
-          geometry.Project (surfi, hnewp);
-	}
-
-      newgi.trignum = 1;
-    }
-  
-  newp = hnewp;
-}
-
-
-void OCCRefinementSurfaces :: 
-PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
- 	      int surfi1, int surfi2, 
-	      const EdgePointGeomInfo & ap1, 
-	      const EdgePointGeomInfo & ap2,
-	      Point3d & newp, EdgePointGeomInfo & newgi)
-{
-  double s0, s1;
-
-  Point<3> hnewp = p1+secpoint*(p2-p1);
-  gp_Pnt pnt(hnewp(0), hnewp(1), hnewp(2));
-  GeomAPI_ProjectPointOnCurve proj(pnt, BRep_Tool::Curve(TopoDS::Edge(geometry.emap(ap1.edgenr)), s0, s1));
-  pnt = proj.NearestPoint();
-  hnewp = Point<3> (pnt.X(), pnt.Y(), pnt.Z());
-  newp = hnewp;
-  newgi = ap1;
-};
-
-
-void OCCRefinementSurfaces :: ProjectToSurface (Point<3> & p, int surfi)
-{
-  if (surfi > 0)
-    geometry.Project (surfi, p);
-};
-
-void OCCRefinementSurfaces :: ProjectToSurface (Point<3> & p, int surfi, PointGeomInfo & gi)
-{
-  if (surfi > 0)
-    if (!geometry.FastProject (surfi, p, gi.u, gi.v))
-      {
-	cout << "Fast projection to surface fails! Using OCC projection" << endl;
-        geometry.Project (surfi, p);
-      }
-};
-
-
-
-}
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/occ/occmeshsurf.hpp b/contrib/Netgen/libsrc/occ/occmeshsurf.hpp
deleted file mode 100644
index bda8a05a644001a19d7c9c433055dddd84265cbd..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/occ/occmeshsurf.hpp
+++ /dev/null
@@ -1,201 +0,0 @@
-#ifdef OCCGEOMETRY
-
-#ifndef FILE_OCCMESHSURF
-#define FILE_OCCMESHSURF
-
-#include "occgeom.hpp"
-
-#define PARAMETERSPACE -1
-#define PLANESPACE     1
-
-class OCCGeometry;
-
-class SingularMatrixException
-{};
-
-class UVBoundsException
-{};
-
-class OCCSurface
-{
-public:
-  TopoDS_Face topods_face;
-  Handle(Geom_Surface) occface;
-  TopAbs_Orientation orient;
-  int projecttype;
-
-protected:
-  Point<3> p1;
-  Point<3> p2;
-
-  /// in plane, directed p1->p2
-  Vec<3> ex;
-  /// in plane
-  Vec<3> ey;
-  /// outer normal direction
-  Vec<3> ez;
-
-  /// normal vector in p2
-  Vec<3> n2;
-
-  /// average normal vector
-  Vec<3> nmid;
-
-  // for transformation to parameter space
-  Point<2> psp1;
-  Point<2> psp2;
-  Vec<2> psex;
-  Vec<2> psey;
-  Mat<2,2> Amat, Amatinv;
-
-  // UV Bounds
-  double umin, umax, vmin, vmax;
-
-public:
-  OCCSurface (const TopoDS_Face & aface, int aprojecttype)
-  {
-    topods_face = aface;
-    occface = BRep_Tool::Surface(topods_face);
-    orient = topods_face.Orientation();
-    projecttype = aprojecttype;
-    ShapeAnalysis::GetFaceUVBounds (topods_face, umin, umax, vmin, vmax);
-    umin -= fabs(umax-umin)/100.0;
-    vmin -= fabs(vmax-vmin)/100.0;
-    umax += fabs(umax-umin)/100.0;
-    vmax += fabs(vmax-vmin)/100.0;
-    // projecttype = PLANESPACE;
-    /*
-    TopExp_Explorer exp1;
-    exp1.Init (topods_face, TopAbs_WIRE);
-    orient = TopAbs::Compose (orient, exp1.Current().Orientation());
-    */
-  };
-  
-  ~OCCSurface()
-  {};
-
-  void Project (Point<3> & p, PointGeomInfo & gi);
-
-  void GetNormalVector (const Point<3> & p,
-			const PointGeomInfo & geominfo,
-			Vec<3> & n) const;
-
-  /**
-    Defines tangential plane in ap1.
-    The local x-coordinate axis point to the direction of ap2 */
-  void DefineTangentialPlane (const Point<3> & ap1, 
-			      const PointGeomInfo & geominfo1,
-			      const Point<3> & ap2,
-			      const PointGeomInfo & geominfo2);
-
-
-  /// Transforms 3d point p3d to local coordinates pplane
-  void ToPlane (const Point<3> & p3d, const PointGeomInfo & geominfo,
-		Point<2> & pplane, double h, int & zone) const;
-  
-  /// Transforms point pplane in local coordinates to 3d point
-  void FromPlane (const Point<2> & pplane, 
-		  Point<3> & p3d,
-		  PointGeomInfo & gi,
-		  double h);
-};
-
-
-
-///
-class Meshing2OCCSurfaces : public Meshing2
-{
-  ///
-  OCCSurface surface;
-   
-public:
-  ///
-  Meshing2OCCSurfaces (const TopoDS_Shape & asurf, const Box<3> & aboundingbox, int aprojecttype);
-
-  ///
-  int GetProjectionType ()
-  { return surface.projecttype; }
-
-protected:
-  ///
-  virtual void DefineTransformation (Point3d & p1, Point3d & p2,
-				     const PointGeomInfo * geominfo1,
-				     const PointGeomInfo * geominfo2);
-  ///
-  virtual void TransformToPlain (const Point3d & locpoint, 
-				 const MultiPointGeomInfo & geominfo,
-				 Point2d & plainpoint, 
-				 double h, int & zone);
-  ///
-  virtual int TransformFromPlain (Point2d & plainpoint,
-				  Point3d & locpoint,
-				  PointGeomInfo & gi,
-				  double h);
-  ///
-  virtual double CalcLocalH (const Point3d & p, double gh) const;
-  
-};
-
-
-
-///
-class MeshOptimize2dOCCSurfaces : public MeshOptimize2d
-  {
-  ///
-  const OCCGeometry & geometry;
-
-public:
-    ///
-    MeshOptimize2dOCCSurfaces (const OCCGeometry & ageometry); 
-   
-    ///
-    virtual void ProjectPoint (INDEX surfind, Point3d & p) const;
-    ///
-    virtual void ProjectPoint2 (INDEX surfind, INDEX surfind2, Point3d & p) const;
-    ///
-    virtual void GetNormalVector(INDEX surfind, const Point3d & p, Vec3d & n) const;
-    ///
-    virtual void GetNormalVector(INDEX surfind, const Point3d & p, PointGeomInfo & gi, Vec3d & n) const;
-
-    
-  virtual int CalcPointGeomInfo(int surfind, PointGeomInfo& gi, const Point3d& p3) const;
-
-};
-
-
-
-class OCCGeometry;
-
-
-class OCCRefinementSurfaces : public Refinement
-{
-  const OCCGeometry & geometry;
-
-public:
-  OCCRefinementSurfaces (const OCCGeometry & ageometry);
-  virtual ~OCCRefinementSurfaces ();
-  
-  virtual void PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-			     int surfi, 
-			     const PointGeomInfo & gi1, 
-			     const PointGeomInfo & gi2,
-			     Point3d & newp, PointGeomInfo & newgi);
-
-  virtual void PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-			     int surfi1, int surfi2, 
-			     const EdgePointGeomInfo & ap1, 
-			     const EdgePointGeomInfo & ap2,
-			     Point3d & newp, EdgePointGeomInfo & newgi);
-
-  virtual void ProjectToSurface (Point<3> & p, int surfi);
-
-  virtual void ProjectToSurface (Point<3> & p, int surfi, PointGeomInfo & gi);
-};
-
-
-
-#endif
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/opti/Makefile b/contrib/Netgen/libsrc/opti/Makefile
deleted file mode 100644
index d73441553f5d206679559512e4d7c50af8b21e15..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/opti/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Makefile for optimisation library
-#
-src = bfgs.cpp linsearch.cpp linopt.cpp 
-#
-lib = opti
-libpath = libsrc/opti
-#
-#
-include ../makefile.inc
diff --git a/contrib/Netgen/libsrc/opti/bfgs.cpp b/contrib/Netgen/libsrc/opti/bfgs.cpp
deleted file mode 100644
index 31a499a64dbfe68e64e753468686eebb3ff2c877..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/opti/bfgs.cpp
+++ /dev/null
@@ -1,367 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/* Vorlesung Optimierung I, Gfrerer, WS94/95                               */
-/* BFGS-Verfahren zur Lösung freier nichtlinearer Optimierungsprobleme     */
-/*                                                                         */
-/* Programmautor:  Joachim Schöberl                                        */
-/* Matrikelnummer: 9155284                                                 */
-/*                                                                         */
-/***************************************************************************/
-
-#include <mystdlib.h>
-#include <myadt.hpp> 
-
-#include <linalg.hpp>
-#include "opti.hpp"
-
-
-namespace netgen
-{
-
-void Cholesky (const DenseMatrix & a,
-	       DenseMatrix & l, Vector & d)
-{
-  // Factors   A = L D L^T
-
-  double x;
-
-  int i, j, k;
-  int n = a.Height();
-  
-  //  (*testout) << "a = " << a << endl;
-
-  l = a;
-
-  for (i = 1; i <= n; i++)
-    {
-      for (j = i; j <= n; j++)
-	{
-	  x = l.Get(i, j);
-
-	  for (k = 1; k < i; k++)
-	    x -= l.Get(i, k) * l.Get(j, k) * d.Get(k); 
-	  
-	  if (i == j)
-	    {
-	      d.Elem(i) = x;
-	    }
-	  else
-	    {
-	      l.Elem(j, i) = x / d.Get(k);
-	    }
-	}
-    }
-
-  for (i = 1; i <= n; i++)
-    {
-      l.Elem(i, i) = 1;
-      for (j = i+1; j <= n; j++)
-	l.Elem(i, j) = 0;
-    }
-
-  /*
-  // Multiply:
-  (*testout) << "multiplied factors: " << endl;
-  for (i = 1; i <= n; i++)
-    for (j = 1; j <= n; j++)
-      {
-	x = 0;
-	for (k = 1; k <= n; k++)
-	  x += l.Get(i, k) * l.Get(j, k) * d.Get(k);
-	(*testout) << x << " ";
-      }
-  (*testout) << endl;
-  */
-}
-
-
-void MultLDLt (const DenseMatrix & l, const Vector & d, const Vector & g, Vector & p)
-{
-  int i, j, n;
-  double val;
-
-  n = l.Height();
-  p = g;
-  for (i = 1; i <= n; i++)
-    {
-      val = 0;
-      for (j = i; j <= n; j++)
-	val += p.Get(j) * l.Get(j, i);
-      p.Set(i, val);
-    }
-  for (i = 1; i <= n; i++)
-    p.Elem(i) *= d.Get(i);
-
-  for (i = n; i >= 1; i--)
-    {
-      val = 0;
-      for (j = 1; j <= i; j++)
-	val += p.Get(j) * l.Get(i, j);
-      p.Set(i, val);
-    }
-}
-
-void SolveLDLt (const DenseMatrix & l, const Vector & d, const Vector & g, Vector & p)
-{
-  int i, j, n;
-  double val;
-
-  n = l.Height();
-  p = g;
-
-  for (i = 1; i <= n; i++)
-    {
-      val = 0;
-      for (j = 1; j < i; j++)
-	val += p.Get(j) * l.Get(i, j);
-      p.Elem(i) -= val;
-    }
-  for (i = 1; i <= n; i++)
-    p.Elem(i) /= d.Get(i);
-
-  for (i = n; i >= 1; i--)
-    {
-      val = 0;
-      for (j = i+1; j <= n; j++)
-	val += p.Get(j) * l.Get(j, i);
-      p.Elem(i) -= val;
-    }
-}
-
-int LDLtUpdate (DenseMatrix & l, Vector & d, double a, const Vector & u)
-{
-  // Bemerkung: Es wird a aus R erlaubt
-  // Rueckgabewert: 0 .. D bleibt positiv definit
-  //                1 .. sonst
-
-  int i, j, n;
-
-  n = l.Height();
-
-  Vector v(n);
-  double t, told, xi;
-
-  told = 1;
-  v = u;
-
-  for (j = 1; j <= n; j++)
-    {
-      t = told + a * sqr (v.Elem(j)) / d.Get(j);
-
-      if (t <= 0) return 1;
-
-      xi = a * v.Elem(j) / (d.Get(j) * t);
-
-      d.Elem(j) *= t / told;
-
-      for (i = j + 1; i <= n; i++)
-	{
-	  v.Elem(i) -= v.Elem(j) * l.Elem(i, j);
-	  l.Elem(i, j) += xi * v.Elem(i);
-	}
-
-      told = t;
-    }
-
-  return 0;
-}
-
-
-double BFGS (
-	     Vector & x,         // i: Startwert
-	     // o: Loesung, falls IFAIL = 0
-	     const MinFunction & fun,
-	     const OptiParameters & par,
-	     double eps
-	     )
-
-
-{
-
-  int i, j, n = x.Size();
-  long it;
-  char a1crit, a3acrit;
-
-
-  Vector d(n), g(n), p(n), temp(n), bs(n), xneu(n), y(n), s(n), x0(n);
-  DenseMatrix l(n);
-  DenseMatrix hesse(n);
-
-  double /* normg, */ alphahat, hd, fold;
-  double a1, a2;
-  const double mu1 = 0.1, sigma = 0.1, xi1 = 1, xi2 = 10;
-  const double tau = 0.1, tau1 = 0.1, tau2 = 0.6;
-
-  Vector typx(x.Size());      // i: typische Groessenordnung der Komponenten
-  double f, f0;
-  double typf;               // i: typische Groessenordnung der Loesung
-  double fmin = -1e5;           // i: untere Schranke fuer Funktionswert
-  //  double eps = 1e-8;            // i: Abbruchschranke fuer relativen Gradienten
-  double tauf = 0.1;            // i: Abbruchschranke fuer die relative Aenderung der
-                                //    Funktionswerte
-  int ifail;                    // o:  0 .. Erfolg
-                                //    -1 .. Unterschreitung von fmin
-                                //     1 .. kein Erfolg bei Liniensuche
-                                //     2 .. Ãœberschreitung von itmax
-
-  typx = par.typx;
-  typf = par.typf;
-
-
-  l = 0;
-  for (i = 1; i <= n; i++)
-    l.Elem(i, i) = 1;
-
-  f = fun.FuncGrad (x, g);
-  f0 = f;
-  x0 = x;
-
-
-  it = 0;
-  do
-    {
-      // Restart
-
-      if (it % (5 * n) == 0)
-	{
-
-	  for (i = 1; i <= n; i++)
-	    d.Elem(i) = typf/ sqr (typx.Get(i));   // 1;
-	  for (i = 2; i <= n; i++)
-	    for (j = 1; j < i; j++)
-	      l.Elem(i, j) = 0;
-
-	  /*
-	  hesse = 0;
-	  for (i = 1; i <= n; i++)
-	    hesse.Elem(i, i) = typf / sqr (typx.Get(i));  
-
-	  fun.ApproximateHesse (x, hesse);
-
-	  Cholesky (hesse, l, d);
-	  */
-	}
-
-      it++;
-      if (it > par.maxit_bfgs)
-	{
-	  ifail = 2;
-	  break;
-	}
-
-
-      // Solve with factorized B
-
-      SolveLDLt (l, d, g, p);
-
-
-      p *= -1;
-      y = g;
-
-      fold = f;
-
-      // line search
-
-      alphahat = 1;
-      lines (x, xneu, p, f, g, fun, par, alphahat, fmin,
-	     mu1, sigma, xi1, xi2, tau, tau1, tau2, ifail);
-
-      /*
-      if (it > par.maxit_bfgs/2)
-	{
-	  (*testout) << "x = " << x << endl;
-	  (*testout) << "xneu = " << xneu << endl;
-	  (*testout) << "f = " << f << endl;
-	  (*testout) << "g = " << g << endl;
-	}
-      */
-
-
-      //      (*testout) << "it = " << it << " f = " << f << endl;
-      //      if (ifail != 0) break;
-
-      s.Set2 (1, xneu, -1, x);
-      y *= -1;
-      y.Add (1,g); // y += g;
-
-      x = xneu;
-
-      // BFGS Update
-
-      MultLDLt (l, d, s, bs);
-
-      a1 = y * s;
-      a2 = s * bs;
-
-      if (a1 > 0 && a2 > 0)
-	{
-	  if (LDLtUpdate (l, d, 1 / a1, y) != 0)
-	    {
-	      cerr << "update error1" << endl;
-	      ifail = 1;
-	      break;
-	    }
-
-	  if (LDLtUpdate (l, d, -1 / a2, bs) != 0)
-	    {
-	      cerr << "update error2" << endl;
-	      ifail = 1;
-	      break;
-	    }
-	}
-
-      // Calculate stop conditions
-
-      hd = eps * max2 (typf, fabs (f));
-      a1crit = 1;
-      for (i = 1; i <= n; i++)
-	if ( fabs (g.Elem(i)) * max2 (typx.Elem(i), fabs (x.Elem(i))) > hd)
-	  a1crit = 0;
-
-
-      a3acrit = (fold - f <= tauf * max2 (typf, fabs (f)));
-
-      //    testout << "g = " << g << endl;
-      //    testout << "a1crit, a3crit = " << int(a1crit) << ", " << int(a3acrit) << endl;
-
-      /*
-	// Output for tests
-
-	normg = sqrt (g * g);
-
-	testout << "it =" << setw (5) << it
-	<< " f =" << setw (12) << setprecision (5) << f
-	<< " |g| =" << setw (12) << setprecision (5) << normg;
-
-	testout << " x = (" << setw (12) << setprecision (5) << x.Elem(1);
-	for (i = 2; i <= n; i++)
-	testout << "," << setw (12) << setprecision (5) << x.Elem(i);
-	testout << ")" << endl;
-	*/
-
-      //      (*testout) << "it = " << it << " f = " << f << " x = " << x << endl
-      //		 << " g = " << g << " p = " << p << endl << endl;
-
-      //      (*testout) << "|g| = " << g.L2Norm() << endl;
-
-      if (g.L2Norm() < fun.GradStopping (x)) break;
-
-    }
-  while (!a1crit || !a3acrit);
-
-  /*
-  (*testout) << "it = " << it << " g = " << g << " f = " << f 
-	     << " fail = " << ifail << endl;
-  */
-  if (f0 < f || (ifail == 1))
-    {
-      (*testout) << "fail, f = " << f << " f0 = " << f0 << endl;
-      f = f0;
-      x = x0;
-    }
-
-  //  (*testout) << "x = " << x << ", x0 = " << x0 << endl;
-  return f;
-}
-
-}
diff --git a/contrib/Netgen/libsrc/opti/linopt.cpp b/contrib/Netgen/libsrc/opti/linopt.cpp
deleted file mode 100644
index a5d381e6b7b56b610e6255914a1f749188cc38b1..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/opti/linopt.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-#include <linalg.hpp>
-#include "opti.hpp"
-
-namespace netgen
-{
-
-void LinearOptimize (const DenseMatrix & a, const Vector & b, 
-    const Vector & c, Vector & x)
-    
-  {
-  int i1, i2, i3, j;
-  DenseMatrix m(3), inv(3);
-  Vector rs(3), hx(3), res(a.Height()), res2(3);
-  double f, fmin;
-  int nrest;
-    
-  if (a.Width() != 3)
-    {
-    cerr << "LinearOptimize only implemented for 3 unknowns" << endl;
-    return;
-    }
-    
-  fmin = 1e10;
-  x = 0;
-  nrest = a.Height();
-  for (i1 = 1; i1 <= nrest; i1++)
-    for (i2 = i1 + 1; i2 <= nrest; i2++)
-      for (i3 = i2 + 1; i3 <= nrest; i3++)
-        {
-        for (j = 1; j <= 3; j++)
-          {
-          m.Elem(1, j) = a.Get(i1, j);
-          m.Elem(2, j) = a.Get(i2, j);
-          m.Elem(3, j) = a.Get(i3, j);
-          }
-          
-        rs.Elem(1) = b.Get(i1);
-        rs.Elem(2) = b.Get(i2);
-        rs.Elem(3) = b.Get(i3);
-        
-        if (fabs (m.Det()) < 1e-12) continue;
-        
-        CalcInverse (m, inv);
-        inv.Mult (rs, hx);
-        
-        a.Residuum (hx, b, res);
-//        m.Residuum (hx, rs, res2);
-        f = c * hx;
-
-/*        
-        testout -> precision(12);
-        (*testout) << "i = (" << i1 << "," << i2 << "," << i3 
-           << "), f = " << f << " x = " << x << " res = " << res 
-           <<  " resmin = " << res.Min() 
-           << " res2 = " << res2 << " prod = " << prod << endl;
-*/
-
-	
-	double rmin = res.Elem(1);
-	for (int hi = 2; hi <= res.Size(); hi++)
-	  if (res.Elem(hi) < rmin) rmin = res.Elem(hi);
-        
-        if ( (f < fmin) && rmin >= -1e-8)
-          {
-          fmin = f;
-          x = hx;
-          }
-        }
-  }
-}
diff --git a/contrib/Netgen/libsrc/opti/linsearch.cpp b/contrib/Netgen/libsrc/opti/linsearch.cpp
deleted file mode 100644
index c847911dae10b919465d1f4fafeb04c320f2df8a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/opti/linsearch.cpp
+++ /dev/null
@@ -1,346 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/* Problem:        Liniensuche                                             */
-/*                                                                         */
-/* Programmautor:  Joachim Schöberl                                        */
-/* Matrikelnummer: 9155284                                                 */
-/*                                                                         */
-/* Algorithmus nach:                                                       */
-/*                                                                         */
-/*   Optimierung I, Gfrerer, WS94/95                                       */
-/*   Algorithmus 2.1: Liniensuche Problem (ii)                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>  // min, max, sqr
-
-#include <linalg.hpp>
-#include "opti.hpp"
-
-
-namespace netgen
-{
-const double eps0 = 1E-15;
-
-// Liniensuche
-
-
-double MinFunction :: Func (const Vector & /* x */) const
-{
-  cerr << "Func of MinFunction called" << endl;
-  return 0;
-}
-
-void MinFunction :: Grad (const Vector & /* x */, Vector & /* g */) const
-{
-  cerr << "Grad of MinFunction called" << endl;
-}
-  
-double MinFunction :: FuncGrad (const Vector & x, Vector & g) const
-{
-  int n = x.Size();
-  int i, j;
-
-  static Vector xr;
-  static Vector xl;
-  xr.SetSize(n);
-  xl.SetSize(n);
-
-  double eps = 1e-6;
-  double fl, fr;
-  
-  for (i = 1; i <= n; i++)
-    {
-      xr.Set (1, x);
-      xl.Set (1, x);
-      xr.Elem(i) += eps;
-      xl.Elem(i) -= eps;
-
-      fl = Func (xl);
-      fr = Func (xr);
-
-      g.Elem(i) = (fr - fl) / (2 * eps);
-    }
-
-  double f = Func(x);
-  //  (*testout) << "f = " << f << " grad = " << g << endl;
-  return f;
-}
-
-
-double MinFunction :: FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
-{
-  Vector g(x.Size());
-  double f = FuncGrad (x, g);
-  deriv = (g * dir);
-
-  //  (*testout) << "g = " << g << ", dir = " << dir << ", deriv = " << deriv << endl;
-  return f;
-}
-
-void MinFunction :: ApproximateHesse (const Vector & x,
-				      DenseMatrix & hesse) const
-{
-  int n = x.Size();
-  int i, j;
-
-  static Vector hx;
-  hx.SetSize(n);
-
-  double eps = 1e-6;
-  double f, f11, f12, f21, f22;
-  
-  for (i = 1; i <= n; i++)
-    {
-      for (j = 1; j < i; j++)
-	{
-	  hx = x;
-	  hx.Elem(i) = x.Get(i) + eps;
-	  hx.Elem(j) = x.Get(j) + eps;
-	  f11 = Func(hx);
-	  hx.Elem(i) = x.Get(i) + eps;
-	  hx.Elem(j) = x.Get(j) - eps;
-	  f12 = Func(hx);
-	  hx.Elem(i) = x.Get(i) - eps;
-	  hx.Elem(j) = x.Get(j) + eps;
-	  f21 = Func(hx);
-	  hx.Elem(i) = x.Get(i) - eps;
-	  hx.Elem(j) = x.Get(j) - eps;
-	  f22 = Func(hx);
-
-	  hesse.Elem(i, j) = hesse.Elem(j, i) =
-	    (f11 + f22 - f12 - f21) / (2 * eps * eps);
-	}
-
-      hx = x;
-      f = Func(x);
-      hx.Elem(i) = x.Get(i) + eps;
-      f11 = Func(hx);
-      hx.Elem(i) = x.Get(i) - eps;
-      f22 = Func(hx);
-
-      hesse.Elem(i, i) = (f11 + f22 - 2 * f) / (eps * eps);
-    }
-  //  (*testout) << "hesse = " << hesse << endl;
-}
-
-
-
-
-
-
-
-/// Line search, modified Mangasarien conditions
-void lines (Vector & x,         // i: initial point of line-search
-	    Vector & xneu,      // o: solution, if successful
-	    Vector & p,         // i: search direction
-	    double & f,         // i: function-value at x
-	    // o: function-value at xneu, iff ifail = 0
-	    Vector & g,         // i: gradient at x
-	    // o: gradient at xneu, iff ifail = 0
-	    const MinFunction & fun,  // function to minimize
-	    const OptiParameters & par,
-	     double & alphahat,  // i: initial value for alpha_hat
-	    // o: solution alpha iff ifail = 0
-	     double fmin,        // i: lower bound for f
-	     double mu1,         // i: Parameter mu_1 of Alg.2.1
-	     double sigma,       // i: Parameter sigma of Alg.2.1
-	     double xi1,         // i: Parameter xi_1 of Alg.2.1
-	     double xi2,         // i: Parameter xi_1 of Alg.2.1
-	     double tau,         // i: Parameter tau of Alg.2.1
-	     double tau1,        // i: Parameter tau_1 of Alg.2.1
-	     double tau2,        // i: Parameter tau_2 of Alg.2.1
-	     int & ifail)        // o: 0 on success
-  //    -1 bei termination because lower limit fmin
-  //     1 bei illegal termination due to different reasons
-
-{
-  double phi0, phi0prime, phi1, phi1prime, phihatprime;
-  double alpha1, alpha2, alphaincr, c;
-  char flag = 1;
-  long it;
-
-  alpha1 = 0;
-  alpha2 = 1e50;
-  phi0 = phi1 = f;
-
-  phi0prime = g * p;
-
-
-  if (phi0prime > 0)
-    {
-      ifail = 1;
-      return;
-    }
-
-  phi1prime = phi0prime;
-
-  //  (*testout) << "phi0prime = " << phi0prime << endl;
-
-  //  it = 100000l;
-  it = 0;
-
-  while (it++ <= par.maxit_linsearch)
-    {
-      //      (*testout) << "alphahat = " << alphahat << endl;
-
-      xneu.Set2 (1, x, alphahat, p);
-
-      // f = fun.FuncGrad (xneu, g);
-      //      f = fun.Func (xneu);
-      f = fun.FuncDeriv (xneu, p, phihatprime);
-
-      //      (*testout) << "f = " << f << " phip = " << phihatprime << endl;
-
-      if (f < fmin)
-	{
-	  ifail = -1;
-	  break;
-	}
-
-
-      if (alpha2 - alpha1 < eps0 * alpha2)
-	{
-	  ifail = 0;
-	  break;
-	}
-
-      //      (*testout) << "i = " << it << " al = " << alphahat << " f = " << f << " fprime " << phihatprime << endl;;
-
-      if (f - phi0 > mu1 * alphahat * phi1prime + eps0 * fabs (phi0))
-
-	{
-
-	  flag = 0;
-	  alpha2 = alphahat;
-
-	  c = 
-	    (f - phi1 - phi1prime * (alphahat-alpha1)) / 
-	    sqr (alphahat-alpha1);
-
-	  alphahat = alpha1 - 0.5 * phi1prime / c;
-
-	  if (alphahat > alpha2)
-	    alphahat = alpha1 + 1/(4*c) *
-	      ( (sigma+mu1) * phi0prime - 2*phi1prime
-		+ sqrt (sqr(phi1prime - mu1 * phi0prime) -
-			4 * (phi1 - phi0 - mu1 * alpha1 * phi0prime) * c));
-
-	  alphahat = max2 (alphahat, alpha1 + tau * (alpha2 - alpha1));
-	  alphahat = min2 (alphahat, alpha2 - tau * (alpha2 - alpha1));
-	  
-	  //	  (*testout) << " if-branch" << endl;
-
-	}
-
-      else
-
-	{
-	  /*
-	  f = fun.FuncGrad (xneu, g);
-	  phihatprime = g * p;
-	  */
-	  f = fun.FuncDeriv (xneu, p, phihatprime);
-
-	  if (phihatprime < sigma * phi0prime * (1 + eps0))
-
-	    {
-	      if (phi1prime < phihatprime)   
-		// Approximationsfunktion ist konvex
-
-		alphaincr = (alphahat - alpha1) * phihatprime /
-		  (phi1prime - phihatprime);
-
-	      else
-		alphaincr = 1e99; // MAXDOUBLE;
-
-	      if (flag)
-		{
-		  alphaincr = max2 (alphaincr, xi1 * (alphahat-alpha1));
-		  alphaincr = min2 (alphaincr, xi2 * (alphahat-alpha1));
-		}
-	      else
-		{
-		  alphaincr = max2 (alphaincr, tau1 * (alpha2 - alphahat));
-		  alphaincr = min2 (alphaincr, tau2 * (alpha2 - alphahat));
-		}
-
-	      alpha1 = alphahat;
-	      alphahat += alphaincr;
-	      phi1 = f;
-	      phi1prime = phihatprime;
-	    }
-
-	  else
-
-	    {
-	      ifail = 0;     // Erfolg !!
-	      break;
-	    }
-	  
-	  //	  (*testout) << " else, " << endl;
-
-	}
-
-    }
-
-  //  (*testout) << "linsearch: it = " << it << " ifail = " << ifail << endl;
-
-  fun.FuncGrad (xneu, g);
-
-
-  if (it < 0)
-    ifail = 1;
-
-  //  (*testout) << "fail = " << ifail << endl;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void SteepestDescent (Vector & x, const MinFunction & fun,
-		      const OptiParameters & par)
-{
-  int it, n = x.Size();
-  Vector xnew(n), p(n), g(n), g2(n);
-  double val, alphahat;
-  int fail;
-
-  val = fun.FuncGrad(x, g);
-
-  alphahat = 1;
-  //  testout << "f = ";
-  for (it = 0; it < 10; it++)
-    {
-      //    testout << val << " ";
-
-      // p = -g;
-      p.Set (-1, g);
-
-      lines (x, xnew, p, val, g, fun, par, alphahat, -1e5,
-	     0.1, 0.1, 1, 10, 0.1, 0.1, 0.6, fail);
-
-      x = xnew;
-    }
-  //  testout << endl;
-}
-}
diff --git a/contrib/Netgen/libsrc/opti/opti.hpp b/contrib/Netgen/libsrc/opti/opti.hpp
deleted file mode 100644
index 5fa0735bd0fd31cb771119ec635c7f24d058dfc4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/opti/opti.hpp
+++ /dev/null
@@ -1,142 +0,0 @@
-#ifndef FILE_OPTI
-#define FILE_OPTI
-
-/**************************************************************************/
-/* File:   opti.hpp                                                       */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-
-
-namespace netgen
-{
-
-  /** 
-      Function to be minimized.
-  */
-  class MinFunction 
-  {
-  public:
-    ///
-    virtual double Func (const Vector & x) const;
-    ///
-    virtual void Grad (const Vector & x, Vector & g) const;
-    /// function and gradient
-    virtual double FuncGrad (const Vector & x, Vector & g) const;
-    /// directional derivative
-    virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;
-    /// if |g| < gradaccuray, then stop bfgs
-    virtual double GradStopping (const Vector & /* x */) const { return 0; } 
-
-    ///
-    virtual void ApproximateHesse (const Vector & /* x */,
-				   DenseMatrix & /* hesse */) const;
-  };
-
-
-  class OptiParameters
-  {
-  public:
-    int maxit_linsearch;
-    int maxit_bfgs;
-    double typf;
-    double typx;
-
-    OptiParameters ()
-    {
-      maxit_linsearch = 100;
-      maxit_bfgs = 100;
-      typf = 1;
-      typx = 1;
-    }
-  };
-  
-  
-  /** Implementation of BFGS method.
-      Efficient method for non-linear minimiztion problems.
-      @param x initial value and solution 
-      @param fun function to be minimized
-  */
-  extern double BFGS (Vector & x, const MinFunction & fun, 
-		      const OptiParameters & par,
-		      double eps = 1e-8);
-
-  /** Steepest descent method.
-      Simple method for non-linear minimization problems.
-      @param x initial value and solution 
-      @param fun function to be minimized
-  */
-  void SteepestDescent (Vector & x, const MinFunction & fun,
-			const OptiParameters &  par);
-
-
-  extern void lines (
-		     Vector & x,         // i: Ausgangspunkt der Liniensuche
-		     Vector & xneu,      // o: Loesung der Liniensuche bei Erfolg
-		     Vector & p,         // i: Suchrichtung
-		     double & f,         // i: Funktionswert an der Stelle x
-		     // o: Funktionswert an der Stelle xneu, falls ifail = 0
-		     Vector & g,         // i: Gradient an der Stelle x
-		     // o: Gradient an der Stelle xneu, falls ifail = 0
-
-		     const MinFunction & fun,  // function to minmize
-		     const OptiParameters & par, // parameters
-		     double & alphahat,  // i: Startwert für alpha_hat
-		     // o: Loesung falls ifail = 0
-		     double fmin,        // i: untere Schranke für f
-		     double mu1,         // i: Parameter mu_1 aus Alg.2.1
-		     double sigma,       // i: Parameter sigma aus Alg.2.1
-		     double xi1,         // i: Parameter xi_1 aus Alg.2.1
-		     double xi2,         // i: Parameter xi_1 aus Alg.2.1
-		     double tau,         // i: Parameter tau aus Alg.2.1
-		     double tau1,        // i: Parameter tau_1 aus Alg.2.1
-		     double tau2,        // i: Parameter tau_2 aus Alg.2.1
-		     int & ifail);        // o:  0 bei erfolgreicher Liniensuche
-  //    -1 bei Abbruch wegen Unterschreiten von fmin
-  //    1 bei Abbruch, aus sonstigen Gründen
-
-
-
-
-  /**  
-       Solvers linear programming problem.
-
-       \begin{verbatim}
-       min      c^t x
-       A x <= b    
-       \end{verbatim}
-  */
-  extern void LinearOptimize (const DenseMatrix & a, const Vector & b, 
-			      const Vector & c, Vector & x);
-
-
-#ifdef NONE
-
-  /**
-     Simple projection iteration.
-  
-     find $u = argmin_{v >= 0}  0.5 u A u - f u$
-  */
-  extern void ApproxProject (const BaseMatrix & a, Vector & u, 
-			     const Vector & f,
-			     double tau, int its);
- 
-
-  /**
-     CG Algorithm for quadratic programming problem.
-     See: Dostal ...
-
-     d ... diag(A) ^{-1}
-  */
-  extern void ApproxProjectCG (const BaseMatrix & a, Vector & x, 
-			       const Vector & b, const class DiagMatrix & d,
-			       double gamma, int & steps, int & changes);
-
-#endif
-
-
-}
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/stlgeom/Makefile b/contrib/Netgen/libsrc/stlgeom/Makefile
deleted file mode 100644
index 007a979cadb5fcb78c15fb7bd363cdca7fc4ae62..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# Makefile for geometric library
-#
-src = stlgeom.cpp stltopology.cpp stlgeomchart.cpp stlgeommesh.cpp meshstlsurface.cpp stlline.cpp stltool.cpp
-#
-lib = stlgeom
-libpath = libsrc/stlgeom 
-#
-#
-include ../makefile.inc
-#
diff --git a/contrib/Netgen/libsrc/stlgeom/meshstlsurface.cpp b/contrib/Netgen/libsrc/stlgeom/meshstlsurface.cpp
deleted file mode 100644
index 5af12d7aa9977181bb0a11ffd9970ed13d06e9b7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/meshstlsurface.cpp
+++ /dev/null
@@ -1,1130 +0,0 @@
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-#include <meshing.hpp>
-
-
-#include "stlgeom.hpp"
-
-
-namespace netgen
-{
-
-static void STLFindEdges (STLGeometry & geom,
-			  class Mesh & mesh)
-{
-  int i, j, k;
-  double h;
-
-  h = mparam.maxh;
-
-  // mark edge points:
-  int ngp = geom.GetNP();
-
-  geom.RestrictLocalH(mesh, h);
-
-  PushStatusF("Mesh Lines");
-
-  ARRAY<STLLine*> meshlines;
-  ARRAY<Point3d> meshpoints;
-
-  PrintMessage(3,"Mesh Lines");
-
-  for (i = 1; i <= geom.GetNLines(); i++)
-    {
-      meshlines.Append(geom.GetLine(i)->Mesh(geom.GetPoints(), meshpoints, h, mesh)); 
-      SetThreadPercent(100.0 * (double)i/(double)geom.GetNLines());
-    }
-
-  geom.meshpoints.SetSize(0); //testing
-  geom.meshlines.SetSize(0);  //testing
-  for (i = 1; i <= meshpoints.Size(); i++)
-    {
-      geom.meshpoints.Append(meshpoints.Get(i)); //testing
-
-      int pim = mesh.AddPoint(meshpoints.Get(i));
-    }
-  //(++++++++++++++testing
-  for (i = 1; i <= geom.GetNLines(); i++)
-    {
-      geom.meshlines.Append(meshlines.Get(i));
-    }
-  //++++++++++++++testing)
-
-  PrintMessage(7,"feed with edges");
-
-  for (i = 1; i <= meshlines.Size(); i++)
-    {
-      STLLine* line = meshlines.Get(i);
-      (*testout) << "store line " << i << endl;
-      for (j = 1; j <= line->GetNS(); j++)
-	{
-	  int p1, p2;
-	  
-	  line->GetSeg(j, p1, p2);
-	  int trig1, trig2, trig1b, trig2b;
-
-	  if (p1 == p2) 
-	    cout << "Add Segment, p1 == p2 == " << p1 << endl;
-
-	  // Test auf geschlossener Rand mit 2 Segmenten 
-	      
-	  if ((j == 2) && (line->GetNS() == 2))
-	    {
-	      int oldp1, oldp2;
-	      line->GetSeg (1, oldp1, oldp2);
-	      if (oldp1 == p2 && oldp2 == p1)
-		{
-		  PrintMessage(7,"MESSAGE: don't use second segment");
-		  continue;
-		}
-	    }
-
-
-	  //mesh point number
-	  //p1 = geom2meshnum.Get(p1); // for unmeshed lines!!!
-	  //p2 = geom2meshnum.Get(p2); // for unmeshed lines!!!
-	  
-	  //left and right trigs
-	  trig1 = line->GetLeftTrig(j);
-	  trig2 = line->GetRightTrig(j);
-	  trig1b = line->GetLeftTrig(j+1);
-	  trig2b = line->GetRightTrig(j+1);
-	  
-	  (*testout) << "j = " << j << ", p1 = " << p1 << ", p2 = " << p2 << endl;
-	  (*testout) << "segm-trigs: "
-		   << "trig1 = " << trig1
-		   << ", trig1b = " << trig1b
-		   << ", trig2 = " << trig2
-		   << ", trig2b = " << trig2b << endl;
-
-	  if (trig1 <= 0 || trig2 <= 0 || trig1b <= 0 || trig2b <= 0)
-	    {
-	      cout << "negative trigs, "
-		   << ", trig1 = " << trig1
-		   << ", trig1b = " << trig1b
-		   << ", trig2 = " << trig2
-		   << ", trig2b = " << trig2b << endl;
-	    }
-	  /*
-	  (*testout) << "   trigs p1: " << trig1 << " - " << trig2 << endl;
-	  (*testout) << "   trigs p2: " << trig1b << " - " << trig2b << endl;
-	  (*testout) << "   charts p1: " << geom.GetChartNr(trig1) << " - " << geom.GetChartNr(trig2) << endl;
-	  (*testout) << "   charts p2: " << geom.GetChartNr(trig1b) << " - " << geom.GetChartNr(trig2b) << endl;
-	  */
-	  Point3d hp, hp2;
-	  Segment seg;
-	  seg.p1 = p1;
-	  seg.p2 = p2;
-	  seg.si = geom.GetTriangle(trig1).GetFaceNum();
-	  seg.edgenr = i;
-
-	  seg.epgeominfo[0].edgenr = i;
-	  seg.epgeominfo[0].dist = line->GetDist(j);
-	  seg.epgeominfo[1].edgenr = i;
-	  seg.epgeominfo[1].dist = line->GetDist(j+1);
-	  /*
-	  (*testout) << "seg = " 
-		     << "edgenr " << seg.epgeominfo[0].edgenr
-		     << " dist " << seg.epgeominfo[0].dist
-		     << " edgenr " << seg.epgeominfo[1].edgenr
-		     << " dist " << seg.epgeominfo[1].dist << endl;
-	  */
-	  
-	  seg.geominfo[0].trignum = trig1;
-	  seg.geominfo[1].trignum = trig1b;
-
-	  /*
-	  geom.SelectChartOfTriangle (trig1);
-	  hp = hp2 = mesh.Point (seg.p1);
-	  seg.geominfo[0].trignum = geom.Project (hp);
-
-	  (*testout) << "hp = " << hp2 << ", hp proj = " << hp << ", trignum = " << seg.geominfo[0].trignum << endl;
-	  if (Dist (hp, hp2) > 1e-5 || seg.geominfo[0].trignum == 0) 
-	    {
-	      (*testout) << "PROBLEM" << endl;
-	    }
-
-	  geom.SelectChartOfTriangle (trig1b);
-	  hp = hp2 = mesh.Point (seg.p2);
-	  seg.geominfo[1].trignum = geom.Project (hp);
-
-	  (*testout) << "hp = " << hp2 << ", hp proj = " << hp << ", trignum = " << seg.geominfo[1].trignum << endl;
-	  if (Dist (hp, hp2) > 1e-5 || seg.geominfo[1].trignum == 0) 
-	    {
-	      (*testout) << "PROBLEM" << endl;
-	    }
-	  */
-
-
-	  if (Dist (mesh.Point(seg.p1), mesh.Point(seg.p2)) < 1e-10)
-	    {
-	      (*testout) << "ERROR: Line segment of length 0" << endl;
-	      (*testout) << "pi1, 2 = " << seg.p1 << ", " << seg.p2 << endl;
-	      (*testout) << "p1, 2 = " << mesh.Point(seg.p1)
-			 << ", " << mesh.Point(seg.p2) << endl;
-	      throw NgException ("Line segment of length 0");
-	    }
-	  
-	  mesh.AddSegment (seg);
-
-
-	  Segment seg2;
-	  seg2.p1 = p2;
-	  seg2.p2 = p1;
-	  seg2.si = geom.GetTriangle(trig2).GetFaceNum();
-	  seg2.edgenr = i;
-
-	  seg2.epgeominfo[0].edgenr = i;
-	  seg2.epgeominfo[0].dist = line->GetDist(j+1);
-	  seg2.epgeominfo[1].edgenr = i;
-	  seg2.epgeominfo[1].dist = line->GetDist(j);
-	  /*
-	  (*testout) << "seg = " 
-		     << "edgenr " << seg2.epgeominfo[0].edgenr
-		     << " dist " << seg2.epgeominfo[0].dist
-		     << " edgenr " << seg2.epgeominfo[1].edgenr
-		     << " dist " << seg2.epgeominfo[1].dist << endl;
-	  */
-	  
-	  seg2.geominfo[0].trignum = trig2b;
-	  seg2.geominfo[1].trignum = trig2;
-	  
-	  /*
-	  geom.SelectChartOfTriangle (trig2);
-	  hp = hp2 = mesh.Point (seg.p1);
-	  seg2.geominfo[0].trignum = geom.Project (hp);
-
-	  (*testout) << "hp = " << hp2 << ", hp proj = " << hp << ", trignum = " << seg.geominfo[0].trignum << endl;
-	  if (Dist (hp, hp2) > 1e-5 || seg2.geominfo[0].trignum == 0) 
-	    {
-	      (*testout) << "Get GeomInfo PROBLEM" << endl;
-	    }
-
-
-	  geom.SelectChartOfTriangle (trig2b);
-	  hp = hp2 = mesh.Point (seg.p2);
-	  seg2.geominfo[1].trignum = geom.Project (hp);
-	  (*testout) << "hp = " << hp2 << ", hp proj = " << hp << ", trignum = " << seg.geominfo[1].trignum << endl;
-	  if (Dist (hp, hp2) > 1e-5 || seg2.geominfo[1].trignum == 0) 
-	    {
-	      (*testout) << "Get GeomInfo PROBLEM" << endl;
-	    }
-	  */	  
-
-	  mesh.AddSegment (seg2);
-
-
-	  /*
-	  // should be start triangle and end triangle
-	  int bothtrigs1[2] = { trig1, trig1 };
-	  meshing.AddBoundaryElement (p1, p2, sizeof (bothtrigs1), &bothtrigs1);
-	  
-	  int bothtrigs2[2] = { trig2, trig2 };
-	  meshing.AddBoundaryElement (p2, p1, sizeof (bothtrigs2), &bothtrigs2);
-	  */
-	}
-    }
-
-  PopStatus();
-}
-
-
-
-
-void STLSurfaceMeshing1 (STLGeometry & geom,
-			 class Mesh & mesh,
-			 int retrynr);
-
-int STLSurfaceMeshing (STLGeometry & geom,
-		       class Mesh & mesh)
-{
-  int i, j;
-  PrintFnStart("Do Surface Meshing");
-
-  geom.PrepareSurfaceMeshing();
-
-  if (mesh.GetNSeg() == 0)
-    STLFindEdges (geom, mesh);
-
-  int nopen;
-  int outercnt = 20;
-
-  //  mesh.Save ("mesh.edges");
-  
-  for (i = 1; i <= mesh.GetNSeg(); i++)
-    {
-      const Segment & seg = mesh.LineSegment (i);
-      if (seg.geominfo[0].trignum <= 0 || seg.geominfo[1].trignum <= 0)
-	{
-	  (*testout) << "Problem with segment " << i << ": " << seg << endl;
-	}
-    }
-
-
-  do
-    {
-      outercnt--;
-      if (outercnt <= 0)
-	  return MESHING3_OUTERSTEPSEXCEEDED;
-
-      if (multithread.terminate)
-	{
-	  return MESHING3_TERMINATE;
-	}
-
-      mesh.FindOpenSegments();
-      nopen = mesh.GetNOpenSegments();
-
-      if (nopen)
-	{
-	  int trialcnt = 0;
-	  while (nopen && trialcnt <= 5)
-	    {
-	      if (multithread.terminate)
-		{
-		  return MESHING3_TERMINATE;
-		}
-	      trialcnt++;
-	      STLSurfaceMeshing1 (geom, mesh, trialcnt);
-
-	      mesh.FindOpenSegments();
-	      nopen = mesh.GetNOpenSegments();
-
-	      if (nopen)
-		{
-		  geom.ClearMarkedSegs();
-		  for (i = 1; i <= nopen; i++)
-		    {
-		      const Segment & seg = mesh.GetOpenSegment (i);
-		      geom.AddMarkedSeg(mesh.Point(seg.p1),mesh.Point(seg.p2));
-		    }
-
-		  geom.InitMarkedTrigs();
-		  for (i = 1; i <= nopen; i++)
-		    {
-		      const Segment & seg = mesh.GetOpenSegment (i);
-		      geom.SetMarkedTrig(seg.geominfo[0].trignum,1);
-		      geom.SetMarkedTrig(seg.geominfo[1].trignum,1);
-		    }
-
-		  MeshOptimizeSTLSurface optmesh(geom);
-		  optmesh.SetFaceIndex (0);
-		  optmesh.SetImproveEdges (0);
-		  optmesh.SetMetricWeight (0);
-		  
-		  mesh.CalcSurfacesOfNode();
-		  optmesh.EdgeSwapping (mesh, 0);
-		  mesh.CalcSurfacesOfNode();
-		  optmesh.ImproveMesh (mesh);
-		}
-
-	      mesh.Compress();
-	      mesh.FindOpenSegments();
-	      nopen = mesh.GetNOpenSegments();
-
-	      if (trialcnt <= 5 && nopen)
-		{
-		  mesh.RemoveOneLayerSurfaceElements();
-
-		  if (trialcnt >= 4)
-		    {
-		      mesh.FindOpenSegments();
-		      mesh.RemoveOneLayerSurfaceElements();
-
-		      mesh.FindOpenSegments ();		  
-		      nopen = mesh.GetNOpenSegments();
-		    }
-		}
-	    }
-
-
-	  if (multithread.terminate)
-	    return MESHING3_TERMINATE;
-
-	  if (nopen)
-	    {
-	      
-	      PrintMessage(3,"Meshing failed, trying to refine");
-
-	      mesh.FindOpenSegments ();
-	      nopen = mesh.GetNOpenSegments();
-			  
-	      mesh.FindOpenSegments ();
-	      mesh.RemoveOneLayerSurfaceElements();
-	      mesh.FindOpenSegments ();
-	      mesh.RemoveOneLayerSurfaceElements();
-
-	      // Open edge-segments will be refined !
-	      INDEX_2_HASHTABLE<int> openseght (nopen+1);
-	      for (i = 1; i <= mesh.GetNOpenSegments(); i++)
-		{
-		  const Segment & seg = mesh.GetOpenSegment (i);
-		  INDEX_2 i2(seg.p1, seg.p2);
-		  i2.Sort();
-		  openseght.Set (i2, 1);
-		}
-
-	      
-	      mesh.FindOpenSegments ();
-	      mesh.RemoveOneLayerSurfaceElements();
-	      mesh.FindOpenSegments ();
-	      mesh.RemoveOneLayerSurfaceElements();
-	      
-
-	      INDEX_2_HASHTABLE<int> newpht(100);
-
-	      int nsegold = mesh.GetNSeg();
-	      for (i = 1; i <= nsegold; i++)
-		{
-		  Segment seg = mesh.LineSegment(i);
-		  INDEX_2 i2(seg.p1, seg.p2);
-		  i2.Sort();
-		  if (openseght.Used (i2))
-		    {
-		      // segment will be split
-		      PrintMessage(7,"Split segment ", int(seg.p1), "-", int(seg.p2));
-	      
-		      Segment nseg1, nseg2;
-		      EdgePointGeomInfo newgi;
-		      
-		      const EdgePointGeomInfo & gi1 = seg.epgeominfo[0];
-		      const EdgePointGeomInfo & gi2 = seg.epgeominfo[1];
-		      
-		      newgi.dist = 0.5 * (gi1.dist + gi2.dist);
-		      newgi.edgenr = gi1.edgenr;
-
-		      int hi;
-		      
-		      Point3d newp;
-		      int newpi;
-		      
-		      if (!newpht.Used (i2))
-			{
-			  newp = geom.GetLine (gi1.edgenr)->
-			    GetPointInDist (geom.GetPoints(), newgi.dist, hi);
-			  newpi = mesh.AddPoint (newp);
-			  newpht.Set (i2, newpi);
-			}
-		      else
-			{
-			  newpi = newpht.Get (i2);
-			  newp = mesh.Point (newpi);
-			}
-
-		      nseg1 = seg;
-		      nseg2 = seg;
-		      nseg1.p2 = newpi;
-		      nseg1.epgeominfo[1] = newgi;
-		      
-		      nseg2.p1 = newpi;
-		      nseg2.epgeominfo[0] = newgi;
-		      
-		      mesh.LineSegment(i) = nseg1;
-		      mesh.AddSegment (nseg2);
-		      
-		      mesh.RestrictLocalH (Center (mesh.Point(nseg1.p1),
-						   mesh.Point(nseg1.p2)),
-					   Dist (mesh.Point(nseg1.p1),
-						 mesh.Point(nseg1.p2)));
-		      mesh.RestrictLocalH (Center (mesh.Point(nseg2.p1),
-						   mesh.Point(nseg2.p2)),
-					   Dist (mesh.Point(nseg2.p1),
-						 mesh.Point(nseg2.p2)));
-		    }
-		}
-
-	    }
-
-	  nopen = -1;
-	}
-    
-      else
-
-	{
-	  PrintMessage(5,"mesh is closed, verifying ...");
-
-	  // no open elements, check wrong elemetns (intersecting..)
-
-
-	 	  
-	  PrintMessage(5,"check overlapping");
-	  // 	  mesh.FindOpenElements(); // would leed to locked points
-	  mesh.CheckOverlappingBoundary();
-
-	  geom.InitMarkedTrigs();
-
-	  for (i = 1; i <= mesh.GetNSE(); i++)
-	    if (mesh.SurfaceElement(i).BadElement())
-	      {
-		int trig = mesh.SurfaceElement(i).PNum(1);
-		geom.SetMarkedTrig(trig,1);
-		PrintMessage(7, "overlapping element, will be removed");
-	      }
-	  
-	  
-
-	  ARRAY<Point3d> refpts;
-	  ARRAY<double> refh;
-
-	  // was commented:
-
-	  for (i = 1; i <= mesh.GetNSE(); i++)
-	    if (mesh.SurfaceElement(i).BadElement())
-	      {
-		for (j = 1; j <= 3; j++)
-		  {
-		    refpts.Append (mesh.Point (mesh.SurfaceElement(i).PNum(j)));
-		    refh.Append (mesh.GetH (refpts.Last()) / 2);
-		  }
-		mesh.DeleteSurfaceElement(i);
-	      }
-	  	  
-	  // delete wrong oriented element
-	  for (i = 1; i <= mesh.GetNSE(); i++)
-	    {
-	      const Element2d & el = mesh.SurfaceElement(i);
-	      if (!el.PNum(1))
-		continue;
-
-	      Vec3d n = Cross (Vec3d (mesh.Point(el.PNum(1)), 
-				      mesh.Point(el.PNum(2))),
-			       Vec3d (mesh.Point(el.PNum(1)), 
-				      mesh.Point(el.PNum(3))));
-	      Vec3d ng = geom.GetTriangle(el.GeomInfoPi(1).trignum).Normal();
-	      if (n * ng < 0)
-		{
-		  refpts.Append (mesh.Point (mesh.SurfaceElement(i).PNum(1)));
-		  refh.Append (mesh.GetH (refpts.Last()) / 2);
-		  mesh.DeleteSurfaceElement(i);
-		}
-	    }
-	  // end comments
-
-	  for (i = 1; i <= refpts.Size(); i++)
-	    mesh.RestrictLocalH (refpts.Get(i), refh.Get(i));
-
-	  mesh.RemoveOneLayerSurfaceElements();
-
-	  mesh.Compress();
-	  
-	  mesh.FindOpenSegments ();
-	  nopen = mesh.GetNOpenSegments();
-
-	  /*
-	  if (!nopen)
-	    {
-	      // mesh is still ok
-
-	      void STLSurfaceOptimization (STLGeometry & geom,
-					   class Mesh & mesh,
-					   MeshingParameters & mparam)
-	      
-	    }
-	  */
-	}
-      
-    }
-  while (nopen);
-
-  mesh.Compress();
-  mesh.CalcSurfacesOfNode();
-
-  return MESHING3_OK;
-}
-
-
-
-
-
-
-void STLSurfaceMeshing1 (STLGeometry & geom,
-			 class Mesh & mesh,
-			 int retrynr)
-{
-  int i, j, k;
-  double h;
-  
-  
-  h = mparam.maxh;
-
-  mesh.FindOpenSegments();
-  
-  ARRAY<int> spiralps(0);
-  spiralps.SetSize(0);
-  for (i = 1; i <= geom.GetNP(); i++)
-    {
-      if (geom.GetSpiralPoint(i)) {spiralps.Append(i);}
-    }
-  
-  PrintMessage(7,"NO spiralpoints = ", spiralps.Size());
-  int spfound;
-  int sppointnum;
-  int spcnt = 0;
-
-  ARRAY<int> meshsp(mesh.GetNP());
-  for (i = 1; i <= mesh.GetNP(); i++)
-    {
-      meshsp.Elem(i) = 0;
-      for (j = 1; j <= spiralps.Size(); j++)
-	if (Dist2(geom.GetPoint(spiralps.Get(j)), mesh.Point(i)) < 1e-20) 
-	  meshsp.Elem(i) = spiralps.Get(j);
-    }
-
-
-  ARRAY<int> opensegsperface(mesh.GetNFD());
-  for (i = 1; i <= mesh.GetNFD(); i++)
-    opensegsperface.Elem(i) = 0;
-  for (i = 1; i <= mesh.GetNOpenSegments(); i++)
-    {
-      int si = mesh.GetOpenSegment (i).si;
-      if (si >= 1 && si <= mesh.GetNFD())
-	{
-	  opensegsperface.Elem(si)++;
-	}
-      else
-	{
-	  cerr << "illegal face index" << endl;
-	}
-    }
-
-
-  double starttime = GetTime ();
-
-  for (int fnr = 1; fnr <= mesh.GetNFD(); fnr++)
-    if (opensegsperface.Get(fnr))
-      {
-	if (multithread.terminate)
-	  return;
-	
-	PrintMessage(5,"Meshing surface ", fnr, "/", mesh.GetNFD());
-	MeshingSTLSurface meshing (geom);
-	
-	meshing.SetStartTime (starttime);
-	
-	for (i = 1; i <= mesh.GetNP(); i++)
-	  {
-	    /*
-	      spfound = 0;
-	      for (j = 1; j <= spiralps.Size(); j++)
-	      {
-	      if (Dist2(geom.GetPoint(spiralps.Get(j)),mesh.Point(i)) < 1e-20) 
-		{spfound =  1; sppointnum = spiralps.Get(j);}
-		}
-	    */
-	    sppointnum = 0;
-	    if (i <= meshsp.Size())
-	      sppointnum = meshsp.Get(i);
-	    
-	  //spfound = 0;
-	  if (sppointnum)
-	    {
-	      MultiPointGeomInfo mgi;
-  
-	      int ntrigs = geom.NOTrigsPerPoint(sppointnum);
-	      spcnt++;
-	      
-	      for (j = 0; j < ntrigs; j++)
-		{
-		  PointGeomInfo gi;
-		  gi.trignum = geom.TrigPerPoint(sppointnum, j+1);
-		  mgi.AddPointGeomInfo (gi);
-		}
-	      
-	      // Einfuegen von ConePoint: Point bekommt alle
-	      // Dreiecke (werden dann intern kopiert)
-	      // Ein Segment zum ConePoint muss vorhanden sein !!!
-	      
-	      meshing.AddPoint (mesh.Point(i), i, &mgi);
-	      
-	    }
-	  else
-	    {
-	      meshing.AddPoint (mesh.Point(i), i);
-	    }
-	}
-      
-      
-      for (i = 1; i <= mesh.GetNOpenSegments(); i++)
-	{
-	  const Segment & seg = mesh.GetOpenSegment (i);
-	  if (seg.si == fnr)
-	    meshing.AddBoundaryElement (seg.p1, seg.p2, seg.geominfo[0], seg.geominfo[1]);
-	}
-      
-      
-      PrintMessage(3,"start meshing, trialcnt = ", retrynr);
-
-      /*
-      (*testout) << "start meshing with h = " << h << endl;
-      */
-      meshing.GenerateMesh (mesh, h, fnr);  // face index
-#ifdef OPENGL
-      extern void Render();
-      Render();
-#endif
-    }    
-      
-  
-  mesh.CalcSurfacesOfNode();
-}
-
-
-
-void STLSurfaceOptimization (STLGeometry & geom,
-			     class Mesh & mesh,
-			     MeshingParameters & mparam)
-{
-  PrintFnStart("optimize STL Surface");
-
-
-  MeshOptimizeSTLSurface optmesh(geom);
-  //
-
-  int i, j;
-  /*
-  for (i = 1; i <= mparam.optsteps2d; i++)
-    {
-      EdgeSwapping (mesh, 1, 1);
-      CombineImprove (mesh, 1);
-      optmesh.ImproveMesh (mesh, 0, 10, 1, 1);
-    }
-  */
-
-  optmesh.SetFaceIndex (0);
-  optmesh.SetImproveEdges (0);
-  optmesh.SetMetricWeight (mparam.elsizeweight);
-
-  PrintMessage(5,"optimize string = ", mparam.optimize2d, " elsizew = ", mparam.elsizeweight);
-
-  for (i = 1; i <= mparam.optsteps2d; i++)
-    for (j = 1; j <= strlen(mparam.optimize2d); j++)
-      {
-	if (multithread.terminate)
-	  break;
-
-	(*testout) << "optimize, before, step = " << mparam.optimize2d[j-1] << mesh.Point (3679) << endl;
-
-	mesh.CalcSurfacesOfNode();
-	switch (mparam.optimize2d[j-1])
-	  {
-	  case 's': 
-	    {
-	      optmesh.EdgeSwapping (mesh, 0);
-	      break;
-	    }
-	  case 'S': 
-	    {
-	      optmesh.EdgeSwapping (mesh, 1);
-	      break;
-	    }
-	  case 'm': 
-	    {
-	      optmesh.ImproveMesh(mesh);
-	      break;
-	    }
-	  case 'c': 
-	    {
-	      optmesh.CombineImprove (mesh);
-	      break;
-	    }
-	  }
-	(*testout) << "optimize, after, step = " << mparam.optimize2d[j-1] << mesh.Point (3679) << endl;
-      }
-
-  geom.surfaceoptimized = 1;
-
-  mesh.Compress();
-  mesh.CalcSurfacesOfNode();
-
-
-}
-
-
-
-MeshingSTLSurface :: MeshingSTLSurface (STLGeometry & ageom)
-  : Meshing2(Box3d (ageom.GetBoundingBox().PMin(),
-		    ageom.GetBoundingBox().PMax())), geom(ageom)
-{
-  ;
-}
-
-void MeshingSTLSurface :: DefineTransformation (Point3d & p1, Point3d & p2,
-						const PointGeomInfo * geominfo,
-						const PointGeomInfo * geominfo2)
-{
-  transformationtrig = geominfo[0].trignum;
-  
-  geom.DefineTangentialPlane(p1, p2, transformationtrig);
-}
-
-void MeshingSTLSurface :: TransformToPlain (const Point3d & locpoint, const MultiPointGeomInfo & gi,
-					    Point2d & plainpoint, double h, int & zone)
-{
-  int trigs[10000];
-  int i;
-
-  if (gi.GetNPGI() >= 9999) 
-    {
-      PrintError("In Transform to plane: increase size of trigs!!!");
-    }
-
-  for (i = 1; i <= gi.GetNPGI(); i++)
-    trigs[i-1] = gi.GetPGI(i).trignum;
-  trigs[gi.GetNPGI()] = 0;
-
-  //  int trig = gi.trignum;
-  //   (*testout) << "locpoint = " << locpoint;
-
-  Point<2> hp2d;
-  geom.ToPlane (locpoint, trigs, hp2d, h, zone, 1);
-  plainpoint = hp2d;
-
-  //  geom.ToPlane (locpoint, NULL, plainpoint, h, zone, 1);
-  /*
-  (*testout) << " plainpoint = " << plainpoint
-	     << " h = " << h 
-	     << endl;
-  */
-}
-
-/*
-int MeshingSTLSurface :: ComputeLineGeoInfo (const Point3d & p1, const Point3d & p2,
-					      int & geoinfosize, void *& geoinfo)
-{
-  static int geomtrig[2] = { 0, 0 };
-
-  Point3d hp;
-  hp = p1;
-  geomtrig[0] = geom.Project (hp);
-
-  hp = p2;
-  geomtrig[1] = geom.Project (hp);
-  
-  geoinfosize = sizeof (geomtrig);
-  geoinfo = &geomtrig;
-
-  if (geomtrig[0] == 0)
-    {
-      return 1;
-    }
-  return 0;
-}
-*/
-
-
-int MeshingSTLSurface :: ComputePointGeomInfo (const Point3d & p, PointGeomInfo & gi)
-{
-  // compute triangle of point,
-  // if non-unique: 0
-
-  Point<3> hp = p;
-  gi.trignum = geom.Project (hp);
-
-  if (!gi.trignum)
-    {
-      return 1;
-    }
-
-  return 0;
-}
-
-
-int MeshingSTLSurface :: 
-ChooseChartPointGeomInfo (const MultiPointGeomInfo & mpgi, 
-			  PointGeomInfo & pgi)
-{
-  int i;
-
-  for (i = 1; i <= mpgi.GetNPGI(); i++)
-    if (geom.TrigIsInOC (mpgi.GetPGI(i).trignum, geom.meshchart))
-      {
-	pgi = mpgi.GetPGI(i);
-	return 0;
-      }
-  /*
-  for (i = 0; i < mpgi.cnt; i++)
-    {
-      //      (*testout) << "d" << endl;
-      if (geom.TrigIsInOC (mpgi.mgi[i].trignum, geom.meshchart))
-	{
-	  pgi = mpgi.mgi[i];
-	  return 0;
-	}
-    }
-  */
-  PrintMessage(7,"INFORM: no gi on chart");
-  pgi.trignum = 1;
-  return 1;
-}
-
-
-
-int MeshingSTLSurface :: 
-IsLineVertexOnChart (const Point3d & p1, const Point3d & p2,
-		     int endpoint, const PointGeomInfo & gi)
-{
-  Vec3d baselinenormal = geom.meshtrignv;
-
-  int lineendtrig = gi.trignum;
-
-  
-  return geom.TrigIsInOC (lineendtrig, geom.meshchart);
-
-  //  Vec3d linenormal = geom.GetTriangleNormal (lineendtrig);
-  //  return ( (baselinenormal * linenormal) > cos (30 * (M_PI/180)) );
-}
-
-void MeshingSTLSurface :: 
-GetChartBoundary (ARRAY<Point2d > & points, 
-		  ARRAY<Point3d > & points3d,
-		  ARRAY<INDEX_2> & lines, double h) const
-{
-  points.SetSize (0);
-  points3d.SetSize (0);
-  lines.SetSize (0);
-  geom.GetMeshChartBoundary (points, points3d, lines, h);
-}
-
-
-
-
-int MeshingSTLSurface :: TransformFromPlain (Point2d & plainpoint,
-					     Point3d & locpoint, 
-					     PointGeomInfo & gi, 
-					     double h)
-{
-  //return 0, wenn alles OK
-  Point<3> hp3d;
-  int res = geom.FromPlane (plainpoint, hp3d, h);
-  locpoint = hp3d;
-  ComputePointGeomInfo (locpoint, gi);
-  return res;
-}
-
-
-int MeshingSTLSurface :: 
-BelongsToActiveChart (const Point3d & p, 
-		      const PointGeomInfo & gi)
-{
-  return (geom.TrigIsInOC(gi.trignum, geom.meshchart) != 0);
-}
-
-
-
-double MeshingSTLSurface :: CalcLocalH (const Point3d & p, double gh) const
-{
-  return gh;
-}
-
-double MeshingSTLSurface :: Area () const
-{
-  return geom.Area();
-}
-
-
-
-
-
-
-MeshOptimizeSTLSurface :: MeshOptimizeSTLSurface (STLGeometry & ageom)
-  : MeshOptimize2d(), geom(ageom)
-{
-  ;
-}
-
-
-void MeshOptimizeSTLSurface :: SelectSurfaceOfPoint (const Point3d & p,
-						     const PointGeomInfo & gi)
-{
-  //  (*testout) << "sel char: " << gi.trignum << endl;
-  
-  geom.SelectChartOfTriangle (gi.trignum);
-  //  geom.SelectChartOfPoint (p);
-}
-
-
-void MeshOptimizeSTLSurface :: ProjectPoint (INDEX surfind, Point3d & p) const
-{
-  Point<3> hp = p;
-  if (!geom.Project (hp))
-    {
-      PrintMessage(7,"project failed");
-      
-      if (!geom.ProjectOnWholeSurface(hp)) 
-	{
-	  PrintMessage(7, "project on whole surface failed");
-	}
-    }
-  p = hp;
-  //  geometry.GetSurface(surfind)->Project (p);
-}
-
-void MeshOptimizeSTLSurface :: ProjectPoint2 (INDEX surfind, INDEX surfind2, Point3d & p) const
-{
-  /*
-  ProjectToEdge ( geometry.GetSurface(surfind), 
-		  geometry.GetSurface(surfind2), p);
-  */
-}
-
-int  MeshOptimizeSTLSurface :: CalcPointGeomInfo(PointGeomInfo& gi, const Point3d& p3) const
-{
-  Point<3> hp = p3;
-  gi.trignum = geom.Project (hp);
-
-  if (gi.trignum)
-    {
-      return 1;
-    }
-
-  return 0;
-  
-}
-
-void MeshOptimizeSTLSurface :: GetNormalVector(INDEX surfind, const Point3d & p, Vec3d & n) const
-{
-  n = geom.GetChartNormalVector();
-  
-  /*
-  geometry.GetSurface(surfind)->CalcGradient (p, n);
-  n /= n.Length();
-  if (geometry.GetSurface(surfind)->Inverse())
-    n *= -1;
-  */
-}
-  
-
-
-
-
-
-
-
-
-
-RefinementSTLGeometry :: RefinementSTLGeometry (const STLGeometry & ageom)
-  : Refinement(), geom(ageom)
-{
-  ;
-}
-
-RefinementSTLGeometry :: ~RefinementSTLGeometry ()
-{
-  ;
-}
-  
-void RefinementSTLGeometry :: 
-PointBetween  (const Point3d & p1, const Point3d & p2, double secpoint,
-	       int surfi, 
-	       const PointGeomInfo & gi1, 
-	       const PointGeomInfo & gi2,
-	       Point3d & newp, PointGeomInfo & newgi)
-{
-  newp = p1+secpoint*(p2-p1);
-
-  /*
-  (*testout) << "surf-between: p1 = " << p1 << ", p2 = " << p2
-	     << ", gi = " << gi1 << " - " << gi2 << endl;
-  */
-
-  if (gi1.trignum > 0)
-    {
-      //      ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum);
-
-      Point<3> np1 = newp;
-      Point<3> np2 = newp;
-      ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum);
-      int tn1 = geom.Project (np1);
-
-      ((STLGeometry&)geom).SelectChartOfTriangle (gi2.trignum);
-      int tn2 = geom.Project (np2);
-
-      newgi.trignum = tn1; //urspruengliche version
-      newp = np1;          //urspruengliche version
-
-      if (!newgi.trignum) 
-	{ newgi.trignum = tn2; newp = np2; }
-      if (!newgi.trignum) newgi.trignum = gi1.trignum;
-
-      /*    
-      if (tn1 != 0 && tn2 != 0 && ((STLGeometry&)geom).GetAngle(tn1,tn2) < M_PI*0.05)	{
-	  newgi.trignum = tn1;
-	  newp = np1;
-	}
-      else
-	{
-	  newp = ((STLGeometry&)geom).PointBetween(p1, gi1.trignum, p2, gi2.trignum);
-	  tn1 = ((STLGeometry&)geom).Project(newp);
-	  newgi.trignum = tn1;
-
-	  if (!tn1) 
-	    {
-	      newp = Center (p1, p2);
-	      newgi.trignum = 0;
-	      
-	    }
-	}
-      */
-    }
-  else
-    {
-      //      (*testout) << "WARNING: PointBetween got geominfo = 0" << endl;
-      newp =  p1+secpoint*(p2-p1);
-      newgi.trignum = 0;
-    }
-     
-  //  (*testout) << "newp = " << newp << ", ngi = " << newgi << endl;
-}
-
-void RefinementSTLGeometry ::
-PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-	      int surfi1, int surfi2, 
-	      const EdgePointGeomInfo & gi1, 
-	      const EdgePointGeomInfo & gi2,
-	      Point3d & newp, EdgePointGeomInfo & newgi)
-{
-  /*
-  (*testout) << "edge-between: p1 = " << p1 << ", p2 = " << p2
-	     << ", gi1,2 = " << gi1 << ", " << gi2 << endl;
-  */
-  /*
-  newp = Center (p1, p2);
-  ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum);
-  newgi.trignum = geom.Project (newp);
-  */
-  int hi;
-  newgi.dist = (1.0-secpoint) * gi1.dist + secpoint*gi2.dist;
-  newgi.edgenr = gi1.edgenr;
-
-  /*
-  (*testout) << "p1 = " << p1 << ", p2 = " << p2 << endl;
-  (*testout) << "refedge: " << gi1.edgenr
-	     << " d1 = " << gi1.dist << ", d2 = " << gi2.dist << endl;
-  */
-  newp = geom.GetLine (gi1.edgenr)->GetPointInDist (geom.GetPoints(), newgi.dist, hi);
-
-  //  (*testout) << "newp = " << newp << endl;
-}
-
-
-void RefinementSTLGeometry :: ProjectToSurface (Point<3> & p, int surfi)
-{
-  cout << "RefinementSTLGeometry :: ProjectToSurface not implemented!" << endl;
-}
-
-
-void RefinementSTLGeometry :: ProjectToSurface (Point<3> & p, int surfi,
-						PointGeomInfo & gi)
-{
-  ((STLGeometry&)geom).SelectChartOfTriangle (gi.trignum);
-  gi.trignum = geom.Project (p);
-  //  if (!gi.trignum) 
-  //    cout << "projectSTL failed" << endl;
-}
-
- 
-}
diff --git a/contrib/Netgen/libsrc/stlgeom/meshstlsurface.hpp b/contrib/Netgen/libsrc/stlgeom/meshstlsurface.hpp
deleted file mode 100644
index f190d107a58745c85cbc6437a909ad520c930bb6..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/meshstlsurface.hpp
+++ /dev/null
@@ -1,121 +0,0 @@
-#ifndef FILE_MESHSTLSURF
-#define FILE_MESHSTLSURF
-
-/* *************************************************************************/
-/* File:   meshstlsurf.hpp                                                 */
-/* Author: Johannes Gerstmayr, Joachim Schoeberl                           */
-/* Date:   01. Aug. 99                                                     */
-/* *************************************************************************/
-
-/*
-
-The interface between mesh generation and stl geometry
-
-*/
-
-
-/// 
-class MeshingSTLSurface : public Meshing2
-{
-  ///
-  STLGeometry & geom;
-  ///
-  int transformationtrig;
-public:
-  ///
-  MeshingSTLSurface (STLGeometry & ageom);
-
-protected:
-  ///
-  virtual void DefineTransformation (Point3d & p1, Point3d & p2,
-				     const PointGeomInfo * geominfo1,
-				     const PointGeomInfo * geominfo2);
-  ///
-  virtual void TransformToPlain (const Point3d & locpoint, const MultiPointGeomInfo & geominfo,
-      Point2d & plainpoint, double h, int & zone);
-  ///
-  virtual int TransformFromPlain (Point2d & plainpoint,
-				  Point3d & locpoint, 
-				  PointGeomInfo & gi,
-				  double h);
-  ///
-  virtual int BelongsToActiveChart (const Point3d & p, 
-				    const PointGeomInfo & gi);
-
-  ///
-  virtual int ComputePointGeomInfo (const Point3d & p, PointGeomInfo & gi);
-  ///
-  virtual int ChooseChartPointGeomInfo (const MultiPointGeomInfo & mpgi, 
-					 PointGeomInfo & pgi);
-
-  ///
-  virtual int IsLineVertexOnChart (const Point3d & p1, const Point3d & p2,
-				   int endpoint, const PointGeomInfo & gi);
-
-  virtual void GetChartBoundary (ARRAY<Point2d > & points, 
-				 ARRAY<Point3d > & poitns3d,
-				 ARRAY<INDEX_2> & lines, double h) const;
-
-  ///
-  virtual double CalcLocalH (const Point3d & p, double gh) const;
-
-  ///
-  virtual double Area () const;
-};
-
-
-
-///
-class MeshOptimizeSTLSurface : public MeshOptimize2d
-  {
-  ///
-    STLGeometry & geom;
-
-public:
-    ///
-    MeshOptimizeSTLSurface (STLGeometry & ageom); 
-   
-    ///
-    virtual void SelectSurfaceOfPoint (const Point3d & p,
-				       const PointGeomInfo & gi);
-    ///
-    virtual void ProjectPoint (INDEX surfind, Point3d & p) const;
-    ///
-    virtual void ProjectPoint2 (INDEX surfind, INDEX surfind2, Point3d & p) const;
-    ///
-    virtual int CalcPointGeomInfo(PointGeomInfo& gi, const Point3d& p3) const;
-    ///
-    virtual void GetNormalVector(INDEX surfind, const Point3d & p, Vec3d & n) const;
-};
-
-
-
-
-class RefinementSTLGeometry : public Refinement
-{
-  const STLGeometry & geom;
-
-public:
-  RefinementSTLGeometry (const STLGeometry & ageom);
-  virtual ~RefinementSTLGeometry ();
-  
-  virtual void PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-			     int surfi, 
-			     const PointGeomInfo & gi1, 
-			     const PointGeomInfo & gi2,
-			     Point3d & newp, PointGeomInfo & newgi);
-
-  virtual void PointBetween (const Point3d & p1, const Point3d & p2, double secpoint,
-			     int surfi1, int surfi2, 
-			     const EdgePointGeomInfo & ap1, 
-			     const EdgePointGeomInfo & ap2,
-			     Point3d & newp, EdgePointGeomInfo & newgi);
-
-  virtual void ProjectToSurface (Point<3> & p, int surfi);
-  virtual void ProjectToSurface (Point<3> & p, int surfi, PointGeomInfo & gi);
-};
-
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/stlgeom/stlgeom.cpp b/contrib/Netgen/libsrc/stlgeom/stlgeom.cpp
deleted file mode 100644
index 2d3a358cfa19c09504c7976ea6165c7b2674237e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stlgeom.cpp
+++ /dev/null
@@ -1,3476 +0,0 @@
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-#include <meshing.hpp>
-
-#include "stlgeom.hpp"
-
-
-namespace netgen
-{
-
-//globalen searchtree fuer gesamte geometry aktivieren
-int geomsearchtreeon = 0;
-
-int usechartnormal = 1;  
-
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-void STLMeshing (STLGeometry & geom,
-		 Mesh & mesh)
-{
-  geom.Clear();
-  geom.BuildEdges();
-  geom.MakeAtlas(mesh);
-  geom.CalcFaceNums();
-  geom.AddFaceEdges();
-  geom.LinkEdges();
-
-  mesh.ClearFaceDescriptors();
-  for (int i = 1; i <= geom.GetNOFaces(); i++)
-    mesh.AddFaceDescriptor (FaceDescriptor (i, 1, 0, 0));
-}
-
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//+++++++++++++++++++   STL GEOMETRY   ++++++++++++++++++++++++++++
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-STLGeometry :: STLGeometry()
-  : edges(), edgesperpoint(),
-    normals(),  externaledges(),
-    atlas(), chartmark(), 
-    lines(), outerchartspertrig(), vicinity(), markedtrigs(), markedsegs(),
-    lineendpoints(), spiralpoints(), edgedata(*this), selectedmultiedge()
-{
-  externaledges.SetSize(0);
-  Clear();
-  meshchart = 0; // initialize all ?? JS
-
-  if (geomsearchtreeon)
-    searchtree = new Box3dTree (GetBoundingBox().PMin() - Vec3d(1,1,1),
-				GetBoundingBox().PMax() + Vec3d(1,1,1));
-  else
-    searchtree = NULL;
-
-  status = STL_GOOD;
-  statustext = "Good Geometry";
-  smoothedges = NULL;
-}
-
-STLGeometry :: ~STLGeometry()
-{
-  ;
-}
-
-void STLGeometry :: STLInfo(double* data)
-{
-  data[0] = GetNT();
-
-  Box<3> b = GetBoundingBox();
-  data[1] = b.PMin()(0);
-  data[2] = b.PMax()(0);
-  data[3] = b.PMin()(1);
-  data[4] = b.PMax()(1);
-  data[5] = b.PMin()(2);
-  data[6] = b.PMax()(2);
-
-  int i;
- 
-  int cons = 1;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      if (NONeighbourTrigs(i) != 3) {cons = 0;}
-    }
-  data[7] = cons;
-}
-
-void STLGeometry :: MarkNonSmoothNormals()
-{
-
-  PrintFnStart("Mark Non-Smooth Normals");
-
-  int i,j;
-
-  markedtrigs.SetSize(GetNT());
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      SetMarkedTrig(i, 0);
-    }
-
-  double dirtyangle = stlparam.yangle/180.*M_PI;
-
-  int cnt = 0;
-  int p1,p2;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      for (j = 1; j <= NONeighbourTrigs(i); j++)
-	{
-	  if (GetAngle(i, NeighbourTrig(i,j)) > dirtyangle)
-	    {
-	      GetTriangle(i).GetNeighbourPoints(GetTriangle(NeighbourTrig(i,j)), p1, p2);
-	      if (!IsEdge(p1,p2))
-		{
-		  if (!IsMarkedTrig(i)) {SetMarkedTrig(i,1); cnt++;}
-		}
-	    }
-	}
-    }
-
-  PrintMessage(5,"marked ",cnt," non-smooth trig-normals");
-
-}
-
-void STLGeometry :: SmoothNormals()
-{
-  multithread.terminate = 0;
-
-  //  UseExternalEdges();
-
-  BuildEdges();
-
-
-  DenseMatrix m(3), hm(3);
-  Vector rhs(3), sol(3), hv(3), hv2(3);
-
-  Vec<3> ri;
-
-  double wnb = stldoctor.smoothnormalsweight;   // neigbour normal weight
-  double wgeom = 1-wnb;   // geometry normal weight
-
-
-  // minimize 
-  //  wgeom sum_T  \sum ri  \| ri^T (n - n_geom) \|^2  
-  //  + wnb sum_SE  \| ri x (n - n_nb) \|^2
-  
-  int i, j, k, l;
-  int nt = GetNT();
-  
-  PushStatusF("Smooth Normals");
-    
-  int testmode;
-
-  for (i = 1; i <= nt; i++)
-    {
-
-      SetThreadPercent( 100.0 * (double)i / (double)nt);
-
-      const STLTriangle & trig = GetTriangle (i);
-      
-      m = 0;
-      rhs = 0;
-
-      // normal of geometry:
-      Vec<3> ngeom = trig.GeomNormal(points);
-      ngeom.Normalize();
-
-      for (j = 1; j <= 3; j++)
-	{ 
-	  int pi1 = trig.PNumMod (j);
-	  int pi2 = trig.PNumMod (j+1);
-
-	  // edge vector
-	  ri = GetPoint (pi2) - GetPoint (pi1);
-	  
-	  for (k = 0; k < 3; k++)
-	    for (l = 0; l < 3; l++)
-	      hm.Elem(k+1, l+1) = wgeom * ri(k) * ri(l);
-	  
-	  
-	  for (k = 0; k < 3; k++)
-	    hv.Elem(k+1) = ngeom(k);
-	  
-	  hm.Mult (hv, hv2);
-	  /*
-	  if (testmode)
-	    (*testout) << "add vec " << hv2 << endl 
-		       << " add m " << hm << endl;
-	  */
-	  rhs.Add (1, hv2);
-	  m += hm;
-
-
-	  int nbt = 0;
-	  int fp1,fp2;
-	  for (k = 1; k <= NONeighbourTrigs(i); k++)
-	    {
-	      trig.GetNeighbourPoints(GetTriangle(NeighbourTrig(i, k)),fp1,fp2);
-	      if (fp1 == pi1 && fp2 == pi2)
-		{
-		  nbt = NeighbourTrig(i, k);
-		}
-	    }
-
-	  if (!nbt)
-	    {
-	      cerr << "ERROR: stlgeom::Smoothnormals, nbt = 0" << endl;
-	    }
-
-	  // smoothed normal
-	  Vec<3> nnb = GetTriangle(nbt).Normal();   // neighbour normal
-	  nnb.Normalize();
-
-	  if (!IsEdge(pi1,pi2)) 
-	    {
-	      double lr2 = ri * ri;
-	      for (k = 0; k < 3; k++)
-		{
-		  for (l = 0; l < k; l++)
-		    {
-		      hm.Elem(k+1, l+1) = -wnb * ri(k) * ri(l);
-		      hm.Elem(l+1, k+1) = -wnb * ri(k) * ri(l);
-		    }
-		  
-		  hm.Elem(k+1, k+1) = wnb * (lr2 - ri(k) * ri(k));
-		}
-	      
-	      for (k = 0; k < 3; k++)
-		hv.Elem(k+1) = nnb(k);
-	      
-	      hm.Mult (hv, hv2);
-	      /*
-	      if (testmode)
-		(*testout) << "add nb vec " << hv2 << endl 
-			   << " add nb m " << hm << endl;
-	      */
-
-	      rhs.Add (1, hv2);
-	      m += hm;
-	    }
-	}
-
-      m.Solve (rhs, sol);
-      Vec3d newn(sol.Get(1), sol.Get(2), sol.Get(3));
-      newn /= (newn.Length() + 1e-24);      
-
-      GetTriangle(i).SetNormal(newn);
-      // setnormal (sol);
-    }
-
-  /*
-  for (i = 1; i <= nt; i++)
-    SetMarkedTrig(i, 0);      		
-
-
-
-  int crloop;
-  for (crloop = 1; crloop <= 3; crloop++)
-    {
-
-  // find critical:
-
-  ARRAY<INDEX_2> critpairs;
-  for (i = 1; i <= nt; i++)
-    {
-      const STLTriangle & trig = GetTriangle (i);
-      
-      Vec3d ngeom = GetTriangleNormal (i); // trig.Normal(points);
-      ngeom /= (ngeom.Length() + 1e-24);
-
-      for (j = 1; j <= 3; j++)
-	{ 
-	  int pi1 = trig.PNumMod (j);
-	  int pi2 = trig.PNumMod (j+1);
-
-	  int nbt = 0;
-	  int fp1,fp2;
-	  for (k = 1; k <= NONeighbourTrigs(i); k++)
-	    {
-	      trig.GetNeighbourPoints(GetTriangle(NeighbourTrig(i, k)),fp1,fp2);
-	      if (fp1 == pi1 && fp2 == pi2)
-		{
-		  nbt = NeighbourTrig(i, k);
-		}
-	    }
-	  
-	  if (!nbt)
-	    {
-	      cerr << "ERROR: stlgeom::Smoothnormals, nbt = 0" << endl;
-	    }
-
-	  Vec3d nnb = GetTriangleNormal(nbt);   // neighbour normal
-	  nnb /= (nnb.Length() + 1e-24);
-
-	  if (!IsEdge(pi1,pi2)) 
-	    {
-	      if (Angle (nnb, ngeom) > 150 * M_PI/180)
-		{
-		  SetMarkedTrig(i, 1);      		
-		  SetMarkedTrig(nbt, 1);      		
-		  critpairs.Append (INDEX_2 (i, nbt));
-		}
-	    }
-
-	}
-    }
-
-  if (!critpairs.Size())
-    {
-      break;
-    }
-
-  if (critpairs.Size())
-    {
-
-      ARRAY<int> friends;
-      double area1 = 0, area2 = 0;
-
-      for (i = 1; i <= critpairs.Size(); i++)
-	{
-	  int tnr1 = critpairs.Get(i).I1();
-	  int tnr2 = critpairs.Get(i).I2();
-	  (*testout) << "t1 = " << tnr1 << ", t2 = " << tnr2
-		     << " angle = " << Angle (GetTriangleNormal (tnr1),
-					      GetTriangleNormal (tnr2))
-		     << endl;
-
-	  // who has more friends ?
-	  int side;
-	  area1 = 0;
-	  area2 = 0;
-	  for (side = 1; side <= 2; side++)
-	    {
-	      friends.SetSize (0);
-	      friends.Append ( (side == 1) ? tnr1 : tnr2);
-
-	      for (j = 1; j <= 3; j++)
-		{
-		  int fsize = friends.Size();
-		  for (k = 1; k <= fsize; k++)
-		    {
-		      int testtnr = friends.Get(k);
-		      Vec3d ntt = GetTriangleNormal(testtnr);
-		      ntt /= (ntt.Length() + 1e-24);
-		      
-		      for (l = 1; l <= NONeighbourTrigs(testtnr); l++)
-			{
-			  int testnbnr = NeighbourTrig(testtnr, l);
-			  Vec3d nbt = GetTriangleNormal(testnbnr);
-			  nbt /= (nbt.Length() + 1e-24);
-
-			  if (Angle (nbt, ntt) < 15 * M_PI/180)
-			    {
-			      int ii;
-			      int found = 0;
-			      for (ii = 1; ii <= friends.Size(); ii++)
-				{
-				  if (friends.Get(ii) == testnbnr)
-				    {
-				      found = 1;
-				      break;
-				    }
-				}
-			      if (!found)
-				friends.Append (testnbnr);
-			    }
-			}
-		    }
-		}
-
-	      // compute area:
-	      for (k = 1; k <= friends.Size(); k++)
-		{
-		  double area = 
-		    GetTriangle (friends.Get(k)).Area(points);
-
-		  if (side == 1)
-		    area1 += area;
-		  else
-		    area2 += area;
-		}
-	      
-	    }
-
-	  (*testout) << "area1 = " << area1 << " area2 = " << area2 << endl;
-	  if (area1 < 0.1 * area2)
-	    {
-	      Vec3d n = GetTriangleNormal (tnr1);
-	      n *= -1;
-	      SetTriangleNormal(tnr1, n);
-	    }
-	  if (area2 < 0.1 * area1)
-	    {
-	      Vec3d n = GetTriangleNormal (tnr2);
-	      n *= -1;
-	      SetTriangleNormal(tnr2, n);
-	    }
-	}
-    }
-    }
-  */
-
-  calcedgedataanglesnew = 1;
-  PopStatus();
-}
-
-
-int STLGeometry :: AddEdge(int p1, int p2)
-{
-  STLEdge e(p1,p2);
-  e.SetLeftTrig(GetLeftTrig(p1,p2));
-  e.SetRightTrig(GetRightTrig(p1,p2));
-  return edges.Append(e);
-}
-
-void STLGeometry :: STLDoctorConfirmEdge()
-{
-  StoreEdgeData();
-  if (GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT() && GetNodeOfSelTrig())
-    {
-      if (stldoctor.selectmode == 1)
-	{
-	  int p1 = GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig());
-	  int p2 = GetTriangle(GetSelectTrig()).PNumMod(GetNodeOfSelTrig()+1);
-	  edgedata.Elem(edgedata.GetEdgeNum(p1,p2)).SetStatus (ED_CONFIRMED);
-	}
-      else if (stldoctor.selectmode == 3 || stldoctor.selectmode == 4)
-	{
-	  int i;
-	  for (i = 1; i <= selectedmultiedge.Size(); i++)
-	    {
-	      int p1 = selectedmultiedge.Get(i).i1;
-	      int p2 = selectedmultiedge.Get(i).i2;
-	      edgedata.Elem(edgedata.GetEdgeNum(p1,p2)).SetStatus (ED_CONFIRMED);
-	    }
-	}
-    }
-}
-
-void STLGeometry :: STLDoctorCandidateEdge()
-{
-  StoreEdgeData();
-  if (GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT() && GetNodeOfSelTrig())
-    {
-      if (stldoctor.selectmode == 1)
-	{
-	  int p1 = GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig());
-	  int p2 = GetTriangle(GetSelectTrig()).PNumMod(GetNodeOfSelTrig()+1);
-	  edgedata.Elem(edgedata.GetEdgeNum(p1,p2)).SetStatus (ED_CANDIDATE);
-	}
-      else if (stldoctor.selectmode == 3 || stldoctor.selectmode == 4)
-	{
-	  int i;
-	  for (i = 1; i <= selectedmultiedge.Size(); i++)
-	    {
-	      int p1 = selectedmultiedge.Get(i).i1;
-	      int p2 = selectedmultiedge.Get(i).i2;
-	      edgedata.Elem(edgedata.GetEdgeNum(p1,p2)).SetStatus (ED_CANDIDATE);
-	    }
-	}
-    }
-}
-
-void STLGeometry :: STLDoctorExcludeEdge()
-{
-  StoreEdgeData();
-  if (GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT() && GetNodeOfSelTrig())
-    {
-      if (stldoctor.selectmode == 1)
-	{
-	  int p1 = GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig());
-	  int p2 = GetTriangle(GetSelectTrig()).PNumMod(GetNodeOfSelTrig()+1);
-	  edgedata.Elem(edgedata.GetEdgeNum(p1,p2)).SetStatus(ED_EXCLUDED);
-	}
-      else if (stldoctor.selectmode == 3 || stldoctor.selectmode == 4)
-	{
-	  int i;
-	  for (i = 1; i <= selectedmultiedge.Size(); i++)
-	    {
-	      int p1 = selectedmultiedge.Get(i).i1;
-	      int p2 = selectedmultiedge.Get(i).i2;
-	      edgedata.Elem(edgedata.GetEdgeNum(p1,p2)).SetStatus(ED_EXCLUDED);
-	    }
-	}
-    }
-}
-
-void STLGeometry :: STLDoctorUndefinedEdge()
-{
-  StoreEdgeData();
-  if (GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT() && GetNodeOfSelTrig())
-    {
-      if (stldoctor.selectmode == 1)
-	{
-	  int p1 = GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig());
-	  int p2 = GetTriangle(GetSelectTrig()).PNumMod(GetNodeOfSelTrig()+1);
-	  edgedata.Elem(edgedata.GetEdgeNum(p1,p2)).SetStatus(ED_UNDEFINED);
-	}
-      else if (stldoctor.selectmode == 3 || stldoctor.selectmode == 4)
-	{
-	  int i;
-	  for (i = 1; i <= selectedmultiedge.Size(); i++)
-	    {
-	      int p1 = selectedmultiedge.Get(i).i1;
-	      int p2 = selectedmultiedge.Get(i).i2;
-	      edgedata.Elem(edgedata.GetEdgeNum(p1,p2)).SetStatus(ED_UNDEFINED);
-	    }
-	}
-    }
-}
-
-void STLGeometry :: STLDoctorSetAllUndefinedEdges()
-{
-  edgedata.ResetAll();
-}
-
-void STLGeometry :: STLDoctorEraseCandidateEdges()
-{
-  StoreEdgeData();
-  edgedata.ChangeStatus(ED_CANDIDATE, ED_UNDEFINED);
-}
-
-void STLGeometry :: STLDoctorConfirmCandidateEdges()
-{
-  StoreEdgeData();
-  edgedata.ChangeStatus(ED_CANDIDATE, ED_CONFIRMED);
-}
-
-void STLGeometry :: STLDoctorConfirmedToCandidateEdges()
-{
-  StoreEdgeData();
-  edgedata.ChangeStatus(ED_CONFIRMED, ED_CANDIDATE);
-}
-
-void STLGeometry :: STLDoctorDirtyEdgesToCandidates()
-{
-  StoreEdgeData();
-}
-
-void STLGeometry :: STLDoctorLongLinesToCandidates()
-{
-  StoreEdgeData();
-}
-
-twoint STLGeometry :: GetNearestSelectedDefinedEdge()
-{
-  Point<3> pestimate = Center(GetTriangle(GetSelectTrig()).center,
-  			     GetPoint(GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig())));
-    //Point3d pestimate = GetTriangle(GetSelectTrig()).center;
-
-  int i, j, en;
-  ARRAY<int> vic;
-  GetVicinity(GetSelectTrig(),4,vic);
-  
-
-  twoint fedg;
-  fedg.i1 = 0;
-  fedg.i2 = 0;
-  double mindist = 1E50;
-  double dist;
-  Point<3> p;
-
-  for (i = 1; i <= vic.Size(); i++)
-  {
-    const STLTriangle& t = GetTriangle(vic.Get(i));
-    for (j = 1; j <= 3; j++)
-      {
-	en = edgedata.GetEdgeNum(t.PNum(j),t.PNumMod(j+1));
-	if (edgedata.Get(en).GetStatus() != ED_UNDEFINED)
-	  {
-	    p = pestimate;
-	    dist = GetDistFromLine(GetPoint(t.PNum(j)),GetPoint(t.PNumMod(j+1)),p);
-	    if (dist < mindist)
-	      {
-		mindist = dist;
-		fedg.i1 = t.PNum(j);
-		fedg.i2 = t.PNumMod(j+1);
-	      }
-	  }
-      }
-  }
-  return fedg;
-}
- 
-void STLGeometry :: BuildSelectedMultiEdge(twoint ep)
-{
-  if (edgedata.Size() == 0 || 
-      !GetEPPSize()) 
-    {
-      return; 
-    }
-
-  selectedmultiedge.SetSize(0);
-  int tenum = GetTopEdgeNum (ep.i1, ep.i2);
-
-  if (edgedata.Get(tenum).GetStatus() == ED_UNDEFINED)
-    {
-      twoint epnew = GetNearestSelectedDefinedEdge();
-      if (epnew.i1) 
-	{
-	  ep = epnew;
-	  tenum = GetTopEdgeNum (ep.i1, ep.i2);
-	}
-    }
-
-  selectedmultiedge.Append(twoint(ep));
-
-  if (edgedata.Get(tenum).GetStatus() == ED_UNDEFINED)
-    {
-      return;
-    }
-
-  edgedata.BuildLineWithEdge(ep.i1,ep.i2,selectedmultiedge);
-}
-
-void STLGeometry :: BuildSelectedEdge(twoint ep)
-{
-  if (edgedata.Size() == 0 || 
-      !GetEPPSize()) 
-    {
-      return; 
-    }
-
-  selectedmultiedge.SetSize(0);
-
-  selectedmultiedge.Append(twoint(ep));
-}
-
-void STLGeometry :: BuildSelectedCluster(twoint ep)
-{
-  if (edgedata.Size() == 0 || 
-      !GetEPPSize()) 
-    {
-      return; 
-    }
-
-  selectedmultiedge.SetSize(0);
-
-  int tenum = GetTopEdgeNum (ep.i1, ep.i2);
-
-  if (edgedata.Get(tenum).GetStatus() == ED_UNDEFINED)
-    {
-      twoint epnew = GetNearestSelectedDefinedEdge();
-      if (epnew.i1) 
-	{
-	  ep = epnew;
-	  tenum = GetTopEdgeNum (ep.i1, ep.i2);
-	}
-    }
-
-  selectedmultiedge.Append(twoint(ep));
-
-  if (edgedata.Get(tenum).GetStatus() == ED_UNDEFINED)
-    {
-      return;
-    }
-
-  edgedata.BuildClusterWithEdge(ep.i1,ep.i2,selectedmultiedge);
-}
-
-void STLGeometry :: ImportEdges()
-{
-  StoreEdgeData();
-
-  PrintMessage(5, "import edges from file 'edges.ng'");
-  ifstream fin("edges.ng");
-
-  int ne;
-  fin >> ne;
-
-  ARRAY<Point<3> > eps;
-
-  int i;
-  Point<3> p;
-  for (i = 1; i <= 2*ne; i++)
-    {
-      fin >> p(0); 
-      fin >> p(1); 
-      fin >> p(2);
-      eps.Append(p);
-    }
-  AddEdges(eps);
-}
-
-void STLGeometry :: AddEdges(const ARRAY<Point<3> >& eps)
-{
-  int i;
-  int ne = eps.Size()/2;
-  
-  ARRAY<int> epsi;
-  Box<3> bb = GetBoundingBox();
-  bb.Increase(1);
-
-  Point3dTree pointtree (bb.PMin(), 
-			 bb.PMax());
-  ARRAY<int> pintersect;
-
-  double gtol = GetBoundingBox().Diam()/1.E10;
-  Point<3> p;
-
-  for (i = 1; i <= GetNP(); i++)
-    {
-      p = GetPoint(i);
-      pointtree.Insert (p, i);
-    }
-  
-  int error = 0;
-  for (i = 1; i <= 2*ne; i++)
-    {
-      p = eps.Get(i);
-      Point3d pmin = p - Vec3d (gtol, gtol, gtol);
-      Point3d pmax = p + Vec3d (gtol, gtol, gtol);
-	  
-      pointtree.GetIntersecting (pmin, pmax, pintersect);
-      if (pintersect.Size() > 1)
-	{
-	  PrintError("Found too much points in epsilon-dist");
-	  error = 1;
-	}
-      else if (pintersect.Size() == 0)
-	{
-	  error = 1;
-	  PrintError("edgepoint does not exist!");
-	  PrintMessage(5,"p=",Point3d(eps.Get(i)));
-	}
-      else
-	{
-	  epsi.Append(pintersect.Get(1));
-	}
-    }
-
-  if (error) return;
-
-  int en;
-  for (i = 1; i <= ne; i++)
-    {
-      if (epsi.Get(2*i-1) == epsi.Get(2*i)) {PrintError("Edge with zero length!");}
-      else 
-	{
-	  en = edgedata.GetEdgeNum(epsi.Get(2*i-1),epsi.Get(2*i));
-	  edgedata.Elem(en).SetStatus (ED_CONFIRMED);
-	}
-    }
-
-}
-
-
-
-void STLGeometry :: ImportExternalEdges(const char * filename)
-{
-  //AVL edges!!!!!!
-
-  ifstream inf (filename);
-  char ch;
-  int cnt = 0;
-  int records, units, i, j;
-  PrintFnStart("Import edges from ",filename);
-  
-  const int flen=30;
-  char filter[flen+1];
-  filter[flen] = 0;
-  char buf[20];
-
-  ARRAY<Point3d> importpoints;
-  ARRAY<int> importlines;
-  ARRAY<int> importpnums;
-
-  while (inf.good())
-    {
-      inf.get(ch);
-      //      (*testout) << cnt << ": " << ch << endl;
-      
-      for (i = 0; i < flen; i++)
-	filter[i] = filter[i+1];
-      filter[flen-1] = ch;
-      //      (*testout) << filter << endl;
-
-      if (strcmp (filter+flen-7, "RECORDS") == 0)
-	{
-	  inf.get(ch);  // '='
-	  inf >> records;
-	}
-      if (strcmp (filter+flen-5, "UNITS") == 0)
-	{
-	  inf.get(ch);  // '='
-	  inf >> units;
-	}
-
-      if (strcmp (filter+flen-17, "EDGE NODE NUMBERS") == 0)
-	{
-	  int nodenr;
-	  importlines.SetSize (units);
-	  for (i = 1; i <= units; i++)
-	    {
-	      inf >> nodenr;
-	      importlines.Elem(i) = nodenr;
-	      //	      (*testout) << nodenr << endl;
-	    }
-	}
-
-      if (strcmp (filter+flen-23, "EDGE POINT COORD IN DIR") == 0)
-	{
-	  int coord;
-
-	  inf >> coord;
-	  
-	  importpoints.SetSize (units);
-
-	  inf >> ch;
-	  inf.putback (ch);
-
-	  int nodenr;
-	  for (i = 1; i <= units; i++)
-	    {
-	      for (j = 0; j < 12; j++)
-		inf.get (buf[j]);
-	      buf[12] = 0;
-
-	      importpoints.Elem(i).X(coord) = 1000 * atof (buf);
-	    }
-	}
-    }
-
-  /*
-  (*testout) << "lines: " << endl;
-  for (i = 1; i <= importlines.Size(); i++)
-    (*testout) << importlines.Get(i) << endl;
-  (*testout) << "points: " << endl;
-  for (i = 1; i <= importpoints.Size(); i++)
-    (*testout) << importpoints.Get(i) << endl;
-  */
-
-
-
-  importpnums.SetSize (importpoints.Size());
-  
-
-  Box3d bb (GetBoundingBox().PMin() + Vec3d (-1,-1,-1),
-	    GetBoundingBox().PMax() + Vec3d (1, 1, 1));
-
-  Point3dTree pointtree (bb.PMin(), 
-			 bb.PMax());
-
-
-  PrintMessage(7,"stl - bb: ",bb.PMin(), " - ", bb.PMax());
-  
-  Box3d ebb;
-  ebb.SetPoint (importpoints.Get(1));
-  for (i = 1; i <= importpoints.Size(); i++)
-    ebb.AddPoint (importpoints.Get(i));
-  PrintMessage(7,"edgep - bb: ", ebb.PMin(), " - ", ebb.PMax());
-
-  ARRAY<int> pintersect;
-
-  double gtol = GetBoundingBox().Diam()/1.E6;
-
-  for (i = 1; i <= GetNP(); i++)
-    {
-      Point3d p = GetPoint(i);
-      //      (*testout) << "stlpt: " << p << endl;
-      pointtree.Insert (p, i);
-    }
-  
-
-  for (i = 1; i <= importpoints.Size(); i++)
-    {
-      Point3d p = importpoints.Get(i);
-      Point3d pmin = p - Vec3d (gtol, gtol, gtol);
-      Point3d pmax = p + Vec3d (gtol, gtol, gtol);
-	  
-      pointtree.GetIntersecting (pmin, pmax, pintersect);
-      if (pintersect.Size() > 1)
-	{
-	  importpnums.Elem(i) = 0;
-	  PrintError("Found too many points in epsilon-dist");
-	}
-      else if (pintersect.Size() == 0)
-	{
-	  importpnums.Elem(i) = 0;
-	  PrintError("Edgepoint does not exist!");
-	}
-      else
-	{
-	  importpnums.Elem(i) = pintersect.Get(1);
-	}
-    }
-
-  //  if (!error) 
-    {
-      PrintMessage(7,"found all edge points in stl file");
-
-
-      StoreEdgeData();
-
-      int oldp = 0;
-
-      for (i = 1; i <= importlines.Size(); i++)
-	{
-	  int newp = importlines.Get(i);
-	  if (!importpnums.Get(abs(newp)))
-	    newp = 0;
-
-	  if (oldp && newp)
-	    {
-	      int en = edgedata.GetEdgeNum(importpnums.Get(oldp), 
-					   importpnums.Get(abs(newp)));
-	      edgedata.Elem(en).SetStatus (ED_CONFIRMED);
-	    }
-	  
-	  if (newp < 0)
-	    oldp = 0;
-	  else
-	    oldp = newp;
-	}
-    }
-
-
-}
-
-
-
-void STLGeometry :: ExportEdges()
-{
-  PrintFnStart("Save edges to file 'edges.ng'");
-
-  ofstream fout("edges.ng");
-  fout.precision(16);
-
-  int n = edgedata.GetNConfEdges();
-  
-  fout << n << endl;
-
-  int i;
-  for (i = 1; i <= edgedata.Size(); i++)
-    {
-      if (edgedata.Get(i).GetStatus() == ED_CONFIRMED)
-	{
-	  const STLTopEdge & e = edgedata.Get(i);
-	  fout << GetPoint(e.PNum(1))(0) << " " << GetPoint(e.PNum(1))(1) << " " << GetPoint(e.PNum(1))(2) << endl;
-	  fout << GetPoint(e.PNum(2))(0) << " " << GetPoint(e.PNum(2))(1) << " " << GetPoint(e.PNum(2))(2) << endl;
-	}
-    }
-
-}
-
-void STLGeometry :: LoadEdgeData(const char* file)
-{
-  StoreEdgeData();
-
-  PrintFnStart("Load edges from file '", file, "'");
-  ifstream fin(file);
-
-  edgedata.Read(fin);
-
-  //  calcedgedataanglesnew = 1;
-}
-
-void STLGeometry :: SaveEdgeData(const char* file)
-{
-  PrintFnStart("save edges to file '", file, "'");
-  ofstream fout(file);
-
-  edgedata.Write(fout);
-}
-
-
-
-
-
-
-
-/*
-void STLGeometry :: SaveExternalEdges()
-{
-  ofstream fout("externaledgesp3.ng");
-  fout.precision(16);
-
-  int n = NOExternalEdges();
-  fout << n << endl;
-
-  int i;
-  for (i = 1; i <= n; i++)
-    {
-      twoint e = GetExternalEdge(i);
-      fout << GetPoint(e.i1)(0) << " " << GetPoint(e.i1)(1) << " " << GetPoint(e.i1)(2) << endl;
-      fout << GetPoint(e.i2)(0) << " " << GetPoint(e.i2)(1) << " " << GetPoint(e.i2)(2) << endl;
-    }
-
-}
-*/
-void STLGeometry :: StoreExternalEdges()
-{
-  storedexternaledges.SetSize(0);
-  undoexternaledges = 1;
-  int i;
-  for (i = 1; i <= externaledges.Size(); i++)
-    {
-      storedexternaledges.Append(externaledges.Get(i));      
-    }
-
-}
-
-void STLGeometry :: UndoExternalEdges()
-{
-  if (!undoexternaledges) 
-    {
-      PrintMessage(1, "undo not further possible!");
-      return;
-    }
-  RestoreExternalEdges();
-  undoexternaledges = 0;
-}
-
-void STLGeometry :: RestoreExternalEdges()
-{
-  externaledges.SetSize(0);
-  int i;
-  for (i = 1; i <= storedexternaledges.Size(); i++)
-    {
-      externaledges.Append(storedexternaledges.Get(i));      
-    }
-
-}
-
-
-void STLGeometry :: AddExternalEdgeAtSelected()
-{
-  StoreExternalEdges();
-  if (GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT())
-    {
-      int p1 = GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig());
-      int p2 = GetTriangle(GetSelectTrig()).PNumMod(GetNodeOfSelTrig()+1);
-      if (!IsExternalEdge(p1,p2)) {AddExternalEdge(p1,p2);}
-    }
-}
-
-void STLGeometry :: AddClosedLinesToExternalEdges()
-{
-  StoreExternalEdges();
-
-  int i, j;
-  for (i = 1; i <= GetNLines(); i++)
-    {
-      STLLine* l = GetLine(i);
-      if (l->StartP() == l->EndP()) 
-	{
-	  for (j = 1; j < l->NP(); j++)
-	    {
-	      int p1 = l->PNum(j);
-	      int p2 = l->PNum(j+1);
-
-	      if (!IsExternalEdge(p1,p2)) {AddExternalEdge(p1,p2);}	      
-	    }
-	}
-    }
-}
-
-void STLGeometry :: AddLongLinesToExternalEdges()
-{
-  StoreExternalEdges();
-
-  double diamfact = stldoctor.dirtytrigfact;
-  double diam = GetBoundingBox().Diam();
-
-  int i, j;
-  for (i = 1; i <= GetNLines(); i++)
-    {
-      STLLine* l = GetLine(i);
-      if (l->GetLength(points) >= diamfact*diam) 
-	{
-	  for (j = 1; j < l->NP(); j++)
-	    {
-	      int p1 = l->PNum(j);
-	      int p2 = l->PNum(j+1);
-
-	      if (!IsExternalEdge(p1,p2)) {AddExternalEdge(p1,p2);}	      
-	    }
-	}
-    }
-}
-
-void STLGeometry :: AddAllNotSingleLinesToExternalEdges()
-{
-  StoreExternalEdges();
-
-  int i, j;
-  for (i = 1; i <= GetNLines(); i++)
-    {
-      STLLine* l = GetLine(i);
-      if (GetNEPP(l->StartP()) > 1 || GetNEPP(l->EndP()) > 1) 
-	{
-	  for (j = 1; j < l->NP(); j++)
-	    {
-	      int p1 = l->PNum(j);
-	      int p2 = l->PNum(j+1);
-
-	      if (!IsExternalEdge(p1,p2)) {AddExternalEdge(p1,p2);}	      
-	    }
-	}
-    }
-}
-
-void STLGeometry :: DeleteDirtyExternalEdges()
-{
-  //delete single triangle edges and single edge-lines in clusters"
-  StoreExternalEdges();
-
-  int i, j;
-  for (i = 1; i <= GetNLines(); i++)
-    {
-      STLLine* l = GetLine(i);
-      if (l->NP() <= 3 || (l->StartP() == l->EndP() && l->NP() == 4))
-	{
-	  for (j = 1; j < l->NP(); j++)
-	    {
-	      int p1 = l->PNum(j);
-	      int p2 = l->PNum(j+1);
-
-	      if (IsExternalEdge(p1,p2)) {DeleteExternalEdge(p1,p2);}	      
-	    }
-	}
-    }
-}
-
-void STLGeometry :: AddExternalEdgesFromGeomLine()
-{
-  StoreExternalEdges();
-  if (GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT())
-    {
-      int p1 = GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig());
-      int p2 = GetTriangle(GetSelectTrig()).PNumMod(GetNodeOfSelTrig()+1);
-
-      if (IsEdge(p1,p2))
-	{
-	  int edgenum = IsEdgeNum(p1,p2);
-	  if (!IsExternalEdge(p1,p2)) {AddExternalEdge(p1,p2);}
-	  
-	  int noend = 1;
-	  int startp = p1;
-	  int laste = edgenum;
-	  int np1, np2;
-	  while (noend)
-	    {
-	      if (GetNEPP(startp) == 2)
-		{
-		  if (GetEdgePP(startp,1) != laste) {laste = GetEdgePP(startp,1);}
-		  else {laste = GetEdgePP(startp,2);}
-		  np1 = GetEdge(laste).PNum(1);
-		  np2 = GetEdge(laste).PNum(2);
-		  
-		  if (!IsExternalEdge(np1, np2)) {AddExternalEdge(np1, np2);}
-		  else {noend = 0;}
-		  if (np1 != startp) {startp = np1;}
-		  else {startp = np2;}
-		}
-	      else {noend = 0;}
-	    }
-
-	  startp = p2;
-	  laste = edgenum;
-	  noend = 1;
-	  while (noend)
-	    {
-	      if (GetNEPP(startp) == 2)
-		{
-		  if (GetEdgePP(startp,1) != laste) {laste = GetEdgePP(startp,1);}
-		  else {laste = GetEdgePP(startp,2);}
-		  np1 = GetEdge(laste).PNum(1);
-		  np2 = GetEdge(laste).PNum(2);
-		  
-		  if (!IsExternalEdge(np1, np2)) {AddExternalEdge(np1, np2);}
-		  else {noend = 0;}
-		  if (np1 != startp) {startp = np1;}
-		  else {startp = np2;}
-		}
-	      else {noend = 0;}
-	    }
-	  
-	}
-
-    }
-  
-}
-
-void STLGeometry :: ClearEdges()
-{
-  edgesfound = 0;
-  edges.SetSize(0);
-  //edgedata.SetSize(0);
-  // externaledges.SetSize(0);
-  edgesperpoint.SetSize(0);
-  undoexternaledges = 0;
-
-}
-
-void STLGeometry :: STLDoctorBuildEdges()
-{
-  //  if (!trigsconverted) {return;}
-  ClearEdges();
-
-  meshlines.SetSize(0);
-  FindEdgesFromAngles();
-}
-
-void STLGeometry :: DeleteExternalEdgeAtSelected()
-{
-  StoreExternalEdges();
-  if (GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT())
-    {
-      int p1 = GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig());
-      int p2 = GetTriangle(GetSelectTrig()).PNumMod(GetNodeOfSelTrig()+1);
-      if (IsExternalEdge(p1,p2)) {DeleteExternalEdge(p1,p2);}
-    }
-}
-
-void STLGeometry :: DeleteExternalEdgeInVicinity()
-{
-  StoreExternalEdges();
-  if (!stldoctor.showvicinity || vicinity.Size() != GetNT()) {return;}
-
-  int i, j, k, p1, p2;
-  
-  for (i = 1; i <= GetNT(); i++)
-    {
-      if (vicinity.Elem(i))
-	{
-	  for (j = 1; j <= 3; j++)
-	    {
-	      p1 = GetTriangle(i).PNum(j);
-	      p2 = GetTriangle(i).PNumMod(j+1);
-
-	      if (IsExternalEdge(p1,p2))
-		{
-		  DeleteExternalEdge(p1,p2);
-		}
-	    }
-	}
-    }
-}
-
-void STLGeometry :: BuildExternalEdgesFromEdges()
-{
-  StoreExternalEdges();
-
-  if (GetNE() == 0) {PrintWarning("Edges possibly not generated!");}
-
-  int i, p1, p2;
-  externaledges.SetSize(0);
-
-  for (i = 1; i <= GetNE(); i++)
-    {
-      STLEdge e = GetEdge(i);
-      AddExternalEdge(e.PNum(1), e.PNum(2));
-    }
-
-}
-
-
-void STLGeometry :: AddExternalEdge(int p1, int p2)
-{
-  externaledges.Append(twoint(p1,p2));
-}
-
-void STLGeometry :: DeleteExternalEdge(int p1, int p2)
-{
-
-  int i;
-  int found = 0;
-  for (i = 1; i <= NOExternalEdges(); i++)
-    {
-      if ((GetExternalEdge(i).i1 == p1 && GetExternalEdge(i).i2 == p2) ||
-	  (GetExternalEdge(i).i1 == p2 && GetExternalEdge(i).i2 == p1)) {found = 1;};
-      if (found && i < NOExternalEdges())
-	{
-	  externaledges.Elem(i) = externaledges.Get(i+1);
-	}
-    }
-  if (!found) {PrintWarning("edge not found");}
-  else
-    {
-      externaledges.SetSize(externaledges.Size()-1);
-    }
-
-}
-
-int STLGeometry :: IsExternalEdge(int p1, int p2)
-{
-  int i;
-  for (i = 1; i <= NOExternalEdges(); i++)
-    {
-      if ((GetExternalEdge(i).i1 == p1 && GetExternalEdge(i).i2 == p2) ||
-	  (GetExternalEdge(i).i1 == p2 && GetExternalEdge(i).i2 == p1)) {return 1;};
-    }
-  return 0;
-}
-
-void STLGeometry :: DestroyDirtyTrigs()
-{
-
-  PrintFnStart("Destroy dirty triangles");
-  PrintMessage(5,"original number of triangles=", GetNT());
-
-  //destroy every triangle with other than 3 neighbours;
-  int changed = 1;
-  int i, j, k;
-  while (changed)
-    {
-      changed = 0;
-      Clear();
-
-      for (i = 1; i <= GetNT(); i++)
-	{
-	  int dirty = NONeighbourTrigs(i) < 3;
-
-	  for (j = 1; j <= 3; j++)
-	    {
-	      int pnum = GetTriangle(i).PNum(j);
-	      /*
-	      if (pnum == 1546)
-		{
-		// for (k = 1; k <=  NOTrigsPerPoint(pnum); k++)
-		}
-	      */
-	      if (NOTrigsPerPoint(pnum) <= 2) 
-		dirty = 1;
-	    }
-	  
-	  int pi1 = GetTriangle(i).PNum(1);
-	  int pi2 = GetTriangle(i).PNum(2);
-	  int pi3 = GetTriangle(i).PNum(3);
-	  if (pi1 == pi2 || pi1 == pi3 || pi2 == pi3)
-	    {
-	      PrintMessage(5,"triangle with Volume 0: ", i, "  nodes: ", pi1, ", ", pi2, ", ", pi3);
-	      dirty = 1;
-	    }
-
-	  if (dirty)
-	    {
-	      for (k = i+1; k <= GetNT(); k++)
-		{
-		  trias.Elem(k-1) = trias.Get(k);
-		  // readtrias: not longer permanent, JS
-		  //		  readtrias.Elem(k-1) = readtrias.Get(k); 
-		}
-	      int size = GetNT();
-	      trias.SetSize(size-1);
-	      //	      readtrias.SetSize(size-1);
-	      changed = 1;
-	      break;
-	    }
-	}
-    }  
-
-  FindNeighbourTrigs();
-  PrintMessage(5,"final number of triangles=", GetNT());
-}
-
-void STLGeometry :: CalcNormalsFromGeometry()
-{
-  int i;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      const STLTriangle & tr = GetTriangle(i);
-      const Point3d& p1 = GetPoint(tr.PNum(1));
-      const Point3d& p2 = GetPoint(tr.PNum(2));
-      const Point3d& p3 = GetPoint(tr.PNum(3));
-
-      Vec3d normal = Cross (p2-p1, p3-p1);
-      
-      if (normal.Length() != 0)
-	{
-	  normal /= (normal.Length());		  
-	}
-      GetTriangle(i).SetNormal(normal);
-    }
-  PrintMessage(5,"Normals calculated from geometry!!!");
-
-  calcedgedataanglesnew = 1;
-}
-
-void STLGeometry :: SetSelectTrig(int trig)
-{
-  stldoctor.selecttrig = trig;
-}
-
-int STLGeometry :: GetSelectTrig() const
-{
-  return stldoctor.selecttrig;
-}
-
-void STLGeometry :: SetNodeOfSelTrig(int n)
-{
-  stldoctor.nodeofseltrig = n;
-}
-
-int STLGeometry :: GetNodeOfSelTrig() const
-{
-  return stldoctor.nodeofseltrig;
-}
-
-void STLGeometry :: MoveSelectedPointToMiddle()
-{
-  if (GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT())
-    {
-      int p = GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig());
-      Point<3> pm(0.,0.,0.); //Middlevector;
-      Point<3> p0(0.,0.,0.);
-      PrintMessage(5,"original point=", Point3d(GetPoint(p)));
-
-      int i;
-      int cnt = 0;
-      for (i = 1; i <= trigsperpoint.EntrySize(p); i++)
-	{
-	  const STLTriangle& tr = GetTriangle(trigsperpoint.Get(p,i));
-	  int j;
-	  for (j = 1; j <= 3; j++)
-	    {
-	      if (tr.PNum(j) != p)
-		{
-		  cnt++;
-		  pm(0) += GetPoint(tr.PNum(j))(0);
-		  pm(1) += GetPoint(tr.PNum(j))(1);
-		  pm(2) += GetPoint(tr.PNum(j))(2);
-		}
-	    }
-	}
-
-      Point<3> origp = GetPoint(p);
-      double fact = 0.2;
-
-      SetPoint(p, p0 + fact*(1./(double)cnt)*(pm-p0)+(1.-fact)*(origp-p0));
-
-      PrintMessage(5,"middle point=", Point3d (GetPoint(p)));
-      
-      PrintMessage(5,"moved point ", Point3d (p));
-
-    }
-}
-
-void STLGeometry :: PrintSelectInfo()
-{
-
-  int trig = GetSelectTrig();
-  int p = GetTriangle(trig).PNum(GetNodeOfSelTrig());
-  
-  PrintMessage(1,"touch triangle ", GetSelectTrig()
-       , ", local node ", GetNodeOfSelTrig()
-       , " (=", GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig()), ")");
-  if (AtlasMade() && GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT())
-    {
-      PrintMessage(1,"           chartnum=",GetChartNr(GetSelectTrig()));
-      /*      
-      PointBetween(Center(Center(GetPoint(GetTriangle(270).PNum(1)),
-				 GetPoint(GetTriangle(270).PNum(2))),
-			  GetPoint(GetTriangle(270).PNum(3))),270,
-		   Center(Center(GetPoint(GetTriangle(trig).PNum(1)),
-				 GetPoint(GetTriangle(trig).PNum(2))),
-			  GetPoint(GetTriangle(trig).PNum(3))),trig);
-      */
-      //PointBetween(Point3d(5.7818, 7.52768, 4.14879),260,Point3d(6.80292, 6.55392, 4.70184),233);
-    }
-}
-
-void STLGeometry :: ShowSelectedTrigChartnum()
-{
-  int st = GetSelectTrig();
-
-  if (st >= 1 && st <= GetNT() && AtlasMade())
-    PrintMessage(1,"selected trig ", st, " has chartnumber ", GetChartNr(st));
-}
-
-void STLGeometry :: ShowSelectedTrigCoords()
-{
-  int st = GetSelectTrig();
-
-  /*
-  //testing!!!!
-  ARRAY<int> trigs;
-  GetSortedTrianglesAroundPoint(GetTriangle(st).PNum(GetNodeOfSelTrig()),st,trigs);
-  */
-
-  if (st >= 1 && st <= GetNT())
-    {
-      PrintMessage(1, "coordinates of selected trig ", st, ":");
-      PrintMessage(1, "   p1 = ", GetTriangle(st).PNum(1), " = ", 
-		   Point3d (GetPoint(GetTriangle(st).PNum(1))));
-      PrintMessage(1, "   p2 = ", GetTriangle(st).PNum(2), " = ", 
-		   Point3d (GetPoint(GetTriangle(st).PNum(2))));
-      PrintMessage(1, "   p3 = ", GetTriangle(st).PNum(3), " = ", 
-		   Point3d (GetPoint(GetTriangle(st).PNum(3))));
-    }
-}
-
-void STLGeometry :: LoadMarkedTrigs()
-{
-  PrintFnStart("load marked trigs from file 'markedtrigs.ng'");
-  ifstream fin("markedtrigs.ng");
-
-  int n;
-  fin >> n;
-  if (n != GetNT() || n == 0) {PrintError("Not a suitable marked-trig-file!"); return;}
-
-  int i, m;
-  for (i = 1; i <= n; i++)
-    {
-      fin >> m;
-      SetMarkedTrig(i, m);      
-    }
-
-  fin >> n;
-  if (n != 0) 
-    {
-      int i, m;
-      Point<3> p1, p2;
-      for (i = 1; i <= n; i++)
-	{
-	  fin >> p1(0); fin >> p1(1); fin >> p1(2);
-	  fin >> p2(0); fin >> p2(1); fin >> p2(2);
-	  AddMarkedSeg(p1,p2);      
-	}
-    }
-}
-
-void STLGeometry :: SaveMarkedTrigs()
-{
-  PrintFnStart("save marked trigs to file 'markedtrigs.ng'");
-  ofstream fout("markedtrigs.ng");
-
-  int n = GetNT();
-  fout << n << endl;
-
-  int i, m;
-  for (i = 1; i <= n; i++)
-    {
-      fout << IsMarkedTrig(i) << "\n";
-    }
-
-  n = GetNMarkedSegs();
-  fout << n << endl;
-
-  Point<3> p1,p2;
-  for (i = 1; i <= n; i++)
-    {
-      GetMarkedSeg(i,p1,p2);
-      fout << p1(0) << " " << p1(1) << " " << p1(2) << "  ";
-      fout << p2(0) << " " << p2(1) << " " << p2(2) << " " << "\n";
-    }
-
-}
-
-void STLGeometry :: NeighbourAnglesOfSelectedTrig()
-{
-  int st = GetSelectTrig();
-
-  if (st >= 1 && st <= GetNT())
-    {
-      int i;
-      PrintMessage(1,"Angle to triangle ", st, ":");
-      for (i = 1; i <= NONeighbourTrigs(st); i++)
-	{
-	  PrintMessage(1,"   triangle ", NeighbourTrig(st,i), ": angle = " 
-	       , 180./M_PI*GetAngle(st, NeighbourTrig(st,i)), "°"
-	       , ", calculated = ", 180./M_PI*Angle(GetTriangle(st).GeomNormal(points), 
-						       GetTriangle(NeighbourTrig(st,i)).GeomNormal(points)), "°");
-	}
-    }
-}
-
-void STLGeometry :: GetVicinity(int starttrig, int size, ARRAY<int>& vic)
-{
-  if (starttrig == 0 || starttrig > GetNT()) {return;} 
-
-  ARRAY<int> vicarray;
-  vicarray.SetSize(GetNT());
-
-  int i;
-  for (i = 1; i <= vicarray.Size(); i++)
-    {
-      vicarray.Elem(i) = 0;
-    }
- 
-  vicarray.Elem(starttrig) = 1;
-  
-  int j = 0,k;
-
-  ARRAY <int> list1;
-  list1.SetSize(0);
-  ARRAY <int> list2;
-  list2.SetSize(0);
-  list1.Append(starttrig);
-
-  while (j < size)
-    {
-      j++;
-      for (i = 1; i <= list1.Size(); i++)
-	{
-	  for (k = 1; k <= NONeighbourTrigs(i); k++)
-	    {
-	      int nbtrig = NeighbourTrig(list1.Get(i),k);
-	      if (nbtrig && vicarray.Get(nbtrig) == 0)
-		{
-		  list2.Append(nbtrig);
-		  vicarray.Elem(nbtrig) = 1;
-		}
-	    }
-	}
-      list1.SetSize(0);
-      for (i = 1; i <= list2.Size(); i++)
-	{
-	  list1.Append(list2.Get(i));
-	}
-      list2.SetSize(0);
-    }
-
-  vic.SetSize(0);
-  for (i = 1; i <= vicarray.Size(); i++)
-    {
-      if (vicarray.Get(i)) {vic.Append(i);}
-    }
-}
-
-void STLGeometry :: CalcVicinity(int starttrig)
-{
-  if (starttrig == 0 || starttrig > GetNT()) {return;} 
-
-  vicinity.SetSize(GetNT());
-
-  if (!stldoctor.showvicinity) {return;}
-
-  int i;
-  for (i = 1; i <= vicinity.Size(); i++)
-    {
-      vicinity.Elem(i) = 0;
-    }
- 
-  vicinity.Elem(starttrig) = 1;
-  
-  int j = 0,k;
-
-  ARRAY <int> list1;
-  list1.SetSize(0);
-  ARRAY <int> list2;
-  list2.SetSize(0);
-  list1.Append(starttrig);
-
-  //  int cnt = 1;
-  while (j < stldoctor.vicinity)
-    {
-      j++;
-      for (i = 1; i <= list1.Size(); i++)
-	{
-	  for (k = 1; k <= NONeighbourTrigs(i); k++)
-	    {
-	      int nbtrig = NeighbourTrig(list1.Get(i),k);
-	      if (nbtrig && vicinity.Get(nbtrig) == 0)
-		{
-		  list2.Append(nbtrig);
-		  vicinity.Elem(nbtrig) = 1;
-		  //cnt++;
-		}
-	    }
-	}
-      list1.SetSize(0);
-      for (i = 1; i <= list2.Size(); i++)
-	{
-	  list1.Append(list2.Get(i));
-	}
-      list2.SetSize(0);
-    }
-
-}
-
-int STLGeometry :: Vicinity(int trig) const 
-{
-  if (trig <= vicinity.Size() && trig >=1)
-    {
-      return vicinity.Get(trig);
-    }
-  else {PrintSysError("In STLGeometry::Vicinity");}
-  return 0;
-}
-
-void STLGeometry :: InitMarkedTrigs()
-{
-  markedtrigs.SetSize(GetNT());
-  int i;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      SetMarkedTrig(i, 0);
-    }
-}
-
-void STLGeometry :: MarkDirtyTrigs()
-{
-  PrintFnStart("mark dirty trigs");
-  int i,j;
-
-  markedtrigs.SetSize(GetNT());
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      SetMarkedTrig(i, 0);
-    }
-
-  int found;
-  double dirtyangle = stlparam.yangle/2./180.*M_PI;
-  int cnt = 0;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      found = 0;
-      for (j = 1; j <= NONeighbourTrigs(i); j++)
-	{
-	  if (GetAngle(i, NeighbourTrig(i,j)) > dirtyangle)
-	    {
-	      found++;
-	    }
-	}
-      if (found && GetTriangle(i).MinHeight(points) < 
-	  stldoctor.dirtytrigfact*GetTriangle(i).MaxLength(points))
-	{
-	  SetMarkedTrig(i, 1); cnt++;
-	}
-      /*
-      else if (found == 3)
-	{
-	  SetMarkedTrig(i, 1); cnt++;	  
-	}
-      */
-    }
-
-  PrintMessage(1, "marked ", cnt, " dirty trigs");
-}
-
-
-void STLGeometry :: MarkTopErrorTrigs()
-{
-  int cnt = 0;
-  markedtrigs.SetSize(GetNT());
-  for (int i = 1; i <= GetNT(); i++)
-    {
-      const STLTriangle & trig = GetTriangle(i);
-
-      SetMarkedTrig(i, trig.flags.toperror);
-      if (trig.flags.toperror) cnt++;
-    }
-  PrintMessage(1,"marked ", cnt, " inconsistent triangles");
-}
-
-
-
-double STLGeometry :: CalcTrigBadness(int i)
-{
-  int j;
-  double maxbadness = 0;
-  int p1, p2;
-  for (j = 1; j <= NONeighbourTrigs(i); j++)
-    {
-      GetTriangle(i).GetNeighbourPoints(GetTriangle(NeighbourTrig(i,j)), p1, p2);
-      
-      if (!IsEdge(p1,p2) && GetGeomAngle(i, NeighbourTrig(i,j)) > maxbadness)
-	{
-	  maxbadness = GetGeomAngle(i, NeighbourTrig(i,j));
-	}
-    }
-  return maxbadness;
-
-}
-
-void STLGeometry :: GeomSmoothRevertedTrigs()
-{
-  double revertedangle = stldoctor.smoothangle/180.*M_PI;
-  double fact = stldoctor.dirtytrigfact;
-
-  MarkRevertedTrigs();
-
-  int i, j, k, l, p;
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      if (IsMarkedTrig(i)) 
-	{
-	  for (j = 1; j <= 3; j++)
-	    {
-	      double origbadness = CalcTrigBadness(i);
-
-	      p = GetTriangle(i).PNum(j);
-	      Point<3> pm(0.,0.,0.); //Middlevector;
-	      Point<3> p0(0.,0.,0.);
-
-	      int cnt = 0;
-
-	      for (k = 1; k <= trigsperpoint.EntrySize(p); k++)
-		{
-		  const STLTriangle& tr = GetTriangle(trigsperpoint.Get(p,k));
-		  for (l = 1; l <= 3; l++)
-		    {
-		      if (tr.PNum(l) != p)
-			{
-			  cnt++;
-			  pm(0) += GetPoint(tr.PNum(l))(0);
-			  pm(1) += GetPoint(tr.PNum(l))(1);
-			  pm(2) += GetPoint(tr.PNum(l))(2);
-			}
-		    }
-		}
-	      Point3d origp = GetPoint(p);
-	      Point3d newp = p0 + fact*(1./(double)cnt)*(pm-p0)+(1.-fact)*(origp-p0);
-
-	      SetPoint(p, newp);
-
-	      if (CalcTrigBadness(i) > 0.9*origbadness) {SetPoint(p,origp); PrintDot('f');}
-	      else {PrintDot('s');}
-	    }
-	}
-    }
-  MarkRevertedTrigs();
-}
-
-void STLGeometry :: MarkRevertedTrigs()
-{
-  int i,j;
-  if (edgesperpoint.Size() != GetNP()) {BuildEdges();}
-
-  PrintFnStart("mark reverted trigs");
-
-  InitMarkedTrigs();
-
-  int found;
-  double revertedangle = stldoctor.smoothangle/180.*M_PI;
-
-  int cnt = 0;
-  int p1, p2;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      found = 0;
-      for (j = 1; j <= NONeighbourTrigs(i); j++)
-	{
-	  GetTriangle(i).GetNeighbourPoints(GetTriangle(NeighbourTrig(i,j)), p1, p2);
-
-	  if (!IsEdge(p1,p2))
-	    {
-              if (GetGeomAngle(i, NeighbourTrig(i,j)) > revertedangle)
-		{
-		  found = 1;
-		  break;
-		}
-	    }
-	}
-      
-      if (found)
-	{
-	  SetMarkedTrig(i, 1); cnt++;
-	}
-      
-    }
-
-  PrintMessage(5, "found ", cnt, " reverted trigs");
-
-
-}
-
-void STLGeometry :: SmoothDirtyTrigs()
-{
-  PrintFnStart("smooth dirty trigs");
-
-  MarkDirtyTrigs();
-
-  int i,j;
-  int changed = 1;
-  int p1, p2;
-  
-  while (changed)
-    {
-      changed = 0;
-      for (i = 1; i <= GetNT(); i++)
-	{
-	  if (IsMarkedTrig(i))
-	    {
-	      int foundtrig = 0;
-	      double maxlen = 0;
-	      // JS: darf normalvector nicht ueber kurze Seite erben
-	      maxlen = GetTriangle(i).MaxLength(GetPoints()) / 2.1; //JG: bei flachem dreieck auch kurze Seite
-
-	      for (j = 1; j <= NONeighbourTrigs(i); j++)
-		{
-		  if (!IsMarkedTrig(NeighbourTrig(i,j)))
-		    {
-		      GetTriangle(i).GetNeighbourPoints(GetTriangle(NeighbourTrig(i,j)),p1,p2);
-		      if (Dist(GetPoint(p1),GetPoint(p2)) >= maxlen)
-			{
-			  foundtrig = NeighbourTrig(i,j);
-			  maxlen = Dist(GetPoint(p1),GetPoint(p2));
-			}
-		    }
-		}
-	      if (foundtrig)
-		{
-		  GetTriangle(i).SetNormal(GetTriangle(foundtrig).Normal());
-		  changed = 1;
-		  SetMarkedTrig(i,0);
-		}
-	    }
-	}
-    }
-
-  calcedgedataanglesnew = 1;
-
-
-  MarkDirtyTrigs();
-
-  int cnt = 0;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      if (IsMarkedTrig(i)) {cnt++;}
-    }
-
-  PrintMessage(5,"NO marked dirty trigs=", cnt);
-
-}
-
-int STLGeometry :: IsMarkedTrig(int trig) const 
-{
-  if (trig <= markedtrigs.Size() && trig >=1)
-    {
-      return markedtrigs.Get(trig);
-    }
-  else {PrintSysError("In STLGeometry::IsMarkedTrig");}
-
-  return 0;  
-}
-
-void STLGeometry :: SetMarkedTrig(int trig, int num)
-{
-  if (trig <= markedtrigs.Size() && trig >=1)
-    {
-      markedtrigs.Elem(trig) = num;
-    }
-  else {PrintSysError("In STLGeometry::SetMarkedTrig");}
-}
-
-void STLGeometry :: Clear()
-{
-  PrintFnStart("Clear");
-
-  surfacemeshed = 0;
-  surfaceoptimized = 0;
-  volumemeshed = 0;
-
-  selectedmultiedge.SetSize(0);
-  meshlines.SetSize(0);
-  // neighbourtrigs.SetSize(0);
-  outerchartspertrig.SetSize(0);
-  atlas.SetSize(0);
-  ClearMarkedSegs();
-  ClearSpiralPoints();
-  ClearLineEndPoints();
-
-  SetSelectTrig(0);
-  SetNodeOfSelTrig(1);
-  facecnt = 0;
-
-  SetThreadPercent(100.);
-
-  ClearEdges();
-}
-
-double STLGeometry :: Area()
-{
-  double ar = 0;
-  int i;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      ar += GetTriangle(i).Area(points);
-    }
-  return ar;
-}
-
-double STLGeometry :: GetAngle(int t1, int t2)
-{
-  return Angle(GetTriangle(t1).Normal(),GetTriangle(t2).Normal());
-}
-
-double STLGeometry :: GetGeomAngle(int t1, int t2)
-{
-  Vec3d n1 = GetTriangle(t1).GeomNormal(points);
-  Vec3d n2 = GetTriangle(t2).GeomNormal(points);
-  return Angle(n1,n2);
-}
-
-
-void STLGeometry :: InitSTLGeometry(const ARRAY<STLReadTriangle> & readtrias)
-{
-  PrintFnStart("Init STL Geometry");
-  STLTopology::InitSTLGeometry(readtrias);
-
-  int i, j, k;
-
-  const double geometry_tol_fact = 1E8; //distances lower than max_box_size/tol are ignored
-
-  int np = GetNP();
-  PrintMessage(5,"NO points= ", GetNP());
-  normals.SetSize(GetNP());
-  ARRAY<int> normal_cnt(GetNP()); // counts number of added normals in a point
-
-  for (i = 1; i <= np; i++)
-    {
-      normal_cnt.Elem(i) = 0;
-      normals.Elem(i) = Vec3d (0,0,0);
-    }
-
-  for(i = 1; i <= GetNT(); i++)
-    {
-      //      STLReadTriangle t = GetReadTriangle(i);
-      //      STLTriangle st;
-
-      Vec<3> n = GetTriangle(i).Normal ();
-
-      for (k = 1; k <= 3; k++)
-	{
-	  int pi = GetTriangle(i).PNum(k);
-	  
-	  normal_cnt.Elem(pi)++;
-	  SetNormal(pi, GetNormal(pi) + n);
-	}
-    } 
-
-  //normalize the normals
-  for (i = 1; i <= GetNP(); i++)
-    {
-      SetNormal(i,1./(double)normal_cnt.Get(i)*GetNormal(i));
-    }
-
-  trigsconverted = 1;
-
-  vicinity.SetSize(GetNT());
-  markedtrigs.SetSize(GetNT());
-  for (i = 1; i <= GetNT(); i++)
-    {
-      markedtrigs.Elem(i) = 0;
-      vicinity.Elem(i) = 1;
-    }
-
-  ha_points.SetSize(GetNP());
-  for (i = 1; i <= GetNP(); i++)
-    ha_points.Elem(i) = 0;
-
-  calcedgedataanglesnew = 0;
-  edgedatastored = 0;
-  edgedata.Clear();
-
-
-  if (GetStatus() == STL_ERROR) return;
-
-  CalcEdgeData();
-  CalcEdgeDataAngles();
-
-  ClearLineEndPoints();
-
-  CheckGeometryOverlapping();
-}
-
-void STLGeometry :: TopologyChanged()
-{
-  calcedgedataanglesnew = 1;
-}
-
-int STLGeometry :: CheckGeometryOverlapping()
-{
-  int i, j, k;
-
-  Box<3> geombox = GetBoundingBox();
-  Point<3> pmin = geombox.PMin();
-  Point<3> pmax = geombox.PMax();
-
-  Box3dTree setree(pmin, pmax);
-  ARRAY<int> inters;
-
-  int oltrigs = 0;
-  markedtrigs.SetSize(GetNT());
-
-  for (i = 1; i <= GetNT(); i++)
-    SetMarkedTrig(i, 0);
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      const STLTriangle & tri = GetTriangle(i);
-      
-      Point<3> tpmin = tri.box.PMin();
-      Point<3> tpmax = tri.box.PMax();
-      Vec<3> diag = tpmax - tpmin;
-
-      tpmax = tpmax + 0.001 * diag;
-      tpmin = tpmin - 0.001 * diag;
-
-      setree.Insert (tpmin, tpmax, i);
-    }
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      const STLTriangle & tri = GetTriangle(i);
-      
-      Point<3> tpmin = tri.box.PMin();
-      Point<3> tpmax = tri.box.PMax();
-
-      setree.GetIntersecting (tpmin, tpmax, inters);
-
-      for (j = 1; j <= inters.Size(); j++)
-	{
-	  const STLTriangle & tri2 = GetTriangle(inters.Get(j));
-
-	  const Point3d *trip1[3], *trip2[3];	
-	  Point3d hptri1[3], hptri2[3];
-	  /*
-	  for (k = 1; k <= 3; k++)
-	    {
-	      trip1[k-1] = &GetPoint (tri.PNum(k));
-	      trip2[k-1] = &GetPoint (tri2.PNum(k));
-	    }
-	  */
-
-	  for (k = 0; k < 3; k++)
-	    {
-	      hptri1[k] = GetPoint (tri[k]);
-	      hptri2[k] = GetPoint (tri2[k]);
-	      trip1[k] = &hptri1[k];
-	      trip2[k] = &hptri2[k];
-	    }
-
-	  if (IntersectTriangleTriangle (&trip1[0], &trip2[0]))
-	    {
-	      oltrigs++;
-	      PrintMessage(5,"Intersecting Triangles: trig ",i," with ",inters.Get(j),"!");
-	      SetMarkedTrig(i, 1);
-	      SetMarkedTrig(inters.Get(j), 1);
-	    }
-	}
-    }
-
-  PrintMessage(3,"Check Geometry Overlapping: overlapping triangles = ",oltrigs);
-  return oltrigs;
-}
-
-/*
-void STLGeometry :: InitSTLGeometry()
-{
-  STLTopology::InitSTLGeometry();
-
-  int i, j, k;
-
-  const double geometry_tol_fact = 1E8; //distances lower than max_box_size/tol are ignored
-
-
-  trias.SetSize(0);
-  points.SetSize(0);
-  normals.SetSize(0);
-
-  ARRAY<int> normal_cnt; // counts number of added normals in a point
-
-  Box3d bb (GetBoundingBox().PMin() + Vec3d (-1,-1,-1),
-	    GetBoundingBox().PMax() + Vec3d (1, 1, 1));
-
-  Point3dTree pointtree (bb.PMin(), 
-			 bb.PMax());
-  ARRAY<int> pintersect;
-
-  double gtol = GetBoundingBox().CalcDiam()/geometry_tol_fact;
-
-  for(i = 1; i <= GetReadNT(); i++)
-    {
-      //if (i%500==499) {(*mycout) << (double)i/(double)GetReadNT()*100. << "%" << endl;}
-
-      STLReadTriangle t = GetReadTriangle(i);
-      STLTriangle st;
-      Vec3d n = t.normal;
-
-      for (k = 0; k < 3; k++)
-	{
-	  Point3d p = t.pts[k];
-
-	  Point3d pmin = p - Vec3d (gtol, gtol, gtol);
-	  Point3d pmax = p + Vec3d (gtol, gtol, gtol);
-	  
-	  pointtree.GetIntersecting (pmin, pmax, pintersect);
-	  
-	  if (pintersect.Size() > 1)
-	    (*mycout) << "found too much  " << char(7) << endl;
-	  int foundpos = 0;
-	  if (pintersect.Size())
-	    foundpos = pintersect.Get(1);
-
-	  if (foundpos) 
-	    {
-	      normal_cnt[foundpos]++;
-	      SetNormal(foundpos,GetNormal(foundpos)+n);
-	      //	      (*testout) << "found p " << p << endl;
-	    }
-	  else
-	    {
-	      foundpos = AddPoint(p);
-	      AddNormal(n);
-	      normal_cnt.Append(1);
-
-	      pointtree.Insert (p, foundpos);
-	    }
-	  //(*mycout) << "foundpos=" << foundpos << endl;
-	  st.pts[k] = foundpos;
-	}
-
-      if ( (st.pts[0] == st.pts[1]) || 
-	   (st.pts[0] == st.pts[2]) || 
-	   (st.pts[1] == st.pts[2]) )
-	{
-	  (*mycout) << "ERROR: STL Triangle degenerated" << endl;
-	}
-      else
-	{
-	  // do not add ? js
-	  AddTriangle(st);
-	}
-      //(*mycout) << "TRIG" << i << " = " << st << endl;
-      
-    } 
-  //normal the normals
-  for (i = 1; i <= GetNP(); i++)
-    {
-      SetNormal(i,1./(double)normal_cnt[i]*GetNormal(i));
-    }
-
-  trigsconverted = 1;
-
-  vicinity.SetSize(GetNT());
-  markedtrigs.SetSize(GetNT());
-  for (i = 1; i <= GetNT(); i++)
-    {
-      markedtrigs.Elem(i) = 0;
-      vicinity.Elem(i) = 1;
-    }
-
-  ha_points.SetSize(GetNP());
-  for (i = 1; i <= GetNP(); i++)
-    ha_points.Elem(i) = 0;
-
-  calcedgedataanglesnew = 0;
-  edgedatastored = 0;
-  edgedata.Clear();
-
-  CalcEdgeData();
-  CalcEdgeDataAngles();
-
-  ClearLineEndPoints();
-
-  (*mycout) << "done" << endl;
-}
-*/
-
-
-
-void STLGeometry :: SetLineEndPoint(int pn) 
-{
-  if (pn <1 || pn > lineendpoints.Size()) {PrintSysError("Illegal pnum in SetLineEndPoint!!!"); return; }
-  lineendpoints.Elem(pn) = 1;
-}
-
-int STLGeometry :: IsLineEndPoint(int pn) 
-{
-  //  return 0;
-  if (pn <1 || pn > lineendpoints.Size()) 
-    {PrintSysError("Illegal pnum in IsLineEndPoint!!!"); return 0;}
-  return lineendpoints.Get(pn);
-}
-
-void STLGeometry :: ClearLineEndPoints()
-{
-  lineendpoints.SetSize(GetNP());
-  int i;
-  for (i = 1; i <= GetNP(); i++)
-    {
-      lineendpoints.Elem(i) = 0;
-    }
-}
-
-int STLGeometry :: IsEdge(int p1, int p2)
-{
-  int i,j;
-  for (i = 1; i <= GetNEPP(p1); i++)
-    {
-      for (j = 1; j <= GetNEPP(p2); j++)
-	{
-	  if (GetEdgePP(p1,i) == GetEdgePP(p2,j)) {return 1;}
-	}
-    }
-  return 0;
-}
-
-int STLGeometry :: IsEdgeNum(int p1, int p2)
-{
-  int i,j;
-  for (i = 1; i <= GetNEPP(p1); i++)
-    {
-      for (j = 1; j <= GetNEPP(p2); j++)
-	{
-	  if (GetEdgePP(p1,i) == GetEdgePP(p2,j)) {return GetEdgePP(p1,i);}
-	}
-    }
-  return 0;
-}
-
-
-void STLGeometry :: BuildEdges()
-{
-  //PrintFnStart("build edges");
-  edges.SetSize(0);
-  meshlines.SetSize(0);
-  FindEdgesFromAngles();
-}
-
-void STLGeometry :: UseExternalEdges()
-{
-  int i;
-  for (i = 1; i <= NOExternalEdges(); i++)
-    {
-      AddEdge(GetExternalEdge(i).i1,GetExternalEdge(i).i2);
-    }
-  //BuildEdgesPerPointy();
-}
-
-void STLGeometry :: UndoEdgeChange()
-{
-  if (edgedatastored) 
-    {
-      RestoreEdgeData();
-    }
-  else
-    {
-      PrintWarning("no edge undo possible");
-    }
-}
-
-
-void STLGeometry :: StoreEdgeData()
-{
-  //  edgedata_store = edgedata;
-  
-  edgedata.Store();
-  edgedatastored = 1;
-
-  // put stlgeom-edgedata to stltopology edgedata 
-  /*
-  int i;
-  for (i = 1; i <= GetNTE(); i++)
-    {
-      const STLTopEdge & topedge = GetTopEdge (i);
-      int ednum = edgedata.GetEdgeNum (topedge.PNum(1),
-				       topedge.PNum(2));
-      topedges.Elem(i).SetStatus (edgedata.Get (ednum).status);
-    }
-  */
-}
-
-void STLGeometry :: RestoreEdgeData()
-{
-  //  edgedata = edgedata_store;
-  edgedata.Restore();
-  edgedatastored=0;
-}
-
-
-void STLGeometry :: CalcEdgeData()
-{
-  PushStatus("Calc Edge Data");
-
-  int np1, np2;
-  double ang;
-  int i;
-  
-  int ecnt = 0;
-  edgedata.SetSize(GetNT()/2*3);
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      SetThreadPercent((double)i/(double)GetNT()*100.);
-      
-      const STLTriangle & t1 = GetTriangle(i);
-
-      for (int j = 1; j <= NONeighbourTrigs(i); j++)
-	{
-	  int nbti = NeighbourTrig(i,j);
-	  if (nbti > i)
-	    {
-	      const STLTriangle & t2 = GetTriangle(nbti);
-
-	      if (t1.IsNeighbourFrom(t2))
-		{
-		  ecnt++; if (ecnt > edgedata.Size()) {PrintError("In Calc edge data, illegal geometry");}
-
-		  t1.GetNeighbourPoints(t2,np1,np2);
-
-		  /* ang = GetAngle(i,nbti);
-		     if (ang < -M_PI) {ang += 2*M_PI;}*/
-
-
-		  // edgedata.Add(STLEdgeData(0, np1, np2, i, nbti),ecnt);
-		  edgedata.Elem(ecnt).SetStatus(ED_UNDEFINED);
-
-		  // edgedata.Elem(ecnt).top = this;
-		  // edgedata.Elem(ecnt).topedgenr = GetTopEdgeNum (np1, np2);
-		}
-	    }
-	}      
-    }
-  
-  //BuildEdgesPerPoint();
-  PopStatus();  
-}
-
-void STLGeometry :: CalcEdgeDataAngles()
-{
-  PrintMessage(5,"calc edge data angles");
-
-  double ang;
-  int i;
-  int t1,t2;
-
-  for (i = 1; i <= GetNTE(); i++)
-    {
-      STLTopEdge & edge = GetTopEdge (i);
-      double cosang = 
-	GetTriangle(edge.TrigNum(1)).Normal() *
-	GetTriangle(edge.TrigNum(2)).Normal();
-      edge.SetCosAngle (cosang);
-    }
-
-  for (i = 1; i <= edgedata.Size(); i++)
-    {
-      /*
-      const STLEdgeData& e = edgedata.Get(i);
-      ang = GetAngle(e.lt,e.rt);
-      if (ang < -M_PI) {ang += 2*M_PI;}
-      edgedata.Elem(i).angle = fabs(ang);
-      */
-    }
-  
-}
-
-void STLGeometry :: FindEdgesFromAngles()
-{
-  //  PrintFnStart("find edges from angles");
-
-  double min_edge_angle = stlparam.yangle/180.*M_PI;
-  double cont_min_edge_angle = stlparam.contyangle/180.*M_PI;
-
-  double cos_min_edge_angle = cos (min_edge_angle);
-  double cos_cont_min_edge_angle = cos (cont_min_edge_angle);
-
-  if (calcedgedataanglesnew) {CalcEdgeDataAngles(); calcedgedataanglesnew = 0;}
-
-  int i;
-  for (i = 1; i <= edgedata.Size(); i++)
-    {
-      STLTopEdge & sed = edgedata.Elem(i);
-      if (sed.GetStatus() == ED_CANDIDATE || 
-	  sed.GetStatus() == ED_UNDEFINED)
-	{
-	  if (sed.CosAngle() <= cos_min_edge_angle)
-	    {
-	      sed.SetStatus (ED_CANDIDATE);
-	    }
-	  else
-	    {
-	      sed.SetStatus(ED_UNDEFINED);
-	    }
-	} 
-    }
-
-  if (stlparam.contyangle < stlparam.yangle)
-    {
-      int changed = 1;
-      int its = 0;
-      while (changed && stlparam.contyangle < stlparam.yangle)
-	{
-	  its++;
-	  //(*mycout) << "." << flush;
-	  changed = 0;
-	  for (i = 1; i <= edgedata.Size(); i++)
-	    {
-	      STLTopEdge & sed = edgedata.Elem(i);
-	      if (sed.CosAngle() <= cos_cont_min_edge_angle 
-		  && sed.GetStatus() == ED_UNDEFINED && 
-		  (edgedata.GetNConfCandEPP(sed.PNum(1)) == 1 || 
-		   edgedata.GetNConfCandEPP(sed.PNum(2)) == 1))
-		{
-		  changed = 1;
-		  sed.SetStatus (ED_CANDIDATE);
-		}
-	    }
-	}
-    }
-  
-  int confcand = 0;
-  if (edgedata.GetNConfEdges() == 0) 
-    {
-      confcand = 1;
-    }
-  
-  for (i = 1; i <= edgedata.Size(); i++)
-    {
-      STLTopEdge & sed = edgedata.Elem(i);
-      if (sed.GetStatus() == ED_CONFIRMED || 
-	  (sed.GetStatus() == ED_CANDIDATE && confcand))
-	{
-	  STLEdge se(sed.PNum(1),sed.PNum(2));
-	  se.SetLeftTrig(sed.TrigNum(1));
-	  se.SetRightTrig(sed.TrigNum(2));
-	  AddEdge(se);
-	}
-    }
-  BuildEdgesPerPoint();
-
-  
-
-  //(*mycout) << "its for continued angle = " << its << endl;
-  PrintMessage(5,"built ", GetNE(), " edges with yellow angle = ", stlparam.yangle, " degree");
-  
-}
-
-/*
-void STLGeometry :: FindEdgesFromAngles()
-{
-  double yangle = stlparam.yangle;
-  char * savetask = multithread.task;
-  multithread.task = "find edges";
-
-  const double min_edge_angle = yangle/180.*M_PI;
-
-  int np1, np2;
-  double ang;
-  int i;
-
-  //(*mycout) << "area=" << Area() << endl;
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      multithread.percent = (double)i/(double)GetReadNT()*100.;
-      
-      const STLTriangle & t1 = GetTriangle(i);
-      //NeighbourTrigs(nt,i);
-
-      for (int j = 1; j <= NONeighbourTrigs(i); j++)
-	{
-	  int nbti = NeighbourTrig(i,j);
-	  if (nbti > i)
-	    {
-	      const STLTriangle & t2 = GetTriangle(nbti);
-
-	      if (t1.IsNeighbourFrom(t2))
-		{
-		  ang = GetAngle(i,nbti);
-		  if (ang < -M_PI*0.5) {ang += 2*M_PI;}
-
-		  t1.GetNeighbourPoints(t2,np1,np2);
-		  
-		  if (fabs(ang) >= min_edge_angle)
-		    {
-		      STLEdge se(np1,np2);
-		      se.SetLeftTrig(i);
-		      se.SetRightTrig(nbti);
-		      AddEdge(se);
-		    }
-		}
-	    }
-	}      
-    }
-  
-  (*mycout) << "added " << GetNE() << " edges" << endl;
-
-  //BuildEdgesPerPoint();
-
-  multithread.percent = 100.;
-  multithread.task = savetask;
-  
-}
-*/
-void STLGeometry :: BuildEdgesPerPoint()
-{
-  //cout << "*** build edges per point" << endl;
-  edgesperpoint.SetSize(GetNP());
-
-  //add edges to points
-  int i, j;
-  for (i = 1; i <= GetNE(); i++)
-    {
-      //(*mycout) << "EDGE " << GetEdge(i).PNum(1) << " - " << GetEdge(i).PNum(2) << endl;
-      for (int j = 1; j <= 2; j++)
-	{
-	  AddEdgePP(GetEdge(i).PNum(j),i);
-	}
-    }
-}
-
-void STLGeometry :: AddFaceEdges()
-{
-  PrintFnStart("Add starting edges for faces");
-
-  //für Kugel eine STLLine hinzufügen (Vorteil: verfeinerbar, unabhängig von Auflösung der Geometrie!!!):
-  //Grenze von 1. gefundener chart
-
-  ARRAY<int> edgecnt;
-  ARRAY<int> chartindex;
-  edgecnt.SetSize(GetNOFaces());
-  chartindex.SetSize(GetNOFaces());
-
-  int i,j;
-  for (i = 1; i <= GetNOFaces(); i++)
-    {
-      edgecnt.Elem(i) = 0;
-      chartindex.Elem(i) = 0;
-    }
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      int fn = GetTriangle(i).GetFaceNum();
-      if (!chartindex.Get(fn)) {chartindex.Elem(fn) = GetChartNr(i);}
-      for (j = 1; j <= 3; j++)
-	{
-	  edgecnt.Elem(fn) += GetNEPP(GetTriangle(i).PNum(j));
-	}
-    }
-
-  for (i = 1; i <= GetNOFaces(); i++)
-    {
-      if (!edgecnt.Get(i)) {PrintMessage(5,"Face", i, " has no edge!");}
-    }
-  
-  int changed = 0;
-  int k, p1, p2;
-  for (i = 1; i <= GetNOFaces(); i++)
-    {
-      if (!edgecnt.Get(i))
-      {
-	const STLChart& c = GetChart(chartindex.Get(i));
-	for (j = 1; j <= c.GetNChartT(); j++)
-	  {
-	    const STLTriangle& t1 = GetTriangle(c.GetChartTrig(j));
-	    for (k = 1; k <= 3; k++)
-	      {
-		int nt = NeighbourTrig(c.GetChartTrig(j),k);
-		if (GetChartNr(nt) != chartindex.Get(i))
-		  {
-		    t1.GetNeighbourPoints(GetTriangle(nt),p1,p2);
-		    AddEdge(p1,p2);
-		    changed = 1;
-		  }
-	      }
-	  }
-      }
-      
-    }
-  
-  if (changed) BuildEdgesPerPoint();
-  
-}
-
-void STLGeometry :: LinkEdges()
-{
-  PushStatusF("Link Edges");
-  PrintMessage(5,"have now ", GetNE(), " edges with yellow angle = ", stlparam.yangle, " degree");
-
-  int i;
-
-  lines.SetSize(0);
-  int starte;
-  int edgecnt = 0;
-  int found;
-  int rev; //indicates, that edge is inserted reverse
-
-  //worked edges
-  ARRAY<int> we(GetNE());
-
-  //setlineendpoints; wenn 180°, dann keine endpunkte
-  //nur punkte mit 2 edges kommen in frage, da bei mehr oder weniger punkten ohnehin ein meshpoint hinkommt
-
-  Vec3d v1,v2;
-  double cos_eca = cos(stlparam.edgecornerangle/180.*M_PI);
-  int ecnt = 0;
-  int lp1, lp2;
-  if (stlparam.edgecornerangle < 180)
-    {
-      for (i = 1; i <= GetNP(); i++)
-	{
-	  if (GetNEPP(i) == 2)
-	    {
-	      if (GetEdge(GetEdgePP(i,1)).PNum(2) == GetEdge(GetEdgePP(i,2)).PNum(1) ||
-		  GetEdge(GetEdgePP(i,1)).PNum(1) == GetEdge(GetEdgePP(i,2)).PNum(2))
-		{
-		  lp1 = 1; lp2 = 2;
-		}
-	      else
-		{
-		  lp1 = 2; lp2 = 1;
-		}
-
-	      v1 = Vec3d(GetPoint(GetEdge(GetEdgePP(i,1)).PNum(1)),
-			 GetPoint(GetEdge(GetEdgePP(i,1)).PNum(2)));
-	      v2 = Vec3d(GetPoint(GetEdge(GetEdgePP(i,2)).PNum(lp1)),
-			 GetPoint(GetEdge(GetEdgePP(i,2)).PNum(lp2)));
-	      if ((v1*v2)/sqrt(v1.Length2()*v2.Length2()) < cos_eca) 
-		{
-		  //(*testout) << "add edgepoint " << i << endl;
-		  SetLineEndPoint(i);
-		  ecnt++;
-		}
-	    }	  
-	}
-    }
-  PrintMessage(5, "added ", ecnt, " mesh_points due to edge corner angle (", 
-	       stlparam.edgecornerangle, " degree)");
-
-  for (i = 1; i <= GetNE(); i++) {we.Elem(i) = 0;}
-
-  while(edgecnt < GetNE())
-    {
-      SetThreadPercent((double)edgecnt/(double)GetNE()*100.);
-
-      STLLine* line = new STLLine(this);
-
-      //find start edge
-      int j = 1;
-      found = 0;
-      //try second time, if only rings are left!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-      int second = 0;
-
-      //find a starting edge at point with 1 or more than 2 edges or at lineendpoint
-      while (!found && j<=GetNE())
-	{
-	  if (!we.Get(j))
-	    {
-	      if (GetNEPP(GetEdge(j).PNum(1)) != 2 || IsLineEndPoint(GetEdge(j).PNum(1)))
-		{
-		  starte = j;
-		  found = 1;
-		  rev = 0;
-		}
-	      else 
-	      if (GetNEPP(GetEdge(j).PNum(2)) != 2 || IsLineEndPoint(GetEdge(j).PNum(2)))
-		{
-		  starte = j;
-		  found = 1;
-		  rev = 1;
-		}
-	      else if (second)
-		{
-		  starte = j;
-		  found = 1;
-		  rev = 0; //0 or 1 are possible
-		}
-	    }
-	  j++;
-	  if (!second && j == GetNE()) {second = 1; j = 1;}
-	}
-
-      if (!found) {PrintSysError("No starting edge found, edgecnt=", edgecnt, ", GETNE=", GetNE());}
-
-      line->AddPoint(GetEdge(starte).PNum(1+rev));
-      line->AddPoint(GetEdge(starte).PNum(2-rev));
-      if (!rev)
-	{
-	  line->AddLeftTrig(GetEdge(starte).LeftTrig());
-	  line->AddRightTrig(GetEdge(starte).RightTrig());
-	}
-      else
-	{
-	  line->AddLeftTrig(GetEdge(starte).RightTrig());
-	  line->AddRightTrig(GetEdge(starte).LeftTrig());
-	}
-      edgecnt++; we.Elem(starte) = 1;
-
-      //add segments to line as long as segments other than starting edge are found or lineendpoint is reached 
-      found = 1;
-      int other;
-      while(found)
-	{
-	  found = 0;
-	  int fp = GetEdge(starte).PNum(2-rev);
-	  if (GetNEPP(fp) == 2 && !IsLineEndPoint(fp))
-	    {
-	      //find the "other" edge of point fp
-	      other = 0;
-	      if (GetEdgePP(fp,1) == starte) {other = 1;}
-
-	      starte = GetEdgePP(fp,1+other);
-
-	      //falls ring -> aufhoeren !!!!!!!!!!!
-	      if (!we.Elem(starte))
-		{
-		  found = 1;
-		  rev = 0;
-		  if (GetEdge(starte).PNum(2) == fp) {rev = 1;}
-		  else if (GetEdge(starte).PNum(1) != fp) {PrintSysError("In Link Edges!");}
-
-		  line->AddPoint(GetEdge(starte).PNum(2-rev));
-		  if (!rev) 
-		    {
-		      line->AddLeftTrig(GetEdge(starte).LeftTrig());
-		      line->AddRightTrig(GetEdge(starte).RightTrig());
-		    }
-		  else
-		    {
-		      line->AddLeftTrig(GetEdge(starte).RightTrig());
-		      line->AddRightTrig(GetEdge(starte).LeftTrig());
-		    }
-		  edgecnt++; we.Elem(starte) = 1;
-		}
-	    }     
-	}
-      AddLine(line);      
-    }
-  PrintMessage(5,"number of lines generated = ", GetNLines());
-
-  //check, which lines must have at least one midpoint
-  INDEX_2_HASHTABLE<int> lineht(GetNLines()+1);
-
-  for (i = 1; i <= GetNLines(); i++)
-    {
-      if (GetLine(i)->StartP() == GetLine(i)->EndP())
-	{
-	  GetLine(i)->DoSplit();	  
-	}
-    }
-
-  for (i = 1; i <= GetNLines(); i++)
-    {
-      INDEX_2 lineep (GetLine(i)->StartP(),GetLine(i)->EndP());
-      lineep.Sort();
-
-      if (lineht.Used (lineep))
-	{
-	  GetLine(i)->DoSplit();
-	  int other = lineht.Get(lineep);
-	  GetLine(other)->DoSplit();
-	}
-      else
-	{
-	  lineht.Set (lineep, i);
-	}
-    }
-
-  for (i = 1; i <= GetNLines(); i++)
-    {
-      STLLine* line = GetLine(i);
-      for (int ii = 1; ii <= line->GetNS(); ii++)
-	{
-	  int p1, p2;
-	  line->GetSeg(ii,p1,p2);
-	  //	  (*mycout) << "SEG " << p1 << " - " << p2 << endl;
-	}
-    }
-
-  PopStatus();
-}
-
-int STLGeometry :: GetNOBodys()
-{
-  int markedtrigs = 0;
-  int starttrig = 1;
-  int i, k, nnt;
-  int bodycnt = 0;
-
-  ARRAY<int> bodynum(GetNT());
-
-  for (i = 1; i <= GetNT(); i++)
-    bodynum.Elem(i)=0;
-
-
-  while (markedtrigs < GetNT())
-    {
-      for (i = starttrig; i <= GetNT(); i++)
-	{
-	  if (!bodynum.Get(i))
-	    {
-	      starttrig = i;
-	      break;
-	    }
-	} 
-      //add all triangles around starttriangle, which is reachable without going over an edge
-      ARRAY<int> todolist;
-      ARRAY<int> nextlist;
-      bodycnt++;
-      markedtrigs++;
-      bodynum.Elem(starttrig) = bodycnt;
-      todolist.Append(starttrig);
-      int p1, p2;
-
-      while(todolist.Size())
-	{
-	  for (i = 1; i <= todolist.Size(); i++)
-	    {
-	      const STLTriangle& tt = GetTriangle(todolist.Get(i));
-	      for (k = 1; k <= NONeighbourTrigs(todolist.Get(i)); k++)
-		{
-		  nnt = NeighbourTrig(todolist.Get(i),k);
-		  if (!bodynum.Get(nnt))
-		    {
-		      nextlist.Append(nnt);
-		      bodynum.Elem(nnt) = bodycnt;
-		      markedtrigs++;
-		    }
-		}
-	    }
-	  
-	  todolist.SetSize(0);
-	  for (i = 1; i <= nextlist.Size(); i++)
-	    {
-	      todolist.Append(nextlist.Get(i));
-	    }
-	  nextlist.SetSize(0);	  
-	}
-    }
-  PrintMessage(3, "Geometry has ", bodycnt, " separated bodys");
-
-  return bodycnt;
-}
-
-void STLGeometry :: CalcFaceNums()
-{
-  int markedtrigs = 0;
-  int starttrig;
-  int laststarttrig = 1;
-  int i, k, nnt;
-  facecnt = 0;
-
-
-  for (i = 1; i <= GetNT(); i++)
-    GetTriangle(i).SetFaceNum(0);
-
-
-  while (markedtrigs < GetNT())
-    {
-      for (i = laststarttrig; i <= GetNT(); i++)
-	{
-	  if (!GetTriangle(i).GetFaceNum()) 
-	    {
-	      starttrig = i;
-	      laststarttrig = i;
-	      break;
-	    }
-	} 
-      //add all triangles around starttriangle, which is reachable without going over an edge
-      ARRAY<int> todolist;
-      ARRAY<int> nextlist;
-      facecnt++;
-      markedtrigs++;
-      GetTriangle(starttrig).SetFaceNum(facecnt);
-      todolist.Append(starttrig);
-      int p1, p2;
-
-      while(todolist.Size())
-	{
-	  for (i = 1; i <= todolist.Size(); i++)
-	    {
-	      const STLTriangle& tt = GetTriangle(todolist.Get(i));
-	      for (k = 1; k <= NONeighbourTrigs(todolist.Get(i)); k++)
-		{
-		  nnt = NeighbourTrig(todolist.Get(i),k);
-		  STLTriangle& nt = GetTriangle(nnt);
-		  if (!nt.GetFaceNum())
-		    {
-		      tt.GetNeighbourPoints(nt,p1,p2);
-		      if (!IsEdge(p1,p2))
-			{
-			  nextlist.Append(nnt);
-			  nt.SetFaceNum(facecnt);
-			  markedtrigs++;
-			}
-		    }
-		}
-	    }
-	  
-	  todolist.SetSize(0);
-	  for (i = 1; i <= nextlist.Size(); i++)
-	    {
-	      todolist.Append(nextlist.Get(i));
-	    }
-	  nextlist.SetSize(0);	  
-	}
-    }
-  GetNOBodys();
-  PrintMessage(3,"generated ", facecnt, " faces");
-}
- 
-void STLGeometry :: ClearSpiralPoints()
-{
-  spiralpoints.SetSize(GetNP());
-  int i;
-  for (i = 1; i <= spiralpoints.Size(); i++)
-    {
-      spiralpoints.Elem(i) = 0;
-    }
-}
-
-
-void STLGeometry :: BuildSmoothEdges ()
-{
-  if (smoothedges) delete smoothedges;
-
-  smoothedges = new INDEX_2_HASHTABLE<int> (GetNE()/10 + 1);
-
-
-  // Jack: Ok ?
-  //  UseExternalEdges();
-
-  PushStatusF("Build Smooth Edges");
-
-  int i, j, k, l;
-  int nt = GetNT();
-  Vec3d ng1, ng2;
-
-  for (i = 1; i <= nt; i++)
-    {
-      if (multithread.terminate)
-	{PopStatus();return;}
-
-      SetThreadPercent(100.0 * (double)i / (double)nt);
-
-      const STLTriangle & trig = GetTriangle (i);
-      
-      Vec3d ng1 = trig.GeomNormal(points);
-      ng1 /= (ng1.Length() + 1e-24);
-
-      for (j = 1; j <= 3; j++)
-	{ 
-	  int nbt = NeighbourTrig (i, j);
-	  
-	  Vec3d ng2 = GetTriangle(nbt).GeomNormal(points);
-	  ng2 /= (ng2.Length() + 1e-24);
-	  
-	  
-	  int pi1, pi2;
-
-	  trig.GetNeighbourPoints(GetTriangle(nbt), pi1, pi2);
-
-	  if (!IsEdge(pi1,pi2)) 
-	    {
-	      if (ng1 * ng2 < 0)
-		{
-		  PrintMessage(7,"smoothedge found");
-		  INDEX_2 i2(pi1, pi2);
-		  i2.Sort();
-		  smoothedges->Set (i2, 1);
-		}
-	    }
-	}
-    }
-
-  PopStatus();
-}
-
-
-
-
-
-int STLGeometry :: IsSmoothEdge (int pi1, int pi2) const
-{
-  if (!smoothedges)
-    return 0;
-  INDEX_2 i2(pi1, pi2);
-  i2.Sort();
-  return smoothedges->Used (i2);
-}
-
-
-
-
-//function is not used now
-int IsInArray(int n, const ARRAY<int>& ia)
-{
-  int i;
-  for (i = 1; i <= ia.Size(); i++)
-    {
-      if (ia.Get(i) == n) {return 1;}
-    }
-  return 0;
-}
-
-void STLGeometry :: AddConeAndSpiralEdges()
-{
-  PrintMessage(5,"have now ", GetNE(), " edges with yellow angle = ", stlparam.yangle, " degree");
-
-  PrintFnStart("AddConeAndSpiralEdges");
-
-  int i,j,k,n;
-  //  int changed = 0;
-
-  //check edges, where inner chart and no outer chart come together without an edge
-  int np1, np2, nt;
-  int cnt = 0;
-
-  for (i = 1; i <= GetNOCharts(); i++)
-    {
-      STLChart& chart = GetChart(i);
-      for (j = 1; j <= chart.GetNChartT(); j++)
-	{
-	  int t = chart.GetChartTrig(j); 
-	  const STLTriangle& tt = GetTriangle(t);
-
-	  for (k = 1; k <= 3; k++)
-	    {
-	      nt = NeighbourTrig(t,k); 
-	      if (GetChartNr(nt) != i && !TrigIsInOC(nt,i))
-		{	      
-		  tt.GetNeighbourPoints(GetTriangle(nt),np1,np2);
-		  if (!IsEdge(np1,np2))
-		    {
-		      STLEdge se(np1,np2);
-		      se.SetLeftTrig(t);
-		      se.SetRightTrig(nt);
-		      int edgenum = AddEdge(se);
-		      AddEdgePP(np1,edgenum);
-		      AddEdgePP(np2,edgenum);
-		      //changed = 1;
-		      PrintWarning("Found a spiral like structure: chart=", i,
-				   ", trig=", t, ", p1=", np1, ", p2=", np2);
-		      cnt++;
-		    }
-		}
-	    }
-	}
-	  
-    }
-
-  PrintMessage(5, "found ", cnt, " spiral like structures");
-  PrintMessage(5, "added ", cnt, " edges due to spiral like structures");
-  
-  cnt = 0;
-  int edgecnt = 0;
-
-  ARRAY<int> trigsaroundp;
-  ARRAY<int> chartpointchecked; //gets number of chart, if in this chart already checked
-  chartpointchecked.SetSize(GetNP());
-
-  for (i = 1; i <= GetNP(); i++)
-    {
-      chartpointchecked.Elem(i) = 0;
-    }
-
-  int onoc, notonoc, tpp, pn;
-  int p1, p2, tn1, tn2, l, problem;
-
-  if (!stldoctor.conecheck) {PrintWarning("++++++++++++ \ncone checking deactivated by user!!!!!\n+++++++++++++++"); return ;}
-
-  PushStatus("Find Critical Points");
-
-  int addedges = 0;
-
-  for (i = 1; i <= GetNOCharts(); i++)
-    {
-      SetThreadPercent((double)i/(double)GetNOCharts()*100.);
-      if (multithread.terminate)
-	{PopStatus();return;}
-
-      STLChart& chart = GetChart(i);
-      for (j = 1; j <= chart.GetNChartT(); j++)
-	{
-	  int t = chart.GetChartTrig(j); 
-	  const STLTriangle& tt = GetTriangle(t);
-
-	  for (k = 1; k <= 3; k++)
-	    {
-	      pn = tt.PNum(k);
-	      if (chartpointchecked.Get(pn) == i)
-		{continue;}
-	      
-	      int checkpoint = 0;
-	      for (n = 1; n <= trigsperpoint.EntrySize(pn); n++)
-		{
-		  if (trigsperpoint.Get(pn,n) != t && 
-		      GetChartNr(trigsperpoint.Get(pn,n)) != i &&
-		      !TrigIsInOC(trigsperpoint.Get(pn,n),i)) {checkpoint = 1;};
-		}
-	      if (checkpoint)
-		{
-		  chartpointchecked.Elem(pn) = i;
-
-		  int worked = 0;
-		  int spworked = 0;
-		  GetSortedTrianglesAroundPoint(pn,t,trigsaroundp);
-		  trigsaroundp.Append(t);
-		      
-		  problem = 0;
-		  for (l = 2; l <= trigsaroundp.Size()-1; l++)
-		    {
-		      tn1 = trigsaroundp.Get(l-1);
-		      tn2 = trigsaroundp.Get(l);
-		      const STLTriangle& t1 = GetTriangle(tn1);
-		      const STLTriangle& t2 = GetTriangle(tn2);
-		      t1.GetNeighbourPoints(t2, p1, p2);
-		      if (IsEdge(p1,p2)) break;
-		      
-		      if (GetChartNr(tn2) != i && !TrigIsInOC(tn2,i)) {problem = 1;}
-		    }
-
-		  if (problem)
-		    {
-		      for (l = 2; l <= trigsaroundp.Size()-1; l++)
-			{
-			  tn1 = trigsaroundp.Get(l-1);
-			  tn2 = trigsaroundp.Get(l);
-			  const STLTriangle& t1 = GetTriangle(tn1);
-			  const STLTriangle& t2 = GetTriangle(tn2);
-			  t1.GetNeighbourPoints(t2, p1, p2);
-			  if (IsEdge(p1,p2)) break;
-			  
-			  if ((GetChartNr(tn1) == i && GetChartNr(tn2) != i && TrigIsInOC(tn2,i)) ||
-			      (GetChartNr(tn2) == i && GetChartNr(tn1) != i && TrigIsInOC(tn1,i))) 				 
-			    {
-			      if (addedges || !GetNEPP(pn))
-				{
-				  STLEdge se(p1,p2);
-				  se.SetLeftTrig(tn1);
-				  se.SetRightTrig(tn2);
-				  int edgenum = AddEdge(se);
-				  AddEdgePP(p1,edgenum);
-				  AddEdgePP(p2,edgenum);
-				  edgecnt++;
-				}
-			      if (!addedges && !GetSpiralPoint(pn))
-				{
-				  SetSpiralPoint(pn);
-				  spworked = 1;
-				}
-			      worked = 1;
-			    }
-			}
-		    }
-		  //backwards:
-		  problem = 0;
-		  for (l = trigsaroundp.Size()-1; l >= 2; l--)
-		    {
-		      tn1 = trigsaroundp.Get(l+1);
-		      tn2 = trigsaroundp.Get(l);
-		      const STLTriangle& t1 = GetTriangle(tn1);
-		      const STLTriangle& t2 = GetTriangle(tn2);
-		      t1.GetNeighbourPoints(t2, p1, p2);
-		      if (IsEdge(p1,p2)) break;
-		      
-		      if (GetChartNr(tn2) != i && !TrigIsInOC(tn2,i)) {problem = 1;}
-		    }
-		  if (problem)
-		    for (l = trigsaroundp.Size()-1; l >= 2; l--)
-		      {
-			tn1 = trigsaroundp.Get(l+1);
-			tn2 = trigsaroundp.Get(l);
-			const STLTriangle& t1 = GetTriangle(tn1);
-			const STLTriangle& t2 = GetTriangle(tn2);
-			t1.GetNeighbourPoints(t2, p1, p2);
-			if (IsEdge(p1,p2)) break;
-			
-			if ((GetChartNr(tn1) == i && GetChartNr(tn2) != i && TrigIsInOC(tn2,i)) ||
-			    (GetChartNr(tn2) == i && GetChartNr(tn1) != i && TrigIsInOC(tn1,i))) 				 
-			  {
-			    if (addedges || !GetNEPP(pn))
-			      {
-				STLEdge se(p1,p2);
-				se.SetLeftTrig(tn1);
-				se.SetRightTrig(tn2);
-				int edgenum = AddEdge(se);
-				AddEdgePP(p1,edgenum);
-				AddEdgePP(p2,edgenum);
-				edgecnt++;
-			      }
-			    if (!addedges && !GetSpiralPoint(pn))
-			      {
-				SetSpiralPoint(pn);
-				spworked = 1;
-				//if (GetNEPP(pn) == 0) {(*mycout) << "ERROR: spiralpoint with no edge found!" << endl;}
-			      }
-			    worked = 1;
-			  }
-		      }
-
-		  if (worked)
-		    {		      
-		      //(*testout) << "set edgepoint due to spirals: pn=" << i << endl;
-		      SetLineEndPoint(pn);
-		    }
-		  if (spworked)
-		    {		
-		      /*      
-		      (*mycout) << "Warning: Critical Point " << tt.PNum(k) 
-			   << "( chart " << i << ", trig " << t
-			   << ") has been neutralized!!!" << endl;
-		      */
-		      cnt++;
-		    }
-		  //		  markedpoints.Elem(tt.PNum(k)) = 1;
-		}
-	    }
-	}
-    }
-  PrintMessage(5, "found ", cnt, " critical points!");
-  PrintMessage(5, "added ", edgecnt, " edges due to critical points!");
-
-  PopStatus();
-
-  //search points where inner chart and outer chart and "no chart" trig come together at edge-point
-
-  PrintMessage(7,"search for special chart points");
-  for (i = 1; i <= GetNOCharts(); i++)
-    {
-      STLChart& chart = GetChart(i);
-      for (j = 1; j <= chart.GetNChartT(); j++)
-	{
-	  int t = chart.GetChartTrig(j); 
-	  const STLTriangle& tt = GetTriangle(t);
-
-	  for (k = 1; k <= 3; k++)
-	    {
-	      pn = tt.PNum(k);
-	      if (GetNEPP(pn) == 2)
-		{
-		  onoc = 0;
-		  notonoc = 0;
-		  for (n = 1; n <= trigsperpoint.EntrySize(pn); n++)
-		    {
-		      tpp = trigsperpoint.Get(pn,n);
-		      if (tpp != t && GetChartNr(tpp) != i)
-			{
-			  if (TrigIsInOC(tpp,i)) {onoc = 1;}
-			  if (!TrigIsInOC(tpp,i)) {notonoc = 1;}
-			}
-		    }
-		  if (onoc && notonoc && !IsLineEndPoint(pn)) 
-		    {
-		      GetSortedTrianglesAroundPoint(pn,t,trigsaroundp);
-		      int here = 1; //we start on this side of edge, !here = there
-		      int thereOC = 0;
-		      int thereNotOC = 0;
-		      for (l = 2; l <= trigsaroundp.Size(); l++)
-			{
-			  GetTriangle(trigsaroundp.Get(l-1)).
-			    GetNeighbourPoints(GetTriangle(trigsaroundp.Get(l)), p1, p2);
-			  if (IsEdge(p1,p2)) {here = (here+1)%2;}
-			  if (!here && TrigIsInOC(trigsaroundp.Get(l),i)) {thereOC = 1;}
-			  if (!here && !TrigIsInOC(trigsaroundp.Get(l),i)) {thereNotOC = 1;}
-			}
-		      if (thereOC && thereNotOC)
-			{
-			  //(*mycout) << "Special OCICnotC - point " << pn << " found!" << endl;
-			  //(*testout) << "set edgepoint due to spirals: pn=" << i << endl;
-			  SetLineEndPoint(pn);
-			}
-		    }
-		}
-	    }
-	}
-    }
-  PrintMessage(5,"have now ", GetNE(), " edges with yellow angle = ", stlparam.yangle, " degree");
-}
-
-//get trigs at a point, started with starttrig, then every left
-void STLGeometry :: GetSortedTrianglesAroundPoint(int p, int starttrig, ARRAY<int>& trigs)
-{
-  int acttrig = starttrig;
-  trigs.SetAllocSize(trigsperpoint.EntrySize(p));
-  trigs.SetSize(0);
-  trigs.Append(acttrig);
-  int i, j, t, p1, p2, locindex1, locindex2;
-
-  //(*mycout) << "trigs around point " << p << endl;
-
-  int end = 0;
-  while (!end)
-    {
-      const STLTriangle& at = GetTriangle(acttrig);
-      for (i = 1; i <= trigsperpoint.EntrySize(p); i++)
-	{
-	  t = trigsperpoint.Get(p,i);
-	  const STLTriangle& nt = GetTriangle(t);
-	  if (at.IsNeighbourFrom(nt))
-	    {
-	      at.GetNeighbourPoints(nt, p1, p2);
-	      if (p2 == p) {Swap(p1,p2);}
-	      if (p1 != p) {PrintSysError("In GetSortedTrianglesAroundPoint!!!");}
-	      
-	      for (j = 1; j <= 3; j++) 
-		{
-		  if (at.PNum(j) == p1) {locindex1 = j;};
-		  if (at.PNum(j) == p2) {locindex2 = j;};
-		}
-	      if ((locindex2+1)%3+1 == locindex1) 
-		{
-		  if (t != starttrig)
-		    {
-		      trigs.Append(t);
-		      //		      (*mycout) << "trig " << t << endl;
-		      acttrig = t;
-		    }
-		  else
-		    {
-		      end = 1;
-		    }
-		  break;
-		}
-	    }
-	}
-    }
-  
-}
-
-/*
-int STLGeometry :: NeighbourTrig(int trig, int nr) const
-{
-  return neighbourtrigs.Get(trig,nr);
-}
-*/
-
-
-
-void STLGeometry :: SmoothGeometry ()
-{
-  int i, j, k;
-  
-  int np = GetNP();
-  double maxerr0, maxerr;
-
-  for (i = 1; i <= np; i++)
-    {
-      if (GetNEPP(i)) continue;
-      
-      maxerr0 = 0;
-      for (j = 1; j <= NOTrigsPerPoint(i); j++)
-	{
-	  int tnum = TrigPerPoint(i, j);
-	  double err = Angle (GetTriangle(tnum).Normal (), 
-			      GetTriangle(tnum).GeomNormal(GetPoints()));
-	  if (err > maxerr0)
-	    maxerr0 = err;
-	}
-
-      Point3d pi = GetPoint (i);
-      if (maxerr0 < 1.1) continue;    // about 60 degree
-
-      maxerr0 /= 2;  // should be at least halfen
-      
-      for (k = 1; k <= NOTrigsPerPoint(i); k++)
-	{
-	  const STLTriangle & trig = GetTriangle (TrigPerPoint (i, k));
-	  Point3d c = Center(GetPoint (trig.PNum(1)),
-			     GetPoint (trig.PNum(2)),
-			     GetPoint (trig.PNum(3)));
-
-	  Point3d np = pi + 0.1 * (c - pi);
-	  SetPoint (i, np);
-	  
-	  maxerr = 0;
-	  for (j = 1; j <= NOTrigsPerPoint(i); j++)
-	    {
-	      int tnum = TrigPerPoint(i, j);
-	      double err = Angle (GetTriangle(tnum).Normal (), 
-				  GetTriangle(tnum).GeomNormal(GetPoints()));
-	      if (err > maxerr)
-		maxerr = err;
-	    }
-	  
-	  if (maxerr < maxerr0)
-	    {
-	      pi = np;
-	    }
-	}
-
-      SetPoint (i, pi);
-    }
-}
-}
diff --git a/contrib/Netgen/libsrc/stlgeom/stlgeom.hpp b/contrib/Netgen/libsrc/stlgeom/stlgeom.hpp
deleted file mode 100644
index c9bfb1e53528b8e0653c002ee0a1a17d8609babc..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stlgeom.hpp
+++ /dev/null
@@ -1,450 +0,0 @@
-#ifndef FILE_STLGEOM
-#define FILE_STLGEOM
-
-/**************************************************************************/
-/* File:   stlgeom.hpp                                                     */
-/* Author: Joachim Schoeberl                                              */
-/* Author2: Johannes Gerstmayr                                            */
-/* Date:   26. Jul. 99                                                    */
-/**************************************************************************/
-
-/**
-   STL Geometry
-
-
-   Terminology:
-   
-   Point ... coordinates of STL triangles
-   Triangle  (short Trig)  STL triangle
-   TopEdge .... edge in topology, boundary of STL triangles (many)
-   Edge .... Edges which will occur in the mesh (confirmed edges, less)
-*/
-
-
-#include <gprim.hpp>
-#include <meshing.hpp>
-
-
-
-namespace netgen
-{
-  extern int IsInArray(int n, const ARRAY<int>& ia);
-  extern int AddIfNotExists(ARRAY<int>& list, int x);
-
-
-#include "stltopology.hpp"
-#include "stltool.hpp"
-#include "stlline.hpp"
-
-
-
-
-
-
-
-  class STLEdgeDataList
-  {
-    ARRAY<int> storedstatus;
-    STLTopology & geom;
-  public:
-  
-    STLEdgeDataList(STLTopology & ageom);
-    ~STLEdgeDataList();
-
-    void Store ();
-    void Restore ();
-
-    void SetSize(int /* size */) { };
-    void Clear() { };
-    int Size() const { return geom.GetNTE(); }
-    const STLTopEdge & Get(int i) const { return geom.GetTopEdge(i); }
-    STLTopEdge & Elem(int i) { return geom.GetTopEdge(i); }
-
-    int GetNEPP(int pn) const {return geom.NTopEdgesPerPoint(pn); }
-    int GetEdgePP(int pn, int vi) const {return geom.TopEdgePerPoint(pn, vi);};
-
-    //void AddEdgePP(int pn, int vn) { } ;
-
-    void ResetAll();
-    void ChangeStatus(int status1, int status2);
-
-    int GetEdgeNum(int np1, int np2) const
-    { return geom.GetTopEdgeNum (np1, np2); }
-
-    int GetNConfEdges() const;
-
-    void Write(ofstream& of) const;
-    void Read(ifstream& ifs);
-
-    void BuildLineWithEdge(int ep1, int ep2, ARRAY<twoint>& line);
-    void BuildClusterWithEdge(int ep1, int ep2, ARRAY<twoint>& line);
-
-    int GetNEPPStat(int p, int status) const;
-    int GetNConfCandEPP(int p) const;
-  };
-
-
-
-
-
-
-  class STLGeometry : public STLTopology
-  {
-    // edges to be meshed:
-    ARRAY<STLEdge> edges;
-    //edges per point
-    TABLE<int> edgesperpoint;
-
-    // line: a connection of edges
-    ARRAY<STLLine*> lines;
-    ARRAY<int> lineendpoints; //per geometrypoint, 1 = is endpoint; 0 = no endpoint,
-
-    ARRAY<Vec3d> normals; //normals belong to points!
-
-    ARRAY<twoint> externaledges;
-
-    int undoexternaledges;
-    ARRAY<twoint> storedexternaledges;
-
-    STLEdgeDataList edgedata;
-    //  STLEdgeDataList edgedata_store;
-    int calcedgedataanglesnew;
-
-    int edgedatastored;
-
-
-
-    int facecnt; 
-    //meshpoint is only set, if an edge is at this point!!!
-
-    ARRAY<int> vicinity; //is one, if a triangle belongs to vicinity (eg. of selecttrig)
-    ARRAY<int> markedtrigs; //is one, if a triangle belongs to marked triangles (calcdirtystrigs)
-    ARRAY<Point3d> markedsegs; //every pointpair is a segment!!!  
-    ARRAY<twoint> selectedmultiedge;
-
-
-    //spiralpoints:
-    ARRAY<int> spiralpoints;
-    //
-    ARRAY<STLChart*> atlas;
-    //marks all already charted trigs with chartnumber
-    ARRAY<int> chartmark; 
-    //outerchartspertrig, ascending sorted
-    TABLE<int> outerchartspertrig;
-
-
-    //for meshing and project:
-    ARRAY<int> meshcharttrigs; //per trig: 1=belong to chart, 0 not
-    int meshchart;
-
-    ARRAY<int> ha_points;  // help array, np long, filled with 0 
-
-
-    // sharp geometric edges not declared as edges
-    // (not considered for spiral check)
-    INDEX_2_HASHTABLE<int> * smoothedges;
-
-
-    //transformation:
-    Vec<3> meshtrignv;
-    Vec<3> ex, ey, ez;
-    Point<3> p1;
-
-  public:
-    int edgesfound;
-    int surfacemeshed;
-    int surfaceoptimized;
-    int volumemeshed;
-
-    int trigsconverted; //when STLTriangles exist -> 1
-
-    //for selecting nodes
-    //int selecttrig, nodeofseltrig;
-
-    //only for testing;
-    ARRAY<STLLine*> meshlines;
-    ARRAY<Point3d> meshpoints;
-
-  public:
-    STLGeometry();
-    virtual ~STLGeometry();
-
-
-    void Clear();
-
-
-
-    void STLInfo(double* data);
-    //stldoctor:
-    void SmoothNormals();
-    void MarkNonSmoothNormals();
-
-    void CalcEdgeData();
-    void CalcEdgeDataAngles();
-
-    const STLEdgeDataList& EdgeDataList() const {return edgedata;}
-
-    void UndoEdgeChange();
-    void StoreEdgeData();
-    void RestoreEdgeData();
-
-    //void ClearSelectedMultiEdge() {selectedmultiedge.SetSize(0);}
-    //void AddSelectedMultiEdge(twoint ep) {selectedmultiedge.Append(ep);}
-    //int SelectedMultiEdgeSize() {return selectedmultiedge.Size();}
-    const ARRAY<twoint>& SelectedMultiEdge() {return selectedmultiedge;}
-    twoint GetNearestSelectedDefinedEdge();
-    void BuildSelectedMultiEdge(twoint ep);
-    void BuildSelectedEdge(twoint ep);
-    void BuildSelectedCluster(twoint ep);
-
-    void ImportEdges();
-    void AddEdges(const ARRAY<Point<3> >& eps);
-    void ExportEdges();
-    void LoadEdgeData(const char* file);
-    void SaveEdgeData(const char* file);
-    //  void SetEdgeAtSelected(int mode);
-  
-
-    void STLDoctorConfirmEdge();
-    void STLDoctorCandidateEdge();
-    void STLDoctorExcludeEdge();
-    void STLDoctorUndefinedEdge();
-
-    void STLDoctorSetAllUndefinedEdges();
-    void STLDoctorEraseCandidateEdges();
-    void STLDoctorConfirmCandidateEdges();
-    void STLDoctorConfirmedToCandidateEdges();
-
-    void STLDoctorDirtyEdgesToCandidates();
-    void STLDoctorLongLinesToCandidates();
-
-    void UndoExternalEdges();
-    void StoreExternalEdges();
-    void RestoreExternalEdges();
-
-    void ImportExternalEdges(const char * filename);  // Flame edges, JS
-    //  void LoadExternalEdges();
-
-    void BuildExternalEdgesFromEdges();
-    void SaveExternalEdges();
-    void AddExternalEdgeAtSelected();
-    void AddClosedLinesToExternalEdges();
-    void AddLongLinesToExternalEdges();
-    void AddAllNotSingleLinesToExternalEdges();
-    void STLDoctorBuildEdges();
-    void AddExternalEdgesFromGeomLine();
-    void DeleteDirtyExternalEdges();
-    void DeleteExternalEdgeAtSelected();
-    void DeleteExternalEdgeInVicinity();
-    void AddExternalEdge(int p1, int p2);
-    void DeleteExternalEdge(int p1, int p2);
-    int IsExternalEdge(int p1, int p2);
-    int NOExternalEdges() const {return externaledges.Size();}
-    twoint GetExternalEdge(int i) const {return externaledges.Get(i);}
-
-    void DestroyDirtyTrigs();
-    void CalcNormalsFromGeometry();
-    void MoveSelectedPointToMiddle();
-    void NeighbourAnglesOfSelectedTrig();
-    void PrintSelectInfo();
-    void ShowSelectedTrigChartnum();
-    void ShowSelectedTrigCoords();
-    void SmoothGeometry ();
-
-
-    void LoadMarkedTrigs();
-    void SaveMarkedTrigs();
-    void ClearMarkedSegs() {markedsegs.SetSize(0);}
-    void AddMarkedSeg(const Point<3> & p1, const Point<3> & p2) 
-    {
-      markedsegs.Append(p1);markedsegs.Append(p2);
-    }
-
-    void GetMarkedSeg(int i, Point<3> & p1, Point<3> & p2) 
-    {
-      p1=markedsegs.Get(i*2-1); 
-      p2=markedsegs.Get(i*2);
-    }
-    int GetNMarkedSegs() {return markedsegs.Size()/2;}
-    void CalcVicinity(int starttrig);
-    void GetVicinity(int starttrig, int size, ARRAY<int>& vic);
-
-    int Vicinity(int trig) const;
-
-    void InitMarkedTrigs();
-    void MarkDirtyTrigs();
-    void SmoothDirtyTrigs();
-    void GeomSmoothRevertedTrigs();
-    void MarkRevertedTrigs();
-    double CalcTrigBadness(int i);
-    int IsMarkedTrig(int trig) const;
-    void SetMarkedTrig(int trig, int num);
-    void MarkTopErrorTrigs ();
-
-    //Selected triangle
-    void SetSelectTrig(int trig);
-    int GetSelectTrig() const;
-    void SetNodeOfSelTrig(int n);
-    int GetNodeOfSelTrig() const;
-
-
-    int AddNormal(const Vec3d& n) {return normals.Append(n);}
-    const Vec3d & GetNormal(int nr) const {return normals.Get(nr);}
-    void SetNormal(int nr, const Vec3d& n) {normals.Elem(nr) = n;}
-
-    int AddEdge(const STLEdge& v) {return edges.Append(v);}
-    int AddEdge(int p1, int p2);
-
-    STLEdge GetEdge(int nr) {return edges.Get(nr);}
-    int GetNE() {return edges.Size();}
-
-    double Area();
-
-    double GetAngle(int t1, int t2);
-    double GetGeomAngle(int t1, int t2);
-    //if triangles t1 and t2 touch, return 1 and in p1, p2 the touching points
-    //int TrigsTouch(int t1, int t2, int& p1, int& p2);
-
-
-  
-    ///
-
-    ///ReadTriangle->STLTriangle, initialise some important variables, always after load!!!
-    virtual void InitSTLGeometry (const ARRAY<STLReadTriangle> & readtrigs);
-    virtual void TopologyChanged(); //do some things, if topology changed!
-    int CheckGeometryOverlapping();
-
-    //get NO edges per point
-    int GetEPPSize() const {return edgesperpoint.Size();};
-    int GetNEPP(int pn) 
-    {
-      if (edgesperpoint.Size() == 0) {BuildEdgesPerPoint();}
-      return edgesperpoint.EntrySize(pn);
-    };
-    int GetEdgePP(int pn, int vi)
-    {
-      if (edgesperpoint.Size() == 0) {BuildEdgesPerPoint();}
-      return edgesperpoint.Get(pn,vi);
-    };
-    void AddEdgePP(int pn, int vn) {edgesperpoint.Add1(pn,vn);};
-    //von 2 punkten ermitteln, ob sie eine Kante sind
-    int IsEdge(int p1, int p2);
-    int IsEdgeNum(int p1, int p2);
-
-    ///Build EdgeSegments
-    void ClearEdges();
-    void BuildEdges();
-    void BuildEdgesPerPoint();
-    void UseExternalEdges();
-
-
-    void FindEdgesFromAngles();
-    void CalcFaceNums();
-    int GetNOBodys();
-    int GetNOFaces() {return facecnt;}
-    void LinkEdges();
-
-    void AddConeAndSpiralEdges();
-    void AddFaceEdges(); //each face should have at least one starting edge (outherwise it won't be meshed)
-
-    void GetDirtyChartTrigs(int chartnum, STLChart& chart, const ARRAY<int>& outercharttrigs, 
-			    ARRAY<int>& chartpointchecked, ARRAY<int>& dirtytrigs);
-
-    void ClearSpiralPoints();
-    void SetSpiralPoint(int pn) {spiralpoints.Elem(pn) = 1;};
-    int GetSpiralPoint(int pn) const {return spiralpoints.Get(pn);};
-
-    void GetSortedTrianglesAroundPoint(int p, int starttrig, ARRAY<int>& trigs);
-
-    // smooth edges: sharp geometric edges not declared as edges
-    void BuildSmoothEdges ();
-    int IsSmoothEdge (int pi1, int pi2) const;
-
-
-    //make charts with regions of a max. angle
-    void MakeAtlas(class Mesh & mesh);
-
-    //outerchartspertrig, sorted!
-    int GetOCPTSize() const {return outerchartspertrig.Size();};
-    int GetNOCPT(int tn) const {return outerchartspertrig.EntrySize(tn);};
-    int GetOCPT(int tn, int vi) const {return outerchartspertrig.Get(tn,vi);};
-    void SetOCPT(int tn, int vi, int ocn) {outerchartspertrig.Set(tn,vi,ocn);};
-    void AddOCPT(int tn, int ocn) {outerchartspertrig.Add1(tn, ocn);};
-    int TrigIsInOC(int tn, int ocn) const;
- 
-    //get chart number of a trig or 0 if unmarked
-    int GetChartNr(int i) const;
-    int GetMarker(int i) const 
-    { return chartmark.Get(i); }
-    void SetMarker(int nr, int m);
-    int GetNOCharts() const;
-    //get a chart from atlas
-    const STLChart& GetChart(int nr) const;
-    STLChart& GetChart(int nr) {return *(atlas.Get(nr));};
-    int AtlasMade() const;
-  
-    void GetInnerChartLimes(ARRAY<twoint>& limes, int chartnum);
-
-    //FOR MESHING
-    int GetMeshChartNr () { return meshchart; }
-    void GetMeshChartBoundary (ARRAY<Point2d > & points,
-			       ARRAY<Point3d > & points3d,
-			       ARRAY<INDEX_2> & lines, double h);
-
-
-    Point<3> PointBetween(const Point<3> & p1, int t1, const Point<3> & p2, int t2);
-
-    //select triangles in meshcharttrigs of actual (defined by trig) whole chart
-    void PrepareSurfaceMeshing();
-    //
-    void DefineTangentialPlane(const Point<3> & ap1, const Point<3> & ap2, int trig);
-    //
-    void SelectChartOfTriangle (int trignum);
-    //
-    void SelectChartOfPoint (const Point<3> & p);
-    //
-    const Vec<3> & GetChartNormalVector () const { return meshtrignv; }
-
-    // list of trigs
-    void ToPlane (const Point<3> & locpoint, int * trigs, Point<2> & plainpoint, 
-		  double h, int& zone, int checkchart);
-    //return 0, wenn alles OK, 1 sonst
-    int FromPlane (const Point<2> & plainpoint, Point<3> & locpoint, double h);
-  
-    //get nearest point in actual chart and return any triangle where it lies on
-    int ProjectNearest(Point<3> & p3d) const;
-    //project point with normal nv from last define tangential plane
-
-    int LastTrig() const;
-    int Project(Point<3> & p3d) const;
-    int ProjectOnWholeSurface (Point<3> & p3d) const;
-
-    int GetNLines() const {return lines.Size();}
-    int AddLine(STLLine* line) {return lines.Append(line);}
-    STLLine* GetLine(int nr) const {return lines.Get(nr);}
-    int GetLineP(int lnr, int pnr) const {return lines.Get(lnr)->PNum(pnr);}
-    int GetLineNP(int nr) const {return lines.Get(nr)->NP();}
-
-    void SetLineEndPoint(int pn);
-    int IsLineEndPoint(int pn);
-    int LineEndPointsSet() const {return lineendpoints.Size() == GetNP();}
-    void ClearLineEndPoints();
-
-    void RestrictLocalH(class Mesh & mesh, double gh);
-    void RestrictLocalHCurv(class Mesh & mesh, double gh);
-    void RestrictHChartDistOneChart(int chartnum, ARRAY<int>& acttrigs, class Mesh & mesh, 
-				    double gh, double fact, double minh);
-
-    friend class MeshingSTLSurface;
-  };
- 
-
-#include "meshstlsurface.hpp"
-
-
-  extern int STLMeshingDummy (STLGeometry* stlgeometry, Mesh*& mesh,
-			      int perfstepsstart, int perfstepsend, char* optstring);
-
-
-}
-#endif
diff --git a/contrib/Netgen/libsrc/stlgeom/stlgeomchart.cpp b/contrib/Netgen/libsrc/stlgeom/stlgeomchart.cpp
deleted file mode 100644
index c2f64f5f1fdfb6cb1b1d40192467d9642acc7471..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stlgeomchart.cpp
+++ /dev/null
@@ -1,801 +0,0 @@
-//20.11.1999 third part of stlgeom.cc, functions with chart and atlas
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-#include <meshing.hpp>
-
-#include "stlgeom.hpp"
-
-namespace netgen
-{
-
-int chartdebug = 0;
-
-
-
-void STLGeometry :: MakeAtlas(Mesh & mesh)
-{
-
-  double h, h2;
-
-  h = mparam.maxh;
-   
-
-  PushStatusF("Make Atlas");
-
-  int i,j,k,l,m,ctl;
-
-  double atlasminh = 5e-3 * Dist (boundingbox.PMin(), boundingbox.PMax());
-  PrintMessage(5, "atlasminh = ", atlasminh);
-
-  //speedup for make atlas
-  if (GetNT() > 50000)
-    {
-      mesh.SetGlobalH(0.05*Dist (boundingbox.PMin(), boundingbox.PMax()));
-    }
-
-
-  atlas.SetSize(0);
-  ClearSpiralPoints();
-  BuildSmoothEdges();
-  
-
-  double chartangle = stlparam.chartangle;
-  double outerchartangle = stlparam.outerchartangle;
-
-  chartangle = chartangle/180.*M_PI;
-  outerchartangle = outerchartangle/180.*M_PI;
-
-  double coschartangle = cos(chartangle);
-  double cosouterchartangle = cos(outerchartangle);
-  double cosouterchartanglehalf = cos(0.5*outerchartangle);
-  double sinchartangle = sin(chartangle);
-  double sinouterchartangle = sin(outerchartangle);
-
-  ARRAY<int> outermark(GetNT()); //marks all trigs form actual outer region
-  ARRAY<int> outertested(GetNT()); //marks tested trigs for outer region
-  ARRAY<int> pointstochart(GetNP()); //point in chart becomes chartnum
-  ARRAY<int> innerpointstochart(GetNP()); //point in chart becomes chartnum
-  ARRAY<int> chartpoints; //point in chart becomes chartnum
-  ARRAY<int> innerchartpoints;
-  ARRAY<int> dirtycharttrigs;
-  ARRAY<int> chartpointchecked;
-
-  ARRAY<int> chartdistacttrigs; //outercharttrigs
-  chartdistacttrigs.SetSize(GetNT());
-  for (i = 1; i <= GetNT(); i++)
-    {
-      chartdistacttrigs.Elem(i) = 0;
-    }
-  
-  STLBoundary chartbound(this); //knows the actual chart boundary
-  int chartboundarydivisions = 10;
-  markedsegs.SetSize(0); //for testing!!!
-
-  chartpointchecked.SetSize(GetNP()); //for dirty-chart-trigs
-
-  outermark.SetSize(GetNT());
-  outertested.SetSize(GetNT());
-  pointstochart.SetSize(GetNP());
-  innerpointstochart.SetSize(GetNP());
-  chartmark.SetSize(GetNT());
-
-  for (i = 1; i <= GetNP(); i++)
-    {
-      innerpointstochart.Elem(i) = 0;
-      pointstochart.Elem(i) = 0;
-      chartpointchecked.Elem(i) = 0;
-    }
-
-  double eps = 1e-12 * Dist (boundingbox.PMin(), boundingbox.PMax());
-
-  int spiralcheckon = stldoctor.spiralcheck;
-  if (!spiralcheckon) {PrintWarning("++++++++++++\nspiral deactivated by user!!!!\n+++++++++++++++"); }
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      chartmark.Elem(i) = 0;
-    }
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      outermark.Elem(i) = 0;
-      outertested.Elem(i) = 0;
-    }
-
-  int markedtrigcnt = 0;
-  int found = 1;
-  double atlasarea = Area();
-  double workedarea = 0;
-  double showinc = 100.*5000./(double)GetNT();
-  double nextshow = 0;
-  Point<3> startp;
-  int lastunmarked = 1;
-  int prelastunmarked;
-
-  PrintMessage(5,"one dot per 5000 triangles: ");
-
-  while(markedtrigcnt < GetNT() && found)
-    {      
-      if (multithread.terminate)
-	{PopStatus();return;}
-
-      if (workedarea / atlasarea*100. >= nextshow) 
-      	{PrintDot(); nextshow+=showinc;}
-
-      SetThreadPercent(100.0 * workedarea / atlasarea);
-
-      /*
-      for (j = 1; j <= GetNT(); j++)
-	{
-	  outermark.Elem(j) = 0;
-	}
-      */
-      STLChart * chart = new STLChart(this);
-      atlas.Append(chart);
-
-      //find unmarked trig
-      prelastunmarked = lastunmarked;
-      j = lastunmarked;
-      found = 0;
-      while (!found && j <= GetNT())
-	{
-	  if (!GetMarker(j)) {found = 1; lastunmarked = j;}
-	  else {j++;}
-	}
-
-      chartpoints.SetSize(0);  
-      innerchartpoints.SetSize(0);
-      chartbound.Clear();
-      chartbound.SetChart(chart);
-
-      if (!found) {PrintSysError("Make Atlas, no starttrig found"); return;}
-
-      //find surrounding trigs
-      int starttrig = j;
-
-      double mindist, tdist;
-      startp = GetPoint(GetTriangle(starttrig).PNum(1));
-
-      int accepted;
-      int chartnum = GetNOCharts();
-	  
-      Vec<3> sn = GetTriangle(starttrig).Normal();
-      chart->SetNormal (startp, sn);
-
-
-      SetMarker(starttrig, chartnum);
-      markedtrigcnt++;
-      chart->AddChartTrig(starttrig);
-      chartbound.AddTriangle(GetTriangle(starttrig));
-
-      workedarea += GetTriangle(starttrig).Area(points);
-
-      for (i = 1; i <= 3; i++)
-	{	      
-	  innerpointstochart.Elem(GetTriangle(starttrig).PNum(i)) = chartnum;
-	  pointstochart.Elem(GetTriangle(starttrig).PNum(i)) = chartnum;
-	  chartpoints.Append(GetTriangle(starttrig).PNum(i));
-	  innerchartpoints.Append(GetTriangle(starttrig).PNum(i));
-	}
-
-      Vec<3> n2, n3;
-      int changed = 1;
-      int nt;
-      int ic;
-      int oldstartic = 1;
-      int oldstartic2;
-      int np1, np2;
-
-      while (changed)
-	{   
-	  changed = 0;
-	  oldstartic2 = oldstartic;
-	  oldstartic = chart->GetNT();
-	  //	      for (ic = oldstartic2; ic <= chart->GetNT(); ic++)
-	  for (ic = oldstartic2; ic <= oldstartic; ic++)
-	    {
-	      i = chart->GetTrig(ic);
-	      if (GetMarker(i) == chartnum)
-		{
-		  for (j = 1; j <= NONeighbourTrigs(i); j++)
-		    {
-		      nt = NeighbourTrig(i,j);
-		      GetTriangle(i).GetNeighbourPoints(GetTriangle(nt),np1,np2);
-		      if (GetMarker(nt) == 0 && !IsEdge(np1,np2))
-			{
-			  n2 = GetTriangle(nt).Normal();
-			  if ( (n2 * sn) >= coschartangle )
-			    {
-			      
-			      accepted = 1;
-			      /*
-				//alter spiralentest, schnell, aber ungenau
-			      for (k = 1; k <= 3; k++)
-				{
-				  //find overlapping charts:
-				  Point3d pt = GetPoint(GetTriangle(nt).PNum(k));
-				  if (innerpointstochart.Get(GetTriangle(nt).PNum(k)) != chartnum)
-				    {
-				      for (l = 1; l <= chartpoints.Size(); l++)
-					{
-					  Vec3d vptpl(GetPoint(chartpoints.Get(l)), pt);
-					  double vlen = vptpl.Length();
-					  if (vlen > 0)
-					    {
-					      vptpl /= vlen;
-					      if ( fabs( vptpl * sn) > sinchartangle )
-						{
-						  accepted = 0;
-						  break;
-						}
-					    } 
-					}
-
-				    }
-				}
-			      */
-			      
-			      int nnp1, nnp2; 
-			      int nnt; 
-			      //find overlapping charts exacter: 
-			      for (k = 1; k <= 3; k++) 
-				{ 
-				  nnt = NeighbourTrig(nt,k);
-				  if (GetMarker(nnt) != chartnum)
-				    {
-				      GetTriangle(nt).GetNeighbourPoints(GetTriangle(nnt),nnp1,nnp2);
-
-				      accepted = chartbound.TestSeg(GetPoint(nnp1),
-								    GetPoint(nnp2),
-								    sn,sinchartangle,1 /*chartboundarydivisions*/ ,points, eps);
-
-
-				      n3 = GetTriangle(nnt).Normal();
-				      if ( (n3 * sn) >= coschartangle  &&
-					   IsSmoothEdge (nnp1, nnp2) )
-					accepted = 1;
-				    }
-				  if (!accepted) {break;}
-				}
-			      
-			      /*
-				mindist = 1E50;
-				for (int ii = 1; ii <= 3; ii++)
-				{
-				tdist = Dist(GetPoint(GetTriangle(nt).PNum(ii)),startp);
-				if (tdist < mindist) {mindist = tdist;}
-				}
-				if (mindist > maxdist1) {accepted = 0;}
-			      */
-
-			      if (accepted)
-				{
-				  SetMarker(nt, chartnum); 
-				  changed = 1;
-				  markedtrigcnt++;
-				  workedarea += GetTriangle(nt).Area(points);
-				  chart->AddChartTrig(nt);
-
-				  chartbound.AddTriangle(GetTriangle(nt));
-
-				  for (k = 1; k <= 3; k++)
-				    {
-				      if (innerpointstochart.Get(GetTriangle(nt).PNum(k))
-					  != chartnum) 
-					{
-					  innerpointstochart.Elem(GetTriangle(nt).PNum(k)) = chartnum;
-					  pointstochart.Elem(GetTriangle(nt).PNum(k)) = chartnum;
-					  chartpoints.Append(GetTriangle(nt).PNum(k));
-					  innerchartpoints.Append(GetTriangle(nt).PNum(k));
-					}
-				    }
-				}
-			    }	       
-			}
-		    }
-		}
-	    }
-	}
-
-
-      //find outertrigs
-
-      //      chartbound.Clear(); 
-      // warum, ic-bound auf edge macht Probleme js ???
-
-
-      outermark.Elem(starttrig) = chartnum;
-      //chart->AddOuterTrig(starttrig);
-      changed = 1;
-      oldstartic = 1;
-      while (changed)
-	{   
-	  changed = 0;
-	  oldstartic2 = oldstartic;
-	  oldstartic = chart->GetNT();
-	  //for (ic = oldstartic2; ic <= chart->GetNT(); ic++)
-	  for (ic = oldstartic2; ic <= oldstartic; ic++)
-	    {
-	      i = chart->GetTrig(ic);
-
-	      if (outermark.Get(i) == chartnum)
-		{
-		  for (j = 1; j <= NONeighbourTrigs(i); j++)
-		    {
-		      nt = NeighbourTrig(i,j);
-		      if (outermark.Get(nt) == chartnum)
-			continue;
-
-		      const STLTriangle & ntrig = GetTriangle(nt);
-		      GetTriangle(i).GetNeighbourPoints(GetTriangle(nt),np1,np2);
-
-		      if (IsEdge (np1, np2))
-			continue;
-
-
-		      /*
-		      if (outertested.Get(nt) == chartnum)
-			continue;
-		      */
-		      outertested.Elem(nt) = chartnum;
-			  
-
-		      n2 = GetTriangle(nt).Normal();
-		      /*
-			double ang;
-			ang = Angle(n2,sn);
-			if (ang < -M_PI*0.5) {ang += 2*M_PI;}
-			    
-			(*testout) << "ang < ocharang = " << (fabs(ang) <= outerchartangle);
-			(*testout) << " = " << ( (n2 * sn) >= cosouterchartangle) << endl;
-			    
-			//			      if (fabs(ang) <= outerchartangle) 
-		      */
-		      //abfragen, ob noch im tolerierten Winkel
-		      if ( (n2 * sn) >= cosouterchartangle )
-			{
-			  accepted = 1;
-
-			  int isdirtytrig = 0;
-			  Vec<3> gn = GetTriangle(nt).GeomNormal(points);
-			  double gnlen = gn.Length();
-			  
-			  if (n2 * gn <= cosouterchartanglehalf * gnlen)
-			    {isdirtytrig = 1;}
-			  
-			  //zurueckweisen, falls eine Spiralartige outerchart entsteht
-			  int nnp1, nnp2; 
-			  int nnt; 
-			  //find overlapping charts exacter: 
-			  //do not check dirty trigs!
-			  
-
-			  if (spiralcheckon && !isdirtytrig)
-			    for (k = 1; k <= 3; k++) 
-			      { 
-				nnt = NeighbourTrig(nt,k);
-				
-				if (outermark.Elem(nnt) != chartnum)
-				  {
-				    GetTriangle(nt).GetNeighbourPoints(GetTriangle(nnt),nnp1,nnp2);
-
-				    accepted = 
-				      chartbound.TestSeg(GetPoint(nnp1),GetPoint(nnp2),
-							 sn,sinouterchartangle, 0 /*chartboundarydivisions*/ ,points, eps);
-				    
-
-				    n3 = GetTriangle(nnt).Normal();
-				    if ( (n3 * sn) >= cosouterchartangle  &&
-					 IsSmoothEdge (nnp1, nnp2) )
-				      accepted = 1;
-				  }
-				if (!accepted) {break;}
-			      }
-			  
-			  //}
-		      
-		      
-			  // outer chart is only small environment of
-			  //    inner chart:
-			  if (accepted)
-			    {
-			      accepted = 0;
-
-			      for (k = 1; k <= 3; k++)
-				{
-				  if (innerpointstochart.Get(ntrig.PNum(k)) == chartnum)
-				    {
-				      accepted = 1; 
-				      break;
-				    }
-				}
-
-			      if (!accepted)
-				for (k = 1; k <= 3; k++)
-				  {
-				    Point<3> pt = GetPoint(ntrig.PNum(k));					  
-				    h2 = sqr(mesh.GetH(pt));
-				      
-				    for (l = 1; l <= innerchartpoints.Size(); l++)
-				      {
-					tdist = Dist2(pt, GetPoint (innerchartpoints.Get(l)));
-					if (tdist < 4 * h2)
-					  {
-					    accepted = 1; 
-					    break;
-					  }
-				      }
-				    if (accepted) {break;}
-				  }
-			    }
-
-			      
-			  if (accepted)
-			    {
-			      changed = 1;
-			      outermark.Elem(nt) = chartnum;
-
-			      if (GetMarker(nt) != chartnum)
-				{
-				  chartbound.AddTriangle(GetTriangle(nt));
-				  chart->AddOuterTrig(nt);
-				  for (k = 1; k <= 3; k++)
-				    {
-				      if (pointstochart.Get(GetTriangle(nt).PNum(k))
-					  != chartnum) 
-					{
-					  pointstochart.Elem(GetTriangle(nt).PNum(k)) = chartnum;
-					  chartpoints.Append(GetTriangle(nt).PNum(k));
-					}
-				    }
-				}
-			    }
-			}	       
-		    }
-		}
-	    }            
-	}
-      //end of while loop for outer chart
-      GetDirtyChartTrigs(chartnum, *chart, outermark, chartpointchecked, dirtycharttrigs);
-      //dirtycharttrigs are local (chart) point numbers!!!!!!!!!!!!!!!!
-
-      if (dirtycharttrigs.Size() != 0 && 
-	  (dirtycharttrigs.Size() != chart->GetNChartT() || dirtycharttrigs.Size() != 1))
-	{
-	  if (dirtycharttrigs.Size() == chart->GetNChartT() && dirtycharttrigs.Size() != 1)
-	    {
-	      //if all trigs would be eliminated -> leave 1 trig!
-	      dirtycharttrigs.SetSize(dirtycharttrigs.Size() - 1);
-	    }
-	  for (k = 1; k <= dirtycharttrigs.Size(); k++)
-	    {
-	      int tn = chart->GetChartTrig(dirtycharttrigs.Get(k));
-	      outermark.Elem(tn) = 0; //not necessary, for later use
-	      SetMarker(tn, 0); 
-	      markedtrigcnt--;
-	      workedarea -= GetTriangle(tn).Area(points);
-	    }
-	  chart->MoveToOuterChart(dirtycharttrigs);
-	  lastunmarked = 1;
-	  lastunmarked = prelastunmarked;
-	}
-
-      //calculate an estimate meshsize, not to produce to large outercharts, with factor 2 larger!
-      RestrictHChartDistOneChart(chartnum, chartdistacttrigs, mesh, h, 0.5, atlasminh);
-    }
-  
-  PrintMessage(5,"");
-  PrintMessage(5,"NO charts=", atlas.Size());
-
-  int cnttrias = 0;
-  //int found2;
-  outerchartspertrig.SetSize(GetNT());
-
-  for (i = 1; i <= atlas.Size(); i++)
-    {
-      int j;
-      //found2 = 1;
-      for (j = 1; j <= GetChart(i).GetNT(); j++)
-	{
-	  int tn = GetChart(i).GetTrig(j);
-	  AddOCPT(tn,i);
-
-	}
-      
-      cnttrias += GetChart(i).GetNT();
-    }
-  PrintMessage(5, "NO outer chart trias=", cnttrias);
-
-  //sort outerchartspertrig
-  for (i = 1; i <= GetNT(); i++)
-    {
-      int j,k, swap;
-      for (k = 1; k < GetNOCPT(i); k++)
-	{
-
-	  for (j = 1; j < GetNOCPT(i); j++)
-	    {
-	      swap = GetOCPT(i,j);
-	      if (GetOCPT(i,j+1) < swap)
-		{
-		  SetOCPT(i,j,GetOCPT(i,j+1));
-		  SetOCPT(i,j+1,swap);
-		}
-	    }
-	}
-      
-      // check make atlas
-      if (GetChartNr(i) <= 0 || GetChartNr(i) > GetNOCharts()) 
-	{
-	  PrintSysError("Make Atlas: chartnr(", i, ")=0!!");
-	};
-    }
-
-  mesh.SetGlobalH(mparam.maxh);
-  
-  
-  AddConeAndSpiralEdges();
-  
-  PrintMessage(5,"Make Atlas finished");
-
-  PopStatus();
-}
-
-
-int STLGeometry::TrigIsInOC(int tn, int ocn) const
-{
-  if (tn < 1 || tn > GetNT())
-    {
-      // assert (1);
-      abort ();
-      PrintSysError("STLGeometry::TrigIsInOC illegal tn: ", tn);
-      
-      return 0;
-    }
-
-  /*
-  int firstval = 0;
-  int i;
-  for (i = 1; i <= GetNOCPT(tn); i++)
-    {
-      if (GetOCPT(tn, i) == ocn) {firstval = 1;}
-    }
-  */
-
-  int found = 0;
-
-  int inc = 1;
-  while (inc <= GetNOCPT(tn)) {inc *= 2;}
-  inc /= 2;
-
-  int start = inc;
-
-  while (!found && inc > 0)
-    {
-      if (GetOCPT(tn,start) > ocn) {inc = inc/2; start -= inc;}
-      else if (GetOCPT(tn,start) < ocn) {inc = inc/2; if (start+inc <= GetNOCPT(tn)) {start += inc;}}
-      else {found = 1;}
-    }
-
-  return GetOCPT(tn, start) == ocn;
-}
-
-int STLGeometry :: GetChartNr(int i) const
-{
-  if (i > chartmark.Size()) 
-    {
-      PrintSysError("GetChartNr(", i, ") not possible!!!");
-      i = 1;
-    }
-  return chartmark.Get(i);
-}
-/*
-int STLGeometry :: GetMarker(int i) const
-{
-  return chartmark.Get(i);
-}
-*/
-void STLGeometry :: SetMarker(int nr, int m) 
-{
-  chartmark.Elem(nr) = m;
-}
-int STLGeometry :: GetNOCharts() const
-{
-  return atlas.Size();
-}
-const STLChart& STLGeometry :: GetChart(int nr) const 
-{
-  if (nr > atlas.Size()) 
-    {
-      PrintSysError("GetChart(", nr, ") not possible!!!");
-      nr = 1;
-    }
-  return *(atlas.Get(nr));
-}
-
-int STLGeometry :: AtlasMade() const
-{
-  return chartmark.Size() != 0;
-}
-
-
-//return 1 if not exists
-int AddIfNotExists(ARRAY<int>& list, int x)
-{
-  int i;
-  for (i = 1; i <= list.Size(); i++)
-    {
-      if (list.Get(i) == x) {return 0;} 
-    }
-  list.Append(x);
-  return 1;
-}
-
-void STLGeometry :: GetInnerChartLimes(ARRAY<twoint>& limes, int chartnum)
-{
-  int j, k;
-  
-  int t, nt, np1, np2;
-  STLTriangle tt;
-  
-  limes.SetSize(0);
-
-  STLChart& chart = GetChart(chartnum);
-
-  for (j = 1; j <= chart.GetNChartT(); j++)
-    {
-      t = chart.GetChartTrig(j); 
-      const STLTriangle& tt = GetTriangle(t);
-      for (k = 1; k <= 3; k++)
-	{
-	  nt = NeighbourTrig(t,k); 
-	  if (GetChartNr(nt) != chartnum)
-	    {	      
-	      tt.GetNeighbourPoints(GetTriangle(nt),np1,np2);
-	      if (!IsEdge(np1,np2))
-		{
-		  limes.Append(twoint(np1,np2));
-		  /*
-		  p3p1 = GetPoint(np1);
-		  p3p2 = GetPoint(np2);
-		  if (AddIfNotExists(limes,np1)) 
-		    {
-		      plimes1.Append(p3p1); 
-		      //plimes1trigs.Append(t);
-		      //plimes1origin.Append(np1);
-		    }
-		  if (AddIfNotExists(limes1,np2)) 
-		    {
-		      plimes1.Append(p3p2); 
-		      //plimes1trigs.Append(t);
-		      //plimes1origin.Append(np2); 			      
-		    }
-		  //chart.AddILimit(twoint(np1,np2));
-		  
-		  for (int di = 1; di <= divisions; di++)
-		    {
-		      double f1 = (double)di/(double)(divisions+1.);
-		      double f2 = (divisions+1.-(double)di)/(double)(divisions+1.);
-		      
-		      plimes1.Append(Point3d(p3p1.X()*f1+p3p2.X()*f2,
-					     p3p1.Y()*f1+p3p2.Y()*f2,
-					     p3p1.Z()*f1+p3p2.Z()*f2));
-		      //plimes1trigs.Append(t);
-		      //plimes1origin.Append(0); 			      
-		    }
-		  */
-		}
-	    }
-	}
-    }
-}
-	 
-
-
-void STLGeometry :: GetDirtyChartTrigs(int chartnum, STLChart& chart,
-				       const ARRAY<int>& outercharttrigs,
-				       ARRAY<int>& chartpointchecked,
-				       ARRAY<int>& dirtytrigs)
-{
-  dirtytrigs.SetSize(0);
-  int j,k,n;
-
-  int np1, np2, nt;
-  int cnt = 0;
-
-  for (j = 1; j <= chart.GetNChartT(); j++)
-    {
-      int t = chart.GetChartTrig(j); 
-      const STLTriangle& tt = GetTriangle(t);
-      
-      for (k = 1; k <= 3; k++)
-	{
-	  nt = NeighbourTrig(t,k); 
-	  if (GetChartNr(nt) != chartnum && outercharttrigs.Get(nt) != chartnum)
-	    {	      
-	      tt.GetNeighbourPoints(GetTriangle(nt),np1,np2);
-	      if (!IsEdge(np1,np2))
-		{
-		  dirtytrigs.Append(j); //local numbers!!!
-		  cnt++;
-		  break; //only once per trig!!!
-		}
-	    }
-	}
-    }
-  cnt = 0;
-
-  int addedges = 0;
-  int p1, p2, tn1, tn2, l, problem, pn;
-  ARRAY<int> trigsaroundp;
-
-  for (j = chart.GetNChartT(); j >= 1; j--)
-    {
-      int t = chart.GetChartTrig(j); 
-      const STLTriangle& tt = GetTriangle(t);
-      
-      for (k = 1; k <= 3; k++)
-	{
-	  pn = tt.PNum(k);
-	  //if (chartpointchecked.Get(pn) == chartnum)
-	  //{continue;}
-	  
-	  int checkpoint = 0;
-	  for (n = 1; n <= trigsperpoint.EntrySize(pn); n++)
-	    {
-	      if (trigsperpoint.Get(pn,n) != t && //ueberfluessig???
-		  GetChartNr(trigsperpoint.Get(pn,n)) != chartnum &&
-		  outercharttrigs.Get(trigsperpoint.Get(pn,n)) != chartnum) {checkpoint = 1;};
-	    }
-	  if (checkpoint)
-	    {
-	      chartpointchecked.Elem(pn) = chartnum;
-
-	      int worked = 0;
-	      GetSortedTrianglesAroundPoint(pn,t,trigsaroundp);
-	      trigsaroundp.Append(t); //ring
-	      
-	      problem = 0;
-	      //forward:
-	      for (l = 2; l <= trigsaroundp.Size()-1; l++)
-		{
-		  tn1 = trigsaroundp.Get(l-1);
-		  tn2 = trigsaroundp.Get(l);
-		  const STLTriangle& t1 = GetTriangle(tn1);
-		  const STLTriangle& t2 = GetTriangle(tn2);
-		  t1.GetNeighbourPoints(t2, p1, p2);
-		  if (IsEdge(p1,p2)) break;
-		  
-		  if (GetChartNr(tn2) != chartnum && outercharttrigs.Get(tn2) != chartnum) {problem = 1;}
-		}
-
-	      //backwards:
-	      for (l = trigsaroundp.Size()-1; l >= 2; l--)
-		{
-		  tn1 = trigsaroundp.Get(l+1);
-		  tn2 = trigsaroundp.Get(l);
-		  const STLTriangle& t1 = GetTriangle(tn1);
-		  const STLTriangle& t2 = GetTriangle(tn2);
-		  t1.GetNeighbourPoints(t2, p1, p2);
-		  if (IsEdge(p1,p2)) break;
-		  
-		  if (GetChartNr(tn2) != chartnum && outercharttrigs.Get(tn2) != chartnum) {problem = 1;}
-		}
-	      if (problem && !IsInArray(j,dirtytrigs))
-		{
-		  dirtytrigs.Append(j);
-		  cnt++;
-		  break; //only once per triangle
-		}
-	    }
-	}
-    }
-  
-}
-
-}
diff --git a/contrib/Netgen/libsrc/stlgeom/stlgeommesh.cpp b/contrib/Netgen/libsrc/stlgeom/stlgeommesh.cpp
deleted file mode 100644
index 863019c04cf8180ba098f3ac8be20fc4e1e09aad..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stlgeommesh.cpp
+++ /dev/null
@@ -1,1592 +0,0 @@
-//20.11.1999 second part of stlgeom.cc, mainly mesh functions
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-#include <meshing.hpp>
-
-#include "stlgeom.hpp"
-
-namespace netgen
-{
-int EdgeUsed(int p1, int p2, ARRAY<INDEX_2>& edges, INDEX_2_HASHTABLE<int>& hashtab)
-{
-  if (p1 > p2) {swap (p1,p2);}
-
-  if (hashtab.Used(INDEX_2(p1,p2))) 
-    {return hashtab.Get(INDEX_2(p1,p2));}
-
-  return 0;
-}
-
-Point<3> STLGeometry :: PointBetween(const Point<3> & p1, int t1, 
-				     const Point<3> & p2, int t2)
-{
-  //funktioniert nicht in allen Fällen!
-
-  PrintWarning("Point between");
-
-
-  ClearMarkedSegs();
-
-  InitMarkedTrigs();
-  SetMarkedTrig(t1,1);
-  SetMarkedTrig(t2,1);
-
-  TABLE<Point3d> edgepoints;
-  TABLE<double> edgepointdists;
-  TABLE<int> edgepointorigines;
-  TABLE<int> edgepointoriginps;
-
-  ARRAY<int> edgetrigs;
-  ARRAY<INDEX_2> edgepointnums;
-  ARRAY<int> edgetriglocinds;
-
-  int size = 3*GetNT();
-  INDEX_2_HASHTABLE<int> hashtab(size);
-
-  int divisions = 10;
-
-  edgepoints.SetSize(size);
-  edgepointdists.SetSize(size);
-  edgepointorigines.SetSize(size);
-  edgepointoriginps.SetSize(size);
-
-  edgetrigs.SetSize(size);
-  edgepointnums.SetSize(size);
-  edgetriglocinds.SetSize(size);
-
-  ARRAY<int> edgelist1;
-  ARRAY<int> edgelist2;
-
-  edgelist1.SetSize(0);
-  edgelist2.SetSize(0);
-
-
-  int i, j, k, l, m;
-  int edgecnt = 0;
-
-  //first triangle:
-  for (i = 1; i <= 3; i++)
-    {
-      int ptn1 = GetTriangle(t1).PNum(i);
-      int ptn2 = GetTriangle(t1).PNumMod(i+1);
-
-      if (ptn1 > ptn2) {swap(ptn1,ptn2);}
-
-      Point3d pt1 = GetPoint(ptn1);
-      Point3d pt2 = GetPoint(ptn2);
-
-      edgecnt++;
-      edgetrigs.Elem(edgecnt) = t1;
-      edgepointnums.Elem(edgecnt) = INDEX_2(ptn1,ptn2);
-      hashtab.Set(edgepointnums.Get(edgecnt),edgecnt);
-
-      edgetriglocinds.Elem(edgecnt) = i;
-      edgelist1.Append(edgecnt);
-
-      for (j = 1; j <= divisions; j++)
-	{
-	  double lfact = (double)j/(double)divisions;
-	  Point3d pbtw(lfact*pt1.X()+(1.-lfact)*pt2.X(),
-		       lfact*pt1.Y()+(1.-lfact)*pt2.Y(),
-		       lfact*pt1.Z()+(1.-lfact)*pt2.Z());
-
-	  //AddMarkedSeg(p1,pbtw);
-	
-	  edgepoints.Add1(edgecnt,pbtw);
-	  edgepointdists.Add1(edgecnt,Dist(pbtw,p1));
-	  edgepointorigines.Add1(edgecnt,0);
-	  edgepointoriginps.Add1(edgecnt,0);
-	}
-    }
-
-  int finished = 0;
-  int endpointorigine = 0;
-  int endpointoriginp = 0;
-  double endpointmindist = 1E50;
-
-  int cnt = 0;
-  int maxsize = 0;
-  while (!finished)
-    {
-      finished = 1;
-      
-      if (edgelist1.Size() > maxsize) {maxsize = edgelist1.Size();}
-
-      for (i = 1; i <= edgelist1.Size(); i++)
-	{
-	  int en = edgelist1.Get(i);
-	  int trig = edgetrigs.Get(en);
-	  int edgenum = edgetriglocinds.Get(en);
-	  int tn = NeighbourTrigSorted(trig,edgenum);
-
-	  if (tn != t2)
-	    {
-	      for (k = 1; k <= 3; k++)
-		{
-		  int pnt1 = GetTriangle(tn).PNum(k);
-		  int pnt2 = GetTriangle(tn).PNumMod(k+1);
-		      
-		  if (pnt1 > pnt2) {swap(pnt1,pnt2);}
-
-		  Point3d pt1 = GetPoint(pnt1);
-		  Point3d pt2 = GetPoint(pnt2);
-		      
-		  //AddMarkedSeg(pt1,pt2);
-		  
-		  //if (!(pnt1 == ep1 && pnt2 == ep2))
-		  //  {
-		  int edgeused = 0;
-		  int edgenum = EdgeUsed(pnt1, pnt2, edgepointnums, hashtab);
-		  if (edgenum != en)
-		    {
-		      if (edgenum != 0) 
-			{edgeused = 1;}
-		      else 
-			{
-			  edgecnt++; 
-			  edgenum = edgecnt;
-			  
-			  edgetrigs.Elem(edgenum) = tn;
-			  edgepointnums.Elem(edgenum) = INDEX_2(pnt1,pnt2);
-			  hashtab.Set(edgepointnums.Get(edgenum),edgenum);
-			  edgetriglocinds.Elem(edgenum) = k;
-			}
-		      
-		      if (edgenum > size || edgenum == 0) {PrintSysError("edgenum = ", edgenum);}
-			  
-		      double minofmindist = 1E50;
-		      int changed = 0;
-		      
-		      for (l = 1; l <= divisions; l++)
-			{
-			  double lfact = (double)l/(double)divisions;
-			  Point3d pbtw(lfact*pt1.X()+(1.-lfact)*pt2.X(),
-				       lfact*pt1.Y()+(1.-lfact)*pt2.Y(),
-				       lfact*pt1.Z()+(1.-lfact)*pt2.Z());
-			  
-			  double mindist = 1E50;
-			  int index=0;
-			  
-			  for (m = 1; m <= divisions; m++)
-			    {
-			      const Point3d& p = edgepoints.Get(en,m);
-			      if (Dist(pbtw,p) + edgepointdists.Get(en,m) < mindist)
-				{mindist = Dist(pbtw,p) + edgepointdists.Get(en,m); index = m;}
-			    }
-			  
-			  //if (mindist < endpointmindist) {finished = 0;}
-			  if (mindist < minofmindist) {minofmindist = mindist;}
-			  
-			  
-			  if (!edgeused)
-			    {
-			      //AddMarkedSeg(pbtw,edgepoints.Get(en,index));
-
-			      edgepoints.Add1(edgenum,pbtw);
-			      edgepointdists.Add1(edgenum,mindist);
-			      edgepointorigines.Add1(edgenum,en);
-			      edgepointoriginps.Add1(edgenum,index);
-			      changed = 1;
-			    }
-			  else
-			    {
-			      if (mindist < edgepointdists.Get(edgenum,l))
-				{
-				  edgepointdists.Set(edgenum,l,mindist);
-				  edgepointorigines.Set(edgenum,l,en);
-				  edgepointoriginps.Set(edgenum,l,index);
-				  changed = 1;
-				}			      
-			    }
-			}
-		      if (minofmindist < endpointmindist-1E-10 && changed)
-			{
-			  finished = 0;
-			  edgelist2.Append(edgenum);
-			}
-		    }
-		}
-	    }
-	  else
-	    {
-	      double mindist = 1E50;
-	      int index;
-	      for (m = 1; m <= divisions; m++)
-		{
-		  const Point3d& p = edgepoints.Get(en,m);
-		  if (Dist(p2,p) + edgepointdists.Get(en,m) < mindist)
-		    {mindist = Dist(p2,p) + edgepointdists.Get(en,m); index = m;}
-		}
-	      if (mindist < endpointmindist)
-		{
-		  endpointorigine = en;
-		  endpointoriginp = index;
-		  endpointmindist = mindist;
-		}
-	    }
-	}
-      edgelist1.SetSize(0);
-      for (i = 1; i <= edgelist2.Size(); i++)
-	{
-	  edgelist1.Append(edgelist2.Get(i));
-	}
-    }
-
-  if (!endpointorigine) {PrintSysError("No connection found!");}
-
-  ARRAY<Point3d> plist;
-
-  plist.Append(p2);
-  int laste = endpointorigine;
-  int lastp = endpointoriginp;
-  int lle, llp;
-
-
-  while (laste)
-    {
-      plist.Append(edgepoints.Get(laste,lastp));
-
-      lle = laste;
-      llp = lastp; 
-      laste = edgepointorigines.Get(lle,llp);
-      lastp = edgepointoriginps.Get(lle,llp);
-    }
-
-  plist.Append(p1);
-
-  for (i = 1; i <= plist.Size()-1; i++)
-    {
-      AddMarkedSeg(plist.Get(i),plist.Get(i+1));
-    }
-
-  PrintMessage(5,"PointBetween: complexity=", maxsize);
-
-
-  Point3d pm;
-  double dist = 0;
-  int found = 0;
-  
-  for (i = 1; i <= plist.Size()-1; i++)
-    {
-      dist += Dist(plist.Get(i),plist.Get(i+1));
-      if (dist > endpointmindist*0.5) 
-	{
-	  double segl = Dist(plist.Get(i), plist.Get(i+1));
-	  double d = dist - endpointmindist * 0.5;
-	  pm = Point3d(d/segl*plist.Get(i).X() + (1.-d/segl)*plist.Get(i+1).X(),
-		       d/segl*plist.Get(i).Y() + (1.-d/segl)*plist.Get(i+1).Y(),
-		       d/segl*plist.Get(i).Z() + (1.-d/segl)*plist.Get(i+1).Z());
-	  found = 1;
-	  break;
-	}
-    }
-  if (!found) {PrintWarning("Problem in PointBetween"); pm = Center(p1,p2);}
-
-  AddMarkedSeg(pm, Point3d(0.,0.,0.));
-  
-  return pm;
-  
-}
-
-
-void STLGeometry :: PrepareSurfaceMeshing()
-{
-  meshchart = -1; //clear no old chart
-  meshcharttrigs.SetSize(GetNT());
-  int i;
-  for (i = 1; i <= GetNT(); i++) 
-    {meshcharttrigs.Elem(i) = 0;}
-}
-
-void STLGeometry::GetMeshChartBoundary (ARRAY<Point2d > & points,
-					ARRAY<Point3d > & points3d,
-					ARRAY<INDEX_2> & lines, double h)
-{
-  int i, j;
-  twoint seg, newseg;
-  int zone;
-  int psize;
-  Point<2> p2;
-
-  const STLChart& chart = GetChart(meshchart);
-
-
-  for (i = 1; i <= chart.GetNOLimit(); i++)
-    {
-      seg = chart.GetOLimit(i);
-      INDEX_2 i2;
-      for (j = 1; j <= 2; j++)
-	{
-	  int pi = (j == 1) ? seg.i1 : seg.i2;
-	  int lpi;
-	  if (ha_points.Get(pi) == 0)
-	    {
-	      const Point<3> & p3d = GetPoint (pi);
-	      Point<2> p2d;
-
-	      points3d.Append (p3d);
-	      ToPlane(p3d, 0, p2d, h, zone, 0);
-	      points.Append (p2d);
-	      
-	      lpi = points.Size();
-	      ha_points.Elem(pi) = lpi;
-	    }
-	  else
-	    lpi = ha_points.Get(pi);
-
-	  i2.I(j) = lpi;
-	}
-      lines.Append (i2);
-
-      /*
-      seg = chart.GetOLimit(i);
-      psize = points.Size();
-
-      newseg.i1 = psize+1;
-      newseg.i2 = psize+2;
-
-      ToPlane(GetPoint(seg.i1), 0, p2, h, zone, 0);
-      points.Append(p2);
-      points3d.Append (GetPoint(seg.i1));
-      ToPlane(GetPoint(seg.i2), 0, p2, h, zone, 0);
-      points.Append(p2);
-      points3d.Append (GetPoint(seg.i2));
-      lines.Append (INDEX_2 (points.Size()-1, points.Size()));
-      */
-    }
-
-  for (i = 1; i <= chart.GetNOLimit(); i++)
-    {
-      seg = chart.GetOLimit(i);
-      ha_points.Elem(seg.i1) = 0;
-      ha_points.Elem(seg.i2) = 0;
-    }
-}
-
-void STLGeometry :: DefineTangentialPlane (const Point<3> & ap1, const Point<3> & ap2, int trig)
-{
-  p1 = ap1; //save for ToPlane, in data of STLGeometry class
-  Point<3> p2 = ap2; //only locally used
-
-  meshchart = GetChartNr(trig);
-
-  if (usechartnormal)
-    meshtrignv = GetChart(meshchart).GetNormal();
-  else
-    meshtrignv = GetTriangle(trig).Normal();
-
-  //meshtrignv = GetTriangle(trig).Normal(points);
-
-  meshtrignv /= meshtrignv.Length();
-
-  GetTriangle(trig).ProjectInPlain(points, meshtrignv, p2);
-
-
-  ez = meshtrignv;
-  ez /= ez.Length();
-  ex = p2 - p1;
-  ex -= (ex * ez) * ez;
-  ex /= ex.Length();
-  ey = Cross (ez, ex);
-
-}
-
-
-void STLGeometry :: SelectChartOfTriangle (int trignum)
-{
-  meshchart = GetChartNr(trignum);
-  meshtrignv = GetTriangle(trignum).Normal();	
-}
-
-
-void STLGeometry :: SelectChartOfPoint (const Point<3> & p)
-{
-  int i, ii, j, k;
-  
-  ARRAY<int> trigsinbox;
-  
-  Box<3> box(p,p);
-  box.Increase (1e-6);
-  GetTrianglesInBox (box, trigsinbox);
-  
-
-  //  for (i = 1; i <= GetNT(); i++)
-  for (ii = 1; ii <= trigsinbox.Size(); ii++)
-    {
-      i = trigsinbox.Get(ii);
-      Point<3> hp = p;
-      if (GetTriangle(i).GetNearestPoint(points, hp) <= 1E-8)
-	{
-	  SelectChartOfTriangle (i);
-	  break;
-      }
-    }
-  return;
-}
-
-
-
-void STLGeometry :: ToPlane (const Point<3> & locpoint, int * trigs,
-			     Point<2> & plainpoint, double h, int& zone,
-			     int checkchart)
-{
-  if (checkchart)
-    {
-
-      //check if locpoint lies on actual chart:
-      zone = 0;
-      
-      
-      //  Point3d p;
-      int i = 1;
-      const STLChart& chart = GetChart(meshchart);
-      int foundinchart = 0;
-      const double range = 1e-6; //1e-4 old
-      
-      
-      
-      
-      if (trigs)
-	{
-	  int * htrigs = trigs;
-	  int ci = 1;
-	  while (*htrigs)
-	    {
-	      if (TrigIsInOC (*htrigs, meshchart))
-		{
-		  foundinchart = 1;
-		  break;
-		}
-	      htrigs++;
-	    }
-	}
-      
-      else
-	{
-	  ARRAY<int> trigsinbox;
-
-	  if (!geomsearchtreeon)
-	    {
-	      //alter chart-tree
-	      Box<3> box(locpoint, locpoint);
-	      box.Increase (range);
-	      chart.GetTrianglesInBox (box.PMin(), box.PMax(), trigsinbox);
-	    }
-	  else
-	    {
-	      ARRAY<int> trigsinbox2;
-	      Box<3> box(locpoint, locpoint);
-	      box.Increase (range);
-	      GetTrianglesInBox (box, trigsinbox2);
-	      for (i = 1; i <= trigsinbox2.Size(); i++)
-		{
-		  if (TrigIsInOC(trigsinbox2.Get(i),meshchart)) {trigsinbox.Append(trigsinbox2.Get(i));}
-		}
-	      
-	    }
-	  
-	  
-	  for (i = 1; i <= trigsinbox.Size(); i++)
-	    {
-	      Point<3> p = locpoint;
-	      if (GetTriangle(trigsinbox.Get(i)).GetNearestPoint(points, p) 
-		  <= 1E-8)
-		{
-		  foundinchart = 1;
-		  break;
-		}
-	      
-	    }
-	}
-      
-  //do not use this point (but do correct projection (joachim)
-      if (!foundinchart) 
-	{
-	  zone = -1; // plainpoint.X() = 11111; plainpoint.Y() = 11111; return; 
-	}
-    }
-  
-  else
-    {
-      zone = 0;
-    }
-  
-  //transform in plane
-  Vec<3> p1p = locpoint - p1;
-  plainpoint(0) = (p1p * ex) / h;
-  plainpoint(1) = (p1p * ey) / h;
-
-}
-
-int STLGeometry :: FromPlane (const Point<2> & plainpoint, 
-			      Point<3> & locpoint, double h)
-{
-  Point2d plainpoint2 (plainpoint);
-
-  plainpoint2.X() *= h;
-  plainpoint2.Y() *= h;
-  Vec3d p1p = plainpoint2.X() * ex + plainpoint2.Y() * ey;
-  locpoint = p1 + p1p;
-
-
-  int rv = Project(locpoint);
-  if (!rv) {return 1;} //project nicht gegangen
-  return 0;
-}
-
-int lasttrig;
-int STLGeometry :: LastTrig() const {return lasttrig;}
-
-//project normal to tangential plane
-int STLGeometry :: Project(Point<3> & p3d) const
-{
-  Point<3> p, pf;
-
-  int i, j, k;
-  int fi = 0;
-  int cnt = 0;
-  int different = 0;
-  const double lamtol = 1e-6;
-
-  const STLChart& chart = GetChart(meshchart);
-
-  int nt = chart.GetNT();
-
-   QuadraticFunction3d quadfun(p3d, meshtrignv);
- 
-   /*
-     Vec3d hv = meshtrignv;
-     hv /= hv.Length();
-     Vec3d t1, t2;
-     hv.GetNormal (t1);
-     Cross (hv, t1, t2);
-   */
-  
-  for (j = 1; j <= nt; j++)
-    {
-      i = chart.GetTrig(j);
-
-      const Point<3> & c = GetTriangle(i).center;
-      /*
-      double d1 = t1 * (c-p3d);
-      double d2 = t2 * (c-p3d);
-      */
-      /*
-      if (d1 * d1 + d2 * d2 > sqr (GetTriangle(i).rad))
-	continue;
-      */
-      if (quadfun.Eval(c) > sqr (GetTriangle(i).rad))
-	continue;
-
-      p = p3d;
-      Vec<3> lam;
-      int err = GetTriangle(i).ProjectInPlain(points, meshtrignv, p, lam);      
-      int inside = (err == 0 && lam(0) > -lamtol && 
-		    lam(1) > -lamtol && (1-lam(0)-lam(1)) > -lamtol);
-
-
-      /*
-      p = p3d;
-      GetTriangle(i).ProjectInPlain(points, meshtrignv, p);
-      if (GetTriangle(i).PointInside(points, p)) 
-      */
-      if (inside)
-	{
-	  if (cnt != 0) 
-	    {
-	      if (Dist2(p,pf)>=1E-16) 
-		{
-		  //		  (*testout) << "ERROR: found two points to project which are different" << endl;
-		  //(*testout) << "p=" << p << ", pf=" << pf << endl;
-		  different = 1;
-		}
-	    }
-	  pf = p; fi = i; cnt++;
-	}
-
-      if (inside)
-	break;
-
-    }
-
-  //  if (cnt == 2) {(*testout) << "WARNING: found 2 triangles to project" << endl;}
-  //if (cnt == 3) {(*testout) << "WARNING: found 3 triangles to project" << endl;}
-  //if (cnt > 3) {(*testout) << "WARNING: found more than 3 triangles to project" << endl;}
-
-  if (fi != 0) {lasttrig = fi;}
-  if (fi != 0 && !different) {p3d = pf; return fi;}
-
-  //  (*testout) << "WARNING: Project failed" << endl;
-  return 0;
-  
-}
-
-//project normal to tangential plane
-int STLGeometry :: ProjectOnWholeSurface(Point<3> & p3d) const
-{
-  Point<3> p, pf;
-
-  int i, k;
-  int fi = 0;
-  int cnt = 0;
-  int different = 0;
-  const double lamtol = 1e-6;
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      p = p3d;
-      Vec<3> lam;
-      int err =
-	GetTriangle(i).ProjectInPlain(points, meshtrignv, p, lam);      
-      int inside = (err == 0 && lam(0) > -lamtol && 
-		    lam(1) > -lamtol && (1-lam(0)-lam(1)) > -lamtol);
-
-      /*
-      p = p3d;
-      GetTriangle(i).ProjectInPlain(points, meshtrignv, p);
-      if (GetTriangle(i).PointInside(points, p)) 
-      */
-      if (inside)
-	{
-	  if (cnt != 0) 
-	    {
-	      if (Dist2(p,pf)>=1E-16) 
-		{
-		  //		  (*testout) << "ERROR: found two points to project which are different" << endl;
-		  //		  (*testout) << "p=" << p << ", pf=" << pf << endl;
-		  different = 1;
-		}
-	    }
-	  pf = p; fi = i; cnt++;
-	}
-    }
-  /*
-  if (cnt == 2) {(*testout) << "WARNING: found 2 triangles to project" << endl;}
-  if (cnt == 3) {(*testout) << "WARNING: found 3 triangles to project" << endl;}
-  if (cnt > 3) {(*testout) << "WARNING: found more than 3 triangles to project" << endl;}
-  */
-  if (fi != 0) {lasttrig = fi;}
-  if (fi != 0 && !different) {p3d = pf; return fi;}
-
-  //  (*testout) << "WARNING: Project failed" << endl;
-  return 0;
-  
-}
-
-
-int STLGeometry :: ProjectNearest(Point<3> & p3d) const
-{
-  Point<3> p, pf;
-
-  //set new chart
-  const STLChart& chart = GetChart(meshchart);
-  int i;
-  double nearest = 1E50;
-  double dist;
-  int ft = 0;
-
-  for (i = 1; i <= chart.GetNT(); i++)
-    {
-      p = p3d;
-      dist  = GetTriangle(chart.GetTrig(i)).GetNearestPoint(points, p);
-      if (dist < nearest)
-	{
-	  pf = p;
-	  nearest = dist;
-	  ft = chart.GetTrig(i);
-	}      
-    }
-  p3d = pf;
-  //if (!ft) {(*testout) << "ERROR: ProjectNearest failed" << endl;}
-  
-  return ft;
-}
-
-
-
-	
-//Restrict local h due to curvature for make atlas
-void STLGeometry :: RestrictLocalHCurv(class Mesh & mesh, double gh)
-{
-  PushStatusF("Restrict H due to surface curvature");
-
-  //bei jedem Dreieck alle Nachbardreiecke vergleichen, und, fallskein Kante dazwischen,
-  //die Meshsize auf ein bestimmtes Mass limitieren
-  int i,j;
-
-  int p1,p2,p3,p4;
-  Point<3> p1p, p2p, p3p, p4p;
-  double mindist, ang;
-  Vec<3> n, ntn;
-  double rzyl, sinang, localh;
-
-  //  double localhfact = 0.5;
-  double geometryignorelength = 1E-4;
-  double minlocalh = stlparam.atlasminh;
-
-  Box<3> bb = GetBoundingBox();
-  //  mesh.SetLocalH(bb.PMin() - Vec3d(10, 10, 10),bb.PMax() + Vec3d(10, 10, 10),
-  //		 mparam.grading);
-
-  //  mesh.SetGlobalH(gh);
-
-  double mincalch = 1E10;
-  double maxcalch = -1E10;
-
-  double objectsize = bb.Diam();
-  double geometryignoreedgelength = objectsize * 1e-5;
-
-  if (stlparam.resthatlasenable)
-    {
-      ARRAY<double> minh; //minimales h pro punkt
-      minh.SetSize(GetNP());
-      for (i = 1; i <= GetNP(); i++)
-	{
-	  minh.Elem(i) = gh;
-	}
-      
-      for (i = 1; i <= GetNT(); i++)
-	{
-	  SetThreadPercent((double)i/(double)GetNT()*100.);
-
-	  if (multithread.terminate)
-	    {PopStatus(); return;}
-
-	  const STLTriangle& trig = GetTriangle(i);
-	  n = GetTriangle(i).Normal();
-	  for (j = 1; j <= 3; j++)
-	    {
-	      const STLTriangle& nt = GetTriangle(NeighbourTrig(i,j));
-	      
-	      trig.GetNeighbourPointsAndOpposite(nt,p1,p2,p3);	    	    
-	      
-	      //checken, ob p1-p2 eine Kante sind
-	      if (IsEdge(p1,p2)) continue;
-	      
-	      p4 = trig.PNum(1) + trig.PNum(2) + trig.PNum(3) - p1 - p2;
-	      
-	      p1p = GetPoint(p1); p2p = GetPoint(p2); 
-	      p3p = GetPoint(p3); p4p = GetPoint(p4);
-	      
-	      double h1 = GetDistFromInfiniteLine(p1p,p2p, p4p);
-	      double h2 = GetDistFromInfiniteLine(p1p,p2p, p3p);
-	      double diaglen = Dist (p1p, p2p);
-	      
-	      if (diaglen < geometryignoreedgelength)
-		continue;
-	      rzyl = ComputeCylinderRadius 
-		(n, GetTriangle(NeighbourTrig(i,j)).Normal(), 
-		 h1, h2);
-	      
-	      
-	      if (h1 < 1e-3 * diaglen && h2 < 1e-3 * diaglen)
-		continue;
-	      if (h1 < 1e-5 * objectsize && h2 < 1e-5 * objectsize)
-		continue;
-	      
-	      
-	      //	      rzyl = mindist/(2*sinang);
-	      localh = 10.*rzyl / stlparam.resthatlasfac;
-	      if (localh < mincalch) {mincalch = localh;}
-	      if (localh > maxcalch) {maxcalch = localh;}
-
-	      if (localh < minlocalh) {localh = minlocalh;}
-	      if (localh < gh)
-		{
-		  minh.Elem(p1) = min2(minh.Elem(p1),localh);
-		  minh.Elem(p2) = min2(minh.Elem(p2),localh);
-		}
-	      
-	      //if (localh < 0.2) {localh = 0.2;}
-	      mesh.RestrictLocalHLine(p1p, p2p, localh);
-	    }
-	  
-	}
-    }
-  PrintMessage(7, "done\nATLAS H: nmin local h=", mincalch);
-  PrintMessage(7, "ATLAS H: max local h=", maxcalch);
-  PrintMessage(7, "Local h tree has ", mesh.LocalHFunction().GetNBoxes(), " boxes of size ",
-	       (int)sizeof(GradingBox));
-
-  PopStatus();
-
-}
-  //restrict local h due to near edges and due to outer chart distance
-void STLGeometry :: RestrictLocalH(class Mesh & mesh, double gh)
-{
-  
-  //bei jedem Dreieck alle Nachbardreiecke vergleichen, und, fallskein Kante dazwischen,
-  //die Meshsize auf ein bestimmtes Mass limitieren
-  int i,j;
-
-  int p1,p2,p3,p4;
-  Point3d p1p, p2p, p3p, p4p;
-  double mindist, ang;
-  Vec3d n, ntn;
-  double rzyl, sinang, localh;
-
-  //  double localhfact = 0.5;
-  double geometryignorelength = 1E-4;
-
-  Box<3> bb = GetBoundingBox();
-  //mesh.SetLocalH(bb.PMin() - Vec3d(10, 10, 10),bb.PMax() + Vec3d(10, 10, 10),
-  //		 mparam.grading);
-
-  //mesh.SetGlobalH(gh);
-
-  double mincalch = 1E10;
-  double maxcalch = -1E10;
-
-  double objectsize = bb.Diam();
-  double geometryignoreedgelength = objectsize * 1e-5;
-
-  if (stlparam.resthsurfcurvenable)
-    {
-      PushStatusF("Restrict H due to surface curvature");
-
-      ARRAY<double> minh; //minimales h pro punkt
-      minh.SetSize(GetNP());
-      for (i = 1; i <= GetNP(); i++)
-	{
-	  minh.Elem(i) = gh;
-	}
-
-      for (i = 1; i <= GetNT(); i++)
-	{
-	  SetThreadPercent((double)i/(double)GetNT()*100.);
-	  if (i%20000==19999) {PrintMessage(7, (double)i/(double)GetNT()*100. , "%");}
-
-	  if (multithread.terminate)
-	    {PopStatus(); return;}
-	  
-	  const STLTriangle& trig = GetTriangle(i);
-	  n = GetTriangle(i).Normal();
-	  for (j = 1; j <= 3; j++)
-	    {
-	      const STLTriangle& nt = GetTriangle(NeighbourTrig(i,j));
-	      
-	      trig.GetNeighbourPointsAndOpposite(nt,p1,p2,p3);	    	    
-	      
-	      //checken, ob p1-p2 eine Kante sind
-	      if (IsEdge(p1,p2)) continue;
-	      
-	      p4 = trig.PNum(1) + trig.PNum(2) + trig.PNum(3) - p1 - p2;
-	      
-	      p1p = GetPoint(p1); p2p = GetPoint(p2); 
-	      p3p = GetPoint(p3); p4p = GetPoint(p4);
-	      
-	      double h1 = GetDistFromInfiniteLine(p1p,p2p, p4p);
-	      double h2 = GetDistFromInfiniteLine(p1p,p2p, p3p);
-	      double diaglen = Dist (p1p, p2p);
-	      
-	      if (diaglen < geometryignoreedgelength)
-		continue;
-	      rzyl = ComputeCylinderRadius 
-		(n, GetTriangle (NeighbourTrig(i,j)).Normal(), 
-		 h1, h2);
-	      
-	      
-	      if (h1 < 1e-3 * diaglen && h2 < 1e-3 * diaglen)
-		continue;
-	      if (h1 < 1e-5 * objectsize && h2 < 1e-5 * objectsize)
-		continue;
-	      
-	      
-	      //	      rzyl = mindist/(2*sinang);
-	      localh = rzyl / stlparam.resthsurfcurvfac;
-	      if (localh < mincalch) {mincalch = localh;}
-	      if (localh > maxcalch) {maxcalch = localh;}
-	      if (localh < gh) 
-		{
-		  minh.Elem(p1) = min2(minh.Elem(p1),localh);
-		  minh.Elem(p2) = min2(minh.Elem(p2),localh);
-		}
-	      
-	      //if (localh < 0.2) {localh = 0.2;}
-	      mesh.RestrictLocalHLine(p1p, p2p, localh);
-	      
-	      if (localh < 0.1)
-		{
-		  localh = 0.1;
-		}
-	      
-	    }
-	}
-      PrintMessage(7, "done\nmin local h=", mincalch, "\nmax local h=", maxcalch);
-      PopStatus();
-    }
-
-  if (stlparam.resthcloseedgeenable)
-    {
-      PushStatusF("Restrict H due to close edges");
-      //geht nicht für spiralen!!!!!!!!!!!!!!!!!!
-      
-      double disttohfact = sqr(10.0 / stlparam.resthcloseedgefac);
-      int k,l;
-      double h1, h2, dist;
-      int rc = 0;
-      Point3d p3p1, p3p2;
-      double mindist = 1E50;
-      
-      PrintMessage(7,"build search tree...");
-      Box3dTree* searchtree = new Box3dTree (GetBoundingBox().PMin() - Vec3d(1,1,1),
-					     GetBoundingBox().PMax() + Vec3d(1,1,1));
-      
-      ARRAY<Point3d> pmins(GetNLines());
-      ARRAY<Point3d> pmaxs(GetNLines());
-
-      double maxhline;
-      for (i = 1; i <= GetNLines(); i++)
-	{
-	  maxhline = 0;
-	  STLLine* l1 = GetLine(i);
-	  Point3d pmin(GetPoint(l1->StartP())), pmax(GetPoint(l1->StartP())), px;
-
-	  for (j = 2; j <= l1->NP(); j++)
-	    {
-	      px = GetPoint(l1->PNum(j));
-	      maxhline = max2(maxhline,mesh.GetH(px));
-	      pmin.SetToMin (px);
-	      pmax.SetToMax (px);
-	    }
-	  Box3d box(pmin,pmax);
-	  box.Increase(maxhline);
-
-	  searchtree->Insert (box.PMin(), box.PMax(), i);
-	  pmins.Elem(i) = box.PMin();
-	  pmaxs.Elem(i) = box.PMax();
-	}
-
-      ARRAY<int> linenums;
-      int k2;
-
-      for (i = 1; i <= GetNLines(); i++)
-	{
-	  SetThreadPercent((double)i/(double)GetNLines()*100.);
-	  if (multithread.terminate)
-	    {PopStatus(); return;}
-
-	  linenums.SetSize(0);
-	  searchtree->GetIntersecting(pmins.Get(i),pmaxs.Get(i),linenums);
-	      
-	  STLLine* l1 = GetLine(i);
-	  for (j = 1; j <= l1->NP(); j++)
-	    {
-	      p3p1 = GetPoint(l1->PNum(j));
-	      h1 = sqr(mesh.GetH(p3p1));
-	      
-	      for (k2 = 1; k2 <= linenums.Size(); k2++)
-		{
-		  k = linenums.Get(k2);
-		  if (k <= i) {continue;} 
-		  /*  
-		   //old, without searchtrees
-		     for (k = i+1; k <= GetNLines(); k++)
-		     {
-		  */
-		  STLLine* l2 = GetLine(k);
-		  for (l = 1; l <= l2->NP(); l++)
-		    {
-		      const Point3d& p3p2 = GetPoint(l2->PNum(l));
-		      h2 = sqr(mesh.GetH(p3p2));
-		      dist = Dist2(p3p1,p3p2)*disttohfact;		  
-		      if (dist > 1E-12)
-			{
-			  if (dist < h1) 
-			    {
-			      mesh.RestrictLocalH(p3p1,sqrt(dist)); 
-			      rc++;
-			      mindist = min2(mindist,sqrt(dist));
-			    }
-			  if (dist < h2) 
-			    {
-			      mesh.RestrictLocalH(p3p2,sqrt(dist)); 
-			      rc++;
-			      mindist = min2(mindist,sqrt(dist));
-			    }
-			}
-		    }
-		}	  
-	    }
-	}
-      PrintMessage(5, "done\n Restricted h in ", rc, " points due to near edges!");
-      PopStatus(); 
-    }
-
-  if (stlparam.resthedgeangleenable)
-    {
-      PushStatusF("Restrict h due to close edges");
-
-      int ecnt = 0;
-      int lp1, lp2;
-      int i;
-      Vec3d v1,v2;
-      double rzyl;
-      double mincalch = 1E50;
-      double maxcalch = -1E50;
-
-      for (i = 1; i <= GetNP(); i++)
-	{
-	  SetThreadPercent((double)i/(double)GetNP()*100.);
-	  if (multithread.terminate)
-	    {PopStatus(); return;}
-
-	  if (GetNEPP(i) == 2 && !IsLineEndPoint(i))
-	    {
-	      if (GetEdge(GetEdgePP(i,1)).PNum(2) == GetEdge(GetEdgePP(i,2)).PNum(1) ||
-		  GetEdge(GetEdgePP(i,1)).PNum(1) == GetEdge(GetEdgePP(i,2)).PNum(2))
-		{
-		  lp1 = 1; lp2 = 2;
-		}
-	      else
-		{
-		  lp1 = 2; lp2 = 1;
-		}
-
-	      v1 = Vec3d(GetPoint(GetEdge(GetEdgePP(i,1)).PNum(1)),
-			 GetPoint(GetEdge(GetEdgePP(i,1)).PNum(2)));
-	      v2 = Vec3d(GetPoint(GetEdge(GetEdgePP(i,2)).PNum(lp1)),
-			 GetPoint(GetEdge(GetEdgePP(i,2)).PNum(lp2)));
-
-	      rzyl = ComputeCylinderRadius(v1, v2, v1.Length(), v2.Length());
-	      	      
-	      localh = rzyl / stlparam.resthedgeanglefac;
-	      if (localh < mincalch) {mincalch = localh;}
-	      if (localh > maxcalch) {maxcalch = localh;}
-	      
-	      if (localh != 0)
-		mesh.RestrictLocalH(GetPoint(i), localh);
-	    }	  
-	}
-      PrintMessage(7,"edge-angle min local h=", mincalch, "\nedge-angle max local h=", maxcalch);
-      PopStatus();
-    }
-
-  if (stlparam.resthchartdistenable)
-    {
-      PushStatusF("Restrict H due to outer chart distance");
-      
-      // mesh.LocalHFunction().Delete();
-
-      //berechne minimale distanz von chart zu einem nicht-outerchart-punkt in jedem randpunkt einer chart
-      
-      ARRAY<int> acttrigs; //outercharttrigs
-      acttrigs.SetSize(GetNT());
-      for (i = 1; i <= GetNT(); i++)
-	{
-	  acttrigs.Elem(i) = 0;
-	}
-      for (i = 1; i <= GetNOCharts(); i++)
-	{
-	  SetThreadPercent((double)i/(double)GetNOCharts()*100.);
-	  if (multithread.terminate)
-	    {PopStatus(); return;}
-
-	  RestrictHChartDistOneChart(i, acttrigs, mesh, gh, 1., 0.);
-	}
-      
-      PopStatus();
-    }
-
-  if (stlparam.resthlinelengthenable)
-    {
-      //restrict h due to short lines
-      PushStatusF("Restrict H due to line-length");
-      
-      double minhl = 1E50;
-      double linefact = 1./stlparam.resthlinelengthfac;
-      double l;
-      for (i = 1; i <= GetNLines(); i++)
-	{
-	  SetThreadPercent((double)i/(double)GetNLines()*100.);
-	  if (multithread.terminate)
-	    {PopStatus(); return;}
-	  
-	  l = GetLine(i)->GetLength(points);
-	  
-	  const Point3d& p1 = GetPoint(GetLine(i)->StartP());
-	  const Point3d& p2 = GetPoint(GetLine(i)->EndP());
-	  
-	  if (l != 0)
-	    {
-	      minhl = min2(minhl,l*linefact);
-	      
-	      mesh.RestrictLocalH(p1, l*linefact);
-	      mesh.RestrictLocalH(p2, l*linefact);      
-	    }
-	}
-      PopStatus();
-      PrintMessage(5, "minh due to line length=", minhl);
-  }
-}
-
-void STLGeometry :: RestrictHChartDistOneChart(int chartnum, ARRAY<int>& acttrigs, 
-					       class Mesh & mesh, double gh, double fact, double minh)
-{
-  int i = chartnum;
-  int j;
-
-  double limessafety = stlparam.resthchartdistfac*fact;  // original: 2
-  double localh;
-
-  double f1,f2;
-  //  mincalch = 1E10;
-  //maxcalch = -1E10;  
-  ARRAY<int> limes1;
-  ARRAY<int> limes2;
-	  
-  ARRAY<Point3d> plimes1;
-  ARRAY<Point3d> plimes2;
-	  
-  ARRAY<int> plimes1trigs; //check from wich trig the points come
-  ARRAY<int> plimes2trigs;
-	  
-  ARRAY<int> plimes1origin; //either the original pointnumber or zero, if new point
-
-  int divisions = 10;
-	  
-  int k, t, nt, np1, np2;
-  Point3d p3p1, p3p2;
-  STLTriangle tt;
-      
-  limes1.SetSize(0);
-  limes2.SetSize(0);
-  plimes1.SetSize(0);
-  plimes2.SetSize(0);
-  plimes1trigs.SetSize(0);
-  plimes2trigs.SetSize(0);
-  plimes1origin.SetSize(0);
-
-  STLChart& chart = GetChart(i);
-  chart.ClearOLimit();
-  chart.ClearILimit();
-
-  for (j = 1; j <= chart.GetNChartT(); j++)
-    {
-      t = chart.GetChartTrig(j); 
-      tt = GetTriangle(t);
-      for (k = 1; k <= 3; k++)
-	{
-	  nt = NeighbourTrig(t,k); 
-	  if (GetChartNr(nt) != i)
-	    {	      
-	      tt.GetNeighbourPoints(GetTriangle(nt),np1,np2);
-	      if (!IsEdge(np1,np2) && !GetSpiralPoint(np1) && !GetSpiralPoint(np2))
-		{
-		  p3p1 = GetPoint(np1);
-		  p3p2 = GetPoint(np2);
-		  if (AddIfNotExists(limes1,np1)) 
-		    {
-		      plimes1.Append(p3p1); 
-		      plimes1trigs.Append(t);
-		      plimes1origin.Append(np1); 			      
-		    }
-		  if (AddIfNotExists(limes1,np2)) 
-		    {
-		      plimes1.Append(p3p2); 
-		      plimes1trigs.Append(t);
-		      plimes1origin.Append(np2); 			      
-		    }
-		  chart.AddILimit(twoint(np1,np2));
-
-		  for (int di = 1; di <= divisions; di++)
-		    {
-		      f1 = (double)di/(double)(divisions+1.);
-		      f2 = (divisions+1.-(double)di)/(double)(divisions+1.);
-			      
-		      plimes1.Append(Point3d(p3p1.X()*f1+p3p2.X()*f2,
-					     p3p1.Y()*f1+p3p2.Y()*f2,
-					     p3p1.Z()*f1+p3p2.Z()*f2));
-		      plimes1trigs.Append(t);
-		      plimes1origin.Append(0); 			      
-		    }
-		}
-	    }
-	}
-    }
-	  
-	 
-  for (j = 1; j <= chart.GetNT(); j++)
-    {
-      acttrigs.Elem(chart.GetTrig(j)) = i;
-    }
-	  
-  for (j = 1; j <= chart.GetNOuterT(); j++)
-    {
-      t = chart.GetOuterTrig(j); 
-      tt = GetTriangle(t);
-      for (k = 1; k <= 3; k++)
-	{
-	  nt = NeighbourTrig(t,k);
-
-	  if (acttrigs.Get(nt) != i)
-	    {
-	      tt.GetNeighbourPoints(GetTriangle(nt),np1,np2);
-		      
-	      if (!IsEdge(np1,np2))
-		{
-		  p3p1 = GetPoint(np1);
-		  p3p2 = GetPoint(np2);
-			  
-		  if (AddIfNotExists(limes2,np1)) {plimes2.Append(p3p1); plimes2trigs.Append(t);}
-		  if (AddIfNotExists(limes2,np2)) {plimes2.Append(p3p2); plimes2trigs.Append(t);}
-		  chart.AddOLimit(twoint(np1,np2));
-
-		  for (int di = 1; di <= divisions; di++)
-		    {
-		      f1 = (double)di/(double)(divisions+1.);
-		      f2 = (divisions+1.-(double)di)/(double)(divisions+1.);
-			      
-		      plimes2.Append(Point3d(p3p1.X()*f1+p3p2.X()*f2,
-					     p3p1.Y()*f1+p3p2.Y()*f2,
-					     p3p1.Z()*f1+p3p2.Z()*f2));
-		      plimes2trigs.Append(t);
-		    }
-		}
-	    }
-	}
-    }
-	  
-	  
-  double chartmindist = 1E50;
-
-  if (plimes2.Size())
-    {
-      Box3d bbox;
-      bbox.SetPoint (plimes2.Get(1));
-      for (j = 2; j <= plimes2.Size(); j++)
-	bbox.AddPoint (plimes2.Get(j));
-      Point3dTree stree(bbox.PMin(), bbox.PMax());
-      for (j = 1; j <= plimes2.Size(); j++)
-	stree.Insert (plimes2.Get(j), j);
-      ARRAY<int> foundpts;
-	  
-      for (j = 1; j <= plimes1.Size(); j++)
-	{
-	  double mindist = 1E50;
-	  double dist;
-
-	  const Point3d & p1 = plimes1.Get(j);
-	  double boxs = mesh.GetH (plimes1.Get(j)) * limessafety;
-
-	  Point3d pmin = p1 - Vec3d (boxs, boxs, boxs);
-	  Point3d pmax = p1 + Vec3d (boxs, boxs, boxs);
-
-	  stree.GetIntersecting (pmin, pmax, foundpts);
-
-
-	  for (int kk = 1; kk <= foundpts.Size(); kk++)
-	    {
-	      k = foundpts.Get(kk);
-	      dist = Dist2(plimes1.Get(j),plimes2.Get(k));
-	      if (dist < mindist) 
-		{
-		  mindist = dist;
-		}
-	    }
-
-	  /*
-	    const Point3d & p1 = plimes1.Get(j);
-	    double his = mesh.GetH (plimes1.Get(j));
-
-	    double xmin = p1.X() - his * limessafety;
-	    double xmax = p1.X() + his * limessafety;	      
-	    double ymin = p1.Y() - his * limessafety;
-	    double ymax = p1.Y() + his * limessafety;	      
-	    double zmin = p1.Z() - his * limessafety;
-	    double zmax = p1.Z() + his * limessafety;	      
-
-	    for (k = 1; k <= plimes2.Size(); k++)
-	    {
-	    const Point3d & p2 = plimes2.Get(k);
-	    if (p2.X() >= xmin && p2.X() <= xmax &&
-	    p2.Y() >= ymin && p2.Y() <= ymax &&
-	    p2.Z() >= zmin && p2.Z() <= zmax)
-	    {
-	    dist = Dist2(plimes1.Get(j),plimes2.Get(k));
-	    if (dist < mindist) 
-	    {
-	    mindist = dist;
-	    }
-	    }
-	    }
-	  */
-	  mindist = sqrt(mindist);
-	  localh = mindist/limessafety;
-
-	  if (localh < minh && localh != 0) {localh = minh;} //minh is generally 0! (except make atlas)
-	  if (localh < gh && localh > 0)
-	    {
-	      mesh.RestrictLocalH(plimes1.Get(j), localh);
-	      //	      if (mindist < mincalch) {mincalch = mindist;}
-	      //	      if (mindist > maxcalch) {maxcalch = mindist;}
-	      if (mindist < chartmindist) {chartmindist = mindist;}
-	    }
-	}
-    }
-
-}
-
-
-//void * STLMeshingDummy (void *)
-int STLMeshingDummy (STLGeometry* stlgeometry, Mesh*& mesh,
-			    int perfstepsstart, int perfstepsend, char* optstring)
-{
-  if (perfstepsstart > perfstepsend) return 0;
-
-  multithread.terminate = 0;
-  int success = 1;
-  //int trialcntouter = 0;
-
-  if (perfstepsstart <= MESHCONST_MESHEDGES)
-    {
-
-      mesh = new Mesh();
-      mesh -> SetGlobalH (mparam.maxh);
-      mesh -> SetLocalH (stlgeometry->GetBoundingBox().PMin() - Vec3d(10, 10, 10),
-			 stlgeometry->GetBoundingBox().PMax() + Vec3d(10, 10, 10),
-			 mparam.grading);
-      mesh -> LoadLocalMeshSize (mparam.meshsizefilename);
-      
-      success = 0;
-  
-      //mesh->DeleteMesh();
- 
-      STLMeshing (*stlgeometry, *mesh);
-
-      stlgeometry->edgesfound = 1;
-      stlgeometry->surfacemeshed = 0;
-      stlgeometry->surfaceoptimized = 0;
-      stlgeometry->volumemeshed = 0;
-    }
-
-  if (multithread.terminate)
-    return 0;
-
-  if (perfstepsstart <= MESHCONST_MESHSURFACE && 
-      perfstepsend >= MESHCONST_MESHSURFACE)
-    {
-
-      if (!stlgeometry->edgesfound) 
-	{
-	  PrintUserError("You have to do 'analyse geometry' first!!!");
-	  return 0; 
-	}
-      if (stlgeometry->surfacemeshed || stlgeometry->surfacemeshed) 
-	{
-	  PrintUserError("Already meshed. Please start again with 'Analyse Geometry'!!!"); 
-	  return 0; 
-	}
-
-      success = 0;
-      int retval = STLSurfaceMeshing (*stlgeometry, *mesh);
-      if (retval == MESHING3_OK)
-	{
-	  PrintMessage(3,"Success !!!!");
-	  stlgeometry->surfacemeshed = 1;
-	  stlgeometry->surfaceoptimized = 0;
-	  stlgeometry->volumemeshed = 0;
-	  success = 1;
-	} 
-      else if (retval == MESHING3_OUTERSTEPSEXCEEDED)
-	{
-	  PrintError("Give up because of too many trials. Meshing aborted!");
-	}
-      else if (retval == MESHING3_TERMINATE)
-	{
-	  PrintWarning("Meshing Stopped by user!");
-	}
-      else
-	{
-	  PrintError("Surface meshing not successful. Meshing aborted!");
-	}
-      
-#ifdef STAT_STREAM
-      (*statout) << mesh->GetNSeg() << " & " << endl
-		 << mesh->GetNSE() << " & " << endl
-		 << GetTime() << " & ";
-#endif
-    }
-  if (multithread.terminate)
-    return 0;
-
-  if (success)
-    {
-      if (perfstepsstart <= MESHCONST_OPTSURFACE && 
-	  perfstepsend >= MESHCONST_OPTSURFACE)
-	{
-	  if (!stlgeometry->edgesfound) 
-	    {
-	      PrintUserError("You have to do 'meshing->analyse geometry' first!!!"); 
-	      return 0; 
-	    }
-	  if (!stlgeometry->surfacemeshed) 
-	    {
-	      PrintUserError("You have to do 'meshing->mesh surface' first!!!"); 
-	      return 0; 
-	    }
-	  if (stlgeometry->volumemeshed) 
-	    {
-	      PrintWarning("Surface optimization with meshed volume is dangerous!!!"); 
-	    }
-
-	  if (!optstring || strlen(optstring) == 0)
-	    {
-	      mparam.optimize2d = "smcm";
-	    }
-	  else
-	    {
-	      mparam.optimize2d = optstring;
-	    }
-
-	  STLSurfaceOptimization (*stlgeometry, *mesh, mparam);
-	  
-	  if (stlparam.recalc_h_opt)
-	    {
-	      mesh -> SetLocalH (stlgeometry->GetBoundingBox().PMin() - Vec3d(10, 10, 10),
-				 stlgeometry->GetBoundingBox().PMax() + Vec3d(10, 10, 10),
-				 mparam.grading);
-	      mesh -> LoadLocalMeshSize (mparam.meshsizefilename);	      
-	      mesh -> CalcLocalHFromSurfaceCurvature (stlparam.resthsurfmeshcurvfac);
-	      mparam.optimize2d = "cmsmSm";
-	      STLSurfaceOptimization (*stlgeometry, *mesh, mparam);
-#ifdef STAT_STREAM
-	      (*statout) << GetTime() << " & ";
-#endif
-
-#ifdef OPENGL
-	      extern void Render();
-	      Render();
-#endif	      
-	    }
-	  stlgeometry->surfaceoptimized = 1;
-	}
-      if (multithread.terminate)
-	return 0;
-
-      if (perfstepsstart <= MESHCONST_MESHVOLUME && 
-	  perfstepsend >= MESHCONST_MESHVOLUME)
-	{
-	  if (stlgeometry->volumemeshed) 
-	    {
-	      PrintUserError("Volume already meshed!"); return 0;
-	    }
-
-	  if (!stlgeometry->edgesfound) 
-	    {
-	      PrintUserError("You have to do 'meshing->analyse geometry' first!!!"); 
-	      return 0; 
-	    }
-	  if (!stlgeometry->surfacemeshed) 
-	    {
-	      PrintUserError("You have to do 'meshing->mesh surface' first!!!"); 
-	      return 0; 
-	    }
-	  if (!stlgeometry->surfaceoptimized) 
-	    {
-	      PrintWarning("You should do 'meshing->optimize surface' first!!!"); 
-	    }
-
-	  PrintMessage(5,"Check Overlapping boundary: ");
-	  mesh->FindOpenElements();
-	  mesh->CheckOverlappingBoundary();
-	  PrintMessage(5,"");
-	  
-	  if (stlparam.recalc_h_opt)
-	    {
-	      mesh -> SetLocalH (stlgeometry->GetBoundingBox().PMin() - Vec3d(10, 10, 10),
-				 stlgeometry->GetBoundingBox().PMax() + Vec3d(10, 10, 10),
-				 mparam.grading);	  
-	      mesh -> LoadLocalMeshSize (mparam.meshsizefilename);
-	      mesh -> CalcLocalH ();
-	    }
-	  
-	  
-	  PrintMessage(5,"Volume meshing");
-	  int retval = MeshVolume (mparam, *mesh);
-	  if (retval == MESHING3_OK)
-	    {
-	      RemoveIllegalElements(*mesh);
-	      stlgeometry->volumemeshed = 1;
-	    } 
-	  else if (retval == MESHING3_OUTERSTEPSEXCEEDED)
-	    {
-	      PrintError("Give up because of too many trials. Meshing aborted!");
-	      return 0;
-	    }
-	  else if (retval == MESHING3_TERMINATE)
-	    {
-	      PrintWarning("Meshing Stopped by user!");
-	    }
-	  else
-	    {
-	      PrintError("Volume meshing not successful. Meshing aborted!");
-	      return 0;
-	    }
-
-#ifdef STAT_STREAM
-	  (*statout) << GetTime() << " & " << endl;
-#endif
-	  MeshQuality3d (*mesh);
-	}
-
-      if (multithread.terminate)
-	return 0;
-
-      if (perfstepsstart <= MESHCONST_OPTVOLUME && 
-	  perfstepsend >= MESHCONST_OPTVOLUME)
-	{
-	  if (!stlgeometry->edgesfound) 
-	    {
-	      PrintUserError("You have to do 'meshing->analyse geometry' first!!!"); 
-	      return 0; 
-	    }
-	  if (!stlgeometry->surfacemeshed) 
-	    {
-	      PrintUserError("You have to do 'meshing->mesh surface' first!!!"); 
-	      return 0; 
-	    }
-	  if (!stlgeometry->volumemeshed) 
-	    {
-	      PrintUserError("You have to do 'meshing->mesh volume' first!!!"); 
-	      return 0; 
-	    }
-
-	  if (!optstring || strlen(optstring) == 0)
-	    {
-	      mparam.optimize3d = "cmdmstm";
-	    }
-	  else
-	    {
-	      mparam.optimize3d = optstring;
-	    }
-
-
-	  OptimizeVolume (mparam, *mesh);
-	  
-#ifdef STAT_STREAM
-	  (*statout) << GetTime() << " & " << endl;
-	  (*statout) << mesh->GetNE() << " & " << endl
-		     << mesh->GetNP() << " " << '\\' << '\\' << " \\" << "hline" << endl;
-#endif
-
-#ifdef OPENGL
-	  extern void Render();
-	  Render();
-#endif	      
-
-	}
-    }
-  
-
-  return 0;
-}
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/stlgeom/stlline.cpp b/contrib/Netgen/libsrc/stlgeom/stlline.cpp
deleted file mode 100644
index 0fe01967e66e4d1d78985a7edcc7650cc2f04b03..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stlline.cpp
+++ /dev/null
@@ -1,780 +0,0 @@
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-#include <meshing.hpp>
-
-#include "stlgeom.hpp"
-
-namespace netgen
-{
-
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//++++++++++++++  EDGE DATA     ++++++++++++++++++++++++++++++++++++++++++
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-/*
-void STLEdgeData :: Write(ofstream& of) const
-{
-  of // << angle << " "
-     << p1 << " "
-     << p2 << " "
-     << lt << " "
-     << rt << " "
-    //     << status
-     << endl;
-}
-
-void STLEdgeData :: Read(ifstream& ifs)
-{
-  // ifs >> angle;
-  ifs >> p1;
-  ifs >> p2;
-  ifs >> lt;
-  ifs >> rt;
-  //  ifs >> status;
-}
-
-
-int STLEdgeData :: GetStatus () const
-{
-  if (topedgenr <= 0 || topedgenr > top->GetNTE()) return 0;
-  return top->GetTopEdge (topedgenr).GetStatus(); 
-}
-
-void STLEdgeData ::SetStatus (int stat)
-{
-  if (topedgenr >= 1 && topedgenr <= top->GetNTE())
-    top->GetTopEdge (topedgenr).SetStatus(stat); 
-}
-
-
-float STLEdgeData :: CosAngle() const
-{
-  return top->GetTopEdge (topedgenr).CosAngle(); 
-}
-
-
-
-void STLEdgeDataList :: ResetAll()
-{
-  int i;
-  for (i = 1; i <= edgedata.Size(); i++)
-    {
-      edgedata.Elem(i).SetUndefined();
-    }
-}
-
-void STLEdgeDataList :: ResetCandidates()
-{
-  int i;
-  for (i = 1; i <= edgedata.Size(); i++)
-    {
-      if (edgedata.Get(i).Candidate())
-	{edgedata.Elem(i).SetUndefined();}
-    }
-}
-
-int STLEdgeDataList :: GetNConfEdges() const
-{
-  int i;
-  int cnt = 0;
-  for (i = 1; i <= edgedata.Size(); i++)
-    {
-      if (edgedata.Get(i).Confirmed()) {cnt++;}
-    }
-  return cnt;
-}
-
-void STLEdgeDataList :: ConfirmCandidates()
-{
-  int i;
-  for (i = 1; i <= edgedata.Size(); i++)
-    {
-      if (edgedata.Get(i).Candidate())
-	{edgedata.Elem(i).SetConfirmed();}
-    }
-}
-
-int STLEdgeDataList :: GetEdgeNum(int np1, int np2) const
-{
-  INDEX_2 ed(np1,np2);
-  ed.Sort();
-  if (hashtab.Used(ed))
-    {
-      return hashtab.Get(ed);
-    }
-
-//   int i;
-//   for (i = 1; i <= Size(); i++)
-//     {
-//       if ((Get(i).p1 == np1 && Get(i).p2 == np2) ||
-// 	  (Get(i).p2 == np1 && Get(i).p1 == np2))
-// 	{
-// 	  return i;
-// 	}
-//     }
-
-  return 0;
-}
-
-const STLEdgeDataList& STLEdgeDataList :: operator=(const STLEdgeDataList& edl)
-{
-  int i;
-  SetSize(edl.Size());
-  for (i = 1; i <= Size(); i++)
-    {
-      Add(edl.Get(i), i);
-    }
-  return *this;
-} 
-
-void STLEdgeDataList :: Add(const STLEdgeData& ed, int i)
-{
-  INDEX_2 edge(ed.p1,ed.p2);
-  edge.Sort();
-  hashtab.Set(edge, i);
-  Elem(i) = ed;
-  AddEdgePP(ed.p1,i);
-  AddEdgePP(ed.p2,i);
-}
-
-void STLEdgeDataList :: Write(ofstream& of) const
-{
-  of.precision(16);
-  int i;
-  of << Size() << endl;
-  
-  for (i = 1; i <= Size(); i++)
-    {
-      Get(i).Write(of);
-    }
-}
-
-void STLEdgeDataList :: Read(ifstream& ifs)
-{
-  int i,n;
-  ifs >> n;
-
-  SetSize(n);
-  STLEdgeData ed;
-  for (i = 1; i <= n; i++)
-    {
-      ed.Read(ifs);
-      Add(ed,i);
-    }
-}
-
-int STLEdgeDataList :: GetNEPPStat(int p, int status) const
-{
-  int i;
-  int cnt = 0;
-  for (i = 1; i <= GetNEPP(p); i++)
-    {
-      if (Get(GetEdgePP(p,i)).GetStatus() == status)
-	{
-	  cnt++;
-	}
-    }
-  return cnt;
-}
-
-int STLEdgeDataList :: GetNConfCandEPP(int p) const
-{
-  int i;
-  int cnt = 0;
-  for (i = 1; i <= GetNEPP(p); i++)
-    {
-      if (Get(GetEdgePP(p,i)).ConfCand())
-	{
-	  cnt++;
-	}
-    }
-  return cnt;
-}
-
-
-void STLEdgeDataList :: BuildLineWithEdge(int ep1, int ep2, ARRAY<twoint>& line)
-{
-  int status = Get(GetEdgeNum(ep1,ep2)).GetStatus();
-
-  int found, pstart, p, en, pnew, ennew;
-  int closed = 0;
-  int j, i;
-  for (j = 1; j <= 2; j++)
-    {
-      if (j == 1) {p = ep1;}
-      if (j == 2) {p = ep2;}
-
-      pstart = p;
-      en = GetEdgeNum(ep1,ep2);
-
-      found = 1;
-      while (found && !closed)
-	{
-	  found = 0;
-	  
-	  if (GetNEPPStat(p,status) == 2)
-	    {
-	      for (i = 1; i <= GetNEPP(p); i++)
-		{		
-		  const STLEdgeData& e = Get(GetEdgePP(p,i));
-		  if (GetEdgePP(p,i) != en && e.GetStatus() == status) 
-		    {
-		      if (e.p1 == p) 
-			{pnew = e.p2;}
-		      else 
-			{pnew = e.p1;}
-
-		      ennew = GetEdgePP(p,i);
-		    }
-		}
-	      if (pnew == pstart) {closed = 1;}
-	      else
-		{
-		  line.Append(twoint(p,pnew));
-		  p = pnew;
-		  en = ennew;
-		  found = 1;
-		}
-	    }
-	}
-    }
-  
-}
-*/
-
-
-
-
-STLEdgeDataList :: STLEdgeDataList (STLTopology & ageom)
-  : geom(ageom)
-{
-  ;
-}
-
-STLEdgeDataList :: ~STLEdgeDataList()
-{
-  ;
-}
-
-
-void STLEdgeDataList :: Store ()
-{
-  int i, ne = geom.GetNTE();
-  storedstatus.SetSize(ne);
-  for (i = 1; i <= ne; i++)
-    {
-      storedstatus.Elem(i) = Get(i).GetStatus();
-    }
-}
-
-void STLEdgeDataList :: Restore ()
-{
-  int i, ne = geom.GetNTE();
-  if (storedstatus.Size() == ne)
-    for (i = 1; i <= ne; i++)
-      geom.GetTopEdge(i).SetStatus (storedstatus.Elem(i));
-}
-
-
-void STLEdgeDataList :: ResetAll()
-{
-  int i, ne = geom.GetNTE();
-  for (i = 1; i <= ne; i++)
-    geom.GetTopEdge (i).SetStatus (ED_UNDEFINED);
-}
-
-int STLEdgeDataList :: GetNConfEdges() const
-{
-  int i, ne = geom.GetNTE();
-  int cnt = 0;
-  for (i = 1; i <= ne; i++)
-    if (geom.GetTopEdge (i).GetStatus() == ED_CONFIRMED)
-      cnt++;
-  return cnt; 
-}
-
-void STLEdgeDataList :: ChangeStatus(int status1, int status2)
-{
-  int i, ne = geom.GetNTE();
-  for (i = 1; i <= ne; i++)
-    if (geom.GetTopEdge (i).GetStatus() == status1)
-      geom.GetTopEdge (i).SetStatus (status2);
-}
-
-/*
-void STLEdgeDataList :: Add(const STLEdgeData& ed, int i)
-{
-  INDEX_2 edge(ed.p1,ed.p2);
-  edge.Sort();
-  hashtab.Set(edge, i);
-  Elem(i) = ed;
-  AddEdgePP(ed.p1,i);
-  AddEdgePP(ed.p2,i);
-}
-*/
-
-void STLEdgeDataList :: Write(ofstream& of) const
-{
-  
-  /*
-  of.precision(16);
-  int i;
-  of << Size() << endl;
-  
-  for (i = 1; i <= Size(); i++)
-    {
-      Get(i).Write(of);
-    }
-
-  */
-  of.precision(16);
-  int i, ne = geom.GetNTE();
-  //of << GetNConfEdges() << endl;
-  of << geom.GetNTE() << endl;
-
-  for (i = 1; i <= ne; i++)
-    {
-      const STLTopEdge & edge = geom.GetTopEdge(i);
-      //if (edge.GetStatus() == ED_CONFIRMED)
-      of << edge.GetStatus() << " ";
-
-      const Point3d & p1 = geom.GetPoint (edge.PNum(1));
-      const Point3d & p2 = geom.GetPoint (edge.PNum(2));
-      of << p1.X() << " "
-	 << p1.Y() << " "
-	 << p1.Z() << " "
-	 << p2.X() << " "
-	 << p2.Y() << " "
-	 << p2.Z() << endl;
-    }
-  
-}
-
-void STLEdgeDataList :: Read(ifstream& ifs)
-{
-  int i, nce;
-  Point3d p1, p2;
-  int pi1, pi2;
-  int status, ednum;
-
-  ifs >> nce;
-  for (i = 1; i <= nce; i++)
-    {
-      ifs >> status;
-      ifs >> p1.X() >> p1.Y() >> p1.Z();
-      ifs >> p2.X() >> p2.Y() >> p2.Z();
-
-      pi1 = geom.GetPointNum (p1);
-      pi2 = geom.GetPointNum (p2);
-      ednum = geom.GetTopEdgeNum (pi1, pi2);
-
-
-      if (ednum)
-	{ 
-	  geom.GetTopEdge(ednum).SetStatus (status);
-	//	geom.GetTopEdge (ednum).SetStatus (ED_CONFIRMED);
-	}
-    }
-    /*
-  int i,n;
-  ifs >> n;
-
-  SetSize(n);
-  STLEdgeData ed;
-  for (i = 1; i <= n; i++)
-    {
-      ed.Read(ifs);
-      Add(ed,i);
-    }
-  */
-}
-
-int STLEdgeDataList :: GetNEPPStat(int p, int status) const
-{
-  int i;
-  int cnt = 0;
-  for (i = 1; i <= GetNEPP(p); i++)
-    {
-      if (Get(GetEdgePP(p,i)).GetStatus() == status)
-	{
-	  cnt++;
-	}
-    }
-  return cnt;
-}
-
-int STLEdgeDataList :: GetNConfCandEPP(int p) const
-{
-  int i;
-  int cnt = 0;
-  for (i = 1; i <= GetNEPP(p); i++)
-    {
-      if (Get(GetEdgePP(p,i)).GetStatus() == ED_CANDIDATE || 
-	  Get(GetEdgePP(p,i)).GetStatus() == ED_CONFIRMED)
-	{
-	  cnt++;
-	}
-    }
-  return cnt;
-}
-
-
-void STLEdgeDataList :: BuildLineWithEdge(int ep1, int ep2, ARRAY<twoint>& line)
-{
-  int status = Get(GetEdgeNum(ep1,ep2)).GetStatus();
-
-  int found, pstart, p, en, pnew, ennew;
-  int closed = 0;
-  int j, i;
-  for (j = 1; j <= 2; j++)
-    {
-      if (j == 1) {p = ep1;}
-      if (j == 2) {p = ep2;}
-
-      pstart = p;
-      en = GetEdgeNum(ep1,ep2);
-
-      found = 1;
-      while (found && !closed)
-	{
-	  found = 0;
-	  
-	  if (GetNEPPStat(p,status) == 2)
-	    {
-	      for (i = 1; i <= GetNEPP(p); i++)
-		{		
-		  const STLTopEdge & e = Get(GetEdgePP(p,i));
-		  if (GetEdgePP(p,i) != en && e.GetStatus() == status) 
-		    {
-		      if (e.PNum(1) == p) 
-			{pnew = e.PNum(2);}
-		      else 
-			{pnew = e.PNum(1);}
-
-		      ennew = GetEdgePP(p,i);
-		    }
-		}
-	      if (pnew == pstart) {closed = 1;}
-	      else
-		{
-		  line.Append(twoint(p,pnew));
-		  p = pnew;
-		  en = ennew;
-		  found = 1;
-		}
-	    }
-	}
-    }
-  
-}
-
-int Exists(int p1, int p2, const ARRAY<twoint>& line)
-{
-  int i;
-  for (i = 1; i <= line.Size(); i++)
-    {
-      if (line.Get(i).i1 == p1 && line.Get(i).i2 == p2 ||
-	  line.Get(i).i1 == p2 && line.Get(i).i2 == p1) {return 1;}
-    }
-  return 0;
-}
-
-void STLEdgeDataList :: BuildClusterWithEdge(int ep1, int ep2, ARRAY<twoint>& line)
-{
-  int status = Get(GetEdgeNum(ep1,ep2)).GetStatus();
-
-  int p, en;
-  int j, i, k;
-  int oldend;
-  int newend = 1;
-  int pnew, ennew;
-
-  int changed = 1;
-  while (changed)
-    {
-      changed = 0;
-      for (j = 1; j <= 2; j++)
-	{
-	  oldend = newend;
-	  newend = line.Size();
-	  for (k = oldend; k <= line.Size(); k++)
-	    {
-	      if (j == 1) p = line.Get(k).i1;
-	      if (j == 2) p = line.Get(k).i2;
-	      en = GetEdgeNum(line.Get(k).i1, line.Get(k).i2);
-
-	      for (i = 1; i <= GetNEPP(p); i++)
-		{		
-		  pnew = 0;
-		  const STLTopEdge & e = Get(GetEdgePP(p,i));
-		  if (GetEdgePP(p,i) != en && e.GetStatus() == status) 
-		    {
-		      if (e.PNum(1) == p) 
-			{pnew = e.PNum(2);}
-		      else 
-			{pnew = e.PNum(1);}
-
-		      ennew = GetEdgePP(p,i);
-		    }
-		  if (pnew && !Exists(p,pnew,line))
-		    {
-		      changed = 1;
-		      line.Append(twoint(p,pnew));
-		      p = pnew;
-		      en = ennew;
-		    }
-		}
-	      
-	    }
-	}
-
-    }
-
-}
-
-
-
-
-
-
-
-
-
-
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//+++++++++++++++++++   STL LINE    +++++++++++++++++++++++++++++++
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-STLLine :: STLLine(const STLGeometry * ageometry)
-  : pts(), lefttrigs(), righttrigs()
-{
-  geometry = ageometry;
-  split = 0;
-}
-
-int STLLine :: GetNS() const
-{
-  if (pts.Size() <= 1) {return 0;}
-  return pts.Size()-1;
-}
-void STLLine :: GetSeg(int nr, int& p1, int& p2) const
-{
-  p1 = pts.Get(nr);
-  p2 = pts.Get(nr+1);
-}
-
-int STLLine :: GetLeftTrig(int nr) const 
-{
-  if (nr > lefttrigs.Size()) {PrintSysError("In STLLine::GetLeftTrig!!!"); return 0;}
-  return lefttrigs.Get(nr);
-}
-
-int STLLine :: GetRightTrig(int nr) const 
-{
-  if (nr > righttrigs.Size()) {PrintSysError("In STLLine::GetRightTrig!!!"); return 0;}
-  return righttrigs.Get(nr);
-}
-
-double STLLine :: GetSegLen(const ARRAY<Point<3> >& ap, int nr) const
-{
-  return Dist(ap.Get(PNum(nr)),ap.Get(PNum(nr+1)));
-}
-
-double STLLine :: GetLength(const ARRAY<Point<3> >& ap) const
-{
-  double len = 0;
-  for (int i = 2; i <= pts.Size(); i++)
-    {
-      len += (ap.Get(pts.Get(i)) - ap.Get(pts.Get(i-1))).Length();
-    }
-  return len;
-}
-
-void STLLine :: GetBoundingBox (const ARRAY<Point<3> > & ap, Box<3> & box) const
-{
-  box.Set (ap.Get (pts[0]));
-  for (int i = 1; i < pts.Size(); i++)
-    box.Add (ap.Get(pts[i]));
-}
-
-
-
-Point<3> STLLine :: 
-GetPointInDist(const ARRAY<Point<3> >& ap, double dist, int& index) const
-{
-  if (dist <= 0)
-    {
-      index = 1;
-      return ap.Get(StartP());
-    }
-  
-  double len = 0;
-  int i;
-  for (i = 1; i < pts.Size(); i++)
-    {
-      double seglen = Dist (ap.Get(pts.Get(i)),
-			    ap.Get(pts.Get(i+1)));
-
-      if (len + seglen > dist)
-	{
-	  index = i;
-	  double relval = (dist - len) / (seglen + 1e-16);
-	  Vec3d v (ap.Get(pts.Get(i)), ap.Get(pts.Get(i+1)));
-	  return ap.Get(pts.Get(i)) + relval * v;
-	}
-
-      len += seglen;
-    }
-
-  index = pts.Size() - 1;
-  return ap.Get(EndP());
-}
-
-
-/*
-double stlgh;
-double GetH(const Point3d& p, double x) 
-{
-  return stlgh;//+0.5)*(x+0.5);
-}
-*/
-STLLine* STLLine :: Mesh(const ARRAY<Point<3> >& ap, 
-			 ARRAY<Point3d>& mp, double ghi,
-			 class Mesh& mesh) const
-{
-  STLLine* line = new STLLine(geometry);
-
-  //stlgh = ghi; //uebergangsloesung!!!!
-  
-  double len = GetLength(ap);
-  double inthl = 0; //integral of 1/h
-  double dist = 0;
-  double h;
-  int ind;
-  Point3d p;
-
-  int i, j;
-
-  Box<3> bbox;
-  GetBoundingBox (ap, bbox);
-  double diam = bbox.Diam();
-
-  double minh = mesh.LocalHFunction().GetMinH (bbox.PMin(), bbox.PMax());
-
-  double maxseglen = 0;
-  for (i = 1; i <= GetNS(); i++)
-    maxseglen = max2 (maxseglen, GetSegLen (ap, i));
-  
-  int nph = 10+int(maxseglen / minh); //anzahl der integralauswertungen pro segment
-
-  ARRAY<double> inthi(GetNS()*nph);
-  ARRAY<double> curvelen(GetNS()*nph);
-
-
-  for (i = 1; i <= GetNS(); i++)
-    {
-      double seglen = GetSegLen(ap,i);
-      for (j = 1; j <= nph; j++)
-	{
-	  p = GetPointInDist(ap,dist,ind);
-	  //h = GetH(p,dist/len);
-	  h = mesh.GetH(p);
-
-	  
-	  dist += GetSegLen(ap,i)/(double)nph;
-	  
-	  inthl += GetSegLen(ap,i)/nph/(h);
-	  inthi.Elem((i-1)*nph+j) = GetSegLen(ap,i)/nph/h;
-	  curvelen.Elem((i-1)*nph+j) = GetSegLen(ap,i)/nph;
-	}
-    }
-
-
-  int inthlint = int(inthl+1);
-
-  if ( (inthlint < 3) && (StartP() == EndP()))
-    {
-      inthlint = 3;
-    }
-  if ( (inthlint == 1) && ShouldSplit())
-    {
-      inthlint = 2; 
-    }
-     
-  double fact = inthl/(double)inthlint;
-  dist = 0;
-  j = 1;
-
-
-  p = ap.Get(StartP());
-  int pn = AddPointIfNotExists(mp, p, 1e-10*diam);
-
-  int segn = 1;
-  line->AddPoint(pn);
-  line->AddLeftTrig(GetLeftTrig(segn));
-  line->AddRightTrig(GetRightTrig(segn));
-  line->AddDist(dist);
-
-  inthl = 0; //restart each meshseg
-  for (i = 1; i <= inthlint; i++)
-    {
-      while (inthl < 1.000000001 && j <= inthi.Size())
-      //      while (inthl-1. < 1e-9) && j <= inthi.Size())
-	{
-	  inthl += inthi.Get(j)/fact;
-	  dist += curvelen.Get(j);
-	  j++;
-	}
-
-      //went to far:
-      j--;
-      double tofar = (inthl - 1)/inthi.Get(j);
-      inthl -= tofar*inthi.Get(j);
-      dist -= tofar*curvelen.Get(j)*fact;
-
-      if (i == inthlint && fabs(dist - len) >= 1E-8) 
-	{
-	  PrintSysError("meshline failed!!!"); 
-	}
-
-      if (i != inthlint) 
-	{
-	  p = GetPointInDist(ap,dist,ind);
-	  pn = AddPointIfNotExists(mp, p, 1e-10*diam);
-	  segn = ind;
-	  line->AddPoint(pn);
-	  line->AddLeftTrig(GetLeftTrig(segn));
-	  line->AddRightTrig(GetRightTrig(segn));
-	  line->AddDist(dist);
-	}
-
-      inthl = tofar*inthi.Get(j);
-      dist += tofar*curvelen.Get(j)*fact;
-      j++;
-    }
-
-  p = ap.Get(EndP());
-  pn = AddPointIfNotExists(mp, p, 1e-10*diam);
-  segn = GetNS();
-  line->AddPoint(pn);
-  line->AddLeftTrig(GetLeftTrig(segn));
-  line->AddRightTrig(GetRightTrig(segn));
-  line->AddDist(dist);
-  
-  for (int ii = 1; ii <= line->GetNS(); ii++)
-    {
-      int p1, p2;
-      line->GetSeg(ii,p1,p2);
-    }
-  /*  
-  (*testout) << "line, " << ap.Get(StartP()) << "-" << ap.Get(EndP())
-	     << " len = " << Dist (ap.Get(StartP()), ap.Get(EndP())) << endl;
-  */
-  return line;
-}
-}
diff --git a/contrib/Netgen/libsrc/stlgeom/stlline.hpp b/contrib/Netgen/libsrc/stlgeom/stlline.hpp
deleted file mode 100644
index 70393ca0601f1936cadad9b7faacfbf362f016a7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stlline.hpp
+++ /dev/null
@@ -1,188 +0,0 @@
-#ifndef FILE_STLLINE
-#define FILE_STLLINE
-
-
-/**************************************************************************/
-/* File:   stlline.hh                                                     */
-/* Author: Joachim Schoeberl                                              */
-/* Author2: Johannes Gerstmayr                                            */
-/* Date:   20. Nov. 99                                                    */
-/**************************************************************************/
-
-class STLGeometry;
-class STLTopology;
-
-class STLEdge
-{
-public:
-  int pts[2];
-  int trigs[2]; //left and right trig
-
-  STLEdge (const int * apts) {pts[0] = apts[0]; pts[1] = apts[1];}
-  STLEdge (int v1, int v2) {pts[0] = v1; pts[1] = v2;}
-  STLEdge () {pts[0]=0;pts[1]=0;}
-  int PNum(int i) const {return pts[(i-1)];}
-
-  int LeftTrig() const {return trigs[0];}
-  int RightTrig() const {return trigs[1];}
-  void SetLeftTrig(int i) {trigs[0] = i;}
-  void SetRightTrig(int i) {trigs[1] = i;}
-};
-
-enum STL_ED_STATUS { ED_EXCLUDED, ED_CONFIRMED, ED_CANDIDATE, ED_UNDEFINED };
-                       
-
-/*
-
-class STLEdgeData
-{
-public:
-  //  float angle;
-  int p1;
-  int p2;
-  int lt; //left trig
-  int rt; //right trig
-  //  int status;
-
-  STLTopology * top;  // pointer to stl topology
-  int topedgenr;  // number of corresponding topology edge
-
-  STLEdgeData() {}; 
-  STLEdgeData(float anglei, int p1i, int p2i, int lti, int rti) 
-{
-//     angle = anglei; 
-p1 = p1i; p2 = p2i;
-      lt = lti; rt = rti;
-    }
-
-  int GetStatus () const;
-  void SetStatus (int stat);
-
-  void SetExcluded() { SetStatus (ED_EXCLUDED); }
-  void SetConfirmed() { SetStatus (ED_CONFIRMED); }
-  void SetCandidate() { SetStatus (ED_CANDIDATE); }
-  void SetUndefined() { SetStatus (ED_UNDEFINED); }
-
-  int Excluded() const {return GetStatus() == ED_EXCLUDED;}
-  int Confirmed() const {return GetStatus() == ED_CONFIRMED;}
-  int Candidate() const {return GetStatus() == ED_CANDIDATE;}
-  int Undefined() const {return GetStatus() == ED_UNDEFINED;}
-  int ConfCand() const {return GetStatus() == ED_CONFIRMED || GetStatus() == ED_CANDIDATE;}
-
-  float CosAngle() const; 
-
-  void Write(ofstream& of) const;
-  void Read(ifstream& ifs);
-};
-
-class STLEdgeDataList
-{
-private:
-  INDEX_2_HASHTABLE<int> hashtab;
-  ARRAY<STLEdgeData> edgedata;
-  TABLE<int> edgesperpoint;
-  
-public:
-
-  STLEdgeDataList():edgedata(),hashtab(1),edgesperpoint() {};
-  const STLEdgeDataList& operator=(const STLEdgeDataList& edl); 
-  void SetSize(int size) 
-    {
-      edgedata.SetSize(size);
-      hashtab.SetSize(size);
-      edgesperpoint.SetSize(size);
-    }
-  void Clear() {SetSize(0);}
-  int Size() const {return edgedata.Size();}
-  const STLEdgeData& Get(int i) const {return edgedata.Get(i);}
-  STLEdgeData& Elem(int i) {return edgedata.Elem(i);}
-  void Add(const STLEdgeData& ed, int i);
-
-  int GetNEPP(int pn) const 
-    {
-      return edgesperpoint.EntrySize(pn);
-    };
-  int GetEdgePP(int pn, int vi) const
-    {
-      return edgesperpoint.Get(pn,vi);
-    };
-  void AddEdgePP(int pn, int vn) {edgesperpoint.Add(pn,vn);};
-
-  void ResetAll();
-  void ResetCandidates();
-  void ConfirmCandidates();
-  int GetEdgeNum(int np1, int np2) const;
-
-  int GetNConfEdges() const;
-
-  void Write(ofstream& of) const;
-  void Read(ifstream& ifs);
-
-  void BuildLineWithEdge(int ep1, int ep2, ARRAY<twoint>& line);
-
-  int GetNEPPStat(int p, int status) const;
-  int GetNConfCandEPP(int p) const;
-};
-*/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//a line defined by several points (polyline)
-class STLLine
-{
-private:
-  const STLGeometry * geometry;
-  ARRAY<int> pts;
-  ARRAY<int> lefttrigs;
-  ARRAY<int> righttrigs;
-  ARRAY<double> dists;
-  int split;
-
-public:
-  STLLine(const STLGeometry * ageometry);
-  void AddPoint(int i) {pts.Append(i);}
-  int PNum(int i) const {return pts.Get(i);}
-  int NP() const {return pts.Size();}
-  int GetNS() const;
-  void GetSeg(int nr, int& p1, int& p2) const;
-  double GetSegLen(const ARRAY<Point<3> >& ap, int nr) const;
-  int GetLeftTrig(int nr) const;
-  int GetRightTrig(int nr) const;
-  double GetDist(int nr) const { return dists.Get(nr);};
-  void GetBoundingBox (const ARRAY<Point<3> > & ap, Box<3> & box) const;
-
-  void AddLeftTrig(int nr) {lefttrigs.Append(nr);}
-  void AddRightTrig(int nr) {righttrigs.Append(nr);}
-  void AddDist (double dist) {dists.Append(dist); }
-  int StartP() const {return pts.Get(1);}
-  int EndP() const {return pts.Get(pts.Size());}
-    
-  double GetLength(const ARRAY<Point<3> >& ap) const;
-
-  //suche punkt in entfernung (in linienkoordinaten) dist
-  //in index ist letzter punkt VOR dist (d.h. max pts.Size()-1)
-  Point<3> GetPointInDist(const ARRAY<Point<3> >& ap, double dist, int& index) const;
-
-  //return a meshed polyline
-  STLLine* Mesh(const ARRAY<Point<3> >& ap, 
-		ARRAY<Point3d>& mp, double ghi,
-		class Mesh& mesh) const;
-
-  void DoSplit() {split = 1;}
-  int ShouldSplit() const {return split;}
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/stlgeom/stltool.cpp b/contrib/Netgen/libsrc/stlgeom/stltool.cpp
deleted file mode 100644
index c19fed4ca09901b60a659444296fc108ddf37218..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stltool.cpp
+++ /dev/null
@@ -1,1288 +0,0 @@
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-#include <meshing.hpp>
-
-#include "stlgeom.hpp"
-
-namespace netgen
-{
-
-
-//add a point into a pointlist, return pointnumber
-int AddPointIfNotExists(ARRAY<Point3d>& ap, const Point3d& p, double eps)
-{
-  int i;
-  for (i = 1; i <= ap.Size(); i++)
-    {
-      if (Dist(ap.Get(i),p) <= eps ) {return i;}
-    }
-  return ap.Append(p);
-}
-
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-double GetDistFromLine(const Point<3> & lp1, const Point<3> & lp2, 
-		       Point<3> & p)
-{
-  Vec3d vn = lp2 - lp1;
-  Vec3d v1 = p - lp1;
-  Vec3d v2 = lp2 - p;
-
-  Point3d pold = p;
-
-  if (v2 * vn <= 0) {p = lp2; return (pold - p).Length();}
-  if (v1 * vn <= 0) {p = lp1; return (pold - p).Length();}
-    
-  double vnl = vn.Length();
-  if (vnl == 0) {return Dist(lp1,p);}
-
-  vn /= vnl;
-  p = lp1 + (v1 * vn) * vn;
-  return (pold - p).Length();
-}
-
-double GetDistFromInfiniteLine(const Point<3>& lp1, const Point<3>& lp2, const Point<3>& p)
-{
-  Vec3d vn(lp1, lp2);
-  Vec3d v1(lp1, p);
-
-  double vnl = vn.Length();
-
-  if (vnl == 0)
-    {
-      return Dist (lp1, p);
-    }
-  else
-    {
-      return Cross (vn, v1).Length() / vnl;
-    }
-}
-
-
-
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//Binary IO-Manipulation
-
-
-
-void FIOReadInt(istream& ios, int& i)
-{
-  const int ilen = sizeof(int);
-  
-  char buf[ilen];
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios.get(buf[j]);
-    }
-  memcpy(&i, &buf, ilen);
-}
-
-void FIOWriteInt(ostream& ios, const int& i)
-{
-  const int ilen = sizeof(int);
-  
-  char buf[ilen];
-  memcpy(&buf, &i, ilen);
-
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios << buf[j];
-    }
-}
-
-void FIOReadDouble(istream& ios, double& i)
-{
-  const int ilen = sizeof(double);
-  
-  char buf[ilen];
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios.get(buf[j]);
-    }
-  memcpy(&i, &buf, ilen);
-}
-
-void FIOWriteDouble(ostream& ios, const double& i)
-{
-  const int ilen = sizeof(double);
-  
-  char buf[ilen];
-  memcpy(&buf, &i, ilen);
-
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios << buf[j];
-    }
-}
-
-void FIOReadFloat(istream& ios, float& i)
-{
-  const int ilen = sizeof(float);
-  
-  char buf[ilen];
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios.get(buf[j]);
-    }
-  memcpy(&i, &buf, ilen);
-}
-
-void FIOWriteFloat(ostream& ios, const float& i)
-{
-  const int ilen = sizeof(float);
-  
-  char buf[ilen];
-  memcpy(&buf, &i, ilen);
-
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios << buf[j];
-     }
-}
-
-void FIOReadString(istream& ios, char* str, int len)
-{
-  int j;
-  for (j = 0; j < len; j++)
-    {
-      ios.get(str[j]);
-    }
-}
-
-//read string and add terminating 0
-void FIOReadStringE(istream& ios, char* str, int len)
-{
-  int j;
-  for (j = 0; j < len; j++)
-    {
-      ios.get(str[j]);
-    }
-  str[len] = 0;
-}
-
-void FIOWriteString(ostream& ios, char* str, int len)
-{
-  int j;
-  for (j = 0; j < len; j++)
-    {
-      ios << str[j];
-    }
-}
-
-
-/*
-void FIOReadInt(istream& ios, int& i)
-{
-  const int ilen = sizeof(int);
-  
-  char buf[ilen];
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios.get(buf[ilen-j-1]);
-    }
-  memcpy(&i, &buf, ilen);
-}
-
-void FIOWriteInt(ostream& ios, const int& i)
-{
-  const int ilen = sizeof(int);
-  
-  char buf[ilen];
-  memcpy(&buf, &i, ilen);
-
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios << buf[ilen-j-1];
-    }
-}
-
-void FIOReadDouble(istream& ios, double& i)
-{
-  const int ilen = sizeof(double);
-  
-  char buf[ilen];
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios.get(buf[ilen-j-1]);
-    }
-  memcpy(&i, &buf, ilen);
-}
-
-void FIOWriteDouble(ostream& ios, const double& i)
-{
-  const int ilen = sizeof(double);
-  
-  char buf[ilen];
-  memcpy(&buf, &i, ilen);
-
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios << buf[ilen-j-1];
-    }
-}
-
-void FIOReadFloat(istream& ios, float& i)
-{
-  const int ilen = sizeof(float);
-  
-  char buf[ilen];
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios.get(buf[ilen-j-1]);
-    }
-  memcpy(&i, &buf, ilen);
-}
-
-void FIOWriteFloat(ostream& ios, const float& i)
-{
-  const int ilen = sizeof(float);
-  
-  char buf[ilen];
-  memcpy(&buf, &i, ilen);
-
-  int j;
-  for (j = 0; j < ilen; j++)
-    {
-      ios << buf[ilen-j-1];
-    }
-}
-
-void FIOReadString(istream& ios, char* str, int len)
-{
-  int j;
-  for (j = 0; j < len; j++)
-    {
-      ios.get(str[j]);
-    }
-}
-
-//read string and add terminating 0
-void FIOReadStringE(istream& ios, char* str, int len)
-{
-  int j;
-  for (j = 0; j < len; j++)
-    {
-      ios.get(str[j]);
-    }
-  str[len] = 0;
-}
-
-void FIOWriteString(ostream& ios, char* str, int len)
-{
-  int j;
-  for (j = 0; j < len; j++)
-    {
-      ios << str[j];
-    }
-}
-*/
-
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-STLReadTriangle :: STLReadTriangle (const Point<3> * apts,
-				    const Vec<3> & anormal)
-{
-  pts[0] = apts[0];
-  pts[1] = apts[1];
-  pts[2] = apts[2]; 
-  normal = anormal;
-}
-
-
-
-STLTriangle :: STLTriangle(const int * apts)
-{
-  pts[0] = apts[0];
-  pts[1] = apts[1];
-  pts[2] = apts[2];
-
-  facenum = 0;
-}
-
-int STLTriangle :: IsNeighbourFrom(const STLTriangle& t) const
-{
-  //triangles must have same orientation!!!
-  int i, j;
-  for(i = 0; i <= 2; i++)
-    {
-      for(j = 0; j <= 2; j++)
-	{
-	  if (t.pts[(i+1)%3] == pts[j] &&
-	      t.pts[i] == pts[(j+1)%3])
-	    {return 1;}
-	}
-    }
-  return 0;      
-}
-
-int STLTriangle :: IsWrongNeighbourFrom(const STLTriangle& t) const
-{
-  //triangles have not same orientation!!!
-  int i, j;
-  for(i = 0; i <= 2; i++)
-    {
-      for(j = 0; j <= 2; j++)
-	{
-	  if (t.pts[(i+1)%3] == pts[(j+1)%3] &&
-	      t.pts[i] == pts[j])
-	    {return 1;}
-	}
-    }
-  return 0;      
-}
-
-void STLTriangle :: GetNeighbourPoints(const STLTriangle& t, int& p1, int& p2) const
-{
-  int i, j;
-  for(i = 1; i <= 3; i++)
-    {
-      for(j = 1; j <= 3; j++)
-	{
-	  if (t.PNumMod(i+1) == PNumMod(j) &&
-	      t.PNumMod(i) == PNumMod(j+1))
-	    {p1 = PNumMod(j); p2 = PNumMod(j+1); return;}
-	}
-    }
-  PrintSysError("Get neighbourpoints failed!");
-}
-
-int STLTriangle :: GetNeighbourPointsAndOpposite(const STLTriangle& t, int& p1, int& p2, int& po) const
-{
-  int i, j;
-  for(i = 1; i <= 3; i++)
-    {
-      for(j = 1; j <= 3; j++)
-	{
-	  if (t.PNumMod(i+1) == PNumMod(j) &&
-	      t.PNumMod(i) == PNumMod(j+1))
-	    {p1 = PNumMod(j); p2 = PNumMod(j+1); po = PNumMod(j+2); return 1;}
-	}
-    }
-  return 0;
-}
-
-Vec<3> STLTriangle :: GeomNormal(const ARRAY<Point<3> >& ap) const
-{
-  const Point<3> & p1 = ap.Get(PNum(1));
-  const Point<3> & p2 = ap.Get(PNum(2));
-  const Point<3> & p3 = ap.Get(PNum(3));
-  
-  return Cross(p2-p1, p3-p1);
-}
-
-
-void STLTriangle :: SetNormal (const Vec<3> & n)
-{
-  double len = n.Length();
-  if (len > 0)
-    {
-      normal = n;
-      normal.Normalize();
-    }
-  else
-    {
-      normal = Vec<3> (1, 0, 0);
-    }
-}
-
-
-void STLTriangle :: ChangeOrientation()
-{ 
-  normal *= -1;
-  Swap(pts[0],pts[1]); 
-}
-
-
-
-double STLTriangle :: Area(const ARRAY<Point<3> >& ap) const
-{
-  return 0.5 * Cross(ap.Get(PNum(2))-ap.Get(PNum(1)), 
-		     ap.Get(PNum(3))-ap.Get(PNum(1))).Length();
-}
-
-double STLTriangle :: MinHeight(const ARRAY<Point<3> >& ap) const
-{
-  double ml = MaxLength(ap);
-  if (ml != 0) {return 2.*Area(ap)/ml;}
-  PrintWarning("max Side Length of a triangle = 0!!!");
-  return 0;
-}
-
-double STLTriangle :: MaxLength(const ARRAY<Point<3> >& ap) const
-{
-  return max3(Dist(ap.Get(PNum(1)),ap.Get(PNum(2))),
-	      Dist(ap.Get(PNum(2)),ap.Get(PNum(3))),
-	      Dist(ap.Get(PNum(3)),ap.Get(PNum(1))));
-}
-
-void STLTriangle :: ProjectInPlain(const ARRAY<Point<3> >& ap, 
-				   const Vec<3> & n, Point<3> & pp) const
-{
-  const Point<3> & p1 = ap.Get(PNum(1));
-  const Point<3> & p2 = ap.Get(PNum(2));
-  const Point<3> & p3 = ap.Get(PNum(3));
-  
-  Vec<3> v1 = p2 - p1;
-  Vec<3> v2 = p3 - p1;
-  Vec<3> nt = Cross(v1, v2);
-
-  double c = - (p1(0)*nt(0) + p1(1)*nt(1) + p1(2)*nt(2));
-
-  double prod = n * nt;  
-
-  if (fabs(prod) == 0) 
-    {
-      pp = Point<3>(1.E20,1.E20,1.E20); 
-      return; 
-    }
-
-  double nfact = -(pp(0)*nt(0) + pp(1)*nt(1) + pp(2)*nt(2) + c) / (prod);
-  pp = pp + (nfact) * n;
-
-}
-
-
-int STLTriangle :: ProjectInPlain (const ARRAY<Point<3> >& ap, 
-				   const Vec<3> & nproj, 
-				   Point<3> & pp, Vec<3> & lam) const
-{
-  const Point<3> & p1 = ap.Get(PNum(1));
-  const Point<3> & p2 = ap.Get(PNum(2));
-  const Point<3> & p3 = ap.Get(PNum(3));
-  
-  Vec<3> v1 = p2-p1;
-  Vec<3> v2 = p3-p1;
-
-  Mat<3> mat;
-  for (int i = 0; i < 3; i++)
-    {
-      mat(i,0) = v1(i);
-      mat(i,1) = v2(i);
-      mat(i,2) = nproj(i);
-    }
-
-  int err = 0;
-  mat.Solve (pp-p1, lam);
-  //  int err = SolveLinearSystem (v1, v2, nproj, pp-p1, lam);
-
-  if (!err)
-    {
-      //      pp = p1 + lam(0) * v1 + lam(1) * v2;
-
-      pp(0) = p1(0) + lam(0) * v1(0) + lam(1) * v2(0);
-      pp(1) = p1(1) + lam(0) * v1(1) + lam(1) * v2(1);
-      pp(2) = p1(2) + lam(0) * v1(2) + lam(1) * v2(2);
-    }
-  return err;
-}
-
-
-
-
-
-void STLTriangle :: ProjectInPlain(const ARRAY<Point<3> >& ap, 
-				   Point<3> & pp) const
-{
-  const Point<3> & p1 = ap.Get(PNum(1));
-  const Point<3> & p2 = ap.Get(PNum(2));
-  const Point<3> & p3 = ap.Get(PNum(3));
-  
-  Vec<3> v1 = p2 - p1;
-  Vec<3> v2 = p3 - p1;
-  Vec<3> nt = Cross(v1, v2);
-
-  double c = - (p1(0)*nt(0) + p1(1)*nt(1) + p1(2)*nt(2));
-  
-  double prod = nt * nt;  
-
-  double nfact = -(pp(0)*nt(0) + pp(1)*nt(1) + pp(2)*nt(2) + c) / (prod);
-
-  pp = pp + (nfact) * nt;
-}
-
-int STLTriangle :: PointInside(const ARRAY<Point<3> > & ap, 
-			       const Point<3> & pp) const
-{
-  const Point<3> & p1 = ap.Get(PNum(1));
-  const Point<3> & p2 = ap.Get(PNum(2));
-  const Point<3> & p3 = ap.Get(PNum(3));
-  
-  Vec<3> v1 = p2 - p1;
-  Vec<3> v2 = p3 - p1;
-  Vec<3> v  = pp - p1;
-  double det, l1, l2;
-  Vec<3> ex, ey, ez;
-
-
-  ez = GeomNormal(ap);
-  ez /= ez.Length();
-  ex = v1;
-  ex /= ex.Length();
-  ey = Cross (ez, ex);
-  
-  Vec<2> v1p(v1*ex, v1*ey);
-  Vec<2> v2p(v2*ex, v2*ey);
-  Vec<2> vp(v*ex, v*ey);
-
-  det = v2p(1) * v1p(0) - v2p(0) * v1p(1);
-
-  if (fabs(det) == 0) {return 0;}
-  
-  l2 = (vp(1) * v1p(0) - vp(0) * v1p(1)) / det;
-  
-  if (v1p(0) != 0.)
-    {
-      l1 = (vp(0) - l2 * v2p(0)) / v1p(0);
-    }
-  else if (v1p(1) != 0.)
-    {
-      l1 = (vp(1) - l2 * v2p(1)) / v1p(1);
-    }
-  else {return 0;}
-  
-  if (l1 >= -1E-10 && l2 >= -1E-10 && l1 + l2 <= 1.+1E-10) {return 1;}
-  return 0; 
-}
-
-double STLTriangle :: GetNearestPoint(const ARRAY<Point<3> >& ap, 
-				      Point<3> & p3d) const
-{
-  Point<3> p = p3d;
-  ProjectInPlain(ap, p);
-  double dist = (p - p3d).Length();
-
-  if (PointInside(ap, p)) {p3d = p; return dist;}
-  else
-    {
-      Point<3> pf;
-      double nearest = 1E50;
-      int fi = 0;
-      int j;
-      
-      for (j = 1; j <= 3; j++)
-	{
-	  p = p3d;
-	  dist = GetDistFromLine(ap.Get(PNum(j)), ap.Get(PNumMod(j+1)), p);
-	  if (dist < nearest)
-	    {
-	      nearest = dist; 
-	      pf = p;
-	    }
-	}
-      p3d = pf;
-      return nearest;
-    }
-}
-
-int STLTriangle :: HasEdge(int p1, int p2) const
-{
-  int i;
-  for (i = 1; i <= 3; i++)
-    {
-      if (p1 == PNum(i) && p2 == PNumMod(i+1)) {return 1;}
-    }
-  return 0;
-}
-
-ostream& operator<<(ostream& os, const STLTriangle& t)
-{
-  os << "[";
-  os << t[0] << ",";
-  os << t[1] << ",";
-  os << t[2] << "]";
-
-  return os;
-}
-
-
-
-STLTopEdge :: STLTopEdge ()
-{
-  pts[0] = pts[1] = 0;
-  trigs[0] = trigs[1] = 0;
-  cosangle = 1;
-  status = ED_UNDEFINED;
-}
-
-STLTopEdge :: STLTopEdge (int p1, int p2, int trig1, int trig2)
-{ 
-  pts[0] = p1; 
-  pts[1] = p2; 
-  trigs[0] = trig1; 
-  trigs[1] = trig2; 
-  cosangle = 1;
-  status = ED_UNDEFINED;
-}
-
-
-
-
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//+++++++++++++++++++   STL CHART   +++++++++++++++++++++++++++++++
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-STLChart :: STLChart(STLGeometry * ageometry)
-{
-  charttrigs = new ARRAY<int> (0,0);
-  outertrigs = new ARRAY<int> (0,0);
-  ilimit = new ARRAY<twoint> (0,0);
-  olimit = new ARRAY<twoint> (0,0);
-
-  geometry = ageometry;
-
-  if ( (stlparam.usesearchtree == 1))
-    searchtree = new Box3dTree (geometry->GetBoundingBox().PMin() - Vec3d(1,1,1),
-				geometry->GetBoundingBox().PMax() + Vec3d(1,1,1));
-  else
-    searchtree = NULL;
-}
-
-void STLChart :: AddChartTrig(int i)
-{
-  charttrigs->Append(i);
-  
-  const STLTriangle & trig = geometry->GetTriangle(i);
-  const Point3d & p1 = geometry->GetPoint (trig.PNum(1));
-  const Point3d & p2 = geometry->GetPoint (trig.PNum(2));
-  const Point3d & p3 = geometry->GetPoint (trig.PNum(3));
-
-  Point3d pmin(p1), pmax(p1);
-  pmin.SetToMin (p2);
-  pmin.SetToMin (p3);
-  pmax.SetToMax (p2);
-  pmax.SetToMax (p3);
-  
-  if (!geomsearchtreeon && (stlparam.usesearchtree == 1))
-    {searchtree->Insert (pmin, pmax, i);}
-}
-
-void STLChart :: AddOuterTrig(int i)
-{
-  outertrigs->Append(i);
-
-  const STLTriangle & trig = geometry->GetTriangle(i);
-  const Point3d & p1 = geometry->GetPoint (trig.PNum(1));
-  const Point3d & p2 = geometry->GetPoint (trig.PNum(2));
-  const Point3d & p3 = geometry->GetPoint (trig.PNum(3));
-
-  Point3d pmin(p1), pmax(p1);
-  pmin.SetToMin (p2);
-  pmin.SetToMin (p3);
-  pmax.SetToMax (p2);
-  pmax.SetToMax (p3);
-  
-  if (!geomsearchtreeon && (stlparam.usesearchtree==1))
-    {searchtree->Insert (pmin, pmax, i);}
-}
-
-int STLChart :: IsInWholeChart(int nr) const
-{
-  int i;
-  for (i = 1; i <= charttrigs->Size(); i++)
-    {
-      if (charttrigs->Get(i) == nr) {return 1;}
-    }
-  for (i = 1; i <= outertrigs->Size(); i++)
-    {
-      if (outertrigs->Get(i) == nr) {return 1;}
-    }
-  return 0;
-}
-
-void STLChart :: GetTrianglesInBox (const Point3d & pmin,
-				    const Point3d & pmax,
-				    ARRAY<int> & trias) const
-{
-  if (geomsearchtreeon) {PrintMessage(5,"geomsearchtreeon is set!!!");}
-
-  if (searchtree)
-    searchtree -> GetIntersecting (pmin, pmax, trias);
-  else
-    {
-      int i;
-      Box3d box1(pmin, pmax);
-      box1.Increase (1e-4);
-      Box3d box2;
-
-      trias.SetSize(0);
-      
-      int nt = GetNT();
-      for (i = 1; i <= nt; i++)
-	{
-
-	  int trignum = GetTrig(i);
-	  const STLTriangle & trig = geometry->GetTriangle(trignum);
-	  box2.SetPoint (geometry->GetPoint (trig.PNum(1)));
-	  box2.AddPoint (geometry->GetPoint (trig.PNum(2)));
-	  box2.AddPoint (geometry->GetPoint (trig.PNum(3)));
-	  
-	  if (box1.Intersect (box2))
-	    {
-	      trias.Append (trignum);
-	    }
-	}
-    }
-}
-
-//trigs may contain the same triangle double
-void STLChart :: MoveToOuterChart(const ARRAY<int>& trigs)
-{
-  if (!trigs.Size()) {return;}
-  int i;
-  for (i = 1; i <= trigs.Size(); i++)
-    {
-      if (charttrigs->Get(trigs.Get(i)) != -1) 
-	{AddOuterTrig(charttrigs->Get(trigs.Get(i)));}
-      charttrigs->Elem(trigs.Get(i)) = -1;
-    }
-  DelChartTrigs(trigs);
-}
-
-//trigs may contain the same triangle double
-void STLChart :: DelChartTrigs(const ARRAY<int>& trigs)
-{
-  if (!trigs.Size()) {return;}
-
-  int i;
-  for (i = 1; i <= trigs.Size(); i++)
-    {
-      charttrigs->Elem(trigs.Get(i)) = -1;
-    }
-
-  int cnt = 0;
-  for (i = 1; i <= charttrigs->Size(); i++)
-    {
-      if (charttrigs->Elem(i) == -1)
-	{
-	  cnt++;
-	}
-      if (cnt != 0 && i < charttrigs->Size())
-	{
-	  charttrigs->Elem(i-cnt+1) = charttrigs->Get(i+1);
-	}
-    }
-  i = charttrigs->Size() - trigs.Size();
-  charttrigs->SetSize(i);
-
-  if (!geomsearchtreeon && stlparam.usesearchtree == 1)
-    {
-      PrintMessage(7, "Warning: unsecure routine due to first use of searchtrees!!!");
-      //bould new searchtree!!!
-      searchtree = new Box3dTree (geometry->GetBoundingBox().PMin() - Vec3d(1,1,1),
-				  geometry->GetBoundingBox().PMax() + Vec3d(1,1,1));
-
-      for (i = 1; i <= charttrigs->Size(); i++)
-	{
-	  const STLTriangle & trig = geometry->GetTriangle(i);
-	  const Point3d & p1 = geometry->GetPoint (trig.PNum(1));
-	  const Point3d & p2 = geometry->GetPoint (trig.PNum(2));
-	  const Point3d & p3 = geometry->GetPoint (trig.PNum(3));
-	  
-	  Point3d pmin(p1), pmax(p1);
-	  pmin.SetToMin (p2);
-	  pmin.SetToMin (p3);
-	  pmax.SetToMax (p2);
-	  pmax.SetToMax (p3);
-	  
-	  searchtree->Insert (pmin, pmax, i);	  
-	}
-    }
-}
-
-
-void STLChart :: SetNormal (const Point<3> & apref, const Vec<3> & anormal)
-{
-  pref = apref;
-  normal = anormal;
-  double len = normal.Length();
-  if (len) normal /= len;
-  else normal = Vec<3> (1, 0, 0);
-
-  t1 = normal.GetNormal ();
-  t2 = Cross (normal, t1);
-}
-
-Point<2> STLChart :: Project2d (const Point<3> & p3d) const
-{
-  Vec<3> v = p3d-pref;
-  return Point<2> (t1 * v, t2 * v);
-}
-
-
-
-/*
-  Point3d p1, p2, center;
-  double rad;
-  int i1, i2;
-public:
-*/
-STLBoundarySeg :: 
-STLBoundarySeg (int ai1, int ai2, const ARRAY<Point<3> > & points,
-		const STLChart * chart)
-{
-  i1 = ai1;
-  i2 = ai2; 
-  p1 = points.Get(i1);
-  p2 = points.Get(i2);
-  center = ::netgen::Center (p1, p2);
-  rad = Dist (p1, center);
-
-  p2d1 = chart->Project2d (p1);
-  p2d2 = chart->Project2d (p2);
-  
-  boundingbox.Set (p2d1);
-  boundingbox.Add (p2d2);
-}
-
-void STLBoundarySeg :: Swap ()
-{
-  ::netgen::Swap (i1, i2);
-  ::netgen::Swap (p1, p2);
-}
-
-
-
-STLBoundary :: STLBoundary (STLGeometry * ageometry)
-  : boundary(), geometry(ageometry)
-{
-  ;
-}
-
-
-void STLBoundary :: AddOrDelSegment(const STLBoundarySeg & seg)
-{
-  int i;
-  int found = 0;
-  for (i = 1; i <= boundary.Size(); i++)
-    {
-      if (found) {boundary.Elem(i-1) = boundary.Get(i);}
-      if (boundary.Get(i) == seg) {found = 1;}
-    }
-  if (!found) 
-    {
-      boundary.Append(seg);
-    }
-  else 
-    {
-      boundary.SetSize(boundary.Size()-1);
-    }
-}
-
-void STLBoundary ::AddTriangle(const STLTriangle & t)
-{
-  int i;
-  int found1 = 0;
-  int found2 = 0;
-  int found3 = 0;
-  int offset = 0;
-  
-
-  STLBoundarySeg seg1(t[0],t[1], geometry->GetPoints(), chart);
-  STLBoundarySeg seg2(t[1],t[2], geometry->GetPoints(), chart);
-  STLBoundarySeg seg3(t[2],t[0], geometry->GetPoints(), chart);
-
-  seg1.SetSmoothEdge (geometry->IsSmoothEdge (seg1.I1(), seg1.I2()));
-  seg2.SetSmoothEdge (geometry->IsSmoothEdge (seg2.I1(), seg2.I2()));
-  seg3.SetSmoothEdge (geometry->IsSmoothEdge (seg3.I1(), seg3.I2()));
-
-  /*
-  for (i = 1; i <= boundary.Size(); i++)
-    {
-      if (offset) {boundary.Elem(i-offset) = boundary.Get(i);}
-      if (boundary.Get(i) == seg1) {found1 = 1; offset++;}
-      if (boundary.Get(i) == seg2) {found2 = 1; offset++;}
-      if (boundary.Get(i) == seg3) {found3 = 1; offset++;}
-    }
-
-  if (offset)
-    {
-      boundary.SetSize(boundary.Size()-offset);
-    }    
-  */
-  for (i = boundary.Size(); i >= 1; i--)
-    {
-      if (boundary.Get(i) == seg1) 
-	{ boundary.DeleteElement (i); found1 = 1; } 
-      else if (boundary.Get(i) == seg2) 
-	{ boundary.DeleteElement (i); found2 = 1; } 
-      else if (boundary.Get(i) == seg3) 
-	{ boundary.DeleteElement (i); found3 = 1; } 
-    }
-
-  if (!found1) {seg1.Swap(); boundary.Append(seg1);}
-  if (!found2) {seg2.Swap(); boundary.Append(seg2);}
-  if (!found3) {seg3.Swap(); boundary.Append(seg3);}
-}
-
-int STLBoundary :: TestSeg(const Point<3>& p1, const Point<3> & p2, const Vec<3> & sn, 
-			   double sinchartangle, int divisions, ARRAY<Point<3> >& points, double eps)
-{
-
-  if (usechartnormal)
-    return TestSegChartNV (p1, p2, sn);
-
-  // for statistics
-  {
-    int i;
-    static ARRAY<int> cntclass;
-    static int cnt = 0;
-    static int cnti = 0, cnto = 0;
-    static long int cntsegs = 0;
-    if (cntclass.Size() == 0)
-      {
-	cntclass.SetSize (20);
-	for (i = 1; i <= cntclass.Size(); i++)
-	  cntclass.Elem(i) = 0;
-      }
-    
-    cntsegs += NOSegments();
-    int cla = int (log (double(NOSegments()+1)) / log(2.0));
-    if (cla < 1) cla = 1;
-    if (cla > cntclass.Size()) cla = cntclass.Size();
-    cntclass.Elem(cla)++;
-    cnt++;
-    if (divisions)
-      cnti++;
-    else
-      cnto++;
-    if (cnt > 100000) 
-      {
-	cnt = 0;
-	/*
-	(*testout) << "TestSeg-calls for classes:" << endl;
-	(*testout) << cnti << " inner calls, " << cnto << " outercalls" << endl;
-	(*testout) << "total testes segments: " << cntsegs << endl;
-	for (i = 1; i <= cntclass.Size(); i++)
-	  {
-	    (*testout) << int (exp (i * log(2.0))) << " bnd segs: " << cntclass.Get(i) << endl;
-	  }
-	*/
-      }
-  }
-
-
-  int i,j,k;
-  Point<3> seg1p/*, seg2p*/;
-  Point<3> sp1,sp2;
-  double lambda1, lambda2, vlen2;
-  Vec<3> vptpl;
-  double sinchartangle2 = sqr(sinchartangle);
-  double scal;
-  int possible;
-
-  double maxval = -1;
-  double maxvalnew = -1;
-
-
-
-  double scalp1 = p1(0) * sn(0) + p1(1) * sn(1) + p1(2) * sn(2);
-  double scalp2 = p2(0) * sn(0) + p2(1) * sn(1) + p2(2) * sn(2);
-  double minl = min2(scalp1, scalp2);
-  double maxl = max2(scalp1, scalp2);
-  Point<3> c = Center (p1, p2);
-  double dist1 = Dist (c, p1);
- 
-  int nseg = NOSegments();
-  for (j = 1; j <= nseg; j++)
-    {
-      const STLBoundarySeg & seg = GetSegment(j);
-
-
-      if (seg.IsSmoothEdge())
-	continue;
-
-
-      sp1 = seg.P1();
-      sp2 = seg.P2();
-
-      // Test, ob Spiral Konfikt moeglich
-      
-      possible = 1;
-
-      double scalsp1 = sp1(0) * sn(0) + sp1(1) * sn(1) + sp1(2) * sn(2);
-      double scalsp2 = sp2(0) * sn(0) + sp2(1) * sn(1) + sp2(2) * sn(2);
-
-      double minsl = min2(scalsp1, scalsp2);
-      double maxsl = max2(scalsp1, scalsp2);
-      
-      double maxdiff = max2 (maxsl - minl, maxl - minsl);
-      
-      /*
-      Point3d sc = Center (sp1, sp2);
-      double mindist = Dist(c, sc) - dist1 - GetSegment(j).Radius();
-      if (maxdiff < sinchartangle * mindist)
-	{
-	  possible = 0;
-	}
-      */
-       
-      double hscal = maxdiff + sinchartangle * (dist1 + seg.Radius());
-      if (hscal * hscal < sinchartangle * Dist2(c, seg.center ))
-	possible = 0;
-
-
-      /*      
-      if (possible)
-	{
-	  double mindist2ex = MinDistLL2 (p1, p2, sp1, sp2);
-	  if (maxdiff * maxdiff < sinchartangle2 * mindist2ex)
-	    possible = 0;
-	}
-      */
-
-      if (possible)
-      	{
-	  LinearPolynomial2V lp (scalp1 - scalsp1,
-				 scalp2 - scalp1,
-				 -(scalsp2 - scalsp1));
-	  QuadraticPolynomial2V slp;
-	  slp.Square (lp);
-	  
-      
-	  Vec3d v (p1, sp1);
-	  Vec3d vl (p1, p2);
-	  Vec3d vsl (sp1, sp2);
-      
-	  QuadraticPolynomial2V qp (v.Length2(),
-				    -2 * (v * vl),
-				    2 * (v * vsl),
-				    vl.Length2(),
-				    -2 * (vl * vsl),
-				    vsl.Length2());
-	  
-	  slp.Add (-sinchartangle2, qp);
-
-	  double hv = slp.MaxUnitSquare();
-
-	  if (hv > eps) return 0;
-	  /*
-	  if (hv > maxvalnew)
-	    maxvalnew = hv;
-	  */
-	}
-      
-
-      if (possible && 0)
-
-	for (i = 0; i <= divisions; i++)
-	  {
-	    
-	    lambda1 = (double)i/(double)divisions;
-	    seg1p = Point3d(p1(0)*lambda1+p2(0)*(1.-lambda1),
-			    p1(1)*lambda1+p2(1)*(1.-lambda1),
-			    p1(2)*lambda1+p2(2)*(1.-lambda1));
-	    
-
-	    
-	    for (k = 0; k <= divisions; k++)
-	      {
-		lambda2 = (double)k/(double)divisions;
-		vptpl = Vec3d(sp1(0)*lambda2+sp2(0)*(1.-lambda2)-seg1p(0),
-			      sp1(1)*lambda2+sp2(1)*(1.-lambda2)-seg1p(1),
-			      sp1(2)*lambda2+sp2(2)*(1.-lambda2)-seg1p(2));
-		
-		vlen2 = vptpl.Length2();
-
-		//		if (vlen2 > 0)
-		  {
-		    scal = vptpl * sn;
-		    double hv = scal*scal - sinchartangle2*vlen2;
-
-
-
-		    /*
-		    if (hv > maxval)
-		      maxval = hv;
-		    */
-		    if (hv > eps) return 0;
-		  }
-	      } 
-	  }
-    }
-  
-  return 1;
-  //  return (maxvalnew < eps);
-}
-
-
-
-// checks, whether 2d projection intersects
-int STLBoundary :: TestSegChartNV(const Point3d & p1, const Point3d& p2, 
-				  const Vec3d& sn)
-{
-  int i, j;
-  int nseg = NOSegments();
-
-  Point<2> p2d1 = chart->Project2d (p1);
-  Point<2> p2d2 = chart->Project2d (p2);
-
-  Box<2> box2d;
-  box2d.Set (p2d1);
-  box2d.Add (p2d2);
-  /*
-  Point2d pmin(p2d1);
-  pmin.SetToMin (p2d2);
-  Point2d pmax(p2d1);
-  pmax.SetToMax (p2d2);
-  */
-
-  Line2d l1 (p2d1, p2d2);
-
-  double lam1, lam2;
-  double eps = 1e-3;
-  
-  for (j = 1; j <= nseg; j++)
-    {
-      const STLBoundarySeg & seg = GetSegment(j);
-
-      if (!box2d.Intersect (seg.BoundingBox()))
-	continue;
-      /*
-      if (seg.P2DMin()(0) > pmax(0)) continue;
-      if (seg.P2DMin()(1) > pmax(1)) continue;
-      if (seg.P2DMax()(0) < pmin(0)) continue;
-      if (seg.P2DMax()(1) < pmin(1)) continue;
-      */
-
-      if (seg.IsSmoothEdge()) continue;
-
-      const Point<2> & sp1 = seg.P2D1();
-      const Point<2> & sp2 = seg.P2D2();
-      
-
-      Line2d l2 (sp1, sp2);
-      
-      int err =
-	CrossPointBarycentric (l1, l2, lam1, lam2);
-      /*
-      if (chartdebug)
-	{
-	  
-	  (*testout) << "lam1 = " << lam1 << ", lam2 = " << lam2 << endl;
-	  (*testout) << "p2d = " << p2d1 << ", " << p2d2 << endl;
-	  (*testout) << "sp2d = " << sp1 << ", " << sp2 << endl;
-	  (*testout) << "i1,2 = " << seg.I1() << ", " << seg.I2() << endl;
-	  
-	}
-      */
-      if (!err && lam1 > eps && lam1 < 1-eps &&
-	  lam2 > eps && lam2 < 1-eps)
-	return 0;
-    }
-  return 1;
-}
-
-
-
-STLDoctorParams :: STLDoctorParams()
-{
-  drawmeshededges = 1;
-  geom_tol_fact = 1E-6;
-  longlinefact = 0;
-  showexcluded = 1;
-
-  selectmode = 0;
-  edgeselectmode = 0;
-  useexternaledges = 0;
-  showfaces = 0;
-  showtouchedtrigchart = 1;
-  showedgecornerpoints = 1;
-  conecheck = 1;
-  spiralcheck = 1;
-  selecttrig = 0;
-  nodeofseltrig = 1;
-  selectwithmouse = 1;
-  showmarkedtrigs = 1;
-  dirtytrigfact = 0.001;
-  smoothangle = 90;
-  smoothnormalsweight = 0.2;
-  vicinity = 0;
-  showvicinity = 0;
-}
-
-
-
-STLDoctorParams stldoctor;
-
-void STLDoctorParams :: Print (ostream & ost) const
-{
-  ost << "STL doctor parameters:" << endl
-      << "selecttrig = " << selecttrig << endl
-      << "selectlocalpoint = " << nodeofseltrig << endl
-      << "selectwithmouse = " << selectwithmouse << endl
-      << "showmarkedtrigs = " << showmarkedtrigs << endl
-      << "dirtytrigfact = " << dirtytrigfact << endl
-      << "smoothangle = " << smoothangle << endl;
-}
-
-
-STLParameters ::   STLParameters()
-{
-  yangle = 30;
-  contyangle = 20;
-  edgecornerangle = 60;
-  chartangle = 15;
-  outerchartangle = 70;
-     
-  usesearchtree = 0;
-  atlasminh = 1E-4;
-  resthsurfcurvfac = 2;
-  resthsurfcurvenable = 0;
-  resthatlasfac = 2;
-  resthatlasenable = 1;
-  resthchartdistfac = 1.2;
-  resthchartdistenable = 1;
-  resthlinelengthfac = 0.5;
-  resthlinelengthenable = 1;
-  resthcloseedgefac = 1;
-  resthcloseedgeenable = 1;
-  resthedgeanglefac = 1;
-  resthedgeangleenable = 0;
-  resthsurfmeshcurvfac = 1;
-  resthsurfmeshcurvenable = 0;
-  recalc_h_opt = 1;
-}
-
-void STLParameters :: Print (ostream & ost) const
-{
-  ost << "STL parameters:" << endl
-      << "yellow angle = " << yangle << endl
-      << "continued yellow angle = " << contyangle << endl
-      << "edgecornerangle = " << edgecornerangle << endl
-      << "chartangle = " << chartangle << endl
-      << "outerchartangle = " << outerchartangle << endl
-      << "restrict h due to ..., enable and safety factor: " << endl
-      << "surface curvature: " << resthsurfcurvenable
-      << ", fac = " << resthsurfcurvfac << endl
-      << "atlas surface curvature: " << resthatlasenable
-      << ", fac = " << resthatlasfac << endl
-      << "chart distance: " << resthchartdistenable
-      << ", fac = " << resthchartdistfac << endl
-      << "line length: " << resthlinelengthenable
-      << ", fac = " << resthlinelengthfac << endl
-      << "close edges: " << resthcloseedgeenable
-      << ", fac = " << resthcloseedgefac << endl
-      << "edge angle: " << resthedgeangleenable
-      << ", fac = " << resthedgeanglefac << endl;
-}
-
-
-STLParameters stlparam;
-
-
-}
diff --git a/contrib/Netgen/libsrc/stlgeom/stltool.hpp b/contrib/Netgen/libsrc/stlgeom/stltool.hpp
deleted file mode 100644
index 278a7ce4ee1c29fffd17ead3b187d7bbdca7089d..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stltool.hpp
+++ /dev/null
@@ -1,271 +0,0 @@
-#ifndef FILE_STLTOOL
-#define FILE_STLTOOL
-
-
-//#include "gprim/gprim.hh"
-
-/**************************************************************************/
-/* File:   stlgeom.hh                                                     */
-/* Author: Joachim Schoeberl                                              */
-/* Author2: Johannes Gerstmayr                                            */
-/* Date:   20. Nov. 99                                                    */
-/**************************************************************************/
-
-
-
-// use one normal vector for whole chart
-extern int usechartnormal;
-extern int chartdebug;
-
-extern int geomsearchtreeon;
-extern int AddPointIfNotExists(ARRAY<Point3d>& ap, const Point3d& p, double eps = 1e-8);
-//get distance from line lp1-lp2 to point p
-extern double GetDistFromLine(const Point<3>& lp1, const Point<3>& lp2, Point<3>& p);
-extern double GetDistFromInfiniteLine(const Point<3>& lp1, const Point<3>& lp2, const Point<3>& p);
-
-
-extern void FIOReadInt(istream& ios, int& i);
-extern void FIOWriteInt(ostream& ios, const int& i);
-extern void FIOReadDouble(istream& ios, double& i);
-extern void FIOWriteDouble(ostream& ios, const double& i);
-extern void FIOReadFloat(istream& ios, float& i);
-extern void FIOWriteFloat(ostream& ios, const float& i);
-extern void FIOReadString(istream& ios, char* str, int len);
-extern void FIOReadStringE(istream& ios, char* str, int len);
-extern void FIOWriteString(ostream& ios, char* str, int len);
-
-
-typedef ARRAY <int> * ARRAYINTPTR;
-
-class STLGeometry;
-
-class STLChart
-{
-private:
-  STLGeometry * geometry;
-  ARRAY<int>* charttrigs; // trigs which only belong to this chart
-  ARRAY<int>* outertrigs; // trigs which belong to other charts
-  Box3dTree * searchtree; // ADT containing outer trigs
-
-  ARRAY<twoint>* olimit; //outer limit of outer chart
-  ARRAY<twoint>* ilimit; //outer limit of inner chart
-
-
-public:
-  
-  STLChart(STLGeometry * ageometry);
-  void AddChartTrig(int i);
-  void AddOuterTrig(int i);
-  
-  int IsInWholeChart(int nr) const;
-
-  int GetChartTrig(int i) const {return charttrigs->Get(i);}
-  int GetOuterTrig(int i) const {return outertrigs->Get(i);}
-  //get all trigs:
-  int GetTrig(int i) const
-    {
-      if (i <= charttrigs->Size()) {return charttrigs->Get(i);}
-      else {return outertrigs->Get(i-charttrigs->Size());}
-    }
-  
-  int GetNChartT() const {return charttrigs->Size();}
-  int GetNOuterT() const {return outertrigs->Size();}
-  int GetNT() const {return charttrigs->Size()+outertrigs->Size(); }
-
-  void GetTrianglesInBox (const Point3d & pmin,
-			  const Point3d & pmax,
-			  ARRAY<int> & trias) const;
-  void AddOLimit(twoint l) {olimit->Append(l);}
-  void AddILimit(twoint l) {ilimit->Append(l);}
-
-  void ClearOLimit() {olimit->SetSize(0);}
-  void ClearILimit() {ilimit->SetSize(0);}
-
-  int GetNOLimit() const {return olimit->Size();}
-  int GetNILimit() const {return ilimit->Size();}
-
-  twoint GetOLimit(int i) const {return olimit->Get(i);}
-  twoint GetILimit(int i) const {return ilimit->Get(i);}
-
-  //move triangles trigs (local chart-trig numbers) to outer chart
-  void MoveToOuterChart(const ARRAY<int>& trigs);
-  void DelChartTrigs(const ARRAY<int>& trigs);
-
-
-  // define local coordinate system, JS:
-private:
-  Vec<3> normal;
-  Point<3> pref;
-  Vec<3> t1, t2;
-public:
-  void SetNormal (const Point<3> & apref, const Vec<3> & anormal);
-  const Vec<3> & GetNormal () const { return normal; }
-  Point<2> Project2d (const Point<3> & p3d) const;
-};
-
-class STLBoundarySeg
-{
-  Point<3> p1, p2, center;
-  Point<2> p2d1, p2d2;
-  Box<2> boundingbox;
-  //  Point<2> p2dmin, p2dmax;
-
-  double rad;
-  int i1, i2;
-  int smoothedge;
-public:
-  STLBoundarySeg () { ; }
-  STLBoundarySeg (int ai1, int ai2, const ARRAY<Point<3> > & points,
-		  const STLChart * achart);
-
-  int operator== (const STLBoundarySeg & s2) const
-    { return i1 == s2.i1 && i2 == s2.i2; }
-  void Swap ();
-  int I1() const { return i1; }
-  int I2() const { return i2; }
-  const Point<3> & P1() const { return p1; }
-  const Point<3> & P2() const { return p2; }
-  const Point<2> & P2D1() const { return p2d1; }
-  const Point<2> & P2D2() const { return p2d2; }
-  const Point<2> & P2DMin() const { return boundingbox.PMin(); }
-  const Point<2> & P2DMax() const { return boundingbox.PMax(); }
-  const Point<3> & Center() const { return center; }
-  const Box<2> & BoundingBox() const { return boundingbox; }
-  double Radius () const { return rad; }
-
-  void SetSmoothEdge (int se) { smoothedge = se; }
-  int IsSmoothEdge () const { return smoothedge; }
-  friend class STLBoundary;
-};
-
-class STLBoundary
-{
-private:
-  STLGeometry * geometry;
-  const STLChart * chart;
-  ARRAY<STLBoundarySeg> boundary;
-public:
-  STLBoundary(STLGeometry * ageometry);
-  // : boundary() {};
-
-  void Clear() {boundary.SetSize(0);};
-  void SetChart (const STLChart * achart) { chart = achart; }
-  //don't check, if already exists!
-  void AddNewSegment(const STLBoundarySeg & seg) {boundary.Append(seg);};
-  //check if segment exists
-  void AddOrDelSegment(const STLBoundarySeg & seg);
-  //addordelsegment for all 3 triangle segments!
-  void AddTriangle(const STLTriangle & t);
-  int NOSegments() {return boundary.Size();};
-  const STLBoundarySeg & GetSegment(int i) {return boundary.Get(i);}
-
-  int TestSeg(const Point<3> & p1, const Point<3> & p2, const Vec<3> & sn, 
-	      double sinchartangle, int divisions, ARRAY<Point<3> >& points,
-	      double eps);
-
-  int TestSegChartNV(const Point3d& p1, const Point3d& p2, const Vec3d& sn);
-};
-
-
-class STLDoctorParams
-{
-public:
-  int drawmeshededges;
-  double geom_tol_fact;
-
-  double longlinefact;
-  int showexcluded;
-
-  int selectmode; //0==trig, 1==edge, 2==point, 3==multiedge, 4==line cluster
-  int edgeselectmode;
-
-  int useexternaledges;
-  int showfaces;
-  int showedgecornerpoints;
-  int showtouchedtrigchart;
-  int conecheck;
-  int spiralcheck;
-  int selecttrig;
-  int nodeofseltrig;
-  int selectwithmouse;
-  int showmarkedtrigs;
-  double dirtytrigfact;
-  double smoothangle;
-
-  double smoothnormalsweight;
-
-  int showvicinity;
-  int vicinity;
-  ///
-  STLDoctorParams();
-  ///
-  void Print (ostream & ost) const;
-};
-
-extern STLDoctorParams stldoctor;
-
-
-
-class STLParameters
-{
-public:
-  /// angle for edge detection
-  double yangle;
-  double contyangle; //edges continued with contyangle
-  /// angle of geometry edge at which the mesher should set a point
-  double edgecornerangle;
-  /// angle inside on chart
-  double chartangle;
-  /// angle for overlapping parts of char
-  double outerchartangle;
-  /// 0 .. no, 1 .. local, (2 .. global)
-  int usesearchtree;
-  ///
-  double resthatlasfac; 
-  int resthatlasenable;
-  double atlasminh;
-
-  double resthsurfcurvfac; 
-  int resthsurfcurvenable;
-
-  double resthchartdistfac;
-  int resthchartdistenable;
-
-  double resthcloseedgefac;
-  int resthcloseedgeenable;
-  
-  double resthedgeanglefac;
-  int resthedgeangleenable;
-  
-  double resthsurfmeshcurvfac;
-  int resthsurfmeshcurvenable;
-  
-  double resthlinelengthfac;
-  int resthlinelengthenable;
-
-  ///
-  int recalc_h_opt;
-  ///
-  STLParameters();
-  ///
-  void Print (ostream & ost) const;
-};
-
-extern STLParameters stlparam;
-
-
-void STLMeshing (STLGeometry & geom,
-		 class Mesh & mesh);
-
-
-int STLSurfaceMeshing (STLGeometry & geom,
-			class Mesh & mesh);
-
-void STLSurfaceOptimization (STLGeometry & geom,
-			     class Mesh & mesh,
-			     class MeshingParameters & mparam);
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/stlgeom/stltopology.cpp b/contrib/Netgen/libsrc/stlgeom/stltopology.cpp
deleted file mode 100644
index 1d5315fbec9b6e6fabd53fd5e3b820474b706fae..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stltopology.cpp
+++ /dev/null
@@ -1,1067 +0,0 @@
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-#include <meshing.hpp>
-
-#include "stlgeom.hpp"
-
-namespace netgen
-{
-
-
-STLTopology :: STLTopology()
-  : trias(), topedges(), points(), ht_topedges(NULL), 
-    neighbourtrigs(), trigsperpoint()
-{
-  ;
-}
-
-STLTopology :: ~STLTopology()
-{
-  ;
-}
-
-
-
-
-STLGeometry *  STLTopology :: LoadBinary (istream & ist)
-{
-  STLGeometry * geom = new STLGeometry();
-  ARRAY<STLReadTriangle> readtrigs;
-
-  PrintMessage(1,"Read STL binary file");
-  
-  if (sizeof(int) != 4 || sizeof(float) != 4) 
-    {
-      PrintWarning("for stl-binary compatibility only use 32 bit compilation!!!");
-    }
-
-  //specific settings for stl-binary format
-  const int namelen = 80; //length of name of header in file
-  const int nospaces = 2; //number of spaces after a triangle
-
-  //read header: name
-  char buf[namelen+1];
-  FIOReadStringE(ist,buf,namelen);
-  PrintMessage(5,"header = ",buf);
-
-  //Read Number of facets
-  int nofacets;
-  FIOReadInt(ist,nofacets);
-  PrintMessage(5,"NO facets = ",nofacets);
-
-  Point<3> pts[3];
-  Vec<3> normal;
-
-  int cntface, j;
-  int vertex = 0;
-  float f;
-  char spaces[nospaces+1];
-
-  for (cntface = 0; cntface < nofacets; cntface++)
-    {
-      if (cntface % 10000 == 9999) { PrintDot(); } 
-
-      FIOReadFloat(ist,f); normal(0) = f;
-      FIOReadFloat(ist,f); normal(1) = f;
-      FIOReadFloat(ist,f); normal(2) = f;
-      
-      for (j = 0; j < 3; j++)
-	{
-	  FIOReadFloat(ist,f); pts[j](0) = f;
-	  FIOReadFloat(ist,f); pts[j](1) = f;
-	  FIOReadFloat(ist,f); pts[j](2) = f;	  
-	} 
-
-      readtrigs.Append (STLReadTriangle (pts, normal));
-      FIOReadString(ist,spaces,nospaces);
-    }	    
-  
-
-  geom->InitSTLGeometry(readtrigs);
-
-  return geom;
-}
-
-
-void STLTopology :: SaveBinary (const char* filename, const char* aname)
-{
-  ofstream ost(filename);
-  PrintFnStart("Write STL binary file '",filename,"'");
-
-  if (sizeof(int) != 4 || sizeof(float) != 4) 
-    {PrintWarning("for stl-binary compatibility only use 32 bit compilation!!!");}
-
-  //specific settings for stl-binary format
-  const int namelen = 80; //length of name of header in file
-  const int nospaces = 2; //number of spaces after a triangle
-
-  //write header: aname
-  int i, j;
-  char buf[namelen+1];
-  int strend = 0;
-  for(i = 0; i <= namelen; i++) 
-    {
-      if (aname[i] == 0) {strend = 1;}
-      if (!strend) {buf[i] = aname[i];}
-      else {buf[i] = 0;}
-    }
-
-  FIOWriteString(ost,buf,namelen);
-  PrintMessage(5,"header = ",buf);
-
-  //RWrite Number of facets
-  int nofacets = GetNT();
-  FIOWriteInt(ost,nofacets);
-  PrintMessage(5,"NO facets = ", nofacets);
-
-  float f;
-  char spaces[nospaces+1];
-  for (i = 0; i < nospaces; i++) {spaces[i] = ' ';}
-  spaces[nospaces] = 0;
-
-  for (i = 1; i <= GetNT(); i++)
-    {
-      const STLTriangle & t = GetTriangle(i);
-
-      const Vec<3> & n = t.Normal();
-      f = n(0); FIOWriteFloat(ost,f);
-      f = n(1); FIOWriteFloat(ost,f);
-      f = n(2); FIOWriteFloat(ost,f);
-
-      for (j = 1; j <= 3; j++)
-	{
-	  const Point3d p = GetPoint(t.PNum(j));
-	  
-	  f = p.X(); FIOWriteFloat(ost,f);
-	  f = p.Y(); FIOWriteFloat(ost,f);
-	  f = p.Z(); FIOWriteFloat(ost,f);
-	}
-      FIOWriteString(ost,spaces,nospaces);
-    }
-  PrintMessage(5,"done");
-}
-
-
-void STLTopology :: SaveSTLE (const char* filename)
-{
-  ofstream outf (filename);
-  int i, j;
-  
-  outf << GetNT() << endl;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      const STLTriangle & t = GetTriangle(i);
-      for (j = 1; j <= 3; j++)
-	{
-	  const Point3d p = GetPoint(t.PNum(j));
-	  outf << p.X() << " " << p.Y() << " " << p.Z() << endl;
-	}
-    }
-
-
-  int ned = 0;
-  for (i = 1; i <= GetNTE(); i++)
-    {
-      if (GetTopEdge (i).GetStatus() == ED_CONFIRMED)
-	ned++;
-    }
-  
-  outf << ned << endl;
-
-  for (i = 1; i <= GetNTE(); i++)
-    {
-      const STLTopEdge & edge = GetTopEdge (i);
-      if (edge.GetStatus() == ED_CONFIRMED)
-	for (j = 1; j <= 2; j++)
-	  {
-	    const Point3d p = GetPoint(edge.PNum(j));
-	    outf << p.X() << " " << p.Y() << " " << p.Z() << endl;
-	  }
-    }      
-}
-
-
-
-STLGeometry *  STLTopology :: LoadNaomi (istream & ist)
-{
-  int i;
-  STLGeometry * geom = new STLGeometry();
-  ARRAY<STLReadTriangle> readtrigs;
-
-  PrintFnStart("read NAOMI file format");
-  
-  char buf[100];
-  Vec<3> normal;
-
-  int cntface = 0;
-  int cntvertex = 0;
-  double px, py, pz;
-    
-
-  int noface, novertex;
-  ARRAY<Point<3> > readpoints;
-
-  ist >> buf;
-  if (strcmp (buf, "NODES") == 0)
-    {
-      ist >> novertex;
-      PrintMessage(5,"nuber of vertices = ", novertex);
-      for (i = 0; i < novertex; i++)
-	{
-	  ist >> px;
-	  ist >> py;
-	  ist >> pz;
-	  readpoints.Append(Point<3> (px,py,pz));
-	}
-    }
-  else
-    {
-      PrintFileError("no node information");
-    }
-
-
-  ist >> buf;
-  if (strcmp (buf, "2D_EDGES") == 0)
-    {
-      ist >> noface;
-      PrintMessage(5,"number of faces=",noface);
-      int dummy, p1, p2, p3;
-      Point<3> pts[3];
-
-      for (i = 0; i < noface; i++)
-	{
-	  ist >> dummy; //2
-	  ist >> dummy; //1
-	  ist >> p1;
-	  ist >> p2;
-	  ist >> p3;
-	  ist >> dummy; //0
-
-	  pts[0] = readpoints.Get(p1);
-	  pts[1] = readpoints.Get(p2);
-	  pts[2] = readpoints.Get(p3);
-	  
-	  normal = Cross (pts[1]-pts[0], pts[2]-pts[0]) . Normalize();
-
-	  readtrigs.Append (STLReadTriangle (pts, normal));
-
-	}
-      PrintMessage(5,"read ", readtrigs.Size(), " triangles");
-    }
-  else
-    {
-      PrintMessage(5,"read='",buf,"'\n");
-      PrintFileError("ERROR: no Triangle information");
-    }
-
-  geom->InitSTLGeometry(readtrigs);
-
-  return geom;
-}
-
-void STLTopology :: Save (const char* filename)
-{ 
-  PrintFnStart("Write stl-file '",filename, "'");
-
-  ofstream fout(filename);
-  fout << "solid\n";
-
-  char buf1[50];
-  char buf2[50];
-  char buf3[50];
-
-  int i, j;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      const STLTriangle & t = GetTriangle(i);
-
-      fout << "facet normal ";
-      const Vec3d& n = GetTriangle(i).Normal();
-
-      sprintf(buf1,"%1.9g",n.X());
-      sprintf(buf2,"%1.9g",n.Y());
-      sprintf(buf3,"%1.9g",n.Z());
-
-      fout << buf1 << " " << buf2 << " " << buf3 << "\n";
-      fout << "outer loop\n";
-
-      for (j = 1; j <= 3; j++)
-	{
-	  const Point3d p = GetPoint(t.PNum(j));
-	  
-	  sprintf(buf1,"%1.9g",p.X());
-	  sprintf(buf2,"%1.9g",p.Y());
-	  sprintf(buf3,"%1.9g",p.Z());
-
-	  fout << "vertex " << buf1 << " " << buf2 << " " << buf3 << "\n";
-	}
-
-      fout << "endloop\n";
-      fout << "endfacet\n"; 
-    }
-  fout << "endsolid\n";
-
-  
-  // write also NETGEN surface mesh:
-  ofstream fout2("geom.surf");
-  fout2 << "surfacemesh" << endl;
-  fout2 << GetNP() << endl;
-  for (i = 1; i <= GetNP(); i++)
-    {
-      for (j = 0; j < 3; j++)
-	{
-	  fout2.width(8);
-	  fout2 << GetPoint(i)(j);
-	}
-
-      fout2 << endl;
-    }
-
-  fout2 << GetNT() << endl;
-  for (i = 1; i <= GetNT(); i++)
-    {
-      const STLTriangle & t = GetTriangle(i);  
-      for (j = 1; j <= 3; j++)
-	{
-	  fout2.width(8);
-	  fout2 << t.PNum(j);
-	}
-      fout2 << endl;
-    }
-}
-
-
-STLGeometry *  STLTopology ::Load (istream & ist)
-{
-  int i;
-  STLGeometry * geom = new STLGeometry();
-
-  ARRAY<STLReadTriangle> readtrigs;
-
-  char buf[100];
-  Point<3> pts[3];
-  Vec<3> normal;
-
-  int cntface = 0;
-  int vertex = 0;
-  bool badnormals = 0;
-
-  while (ist.good())
-    {
-      ist >> buf;
-
-      int n = strlen (buf);
-      for (i = 0; i < n; i++)
-	buf[i] = tolower (buf[i]);
-
-      if (strcmp (buf, "facet") == 0)
-	{
-	  cntface++;
-	}
-
-      if (strcmp (buf, "normal") == 0)
-	{
-	  ist >> normal(0)
-	      >> normal(1)
-	      >> normal(2);
-	  normal.Normalize();
-	}
-      
-      if (strcmp (buf, "vertex") == 0)
-	{
-	  ist >> pts[vertex](0)
-	      >> pts[vertex](1)
-	      >> pts[vertex](2);
-
-	  vertex++;
-
-	  if (vertex == 3)
-	    {
-	      if (normal.Length() <= 1e-5)
-
-		{
-		  normal = Cross (pts[1]-pts[0], pts[2]-pts[0]);
-		  normal.Normalize();
-		}
-
-	      else
-
-		{
-		  Vec<3> hnormal;
-		  hnormal = Cross (pts[1]-pts[0], pts[2]-pts[0]);
-		  hnormal.Normalize();
-
-		  if (normal * hnormal < 0.5)
-		    {
-		      badnormals = 1;
-		    }
-		}
-
-	      vertex = 0;
-
-	      if ( (Dist2 (pts[0], pts[1]) > 1e-16) &&
-		   (Dist2 (pts[0], pts[2]) > 1e-16) &&
-		   (Dist2 (pts[1], pts[2]) > 1e-16) )
-		
-		readtrigs.Append (STLReadTriangle (pts, normal));
-	    }
-	}
-    }
-  
-  if (badnormals) 
-    {
-      PrintWarning("File has normal vectors which differ extremly from geometry->correct with stldoctor!!!");
-    }
-
-  geom->InitSTLGeometry(readtrigs);
-  return geom;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-void STLTopology :: InitSTLGeometry(const ARRAY<STLReadTriangle> & readtrigs)
-{
-  int i, j, k;
-  
-  // const double geometry_tol_fact = 1E6; 
-  // distances lower than max_box_size/tol are ignored
-
-  trias.SetSize(0);
-  points.SetSize(0);
-
-  PrintMessage(3,"number of triangles = ", readtrigs.Size());
-
-  if (!readtrigs.Size())
-    return;
-  
-
-  boundingbox.Set (readtrigs[0][0]);
-  for (i = 0; i < readtrigs.Size(); i++)
-    for (k = 0; k < 3; k++)
-      boundingbox.Add (readtrigs[i][k]);
-  
-  PrintMessage(5,"boundingbox: ", Point3d(boundingbox.PMin()), " - ", 
-	       Point3d(boundingbox.PMax()));
-
-  Box<3> bb = boundingbox;
-  bb.Increase (1);
-
-  pointtree = new Point3dTree (bb.PMin(), bb.PMax());
-
-
-
-  ARRAY<int> pintersect;
-
-  pointtol = boundingbox.Diam() * stldoctor.geom_tol_fact;
-  PrintMessage(5,"point tolerance = ", pointtol);
-
-  for(i = 0; i < readtrigs.Size(); i++)
-    {
-      const STLReadTriangle & t = readtrigs[i];
-      STLTriangle st;
-      Vec<3> n = t.Normal();
-      st.SetNormal (t.Normal());
-
-      for (k = 0; k < 3; k++)
-	{
-	  Point<3> p = t[k];
-
-	  Point<3> pmin = p - Vec<3> (pointtol, pointtol, pointtol);
-	  Point<3> pmax = p + Vec<3> (pointtol, pointtol, pointtol);
-	  
-	  pointtree->GetIntersecting (pmin, pmax, pintersect);
-	  
-	  if (pintersect.Size() > 1)
-	    PrintError("too many close points");
-	  int foundpos = -1;
-	  if (pintersect.Size())
-	    foundpos = pintersect[0];
-	  
-	  if (foundpos == -1)
-	    {
-	      foundpos = AddPoint(p);
-	      pointtree->Insert (p, foundpos);
-	    }
-	  st[k] = foundpos;
-	}
-
-      if ( (st[0] == st[1]) ||
-	   (st[0] == st[2]) || 
-	   (st[1] == st[2]) )
-	{
-	  PrintError("STL Triangle degenerated");
-	}
-      else
-	{
-	  AddTriangle(st);
-	}
-      
-    } 
-
-  FindNeighbourTrigs();
-}
-
-
-
-
-int STLTopology :: GetPointNum (const Point<3> & p)
-{
-  Point<3> pmin = p - Vec<3> (pointtol, pointtol, pointtol);
-  Point<3> pmax = p + Vec<3> (pointtol, pointtol, pointtol);
-  
-  ARRAY<int> pintersect;
-
-  pointtree->GetIntersecting (pmin, pmax, pintersect);
-  if (pintersect.Size() == 1)
-    return pintersect[0];
-  else 
-    return 0;
-}
-
-
-
-void STLTopology :: FindNeighbourTrigs()
-{
-  //  if (topedges.Size()) return;
-
-  PushStatusF("Find Neighbour Triangles");
-
-  int i, j, k, l;
-
-  // build up topology tables
-
-  int np = GetNP();
-  int nt = GetNT();
-
-  INDEX_2_HASHTABLE<int> * oldedges = ht_topedges;
-  ht_topedges = new INDEX_2_HASHTABLE<int> (GetNP()+1);
-  topedges.SetSize(0);
-  
-  for (i = 1; i <= nt; i++)
-    {
-      STLTriangle & trig = GetTriangle(i);
-
-
-      for (j = 1; j <= 3; j++)
-	{
-	  int pi1 = trig.PNumMod (j+1);
-	  int pi2 = trig.PNumMod (j+2);
-	  
-	  INDEX_2 i2(pi1, pi2);
-	  i2.Sort();
-
-	  int enr;
-	  int othertn;
-
-	  if (ht_topedges->Used(i2))
-	    {
-	      enr = ht_topedges->Get(i2);
-	      topedges.Elem(enr).TrigNum(2) = i;
-
-	      othertn = topedges.Get(enr).TrigNum(1);
-	      STLTriangle & othertrig = GetTriangle(othertn);
-
-	      trig.NBTrigNum(j) = othertn;
-	      trig.EdgeNum(j) = enr;
-	      for (k = 1; k <= 3; k++)
-		if (othertrig.EdgeNum(k) == enr)
-		  othertrig.NBTrigNum(k) = i;
-	    }
-	  else
-	    {
-	      enr = topedges.Append (STLTopEdge (pi1, pi2, i, 0));
-	      ht_topedges->Set (i2, enr);
-	      trig.EdgeNum(j) = enr;
-	    }
-	}
-    }
-
-  
-  PrintMessage(5,"topology built, checking");
-
-  topology_ok = 1;
-  int ne = GetNTE();
-
-  for (i = 1; i <= nt; i++)
-    GetTriangle(i).flags.toperror = 0;
-
-  for (i = 1; i <= nt; i++)
-    for (j = 1; j <= 3; j++)
-      {
-	const STLTopEdge & edge = GetTopEdge (GetTriangle(i).EdgeNum(j));
-	if (edge.TrigNum(1) != i && edge.TrigNum(2) != i)
-	  {
-	    topology_ok = 0;
-	    GetTriangle(i).flags.toperror = 1;
-	  }
-      }
-
-  for (i = 1; i <= ne; i++)
-    {
-      const STLTopEdge & edge = GetTopEdge (i);
-      if (!edge.TrigNum(2))
-	{
-	  topology_ok = 0;
-	  GetTriangle(edge.TrigNum(1)).flags.toperror = 1;
-	}
-    }
- 
-  if (topology_ok)
-    {
-      orientation_ok = 1;
-      for (i = 1; i <= nt; i++)
-	{
-	  const STLTriangle & t = GetTriangle (i);
-	  for (j = 1; j <= 3; j++)
-	    {
-	      const STLTriangle & nbt = GetTriangle (t.NBTrigNum(j));
-	      if (!t.IsNeighbourFrom (nbt))
-		orientation_ok = 0;
-	    }
-	}
-    }
-  else
-    orientation_ok = 0;
-  
-
-
-  status = STL_GOOD;
-  statustext = "";
-  if (!topology_ok || !orientation_ok)
-    {
-      status = STL_ERROR;
-      if (!topology_ok)
-	statustext = "Topology not ok";
-      else
-	statustext = "Orientation not ok";
-    }
-
-
-  PrintMessage(3,"topology_ok = ",topology_ok);
-  PrintMessage(3,"orientation_ok = ",orientation_ok);
-  PrintMessage(3,"topology found");
-
-  // generate point -> trig table
-
-  trigsperpoint.SetSize(GetNP());
-  for (i = 1; i <= GetNT(); i++)
-    for (j = 1; j <= 3; j++)
-      trigsperpoint.Add1(GetTriangle(i).PNum(j),i);
-
-
-  //check trigs per point:
-  /*
-  for (i = 1; i <= GetNP(); i++)
-    {
-      if (trigsperpoint.EntrySize(i) < 3)
-	{
-	  (*testout) << "ERROR: Point " << i << " has " << trigsperpoint.EntrySize(i) << " triangles!!!" << endl;
-	}
-    }
-  */
-  topedgesperpoint.SetSize (GetNP());
-  for (i = 1; i <= ne; i++)
-    for (j = 1; j <= 2; j++)
-      topedgesperpoint.Add1 (GetTopEdge (i).PNum(j), i);
-
-  PrintMessage(5,"point -> trig table generated");
-
-
-
-  // transfer edge data:
-  // .. to be done
-  delete oldedges;
-
-
-
-  for (STLTrigIndex ti = 0; ti < GetNT(); ti++)
-    {
-      STLTriangle & trig = trias[ti];
-      for (k = 0; k < 3; k++)
-	{
-	  STLPointIndex pi = trig[k] - STLBASE;
-	  STLPointIndex pi2 = trig[(k+1)%3] - STLBASE;
-	  STLPointIndex pi3 = trig[(k+2)%3] - STLBASE;
-	  
-	  // vector along edge
-	  Vec<3> ve = points[pi2] - points[pi];
-	  ve.Normalize();
-
-	  // vector along third point
-	  Vec<3> vt = points[pi3] - points[pi];
-	  vt -= (vt * ve) * ve;
-	  vt.Normalize();
-
-	  Vec<3> vn = trig.GeomNormal (points);
-	  vn.Normalize();
-
-	  double phimin = 10, phimax = -1; // out of (0, 2 pi)
-
-	  for (j = 0; j < trigsperpoint[pi].Size(); j++)
-	    {
-	      STLTrigIndex ti2 = trigsperpoint[pi][j] - STLBASE;
-	      const STLTriangle & trig2 = trias[ti2];
-
-	      if (ti == ti2) continue;
-	      
-	      bool hasboth = 0;
-	      for (l = 0; l < 3; l++)
-		if (trig2[l] - STLBASE == pi2)
-		  {
-		    hasboth = 1;
-		    break;
-		  }
-	      if (!hasboth) continue;
-
-	      STLPointIndex pi4;
-	      for (l = 0; l < 3; l++)
-		if (trig2[l] - STLBASE != pi && trig2[l] - STLBASE != pi2)
-		  pi4 = trig2[l] - STLBASE;
-
-	      Vec<3> vt2 = points[pi4] - points[pi];
-	      
-	      double phi = atan2 (vt2 * vn, vt2 * vt);
-	      if (phi < 0) phi += 2 * M_PI;
-	      
-	      if (phi < phimin)
-		{
-		  phimin = phi;
-		  trig.NBTrig (0, (k+2)%3) = ti2 + STLBASE;
-		}
-	      if (phi > phimax)
-		{
-		  phimax = phi;
-		  trig.NBTrig (1, (k+2)%3) = ti2 + STLBASE;
-		}
-	    }
-	}
-    }
-
-
-
-
-  if (status == STL_GOOD)
-    {
-      // for compatibility:
-      neighbourtrigs.SetSize(GetNT());
-      for (i = 1; i <= GetNT(); i++)
-	for (k = 1; k <= 3; k++)
-	  AddNeighbourTrig (i, GetTriangle(i).NBTrigNum(k));
-    }
-  else
-    {
-      // assemble neighbourtrigs (should be done only for illegal topology):
-      
-      neighbourtrigs.SetSize(GetNT());
-
-      int tr, found;
-      int wrongneighbourfound = 0;
-      for (i = 1; i <= GetNT(); i++)
-	{
-	  SetThreadPercent((double)i/(double)GetNT()*100.);
-	  if (multithread.terminate)
-	    {
-	      PopStatus();
-	      return;
-	    }
-	  
-	  for (k = 1; k <= 3; k++)
-	    {
-	      for (j = 1; j <= trigsperpoint.EntrySize(GetTriangle(i).PNum(k)); j++)
-		{
-		  tr = trigsperpoint.Get(GetTriangle(i).PNum(k),j);
-		  if (i != tr && (GetTriangle(i).IsNeighbourFrom(GetTriangle(tr))
-				  || GetTriangle(i).IsWrongNeighbourFrom(GetTriangle(tr))))
-		    {
-		      if (GetTriangle(i).IsWrongNeighbourFrom(GetTriangle(tr)))
-			{
-			  /*(*testout) << "ERROR: triangle " << i << " has a wrong neighbour triangle!!!" << endl;*/
-			  wrongneighbourfound ++;
-			}
-		      
-		      found = 0;
-		      for (int ii = 1; ii <= NONeighbourTrigs(i); ii++) 
-			{if (NeighbourTrig(i,ii) == tr) {found = 1;break;};}
-		      if (! found) {AddNeighbourTrig(i,tr);}
-		    }
-		}
-	    }
-	  if (NONeighbourTrigs(i) != 3) 
-	    {
-	      PrintError("TRIG ",i," has ",NONeighbourTrigs(i)," neighbours!!!!");
-	      for (int kk=1; kk <= NONeighbourTrigs(i); kk++)
-		{
-		  PrintMessage(5,"neighbour-trig",kk," = ",NeighbourTrig(i,kk));
-		}
-	    };
-	}
-      if (wrongneighbourfound)
-	{
-	  PrintError("++++++++++++++++++++\n");
-	  PrintError(wrongneighbourfound, " wrong oriented neighbourtriangles found!");
-	  PrintError("try to correct it (with stldoctor)!");
-	  PrintError("++++++++++++++++++++\n");
-	  
-	  status = STL_ERROR;
-	  statustext = "STL Mesh not consistent";
-
-	  multithread.terminate = 1;
-#ifdef STAT_STREAM
-	  (*statout) << "non-conform stl geometry \\hline" << endl;
-#endif
-	}
-    }
-
-  TopologyChanged();
-
-  PopStatus();
-}
-
-
-
-
-
-
-
-void STLTopology :: GetTrianglesInBox (/* 
-					  const Point<3> & pmin,
-					  const Point<3> & pmax,
-				       */
-				       const Box<3> & box,
-				       ARRAY<int> & trias) const
-{
-  if (searchtree)
-
-    searchtree -> GetIntersecting (box.PMin(), box.PMax(), trias);
-  
-  else
-    {    
-      int i;
-      Box<3> box1 = box;
-      box1.Increase (1e-4);
-
-      trias.SetSize(0);
-   
-      int nt = GetNT();
-      for (i = 1; i <= nt; i++)
-	{
-	  if (box1.Intersect (GetTriangle(i).box))
-	    {
-	      trias.Append (i);
-	    }
-	}    
-    }
-}
-
-
-
-void STLTopology :: AddTriangle(const STLTriangle& t)
-{
-  trias.Append(t);
-  
-  const Point<3> & p1 = GetPoint (t.PNum(1));
-  const Point<3> & p2 = GetPoint (t.PNum(2));
-  const Point<3> & p3 = GetPoint (t.PNum(3));
-
-  Box<3> box;
-  box.Set (p1);
-  box.Add (p2);
-  box.Add (p3);
-  /*
-  //  Point<3> pmin(p1), pmax(p1);
-  pmin.SetToMin (p2);
-  pmin.SetToMin (p3);
-  pmax.SetToMax (p2);
-  pmax.SetToMax (p3);
-  */
-
-  trias.Last().box = box; 
-  trias.Last().center = Center (p1, p2, p3);
-  double r1 = Dist (p1, trias.Last().center);
-  double r2 = Dist (p2, trias.Last().center);
-  double r3 = Dist (p3, trias.Last().center);
-  trias.Last().rad = max2 (max2 (r1, r2), r3);
-
-  if (geomsearchtreeon)
-    {searchtree->Insert (box.PMin(), box.PMax(), trias.Size());}
-}
-
-
-
-
-int STLTopology :: GetLeftTrig(int p1, int p2) const
-{
-  int i;
-  for (i = 1; i <= trigsperpoint.EntrySize(p1); i++)
-    {
-      if (GetTriangle(trigsperpoint.Get(p1,i)).HasEdge(p1,p2)) {return trigsperpoint.Get(p1,i);}
-    }
-  PrintSysError("ERROR in GetLeftTrig !!!");
-
-  return 0;
-}
-
-int STLTopology :: GetRightTrig(int p1, int p2) const
-{
-  return GetLeftTrig(p2,p1);
-}
-
-
-int STLTopology :: NeighbourTrigSorted(int trig, int edgenum) const
-{
-  int i, p1, p2;
-  int psearch = GetTriangle(trig).PNum(edgenum);
-
-  for (i = 1; i <= 3; i++)
-    {
-      GetTriangle(trig).GetNeighbourPoints(GetTriangle(NeighbourTrig(trig,i)),p1,p2);
-      if (p1 == psearch) {return NeighbourTrig(trig,i);}
-    }
-
-  PrintSysError("ERROR in NeighbourTrigSorted");
-  return 0;
-}
-
-
-
-
-
-
-int STLTopology :: GetTopEdgeNum (int pi1, int pi2) const
-{
-  if (!ht_topedges) return 0;
-
-  INDEX_2 i2(pi1, pi2);
-  i2.Sort();
-
-  if (!ht_topedges->Used(i2)) return 0;
-  return ht_topedges->Get(i2);
-}
-
-
-
-
-void STLTopology :: InvertTrig (int trig)
-{
-  if (trig >= 1 && trig <= GetNT())
-    {
-      GetTriangle(trig).ChangeOrientation();
-      FindNeighbourTrigs();
-    }
-  else
-    {
-      PrintUserError("no triangle selected!");
-    }
-}
-
-
-
-
-void STLTopology :: DeleteTrig (int trig)
-{
-  if (trig >= 1 && trig <= GetNT())
-    {
-      trias.DeleteElement(trig);
-      FindNeighbourTrigs();
-    }
-  else
-    {
-      PrintUserError("no triangle selected!");
-    }
-}
-
-
-
-void STLTopology :: OrientAfterTrig (int trig)
-{
-  int starttrig = trig;
-
-  if (starttrig >= 1 && starttrig <= GetNT())
-    {
-
-      ARRAY <int> oriented;
-      oriented.SetSize(GetNT());
-      int i;
-      for (i = 1; i <= oriented.Size(); i++)
-	{
-	  oriented.Elem(i) = 0;
-	}
- 
-      oriented.Elem(starttrig) = 1;
-  
-      int j = 0,k;
-      
-      ARRAY <int> list1;
-      list1.SetSize(0);
-      ARRAY <int> list2;
-      list2.SetSize(0);
-      list1.Append(starttrig);
-
-      int cnt = 1;
-      int end = 0;
-      int nt;
-      while (!end)
-	{
-	  end = 1;
-	  for (i = 1; i <= list1.Size(); i++)
-	    {
-	      const STLTriangle& tt = GetTriangle(list1.Get(i));
-	      for (k = 1; k <= 3; k++)
-		{
-		  nt = tt.NBTrigNum (k); // NeighbourTrig(list1.Get(i),k);
-		  if (oriented.Get(nt) == 0)
-		    {
-		      if (tt.IsWrongNeighbourFrom(GetTriangle(nt)))
-			{
-			  GetTriangle(nt).ChangeOrientation();
-			}
-		      oriented.Elem(nt) = 1;
-		      list2.Append(nt);
-		      cnt++;
-		      end = 0;
-		    }
-		}
-	    }
-	  list1.SetSize(0);
-	  for (i = 1; i <= list2.Size(); i++)
-	    {
-	      list1.Append(list2.Get(i));
-	    }
-	  list2.SetSize(0);
-	}
-
-      PrintMessage(5,"NO corrected triangles = ",cnt);
-      if (cnt == GetNT()) 
-	{
-	  PrintMessage(5,"ALL triangles oriented in same way!");
-	}
-      else
-	{
-	  PrintWarning("NOT ALL triangles oriented in same way!");
-	}
-
-      //      topedges.SetSize(0);
-      FindNeighbourTrigs();
-    }
-  else
-    {
-      PrintUserError("no triangle selected!");
-    }
-}
-
-
-}
diff --git a/contrib/Netgen/libsrc/stlgeom/stltopology.hpp b/contrib/Netgen/libsrc/stlgeom/stltopology.hpp
deleted file mode 100644
index 80e5a68178bb215cf6e2ef8d4ae38de00039815a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/stlgeom/stltopology.hpp
+++ /dev/null
@@ -1,362 +0,0 @@
-#ifndef FILE_STLTOPOLOGY
-#define FILE_STLTOPOLOGY
-
-/**************************************************************************/
-/* File:   stltopology.hpp                                                */
-/* Author: Joachim Schoeberl                                              */
-/* Author2: Johannes Gerstmayr                                            */
-/* Date:   26. Jul. 99                                                    */
-/**************************************************************************/
-
-/*
-  The STLTopology contains topologic information as
-  triangle->point, point->triangles, triangle->edge, 2-points->edge,...
-*/
-
-
-class STLGeometry;
-
-#define STLBASE 1
-
-class STLPointIndex
-{
-  int i;
-public:
-  STLPointIndex () { ; }
-  STLPointIndex (int ai) : i(ai) { ; }
-  STLPointIndex & operator= (const STLPointIndex & ai) { i = ai.i; return *this; }
-  STLPointIndex & operator= (int ai) { i = ai; return *this; }
-  operator int () const { return i; }
-  STLPointIndex operator++ (int) { return i++; }
-  STLPointIndex operator-- (int) { return i--; }
-};
-
-
-
-class STLTrigIndex
-{
-  int i;
-public:
-  STLTrigIndex () { ; }
-  STLTrigIndex (int ai) : i(ai) { ; }
-  STLTrigIndex & operator= (const STLTrigIndex & ai) { i = ai.i; return *this; }
-  STLTrigIndex & operator= (int ai) { i = ai; return *this; }
-  operator int () const { return i; }
-  STLTrigIndex operator++ (int) { return i++; }
-  STLTrigIndex operator-- (int) { return i--; }
-};
-
-
-
-
-
-// triangle structure for loading stl files
-class STLReadTriangle
-{
-  Vec<3> normal;
-  Point<3> pts[3];
-public:
-  STLReadTriangle (const Point<3> * apts, const Vec<3> & anormal);
-  STLReadTriangle () {};
-  const Point<3> & operator[] (int i) const { return pts[i]; }
-  const Vec<3> & Normal() const { return normal; }
-};
-
-
-
-class STLTriangle
-{
-  // topology edges of triangle, edge[i] opposite to point[i]
-  int topedges[3];
-  // neighbour triangles, trig[i] opposite to point[i]
-  int nbtrigs[2][3]; 
-  // normalized stored normal vector ??
-  Vec<3> normal;
-  // point numbers of triangle
-  int pts[3];
-  // front-side and back-side domains
-  int domains[2];
-
-
-public:
-
-  Box<3> box;
-  Point<3> center;
-  double rad;
-  int facenum;
-
-  struct 
-  {
-    unsigned int toperror : 1;
-  } flags;
-
-
-
-
-  STLTriangle (const int * apts);
-  STLTriangle () {pts[0]=0;pts[1]=0;pts[2]=0;}
-
-  int operator[] (int i) const { return pts[i]; }
-  int & operator[] (int i) { return pts[i]; }
-
-  int EdgeNum(int i) const { return topedges[(i-1)]; }
-  int & EdgeNum(int i) { return topedges[(i-1)]; }
-
-  int NBTrig (bool side, int i) const { return nbtrigs[side][i]; }
-  int & NBTrig (bool side, int i) { return nbtrigs[side][i]; }
-
-  
-  int Domain (bool side) const { return domains[side]; }
-  int & Domain (bool side) { return domains[side]; }
-
-
-
-  // obsolete:
-  int PNum(int i) const { return pts[(i-1)]; }
-  int & PNum(int i) { return pts[(i-1)]; }
-  int PNumMod(int i) const { return pts[(i-1)%3]; }
-  int & PNumMod(int i)  { return pts[(i-1)%3]; }
-
-  int EdgeNumMod(int i) const { return topedges[(i-1)%3]; }
-  int & EdgeNumMod(int i)  { return topedges[(i-1)%3]; }
-
-  int NBTrigNum(int i) const { return nbtrigs[0][(i-1)]; }
-  int & NBTrigNum(int i) { return nbtrigs[0][(i-1)]; }
-  int NBTrigNumMod(int i) const { return nbtrigs[0][(i-1)%3]; }
-  int & NBTrigNumMod(int i)  { return nbtrigs[0][(i-1)%3]; }
-  
-
-  // consistently oriented neighbour:
-  int IsNeighbourFrom(const STLTriangle& t) const;
-  // opposite to consistently oriented neighbour:
-  int IsWrongNeighbourFrom(const STLTriangle& t) const;
-
-  ///Get the two points of neighbour-Triangles in orientation of this-Triangle
-  void GetNeighbourPoints(const STLTriangle& t, int& p1, int& p2) const;
-  int GetNeighbourPointsAndOpposite(const STLTriangle& t, int& p1, int& p2, int& po) const;
-
-
-
-  // NON-normalized geometry - normal vector
-  Vec<3> GeomNormal(const ARRAY<Point<3> >& ap) const;
-  
-  // Stored normal vector, normalized
-  void SetNormal (const Vec<3> & n);
-  const Vec<3> & Normal () const { return normal; }
-
-
-  void ChangeOrientation(); 
-
-  //project with a certain normal vector in plane
-  void ProjectInPlain(const ARRAY<Point<3> >& ap, 
-		      const Vec<3> & n, Point<3> & pp) const;
-  //project with the triangle's normal vector in plane
-  void ProjectInPlain(const ARRAY<Point<3> > & ap, Point<3> & pp) const;
-
-
-  /*
-    Project the point pp along the nproj into the plane of
-    the triangle. The triangle normal is given by ntrig to 
-    avoid numerical instabilities.
-    The local coordinates lam are defined by
-
-    pp(input) = P1 + lam1 v1 + lam2 v2 + lam3 n
-
-    the result is
-    
-    pp(output) = P1 + lam1 v1 + lam2 v2
-  */
-  int ProjectInPlain (const ARRAY<Point<3> >& ap, 
-		      const Vec<3> & nproj, 
-		      Point<3> & pp, Vec<3> & lam) const;
-
-  int PointInside(const ARRAY<Point<3> >& ap, const Point<3> & pp) const;
-
-  //get nearest point on triangle and distance to it
-  double GetNearestPoint(const ARRAY<Point<3> >& ap, 
-			 Point<3> & p3d) const;
-
-  double Area(const ARRAY<Point<3> >& ap) const;
-
-  double MinHeight(const ARRAY<Point<3> >& ap) const;
-  double MaxLength(const ARRAY<Point<3> >& ap) const; 
-  //max length of a side of triangle
-
-  int GetFaceNum() {return facenum;}
-  void SetFaceNum(int i) {facenum = i;}
-
-  int HasEdge(int p1, int p2) const;
-};
-
-
-/**
-   Topology Edge:
-   Useful unside a face.
-   A edges sharing more than 2 faces: trigs are undefined 
- */
-class STLTopEdge 
-{
-  int pts[2];  
-  int trigs[2];  
-  double cosangle;
-  int status;  // excluded, confirmed, candidate, undefined
-public:
-  STLTopEdge ();
-  STLTopEdge (int p1, int p2, int trig1, int trig2);
-
-  int operator[] (int i) const { return pts[i]; }
-  int & operator[] (int i) { return pts[i]; }
-
-
-  int PNum(int i) const { return pts[(i-1)]; }
-  int & PNum(int i) { return pts[(i-1)]; }
-  int PNumMod(int i) const { return pts[(i-1)%2]; }
-  int & PNumMod(int i)  { return pts[(i-1)%2]; }
-
-  int TrigNum(int i) const { return trigs[(i-1)]; }
-  int & TrigNum(int i) { return trigs[(i-1)]; }
-  int TrigNumMod(int i) const { return trigs[(i-1)%2]; }
-  int & TrigNumMod(int i)  { return trigs[(i-1)%2]; }
-
-  void SetCosAngle (double ca) { cosangle = ca; }
-  double CosAngle () const { return cosangle; }
-  double Angle () const { return acos (cosangle); }
-
-  void SetStatus (int stat) { status = stat; }
-  int GetStatus () const { return status; }
-};
-
-
-
-ostream& operator<<(ostream& os, const STLTriangle& t);
-
-
-
-
-
-
-
-class STLTopology
-{
-protected:
-  ARRAY<STLTriangle> trias;
-  ARRAY<STLTopEdge> topedges;
-  ARRAY<Point<3> > points;
-
-  // mapping of sorted pair of points to topedge
-  INDEX_2_HASHTABLE<int> * ht_topedges;
-  // mapping of node to trigs
-  TABLE<int> trigsperpoint; 
-  // mapping of node to edges
-  TABLE<int> topedgesperpoint; 
-  
-  // searchtree for trigs and points
-
-  Box3dTree * searchtree; // ADT
-  Point3dTree * pointtree;
-
-  Box<3> boundingbox;
-  double pointtol;
-
-public:
-  enum STL_GEOM_STATUS { STL_GOOD, STL_WARNING, STL_ERROR };
-
-protected:
-  STL_GEOM_STATUS status;
-  string statustext;
-  
-  bool topology_ok;
-  bool orientation_ok;
-
-public:
-  STLTopology();
-  virtual ~STLTopology();
-
-  static STLGeometry * LoadNaomi (istream & ist);
-  static STLGeometry * Load (istream & ist);
-  static STLGeometry * LoadBinary (istream & ist);
-
-  void Save (const char* filename);
-  void SaveBinary (const char* filename, const char* aname);
-  void SaveSTLE (const char * filename); // stores trigs and edges
-  
-  virtual void InitSTLGeometry (const ARRAY<STLReadTriangle> & readtrigs);
-
-  virtual void TopologyChanged() {}; //do some things, if topology changed!
-
-  /// Generate topology tables
-  void FindNeighbourTrigs();
-
-  
-  void GetTrianglesInBox (const Box<3> & box,
-			  ARRAY<int> & trias) const;
-
-
-  int GetNP() const { return points.Size(); }
-  int AddPoint(const Point<3> & p) { return points.Append(p); }
-  const Point<3> & GetPoint(int nr) const { return points.Get(nr); }
-  int GetPointNum (const Point<3> & p);
-  void SetPoint(int nr, const Point<3> & p) { points.Elem(nr) = p; }
-  const ARRAY<Point<3> >& GetPoints() const { return points; }
-
-  const Point<3> & operator[] (STLPointIndex i) const { return points[i]; }
-  Point<3> & operator[] (STLPointIndex i) { return points[i]; }
-
-
-
-
-  int GetNT() const { return trias.Size(); }
-  void AddTriangle(const STLTriangle& t);
-  const STLTriangle & GetTriangle (int nr) const { return trias.Get(nr); }
-  STLTriangle & GetTriangle (int nr) { return trias.Elem(nr); }
-  
-  const STLTriangle & operator[] (STLTrigIndex i) const { return trias[i]; }
-  STLTriangle & operator[] (STLTrigIndex i) { return trias[i]; }
-
-
-  int GetNTE() const { return topedges.Size(); }
-  const STLTopEdge & GetTopEdge (int nr) const { return topedges.Get(nr); }
-  STLTopEdge & GetTopEdge (int nr)  { return topedges.Elem(nr); }
-  int GetTopEdgeNum (int pi1, int pi2) const;
-
-
-  int NOTrigsPerPoint(int pn) { return trigsperpoint.EntrySize(pn); }
-  int TrigPerPoint(int pn, int i) { return trigsperpoint.Get(pn, i); }
-
-
-  int NTopEdgesPerPoint (int pn) const { return topedgesperpoint.EntrySize(pn); }
-  int TopEdgePerPoint (int pn, int ei) const { return topedgesperpoint.Get(pn, ei); }
-
-  
-  bool Topology_Ok() const { return topology_ok; }
-  bool Orientation_Ok() const { return orientation_ok; }
-
-  STL_GEOM_STATUS GetStatus () const { return status; }
-  const string & GetStatusText () const { return statustext; }
-
-  void InvertTrig (int trig);
-  void DeleteTrig (int trig);
-  void OrientAfterTrig (int trig);
-
-
-  // Table will be constructed, if topology is not ok
-  /// neighbourtrigs for surfacetrigs
-  TABLE<int> neighbourtrigs;
-
-  /// get nr-th neighbour Triangle for triangle trig
-  int NONeighbourTrigs(int trig) const { return neighbourtrigs.EntrySize(trig); }
-  int NeighbourTrig(int trig, int nr) const { return neighbourtrigs.Get(trig,nr); }
-  int NeighbourTrigSorted(int trig, int nr) const;
-  void AddNeighbourTrig(int i, int nt) { neighbourtrigs.Add1(i, nt); }
-
-
-
-
-  int GetLeftTrig (int p1, int p2) const;
-  int GetRightTrig (int p1, int p2) const;
-
-  const Box<3> & GetBoundingBox () const { return boundingbox; }
-};
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/visualization/Makefile b/contrib/Netgen/libsrc/visualization/Makefile
deleted file mode 100644
index a6302092d965a54f5bd1545c003d71be693b04ef..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# Makefile for visualization library
-#
-src = stlmeshing.cpp mvdraw.cpp vscsg.cpp vsmesh.cpp vsocc.cpp vssolution.cpp meshdoc.cpp
-#
-lib = vis
-libpath = libsrc/visualization
-#
-#
-include ../makefile.inc
-#
-
-
diff --git a/contrib/Netgen/libsrc/visualization/meshdoc.cpp b/contrib/Netgen/libsrc/visualization/meshdoc.cpp
deleted file mode 100644
index 4c0f064c05d9e962bb2d35b5b01979803d855749..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/meshdoc.cpp
+++ /dev/null
@@ -1,615 +0,0 @@
-#include <mystdlib.h>
-
-#include <meshing.hpp>
-
-#include "incvis.hpp"
-
-
-
-namespace netgen
-{
-#include "mvdraw.hpp"
-#include "meshdoc.hpp"
-
-
-MeshDoctorParameters meshdoctor;
-VisualSceneMeshDoctor vsmeshdoc;
-
-extern AutoPtr<Mesh> mesh;
-
-  int Ng_MeshDoctor (ClientData clientData,
-		     Tcl_Interp * interp,
-		     int argc, tcl_const char *argv[])
-{
-  cout << "Mesh Doctor:" << endl;
-  int i;
-  for (i = 0; i < argc; i++)
-    cout << argv[i] << " ";
-  cout << endl;
-
-  meshdoctor.active = 
-    atoi (Tcl_GetVar (interp, "meshdoctor.active", 0)); 
-
-
-  if (argc >= 2)
-    {
-      if (strcmp (argv[1], "markedgedist") == 0)
-	{
-	  vsmeshdoc.SetMarkEdgeDist (atoi (argv[2]));
-	}
-
-      if (strcmp (argv[1], "deletemarkedsegments") == 0)
-	{
-	  for (i = 1; i <= mesh->GetNSeg(); i++)
-	    if (vsmeshdoc.IsSegmentMarked (i))
-	      mesh->DeleteSegment (i);
-
-	  //	  for (i = 1; i <= mesh->GetNSE(); i++)
-	  //	    mesh->SurfaceElement(i).SetIndex (1);
-	  mesh->Compress();
-	}
-    }
-
-
-  vsmeshdoc.UpdateTables ();
-  vsmeshdoc.BuildScene();
-  return TCL_OK;
-}
-
-
-
-
-
-VisualSceneMeshDoctor :: VisualSceneMeshDoctor ()
-  : VisualScene()
-{
-  filledlist = 0;
-  outlinelist = 0;
-  edgelist = 0;
-  selelement = 0;
-  locpi = 1;
-  selpoint = 0;
-  selpoint2 = 0;
-  markedgedist = 1;
-
-  UpdateTables ();
-}
-
-VisualSceneMeshDoctor :: ~VisualSceneMeshDoctor ()
-{
-  ;
-}
-
-void VisualSceneMeshDoctor :: DrawScene ()
-{
-  int i, j, k;
-
-  if (!mesh) return;
-
-  int hchval = mesh->GetNP() + mesh->GetNE() + mesh->GetNSE();
-  if (changeval != hchval)
-    {
-      changeval = hchval;
-      BuildScene();
-    }
-
-
-  glClearColor(backcolor, backcolor, backcolor, 1.0);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-  glEnable (GL_COLOR_MATERIAL);
-  glColor3f (1.0f, 1.0f, 1.0f);
-  glLineWidth (1.0f);
-
-  SetLight();
-
-  glPushMatrix();
-  glMultMatrixf (transformationmat);
-  
-  glInitNames ();
-  glPushName (0);
-  
-  glPolygonOffset (1, 1);
-  glEnable (GL_POLYGON_OFFSET_FILL);
-
-  SetClippingPlane ();
-
-  if (vispar.drawfilledtrigs)
-    glCallList (filledlist);
-
-  glDisable (GL_POLYGON_OFFSET_FILL);
-  
-  if (vispar.drawoutline)
-    glCallList (outlinelist);
-  
-  glPolygonOffset (-1, -1);
-  glEnable (GL_POLYGON_OFFSET_LINE);
-
-  if (vispar.drawedges)
-    glCallList (edgelist);
-  
-
-  glDisable (GL_POLYGON_OFFSET_LINE);
-
-  
-  
-  glPopName();
-
-  if (selpoint > 0 && selpoint <= mesh->GetNP())
-    {
-      GLfloat matcolblue[] = { 0, 0, 1, 1 };
-
-      glPointSize (10);
-      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, matcolblue);
-      glBegin (GL_POINTS);
-      
-      const Point3d p = mesh->Point(selpoint);
-      glVertex3f (p.X(), p.Y(), p.Z());
-      glEnd();
-    }
-
-  glDisable(GL_CLIP_PLANE0);
-
-
-  glPopMatrix();
-  glFinish();  
-}
-
-
-
-
-void VisualSceneMeshDoctor :: BuildScene (int zoomall)
-{
-  int i, j, k;
- 
-
-  if (zoomall)
-    {
-      Point3d pmin, pmax;
-      mesh->GetBox (pmin, pmax, -1);
-
-      if (vispar.centerpoint)
-	center = mesh->Point (vispar.centerpoint);
-      else
-	center = Center (pmin, pmax);
-  
-      rad = 0.5 * Dist (pmin, pmax);
-
-      glEnable (GL_NORMALIZE);
-  
-      CalcTransformationMatrices();
-    }
-
-
-
-
-  if (filledlist)
-    {
-      glDeleteLists (filledlist, 1);
-      glDeleteLists (outlinelist, 1);
-      glDeleteLists (edgelist, 1);
-    }
-
-  
-  filledlist = glGenLists (1);
-  glNewList (filledlist, GL_COMPILE);
-
-  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-  
-  static float matcol0[] = { 0.0f, 0.0f, 0.0f, 1.0f };
-  static float matcol1[] = { 1.0f, 1.0f, 1.0f, 1.0f };
-  static float matcolsel[] = { 1.0f, 0.0f, 0.0f, 1.0f };
-  static float matcolnosel[] = { 0.0f, 1.0f, 0.0f, 1.0f };
-  
-  glLineWidth (1.0f);
-  
-  glDisable (GL_COLOR_MATERIAL);
-    
-  for (i = 1; i <= mesh->GetNSE(); i++)
-    {
-      glLoadName (i);
-
-      // copy to be thread-safe
-      Element2d el = mesh->SurfaceElement (i);
-
-      int drawel = 1;
-      for (j = 1; j <= el.GetNP(); j++)
-	{
-	  if (!el.PNum(j))
-	    drawel = 0;
-	}
-
-      if (!drawel)
-	continue;
-
-      GLfloat matcol[] = { 0, 1, 0, 1 };
-      GLfloat matcolsel[] = { 1, 0, 0, 1 };
-
-      if (i == selelement)
-	glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcolsel);
-      else
-	glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcol);
-
-      if (el.GetNP() == 3)
-	{
-	  glBegin (GL_TRIANGLES);
-	  
-	  const Point3d & lp1 = mesh->Point (el.PNum(1));
-	  const Point3d & lp2 = mesh->Point (el.PNum(2));
-	  const Point3d & lp3 = mesh->Point (el.PNum(3));
-	  Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-	  n /= (n.Length()+1e-12);
-	  glNormal3d (n.X(), n.Y(), n.Z());
-
-	  if (!vispar.colormeshsize)
-	    {
-	      glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	      glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	      glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	    }
-	  else
-	    {
-	      double h1 = mesh->GetH (lp1);
-	      double h2 = mesh->GetH (lp2);
-	      double h3 = mesh->GetH (lp3);
-	      
-	      SetOpenGlColor  (h1, 0.1, 10);
-	      glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-
-	      SetOpenGlColor  (h2, 0.1, 10);
-	      glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-
-	      SetOpenGlColor  (h3, 0.1, 10);
-	      glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	    }	    
-	  glEnd();
-	}
-      else if (el.GetNP() == 4)
-	{
-	  glBegin (GL_QUADS);
-	  
-	  const Point3d & lp1 = mesh->Point (el.PNum(1));
-	  const Point3d & lp2 = mesh->Point (el.PNum(2));
-	  const Point3d & lp3 = mesh->Point (el.PNum(4));
-	  const Point3d & lp4 = mesh->Point (el.PNum(3));
-	  Vec3d n = Cross (Vec3d (lp1, lp2), 
-			   Vec3d (lp1, Center (lp3, lp4)));
-	  n /= (n.Length()+1e-12);
-	  glNormal3d (n.X(), n.Y(), n.Z()); 
-	  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	  glVertex3d (lp4.X(), lp4.Y(), lp4.Z());
-	  glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	  glEnd();
-	}
-      else if (el.GetNP() == 6)
-	{
-	  glBegin (GL_TRIANGLES);
-	  static int trigs[4][3] = {
-	    { 1, 6, 5 },
-	    { 2, 4, 6 },
-	    { 3, 5, 4 },
-	    { 4, 5, 6 } };
-
-	  for (j = 0; j < 4; j++)
-	    {
-	      const Point3d & lp1 = mesh->Point (el.PNum(trigs[j][0]));
-	      const Point3d & lp2 = mesh->Point (el.PNum(trigs[j][1]));
-	      const Point3d & lp3 = mesh->Point (el.PNum(trigs[j][2]));
-	      Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-	      n /= (n.Length() + 1e-12);
-	      glNormal3d (n.X(), n.Y(), n.Z());
-	      glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	      glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	      glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	    }
-	  glEnd();
-	}
-    }
-  glLoadName (0);
-  
-  glEndList ();
-
-  
-  
-  outlinelist = glGenLists (1);
-  glNewList (outlinelist, GL_COMPILE);
-
-  glLineWidth (1.0f);
-  glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-
-  glColor3f (0.0f, 0.0f, 0.0f);
-  glEnable (GL_COLOR_MATERIAL);
-  
-  for (i = 1; i <= mesh->GetNSE(); i++)
-    {
-      Element2d el = mesh->SurfaceElement(i);
-
-      int drawel = 1;
-      for (j = 1; j <= el.GetNP(); j++)
-	{
-	  if (!el.PNum(j))
-	    drawel = 0;
-	}
-
-      if (!drawel)
-	continue;
-
-
-      if (el.GetNP() == 3)
-	{
-	  glBegin (GL_TRIANGLES);
-	  
-	  const Point3d & lp1 = mesh->Point (el.PNum(1));
-	  const Point3d & lp2 = mesh->Point (el.PNum(2));
-	  const Point3d & lp3 = mesh->Point (el.PNum(3));
-	  Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-	  n /= (n.Length() + 1e-12);
-	  glNormal3d (n.X(), n.Y(), n.Z());
-	  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	  glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	  glEnd();
-	}
-      else if (el.GetNP() == 4)
-	{
-	  glBegin (GL_QUADS);
-	  
-	  const Point3d & lp1 = mesh->Point (el.PNum(1));
-	  const Point3d & lp2 = mesh->Point (el.PNum(2));
-	  const Point3d & lp3 = mesh->Point (el.PNum(4));
-	  const Point3d & lp4 = mesh->Point (el.PNum(3));
-	  Vec3d n = Cross (Vec3d (lp1, lp2), 
-			   Vec3d (lp1, Center (lp3, lp4)));
-	  n /= (n.Length() + 1e-12);
-	  glNormal3d (n.X(), n.Y(), n.Z());
-	  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	  glVertex3d (lp4.X(), lp4.Y(), lp4.Z());
-	  glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	  glEnd();
-	}
-      else if (el.GetNP() == 6)
-	{
-	  glBegin (GL_LINES);
-	  
-	  const Point3d & lp1 = mesh->Point (el.PNum(1));
-	  const Point3d & lp2 = mesh->Point (el.PNum(2));
-	  const Point3d & lp3 = mesh->Point (el.PNum(3));
-	  const Point3d & lp4 = mesh->Point (el.PNum(4));
-	  const Point3d & lp5 = mesh->Point (el.PNum(5));
-	  const Point3d & lp6 = mesh->Point (el.PNum(6));
-
-	  Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-	  n /= (n.Length()+1e-12);
-	  glNormal3d (n.X(), n.Y(), n.Z());
-
-	  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	  glVertex3d (lp6.X(), lp6.Y(), lp6.Z());
-	  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	  glVertex3d (lp6.X(), lp6.Y(), lp6.Z());
-
-	  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	  glVertex3d (lp5.X(), lp5.Y(), lp5.Z());
-	  glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	  glVertex3d (lp5.X(), lp5.Y(), lp5.Z());
-
-	  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	  glVertex3d (lp4.X(), lp4.Y(), lp4.Z());
-	  glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	  glVertex3d (lp4.X(), lp4.Y(), lp4.Z());
-	  glEnd();
-	}
-    }
-  glLoadName (0);  
-  glEndList ();
-
-
-
-
-
-  edgelist = glGenLists (1);
-  glNewList (edgelist, GL_COMPILE);
-
-  glDisable (GL_COLOR_MATERIAL);
-
-  GLfloat matcoledge[] = { 0, 0, 1, 1 };
-  GLfloat matcolseledge[] = { 1, 0, 1, 1 };
-
-  glLineWidth (2.0f);
-
-  for (i = 1; i <= mesh->GetNSeg(); i++)
-    {
-      const Segment & seg = mesh->LineSegment(i);
-      const Point3d & p1 = mesh->Point(seg.p1);
-      const Point3d & p2 = mesh->Point(seg.p2);
-
-      if (edgedist.Get(seg.p1) <= markedgedist &&
-	  edgedist.Get(seg.p2) <= markedgedist)
-	{
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
-			matcolseledge);
-	  glLineWidth (4.0f);
-	}
-      else
-	{
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
-			matcoledge);
-	  glLineWidth (2.0f);
-	}
-      glBegin (GL_LINES);
-      glVertex3f (p1.X(), p1.Y(), p1.Z());
-      glVertex3f (p2.X(), p2.Y(), p2.Z());
-      glEnd(); 
-    }
-
-  glLineWidth (1.0f);
-  glEndList ();
-}
-
-
-
-
-void VisualSceneMeshDoctor :: MouseDblClick (int px, int py)
-{
-  cout << "dblclick: " << px << " - " << py << endl;
-  
-  int i, j, k, hits;
-
-  // select surface triangle by mouse click
-  GLuint selbuf[10000];
-  glSelectBuffer (10000, selbuf);
-
-
-  glRenderMode (GL_SELECT);
-
-  GLint viewport[4];
-  glGetIntegerv (GL_VIEWPORT, viewport);
-
-  glMatrixMode (GL_PROJECTION); 
-  glPushMatrix();
-
-  GLdouble projmat[16];
-  glGetDoublev (GL_PROJECTION_MATRIX, projmat);
-
-  glLoadIdentity(); 
-  gluPickMatrix (px, viewport[3] - py, 1, 1, viewport); 
-  glMultMatrixd (projmat);
-  
-
-  glClearColor(backcolor, backcolor, backcolor, 1.0);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-  glMatrixMode (GL_MODELVIEW); 
-
-  glPushMatrix();
-  glMultMatrixf (transformationmat);
-
-  glInitNames();
-  glPushName (1);
-
-  glPolygonOffset (1, 1);
-  glEnable (GL_POLYGON_OFFSET_FILL);
-
-  glCallList (filledlist);
-
-  glDisable (GL_POLYGON_OFFSET_FILL);
-  
-  glPopName();
-
-  glMatrixMode (GL_PROJECTION); 
-  glPopMatrix();
-
-  glMatrixMode (GL_MODELVIEW); 
-  glPopMatrix();
-
-  glFlush();  
-
-	
-  hits = glRenderMode (GL_RENDER);
-
-  cout << "hits = " << hits << endl;
-
-  int minname = 0;
-  GLuint mindepth = 0;
-  for (i = 0; i < hits; i++)
-    {
-      int curname = selbuf[4*i+3];
-      GLuint curdepth = selbuf[4*i+1];
-
-      if (curname &&
-	  (curdepth < mindepth || !minname))
-	{
-	  mindepth = curdepth;
-	  minname = curname;
-	}
-    }
-
-  cout << "clicked element: " << minname << endl;
-
-  ClickElement (minname);
-
-  BuildScene ();
-}
-
-
-
-
-void VisualSceneMeshDoctor :: SetMarkEdgeDist (int dist)
-{
-  markedgedist = dist;
-  BuildScene();
-}
-
-void VisualSceneMeshDoctor :: ClickElement (int elnr)
-{
-  selelement = elnr;
-
-  int oldlocpi = locpi;
-  locpi = locpi % 3 + 1;
-  
-  if (selelement > 0 && selelement <= mesh->GetNSE())
-    {
-      selpoint = mesh->SurfaceElement(selelement).PNum(locpi);
-      selpoint2 = mesh->SurfaceElement(selelement).PNum(oldlocpi);
-      cout << "selpts = " << selpoint << ", " << selpoint2 << endl;
-    }
-
-  UpdateTables();
-}
-
-
-void VisualSceneMeshDoctor :: UpdateTables ()
-{
-  if (!mesh) return;
-
-  edgedist.SetSize(mesh->GetNP());
-  int i, changed;
-
-  for (i = 1; i <= mesh->GetNP(); i++)
-    edgedist.Elem(i) = 10000;
-
-  for (i = 1; i <= mesh->GetNSeg(); i++)
-    {
-      const Segment & seg = mesh->LineSegment(i);
-      if (seg.p1 == selpoint && seg.p2 == selpoint2 ||
-	  seg.p2 == selpoint && seg.p1 == selpoint2)
-	{
-	  edgedist.Elem(selpoint) = 1;
-	  edgedist.Elem(selpoint2) = 1;
-	}
-    }
-
-  do
-    {
-      changed = 0;
-
-      for (i = 1; i <= mesh->GetNSeg(); i++)
-	{
-	  const Segment & seg = mesh->LineSegment(i);
-	  
-	  int edist = min2 (edgedist.Get(seg.p1), edgedist.Get(seg.p2));
-	  edist++;
-
-	  if (edgedist.Get(seg.p1) > edist)
-	    {
-	      edgedist.Elem(seg.p1) = edist;
-	      changed = 1;
-	    }
-	  if (edgedist.Get(seg.p2) > edist)
-	    {
-	      edgedist.Elem(seg.p2) = edist;
-	      changed = 1;
-	    }
-	}	    
-    }
-  while (changed);
-}
-
-int VisualSceneMeshDoctor :: IsSegmentMarked (int segnr) const
-{
-  const Segment & seg = mesh->LineSegment(segnr);
-  return (edgedist.Get(seg.p1) <= markedgedist &&
-	  edgedist.Get(seg.p2) <= markedgedist);
-}
-}
diff --git a/contrib/Netgen/libsrc/visualization/meshdoc.hpp b/contrib/Netgen/libsrc/visualization/meshdoc.hpp
deleted file mode 100644
index 5cc11aef78df1659dd113a5409dd10b954f91146..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/meshdoc.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-
-class VisualSceneMeshDoctor : public VisualScene
-{
-  int filledlist;
-  int outlinelist;
-  int edgelist;
-
-  int selelement, locpi;
-  int selpoint, selpoint2;
-
-  // for edgemarking:
-  ARRAY<int> edgedist;
-  int markedgedist;
-  
-
-public:
-  VisualSceneMeshDoctor ();
-  virtual ~VisualSceneMeshDoctor ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-  virtual void MouseDblClick (int px, int py);
-
-  void SetMarkEdgeDist (int dist);
-  void ClickElement (int elnr);
-  void UpdateTables ();
-  int IsSegmentMarked (int segnr) const;
-};
-
-class MeshDoctorParameters 
-{
-public:
-  int active;
-};
-
-
-extern MeshDoctorParameters meshdoctor;
diff --git a/contrib/Netgen/libsrc/visualization/mvdraw.cpp b/contrib/Netgen/libsrc/visualization/mvdraw.cpp
deleted file mode 100644
index 265dc970b4395a79904279221b4860b5246d400b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/mvdraw.cpp
+++ /dev/null
@@ -1,1335 +0,0 @@
-#include <mystdlib.h>
-#include <myadt.hpp>
-#include <meshing.hpp>
-#include <csg.hpp>
-#include <geometry2d.hpp>
-#include <stlgeom.hpp>
-
-#include "incvis.hpp"
-
-
-
-namespace netgen
-{
-
-#include "mvdraw.hpp"
-
-  Point3d VisualScene :: center;
-  double VisualScene :: rad;
-  GLdouble VisualScene :: backcolor;
-  GLuint VisualScene :: fontbase = 0;
-
-  // texture for color decoding
-  GLubyte * VisualScene :: colortexture = NULL;
-  GLuint VisualScene :: coltexname = 1;
-  int VisualScene :: ntexcols = -1;
-
-
-  float VisualScene :: lookatmat[16];
-  float VisualScene :: transmat[16];
-  float VisualScene :: rotmat[16];
-  float VisualScene :: centermat[16];
-  float VisualScene :: transformationmat[16];
-
-
-
-  VisualizationParameters :: VisualizationParameters()
-  {
-    lightamb = 0.3;
-    lightdiff = 0.7;
-    lightspec = 1;
-    shininess = 50;
-    transp = 0.3;
-    locviewer = 0;
-    showstltrias = 0;
-    centerpoint = 0;
-    usedispllists = 1;
-    strcpy (selectvisual, "cross");
-
-    use_center_coords = false;
-  };
-  VisualizationParameters vispar;
-
-
-
-  double dist = 0;
-  // double dist = 6;
-  // vorher: pnear = 2;
-  double pnear = 0.1;
-  double pfar = 10;
-
-
-
-  extern STLGeometry * stlgeometry;
-  extern AutoPtr<SplineGeometry2d> geometry2d;
-  extern AutoPtr<Mesh> mesh;
-  extern ARRAY<SpecialPoint> specpoints;
-
-
-  VisualScene :: VisualScene ()
-  {
-    changeval = -1;
-    backcolor = 0;
-  }
-
-
-  VisualScene :: ~VisualScene()
-  {
-    ;
-  }
-
-
-  void Render ()
-  {
-    multithread.redraw = 1;
-  }
-
-
-  void VisualScene :: BuildScene (int zoomall)
-  {
-    center = Point3d (0,0,0);
-    rad = 1;
-
-    CalcTransformationMatrices();
-
-    glEnable(GL_DEPTH_TEST);
-    glDisable (GL_DITHER);
-  
-    GLfloat ambvals[] = { 0.4f, 0.4f, 0.4f, 1.0f };
-    GLfloat diffvals[] = { 0.5f, 0.5f, 0.5f, 1.0f };
-    GLfloat specvals[] =  { 0.7f, 0.7f, 0.7f, 1.0f };
-    glLightfv(GL_LIGHT0, GL_AMBIENT, ambvals);
-    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffvals);
-    glLightfv(GL_LIGHT0, GL_SPECULAR, specvals);
-  
-    GLfloat light_position[] = { 1, 3, 3, 0 };
-    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
-  
-    glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, 0);
-    glEnable(GL_LIGHTING);
-    glEnable(GL_LIGHT0);
-  }
-
-
-  void VisualScene :: DrawScene ()
-  {
-    if (changeval == -1)
-      BuildScene();
-    changeval = 0;
-
-    glClearColor(backcolor, backcolor, backcolor, 1.0);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-    glEnable (GL_COLOR_MATERIAL);
-    glColor3f (1.0f, 1.0f, 1.0f);
-    glLineWidth (1.0f);
-
-    DrawCoordinateCross ();
-    DrawNetgenLogo ();
-    glFinish();  
-  }
-
-
-  void VisualScene :: CalcTransformationMatrices()
-  {
-
-    // prepare model view matrix
-  
-    glPushMatrix();
-
-    glLoadIdentity();
-    gluLookAt (0, 0, 6, 0, 0, 0, 0, 1, 0);
-    glGetFloatv (GL_MODELVIEW_MATRIX, lookatmat);
-
-    glLoadIdentity();
-    glTranslatef(0.0f, 0.0f, -dist);
-    glGetFloatv (GL_MODELVIEW_MATRIX, transmat);
-  
-    glLoadIdentity();
-    glGetFloatv (GL_MODELVIEW_MATRIX, rotmat);
-
-    glScalef (1/rad, 1/rad, 1/rad);
-    glTranslated (-center.X(), -center.Y(), -center.Z());
-    glGetFloatv (GL_MODELVIEW_MATRIX, centermat);
-
-    glLoadIdentity();
-    glMultMatrixf (lookatmat);
-    glMultMatrixf (transmat);
-    glMultMatrixf (rotmat);
-    glMultMatrixf (centermat);
-    glGetFloatv (GL_MODELVIEW_MATRIX, transformationmat);
-
-    glPopMatrix();
-  }
-
-
-  void VisualScene :: ArbitraryRotation (const ARRAY<double> & alpha, const ARRAY<Vec3d> & vec)
-  {
-    glPushMatrix();
-
-    glLoadIdentity();
-
-    for(int i=0; i<alpha.Size() && i<vec.Size(); i++)
-      {
-	glRotatef(alpha[i], vec[i].X(), vec[i].Y(), vec[i].Z());
-      }
-
-    glGetFloatv (GL_MODELVIEW_MATRIX, rotmat);
-
-    glLoadIdentity();
-    glMultMatrixf (lookatmat);
-    glMultMatrixf (transmat);
-    glMultMatrixf (rotmat);
-    glMultMatrixf (centermat);
-    glGetFloatv (GL_MODELVIEW_MATRIX, transformationmat);
-  
-    glPopMatrix();
-  } 
-
-
-
-  void VisualScene :: ArbitraryRotation (const double alpha, const Vec3d & vec)
-  {
-    ARRAY<double> a(1); a[0] = alpha;
-    ARRAY<Vec3d> v(1); v[0] = vec;
-
-    ArbitraryRotation(a,v);
-  } 
-
-  void VisualScene :: StandardRotation (const char * dir)
-  {
-    glPushMatrix();
-
-    glLoadIdentity();
-  
-    if (strcmp (dir, "xy") == 0)
-      ;
-    else if (strcmp (dir, "yx") == 0)
-      glRotatef(180.0, 1.0f, 1.0f, 0.0f);    
-    else if (strcmp (dir, "xz") == 0)
-      glRotatef(-90.0, 1.0f, 0.0f, 0.0f);    
-    else if (strcmp (dir, "zx") == 0)
-      {
-	glRotatef(180.0, 1.0f, 1.0f, 0.0f);    
-	glRotatef(-90.0, 1.0f, 0.0f, 0.0f);    
-      }
-    else if (strcmp (dir, "yz") == 0)
-      {
-	glRotatef(-90.0, 0.0f, 0.0f, 1.0f);    
-	glRotatef(-90.0, 0.0f, 1.0f, 0.0f);    
-      }
-    else if (strcmp (dir, "zy") == 0)
-      glRotatef(90.0, 0.0f, 1.0f, 0.0f);    
-
-
-    glGetFloatv (GL_MODELVIEW_MATRIX, rotmat);
-
-    glLoadIdentity();
-    glMultMatrixf (lookatmat);
-    glMultMatrixf (transmat);
-    glMultMatrixf (rotmat);
-    glMultMatrixf (centermat);
-    glGetFloatv (GL_MODELVIEW_MATRIX, transformationmat);
-  
-    glPopMatrix();
-  }
-
-  void VisualScene :: MouseMove(int oldx, int oldy,
-				int newx, int newy,
-				char mode)
-  {
-    int deltax = newx - oldx;
-    int deltay = newy - oldy;
-  
-    glPushMatrix();
-    glLoadIdentity ();
-  
-    switch (mode)
-      {
-      case 'r':
-	{	
-	  glRotatef(float(deltax)/2, 0.0f, 1.0f, 0.0f);
-	  glRotatef(float(deltay)/2, 1.0f, 0.0f, 0.0f);
-	  glMultMatrixf (rotmat);
-	  glGetFloatv (GL_MODELVIEW_MATRIX, rotmat);
-	  break;
-	}
-      case 'm':
-	{
-	  GLdouble projmat[16], modelviewmat[16];
-	  GLint viewport[4];
-	  glGetDoublev (GL_PROJECTION_MATRIX, projmat);
-	  glGetDoublev (GL_MODELVIEW_MATRIX, modelviewmat);
-	  glGetIntegerv (GL_VIEWPORT, viewport);
-	
-	  // vorher pvz1/2 = 0
-	  GLdouble pvx1 = 0, pvy1 = 0, pvz1 = 0.95;
-	  GLdouble pvx2 = deltax, pvy2 = -deltay, pvz2 = 0.95;
-
-	  GLdouble px1, py1, pz1;
-	  GLdouble px2, py2, pz2;
-	
-	  gluUnProject (pvx1, pvy1, pvz1, 
-			modelviewmat, projmat, viewport,
-			&px1, &py1, &pz1);
-	  gluUnProject (pvx2, pvy2, pvz2, 
-			modelviewmat, projmat, viewport,
-			&px2, &py2, &pz2);
-	  /*
-	    gluUnProject (oldx, oldy, 1, 
-	    modelviewmat, projmat, viewport,
-	    &px1, &py1, &pz1);
-	    gluUnProject (newx, newy, 1, 
-	    modelviewmat, projmat, viewport,
-	    &px2, &py2, &pz2);
-	  */
-
-	  /*	
-	    cout << "pv1 = " << pvx1 << ", " << pvy1 << ", " << pvz1 << endl;
-	    cout << "p1 = " << px1 << ", " << py1 << ", " << pz1 << endl;
-	  */
-
-	  glTranslated (px2-px1, py2-py1, pz2-pz1);
-	
-	  glMultMatrixf (transmat);
-	  glGetFloatv (GL_MODELVIEW_MATRIX, transmat);
-	  break;
-	}
-      case 'z':
-	{
-	  // glTranslatef(0.0f, 0.0f, -dist);
-	  glScaled (exp (float (-deltay)/100), 
-		    exp (float (-deltay)/100), 
-		    exp (float (-deltay)/100));
-	  // glTranslatef(0.0f, 0.0f, dist);
-	  glMultMatrixf (transmat);
-	  glGetFloatv (GL_MODELVIEW_MATRIX, transmat);
-	  break;
-	}
-      }
-
-    glLoadIdentity();
-    glMultMatrixf (lookatmat);
-    glMultMatrixf (transmat);
-    glMultMatrixf (rotmat);
-    glMultMatrixf (centermat);
-    glGetFloatv (GL_MODELVIEW_MATRIX, transformationmat);
-  
-    glPopMatrix();
-  }
-
-
-  void VisualScene :: LookAt (const Point<3> & cam, const Point<3> & obj,
-			      const Point<3> & camup)
-  {
-    glPushMatrix();
-    glLoadIdentity ();
-    gluLookAt (cam(0), cam(1), cam(2), 
-	       obj(0), obj(1), obj(2),
-	       camup(0), camup(1), camup(2));
-    glMultMatrixf (centermat);
-    glGetFloatv (GL_MODELVIEW_MATRIX, transformationmat);
-    glPopMatrix();
-  }
-
-  
-  void VisualScene :: SetClippingPlane ()
-  {
-    if (vispar.clipenable)
-      {
-	Vec3d n = vispar.clipnormal;
-	n /= (n.Length()+1e-10);
-	clipplane[0] = n.X();
-	clipplane[1] = n.Y();
-	clipplane[2] = n.Z();
-	clipplane[3] = -(Vec3d(center) * n) + rad * vispar.clipdist;
-
-	glClipPlane(GL_CLIP_PLANE0, clipplane);
-	glEnable(GL_CLIP_PLANE0);
-      }
-    else
-      glDisable (GL_CLIP_PLANE0);
-  }
-
-
-
-
-  void VisualScene :: MouseDblClick (int /* px */, int /* py */)
-  {
-    ;
-  }
-
-
-
-  void VisualScene :: SetLight()
-  {
-    GLfloat vals[3];
-    double lightamb = vispar.lightamb;
-    vals[0] = vals[1] = vals[2] = lightamb;
-    glLightfv(GL_LIGHT0, GL_AMBIENT, vals);
-
-    double lightdiff = vispar.lightdiff;
-    vals[0] = vals[1] = vals[2] = lightdiff;
-    glLightfv(GL_LIGHT0, GL_DIFFUSE, vals);
-
-    double lightspec = vispar.lightspec;
-    vals[0] = vals[1] = vals[2] = lightspec;
-    glLightfv(GL_LIGHT0, GL_SPECULAR, vals);
-
-    glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, vispar.shininess);
-    glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, vispar.locviewer);
-
-    float mat_spec_col[] = { 1, 1, 1, 1 };
-    glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, mat_spec_col);
-
-    glEnable (GL_LIGHTING);
-    glEnable (GL_LIGHT0);
-  }
-
-
-
-
-  void VisualScene :: SetOpenGlColor(double h, double hmin, double hmax,
-				     int logscale)
-  {
-    double value;
-
-    if (!logscale)
-      value = (h - hmin) / (hmax - hmin);
-    else
-      {
-	if (hmax <= 0) hmax = 1;
-	if (hmin <= 0) hmin = 1e-4 * hmax;
-	value = (log(fabs(h)) - log(hmin)) / (log(hmax) - log(hmin));
-      }
-
-    if (!invcolor)
-      value = 1 - value;
-
-    glTexCoord1f ( 0.999 * value + 0.001);
-    // glTexCoord1f ( value ); 
-
-    if (value > 1) value = 1;
-    if (value < 0) value = 0;
-
-    value *= 4;
-
-    static const double colp[][3] =
-      {
-	{ 1, 0, 0 },
-	{ 1, 1, 0 },
-	{ 0, 1, 0 },
-	{ 0, 1, 1 },
-	{ 0, 0, 1 },
-	//	{ 1, 0, 1 },
-	//	{ 1, 0, 0 },
-      };
-  
-    int i = int(value);
-    double r = value - i;
-
-    GLdouble col[3];
-    for (int j = 0; j < 3; j++)
-      col[j] = (1-r) * colp[i][j] + r * colp[i+1][j];
-  
-    glColor3d (col[0], col[1], col[2]);
-  }
-
-
-  /*
-  void VisualScene :: CreateTexture (int ncols, int linear, int typ)
-  {
-
-    static const double colp[][3] =
-      {
-	{ 1, 0, 0 },
-	{ 1, 1, 0 },
-	{ 0, 1, 0 },
-	{ 0, 1, 1 },
-	{ 0, 0, 1 },
-      };
-  
-
-
-    if (ntexcols != 1024)
-      {
-	ntexcols = 1024;
-	
-	// glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-	glGenTextures (1, &coltexname);
-	glBindTexture (GL_TEXTURE_1D, coltexname);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
-	
-	for (int level = 0; level <= 11; level++)
-	  {
-	    ncols = 2048 >> level;
-	    cout << "ncols = " << ncols << endl;
-
-	    colortexture = new GLubyte[4*ncols+12];
-
-	    for (int i = 0; i < ncols; i++)
-	      {
-		double value = 4.0 * i / (ncols-1);
-		
-		int iv = int(value);
-		double r = value - iv;
-		
-		GLdouble col[3];
-		for (int j = 0; j < 3; j++)
-		  col[j] = (1-r) * colp[iv][j] + r * colp[iv+1][j];
-		
-		colortexture[4*i] = GLubyte (255 * col[0]);
-		colortexture[4*i+1] = GLubyte (255 * col[1]);
-		colortexture[4*i+2] = GLubyte (255 * col[2]);
-		colortexture[4*i+3] = GLubyte(255);
-		
-		if (ncols > 20)
-		  if ( i % (ncols / 10) == 0)
-		    {
-		      colortexture[4*i] = GLubyte (0);
-		      colortexture[4*i+1] = GLubyte (0);
-		      colortexture[4*i+2] = GLubyte (0);
-		      colortexture[4*i+4] = GLubyte (0);
-		      colortexture[4*i+5] = GLubyte (0);
-		      colortexture[4*i+6] = GLubyte (0);
-		    }
-	      }
-	    
-	    glTexImage1D (GL_TEXTURE_1D, level, 4, ncols, 0, GL_RGBA, GL_UNSIGNED_BYTE, colortexture);
-	  }
-      }
-    
-    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, typ);  // DECAL or MODULATE
-    glBindTexture (GL_TEXTURE_1D, coltexname);
-  }
-  */
-
-
-  void VisualScene :: CreateTexture (int ncols, int linear, int typ)
-  {
-    if (ncols < 2) ncols = 2;
-
-    if (linear) ncols = 32;
-    else   ncols = 8;
-
-    if (ntexcols != ncols) 
-      {
-	if (colortexture) 
-	  {
-	    glDeleteTextures (1, &coltexname);
-	    delete colortexture;
-	  }
-      
-	ntexcols = ncols;
-      
-	colortexture = new GLubyte[4*ncols+12];
-
-	const double colp[][3] =
-	  {
-	    { 1, 0, 0 },
-	    { 1, 1, 0 },
-	    { 0, 1, 0 },
-	    { 0, 1, 1 },
-	    { 0, 0, 1 },
-	  };
-  
-	for (int i = 0; i < ncols; i++)
-	  {
-	    double value = 4.0 * i / (ncols-1);
-
-	    int iv = int(value);
-	    double r = value - iv;
-
-	    GLdouble col[3];
-	    for (int j = 0; j < 3; j++)
-	      col[j] = (1-r) * colp[iv][j] + r * colp[iv+1][j];
-	  
-	    colortexture[4*i] = GLubyte (255 * col[0]);
-	    colortexture[4*i+1] = GLubyte (255 * col[1]);
-	    colortexture[4*i+2] = GLubyte (255 * col[2]);
-	    colortexture[4*i+3] = GLubyte(255);
-	  }
-
-	//      glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-
-	glGenTextures (1, &coltexname);
-	glBindTexture (GL_TEXTURE_1D, coltexname);
-
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
-	glTexImage1D (GL_TEXTURE_1D, 0, 4, ncols, 0, GL_RGBA, GL_UNSIGNED_BYTE, colortexture);
-      }
-
-    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, typ);  // DECAL or MODULATE
-
-    glBindTexture (GL_TEXTURE_1D, coltexname);
-    if (linear)
-      {
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-      }
-    else
-      {
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-      }
-  }
-
-
-
-
-
-  /*
-  void VisualScene :: CreateTexture (int ncols, int linear, int typ)
-  {
-    if (ncols < 2) ncols = 2;
-
-    if (linear) ncols = 32;
-    else   ncols = 8;
-
-    if (ntexcols != ncols) 
-      {
-	if (colortexture) 
-	  {
-	    glDeleteTextures (1, &coltexname);
-	    delete colortexture;
-	  }
-      
-	ntexcols = ncols;
-      
-	colortexture = new GLubyte[4*ncols+12];
-
-	const double colp[][3] =
-	  {
-	    { 1, 0, 0 },
-	    { 1, 1, 0 },
-	    { 0, 1, 0 },
-	    { 0, 1, 1 },
-	    { 0, 0, 1 },
-	  };
-  
-	for (int i = 0; i < ncols; i++)
-	  {
-	    double value = 4.0 * i / (ncols-1);
-
-	    int iv = int(value);
-	    double r = value - iv;
-
-	    GLdouble col[3];
-	    for (int j = 0; j < 3; j++)
-	      col[j] = (1-r) * colp[iv][j] + r * colp[iv+1][j];
-	  
-	    colortexture[4*i+4] = GLubyte (255 * col[0]);
-	    colortexture[4*i+5] = GLubyte (255 * col[1]);
-	    colortexture[4*i+6] = GLubyte (255 * col[2]);
-	    colortexture[4*i+7] = GLubyte(255);
-	  }
-	for (int j = 0; j < 4; j++)
-	  {
-	    colortexture[j] = colortexture[4+j];
-	    colortexture[ncols*4+4+j] = colortexture[ncols*4+j];
-	  }
-
-	//      glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-
-	glGenTextures (1, &coltexname);
-	glBindTexture (GL_TEXTURE_1D, coltexname);
-
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
-	glTexImage1D (GL_TEXTURE_1D, 0, 4, ncols, 0, GL_RGBA, GL_UNSIGNED_BYTE, colortexture+4);
-	int bcol[] = { 0, 0, -1, -1 };
-	glTexParameteriv (GL_TEXTURE_1D, GL_TEXTURE_BORDER_COLOR, bcol);
-      }
-
-    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, typ);  // DECAL or MODULATE
-
-    glBindTexture (GL_TEXTURE_1D, coltexname);
-    if (linear)
-      {
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-      }
-    else
-      {
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-      }
-  }
-  */
-
-
-
-
-
-  void VisualScene :: DrawColorBar (double minval, double maxval, int logscale, bool linear)
-  {
-    if (!vispar.drawcolorbar) return;
-
-    CreateTexture (8, linear, GL_DECAL);
-
-    if (logscale && maxval <= 0) maxval = 1;
-    if (logscale && minval <= 0) minval = 1e-4 * maxval;
-
-    double minx = -1;
-    double maxx = 1;
-    double miny = 0.75;
-    double maxy = 0.8;
-
-    glEnable (GL_COLOR_MATERIAL);
-    glEnable (GL_TEXTURE_1D);
-    glNormal3d (0, 0, 1);
-    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-    
-    glDisable (GL_DEPTH_TEST);
-    glBegin (GL_QUAD_STRIP);
-
-    for (double x = minx; x <= maxx; x += (maxx - minx) / 50)
-      {
-	SetOpenGlColor (x, minx, maxx);
-	// glTexCoord1f ( 0.999 * (x-minx) / (maxx-minx) + 0.001);
-
-	glVertex3d (x, miny, -5);
-	glVertex3d (x, maxy, -5);
-      }
-    glEnd();
-
-    glDisable (GL_TEXTURE_1D);
-
-
-    glEnable (GL_COLOR_MATERIAL);
-    GLfloat textcol[3] = { 1 - backcolor, 1 - backcolor, 1 - backcolor };
-    glColor3fv (textcol);
-
-    glPushAttrib (GL_LIST_BIT);
-    glListBase (fontbase);
-
-    char buf[20];
-    for (int i = 0; i <= 4; i++)
-      {
-	double x = minx + i * (maxx-minx) / 4;
-	glRasterPos3d (x, 0.7,-5);
-      
-	double val;
-	if (logscale)
-	  val = minval * pow (maxval / minval, i / 4.0);
-	else
-	  val = minval + i * (maxval-minval) / 4;
-
-	sprintf (buf, "%8.3e", val);
-	glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-      }
-
-    glPopAttrib ();
-    glEnable (GL_DEPTH_TEST);
-  }
-
-
-  void VisualScene :: DrawCoordinateCross ()
-  {
-    if (!vispar.drawcoordinatecross) return;
-
-    glDisable (GL_DEPTH_TEST);
-    glMatrixMode (GL_PROJECTION); 
-    glPushMatrix();
-    glLoadIdentity();
-
-    glMatrixMode (GL_MODELVIEW); 
-    glPushMatrix();
-    glLoadIdentity();
-
-    GLint viewport[4];
-    glGetIntegerv (GL_VIEWPORT, viewport);
-
-    glTranslatef (-1, -1, 0.0);
-    glScalef (40.0 / viewport[2], 40.0 / viewport[3], 1);
-    glTranslatef (2.0, 2.0, 0.0);
-    glMultMatrixf (rotmat);
-
-    glEnable (GL_COLOR_MATERIAL);
-    glDisable (GL_LIGHTING);
-
-    GLfloat textcol[3] = { 1 - backcolor,
-			   1 - backcolor,
-			   1 - backcolor };
-    glColor3fv (textcol);
-
-    glLineWidth (1.0f);
-
-    float len = 1;
-    glBegin(GL_LINES);
-    glVertex3f (0.0f, 0.0f, 0.0f);
-    glVertex3f (len, 0.0f, 0.0f);
-    glVertex3f (0.0f, 0.0f, 0.0f);
-    glVertex3f (0.0f, len, 0.0f);
-    glVertex3f (0.0f, 0.0f, 0.0f);
-    glVertex3f (0.0f, 0.0f, len);
-    glEnd ();
-
-
-    glPushAttrib (GL_LIST_BIT);
-    glListBase (fontbase);
-
-    char buf[20];
-
-    glRasterPos3d (len, 0.0f, 0.0f);
-    sprintf (buf, "x");
-    glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-    glRasterPos3d (0.0f, len, 0.0f);
-    sprintf (buf, "y");
-    glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-    glRasterPos3d (0.0f, 0.0f, len);
-    sprintf (buf, "z");
-    glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-
-    glPopAttrib ();
-    glEnable (GL_LIGHTING);
-
-    glMatrixMode (GL_PROJECTION); 
-    glPopMatrix();
-    glMatrixMode (GL_MODELVIEW); 
-    glPopMatrix();
-    glEnable (GL_DEPTH_TEST);
-  }
-
-
-  void VisualScene :: DrawNetgenLogo ()
-  {
-    if (!vispar.drawnetgenlogo) return;
-
-    glDisable (GL_DEPTH_TEST);
-    glMatrixMode (GL_PROJECTION); 
-    glPushMatrix();
-    glLoadIdentity();
-
-    glMatrixMode (GL_MODELVIEW); 
-    glPushMatrix();
-    glLoadIdentity();
-
-    GLint viewport[4];
-    glGetIntegerv (GL_VIEWPORT, viewport);
-
-
-
-    glTranslatef (1, -1, 0.0);
-    glScalef (40.0 / viewport[2], 40.0 / viewport[3], 1);
-    glTranslatef (-6.0, 2.0, 0.0);
-
-    glDisable (GL_CLIP_PLANE0);
-    // glDisable (GL_LIGHTING);
-
-    glEnable (GL_COLOR_MATERIAL);
-    GLfloat textcol[3] = { 1 - backcolor,
-			   1 - backcolor,
-			   1 - backcolor };
-    glColor3fv (textcol);
-
-    glLineWidth (1.0f);
-
-    glPushAttrib (GL_LIST_BIT);
-    glListBase (fontbase);
-
-    char buf[20];
-
-    glRasterPos3d (0.0f, 0.0f, 0.0f);
-    sprintf (buf, "Netgen 4.4");
-    glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-
-    glPopAttrib ();
-
-    glMatrixMode (GL_PROJECTION); 
-    glPopMatrix();
-    glMatrixMode (GL_MODELVIEW); 
-    glPopMatrix();
-    glEnable (GL_DEPTH_TEST);
-  }
-
-
-
-
-
-  /* *********************** Draw 2D Geometry **************** */
-
-
-  VisualSceneGeometry2d :: VisualSceneGeometry2d ()
-    : VisualScene()
-  {
-    ;
-  }
-
-  VisualSceneGeometry2d :: ~VisualSceneGeometry2d ()
-  {
-    ;
-  }
-
-
-
-  void VisualSceneGeometry2d :: DrawScene ()
-  {
-    if (changeval != geometry2d->GetSplines().Size())
-      BuildScene();
-    changeval = geometry2d->GetSplines().Size();
-
-  
-    glClearColor(backcolor, backcolor, backcolor, 1.0);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-    SetLight();
-
-    //  glEnable (GL_LIGHT0);
-    glDisable (GL_LIGHTING);
-    glPushMatrix();
-    glMultMatrixf (transformationmat);
-
-    //  SetClippingPlane ();
-
-    glShadeModel (GL_SMOOTH);
-    glEnable (GL_COLOR_MATERIAL);
-    glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-  
-    //  float mat_col[] = { 0, 0, 1, 1 };
-    //  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-    glColor3f (0, 0, 1);
-  
-
-    ARRAY<Point<2> > points, otherpoints;
-
-    for (int i = 1; i <= geometry2d->GetSplines().Size(); i++)
-      {
-	geometry2d->GetSplines().Get(i)->GetPoints (20, points);
-      
-	glBegin (GL_LINE_STRIP);
-	for (int j = 0; j < points.Size(); j++)
-	  glVertex3f (points[j](0), points[j](1), 0);
-	glEnd(); 
-      }
-
-    glColor3f (1, 0, 0);
-
-    for (int i = 1; i <= geometry2d->GetSplines().Size(); i++)
-      {
-	int other = geometry2d->GetSplines().Get(i)->copyfrom;
-	if (other != -1)
-	  {
-	    geometry2d->GetSplines().Get(i)->GetPoints (6, points);
-	    geometry2d->GetSplines().Get(other)->GetPoints (6, otherpoints);
-	    glBegin (GL_LINES);
-	    for (int j = 1; j < 5; j++)
-	      {
-		glVertex3f (points[j](0), points[j](1), 0);
-		glVertex3f (otherpoints[j](0), otherpoints[j](1), 0);
-	      }
-	    glEnd ();
-	  }
-      }
-
-
-
-    glPopMatrix();
-  
-    DrawCoordinateCross ();
-    DrawNetgenLogo ();
-
-    glFinish();  
-  }
-
-
-  void VisualSceneGeometry2d :: BuildScene (int zoomall)
-  {
-    Box<2> bbox;
-
-    geometry2d->GetBoundingBox (bbox);
-  
-    Point<2> c = Center (bbox.PMin(), bbox.PMax());
-
-    center = Point3d (c(0), c(1), 0);
-    rad = Dist (bbox.PMin(), bbox.PMax()) / 2;
-
-    CalcTransformationMatrices();
-  }
-
-
-
-
-
-
-
-
-
-
-  /* *********************** Draw STL Geometry **************** */
-
-
-  VisualSceneSTLGeometry :: VisualSceneSTLGeometry ()
-    : VisualScene()
-  {
-    ;
-  }
-
-  VisualSceneSTLGeometry :: ~VisualSceneSTLGeometry ()
-  {
-    ;
-  }
-
-  void VisualSceneSTLGeometry :: DrawScene ()
-  {
-    if (changeval != stlgeometry->GetNT())
-      BuildScene();
-
-    changeval = stlgeometry->GetNT();
-
-
-    glClearColor(backcolor, backcolor, backcolor, 1.0);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-    SetLight();
-
-
-    glPushMatrix();
-    glMultMatrixf (transformationmat);
-
-
-
-
-    glShadeModel (GL_SMOOTH);
-    glDisable (GL_COLOR_MATERIAL);
-    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-
-    glEnable (GL_BLEND);
-    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-
-    double shine = vispar.shininess;
-    // double transp = vispar.transp;
-
-    glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shine);
-    glLogicOp (GL_COPY);
-
-
-    float mat_col[] = { 0.2f, 0.2f, 0.8f, 1.0f};
-    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-
-    glPolygonOffset (1, 1);
-    glEnable (GL_POLYGON_OFFSET_FILL);
-
-    glCallList (trilists.Get(1));
-
-    glDisable (GL_POLYGON_OFFSET_FILL);
-
-
-    int showtrias = vispar.showstltrias;
-
-    if (showtrias)
-      {
-	float mat_coll[] = { 0.2f, 0.2f, 0.2f, 1.0f };
-	glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_coll);
-	glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-      
-	glCallList (trilists.Get(1));
-      }
-
-    /*
-
-    glBegin (GL_TRIANGLES);
-    for (j = 1; j <= stlgeometry -> GetNT(); j++)
-    {
-    const STLTriangle & tria = stlgeometry -> GetTriangle(j);
-    glNormal3f (tria.normal.X(),
-    tria.normal.Y(),
-    tria.normal.Z());
-		  
-    for (k = 0; k < 3; k++)
-    {
-    glVertex3f (tria.pts[k].X(),
-    tria.pts[k].Y(),
-    tria.pts[k].Z());
-    }
-    }    
-    glEnd ();
-    */  
-
-
-
- 
-    glPopMatrix();
-    glFinish();  
-  }
-
-
-  void VisualSceneSTLGeometry :: BuildScene (int zoomall)
-  {
-    //  cout << "rebuild stl geometry scene" << endl;
-
-    center = stlgeometry -> GetBoundingBox().Center();
-    rad = stlgeometry -> GetBoundingBox().Diam() / 2;
-
-
-    CalcTransformationMatrices();
-
-    for (int i = 1; i <= trilists.Size(); i++)
-      glDeleteLists (trilists.Elem(i), 1);
-    trilists.SetSize(0);
-
-
-    trilists.Append (glGenLists (1));
-    glNewList (trilists.Last(), GL_COMPILE);
-
-    glEnable (GL_NORMALIZE);
-
-    glBegin (GL_TRIANGLES);
-    for (int j = 1; j <= stlgeometry -> GetNT(); j++)
-      {
-	const Vec3d & n = stlgeometry->GetTriangle(j).Normal();
-	glNormal3f (n.X(), n.Y(), n.Z());
-      
-	for (int k = 1; k <= 3; k++)
-	  {
-	    const Point3d & p = 
-	      stlgeometry->GetPoint (stlgeometry -> GetTriangle(j).PNum(k));
-	    glVertex3f (p.X(),p.Y(), p.Z());
-	  }
-      }    
-    glEnd ();
-      
-    glEndList ();
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-  VisualSceneSpecPoints :: VisualSceneSpecPoints ()
-    : VisualScene()
-  {
-    ;
-  }
-
-  VisualSceneSpecPoints :: ~VisualSceneSpecPoints ()
-  {
-    ;
-  }
-
-
-  void VisualSceneSpecPoints :: DrawScene ()
-  {
-    if (!mesh) 
-      {
-	VisualScene::DrawScene();
-	return;
-      }
-
-    if (changeval != specpoints.Size())
-      BuildScene();
-    changeval = specpoints.Size();
-
-
-
-    glClearColor(backcolor, backcolor, backcolor, 1.0);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-    glEnable (GL_COLOR_MATERIAL);
-    glColor3f (1.0f, 1.0f, 1.0f);
-    glLineWidth (1.0f);
-
-    glPushMatrix();
-    glMultMatrixf (transformationmat);
-
-    //  glEnable (GL_COLOR);
-    //  glDisable (GL_COLOR_MATERIAL);
-    if (vispar.drawedtangents)
-      {
-	glColor3d (1, 0, 0);
-	glBegin (GL_LINES);
-	for (int i = 1; i <= specpoints.Size(); i++)
-	  {
-	    const Point3d p1 = specpoints.Get(i).p;
-	    const Point3d p2 = specpoints.Get(i).p + len * specpoints.Get(i).v;
-	    glVertex3d (p1.X(), p1.Y(), p1.Z());
-	    glVertex3d (p2.X(), p2.Y(), p2.Z());
-	  }
-	glEnd();
-      }
-
-    if (vispar.drawededges)
-      {
-	glColor3d (1, 0, 0);
-	glBegin (GL_LINES);
-	for (int i = 1; i <= mesh->GetNSeg(); i++)
-	  {
-	    const Segment & seg = mesh -> LineSegment (i);
-	    glVertex3dv ( &(*mesh)[seg.p1].X() );
-	    glVertex3dv ( &(*mesh)[seg.p2].X() );
-	  }
-	glEnd();
-      }
-
-    if (vispar.drawededgenrs)
-      {
-	glEnable (GL_COLOR_MATERIAL);
-	GLfloat textcol[3] = { 1 - backcolor,
-			       1 - backcolor,
-			       1 - backcolor };
-	glColor3fv (textcol);
-	glNormal3d (0, 0, 1);
-	glPushAttrib (GL_LIST_BIT);
-	glListBase (fontbase);
-
-	char buf[20];
-	for (int i = 1; i <= mesh->GetNSeg(); i++)
-	  {
-	    const Segment & seg = mesh -> LineSegment (i);
-	    const Point3d p1 = mesh -> Point (seg.p1);
-	    const Point3d p2 = mesh -> Point (seg.p2);
-
-	    const Point3d p = Center (p1, p2);
-	    glRasterPos3d (p.X(), p.Y(), p.Z());
-	  
-	    sprintf (buf, "%d", seg.edgenr);
-	    glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-	  }
-      
-	glPopAttrib ();
-	glDisable (GL_COLOR_MATERIAL);
-      }
-
-
-    if (vispar.drawedpoints)
-      {
-	glColor3d (0, 0, 1);
-	glPointSize( 3.0 );
-
-	/*
-	  float range[2];
-	  glGetFloatv(GL_POINT_SIZE_RANGE, &range[0]);
-	  cout << "max ptsize = " << range[0] << "-" << range[1] << endl;
-	*/
-      
-
-	glBegin( GL_POINTS );
-	for (int i = 1; i <= mesh -> GetNP(); i++)
-	  {
-	    const Point3d & p = mesh -> Point(i);
-	    if (i % 2)
-	      glVertex3f( p.X(), p.Y(), p.Z());
-	  }
-	glEnd();
-
-	static GLubyte knoedel[] = 
-	  {
-	    0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-	  };
-	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
-	glDisable (GL_COLOR_MATERIAL);
-	glDisable (GL_LIGHTING);
-	glDisable (GL_CLIP_PLANE0);
-      
-	for (int i = 1; i <= mesh -> GetNP(); i++)
-	  {
-	    const Point3d & p = mesh -> Point(i);
-	    glRasterPos3d (p.X(), p.Y(), p.Z());
-	    glBitmap (7, 7, 3, 3, 0, 0, &knoedel[0]);
-	  }
-      
-      }
-
-    if (vispar.drawedpointnrs)
-      {
-	glEnable (GL_COLOR_MATERIAL);
-	GLfloat textcol[3] = { 1 - backcolor,
-			       1 - backcolor,
-			       1 - backcolor };
-	glColor3fv (textcol);
-	glNormal3d (0, 0, 1);
-	glPushAttrib (GL_LIST_BIT);
-	glListBase (fontbase);
-      
-	char buf[20];
-	for (int i = 1; i <= mesh->GetNP(); i++)
-	  {
-	    const Point3d & p = mesh->Point(i);
-	    glRasterPos3d (p.X(), p.Y(), p.Z());
-	  
-	    sprintf (buf, "%d", i);
-	    glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-	  }
-      
-	glPopAttrib ();
-	glDisable (GL_COLOR_MATERIAL);
-      }
-
-
-    glPopMatrix();
-
-    if (vispar.drawcoordinatecross)
-      DrawCoordinateCross ();
-    DrawNetgenLogo ();
-
-    glFinish();  
-  }
-
-
-  void VisualSceneSpecPoints :: BuildScene (int zoomall)
-  {
-    if (!mesh) 
-      {
-	VisualScene::BuildScene(zoomall);
-	return;
-      }
-  
-    Box3d box;
-  
-    if (mesh->GetNSeg())
-      {
-	box.SetPoint (mesh->Point (mesh->LineSegment(1).p1));
-	for (int i = 1; i <= mesh->GetNSeg(); i++)
-	  {
-	    box.AddPoint (mesh->Point (mesh->LineSegment(i).p1));
-	    box.AddPoint (mesh->Point (mesh->LineSegment(i).p2));
-	  }
-      }
-    else if (specpoints.Size() >= 2)
-      {
-	box.SetPoint (specpoints.Get(1).p);
-	for (int i = 2; i <= specpoints.Size(); i++)
-	  box.AddPoint (specpoints.Get(i).p);
-      }
-    else
-      {
-	box = Box3d (Point3d (0,0,0), Point3d (1,1,1));
-      }
-  
-    if (zoomall == 2 && ((vispar.centerpoint >= 1 && vispar.centerpoint <= mesh->GetNP()) ||
-			 vispar.use_center_coords))
-      {
-	if (vispar.use_center_coords)
-	  {
-	    center.X() = vispar.centerx; center.Y() = vispar.centery; center.Z() = vispar.centerz; 
-	  }
-	else
-	  center = mesh->Point (vispar.centerpoint);
-      }
-    else
-      center = Center (box.PMin(), box.PMax());
-        
-
-    rad = 0.5 * Dist (box.PMin(), box.PMax());
-  
-  
-    CalcTransformationMatrices();
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/visualization/mvdraw.hpp b/contrib/Netgen/libsrc/visualization/mvdraw.hpp
deleted file mode 100644
index 56655339794b82423fb2b43ffaee11950adb69e4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/mvdraw.hpp
+++ /dev/null
@@ -1,370 +0,0 @@
-#ifndef FILE_MVDRAW
-#define FILE_MVDRAW
-
-#include "vispar.hpp"
-
-/*
-
-class VisualizationParameters
-{
-public:
-  double lightamb;
-  double lightdiff;
-  double lightspec;
-  double shininess;
-  double transp;
-  int locviewer;
-  char selectvisual[20];
-  int showstltrias;
-  
-  Vec3d clipnormal;
-  double clipdist;
-  int clipenable;
-  int clipplanetimestamp;
-
-  int colormeshsize;
-
-  int drawfilledtrigs;
-  int drawbadels;
-  int drawoutline;
-  int drawedges;
-  int subdivisions;
-
-  int drawprisms;
-  int drawpyramids;
-  int drawhexes;
-  double shrink;
-  int drawidentified;
-  int drawpointnumbers;
-  int drawedgenumbers;
-  int drawfacenumbers;
-  int drawelementnumbers;
-  int drawdomainsurf;
-  int drawtets;
-  int drawtetsdomain;
-
-  int drawededges;
-  int drawedpoints;
-  int drawedpointnrs;
-  int drawedtangents;
-  int drawededgenrs;
-
-  int drawcurveproj;
-  int drawcurveprojedge;
-  
-
-  int centerpoint;
-  int drawelement;
-
-  // stl:
-  int stlshowtrias;
-  int stlshowfilledtrias;
-  int stlshowedges;
-  int stlshowmarktrias;
-  int stlshowactivechart;
-  int stlchartnumber;
-  int stlchartnumberoffset;
-
-  // occ:
-  int occshowvolumenr;
-  bool occshowsurfaces;
-  bool occshowedges;
-  bool occvisproblemfaces;
-  bool occzoomtohighlightedentity;
-
-  bool whitebackground;
-  int stereo;
-  bool usedispllists;
-  bool drawcoordinatecross;
-  bool drawcolorbar;
-  bool drawnetgenlogo;
-
-  
-public:
-  VisualizationParameters();
-};
-extern VisualizationParameters vispar;
-*/
-
-
-
-
-
-
-extern void InitDrawMesh ();
-extern void DrawMesh ();
-extern void MouseMove(int oldx, int oldy,
-		      int newx, int newy,
-		      char mode);
-
-extern void Render ();
-
-
-class VisualScene
-{
-protected:
-  static Point3d center;
-  static double rad;
-
-  static float lookatmat[16];
-  static float transmat[16];
-  static float rotmat[16];
-  static float centermat[16];
-  static float transformationmat[16];
-
-  GLdouble clipplane[4];
-
-  int changeval;
-  static GLdouble backcolor;
-
-public:
-  static GLuint fontbase;
-  static GLubyte * colortexture;
-  static GLuint coltexname;
-  static int ntexcols;
-  // static bool linear_colors;
-  int invcolor;
-
-
-public:
-  VisualScene ();
-  virtual ~VisualScene();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-  
-  void CalcTransformationMatrices();
-  void StandardRotation (const char * dir);
-  void ArbitraryRotation (const ARRAY<double> & alpha, const ARRAY<Vec3d> & vec);
-  void ArbitraryRotation (const double alpha, const Vec3d & vec);
-
-  void MouseMove(int oldx, int oldy,
-		 int newx, int newy,
-		 char mode);
-
-  void LookAt (const Point<3> & cam, const Point<3> & obj,
-	       const Point<3> & camup);
-
-  void SetClippingPlane ();
-
-  virtual void MouseDblClick (int px, int py);
-
-  void SetLight ();
-  static void SetBackGroundColor (double col)
-    { backcolor = col; }
-
-  void CreateTexture (int ncols, int linear, int typ = GL_DECAL);
-  void DrawColorBar (double minval, double maxval, int logscale = 0, bool linear = 1);
-  void DrawCoordinateCross ();
-  void DrawNetgenLogo ();
-  void SetOpenGlColor(double val, double valmin, double valmax, int logscale = 0);
-};
-
-
-class VisualSceneGeometry : public VisualScene
-{
-  ARRAY<int> trilists;
-  int selsurf;
-public:
-  VisualSceneGeometry ();
-  virtual ~VisualSceneGeometry ();
-
-  virtual void SelectSurface (int aselsurf);
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-};
-
-
-
-class VisualSceneSTLGeometry : public VisualScene
-{
-  ARRAY<int> trilists;
-  
-public:
-  VisualSceneSTLGeometry ();
-  virtual ~VisualSceneSTLGeometry ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-};
-
-
-class VisualSceneGeometry2d : public VisualScene
-{
-public:
-  VisualSceneGeometry2d ();
-  virtual ~VisualSceneGeometry2d ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-};
-
-
-#ifdef OCCGEOMETRY
-class VisualSceneOCCGeometry : public VisualScene
-{
-  ARRAY<int> trilists;
-  ARRAY<int> linelists;
-  int selsurf;
-public:
-  VisualSceneOCCGeometry ();
-  virtual ~VisualSceneOCCGeometry ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-  virtual void MouseDblClick (int px, int py);
-};
-#endif
-
-
-
-
-#ifdef STEP
-class VisualSceneSTEPGeometry : public VisualScene
-{
-  ARRAY<int> gllists;
-  
-public:
-  VisualSceneSTEPGeometry ();
-  virtual ~VisualSceneSTEPGeometry ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-};
-#endif
-
-
-class VisualSceneSTLMeshing : public VisualScene
-{
-  ARRAY<int> trilists;
-  int selecttrig, nodeofseltrig;
-
-public:
-  VisualSceneSTLMeshing ();
-  virtual ~VisualSceneSTLMeshing ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-  virtual void MouseDblClick (int px, int py);
-
-  int seltria;
-};
-
-
-
-
-class VisualSceneSurfaceMeshing : public VisualScene
-{
-public:
-  VisualSceneSurfaceMeshing ();
-  virtual ~VisualSceneSurfaceMeshing ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-};
-
-
-
-
-
-
-
-class VisualSceneMesh : public VisualScene
-{
-  int filledlist;
-  int linelist;
-  int pointnumberlist;
-
-  int tetlist;
-  int prismlist;
-  int pyramidlist;
-  int hexlist;
-
-  int badellist;
-  int identifiedlist;
-  int domainsurflist;
-
-  int vstimestamp, selecttimestamp;
-  int filledtimestamp;
-  int linetimestamp;
-  int pointnumbertimestamp;
-
-  int tettimestamp;
-  int prismtimestamp;
-  int pyramidtimestamp;
-  int hextimestamp;
-
-  int badeltimestamp;
-  int identifiedtimestamp;
-  int domainsurftimestamp;
-
-  NgLock *lock;
-
-  int selface, selelement;
-  int selpoint, selpoint2, locpi;
-  int seledge;
-
-  double minh, maxh; // for meshsize coloring
-
-public:
-  VisualSceneMesh ();
-  virtual ~VisualSceneMesh ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-  virtual void MouseDblClick (int px, int py);
-
-  int SelectedFace () const
-    { return selface; }
-  void SetSelectedFace (int asf) 
-    { selface = asf; selecttimestamp = GetTimeStamp(); }
-
-  int SelectedEdge () const
-    { return seledge; }
-  int SelectedElement () const
-    { return selelement; }
-  int SelectedPoint () const
-    { return selpoint; }
-private:
-  void BuildFilledList();
-  void BuildLineList();
-  void BuildPointNumberList();
-
-  void BuildTetList();
-  void BuildPrismList();
-  void BuildPyramidList();
-  void BuildHexList();
-
-  void BuildBadelList();
-  void BuildIdentifiedList();
-  void BuildDomainSurfList();
-};
-
-
-
-
-
-
-
-class VisualSceneSpecPoints : public VisualScene
-{
-public:
-  VisualSceneSpecPoints ();
-  virtual ~VisualSceneSpecPoints ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-
-  double len;
-};
-
-// extern struct Tcl_Interp * hinterp;
-
-
-extern void AddVisualizationScene (const string & name, 
-				   VisualScene * vs);
-
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/visualization/soldata.hpp b/contrib/Netgen/libsrc/visualization/soldata.hpp
deleted file mode 100644
index 44e0d0a56e39a574bb1005c48fc3e3f6cc4c7bd2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/soldata.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef FILE_SOLDATA
-#define FILE_SOLDATA
-
-
-using namespace std;
-
-class SolutionData
-{
-protected:
-
-  string name;
-  int components;
-  bool iscomplex;
-
-  int multidimcomponent;
-
-public:
-  SolutionData (const string & aname, 
-		int acomponents = 1, bool aiscomplex = 0)
-    : name(aname), components(acomponents), iscomplex(aiscomplex)
-  { ; }
-
-  virtual ~SolutionData ()
-  { ; }
-
-  int GetComponents() { return components; }
-  bool IsComplex() { return iscomplex; }
-
-  virtual bool GetValue (int /* elnr */, 
-			 double /* lam1 */, double /* lam2 */, double /* lam3 */,
-			 double * /* values */) 
-  { return false; }
-
-  virtual bool GetSurfValue (int /* selnr */,
-			     double /* lam1 */, double /* lam2 */, 
-			     double * /* values */)
-  { return false; }
-
-  void SetMultiDimComponent (int mc)
-  { multidimcomponent = mc; }
-};
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/visualization/stlmeshing.cpp b/contrib/Netgen/libsrc/visualization/stlmeshing.cpp
deleted file mode 100644
index 45adac9d757ab5b2778653f893169829c981edcc..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/stlmeshing.cpp
+++ /dev/null
@@ -1,1074 +0,0 @@
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-#include <linalg.hpp>
-#include <stlgeom.hpp>
-
-#include <meshing.hpp>
-#include <visual.hpp>
-
-namespace netgen
-{
-
-/*
-//mmm
-#include "stlgeom/modeller.hpp"
-*/
-
-/* *********************** Draw STL Geometry **************** */
-
-extern STLGeometry * stlgeometry;
-extern AutoPtr<Mesh> mesh;
-
-
-#ifdef OPENGL
-
-// #include "../../ngtcltk/mvdraw.hpp"
-
-
-VisualSceneSTLMeshing :: VisualSceneSTLMeshing ()
-  : VisualScene()
-{
-  selecttrig = 0;
-  nodeofseltrig = 1;
-  stlgeometry->SetSelectTrig(selecttrig);
-  stlgeometry->SetNodeOfSelTrig(nodeofseltrig);
-}
-
-VisualSceneSTLMeshing :: ~VisualSceneSTLMeshing ()
-{
-  ;
-}
-
-void VisualSceneSTLMeshing :: DrawScene ()
-{
-  int i, j, k;
-
-  if (changeval != stlgeometry->GetNT())
-    BuildScene();
-  changeval = stlgeometry->GetNT();
-
-  int colormeshsize = vispar.colormeshsize;
-  
-  double hmin, hmax;
-
-  if (colormeshsize)
-    {
-      hmax = -1E50;
-      hmin = +1E50;
-      double ms;
-
-      for (i = 1; i <= stlgeometry->GetNP(); i++)
-	{
-	  ms = mesh->GetH (stlgeometry->GetPoint(i));
-	  hmin = min2(hmin,ms);
-	  hmax = max2(hmax,ms);
-	}
-
-      //hmax = mparam.maxh;
-      //hmin = mesh->GetMinH (stlgeometry->GetBoundingBox().PMin(),
-      //			    stlgeometry->GetBoundingBox().PMax());
-  
-      if (hmin == 0) hmin = 0.1 * hmax;
-      //hmax *= 1.1;
-    }
-  
-
-
-  glClearColor(backcolor, backcolor, backcolor, 1.0);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-
-  SetLight();
-
-  glPushMatrix();
-  glMultMatrixf (transformationmat);
-
-  SetClippingPlane ();
-
-  glShadeModel (GL_SMOOTH);
-  glDisable (GL_COLOR_MATERIAL);
-  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-
-  glEnable (GL_BLEND);
-  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-  float mat_spec_col[] = { 1, 1, 1, 1 };
-  glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, mat_spec_col);
-
-  double shine = vispar.shininess;
-  double transp = vispar.transp;
-
-  glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shine);
-  glLogicOp (GL_COPY);
-
-  float mat_colred[]    = { 0.9f, 0.0f, 0.0f, 1.0f };
-  float mat_colgreen[]  = { 0.0f, 0.9f, 0.0f, 1.0f };
-  float mat_colblue[]   = { 0.1f, 0.1f, 1.0f, 1.0f };
-
-  float mat_colbluegreen[] = { 0.1f, 0.5f, 0.9f, 1.0f };
-  float mat_colpink[]      = { 1.0f, 0.1f, 0.5f, 1.0f };
-  float mat_colviolet[]    = { 1.0f, 0.1f, 1.0f, 1.0f };
-  float mat_colbrown[]     = { 0.8f, 0.6f, 0.1f, 1.0f };
-  float mat_colorange[]    = { 0.9f, 0.7f, 0.1f, 1.0f };
-  float mat_colturquis[]   = { 0.0f, 1.0f, 0.8f, 1.0f };
-
-  float mat_colgrey[] = { 0.3f, 0.3f, 0.3f, 1.0f };
-
-  float mat_collred[]   = { 1.0f, 0.5f, 0.5f, 1.0f };
-  float mat_collgreen[] = { 0.2f, 1.9f, 0.2f, 1.0f };
-  float mat_collbrown[] = { 1.0f, 0.8f, 0.3f, 1.0f };
-
-  float mat_collgrey[] = { 0.8f, 0.8f, 0.8f, 1.0f };
-  float mat_colmgrey[] = { 0.4f, 0.4f, 0.4f, 1.0f };
-
-  float mat_colstlbody[] = { 0.0f, 0.0f, 0.8f, 1.0f };
-  float mat_colseltrig[] = { 0.7f, 0.7f, 0.3f, 1.0f };
-  float mat_colseledge[] = { 0.7f, 0.7f, 1.0f, 1.0f };
-
-  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colblue);
-
-  float pgoff = 0.5f;
-
-  glPolygonOffset (pgoff*1, pgoff*1);
-  glEnable (GL_POLYGON_OFFSET_FILL);
-
-  glEnable (GL_NORMALIZE);
-
-  /*
-  {
-    //mmm
-    //test modeller
-    Modeller model;
-    
-    //MoZylinder z1(Point3d(0,0,0),Vec3d(100,0,0),20,0.01);
-    //model.Add(&z1);
-    //MoZylinder z2(Point3d(50,50,0),Vec3d(0,-100,0),20,0.01);
-    //model.Add(&z2);
-    
-    MoZylinder z1(Point3d(0,0,0),Vec3d(100,0,0),20,0.01);
-    MoZylinder z2(Point3d(50,50,0),Vec3d(0,-100,0),20,0.01);
-    MoCombine cb1(&z1,&z2);
-    model.Add(&cb1);
-    
-    ARRAY<MoTriangle> trigs;
-    model.GetTriangles(trigs);
-    int i, k;
-    glBegin (GL_TRIANGLES);
-    for (i = 1; i <= trigs.Size(); i++)
-      {
-	const MoTriangle & tria = trigs.Get(i);
-	glNormal3f (tria.normal.X(),
-		    tria.normal.Y(),
-		    tria.normal.Z());
-	
-	for (k = 0; k < 3; k++)
-	  {
-	    glVertex3f (tria.pts[k].X(),
-			tria.pts[k].Y(),
-			tria.pts[k].Z());
-	  }
-      }    
-    glEnd ();
-    
-
-  }
-
-*/
-
-
-
-  
-  if (!stlgeometry->trigsconverted)
-    {
-      glBegin (GL_TRIANGLES);
-      for (j = 1; j <= stlgeometry -> GetNT(); j++)
-	{
-	  /*
-	  if (j % 10 == seltria)
-	    glMaterialfv (GL_FRONT_AND_BACK, 
-			  GL_AMBIENT_AND_DIFFUSE, mat_colred);
-	  */
-
-	  const Vec3d & n = stlgeometry->GetTriangle(j).Normal();
-	  glNormal3f (n.X(), n.Y(), n.Z());
-	  /*
-	  const STLReadTriangle & tria = stlgeometry -> GetReadTriangle(j);
-	  glNormal3f (tria.normal.X(),
-		      tria.normal.Y(),
-		      tria.normal.Z());
-	  */
-
-	  
-	  for (k = 1; k <= 3; k++)
-	    {
-	      const Point3d & tp = stlgeometry->GetPoint(stlgeometry->GetTriangle(j).PNum(k));
-	      glVertex3f (tp.X(), tp.Y(), tp.Z());
-
-	    }
-	  /*
-	  if (j%10 == seltria)
-	    glMaterialfv (GL_FRONT_AND_BACK, 
-			  GL_AMBIENT_AND_DIFFUSE, mat_colblue);
-	  */
-	}    
-      glEnd ();
-  
-      glDisable (GL_POLYGON_OFFSET_FILL);
-
-      int showtrias = vispar.stlshowtrias;
-
-      if (showtrias)
-	{
-	  float mat_coll[] = { 0.2, 0.2, 0.2, 1 };
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_coll);
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-      
-	  glEnable (GL_NORMALIZE);
-      
-	  glBegin (GL_TRIANGLES);
-	  for (j = 1; j <= stlgeometry -> GetNT(); j++)
-	    {
-	      const Vec3d & n = stlgeometry->GetTriangle(j).Normal();
-	      glNormal3f (n.X(), n.Y(), n.Z());
-	      /*
-	      const STLReadTriangle & tria = stlgeometry -> GetReadTriangle(j);
-	      glNormal3f (tria.normal.X(),
-			  tria.normal.Y(),
-			  tria.normal.Z());
-	      */  
-
-	      for (k = 1; k <= 3; k++)
-		{
-		  const Point3d & tp = 
-		    stlgeometry->GetPoint(stlgeometry->GetTriangle(j).PNum(k));
-		  glVertex3f (tp.X(), tp.Y(), tp.Z());
-		  
-		}
-	      
-	      /*
-	      for (k = 0; k < 3; k++)
-		{
-		  glVertex3f (tria.pts[k].X(),
-			      tria.pts[k].Y(),
-			      tria.pts[k].Z());
-		}
-	      */
-	    }    
-	  glEnd ();
-	}
-    }
-  else
-    {
-      int showfilledtrias = vispar.stlshowfilledtrias;
-
-      //(*mycout) << "in " << showfilledtrias << ", NT=" << stlgeometry -> GetNT() << endl;
-
-      int chartnumber;
-      if (vispar.stlshowmarktrias)
-	chartnumber = vispar.stlchartnumber + vispar.stlchartnumberoffset;
-      else
-	chartnumber = stlgeometry->GetMeshChartNr();
-
-      if (showfilledtrias)
-	{
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-	  if (colormeshsize)
-	    glEnable (GL_COLOR_MATERIAL);
-	  
-	  glPolygonOffset (pgoff*4, pgoff*4);
-	  glEnable (GL_POLYGON_OFFSET_FILL);
-	  glEnable (GL_NORMALIZE);
-
-
-	  glBegin (GL_TRIANGLES);
-
-	  int selt = stlgeometry -> GetSelectTrig();
-	  if (stldoctor.selectmode != 0) 
-	    {selt = 0; } //do not show selected triangle!!!!
-
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colstlbody);
-
-	  for (j = 1; j <= stlgeometry -> GetNT(); j++)
-	    {
-	      if (stldoctor.showvicinity && !stlgeometry->Vicinity(j)) {continue;}
-
-	      if (j == selt)
-		{
-		  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colseltrig);
-		}
-	      else if (j == selt+1)
-		{
-		  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colstlbody);
-		}
-	      
-	      const STLTriangle& st = stlgeometry -> GetTriangle(j);
-
-	      const Vec3d & n = stlgeometry->GetTriangle(j).Normal();
-	      glNormal3f (n.X(), n.Y(), n.Z());
-	  
-	      /*
-	      const STLReadTriangle& tria = stlgeometry -> GetReadTriangle(j);
-	      glNormal3f (tria.normal.X(),
-			  tria.normal.Y(),
-			  tria.normal.Z());
-	      */
-	      for (k = 0; k < 3; k++)
-		{
-		  const Point3d & p = stlgeometry->GetPoint(st[k]);
-		  if (colormeshsize)
-		    {
-		      SetOpenGlColor (mesh->GetH (p), hmin, hmax, 1);
-		    }
-
-		  glVertex3f (p.X(), p.Y(), p.Z());
-		}
-	    } 
-   
-	  glEnd ();
-	}
-      
-      int foundseltrig = stlgeometry -> GetSelectTrig();
-      if (foundseltrig == 0 || foundseltrig > stlgeometry->GetNT() ||
-	  (stldoctor.showvicinity && !stlgeometry->Vicinity(foundseltrig)))
-	{foundseltrig = 0;}
-
-      if (foundseltrig)
-	{
-
-	  glPolygonOffset (pgoff*0, 0);
-	  glEnable (GL_POLYGON_OFFSET_FILL);
-
-	  //glDisable (GL_POLYGON_OFFSET_FILL);      
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colseledge);
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-	  
-	  glEnable (GL_NORMALIZE);
-
-	  if (stldoctor.selectmode == 2)
-	    {
-	      //point
-	      const STLTriangle& st = stlgeometry -> GetTriangle(foundseltrig);
-	      const Point3d & p1 = stlgeometry->GetPoint(st[0]);
-	      const Point3d & p2 = stlgeometry->GetPoint(st[1]);
-	      const Point3d & p3 = stlgeometry->GetPoint(st[2]);
-
-	      double cs = (Dist(p1,p2)+Dist(p2,p3)+Dist(p3,p1))/100.;
-
-	      const Point3d & p = stlgeometry->GetPoint(st[nodeofseltrig-1]);
-	      
-	      glLineWidth (4);
-	      glBegin (GL_LINES);
-	      glVertex3f(p.X()+cs, p.Y()+cs, p.Z()+cs);
-	      glVertex3f(p.X()-cs, p.Y()-cs, p.Z()-cs);
-	      
-	      glVertex3f(p.X()-cs, p.Y()+cs, p.Z()+cs);
-	      glVertex3f(p.X()+cs, p.Y()-cs, p.Z()-cs);
-
-	      glVertex3f(p.X()-cs, p.Y()+cs, p.Z()+cs);
-	      glVertex3f(p.X()+cs, p.Y()-cs, p.Z()-cs);
-	      
-	      glVertex3f(p.X()+cs, p.Y()-cs, p.Z()+cs);
-	      glVertex3f(p.X()-cs, p.Y()+cs, p.Z()-cs);
-	      
-	      glEnd ();	  
-	      glLineWidth (1);
-	    }
-	  else if (stldoctor.selectmode == 1 || 
-		   stldoctor.selectmode == 3 || 
-		   stldoctor.selectmode == 4)
-	    {
-	      //multiedge
-	      
-	      const ARRAY<twoint>& me = stlgeometry->SelectedMultiEdge();
-	      if (stlgeometry->GetSelectTrig() > 0 && 
-		  stlgeometry->GetSelectTrig() <= stlgeometry->GetNT() &&
-		  me.Size())
-		{
-
-		  int en = stlgeometry->EdgeDataList().GetEdgeNum(me.Get(1).i1,me.Get(1).i2);
-		  int status = stlgeometry->EdgeDataList().Get(en).GetStatus();
-		  
-		  switch (status)
-		    {
-		    case ED_CONFIRMED:
-		      glMaterialfv (GL_FRONT_AND_BACK, 
-				    GL_AMBIENT_AND_DIFFUSE, mat_collgreen);
-		      break;
-		    case ED_CANDIDATE:
-		      glMaterialfv (GL_FRONT_AND_BACK, 
-				    GL_AMBIENT_AND_DIFFUSE, mat_collbrown);
-		      break;
-		    case ED_EXCLUDED:
-		      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_collred);
-		      break;
-		    }
-
-		  glLineWidth (2);
-		  glBegin (GL_LINES);
-		  for (j = 1; j <= me.Size(); j++)
-		    { 
-		      Point3d p1 = stlgeometry->GetPoint(me.Get(j).i1);
-		      Point3d p2 = stlgeometry->GetPoint(me.Get(j).i2);
-		      
-		      glVertex3f(p1.X(), p1.Y(), p1.Z());
-		      glVertex3f(p2.X(), p2.Y(), p2.Z());
-		    }
-		  glEnd ();
-		  glLineWidth (1);
-		}
-	    }
-	}
-
-      int showmarktrias = vispar.stlshowmarktrias || vispar.stlshowactivechart;
- 
-      if (stldoctor.showmarkedtrigs)
-	{
-	  //(*mycout) << "marked" << endl;
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); //GL_LINE
-	  glPolygonOffset (pgoff*1, pgoff*1);
-	  glEnable (GL_POLYGON_OFFSET_FILL);
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colbluegreen);
-	  glEnable (GL_NORMALIZE);
-
-	  glBegin (GL_TRIANGLES);
-
-	  for (j = 1; j <= stlgeometry -> GetNT(); j++)
-	    {
-	      if (stldoctor.showvicinity && !stlgeometry->Vicinity(j)) 
-		{continue;}
-
-	      if (!stlgeometry->IsMarkedTrig(j)) 
-		{continue;}
-	      
-	      const STLTriangle& st = stlgeometry -> GetTriangle(j);
-
-	      const Vec3d & n = stlgeometry->GetTriangle(j).Normal();
-	      glNormal3f (n.X(), n.Y(), n.Z());
-	      /*
-	      const STLReadTriangle& tria = stlgeometry -> GetReadTriangle(j);
-	      glNormal3f (tria.normal.X(),
-			  tria.normal.Y(),
-			  tria.normal.Z());
-	      */
-	      for (k = 0; k < 3; k++)
-		{
-		  const Point3d & p = stlgeometry->GetPoint(st[k]);
-		  glVertex3f (p.X(), p.Y(), p.Z());
-		}
-	    }    
-	  glEnd ();
-
-	  //show OpenSegments on original geometry
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colviolet);
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-	  glPolygonOffset (pgoff*1, 1);
-      
-	  glEnable (GL_NORMALIZE);
-      
-	  glBegin (GL_LINES);
-
-	  if (stlgeometry->GetNMarkedSegs())
-	    {
-	      Point<3> p1,p2;	      
-	      for (j = 1; j <= stlgeometry -> GetNMarkedSegs(); j++)
-		{
-		  stlgeometry->GetMarkedSeg(j,p1,p2);
-		  glVertex3dv(&p1(0));
-		  glVertex3dv(&p2(0));
-		}
-	    }
-	  glEnd ();
-	}
-
-
-      if (stldoctor.showfaces)
-	{
-	  int facenumber = vispar.stlchartnumber + vispar.stlchartnumberoffset;
-
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-	  glPolygonOffset (pgoff*3, 3);
-	  glEnable (GL_POLYGON_OFFSET_FILL);
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_collgrey);
-	  glEnable (GL_NORMALIZE);
-
-	  glBegin (GL_TRIANGLES);
-
-	  for (j = 1; j <= stlgeometry -> GetNT(); j++)
-	    {
-	      if (stldoctor.showvicinity && !stlgeometry->Vicinity(j)) 
-		{continue;}
-
-	      //(*mycout) << " facenum = " << stlgeometry->GetTriangle(j).GetFaceNum() << " ";
-	      if (stlgeometry->GetTriangle(j).GetFaceNum() != facenumber) 
-		{continue;}
-	      
-	      const STLTriangle& st = stlgeometry -> GetTriangle(j);
-
-	      const Vec3d & n = stlgeometry->GetTriangle(j).Normal();
-	      glNormal3f (n.X(), n.Y(), n.Z());
-	      /*
-	      const STLReadTriangle& tria = stlgeometry -> GetReadTriangle(j);
-	      glNormal3f (tria.normal.X(),
-			  tria.normal.Y(),
-			  tria.normal.Z());
-	      */
-	      for (k = 0; k < 3; k++)
-		{
-		  Point3d p = stlgeometry->GetPoint(st[k]);
-		  glVertex3f (p.X(), p.Y(), p.Z());
-		}
-	    }    
-	  glEnd ();
-	}
-
-      if (showmarktrias && stlgeometry->AtlasMade())
-	{
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-	  glPolygonOffset (pgoff*3, 3);
-	  glEnable (GL_POLYGON_OFFSET_FILL);
-
-	  glBegin (GL_TRIANGLES);
-	  
-	  if (chartnumber >= 1 && chartnumber <= stlgeometry->GetNOCharts())
-	    {
-	      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colbrown);
-	      const STLChart& chart = stlgeometry->GetChart(chartnumber);
-	      for (j = 1; j <= chart.GetNChartT(); j++)
-		{
-		  /*
-		  if (j == charttrignumber) 
-		    {glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colred);}
-		  else
-		    {glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colbrown);}
-		  */
-		  const STLTriangle& st = stlgeometry -> GetTriangle(chart.GetChartTrig(j));
-
-		  
-		  const Vec3d & n = stlgeometry->GetTriangle(chart.GetChartTrig(j)).Normal();
-		  glNormal3f (n.X(), n.Y(), n.Z());
-		  /*
-		  const STLReadTriangle& tria = stlgeometry -> GetReadTriangle(chart.GetChartTrig(j));
-		  glNormal3f (tria.normal.X(),
-			      tria.normal.Y(),
-			      tria.normal.Z());
-		  */
-		  for (k = 0; k < 3; k++)
-		    {
-		      glVertex3f (stlgeometry->GetPoint(st[k])(0),
-				  stlgeometry->GetPoint(st[k])(1),
-				  stlgeometry->GetPoint(st[k])(2));
-		    }
-		}
-	      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colgreen);
-	      
-	      for (j = 1; j <= chart.GetNOuterT(); j++)
-		{
-		  
-		  const STLTriangle& st = stlgeometry -> GetTriangle(chart.GetOuterTrig(j));
-
-		  const Vec3d & n = stlgeometry->GetTriangle(chart.GetOuterTrig(j)).Normal();
-		  glNormal3f (n.X(), n.Y(), n.Z());
-
-
-		  /*
-		  const STLReadTriangle& tria = stlgeometry -> GetReadTriangle(chart.GetOuterTrig(j));
-		  glNormal3f (tria.normal.X(),
-			      tria.normal.Y(),
-			      tria.normal.Z());
-		  */
-		  for (k = 0; k < 3; k++)
-		    {
-		      glVertex3f (stlgeometry->GetPoint(st[k])(0),
-				  stlgeometry->GetPoint(st[k])(1),
-				  stlgeometry->GetPoint(st[k])(2));
-		    }
-		}
-	    }
-	  glEnd ();
-	}
-
-      int showtrias = vispar.stlshowtrias;
-
-      if (showtrias)
-	{
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colgrey);
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-	  glPolygonOffset (pgoff*2, 2);
-	  glEnable (GL_POLYGON_OFFSET_FILL);
-	  glEnable (GL_NORMALIZE);
-
-	  glBegin (GL_TRIANGLES);
-	  
-	  for (j = 1; j <= stlgeometry -> GetNT(); j++)
-	    {	  
-	      if (stldoctor.showvicinity && !stlgeometry->Vicinity(j)) {continue;}
-
-	      const STLTriangle& st = stlgeometry -> GetTriangle(j);
-
-	      const Vec3d & n = stlgeometry->GetTriangle(j).Normal();
-	      glNormal3f (n.X(), n.Y(), n.Z());
-	      /*
-	      const STLReadTriangle& tria = stlgeometry -> GetReadTriangle(j);
-	      glNormal3f (tria.normal.X(),
-			  tria.normal.Y(),
-			  tria.normal.Z());
-	      */	  
-	      for (k = 0; k < 3; k++)
-		{
-		  glVertex3f (stlgeometry->GetPoint(st[k])(0),
-			      stlgeometry->GetPoint(st[k])(1),
-			      stlgeometry->GetPoint(st[k])(2));
-		}
-	    }    
-	  glEnd ();
-	} 
-
-      int showedges = vispar.stlshowedges;
-      
-      if (showedges)
-	{
-	  glPolygonOffset (pgoff*1, 1);
-	  glEnable (GL_POLYGON_OFFSET_FILL);
-	  //glDisable (GL_POLYGON_OFFSET_FILL);      
-
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colgreen);
-	  glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-      
-	  glEnable (GL_NORMALIZE);
-      
-	  glBegin (GL_LINES);
-
-	  /*
-	  if (stldoctor.useexternaledges)
-	    {
-	      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colorange);
-	      for (j = 1; j <= stlgeometry -> NOExternalEdges(); j++)
-		{
-		  twoint v = stlgeometry->GetExternalEdge(j);
-		  Point3d p1 = stlgeometry->GetPoint(v.i1);
-		  Point3d p2 = stlgeometry->GetPoint(v.i2);
-		  
-		  Vec3d n1 = stlgeometry->GetNormal(v.i1);
-		  Vec3d n2 = stlgeometry->GetNormal(v.i2);
-		  
-		  glNormal3f(n1.X(), n1.Y(), n1.Z());
-		  glVertex3f(p1.X(), p1.Y(), p1.Z());
-		  glNormal3f(n2.X(), n2.Y(), n2.Z());
-		  glVertex3f(p2.X(), p2.Y(), p2.Z());
-		}
-	    }
-	  */
-
-	  
-	  if (!stlgeometry->meshlines.Size() || !stldoctor.drawmeshededges)
-	    {
-	      /*
-	      for (j = 1; j <= stlgeometry -> GetNE(); j++)
-		{
-		  STLEdge v = stlgeometry->GetEdge(j);
-		  Point3d p1 = stlgeometry->GetPoint(v.pts[0]);
-		  Point3d p2 = stlgeometry->GetPoint(v.pts[1]);
-		  
-		  Vec3d n1 = stlgeometry->GetNormal(v.pts[0]);
-		  Vec3d n2 = stlgeometry->GetNormal(v.pts[1]);
-		  
-		  glNormal3f(n1.X(), n1.Y(), n1.Z());
-		  glVertex3f(p1.X(), p1.Y(), p1.Z());
-		  glNormal3f(n2.X(), n2.Y(), n2.Z());
-		  glVertex3f(p2.X(), p2.Y(), p2.Z());
-		}
-	      */
-	      const STLEdgeDataList& ed = stlgeometry->EdgeDataList();
-	      for (i = 1; i <= ed.Size(); i++)
-		{
-		  if (ed.Get(i).GetStatus() != ED_UNDEFINED)
-		    {
-		      switch (ed.Get(i).GetStatus())
-			{
-			case ED_CONFIRMED:
-			  glMaterialfv (GL_FRONT_AND_BACK, 
-					GL_AMBIENT_AND_DIFFUSE, mat_colgreen);
-			  break;
-			case ED_CANDIDATE:
-			  glMaterialfv (GL_FRONT_AND_BACK, 
-					GL_AMBIENT_AND_DIFFUSE, mat_colbrown);
-			  break;
-			case ED_EXCLUDED:
-			  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colred);
-			  break;
-			}
-
-		      if (ed.Get(i).GetStatus() == ED_EXCLUDED && !stldoctor.showexcluded) continue;
-
-		      Point3d p1 = stlgeometry->GetPoint(ed.Get(i).PNum(1));
-		      Point3d p2 = stlgeometry->GetPoint(ed.Get(i).PNum(2));
-		      glVertex3f(p1.X(), p1.Y(), p1.Z());
-		      glVertex3f(p2.X(), p2.Y(), p2.Z());		   
-		    }
-		}
-	    }
-
-	  /*
-	  else     
-	  if (stlgeometry->meshlines.Size() == 0)
-	    {
-	      for (j = 1; j <= stlgeometry->GetNLines(); j++)
-		{
-		  STLLine* line = stlgeometry->GetLine(j);
-		  int pn1, pn2;
-		  for (int k = 1; k <= line->NP()-1; k++)
-		    {
-		      pn1 = line->PNum(k);
-		      pn2 = line->PNum(k+1);
-
-		      Point3d p1 = stlgeometry->GetPoint(pn1);
-		      Point3d p2 = stlgeometry->GetPoint(pn2);
-		  
-		      Vec3d n1 = stlgeometry->GetNormal(pn1);
-		      Vec3d n2 = stlgeometry->GetNormal(pn2);
-		  
-		      glNormal3f(n1.X(), n1.Y(), n1.Z());
-		      glVertex3f(p1.X(), p1.Y(), p1.Z());
-		      glNormal3f(n2.X(), n2.Y(), n2.Z());
-		      glVertex3f(p2.X(), p2.Y(), p2.Z());
-		    }
-		}    
-	    }
-	  */
-	    
-	  else if (stlgeometry->meshlines.Size() != 0)
-	    {
-	      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colgreen);
-	      for (j = 1; j <= stlgeometry->meshlines.Size(); j++)
-		{
-		  STLLine* line = stlgeometry->meshlines.Get(j);
-		  int pn1, pn2;
-		  for (int k = 1; k <= line->NP()-1; k++)
-		    {
-		      pn1 = line->PNum(k);
-		      pn2 = line->PNum(k+1);
-
-		      Point3d p1 = stlgeometry->meshpoints.Get(pn1);
-		      Point3d p2 = stlgeometry->meshpoints.Get(pn2);
-		  		  
-		      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colgreen);
-		      glVertex3f(p1.X(), p1.Y(), p1.Z());
-		      glVertex3f(p2.X(), p2.Y(), p2.Z());
-
-		      
-		      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colred);
-		      double cs = 0.02*Dist(p1,p2);
-		      glVertex3f(p1.X()+cs, p1.Y()+cs, p1.Z()+cs);
-		      glVertex3f(p1.X()-cs, p1.Y()-cs, p1.Z()-cs);
-		      glVertex3f(p2.X()+cs, p2.Y()+cs, p2.Z()+cs);
-		      glVertex3f(p2.X()-cs, p2.Y()-cs, p2.Z()-cs);
-
-		      glVertex3f(p1.X()-cs, p1.Y()+cs, p1.Z()+cs);
-		      glVertex3f(p1.X()+cs, p1.Y()-cs, p1.Z()-cs);
-		      glVertex3f(p2.X()-cs, p2.Y()+cs, p2.Z()+cs);
-		      glVertex3f(p2.X()+cs, p2.Y()-cs, p2.Z()-cs);
-		      
-		    }
-		}
-	    }
-	    
-
-	  glEnd ();
-	}
-
-      if (stldoctor.showedgecornerpoints && stlgeometry->LineEndPointsSet())
-	{
-	  glPointSize (5);
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_colred);
-	  glBegin (GL_POINTS);
-	  for (i = 1; i <= stlgeometry->GetNP(); i++)
-	    {
-	      if (stlgeometry->IsLineEndPoint(i))
-		{
-		  const Point3d p = stlgeometry->GetPoint(i);
-		  glVertex3f (p.X(), p.Y(), p.Z());
-		}
-	    }
-	  glEnd();
-	  
-	}
-
-
-    }
-
- 
-  glPopMatrix();
-
-  if (vispar.colormeshsize)
-    DrawColorBar (hmin, hmax, 1);
-
-  glFinish();  
-}
-
-
-void VisualSceneSTLMeshing :: BuildScene (int zoomall)
-{
-  if (selecttrig && zoomall == 2)
-    center = stlgeometry -> GetPoint ( stlgeometry->GetTriangle(selecttrig).PNum(nodeofseltrig));
-  else
-    center = stlgeometry -> GetBoundingBox().Center();
-
-  rad = stlgeometry -> GetBoundingBox().Diam() / 2;
-
-  CalcTransformationMatrices();
-}
-
-
-
-void VisualSceneSTLMeshing :: MouseDblClick (int px, int py)
-{
-  //  (*mycout) << "dblclick: " << px << " - " << py << endl;
-  
-
-  int i, j, k, hits;
-
-  // select surface triangle by mouse click
-
-  GLuint selbuf[10000];
-  glSelectBuffer (10000, selbuf);
-
-
-  glRenderMode (GL_SELECT);
-
-  GLint viewport[4];
-  glGetIntegerv (GL_VIEWPORT, viewport);
-
-  /*  
-  (*mycout) << "viewport = " << viewport[0] << " " 
-       << viewport[1] << " " << viewport[2] << " " << viewport[3] << endl;
-  */
-
-  glMatrixMode (GL_PROJECTION); 
-  glPushMatrix();
-
-
-  GLdouble projmat[16];
-  glGetDoublev (GL_PROJECTION_MATRIX, projmat);
-
-  glLoadIdentity(); 
-  gluPickMatrix (px, viewport[3] - py, 1, 1, viewport); 
-  glMultMatrixd (projmat);
-  
-
-
-  glClearColor(backcolor, backcolor, backcolor, 1.0);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-  glMatrixMode (GL_MODELVIEW); 
-
-  glPushMatrix();
-  glMultMatrixf (transformationmat);
-
-
-  glInitNames();
-  glPushName (1);
-
-
-  glEnable (GL_POLYGON_OFFSET_FILL);
-  for (j = 1; j <= stlgeometry -> GetNT(); j++)
-    {
-      if (stldoctor.showvicinity && !stlgeometry->Vicinity(j)) {continue;}
-
-      const STLTriangle& st = stlgeometry -> GetTriangle(j);
-			
-      //const STLReadTriangle& tria = stlgeometry -> GetReadTriangle(j);
-      //glNormal3f (tria.normal.X(), tria.normal.Y(), tria.normal.Z());
-      
-      if (stldoctor.selectmode == 0)
-	{
-	  glLoadName (j);
-	  glBegin (GL_TRIANGLES);
-	  for (k = 0; k < 3; k++)
-	    {
-	      Point3d p = stlgeometry->GetPoint(st[k]);
-	      glVertex3f (p.X(), p.Y(), p.Z());
-	    }
-	  glEnd ();
-	} 
-      else if (stldoctor.selectmode == 1 || stldoctor.selectmode == 3
-	        || stldoctor.selectmode == 4)
-	{
-	  Point3d pm = Center(stlgeometry->GetPoint(st[0]),
-			      stlgeometry->GetPoint(st[1]),
-			      stlgeometry->GetPoint(st[2]));
-
-	  for (k = 0; k < 3; k++)
-	    {
-	      glLoadName (j*3+k-2);
-	      glBegin (GL_TRIANGLES);
-
-	      Point3d p1 = stlgeometry->GetPoint(st[k]);
-	      Point3d p2 = stlgeometry->GetPoint(st[(k+1)%3]);
-	      glVertex3f (p1.X(), p1.Y(), p1.Z());
-	      glVertex3f (p2.X(), p2.Y(), p2.Z());
-	      glVertex3f (pm.X(), pm.Y(), pm.Z());
-
-	      glEnd ();
-	    }
-	}
-      else
-	{
-	  Point3d pm1 = Center(stlgeometry->GetPoint(st[0]),
-			       stlgeometry->GetPoint(st[1]));
-	  Point3d pm2 = Center(stlgeometry->GetPoint(st[1]),
-			       stlgeometry->GetPoint(st[2]));
-	  Point3d pm3 = Center(stlgeometry->GetPoint(st[2]),
-			       stlgeometry->GetPoint(st[0]));
-
-	  Point3d p1 = stlgeometry->GetPoint(st[0]);
-	  Point3d p2 = stlgeometry->GetPoint(st[1]);
-	  Point3d p3 = stlgeometry->GetPoint(st[2]);
-
-	  glLoadName (j*4-3);
-	  glBegin (GL_TRIANGLES);
-	  glVertex3f (p1.X(), p1.Y(), p1.Z());
-	  glVertex3f (pm1.X(), pm1.Y(), pm1.Z());
-	  glVertex3f (pm3.X(), pm3.Y(), pm3.Z());
-	  glEnd ();
-
-	  glLoadName (j*4-2);
-	  glBegin (GL_TRIANGLES);
-	  glVertex3f (p2.X(), p2.Y(), p2.Z());
-	  glVertex3f (pm2.X(), pm2.Y(), pm2.Z());
-	  glVertex3f (pm1.X(), pm1.Y(), pm1.Z());
-	  glEnd ();
-
-	  glLoadName (j*4-1);
-	  glBegin (GL_TRIANGLES);
-	  glVertex3f (p3.X(), p3.Y(), p3.Z());
-	  glVertex3f (pm3.X(), pm3.Y(), pm3.Z());
-	  glVertex3f (pm2.X(), pm2.Y(), pm2.Z());
-	  glEnd ();
-
-	  glLoadName (j*4);
-	  glBegin (GL_TRIANGLES);
-	  glVertex3f (pm1.X(), pm1.Y(), pm1.Z());
-	  glVertex3f (pm2.X(), pm2.Y(), pm2.Z());
-	  glVertex3f (pm3.X(), pm3.Y(), pm3.Z());
-	  glEnd ();
-	}
-    }    
-
-  glPopName();
-
-  glMatrixMode (GL_PROJECTION); 
-  glPopMatrix();
-
-  glMatrixMode (GL_MODELVIEW); 
-  glPopMatrix();
-
-  glFlush();  
-
-	
-  hits = glRenderMode (GL_RENDER);
-
-  //  (*mycout) << "hits = " << hits << endl;
-
-  //int minrec = -1;
-  int minname = 0;
-  GLuint mindepth = 0;
-  for (i = 0; i < hits; i++)
-    {
-      int curname = selbuf[4*i+3];
-      GLuint curdepth = selbuf[4*i+1];
-
-      /*      
-      (*mycout) << selbuf[4*i] << " " << selbuf[4*i+1] << " " 
-	   << selbuf[4*i+2] << " " << selbuf[4*i+3] << endl;
-      */
-      if (curname &&
-	  (curdepth < mindepth || !minname))
-	{
-	  //minrec = i;
-	  mindepth = curdepth;
-	  minname = curname;
-	}
-    }
-
-  if (!minname) {return;}
-  
-  if (stldoctor.selectmode == 0)
-    {
-      int oldtrig = selecttrig;
-      selecttrig = minname;
-      if (selecttrig == oldtrig)
-	nodeofseltrig = (nodeofseltrig % 3) + 1;
-      else
-	nodeofseltrig = 1;
-
-      stlgeometry->SetSelectTrig(selecttrig);
-      stlgeometry->SetNodeOfSelTrig(nodeofseltrig);
-      stlgeometry->PrintSelectInfo();
-      
-    }
-  else if (stldoctor.selectmode == 1 || stldoctor.selectmode == 3 || stldoctor.selectmode == 4)
-    {
-      selecttrig = (minname-1) / 3 + 1;
-      nodeofseltrig = minname-selecttrig*3+3;
-
-      stlgeometry->SetSelectTrig(selecttrig);
-      stlgeometry->SetNodeOfSelTrig(nodeofseltrig);
-      stlgeometry->PrintSelectInfo();
-
-      if (stldoctor.selectmode == 1)
-	{
-	  stlgeometry->BuildSelectedEdge(twoint(stlgeometry->GetTriangle(selecttrig).PNumMod(nodeofseltrig),
-						stlgeometry->GetTriangle(selecttrig).PNumMod(nodeofseltrig+1)));
-	}
-      if (stldoctor.selectmode == 3)
-	{
-	  stlgeometry->BuildSelectedMultiEdge(twoint(stlgeometry->GetTriangle(selecttrig).PNumMod(nodeofseltrig),
-						     stlgeometry->GetTriangle(selecttrig).PNumMod(nodeofseltrig+1)));
-	}
-      else if (stldoctor.selectmode == 4)
-	{
-	  stlgeometry->BuildSelectedCluster(twoint(stlgeometry->GetTriangle(selecttrig).PNumMod(nodeofseltrig),
-						   stlgeometry->GetTriangle(selecttrig).PNumMod(nodeofseltrig+1)));
-	}
- 
-      switch (stldoctor.edgeselectmode)
-	{
-	case 1: stlgeometry->STLDoctorUndefinedEdge(); break;
-	case 2: stlgeometry->STLDoctorConfirmEdge(); break;
-	case 3: stlgeometry->STLDoctorCandidateEdge(); break;
-	case 4: stlgeometry->STLDoctorExcludeEdge(); break;
-	default: break;
-	}
-    }
-  else if (stldoctor.selectmode == 2)
-    {
-      selecttrig = (minname-1) / 4 + 1;
-      nodeofseltrig = minname-selecttrig*4+4;
-      if (nodeofseltrig == 4) {nodeofseltrig = 1;}
-
-      stlgeometry->SetSelectTrig(selecttrig);
-      stlgeometry->SetNodeOfSelTrig(nodeofseltrig);
-      stlgeometry->PrintSelectInfo();
-
-    }
-
-  if (stldoctor.showtouchedtrigchart && stlgeometry->AtlasMade() && stlgeometry->GetSelectTrig())
-    {
-      vispar.stlchartnumber =  stlgeometry->GetChartNr(stlgeometry->GetSelectTrig());
-      vispar.stlchartnumberoffset = 0;
-    }
-  
-}
-
-
-
-
-VisualSceneSTLMeshing vsstlmeshing;
-
-#endif
-
-
-
- 
-}
diff --git a/contrib/Netgen/libsrc/visualization/vispar.hpp b/contrib/Netgen/libsrc/visualization/vispar.hpp
deleted file mode 100644
index 3a352941824571edc69a245fa8dd8086cb33c384..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/vispar.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef FILE_VISPAR
-#define FILE_VISPAR
-
-class VisualizationParameters
-{
-public:
-  double lightamb;
-  double lightdiff;
-  double lightspec;
-  double shininess;
-  double transp;
-  int locviewer;
-  char selectvisual[20];
-  int showstltrias;
-  
-  Vec3d clipnormal;
-  double clipdist;
-  int clipenable;
-  int clipplanetimestamp;
-
-  int colormeshsize;
-
-  int drawfilledtrigs;
-  int drawbadels;
-  int drawoutline;
-  int drawedges;
-  int subdivisions;
-
-  int drawprisms;
-  int drawpyramids;
-  int drawhexes;
-  double shrink;
-  int drawidentified;
-  int drawpointnumbers;
-  int drawedgenumbers;
-  int drawfacenumbers;
-  int drawelementnumbers;
-  int drawdomainsurf;
-  int drawtets;
-  int drawtetsdomain;
-
-  int drawededges;
-  int drawedpoints;
-  int drawedpointnrs;
-  int drawedtangents;
-  int drawededgenrs;
-  int drawmetispartition;
-
-  int drawcurveproj;
-  int drawcurveprojedge;
-  
-
-  int centerpoint;
-  int drawelement;
-
-  // stl:
-  int stlshowtrias;
-  int stlshowfilledtrias;
-  int stlshowedges;
-  int stlshowmarktrias;
-  int stlshowactivechart;
-  int stlchartnumber;
-  int stlchartnumberoffset;
-
-  // occ:
-  int occshowvolumenr;
-  bool occshowsurfaces;
-  bool occshowedges;
-  bool occvisproblemfaces;
-  bool occzoomtohighlightedentity;
-  double occdeflection;
-
-  bool whitebackground;
-  int stereo;
-  bool usedispllists;
-  bool drawcoordinatecross;
-  bool drawcolorbar;
-  bool drawnetgenlogo;
-
-  bool use_center_coords;
-  double centerx,centery,centerz;
-
-  
-public:
-  VisualizationParameters();
-};
-extern VisualizationParameters vispar;
-
-#endif
diff --git a/contrib/Netgen/libsrc/visualization/visual.hpp b/contrib/Netgen/libsrc/visualization/visual.hpp
deleted file mode 100644
index 3e5910b351b612d649ab946eb31e6a9a43dd003c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/visual.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef FILE_VISUAL
-#define FILE_VISUAL
-
-/* *************************************************************************/
-/* File:   visual.hpp                                                       */
-/* Author: Joachim Schoeberl                                               */
-/* Date:   02. Dec. 01                                                     */
-/* *************************************************************************/
-
-/* 
-
-Visualization
-
-*/
-
-#include <incvis.hpp>
-
-namespace netgen
-{
-#include "mvdraw.hpp"
-#include "soldata.hpp"
-#include "vssolution.hpp"
-#include "meshdoc.hpp"
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/visualization/vscsg.cpp b/contrib/Netgen/libsrc/visualization/vscsg.cpp
deleted file mode 100644
index d17c0c38e2621890e16cee2314fb662d5c257807..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/vscsg.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-#include <mystdlib.h>
-#include "incvis.hpp"
-
-#include <myadt.hpp>
-#include <meshing.hpp>
-#include <csg.hpp>
-#include <stlgeom.hpp>
-
-
-namespace netgen
-{
-#include "mvdraw.hpp"
-
-/* *********************** Draw Geometry **************** */
-
-
-
-
-extern AutoPtr<CSGeometry> geometry;
-
-
-VisualSceneGeometry :: VisualSceneGeometry ()
-  : VisualScene()
-{
-  selsurf = 0;
-}
-
-VisualSceneGeometry :: ~VisualSceneGeometry ()
-{
-  ;
-}
-
-void VisualSceneGeometry :: SelectSurface (int aselsurf)
-{
-  selsurf = aselsurf;
-  DrawScene();
-}
-
-
-void VisualSceneGeometry :: DrawScene ()
-{
-  int i;
-
-  if (changeval != geometry->GetChangeVal())
-    BuildScene();
-  changeval = geometry->GetChangeVal();
-
-  glClearColor(backcolor, backcolor, backcolor, 1.0);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-  SetLight();
-
-
-  glPushMatrix();
-  glMultMatrixf (transformationmat);
-
-  SetClippingPlane ();
-
-  glShadeModel (GL_SMOOTH);
-  glDisable (GL_COLOR_MATERIAL);
-  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-
-  glEnable (GL_BLEND);
-  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-  /*
-  float mat_spec_col[] = { 1, 1, 1, 1 };
-  glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, mat_spec_col);
-  */
-
-  double shine = vispar.shininess;
-  double transp = vispar.transp;
-
-  glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shine);
-  glLogicOp (GL_COPY);
-
-  glEnable (GL_NORMALIZE);
-
-  for (i = 0; i < geometry->GetNTopLevelObjects(); i++)
-    {
-      const TopLevelObject * tlo = geometry -> GetTopLevelObject (i);
-      if (tlo->GetVisible() && !tlo->GetTransparent())
-	{
-	  float mat_col[] = { tlo->GetRed(), tlo->GetGreen(), tlo->GetBlue(), 1 };
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-	  
-	  glCallList (trilists[i]);
-	}
-    }
-
-
-  glPolygonOffset (1, 1);
-  glEnable (GL_POLYGON_OFFSET_FILL);
-
-  glLogicOp (GL_NOOP);
-  for (i = 0; i < geometry->GetNTopLevelObjects(); i++)
-    {
-      const TopLevelObject * tlo = geometry -> GetTopLevelObject (i);
-      if (tlo->GetVisible() && tlo->GetTransparent())
-	{
-	  float mat_col[] = { tlo->GetRed(), tlo->GetGreen(), tlo->GetBlue(), transp };
-
-	  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-	  
-	  glCallList (trilists[i]);
-	}
-    }
-
-  glDisable (GL_POLYGON_OFFSET_FILL);
-
-  glPopMatrix();
-
-  glDisable(GL_CLIP_PLANE0);
-
-  DrawCoordinateCross ();
-  DrawNetgenLogo ();  
-
-  glFinish();  
-
-}
-
-
-void VisualSceneGeometry :: BuildScene (int zoomall)
-{
-  int i, j, k;
-  
-  Box<3> box;
-  int hasp = 0;
-  for (i = 0; i < geometry->GetNTopLevelObjects(); i++)
-    {
-      const TriangleApproximation & ta =
-	*geometry->GetTriApprox(i);
-      if (!&ta) continue;
-
-      for (j = 0; j < ta.GetNP(); j++)      
-	{
-	  if (hasp)
-	    box.Add (ta.GetPoint(j));
-	  else
-	    {
-	      hasp = 1;
-	      box.Set (ta.GetPoint(j));
-	    }
-	}
-    }
-  if (hasp)
-    {
-      center = box.Center();
-      rad = box.Diam() / 2;
-    }
-  else
-    {
-      center = Point3d(0,0,0);
-      rad = 1;
-    }
-
-  CalcTransformationMatrices();
-
-  for (i = 0; i < trilists.Size(); i++)
-    glDeleteLists (trilists[i], 1);
-  trilists.SetSize(0);
-
-  for (i = 0; i < geometry->GetNTopLevelObjects(); i++)
-    {
-      trilists.Append (glGenLists (1));
-      glNewList (trilists.Last(), GL_COMPILE);
-
-      glEnable (GL_NORMALIZE);
-      const TriangleApproximation & ta =
-	*geometry->GetTriApprox(i);
-      if (&ta) 
-	{
-	  glBegin (GL_TRIANGLES);
-	  for (j = 0; j < ta.GetNT(); j++)
-	    {
-	      
-	      for (k = 0; k < 3; k++)
-		{
-		  int pi = ta.GetTriangle(j)[k];
-		  glNormal3f (ta.GetNormal (pi)(0),
-			      ta.GetNormal (pi)(1),
-			      ta.GetNormal (pi)(2));
-		  glVertex3f (ta.GetPoint(pi)(0),
-			      ta.GetPoint(pi)(1),
-			      ta.GetPoint(pi)(2));
-		}
-	    }
-	  glEnd ();
-	}
-      glEndList ();
-    }
-
-}
-
-
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/visualization/vsmesh.cpp b/contrib/Netgen/libsrc/visualization/vsmesh.cpp
deleted file mode 100644
index c53e5223bee26ea1f7555df95bee226d9d2e4d1a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/vsmesh.cpp
+++ /dev/null
@@ -1,3114 +0,0 @@
-#include <mystdlib.h>
-#include "incvis.hpp"
-
-
-#include <myadt.hpp>
-#include <meshing.hpp>
-#include <csg.hpp>
-#include <stlgeom.hpp>
-
-namespace netgen
-{
-
-#include "mvdraw.hpp"
-
-
-  // #define FAST3DELEMENTS
-
-
-
-  extern AutoPtr<Mesh> mesh;
-  extern STLGeometry * stlgeometry;
-  VisualSceneMesh vsmesh;
-
-
-
-  VisualSceneMesh :: VisualSceneMesh ()
-    : VisualScene()
-  {
-    filledlist = 0;
-    linelist = 0;
-    badellist = 0;
-    tetlist = 0;
-    prismlist = 0;
-    hexlist = 0;
-    pyramidlist = 0;
-    identifiedlist = 0;
-    pointnumberlist = 0;
-    domainsurflist = 0;
-
-    vstimestamp = GetTimeStamp();
-    selecttimestamp = GetTimeStamp();
-    filledtimestamp = GetTimeStamp();
-    linetimestamp = GetTimeStamp();
-    pointnumbertimestamp = GetTimeStamp();
-  
-    tettimestamp = GetTimeStamp();
-    prismtimestamp = GetTimeStamp();
-    hextimestamp = GetTimeStamp();
-    pyramidtimestamp = GetTimeStamp();
-  
-    badeltimestamp = GetTimeStamp();
-    identifiedtimestamp = GetTimeStamp();
-    domainsurftimestamp = GetTimeStamp();
-
-
-    selface = -1;
-    selelement = -1;
-    locpi = 1;
-    selpoint = -1;
-    selpoint2 = -1;
-    seledge = -1;
-  }
-
-  VisualSceneMesh :: ~VisualSceneMesh ()
-  {
-    ;
-  }
-
-  
-  // ARRAY<Point3d> drawel;
-
-  void VisualSceneMesh :: DrawScene ()
-  {
-    if (!mesh) 
-      {
-	VisualScene::DrawScene();
-	return;
-      }
-    
-    lock = NULL;
-    
-    BuildScene();
-    
-    glClearColor(backcolor, backcolor, backcolor, 1.0);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-    
-    glEnable (GL_COLOR_MATERIAL);
-    glColor3f (1.0f, 1.0f, 1.0f);
-    glLineWidth (1.0f);
-
-    SetLight();
-
-    glPushMatrix();
-    glMultMatrixf (transformationmat);
-
-    GLdouble projmat[16];
-    glGetDoublev (GL_PROJECTION_MATRIX, projmat);
-  
-  
-    glInitNames ();
-    glPushName (0);
-
-    //    glEnable (GL_LINE_SMOOTH);
-    //    glEnable (GL_BLEND);
-    //    glEnable (GL_POLYGON_SMOOTH);
-    //    glDisable (GL_DEPTH_TEST);
-    //    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-    //    glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
-  
-    glDisable (GL_COLOR_MATERIAL);
-  
-    GLfloat matcol0[] = { 0, 0, 0, 1 };
-    GLfloat matcol1[] = { 1, 1, 1, 1 };
-    GLfloat matcolf[] = { 0, 1, 0, 1 };
-    GLfloat matcolb[] = { 0.5, 0, 0, 1 };
-    GLfloat matcolblue[] = { 0, 0, 1, 1 };
-  
-    glMatrixMode (GL_MODELVIEW); 
-  
-    glMaterialfv(GL_FRONT, GL_EMISSION, matcol0);
-    glMaterialfv(GL_BACK, GL_EMISSION, matcol0);
-    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matcol1);
-    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcolf);
-    glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, matcolb);
-  
-    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-
-    // glPolygonOffset (1,10);
-    glPolygonOffset (2,2);
-    glEnable (GL_POLYGON_OFFSET_FILL);
-
-    SetClippingPlane ();
-
-    if (vispar.drawfilledtrigs)
-      {
-	if (filledtimestamp < mesh->GetTimeStamp () ||
-	    filledtimestamp < selecttimestamp)
-	  {
-	    BuildFilledList ();
-	  }
-	glCallList (filledlist);
-      }
-
-    if (vispar.drawbadels)
-      glCallList (badellist);
-
-    if (vispar.drawprisms)
-      {
-	BuildPrismList ();
-	static float prismcol[] = { 1.0f, 1.0f, 0.0f, 1.0f };
-	glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, prismcol);
-	glLineWidth (1.0f);
-	glCallList (prismlist);
-      }
-
-    if (vispar.drawpyramids)
-      {
-	BuildPyramidList ();
-	static float pyramidcol[] = { 1.0f, 1.0f, 0.0f, 1.0f };
-	glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, pyramidcol);
-	glLineWidth (1.0f);
-	glCallList (pyramidlist);
-      }
-
-    if (vispar.drawhexes)
-      {
-	BuildHexList ();
-	static float hexcol[] = { 1.0f, 0.0f, 0.0f, 1.0f };
-	glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, hexcol);
-	glLineWidth (1.0f);
-	glCallList (hexlist);
-      }
-
-    if (vispar.drawtets)
-      {
-	BuildTetList ();
-	static float tetcol[] = { 1.0f, 1.0f, 0.0f, 1.0f };
-	glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, tetcol);
-	glLineWidth (1.0f);
-	glCallList (tetlist);
-      }
-
-    if (vispar.drawdomainsurf)
-      {
-	BuildDomainSurfList();
-	glCallList (domainsurflist);
-      }
-
-    glDisable (GL_POLYGON_OFFSET_FILL);
-  
-    // draw lines
-
-    glMatrixMode (GL_MODELVIEW); 
-  
-    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, matcol0);
-    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, matcol0);
-    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matcol0);
-  
-    glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-    glLineWidth (1.0f);
-    glColor3f (0.0f, 0.0f, 0.0f);
-    glDisable (GL_LINE_SMOOTH);
-  
-    if (vispar.drawoutline)
-      {
-	glPolygonOffset (1, 1);
-	glEnable (GL_POLYGON_OFFSET_LINE);
-
-	if (linetimestamp < mesh->GetTimeStamp ())
-	  BuildLineList ();
-
-	glCallList (linelist);
-	glDisable (GL_POLYGON_OFFSET_LINE);
-      }
-
-    if (vispar.drawidentified)
-      {
-	glPolygonOffset (1, -1);
-	glEnable (GL_POLYGON_OFFSET_LINE);
-	glCallList (identifiedlist);
-	glDisable (GL_POLYGON_OFFSET_LINE);
-      }
-  
-    if (vispar.drawpointnumbers ||
-	vispar.drawedgenumbers ||
-	vispar.drawfacenumbers ||
-	vispar.drawelementnumbers)
-      glCallList (pointnumberlist);
-  
-  
-    glPopName();
-
-    if (vispar.drawedges)
-      {
-	GLfloat matcoledge[] = { 0, 0, 1, 1 };
-	GLfloat matcolsingedge[] = { 1, 0, 1, 1 };
-
-	glEnable (GL_POLYGON_OFFSET_LINE);
-	glPolygonOffset (1, -1);
-	glLineWidth (2);
-      
-
-	for (int i = 1; i <= mesh->GetNSeg(); i++)
-	  {
-	    const Segment & seg = mesh->LineSegment(i);
-	    const Point3d & p1 = (*mesh)[seg.p1];
-	    const Point3d & p2 = (*mesh)[seg.p2];
-
-	    if (seg.singedge_left || seg.singedge_right)
-	      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
-			    matcolsingedge);
-	    else
-	      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
-			    matcoledge);
-
-	    if (seg.edgenr == seledge)
-	      glLineWidth(5);
-	    else
-	      glLineWidth(2);
-
-	    if (mesh->GetCurvedElements().IsHighOrder()) {
-
-	      int j;
-	      int hoplotn = 1 << vispar.subdivisions; 
-	      // mesh->GetCurvedElements().GetNVisualSubsecs();
-
-	      Point<3> x;
-	      glBegin (GL_LINE_STRIP);
-
-	      for (int j = 0; j <= hoplotn; j++) 
-		{
-		  mesh->GetCurvedElements().CalcSegmentTransformation ((double) j/hoplotn, i-1, x);
-		  glVertex3d (x(0), x(1), x(2));
-		}
-	      
-	      glEnd();
-	      
-	    } else {
-	      
-	      glBegin (GL_LINES);
-	      glVertex3f (p1.X(), p1.Y(), p1.Z());
-	      glVertex3f (p2.X(), p2.Y(), p2.Z());
-	      glEnd();
-
-	    }
-	  }
-
-	glLineWidth (2);
-	glDisable (GL_POLYGON_OFFSET_LINE);
-      }
-
-
-    if (selpoint > 0 && selpoint <= mesh->GetNP())
-      {
-	glPointSize (10);
-	glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, matcolblue);
-	glBegin (GL_POINTS);
-      
-	const Point3d p = mesh->Point(selpoint);
-	glVertex3f (p.X(), p.Y(), p.Z());
-	glEnd();
-      }
-
-
-    glDisable(GL_CLIP_PLANE0);
-
-    glPopMatrix();
-
-    if (vispar.colormeshsize)
-      DrawColorBar (minh, maxh, 1);
-
-    DrawCoordinateCross ();
-    DrawNetgenLogo ();
-
-    if (lock)
-      {
-	lock -> UnLock();
-	delete lock;
-      }
-
-    glFinish();  
-  }
-
-
-  void VisualSceneMesh :: BuildScene (int zoomall)
-  {
-    if (!mesh)
-      {
-	VisualScene::BuildScene (zoomall);
-	return;
-      }
-      
-    int i, j;
-	
-	
-    Point3d pmin, pmax;
-    static double oldrad = 0;
-	
-    ARRAY<Element2d> faces;
-
-    int meshtimestamp = mesh->GetTimeStamp();
-    if (meshtimestamp > vstimestamp || zoomall)
-      {
-	mesh->GetBox (pmin, pmax, SURFACEPOINT);
-	
-
-	if (selpoint >= 1 && zoomall == 2)
-	  center = mesh->Point (selpoint);
-	else if (vispar.use_center_coords && zoomall == 2)
-	  {
-	    center.X() = vispar.centerx; center.Y() = vispar.centery; center.Z() = vispar.centerz;
-	  }
-	else if (vispar.centerpoint >= 1 && zoomall == 2)
-	  center = mesh->Point (vispar.centerpoint);
-	else
-	  center = Center (pmin, pmax);
-	        
-	rad = 0.5 * Dist (pmin, pmax);
-      
-      
-	if (rad > 1.5 * oldrad || 
-	    mesh->GetMajorTimeStamp() > vstimestamp || 
-	    zoomall)
-	  {
-	    CalcTransformationMatrices();
-	    oldrad = rad;
-	  }
-      }
-
-    glEnable (GL_NORMALIZE);
-
-    if (pointnumberlist)
-      {
-	glDeleteLists (pointnumberlist, 1);      
-	pointnumberlist = 0;
-      }
-
-    if (badellist)
-      {
-	glDeleteLists (badellist, 1);
-	badellist = 0;
-      }
-    /*
-      if (prismlist)
-      {
-      glDeleteLists (prismlist, 1);
-      prismlist = 0;
-      }
-
-      if (pyramidlist)
-      {
-      glDeleteLists (pyramidlist, 1);
-      pyramidlist = 0;
-      }
-
-      if (hexlist)
-      {
-      glDeleteLists (hexlist, 1);
-      hexlist = 0;
-      }
-    */
-    if (identifiedlist)
-      {
-	glDeleteLists (identifiedlist, 1);
-	identifiedlist = 0;
-      }
-
-
-    pointnumberlist = glGenLists (1);
-    glNewList (pointnumberlist, GL_COMPILE);
-
-    if (vispar.drawpointnumbers ||
-	vispar.drawedgenumbers ||
-	vispar.drawfacenumbers ||
-	vispar.drawelementnumbers)
-      {
-	glEnable (GL_COLOR_MATERIAL);
-	GLfloat textcol[3] = { 1 - backcolor,
-			       1 - backcolor,
-			       1 - backcolor };
-	glColor3fv (textcol);
-	glNormal3d (0, 0, 1);
-	glPushAttrib (GL_LIST_BIT);
-	glListBase (fontbase);
-      
-	char buf[30];
-
-	if (vispar.drawpointnumbers)
-	  for (i = 1; i <= mesh->GetNP(); i++)
-	    {
-	      const Point3d & p = mesh->Point(i);
-	      glRasterPos3d (p.X(), p.Y(), p.Z());
-
-	      sprintf (buf, "%d", i);
-
-	      glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-	    }
-
-	if (vispar.drawedgenumbers)
-	  {
-	    const MeshTopology & top = mesh->GetTopology();
-	    for (i = 1; i <= top.GetNEdges(); i++)
-	      {
-		int v1, v2;
-		top.GetEdgeVertices (i, v1, v2);
-		const Point3d & p1 = mesh->Point(v1);
-		const Point3d & p2 = mesh->Point(v2);
-		const Point3d p = Center (p1, p2);
-		glRasterPos3d (p.X(), p.Y(), p.Z());
-
-		sprintf (buf, "%d", i);
-
-		glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-	      }
-	  }      
-
-
-	if (vispar.drawfacenumbers)
-	  {
-	    const MeshTopology & top = mesh->GetTopology();
-	    ARRAY<int> v;
-	    for (i = 1; i <= top.GetNFaces(); i++)
-	      {
-		top.GetFaceVertices (i, v);
-		const Point3d & p1 = mesh->Point(v.Elem(1));
-		const Point3d & p2 = mesh->Point(v.Elem(2));
-		const Point3d & p3 = mesh->Point(v.Elem(3));
-		Point3d p;
-		if (v.Elem(4) == 0)
-		  {
-		    p = Center (p1, p2, p3);
-		  }
-		else
-		  {
-		    const Point3d & p4 = mesh->Point(v.Elem(4));
-		    Point3d hp1 = Center (p1, p2);
-		    Point3d hp2 = Center (p3, p4);
-		    p = Center (hp1, hp2);
-		  }
-
-		glRasterPos3d (p.X(), p.Y(), p.Z());
-		sprintf (buf, "%d", i);
-		glCallLists (strlen (buf), GL_UNSIGNED_BYTE, buf);
-	      }
-	  }      
-
-
-	glPopAttrib ();
-	glDisable (GL_COLOR_MATERIAL);
-      }
-    glEndList ();
-
-
-
-
-
-
-
-
-
-
-
-
-
-    badellist = glGenLists (1);
-    glNewList (badellist, GL_COMPILE);
-
-    if (vispar.drawbadels)
-      {
-	//  SetClippingPlane ();
-
-	static float badelcol[] = { 1.0f, 0.0f, 1.0f, 1.0f };
-	glLineWidth (1.0f);
-
-	for (i = 1; i <= mesh->GetNE(); i++)
-	  {
-	    if (mesh->VolumeElement(i).flags.badel || 
-		mesh->VolumeElement(i).flags.illegal || 
-		(i == vispar.drawelement))
-	      {
-		// copy to be thread-safe
-		Element el = mesh->VolumeElement (i);
-		el.GetSurfaceTriangles (faces);
-
-		glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, badelcol);
-
-
-		//	  if ( (el.GetNP() == 4) || (el.GetNP() == 10))
-		if (el.PNum(1))
-		  {
-		    glBegin (GL_TRIANGLES);
-	      
-		    for (j = 1; j <= faces.Size(); j++)
-		      {
-			Element2d & face = faces.Elem(j);
-			const Point3d & lp1 = mesh->Point (el.PNum(face.PNum(1)));
-			const Point3d & lp2 = mesh->Point (el.PNum(face.PNum(2)));
-			const Point3d & lp3 = mesh->Point (el.PNum(face.PNum(3)));
-			Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-			n /= (n.Length()+1e-12);
-			glNormal3d (n.X(), n.Y(), n.Z());
-			glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-			glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-			glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-		      }
-	      
-		    glEnd();
-		  }
-	      }
-	  }
-
-
-
-	for (i = 1; i <= mesh->GetNE(); i++)
-	  {
-	    if (mesh->VolumeElement(i).flags.badel)
-	      {
-		// copy to be thread-safe
-		Element el = mesh->VolumeElement (i);
-		if ( (el.GetNP() == 4) || (el.GetNP() == 10))
-		  {
-		    glBegin (GL_LINES);
-		    glVertex3d (0,0,0);
-		    const Point3d & p = mesh->Point(el.PNum(1));
-		    glVertex3d (p.X(), p.Y(), p.Z());
-		    glEnd();
-		  }
-	      }
-	  }
-  
-
-	for (i = 1; i <= mesh->GetNE(); i++)
-	  {
-	    Element el = mesh->VolumeElement (i);
-	    int hascp = 0;
-	    for (j = 1; j <= el.GetNP(); j++)
-	      if (el.PNum(j) == vispar.centerpoint)
-		hascp = 1;
-
-	    if (hascp)
-	      {
-		(*testout) << "draw el " << i << " : ";
-		for (j = 1; j <= el.GetNP(); j++)
-		  (*testout) << el.PNum(j) << " ";
-		(*testout) << endl;
-
-		if (el.GetNP() == 4)
-		  {
-		    int et[6][2] = 
-		      { { 1, 2 },
-			{ 1, 3 },
-			{ 1, 4 },
-			{ 2, 3 },
-			{ 2, 4 },
-			{ 3, 4 } } ;
-
-		    for (j = 0; j < 6; j++)
-		      {
-			glBegin (GL_LINES);
-			const Point3d & p1 = mesh->Point (el.PNum(et[j][0]));
-			const Point3d & p2 = mesh->Point (el.PNum(et[j][1]));
-			glVertex3d (p1.X(), p1.Y(), p1.Z());
-			glVertex3d (p2.X(), p2.Y(), p2.Z());
-			glEnd ();
-		      }
-		  }
-
-
-		if (el.GetNP() == 10)
-		  {
-		    int et[12][2] = 
-		      { { 1, 5 },
-			{ 2, 5 },
-			{ 1, 6 },
-			{ 3, 6 },
-			{ 1, 7 },
-			{ 4, 7 },
-			{ 2, 8 },
-			{ 3, 8 },
-			{ 2, 9 },
-			{ 4, 9 },
-			{ 3, 10 },
-			{ 4, 10 } };
-
-		    for (j = 0; j < 12; j++)
-		      {
-			glBegin (GL_LINES);
-			const Point3d & p1 = mesh->Point (el.PNum(et[j][0]));
-			const Point3d & p2 = mesh->Point (el.PNum(et[j][1]));
-			glVertex3d (p1.X(), p1.Y(), p1.Z());
-			glVertex3d (p2.X(), p2.Y(), p2.Z());
-			glEnd ();
-		      }
-		  }
-	      }
-	  }
-
-
-	for (i = 1; i <= mesh->GetNSE(); i++)
-	  {
-	    Element2d el = mesh->SurfaceElement(i);
-	    if (!el.BadElement())
-	      continue;
-
-	    int drawel = 1;
-	    for (j = 1; j <= el.GetNP(); j++)
-	      if (!el.PNum(j))
-		drawel = 0;
-
-	    if (!drawel)
-	      continue;
-
-	    cout << int (el.GetType()) << " " << flush;
-	    switch (el.GetType())
-	      {
-	      case TRIG:
-		{
-		  glBegin (GL_TRIANGLES);
-	    
-		  Point3d & lp1 = mesh->Point (el.PNum(1));
-		  Point3d & lp2 = mesh->Point (el.PNum(2));
-		  Point3d & lp3 = mesh->Point (el.PNum(3));
-		  Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-		  n /= (n.Length() + 1e-12);
-		  glNormal3dv (&n.X());
-		  glVertex3dv (&lp1.X());
-		  glVertex3dv (&lp2.X());
-		  glVertex3dv (&lp3.X());
-		  glEnd();
-		  break;
-		}
-	      case QUAD:
-		{
-		  glBegin (GL_QUADS);
-	    
-		  const Point3d & lp1 = mesh->Point (el.PNum(1));
-		  const Point3d & lp2 = mesh->Point (el.PNum(2));
-		  const Point3d & lp3 = mesh->Point (el.PNum(4));
-		  const Point3d & lp4 = mesh->Point (el.PNum(3));
-		  Vec3d n = Cross (Vec3d (lp1, lp2), 
-				   Vec3d (lp1, Center (lp3, lp4)));
-		  n /= (n.Length() + 1e-12);
-		  glNormal3d (n.X(), n.Y(), n.Z());
-		  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		  glVertex3d (lp4.X(), lp4.Y(), lp4.Z());
-		  glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-		  glEnd();
-		  break;
-		}
-	      case TRIG6:
-		{
-		  int lines[6][2] = {
-		    { 1, 6 }, { 2, 6 },
-		    { 1, 5 }, { 3, 5 },
-		    { 2, 4 }, { 3, 4 } };
-	      
-		  glBegin (GL_LINES);
-		  for (j = 0; j < 6; j++)
-		    {
-		      glVertex3dv (&mesh->Point (el.PNum(lines[j][0])).X());
-		      glVertex3dv (&mesh->Point (el.PNum(lines[j][0])).X());
-		    }
-		  glEnd();
-		  break;
-		}
-
-	      case QUAD6:
-		{
-		  int lines[6][2] = {
-		    { 1, 5 }, { 2, 5 },
-		    { 3, 6 }, { 4, 6 },
-		    { 1, 4 }, { 2, 3 } };
-	      
-		  glBegin (GL_LINES);
-	    
-		  for (j = 0; j < 6; j++)
-		    {
-		      const Point3d & lp1 = mesh->Point (el.PNum(lines[j][0]));
-		      const Point3d & lp2 = mesh->Point (el.PNum(lines[j][1]));
-		
-		      glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		      glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		    }
-		  glEnd ();
-		  break;
-		}
-	      default:
-		PrintSysError ("Cannot draw surface element of type ", 
-			       int(el.GetType()));
-	      }
-	  }
-	glLoadName (0);  
-
-      }
-    glEndList ();
-  
-
-
-  
-
-    if (1)
-      {
-      
-	identifiedlist = glGenLists (1);
-	glNewList (identifiedlist, GL_COMPILE);
-  
-	GLfloat identifiedcol[] = { 1, 0, 1, 1 };
-  
-	glLineWidth (3);
-      
-
-	//  for (i = 1; i <= mesh->GetNSeg(); i++)
-	INDEX_2_HASHTABLE<int> & idpts = 
-	  mesh->GetIdentifications().GetIdentifiedPoints();
-	if (&idpts)
-	  for (i = 1; i <= idpts.GetNBags(); i++)
-	    for (j = 1; j <= idpts.GetBagSize(i); j++)
-	      {
-		INDEX_2 pts;
-		int val;
-
-		idpts.GetData (i, j, pts, val);
-		const Point3d & p1 = mesh->Point(pts.I1());
-		const Point3d & p2 = mesh->Point(pts.I2());
-      
-		glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
-			      identifiedcol);
-
-		glBegin (GL_LINES);
-		glVertex3f (p1.X(), p1.Y(), p1.Z());
-		glVertex3f (p2.X(), p2.Y(), p2.Z());
-		glEnd(); 
-	      }
-
-	glEndList ();
-      }
-
-    vstimestamp = meshtimestamp;
-  }
-
-
-
-
-  void VisualSceneMesh :: BuildFilledList()
-  {
-    // clock_t starttime, endtime;
-    // starttime = clock();
-
-    if (!lock)
-      {
-	lock = new NgLock (mesh->Mutex());
-	lock -> Lock();
-      }
-
-    filledtimestamp = NextTimeStamp();
-
-    if (filledlist)
-      glDeleteLists (filledlist, 1);
-
-    filledlist = glGenLists (1);
-    glNewList (filledlist, GL_COMPILE);
-
-
-    bool checkvicinity = (stlgeometry != NULL) && stldoctor.showvicinity;
-
-    glEnable (GL_NORMALIZE);
-      
-    glLineWidth (1.0f);
-  
-    Vector locms;
-
-    if (vispar.colormeshsize)
-      {
-	glEnable (GL_COLOR_MATERIAL);
-	locms.SetSize (mesh->GetNP());
-	double maxh = -1;
-	double minh = 1e99;
-	for (int i = 1; i <= locms.Size(); i++)
-	  {
-	    Point3d p = mesh->Point(i);
-	    locms.Elem(i) = mesh->GetH (p);
-	    if (locms.Elem(i) > maxh) maxh = locms.Elem(i);
-	    if (locms.Elem(i) < minh) minh = locms.Elem(i);
-	  }
-	if (!locms.Size())
-	  { minh = 1; maxh = 10; }
-      }
-    else
-      glDisable (GL_COLOR_MATERIAL);
-
-
-    GLfloat matcol[] = { 0, 1, 0, 1 };
-    GLfloat matcolsel[] = { 1, 0, 0, 1 };
-
-    CurvedElements & curv = mesh->GetCurvedElements();
-    int hoplotn = 1 << vispar.subdivisions; 
-
-	
-    for (int col = 1; col <= 2; col++)
-      {
-	if (col == 2)
-	  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcolsel);
-	else
-	  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcol);
-
-
-	for (SurfaceElementIndex sei = 0; sei < mesh->GetNSE(); sei++)
-	  {
-	    const Element2d & el = (*mesh)[sei];
-	    
-	    bool drawel = !el.IsDeleted();
-
-	    if (checkvicinity)
-	      for (int j = 0; j < el.GetNP(); j++)
-		if (!stlgeometry->Vicinity(el.GeomInfoPi(j+1).trignum))
-		  drawel = 0;
-
-	    if (!drawel)
-	      continue;
-
-	    if (vispar.colormeshsize && col == 2)
-	      continue;
-	    if (!vispar.colormeshsize &&
-		(col == 2) != (el.GetIndex() == selface))
-	      continue;
-
-	    glLoadName (sei+1);
-
-	    switch (el.GetType())
-	      {
-	      case TRIG:
-		{
-		  if (curv.IsHighOrder() && curv.IsSurfaceElementCurved(sei))
-		    {
-		      Point<2> xr[3];
-		      Point<3> xg;
-		      Vec<3> dx, dy, n;
-
-		      glBegin (GL_TRIANGLES);
-
-		      for (int i = 0; i < hoplotn; i++)
-			for (int j = 0; j < hoplotn-i; j++)
-			  for (int k = 0; k < 2; k++)
-			    {
-			      if (k == 0)
-				{
-				  xr[0](0) = (double)    i/hoplotn; xr[0](1) = (double)    j/hoplotn;
-				  xr[1](0) = (double)(i+1)/hoplotn; xr[1](1) = (double)    j/hoplotn;
-				  xr[2](0) = (double)    i/hoplotn; xr[2](1) = (double)(j+1)/hoplotn;
-				} 
-			      else
-				{
-				  if (j == hoplotn-i-1) continue;
-				  xr[0](0) = (double)(i+1)/hoplotn; xr[0](1) = (double)    j/hoplotn;
-				  xr[1](0) = (double)(i+1)/hoplotn; xr[1](1) = (double)(j+1)/hoplotn;
-				  xr[2](0) = (double)    i/hoplotn; xr[2](1) = (double)(j+1)/hoplotn;
-				};
-			      
-			      for (int l=0; l<3; l++)
-				{
-				  Mat<3,2> dxdxi;
-
-				  curv.CalcSurfaceTransformation (xr[l], sei, xg, dxdxi);
-				  for (int i = 0; i < 3; i++)
-				    {
-				      dx(i) = dxdxi(i,0);
-				      dy(i) = dxdxi(i,1);
-				    }
-				  n = Cross (dx, dy);
-				  n.Normalize();
-				  glNormal3d (n(0), n(1), n(2));
-				  glVertex3d (xg(0), xg(1), xg(2));
-				}
-			    }
-		      
-		      glEnd();
-		    } 
-		  else // not high order
-		    {
-		      glBegin (GL_TRIANGLES);
-		      
-		      const Point<3> & lp0 = (*mesh) [el[0]];
-		      const Point<3> & lp1 = (*mesh) [el[1]];
-		      const Point<3> & lp2 = (*mesh) [el[2]];
-		      
-		      Vec<3> n = Cross (lp1-lp0, lp2-lp0);
-		      glNormal3dv (n);
-
-		      if (vispar.colormeshsize)
-			{
-			  SetOpenGlColor  (locms.Get(el[0]), minh, maxh, 1);
-			  glVertex3dv (lp0);
-			  SetOpenGlColor  (locms.Get(el[1]), minh, maxh, 1);
-			  glVertex3dv (lp1);
-			  SetOpenGlColor  (locms.Get(el[2]), minh, maxh, 1);
-			  glVertex3dv (lp2);
-			}
-		      else
-			{
-			  glVertex3dv (lp0);
-			  glVertex3dv (lp1);
-			  glVertex3dv (lp2);
-			}
-
-		      glEnd();
-		    }
-		  
-		  break;
-		}
-	      case QUAD:
-		{
-		  // cout << "BuildFilledList: QUAD" << endl;
-		  // CurvedElements & curv = mesh->GetCurvedElements();
-		  if (curv.IsHighOrder() && curv.IsSurfaceElementCurved(sei))
-		    {
-		      Point<2> xr[4];
-		      Point<3> xg;
-		      Vec<3> dx, dy, n;
-
-		      glBegin (GL_QUADS);
-
-		      for (int i = 0; i < hoplotn; i++)
-			for (int j = 0; j < hoplotn; j++)
-			  {
-			    xr[0](0) = (double)    i/hoplotn; xr[0](1) = (double)    j/hoplotn;
-			    xr[1](0) = (double)(i+1)/hoplotn; xr[1](1) = (double)    j/hoplotn;
-			    xr[2](0) = (double)(i+1)/hoplotn; xr[2](1) = (double)(j+1)/hoplotn;
-			    xr[3](0) = (double)    i/hoplotn; xr[3](1) = (double)(j+1)/hoplotn;
-
-			    for (int l=0; l<4; l++)
-			      {
-				Mat<3,2> dxdxi;
-
-				curv.CalcSurfaceTransformation (xr[l], sei, xg, dxdxi);
-				for (int i = 0; i < 3; i++)
-				  {
-				    dx(i) = dxdxi(i,0);
-				    dy(i) = dxdxi(i,1);
-				  }
-
-				n = Cross (dx, dy);
-				n.Normalize();
-				glNormal3d (n(0), n(1), n(2));
-				glVertex3d (xg(0), xg(1), xg(2));
-			      }
-
-			  }
-                    
-		      glEnd();
-		    } 
-
-		  else // not high order
-
-		    {
-		      glBegin (GL_QUADS);
-		      
-		      const Point<3> & lp1 = mesh->Point (el.PNum(1));
-		      const Point<3> & lp2 = mesh->Point (el.PNum(2));
-		      const Point<3> & lp3 = mesh->Point (el.PNum(4));
-		      const Point<3> & lp4 = mesh->Point (el.PNum(3));
-
-		      Vec<3> n = Cross (lp2-lp1,  Center (lp3, lp4)-lp1);
-		      glNormal3dv (n);
-
-		      glVertex3dv (lp1);
-		      glVertex3dv (lp2);
-		      glVertex3dv (lp4);
-		      glVertex3dv (lp3);
-		      
-		      glEnd ();
-		    }
-		  break;
-		}
-
-	      case TRIG6:
-		{
-		  glBegin (GL_TRIANGLES);
-
-		  static int trigs[4][3] = {
-		    { 1, 6, 5 },
-		    { 2, 4, 6 },
-		    { 3, 5, 4 },
-		    { 4, 5, 6 } };
-		
-		  for (int j = 0; j < 4; j++)
-		    {
-		      Point3d & lp1 = mesh->Point (el.PNum(trigs[j][0]));
-		      Point3d & lp2 = mesh->Point (el.PNum(trigs[j][1]));
-		      Point3d & lp3 = mesh->Point (el.PNum(trigs[j][2]));
-		      Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-		      glNormal3dv (&n.X());
-
-		      glVertex3dv (&lp1.X());
-		      glVertex3dv (&lp2.X());
-		      glVertex3dv (&lp3.X());
-		    }
-		  glEnd();
-		  break;
-		}
-
-	      case QUAD6:
-		{
-		  glBegin (GL_QUADS);
-		  static int quads[2][4] = {
-		    { 1, 5, 6, 4 },
-		    { 5, 2, 3, 6 } };
-		
-		  for (int j = 0; j < 2; j++)
-		    {
-		      Point3d & lp1 = mesh->Point (el.PNum(quads[j][0]));
-		      Point3d & lp2 = mesh->Point (el.PNum(quads[j][1]));
-		      Point3d & lp3 = mesh->Point (el.PNum(quads[j][2]));
-		      Point3d & lp4 = mesh->Point (el.PNum(quads[j][3]));
-		      Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-		      n /= (n.Length() + 1e-12);
-		      glNormal3dv (&n.X());
-		      glVertex3dv (&lp1.X());
-		      glVertex3dv (&lp2.X());
-		      glVertex3dv (&lp3.X());
-		      glVertex3dv (&lp4.X());
-		    }
-		  glEnd();
-		  break;
-		}
-
-	      case QUAD8:
-		{
-		  glBegin (GL_TRIANGLES);
-		  static int boundary[] = 
-		    { 1, 5, 2, 8, 3, 6, 4, 7, 1 };
-		
-		  Point3d c(0,0,0);
-		  for (int j = 0; j < 4; j++)
-		    {
-		      Point3d & hp = mesh->Point (el[j]);
-		      c.X() -= 0.25 * hp.X();
-		      c.Y() -= 0.25 * hp.Y();
-		      c.Z() -= 0.25 * hp.Z();
-		    }
-		  for (int j = 4; j < 8; j++)
-		    {
-		      Point3d & hp = mesh->Point (el[j]);
-		      c.X() += 0.5 * hp.X();
-		      c.Y() += 0.5 * hp.Y();
-		      c.Z() += 0.5 * hp.Z();
-		    }
-
-		  for (int j = 0; j < 8; j++)
-		    {
-		      Point3d & lp1 = mesh->Point (el.PNum(boundary[j]));
-		      Point3d & lp2 = mesh->Point (el.PNum(boundary[j+1]));
-
-		      Vec3d n = Cross (Vec3d (c, lp1), Vec3d (c, lp2));
-		      n /= (n.Length() + 1e-12);
-		      glNormal3dv (&n.X());
-		      glVertex3dv (&lp1.X());
-		      glVertex3dv (&lp2.X());
-		      glVertex3dv (&c.X());
-		    }
-		  glEnd();
-		  break;
-		}
-
-
-	      default:
-		PrintSysError ("Cannot draw (2) surface element of type ", 
-			       int(el.GetType()));
-	      }
-	  }
-      }
-    glLoadName (0);
-    glEndList ();
-
-    // endtime = clock();
-    // cout << "BuildFillList time = " << double(endtime - starttime)/CLOCKS_PER_SEC << endl;
-  }
-
-
-  void VisualSceneMesh :: BuildLineList()
-  {
-    SurfaceElementIndex sei;
-
-    if (!lock)
-      {
-	lock = new NgLock (mesh->Mutex());
-	lock -> Lock();
-      }
-
-    linetimestamp = NextTimeStamp();
-
-
-    bool checkvicinity = (stlgeometry != NULL) && stldoctor.showvicinity;
-
-    if (linelist)
-      glDeleteLists (linelist, 1);
-  
-    linelist = glGenLists (1);
-    glNewList (linelist, GL_COMPILE);
-
-
-    glLineWidth (1.0f);
-
-    int hoplotn = 1 << vispar.subdivisions; 
-  
-    for (sei = 0; sei < mesh->GetNSE(); sei++)
-      {
-	const Element2d & el = (*mesh)[sei];
-      
-	bool drawel = !el.IsDeleted();
-	if (checkvicinity)
-	  for (int j = 0; j < el.GetNP(); j++)
-	    if (!stlgeometry->Vicinity(el.GeomInfoPi(j+1).trignum))
-	      drawel = 0;
-
-	if (!drawel)
-	  continue;
-
-	switch (el.GetType())
-	  {
-	  case TRIG:
-	    {
-	      CurvedElements & curv = mesh->GetCurvedElements();
-	      if (curv.IsHighOrder() && curv.IsSurfaceElementCurved(sei))
-		{
-		  Point<3> xg;
-		  glBegin (GL_LINE_LOOP);
-
-		  for (int i = 0; i < hoplotn; i++)
-		    {
-		      Point<2> xr (double(i) / hoplotn, 0);
-		      curv.CalcSurfaceTransformation (xr, sei, xg);
-		      glVertex3dv (xg);
-		    }
-		  for (int i = 0; i < hoplotn; i++)
-		    {
-		      Point<2> xr (double(hoplotn-i) / hoplotn, double(i)/hoplotn);
-		      curv.CalcSurfaceTransformation (xr, sei, xg);
-		      glVertex3dv (xg);
-		    }
-		  for (int i = 0; i < hoplotn; i++)
-		    {
-		      Point<2> xr (0, double(hoplotn-i) / hoplotn);
-		      curv.CalcSurfaceTransformation (xr, sei, xg);
-		      glVertex3dv (xg);
-		    }
-
-		  glEnd();
-		} 
-	      else 
-		{
-		  glBegin (GL_TRIANGLES);
-
-		  const Point<3> & lp0 = (*mesh) [el[0]];
-		  const Point<3> & lp1 = (*mesh) [el[1]];
-		  const Point<3> & lp2 = (*mesh) [el[2]];
-
-		  glVertex3dv (lp0);
-		  glVertex3dv (lp1);
-		  glVertex3dv (lp2);
-
-		  glEnd();
-		}
-
-	      break;
-
-	    }     
- 
-	  case QUAD:
-	    {
-	      CurvedElements & curv = mesh->GetCurvedElements();
-	      if (curv.IsHighOrder() && curv.IsSurfaceElementCurved(sei))
-		{
-		  Point<2> xr;
-		  Point<3> xg;
-
-		  glBegin (GL_LINE_STRIP);
-
-		  for (int side = 0; side < 4; side++)
-		    {
-		      for (int i = 0; i <= hoplotn; i++)
-			{
-			  switch (side)
-			    {
-			    case 0:
-			      xr(0) = (double) i/hoplotn;
-			      xr(1) = 0.;
-			      break;
-			    case 1:
-			      xr(0) = 1.;
-			      xr(1) = (double) i/hoplotn;
-			      break;
-			    case 2:
-			      xr(0) = (double) (hoplotn-i)/hoplotn;
-			      xr(1) = 1.;
-			      break;
-			    case 3:
-			      xr(0) = 0.;
-			      xr(1) = (double) (hoplotn-i)/hoplotn;
-			      break;
-			    }
-
-			  curv.CalcSurfaceTransformation (xr, sei, xg);
-			  glVertex3d (xg(0), xg(1), xg(2));
-
-			}
-
-		    }
-		  glEnd();
-
-		} else {
-
-		  glBegin (GL_QUADS);
-
-		  const Point3d & lp1 = mesh->Point (el.PNum(1));
-		  const Point3d & lp2 = mesh->Point (el.PNum(2));
-		  const Point3d & lp3 = mesh->Point (el.PNum(4));
-		  const Point3d & lp4 = mesh->Point (el.PNum(3));
-		  Vec3d n = Cross (Vec3d (lp1, lp2),
-				   Vec3d (lp1, Center (lp3, lp4)));
-		  glNormal3d (n.X(), n.Y(), n.Z());
-		  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		  glVertex3d (lp4.X(), lp4.Y(), lp4.Z());
-		  glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-		  glEnd();
-
-		}
-	    
-	      break;
-	    
-	    }
-	    
-	  case TRIG6:
-	    {
-	      int lines[6][2] = {
-		{ 1, 6 }, { 2, 6 },
-		{ 1, 5 }, { 3, 5 },
-		{ 2, 4 }, { 3, 4 } };
-	    
-	      glBegin (GL_LINES);
-	      for (int j = 0; j < 6; j++)
-		{
-		  const Point3d & lp1 = mesh->Point (el.PNum(lines[j][0]));
-		  const Point3d & lp2 = mesh->Point (el.PNum(lines[j][1]));
-		
-		  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		}
-	    
-	      glEnd();
-	      break;
-	    }
-	  
-	  case QUAD6:
-	    {
-	      int lines[6][2] = {
-		{ 1, 5 }, { 2, 5 },
-		{ 3, 6 }, { 4, 6 },
-		{ 1, 4 }, { 2, 3 } };
-	    
-	      glBegin (GL_LINES);
-	    
-	      for (int j = 0; j < 6; j++)
-		{
-		  const Point3d & lp1 = mesh->Point (el.PNum(lines[j][0]));
-		  const Point3d & lp2 = mesh->Point (el.PNum(lines[j][1]));
-		
-		  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		}
-	      glEnd ();
-	      break;
-	    }
-
-	  case QUAD8:
-	    {
-	      int lines[8][2] = {
-		{ 1, 5 }, { 2, 5 }, { 3, 6 }, { 4, 6 },
-		{ 1, 7 }, { 4, 7 }, { 2, 8 }, { 3, 8 }
-	      };
-	    
-	      glBegin (GL_LINES);
-	    
-	      for (int j = 0; j < 8; j++)
-		{
-		  const Point3d & lp1 = mesh->Point (el.PNum(lines[j][0]));
-		  const Point3d & lp2 = mesh->Point (el.PNum(lines[j][1]));
-		
-		  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		}
-	      glEnd ();
-	      break;
-	    }
-
-
-
-	  default:
-	    PrintSysError ("Cannot draw (4) surface element of type ", 
-			   int(el.GetType()));
-	  }
-      }
-    
-    glEndList ();
-  }
-
-  void VisualSceneMesh :: BuildPointNumberList()
-  {
-    ;
-  }
-
-
-
-
-
-
-  inline long int Fact (int n)
-  {
-    long int res = 1;
-    for (int i = 2; i <= n; i++)
-      res *= i;
-    return res;
-  }
-  inline int Binom (int n, int i)
-  {
-    return Fact(n) / Fact(i) / Fact(n-i);
-  }
-  
-  void ToBernstein (int order, Point<3> * pts, int stride)
-  {
-    static DenseMatrix mat, inv;
-    static Vector vec1, vec2;
-
-    if (mat.Height () != order+1)
-      {
-	mat.SetSize (order+1);
-	inv.SetSize (order+1);
-	vec1.SetSize (order+1);
-	vec2.SetSize (order+1);
-	for (int i = 0; i <= order; i++)
-	  {
-	    double x = double(i) / order;
-	    for (int j = 0; j <= order; j++)
-	      mat(i,j) = Binom (order, j) * pow (x, j) * pow (1-x, order-j);
-	  }
-
-	CalcInverse (mat, inv);
-      }
-
-    for (int i = 0; i < 3; i++)
-      {
-	for (int j = 0; j <= order; j++)
-	  vec1(j) = pts[j*stride](i);
-
-	inv.Mult (vec1, vec2);
-
-	for (int j = 0; j <= order; j++)
-	  pts[j*stride](i) = vec2(j);
-      }
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  void VisualSceneMesh :: BuildTetList()
-  {
-
-
-#ifdef FAST3DELEMENTS
-    
-
-    cout << "start fast test" << endl;
-
-    int i, j;
-    ARRAY<Element2d> faces;
-
-    if (tettimestamp > mesh->GetTimeStamp () &&
-	tettimestamp > vispar.clipplanetimestamp )
-      return;
-
-    if (!lock)
-      {
-	lock = new NgLock (mesh->Mutex());
-	lock -> Lock();
-      }
-
-    tettimestamp = NextTimeStamp();
-
-    if (tetlist)
-      glDeleteLists (tetlist, 1);
-
-
-    tetlist = glGenLists (1);
-    glNewList (tetlist, GL_COMPILE);
-
-  
-    BitArray shownode(mesh->GetNP());
-    if (vispar.clipenable)
-      {
-	shownode.Clear();
-	for (i = 1; i <= shownode.Size(); i++)
-	  {
-	    Point3d p = mesh->Point(i);
-	  
-	    double val =
-	      p.X() * clipplane[0] +
-	      p.Y() * clipplane[1] +
-	      p.Z() * clipplane[2] +
-	      clipplane[3];
-	  
-	    if (val > 0)
-	      shownode.Set (i);
-	  }
-      }
-    else
-      shownode.Set();
-
-
-    static float tetcols[][4] = 
-      {
-	{ 1.0f, 1.0f, 0.0f, 1.0f },
-	{ 1.0f, 0.0f, 0.0f, 1.0f },
-	{ 0.0f, 1.0f, 0.0f, 1.0f },
-	{ 0.0f, 0.0f, 1.0f, 1.0f }
-      };
-
-
-    ARRAY<int> elfaces;
-
-    const MeshTopology & top = mesh->GetTopology();
-    CurvedElements & curv = mesh->GetCurvedElements();
-
-    ARRAY<int> displayface(top.GetNFaces());
-    for (i = 0; i < top.GetNFaces(); i++)
-      displayface[i] = -1;
-    
-
-    for (i = 1; i <= mesh->GetNE(); i++)
-      {
-	if (vispar.drawtetsdomain > 0 &&
-	    vispar.drawtetsdomain != mesh->VolumeElement(i).GetIndex())
-	  continue;
-
-	Element el = (*mesh)[(ElementIndex) (i-1)];
-
-	if (el.GetType() == TET)
-	  {
-	    if (el.PNum(1))
-	      {
-		bool drawtet = 1;
-		for (j = 1; j <= el.GetNP(); j++)
-		  if (!shownode.Test(el.PNum(j)))
-		    drawtet = 0;
-		if (!drawtet) continue;
-		
-		{
-		  top.GetElementFaces (i, elfaces);
-		  
-		  for (j = 0; j < 4; j++)
-		    displayface[elfaces[j]-1] *= -1;
-		}
-	      }
-	  }
-      }
-
-    
-    for (i = 1; i <= mesh->GetNE(); i++)
-      {
-	if (vispar.drawtetsdomain > 0 &&
-	    vispar.drawtetsdomain != mesh->VolumeElement(i).GetIndex())
-	  continue;
-
-	if (mesh->VolumeElement(i).GetType() == TET)
-	  {
-	    // copy to be thread-safe
-	    Element el = mesh->VolumeElement (i);
-	    el.GetSurfaceTriangles (faces);
-
-	    if (el.PNum(1))
-	      {
-		bool drawtet = 1;
-		for (j = 1; j <= el.GetNP(); j++)
-		  if (!shownode.Test(el.PNum(j)))
-		    drawtet = 0;
-		if (!drawtet) continue;
-
-		int ind = el.GetIndex() % 4;
-		if (vispar.drawmetispartition && (el.GetPartition()!=-1))
-		  ind = el.GetPartition() % 4;
-		(*testout) << "ind = " << ind << endl;
-		glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, tetcols[ind]);
-
-
-		top.GetElementFaces (i, elfaces);
-
-		glBegin (GL_TRIANGLES);
-
-		for (j = 0; j < faces.Size(); j++)
-		  {
-		    if (displayface[elfaces[j]-1] == -1) continue;
-
-		    Element2d & face = faces.Elem(j+1);
-
-		    if (curv.IsHighOrder() && curv.IsElementCurved(i-1))
-		      {
-			int hoplotn = 1 << vispar.subdivisions; 
-			// int hoplotn = curv.GetNVisualSubsecs();
-			    
-			const Point3d * facepoint = MeshTopology :: GetVertices (TET);
-			const ELEMENT_FACE * elface = MeshTopology :: GetFaces(TET);
-                    
-			Vec<3> x0,x1,d0,d1;
-			Point<3> xg;
-			x0 = facepoint[face.PNum(3)-1] - facepoint[face.PNum(1)-1];
-			x1 = facepoint[face.PNum(2)-1] - facepoint[face.PNum(1)-1];
-			x0.Normalize();
-			x1.Normalize();
-
-			for (int m0 = 0; m0 < hoplotn; m0++)
-			  for (int m1 = 0; m1 < hoplotn-m0; m1++)
-			    for (int k = 0; k < 2; k++)
-			      {
-				Vec<3> dx, dy, dz, n;
-				Point<4> la[3];
-				int l;
-				for (l = 0; l<3; l++) la[l] = Point<4>(0.,0.,0.,0.);
-
-				if (k == 0)
-				  {
-				    la[0](face.PNum(1)-1) = (m0  )/(double)hoplotn;
-				    la[0](face.PNum(2)-1) = (m1  )/(double)hoplotn;
-				    la[0](face.PNum(3)-1) = 1-la[0](face.PNum(1)-1)-la[0](face.PNum(2)-1);
-
-				    la[1](face.PNum(1)-1) = (m0+1)/(double)hoplotn;
-				    la[1](face.PNum(2)-1) = (m1  )/(double)hoplotn;
-				    la[1](face.PNum(3)-1) = 1-la[1](face.PNum(1)-1)-la[1](face.PNum(2)-1);
-
-				    la[2](face.PNum(1)-1) = (m0  )/(double)hoplotn;
-				    la[2](face.PNum(2)-1) = (m1+1)/(double)hoplotn;
-				    la[2](face.PNum(3)-1) = 1-la[2](face.PNum(1)-1)-la[2](face.PNum(2)-1);
-				  } else
-				    {
-				      if (m1 == hoplotn-m0-1) continue;
-				      la[0](face.PNum(1)-1) = (m0+1)/(double)hoplotn;
-				      la[0](face.PNum(2)-1) = (m1+1)/(double)hoplotn;
-				      la[0](face.PNum(3)-1) = 1-la[0](face.PNum(1)-1)-la[0](face.PNum(2)-1);
-
-				      la[1](face.PNum(1)-1) = (m0  )/(double)hoplotn;
-				      la[1](face.PNum(2)-1) = (m1+1)/(double)hoplotn;
-				      la[1](face.PNum(3)-1) = 1-la[1](face.PNum(1)-1)-la[1](face.PNum(2)-1);
-
-				      la[2](face.PNum(1)-1) = (m0+1)/(double)hoplotn;
-				      la[2](face.PNum(2)-1) = (m1  )/(double)hoplotn;
-				      la[2](face.PNum(3)-1) = 1-la[2](face.PNum(1)-1)-la[2](face.PNum(2)-1);
-				    }
-
-				for (l = 0; l<3; l++)
-				  {
-				    Mat<3,3> dxdxi;
-				    Point<3> xr( la[l](0), la[l](1), la[l](2) );
-				    curv.CalcElementTransformation (xr, i-1, xg, dxdxi);
-				    for (int i = 0; i < 3; i++)
-				      {
-					dx(i) = dxdxi(i,0);
-					dy(i) = dxdxi(i,1);
-					dz(i) = dxdxi(i,2);
-				      }
-
-				    d0 = x0(0)*dx + x0(1)*dy + x0(2)*dz;
-				    d1 = x1(0)*dx + x1(1)*dy + x1(2)*dz;
-				    n = Cross (d0, d1);
-				    glNormal3d ( n(0),  n(1),  n(2));
-				    glVertex3d (xg(0), xg(1), xg(2));
-				  }
-			      }
-
-		      } else {
-			const Point3d & lp1 = mesh->Point (el.PNum(face.PNum(1)));
-			const Point3d & lp2 = mesh->Point (el.PNum(face.PNum(2)));
-			const Point3d & lp3 = mesh->Point (el.PNum(face.PNum(3)));
-			Vec3d n = Cross (Vec3d (lp1, lp3), Vec3d (lp1, lp2));
-			n /= (n.Length()+1e-12);
-			glNormal3d (n.X(), n.Y(), n.Z());
-			glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-			glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-			glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-		      }
-		  }
-	     
-		glEnd();
-	      }
-
-	  }
-      }
-    glEndList ();
-
-
-
-
-#else
-
-    if (tettimestamp > mesh->GetTimeStamp () &&
-	tettimestamp > vispar.clipplanetimestamp )
-      return;
-
-    if (!lock)
-      {
-	lock = new NgLock (mesh->Mutex());
-	lock -> Lock();
-      }
-
-    tettimestamp = NextTimeStamp();
-
-    if (tetlist)
-      glDeleteLists (tetlist, 1);
-
-
-    tetlist = glGenLists (1);
-    glNewList (tetlist, GL_COMPILE);
-
-
-
-    int i, j, k, l;
-    ARRAY<Element2d> faces;
-
-  
-    BitArray shownode(mesh->GetNP());
-    if (vispar.clipenable)
-      {
-	shownode.Clear();
-	for (i = 1; i <= shownode.Size(); i++)
-	  {
-	    Point3d p = mesh->Point(i);
-	  
-	    double val =
-	      p.X() * clipplane[0] +
-	      p.Y() * clipplane[1] +
-	      p.Z() * clipplane[2] +
-	      clipplane[3];
-	  
-	    if (val > 0)
-	      shownode.Set (i);
-	  }
-      }
-    else
-      shownode.Set();
-
-
-    static float tetcols[][4] = 
-      {
-	{ 1.0f, 1.0f, 0.0f, 1.0f },
-	{ 1.0f, 0.0f, 0.0f, 1.0f },
-	{ 0.0f, 1.0f, 0.0f, 1.0f },
-	{ 0.0f, 0.0f, 1.0f, 1.0f }
-      };
-
-
-    CurvedElements & curv = mesh->GetCurvedElements();
-
-    for (ElementIndex ei = 0; ei < mesh->GetNE(); ei++)
-      {
-	i = ei + 1;
-
-	if (vispar.drawtetsdomain > 0 &&
-	    vispar.drawtetsdomain != mesh->VolumeElement(i).GetIndex())
-	  continue;
-
-	const Element & el = (*mesh)[ei];
-
-	if (el.GetType() == TET && !el.IsDeleted())
-	  {
-
-	    bool drawtet = 1;
-	    for (j = 0; j < 4; j++)
-	      if (!shownode.Test(el[j]))
-		drawtet = 0;
-	    if (!drawtet) continue;
-	    
-	    
-	    int ind = el.GetIndex() % 4;
-	    if (vispar.drawmetispartition && (el.GetPartition()!=-1))
-	      ind = el.GetPartition() % 4;
-	    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, tetcols[ind]);
-	    
-	    
-	    if (curv.IsHighOrder() && curv.IsElementCurved(ei))
-	      {
-		const ELEMENT_FACE * faces = MeshTopology :: GetFaces (TET);
-		const Point3d * vertices = MeshTopology :: GetVertices (TET);
-		
-		Point<3> grid[11][11];
-		Point<3> fpts[3];
-		int order = vispar.subdivisions+1;
-		
-		for (int trig = 0; trig < 4; trig++)
-		  {   
-		    for (int j = 0; j < 3; j++)
-		      fpts[j] = vertices[faces[trig][j]-1];
-		    
-		    static Point<3> c(0.25, 0.25, 0.25);
-		    if (vispar.shrink < 1)
-		      for (int j = 0; j < 3; j++)
-			fpts[j] += (1-vispar.shrink) * (c-fpts[j]);
-			
-		    for (int ix = 0; ix <= order; ix++)
-		      for (int iy = 0; iy <= order; iy++)
-			{
-			  double lami[3] = 
-			    { (1-double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (1-double(iy)/order),
-			      double(iy)/order };
-			      
-			  Point<3> xl;
-			  for (int l = 0; l < 3; l++)
-			    xl(l) = lami[0] * fpts[0](l) + lami[1] * fpts[1](l) +
-			      lami[2] * fpts[2](l);
-			      
-			  curv.CalcElementTransformation (xl, i-1, grid[ix][iy]);
-			}
-			
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[j][0], &grid[0][1]-&grid[0][0]);
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[0][j], &grid[1][0]-&grid[0][0]);
-			
-		    glMap2d(GL_MAP2_VERTEX_3, 
-			    0.0, 1.0, &grid[0][1](0)-&grid[0][0](0), order+1,
-			    0.0, 1.0, &grid[1][0](0)-&grid[0][0](0), order+1,
-			    &grid[0][0](0));
-		    glEnable(GL_MAP2_VERTEX_3);
-		    glEnable(GL_AUTO_NORMAL); 
-			
-		    glMapGrid2f(8, 0.0, 0.999, 8, 0.0, 1.0);
-		    glEvalMesh2(GL_FILL, 0, 8, 0, 8);
-			
-		    glDisable (GL_AUTO_NORMAL);
-		    glDisable (GL_MAP2_VERTEX_3);
-		  }		    
-	      }
-
-
-	    else
-
-	      {
-		el.GetSurfaceTriangles (faces);
-
-		Point3d c;
-		if (vispar.shrink < 1)
-		  c = Center (Center (mesh->Point (el.PNum(1)),
-				      mesh->Point (el.PNum(2))),
-			      Center (mesh->Point (el.PNum(3)),
-				      mesh->Point (el.PNum(4))));
-
-
-		glBegin (GL_TRIANGLES);
-
-		for (j = 0; j < faces.Size(); j++)
-		  {
-		    const Element2d & face = faces[j];
-
-		    /*
-		      if (curv.IsHighOrder() && curv.IsElementCurved(i-1))
-		      {
-		      int hoplotn = 1 << vispar.subdivisions; 
-		      // int hoplotn = curv.GetNVisualSubsecs();
-			    
-		      const Point3d * facepoint = MeshTopology :: GetVertices (TET);
-		      const ELEMENT_FACE * elface = MeshTopology :: GetFaces(TET);
-                    
-		      Vec<3> x0,x1,d0,d1;
-		      Point<3> xg;
-		      x0 = facepoint[face.PNum(3)-1] - facepoint[face.PNum(1)-1];
-		      x1 = facepoint[face.PNum(2)-1] - facepoint[face.PNum(1)-1];
-		      x0.Normalize();
-		      x1.Normalize();
-
-		      for (int m0 = 0; m0 < hoplotn; m0++)
-		      for (int m1 = 0; m1 < hoplotn-m0; m1++)
-		      for (k = 0; k < 2; k++)
-		      {
-		      Vec<3> dx, dy, dz, n;
-		      Point<4> la[3];
-					
-		      for (l = 0; l<3; l++) la[l] = Point<4>(0.,0.,0.,0.);
-
-		      if (k == 0)
-		      {
-		      la[0](face.PNum(1)-1) = (m0  )/(double)hoplotn;
-		      la[0](face.PNum(2)-1) = (m1  )/(double)hoplotn;
-		      la[0](face.PNum(3)-1) = 1-la[0](face.PNum(1)-1)-la[0](face.PNum(2)-1);
-
-		      la[1](face.PNum(1)-1) = (m0+1)/(double)hoplotn;
-		      la[1](face.PNum(2)-1) = (m1  )/(double)hoplotn;
-		      la[1](face.PNum(3)-1) = 1-la[1](face.PNum(1)-1)-la[1](face.PNum(2)-1);
-
-		      la[2](face.PNum(1)-1) = (m0  )/(double)hoplotn;
-		      la[2](face.PNum(2)-1) = (m1+1)/(double)hoplotn;
-		      la[2](face.PNum(3)-1) = 1-la[2](face.PNum(1)-1)-la[2](face.PNum(2)-1);
-		      } else
-		      {
-		      if (m1 == hoplotn-m0-1) continue;
-		      la[0](face.PNum(1)-1) = (m0+1)/(double)hoplotn;
-		      la[0](face.PNum(2)-1) = (m1+1)/(double)hoplotn;
-		      la[0](face.PNum(3)-1) = 1-la[0](face.PNum(1)-1)-la[0](face.PNum(2)-1);
-
-		      la[1](face.PNum(1)-1) = (m0  )/(double)hoplotn;
-		      la[1](face.PNum(2)-1) = (m1+1)/(double)hoplotn;
-		      la[1](face.PNum(3)-1) = 1-la[1](face.PNum(1)-1)-la[1](face.PNum(2)-1);
-
-		      la[2](face.PNum(1)-1) = (m0+1)/(double)hoplotn;
-		      la[2](face.PNum(2)-1) = (m1  )/(double)hoplotn;
-		      la[2](face.PNum(3)-1) = 1-la[2](face.PNum(1)-1)-la[2](face.PNum(2)-1);
-		      }
-
-		      for (l = 0; l<3; l++)
-		      {
-		      Mat<3,3> dxdxi;
-		      Point<3> xr( la[l](0), la[l](1), la[l](2) );
-		      curv.CalcElementTransformation (xr, i-1, xg, dxdxi);
-		      for (int i = 0; i < 3; i++)
-		      {
-		      dx(i) = dxdxi(i,0);
-		      dy(i) = dxdxi(i,1);
-		      dz(i) = dxdxi(i,2);
-		      }
-
-		      d0 = x0(0)*dx + x0(1)*dy + x0(2)*dz;
-		      d1 = x1(0)*dx + x1(1)*dy + x1(2)*dz;
-		      n = Cross (d0, d1);
-		      glNormal3d ( n(0),  n(1),  n(2));
-		      glVertex3d (xg(0), xg(1), xg(2));
-		      }
-		      }
-
-		      } else 
-		    */
-		    {
-		      Point3d lp1 = mesh->Point (el.PNum(face.PNum(1)));
-		      Point3d lp2 = mesh->Point (el.PNum(face.PNum(2)));
-		      Point3d lp3 = mesh->Point (el.PNum(face.PNum(3)));
-		      Vec3d n = Cross (Vec3d (lp1, lp3), Vec3d (lp1, lp2));
-		      n /= (n.Length()+1e-12);
-		      glNormal3d (n.X(), n.Y(), n.Z());
-
-		      if (vispar.shrink < 1)
-			{
-			  lp1 = c + vispar.shrink * (lp1 - c);
-			  lp2 = c + vispar.shrink * (lp2 - c);
-			  lp3 = c + vispar.shrink * (lp3 - c);
-			}
-
-		      glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		      glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		      glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-		    }
-		  }
-	     
-		glEnd();
-	      }
-	  }
-      }
-    
-    glEndList ();
-    
-#endif
-  }
-
-
-
-
-  void VisualSceneMesh :: BuildPrismList()
-  {
-    if (prismtimestamp > mesh->GetTimeStamp () &&
-	prismtimestamp > vispar.clipplanetimestamp )
-      return;
-
-    if (!lock)
-      {
-	lock = new NgLock (mesh->Mutex());
-	lock -> Lock();
-      }
-
-    prismtimestamp = NextTimeStamp();
-
-
-
-    if (prismlist)
-      glDeleteLists (prismlist, 1);
-
-    prismlist = glGenLists (1);
-    glNewList (prismlist, GL_COMPILE);
-
-    static float prismcol[] = { 0.0f, 1.0f, 1.0f, 1.0f };
-    glLineWidth (1.0f);  
-
-    ARRAY<Element2d> faces;
-
-    
-    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, prismcol);
-
-    for (ElementIndex ei = 0; ei < mesh->GetNE(); ei++)
-      {
-	const Element & el = (*mesh)[ei];
-	if (el.GetType() == PRISM && !el.IsDeleted())
-	  {
-	    int j;
-	    int i = ei + 1;
-
-	    CurvedElements & curv = mesh->GetCurvedElements();
-	    if (curv.IsHighOrder() && curv.IsElementCurved(ei))
-	      {
-		const ELEMENT_FACE * faces = MeshTopology :: GetFaces (PRISM);
-		const Point3d * vertices = MeshTopology :: GetVertices (PRISM);
-		
-		Point<3> grid[11][11];
-		Point<3> fpts[4];
-		int order = vispar.subdivisions+1;
-		
-		for (int trig = 0; trig < 2; trig++)
-		  {   
-		    for (int j = 0; j < 3; j++)
-		      fpts[j] = vertices[faces[trig][j]-1];
-		    
-		    static Point<3> c(1.0/3.0, 1.0/3.0, 0.5);
-		    if (vispar.shrink < 1)
-		      for (int j = 0; j < 3; j++)
-			fpts[j] += (1-vispar.shrink) * (c-fpts[j]);
-			
-		    for (int ix = 0; ix <= order; ix++)
-		      for (int iy = 0; iy <= order; iy++)
-			{
-			  double lami[3] = 
-			    { (1-double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (1-double(iy)/order),
-			      double(iy)/order };
-			      
-			  Point<3> xl;
-			  for (int l = 0; l < 3; l++)
-			    xl(l) = lami[0] * fpts[0](l) + lami[1] * fpts[1](l) +
-			      lami[2] * fpts[2](l);
-			      
-			  curv.CalcElementTransformation (xl, i-1, grid[ix][iy]);
-			}
-			
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[j][0], &grid[0][1]-&grid[0][0]);
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[0][j], &grid[1][0]-&grid[0][0]);
-			
-		    glMap2d(GL_MAP2_VERTEX_3, 
-			    0.0, 1.0, &grid[0][1](0)-&grid[0][0](0), order+1,
-			    0.0, 1.0, &grid[1][0](0)-&grid[0][0](0), order+1,
-			    &grid[0][0](0));
-		    glEnable(GL_MAP2_VERTEX_3);
-		    glEnable(GL_AUTO_NORMAL); 
-			
-		    glMapGrid2f(8, 0.0, 0.999, 8, 0.0, 1.0);
-		    glEvalMesh2(GL_FILL, 0, 8, 0, 8);
-			
-		    glDisable (GL_AUTO_NORMAL);
-		    glDisable (GL_MAP2_VERTEX_3);
-		  }		    
-
-		for (int quad = 2; quad < 5; quad++)
-		  {   
-		    for (int j = 0; j < 4; j++)
-		      fpts[j] = vertices[faces[quad][j]-1];
-		    
-		    static Point<3> c(1.0/3.0, 1.0/3.0, 0.5);
-		    if (vispar.shrink < 1)
-		      for (int j = 0; j < 4; j++)
-			fpts[j] += (1-vispar.shrink) * (c-fpts[j]);
-			
-		    for (int ix = 0; ix <= order; ix++)
-		      for (int iy = 0; iy <= order; iy++)
-			{
-			  double lami[4] = 
-			    { (1-double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (  double(iy)/order),
-			      (1-double(ix)/order) * (  double(iy)/order) };
-			      
-			  Point<3> xl;
-			  for (int l = 0; l < 3; l++)
-			    xl(l) = 
-			      lami[0] * fpts[0](l) + lami[1] * fpts[1](l) +
-			      lami[2] * fpts[2](l) + lami[3] * fpts[3](l);
-			      
-			  curv.CalcElementTransformation (xl, ei, grid[ix][iy]);
-			}
-			
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[j][0], &grid[0][1]-&grid[0][0]);
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[0][j], &grid[1][0]-&grid[0][0]);
-			
-		    glMap2d(GL_MAP2_VERTEX_3, 
-			    0.0, 1.0, &grid[0][1](0)-&grid[0][0](0), order+1,
-			    0.0, 1.0, &grid[1][0](0)-&grid[0][0](0), order+1,
-			    &grid[0][0](0));
-		    glEnable(GL_MAP2_VERTEX_3);
-		    glEnable(GL_AUTO_NORMAL); 
-			
-		    glMapGrid2f(8, 0.0, 1.0, 8, 0.0, 1.0);
-		    glEvalMesh2(GL_FILL, 0, 8, 0, 8);
-			
-		    glDisable (GL_AUTO_NORMAL);
-		    glDisable (GL_MAP2_VERTEX_3);
-		  }		    
-
-
-
-
-
-		/*
-		int hoplotn = 1 << vispar.subdivisions; 
-		// int hoplotn = curv.GetNVisualSubsecs();
-
-		const Point3d * facepoint = MeshTopology :: GetVertices (TRIG);
-		const ELEMENT_FACE * elface = MeshTopology :: GetFaces(TRIG);
-
-		glBegin (GL_TRIANGLES);
-
-		for (int trig = 0; trig<2; trig++)
-		  {
-                    
-		    Vec<3> x0,x1,d0,d1;
-		    x0 = facepoint[1] - facepoint[2];
-		    x1 = facepoint[0] - facepoint[2];
-		    x0.Normalize();
-		    x1.Normalize();
-		    if (trig == 1) swap (x0,x1);
-
-		    Point<3> xr[3];
-		    Point<3> xg;
-		    Vec<3> dx, dy, dz, n;
-
-		    for (int i1 = 0; i1 < hoplotn; i1++)
-		      for (int j1 = 0; j1 < hoplotn-i1; j1++)
-			for (int k = 0; k < 2; k++)
-			  {
-			    if (k == 0)
-			      {
-				xr[0](0) = (double)    i1/hoplotn; xr[0](1) = (double)    j1/hoplotn;
-				xr[1](0) = (double)(i1+1)/hoplotn; xr[1](1) = (double)    j1/hoplotn;
-				xr[2](0) = (double)    i1/hoplotn; xr[2](1) = (double)(j1+1)/hoplotn;
-			      } else
-				{
-				  if (j1 == hoplotn-i1-1) continue;
-				  xr[0](0) = (double)(i1+1)/hoplotn; xr[0](1) = (double)    j1/hoplotn;
-				  xr[1](0) = (double)(i1+1)/hoplotn; xr[1](1) = (double)(j1+1)/hoplotn;
-				  xr[2](0) = (double)    i1/hoplotn; xr[2](1) = (double)(j1+1)/hoplotn;
-				};
-				    
-			    for (int l=0; l<3; l++)
-			      {
-				Mat<3,3> dxdxi;
-				xr[l](2) = (double) trig;
-				curv.CalcElementTransformation (xr[l], i-1, xg, dxdxi);
-				for (int i = 0; i < 3; i++)
-				  {
-				    dx(i) = dxdxi(i,0);
-				    dy(i) = dxdxi(i,1);
-				    dz(i) = dxdxi(i,2);
-				  }
-
-				Vec<3> d0 = x0(0)*dx + x0(1)*dy + x0(2)*dz;
-				Vec<3> d1 = x1(0)*dx + x1(1)*dy + x1(2)*dz;
-				n = Cross (d1, d0);
-				glNormal3d (n(0), n(1), n(2));
-				glVertex3d (xg(0), xg(1), xg(2));
-			      }
-			  }
-			
-		  }
-
-		glEnd ();
-
-		glBegin (GL_QUADS);
-
-		for (int quad = 0; quad<3; quad++)
-		  {   
-		    const Point3d * facepoint = MeshTopology :: GetVertices (PRISM);
-
-		    Vec<3> x0,x1;
-		    int xyz;
-
-		    switch (quad)
-		      {
-		      case 0:
-			x0 = facepoint[5] - facepoint[2];
-			x1 = facepoint[0] - facepoint[2];
-			xyz = 0;
-			break;
-		      case 1:
-			x0 = facepoint[4] - facepoint[0];
-			x1 = facepoint[1] - facepoint[0];
-			xyz = 0;
-			break;
-		      case 2:
-			x0 = facepoint[1] - facepoint[2];
-			x1 = facepoint[5] - facepoint[2];
-			xyz = 1;
-			break;
-		      }
-
-		    x0.Normalize();
-		    x1.Normalize();
-
-		    swap (x0,x1);
-
-		    Point<3> xr[4];
-		    Point<3> xg;
-		    Vec<3> dx, dy, dz, n;
-
-		    for (int i1 = 0; i1 < hoplotn; i1++)
-		      for (int j1 = 0; j1 < hoplotn; j1++)
-			{
-			  xr[0](xyz) = (double)    i1/hoplotn; xr[0](2) = (double)    j1/hoplotn;
-			  xr[1](xyz) = (double)(i1+1)/hoplotn; xr[1](2) = (double)    j1/hoplotn;
-			  xr[2](xyz) = (double)(i1+1)/hoplotn; xr[2](2) = (double)(j1+1)/hoplotn;
-			  xr[3](xyz) = (double)    i1/hoplotn; xr[3](2) = (double)(j1+1)/hoplotn;
-				    
-			  for (int l=0; l<4; l++)
-			    {
-			      switch (quad)
-				{
-				case 0: xr[l](1) = 0; break;
-				case 1: xr[l](1) = 1-xr[l](0); break;
-				case 2: xr[l](0) = 0; break;
-				}
-
-			      Mat<3,3> dxdxi;
-			      curv.CalcElementTransformation (xr[l], i-1, xg, dxdxi);
-			      for (int i = 0; i < 3; i++)
-				{
-				  dx(i) = dxdxi(i,0);
-				  dy(i) = dxdxi(i,1);
-				  dz(i) = dxdxi(i,2);
-				}
-
-			      Vec<3> d0 = x0(0)*dx + x0(1)*dy + x0(2)*dz;
-			      Vec<3> d1 = x1(0)*dx + x1(1)*dy + x1(2)*dz;
-			      n = Cross (d1, d0);
-			      glNormal3d (n(0), n(1), n(2));
-			      glVertex3d (xg(0), xg(1), xg(2));
-			    }
-			}
-		  }
-		glEnd ();
-		*/
-	      } 
-	    else
-	      { 
-		Point3d c(0,0,0);
-		if (vispar.shrink < 1)
-		  {
-		    for (j = 1; j <= 6; j++)
-		      {
-			Point3d p = mesh->Point(el.PNum(j));
-			c.X() += p.X() / 6;
-			c.Y() += p.Y() / 6;
-			c.Z() += p.Z() / 6;
-		      }
-		  }
-
-		el.GetSurfaceTriangles (faces);
-		glBegin (GL_TRIANGLES);
-		for (j = 1; j <= faces.Size(); j++)
-		  {
-		    Element2d & face = faces.Elem(j);
-		    Point3d lp1 = mesh->Point (el.PNum(face.PNum(1)));
-		    Point3d lp2 = mesh->Point (el.PNum(face.PNum(2)));
-		    Point3d lp3 = mesh->Point (el.PNum(face.PNum(3)));
-		    Vec3d n = Cross (Vec3d (lp1, lp3), Vec3d (lp1, lp2));
-		    n /= (n.Length()+1e-12);
-		    glNormal3d (n.X(), n.Y(), n.Z());
-		    if (vispar.shrink < 1)
-		      {
-			lp1 = c + vispar.shrink * (lp1 - c);
-			lp2 = c + vispar.shrink * (lp2 - c);
-			lp3 = c + vispar.shrink * (lp3 - c);
-		      }
-		    glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		    glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		    glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-		  }
-	      
-		glEnd();
-	      }
-	  }
-      }
-    glEndList ();
-  }
- 
-
-
-
-  void VisualSceneMesh :: BuildHexList()
-  {
-    if (hextimestamp > mesh->GetTimeStamp () &&
-	hextimestamp > vispar.clipplanetimestamp )
-      return;
-
-    if (!lock)
-      {
-	lock = new NgLock (mesh->Mutex());
-	lock -> Lock();
-      }
-
-    hextimestamp = NextTimeStamp();
-
-    if (hexlist) glDeleteLists (hexlist, 1);
-
-    hexlist = glGenLists (1);
-    glNewList (hexlist, GL_COMPILE);
-
-
-    static float hexcol[] = { 1.0f, 1.0f, 0.0f, 1.0f };
-    glLineWidth (1.0f);  
-    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, hexcol);
-
-    ARRAY<Element2d> faces;
-    int hoplotn = 1 << vispar.subdivisions; 
-
-    for (ElementIndex ei = 0; ei < mesh->GetNE(); ei++)
-      {
-	const Element & el = (*mesh)[ei];
-	if (el.GetType() == HEX && !el.IsDeleted())
-	  {
-	    CurvedElements & curv = mesh->GetCurvedElements();
-	    if (curv.IsHighOrder() && curv.IsElementCurved(ei))
-	      {
-		/* // classical 
-		   glBegin (GL_QUADS);
-		
-		   const ELEMENT_FACE * faces = MeshTopology :: GetFaces (HEX);
-		   const Point3d * vertices = MeshTopology :: GetVertices (HEX);
-
-		   Point<3> grid[33][33];
-		   Vec<3> gridn[33][33];
-		   Point<3> fpts[4];
-		   for (int quad = 0; quad<6; quad++)
-		   {   
-		   for (int j = 0; j < 4; j++)
-		   fpts[j] = vertices[faces[quad][j]-1];
-
-		   static Point<3> c(0.5, 0.5, 0.5);
-		   if (vispar.shrink < 1)
-		   for (int j = 0; j < 4; j++)
-		   fpts[j] += (1-vispar.shrink) * (c-fpts[j]);
-
-		   Vec<3> taux = fpts[1]-fpts[0];
-		   Vec<3> tauy = fpts[3]-fpts[0];
-
-		   for (int ix = 0; ix <= hoplotn; ix++)
-		   for (int iy = 0; iy <= hoplotn; iy++)
-		   {
-		   Point<3> xl;
-		   Mat<3,3> dxdxi;
-		   double lami[4] = 
-		   { (1-double(ix)/hoplotn) * (1-double(iy)/hoplotn),
-		   (  double(ix)/hoplotn) * (1-double(iy)/hoplotn),
-		   (  double(ix)/hoplotn) * (  double(iy)/hoplotn),
-		   (1-double(ix)/hoplotn) * (  double(iy)/hoplotn) };
-		   for (int l = 0; l < 3; l++)
-		   xl(l) = lami[0] * fpts[0](l) + lami[1] * fpts[1](l) +
-		   lami[2] * fpts[2](l) + lami[3] * fpts[3](l);
-
-		   curv.CalcElementTransformation (xl, ei, grid[ix][iy], dxdxi);
-			  
-		   Vec<3> gtaux = dxdxi * taux;
-		   Vec<3> gtauy = dxdxi * tauy;
-		   gridn[ix][iy] = Cross (gtauy, gtaux).Normalize();
-		   }
-		    
-		   for (int ix = 0; ix < hoplotn; ix++)
-		   for (int iy = 0; iy < hoplotn; iy++)
-		   {
-		   glNormal3dv (gridn[ix][iy]);
-		   glVertex3dv (grid[ix][iy]);
-
-		   glNormal3dv (gridn[ix+1][iy]);
-		   glVertex3dv (grid[ix+1][iy]);
-
-		   glNormal3dv (gridn[ix+1][iy+1]);
-		   glVertex3dv (grid[ix+1][iy+1]);
-
-		   glNormal3dv (gridn[ix][iy+1]);
-		   glVertex3dv (grid[ix][iy+1]);
-		   }
-		   }
-		
-		   glEnd ();
-		*/
-
-		const ELEMENT_FACE * faces = MeshTopology :: GetFaces (HEX);
-		const Point3d * vertices = MeshTopology :: GetVertices (HEX);
-
-		Point<3> grid[11][11];
-		Point<3> fpts[4];
-		int order = vispar.subdivisions+1;
-
-		for (int quad = 0; quad<6; quad++)
-		  {   
-		    for (int j = 0; j < 4; j++)
-		      fpts[j] = vertices[faces[quad][j]-1];
-
-		    static Point<3> c(0.5, 0.5, 0.5);
-		    if (vispar.shrink < 1)
-		      for (int j = 0; j < 4; j++)
-			fpts[j] += (1-vispar.shrink) * (c-fpts[j]);
-
-		    for (int ix = 0; ix <= order; ix++)
-		      for (int iy = 0; iy <= order; iy++)
-			{
-			  double lami[4] = 
-			    { (1-double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (  double(iy)/order),
-			      (1-double(ix)/order) * (  double(iy)/order) };
-
-			  Point<3> xl;
-			  for (int l = 0; l < 3; l++)
-			    xl(l) = lami[0] * fpts[0](l) + lami[1] * fpts[1](l) +
-			      lami[2] * fpts[2](l) + lami[3] * fpts[3](l);
-
-			  curv.CalcElementTransformation (xl, ei, grid[ix][iy]);
-			}
-		    
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[j][0], &grid[0][1]-&grid[0][0]);
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[0][j], &grid[1][0]-&grid[0][0]);
-
-		    glMap2d(GL_MAP2_VERTEX_3, 
-			    0.0, 1.0, &grid[0][1](0)-&grid[0][0](0), order+1,
-			    0.0, 1.0, &grid[1][0](0)-&grid[0][0](0), order+1,
-			    &grid[0][0](0));
-		    glEnable(GL_MAP2_VERTEX_3);
-		    glEnable(GL_AUTO_NORMAL); 
-
-		    glMapGrid2f(8, 0.0, 1.0, 8, 0.0, 1.0);
-		    glEvalMesh2(GL_FILL, 0, 8, 0, 8);
-
-		    glDisable (GL_AUTO_NORMAL);
-		    glDisable (GL_MAP2_VERTEX_3);
-		  }
-	      } 
-	    else
-	      { 
-		Point3d c(0,0,0);
-		if (vispar.shrink < 1)
-		  {
-		    for (int j = 1; j <= 8; j++)
-		      {
-			Point3d p = mesh->Point(el.PNum(j));
-			c.X() += p.X();
-			c.Y() += p.Y();
-			c.Z() += p.Z();
-		      }
-		    c.X() /= 8;
-		    c.Y() /= 8;
-		    c.Z() /= 8;
-		  }
-
-		glBegin (GL_TRIANGLES);
-
-		el.GetSurfaceTriangles (faces);
-		for (int j = 1; j <= faces.Size(); j++)
-		  {
-		    Element2d & face = faces.Elem(j);
-		    Point<3> lp1 = mesh->Point (el.PNum(face.PNum(1)));
-		    Point<3> lp2 = mesh->Point (el.PNum(face.PNum(2)));
-		    Point<3> lp3 = mesh->Point (el.PNum(face.PNum(3)));
-		    Vec<3> n = Cross (lp3-lp1, lp2-lp1);  
-		    n.Normalize();
-		    glNormal3dv (n);
-		  
-		    if (vispar.shrink < 1)
-		      {
-			lp1 = c + vispar.shrink * (lp1 - c);
-			lp2 = c + vispar.shrink * (lp2 - c);
-			lp3 = c + vispar.shrink * (lp3 - c);
-		      }
-
-		    glVertex3dv (lp1);
-		    glVertex3dv (lp2);
-		    glVertex3dv (lp3);
-		  }
-
-		glEnd();
-	      }
-	  }
-      }
-    glEndList ();
-  }
-
-
-
-
-
-
-
-
- 
-  void VisualSceneMesh :: BuildPyramidList()
-  {
-    if (pyramidtimestamp > mesh->GetTimeStamp () &&
-	pyramidtimestamp > vispar.clipplanetimestamp )
-      return;
-
-    if (!lock)
-      {
-	lock = new NgLock (mesh->Mutex());
-	lock -> Lock();
-      }
-
-    pyramidtimestamp = NextTimeStamp();
-
-
-    if (pyramidlist)
-      glDeleteLists (pyramidlist, 1);
-
-
-
-
-    pyramidlist = glGenLists (1);
-    glNewList (pyramidlist, GL_COMPILE);
-  
-    static float pyramidcol[] = { 1.0f, 0.0f, 1.0f, 1.0f };
-    glLineWidth (1.0f);
-    ARRAY<Element2d> faces;
-
-    for (ElementIndex ei = 0; ei < mesh->GetNE(); ei++)
-      {
-	const Element & el = (*mesh)[ei];
-	if (el.GetType() == PYRAMID && !el.IsDeleted())
-	  {
-	    int j;
-	    int i = ei + 1;
-
-	    CurvedElements & curv = mesh->GetCurvedElements();
-	    if (curv.IsHighOrder() && curv.IsElementCurved(ei))
-	      {
-
-		const ELEMENT_FACE * faces = MeshTopology :: GetFaces (PYRAMID);
-		const Point3d * vertices = MeshTopology :: GetVertices (PYRAMID);
-		
-		Point<3> grid[11][11];
-		Point<3> fpts[4];
-		int order = vispar.subdivisions+1;
-		
-		for (int trig = 0; trig < 4; trig++)
-		  {   
-		    for (int j = 0; j < 3; j++)
-		      fpts[j] = vertices[faces[trig][j]-1];
-		    
-		    static Point<3> c(0.375, 0.375, 0.25);
-		    if (vispar.shrink < 1)
-		      for (int j = 0; j < 3; j++)
-			fpts[j] += (1-vispar.shrink) * (c-fpts[j]);
-			
-		    for (int ix = 0; ix <= order; ix++)
-		      for (int iy = 0; iy <= order; iy++)
-			{
-			  double lami[3] = 
-			    { (1-double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (1-double(iy)/order),
-			      double(iy)/order };
-			      
-			  Point<3> xl;
-			  for (int l = 0; l < 3; l++)
-			    xl(l) = lami[0] * fpts[0](l) + lami[1] * fpts[1](l) +
-			      lami[2] * fpts[2](l);
-			      
-			  curv.CalcElementTransformation (xl, i-1, grid[ix][iy]);
-			}
-			
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[j][0], &grid[0][1]-&grid[0][0]);
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[0][j], &grid[1][0]-&grid[0][0]);
-			
-		    glMap2d(GL_MAP2_VERTEX_3, 
-			    0.0, 1.0, &grid[0][1](0)-&grid[0][0](0), order+1,
-			    0.0, 1.0, &grid[1][0](0)-&grid[0][0](0), order+1,
-			    &grid[0][0](0));
-		    glEnable(GL_MAP2_VERTEX_3);
-		    glEnable(GL_AUTO_NORMAL); 
-			
-		    glMapGrid2f(8, 0.0, 0.999, 8, 0.0, 1.0);
-		    glEvalMesh2(GL_FILL, 0, 8, 0, 8);
-			
-		    glDisable (GL_AUTO_NORMAL);
-		    glDisable (GL_MAP2_VERTEX_3);
-		  }		    
-
-		for (int quad = 4; quad < 5; quad++)
-		  {   
-		    for (int j = 0; j < 4; j++)
-		      fpts[j] = vertices[faces[quad][j]-1];
-		    
-		    static Point<3> c(0.375, 0.375, 0.25);
-		    if (vispar.shrink < 1)
-		      for (int j = 0; j < 4; j++)
-			fpts[j] += (1-vispar.shrink) * (c-fpts[j]);
-			
-		    for (int ix = 0; ix <= order; ix++)
-		      for (int iy = 0; iy <= order; iy++)
-			{
-			  double lami[4] = 
-			    { (1-double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (1-double(iy)/order),
-			      (  double(ix)/order) * (  double(iy)/order),
-			      (1-double(ix)/order) * (  double(iy)/order) };
-			      
-			  Point<3> xl;
-			  for (int l = 0; l < 3; l++)
-			    xl(l) = 
-			      lami[0] * fpts[0](l) + lami[1] * fpts[1](l) +
-			      lami[2] * fpts[2](l) + lami[3] * fpts[3](l);
-			      
-			  curv.CalcElementTransformation (xl, ei, grid[ix][iy]);
-			}
-			
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[j][0], &grid[0][1]-&grid[0][0]);
-		    for (int j = 0; j <= order; j++)
-		      ToBernstein (order, &grid[0][j], &grid[1][0]-&grid[0][0]);
-			
-		    glMap2d(GL_MAP2_VERTEX_3, 
-			    0.0, 1.0, &grid[0][1](0)-&grid[0][0](0), order+1,
-			    0.0, 1.0, &grid[1][0](0)-&grid[0][0](0), order+1,
-			    &grid[0][0](0));
-		    glEnable(GL_MAP2_VERTEX_3);
-		    glEnable(GL_AUTO_NORMAL); 
-			
-		    glMapGrid2f(8, 0.0, 1.0, 8, 0.0, 1.0);
-		    glEvalMesh2(GL_FILL, 0, 8, 0, 8);
-			
-		    glDisable (GL_AUTO_NORMAL);
-		    glDisable (GL_MAP2_VERTEX_3);
-		  }		    
-
-
-
-
-
-
-		/*
-		int hoplotn = 1 << vispar.subdivisions; 
-
-		const ELEMENT_FACE * faces = MeshTopology :: GetFaces (PYRAMID);
-		const Point3d * vertices = MeshTopology :: GetVertices (PYRAMID);
-
-		Point<3> grid[33][33];
-		Vec<3> gridn[33][33];
-
-
-		glBegin (GL_TRIANGLES);
-		
-		for (int trig = 0; trig < 4; trig++)
-		  {   
-		    Point<3> p0 = vertices[faces[trig][0]-1];
-		    Point<3> p1 = vertices[faces[trig][1]-1];
-		    Point<3> p2 = vertices[faces[trig][2]-1];
-
-		    if (vispar.shrink < 1)
-		      {
-			static Point<3> c(0.375, 0.375, 0.25);
-			p0 = c + vispar.shrink * (p0 - c);
-			p1 = c + vispar.shrink * (p1 - c);
-			p2 = c + vispar.shrink * (p2 - c);
-		      }
-		   
-
-		    Vec<3> taux = p0-p2;
-		    Vec<3> tauy = p1-p2;
-		    Vec<3> gtaux, gtauy;
-
-		    Point<3> xl;
-		    Mat<3,3> dxdxi;
-
-		    for (int ix = 0; ix <= hoplotn; ix++)
-		      for (int iy = 0; iy <= hoplotn-ix; iy++)
-			{
-			  for (int l = 0; l < 3; l++)
-			    xl(l) = 
-			      (1-double(ix+iy)/hoplotn) * p2(l) +
-			      (double(ix)/hoplotn) * p0(l) +
-			      (double(iy)/hoplotn) * p1(l);
-			  
-			  curv.CalcElementTransformation (xl, i-1, grid[ix][iy], dxdxi);
-			  
-			  gtaux = dxdxi * taux;
-			  gtauy = dxdxi * tauy;
-			  gridn[ix][iy] = Cross (gtauy, gtaux).Normalize();
-			}
-
-		    for (int ix = 0; ix < hoplotn; ix++)
-		      for (int iy = 0; iy < hoplotn-ix; iy++)
-			{
-			  glNormal3dv (gridn[ix][iy]);
-			  glVertex3dv (grid[ix][iy]);
-
-			  glNormal3dv (gridn[ix+1][iy]);
-			  glVertex3dv (grid[ix+1][iy]);
-
-			  glNormal3dv (gridn[ix][iy+1]);
-			  glVertex3dv (grid[ix][iy+1]);
-
-			  if (iy < hoplotn-ix-1)
-			    {
-			      glNormal3dv (gridn[ix][iy+1]);
-			      glVertex3dv (grid[ix][iy+1]);
-			      
-			      glNormal3dv (gridn[ix+1][iy]);
-			      glVertex3dv (grid[ix+1][iy]);
-
-			      glNormal3dv (gridn[ix+1][iy+1]);
-			      glVertex3dv (grid[ix+1][iy+1]);
-			    }
-			}
-		  }
-
-		glEnd ();
-
-
-
-
-		glBegin (GL_QUADS);
-		
-		for (int quad = 4; quad < 5; quad++)
-		  {   
-		    Point<3> p0 = vertices[faces[quad][0]-1];
-		    Point<3> p1 = vertices[faces[quad][1]-1];
-		    Point<3> p2 = vertices[faces[quad][2]-1];
-		    Point<3> p3 = vertices[faces[quad][3]-1];
-
-		    if (vispar.shrink < 1)
-		      {
-			static Point<3> c(0.375, 0.375, 0.25);
-			p0 = c + vispar.shrink * (p0 - c);
-			p1 = c + vispar.shrink * (p1 - c);
-			p2 = c + vispar.shrink * (p2 - c);
-			p3 = c + vispar.shrink * (p3 - c);
-		      }
-
-		    Vec<3> taux = p1-p0;
-		    Vec<3> tauy = p3-p0;
-		    Vec<3> gtaux, gtauy;
-
-		    Point<3> xl, xg;
-		    Mat<3,3> dxdxi;
-
-		    for (int ix = 0; ix <= hoplotn; ix++)
-		      for (int iy = 0; iy <= hoplotn; iy++)
-			{
-			  Point<3> xl;
-			  for (int l = 0; l < 3; l++)
-			    xl(l) = 
-			      (1-double(ix)/hoplotn)*(1-double(iy)/hoplotn) * p0(l) +
-			      (  double(ix)/hoplotn)*(1-double(iy)/hoplotn) * p1(l) +
-			      (  double(ix)/hoplotn)*(  double(iy)/hoplotn) * p2(l) +
-			      (1-double(ix)/hoplotn)*(  double(iy)/hoplotn) * p3(l);
-			  
-			  curv.CalcElementTransformation (xl, i-1, grid[ix][iy], dxdxi);
-			  
-			  gtaux = dxdxi * taux;
-			  gtauy = dxdxi * tauy;
-			  gridn[ix][iy] = Cross (gtauy, gtaux).Normalize();
-			}
-
-		    for (int ix = 0; ix < hoplotn; ix++)
-		      for (int iy = 0; iy < hoplotn; iy++)
-			{
-			  glNormal3dv (gridn[ix][iy]);
-			  glVertex3dv (grid[ix][iy]);
-
-			  glNormal3dv (gridn[ix+1][iy]);
-			  glVertex3dv (grid[ix+1][iy]);
-
-			  glNormal3dv (gridn[ix+1][iy+1]);
-			  glVertex3dv (grid[ix+1][iy+1]);
-
-			  glNormal3dv (gridn[ix][iy+1]);
-			  glVertex3dv (grid[ix][iy+1]);
-			}
-		  }
-
-		glEnd ();
-		*/
-
-
-	      } 
-	    else
-	      { 
-
-
-
-		Point3d c(0,0,0);
-		if (vispar.shrink < 1)
-		  {
-		    for (int j = 1; j <= 5; j++)
-		      {
-			Point3d p = mesh->Point(el.PNum(j));
-			c.X() += p.X() / 5;
-			c.Y() += p.Y() / 5;
-			c.Z() += p.Z() / 5;
-		      }
-		  }
-
-
-		el.GetSurfaceTriangles (faces);
-	  
-		glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pyramidcol);
-		if (el.PNum(1))
-		  {
-		    glBegin (GL_TRIANGLES);
-	      
-		    for (int j = 1; j <= faces.Size(); j++)
-		      {
-			Element2d & face = faces.Elem(j);
-			Point3d lp1 = mesh->Point (el.PNum(face.PNum(1)));
-			Point3d lp2 = mesh->Point (el.PNum(face.PNum(2)));
-			Point3d lp3 = mesh->Point (el.PNum(face.PNum(3)));
-			Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-			n /= (n.Length()+1e-12);
-			n *= -1;
-			glNormal3d (n.X(), n.Y(), n.Z());
-
-			if (vispar.shrink < 1)
-			  {
-			    lp1 = c + vispar.shrink * (lp1 - c);
-			    lp2 = c + vispar.shrink * (lp2 - c);
-			    lp3 = c + vispar.shrink * (lp3 - c);
-			  }
-
-			glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-			glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-			glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-		      }
-	      
-		    glEnd();
-		  }
-	      }
-	  }
-      }
-    glEndList ();
-  }
-
-  void VisualSceneMesh :: BuildBadelList()
-  {
-    ;
-  }
-
-  void VisualSceneMesh :: BuildIdentifiedList()
-  {
-    ;
-  }
-  
-  void VisualSceneMesh :: BuildDomainSurfList()
-  {
-    if (domainsurflist)
-      glDeleteLists (domainsurflist, 1);
-
-    domainsurflist = glGenLists (1);
-    glNewList (domainsurflist, GL_COMPILE);
-
-    int i, j;
-    glLineWidth (1.0f);
-  
-    glDisable (GL_COLOR_MATERIAL);
-  
-    for (i = 1; i <= mesh->GetNSE(); i++)
-      {
-	Element2d el = mesh->SurfaceElement (i);
-      
-	int drawel = 1;
-	for (j = 1; j <= el.GetNP(); j++)
-	  {
-	    if (!el.PNum(j))
-	      drawel = 0;
-	  }
-      
-	if (!drawel)
-	  continue;
-      
-	if (el.GetIndex() < 1 || el.GetIndex() > mesh->GetNFD())
-	  continue;
-	int domin = mesh->GetFaceDescriptor(el.GetIndex()).DomainIn();
-	int domout = mesh->GetFaceDescriptor(el.GetIndex()).DomainOut();
-
-	int fac;
-	if (domin == vispar.drawdomainsurf)
-	  fac = 1;
-	else if (domout == vispar.drawdomainsurf)
-	  fac = -1;
-	else
-	  continue;
-      
-      
-	GLfloat matcol[] = { 1, 0, 0, 1 };
-	glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcol);
-      
-      
-	if (el.GetNP() == 3)
-	  {
-	    glBegin (GL_TRIANGLES);
-	      
-	    const Point3d & lp1 = mesh->Point (el.PNum(1));
-	    const Point3d & lp2 = mesh->Point (el.PNum(2));
-	    const Point3d & lp3 = mesh->Point (el.PNum(3));
-	    Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-	    n /= ( fac * (n.Length()+1e-12));
-	    glNormal3d (n.X(), n.Y(), n.Z());
-	  
-	    if (!vispar.colormeshsize)
-	      {
-		glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	      }
-	    glEnd();
-	  }
-	else if (el.GetNP() == 4)
-	  {
-	    glBegin (GL_QUADS);
-	  
-	    const Point3d & lp1 = mesh->Point (el.PNum(1));
-	    const Point3d & lp2 = mesh->Point (el.PNum(2));
-	    const Point3d & lp3 = mesh->Point (el.PNum(4));
-	    const Point3d & lp4 = mesh->Point (el.PNum(3));
-	    Vec3d n = Cross (Vec3d (lp1, lp2), 
-			     Vec3d (lp1, Center (lp3, lp4)));
-	    n /= (fac * (n.Length()+1e-12));
-	    glNormal3d (n.X(), n.Y(), n.Z()); 
-	    glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	    glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	    glVertex3d (lp4.X(), lp4.Y(), lp4.Z());
-	    glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	    glEnd();
-	  }
-	else if (el.GetNP() == 6)
-	  {
-	    glBegin (GL_TRIANGLES);
-	    static int trigs[4][3] = {
-	      { 1, 6, 5 },
-	      { 2, 4, 6 },
-	      { 3, 5, 4 },
-	      { 4, 5, 6 } };
-	  
-	    for (j = 0; j < 4; j++)
-	      {
-		const Point3d & lp1 = mesh->Point (el.PNum(trigs[j][0]));
-		const Point3d & lp2 = mesh->Point (el.PNum(trigs[j][1]));
-		const Point3d & lp3 = mesh->Point (el.PNum(trigs[j][2]));
-		Vec3d n = Cross (Vec3d (lp1, lp2), Vec3d (lp1, lp3));
-		n /= (fac * (n.Length() + 1e-12));
-		glNormal3d (n.X(), n.Y(), n.Z());
-		glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-		glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-		glVertex3d (lp3.X(), lp3.Y(), lp3.Z());
-	      }
-	    glEnd();
-	  }
-      }
-    glEndList ();
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-  void VisualSceneMesh :: MouseDblClick (int px, int py)
-  {
-    int i, hits;
-
-    // select surface triangle by mouse click
-
-    GLuint selbuf[10000];
-    glSelectBuffer (10000, selbuf);
-
-
-    glRenderMode (GL_SELECT);
-
-    GLint viewport[4];
-    glGetIntegerv (GL_VIEWPORT, viewport);
-
-
-    glMatrixMode (GL_PROJECTION); 
-    glPushMatrix();
-
-    GLdouble projmat[16];
-    glGetDoublev (GL_PROJECTION_MATRIX, projmat);
-
-    glLoadIdentity(); 
-    gluPickMatrix (px, viewport[3] - py, 1, 1, viewport); 
-    glMultMatrixd (projmat);
-  
-
-
-    glClearColor(backcolor, backcolor, backcolor, 1.0);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-    glMatrixMode (GL_MODELVIEW); 
-
-    glPushMatrix();
-    glMultMatrixf (transformationmat);
-
-
-    //  SetClippingPlane();
-
-    glInitNames();
-    glPushName (1);
-
-    glPolygonOffset (1, 1);
-    glEnable (GL_POLYGON_OFFSET_FILL);
-
-    glDisable(GL_CLIP_PLANE0);
-  
-    if (vispar.clipenable)
-      {
-	Vec<3> n(clipplane[0], clipplane[1], clipplane[2]);
-	double len = Abs(n);
-	double mu = -clipplane[3] / (len*len);
-	Point<3> p (mu * n);
-	n /= len;
-	Vec<3> t1 = n.GetNormal ();
-	Vec<3> t2 = Cross (n, t1);
-      
-	double xi1mid = (center - p) * t1;
-	double xi2mid = (center - p) * t2;
-      
-	glLoadName (0);  
-	glBegin (GL_QUADS);
-	glVertex3dv (p + (xi1mid-rad) * t1 + (xi2mid-rad) * t2);
-	glVertex3dv (p + (xi1mid+rad) * t1 + (xi2mid-rad) * t2);
-	glVertex3dv (p + (xi1mid+rad) * t1 + (xi2mid+rad) * t2);
-	glVertex3dv (p + (xi1mid-rad) * t1 + (xi2mid+rad) * t2);
-	glEnd ();
-      }
-
-    //  SetClippingPlane();
-
-    glCallList (filledlist);
-
-    glDisable (GL_POLYGON_OFFSET_FILL);
-  
-    glPopName();
-
-    glMatrixMode (GL_PROJECTION); 
-    glPopMatrix();
-
-    glMatrixMode (GL_MODELVIEW); 
-    glPopMatrix();
-
-    glFlush();  
-
-	
-    hits = glRenderMode (GL_RENDER);
-
-    //  cout << "hits = " << hits << endl;
-
-    int minname = 0;
-    GLuint mindepth = 0;
-
-    // find clippingplane
-    GLuint clipdepth = 0; // GLuint(-1);
-
-    for (i = 0; i < hits; i++)
-      {
-	int curname = selbuf[4*i+3];
-	if (!curname) clipdepth = selbuf[4*i+1];
-      }
-
-    for (i = 0; i < hits; i++)
-      {
-	int curname = selbuf[4*i+3];
-	GLuint curdepth = selbuf[4*i+1];
-	/*
-	  cout << selbuf[4*i] << " " << selbuf[4*i+1] << " " 
-	  << selbuf[4*i+2] << " " << selbuf[4*i+3] << endl;
-	*/
-	if (curname && (curdepth > clipdepth) &&
-	    (curdepth < mindepth || !minname))
-	  {
-	    mindepth = curdepth;
-	    minname = curname;
-	  }
-      }
-
-    seledge = -1;
-    if (minname)
-      {
-	const Element2d & sel = mesh->SurfaceElement(minname);
-
-
-	cout << "select element " << minname
-	     << " on face " << sel.GetIndex() << endl;
-	cout << "Nodes: ";
-	for (i = 1; i <= sel.GetNP(); i++)
-	  cout << sel.PNum(i) << " ";
-	cout << endl;
-
-	selelement = minname;
-	selface = mesh->SurfaceElement(minname).GetIndex();
-
-	locpi = (locpi % sel.GetNP()) + 1;
-	selpoint2 = selpoint;
-	selpoint = sel.PNum(locpi);
-	cout << "selected point " << selpoint 
-	     << ", pos = " << mesh->Point (selpoint) 
-	     << endl;
-
-	for (i = 1; i <= mesh->GetNSeg(); i++)
-	  {
-	    const Segment & seg = mesh->LineSegment(i);
-	    if (seg.p1 == selpoint && seg.p2 == selpoint2 || 
-		seg.p2 == selpoint && seg.p1 == selpoint2)
-	      {
-		seledge = seg.edgenr;
-		cout << "seledge = " << seledge << endl;
-	      }
-	  }
-      
-      }
-    else
-      {
-	selface = -1;
-	selelement = -1;
-	selpoint = -1;
-	selpoint2 = -1;
-      }
-
-    glDisable(GL_CLIP_PLANE0);
-
-    selecttimestamp = NextTimeStamp();
-  }
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-  
diff --git a/contrib/Netgen/libsrc/visualization/vsocc.cpp b/contrib/Netgen/libsrc/visualization/vsocc.cpp
deleted file mode 100644
index 12cfc5e179afd01d51730fe68c93f0c7be8c8462..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/vsocc.cpp
+++ /dev/null
@@ -1,743 +0,0 @@
-#ifdef OCCGEOMETRY
-
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-#include <meshing.hpp>
-
-// #include <csg.hpp>
-// #include <stlgeom.hpp>
-
-#include <occgeom.hpp>
-
-#include "TopoDS_Shape.hxx"
-#include "TopoDS_Vertex.hxx"
-#include "TopExp_Explorer.hxx"
-#include "BRep_Tool.hxx"
-#include "TopoDS.hxx"
-#include "gp_Pnt.hxx"
-#include "Geom_Curve.hxx"
-#include "Poly_Triangulation.hxx"
-#include "Poly_Array1OfTriangle.hxx"
-#include "TColgp_Array1OfPnt2d.hxx"
-#include "Poly_Triangle.hxx"
-#include "Poly_Polygon3D.hxx"
-#include "Poly_PolygonOnTriangulation.hxx"
-// #include "BRepMesh.hxx"
-// #include "BRepMesh_IncrementalMesh.hxx"
-
-#include "incvis.hpp"
-
-
-namespace netgen
-{
-#include "mvdraw.hpp"
-
-
-extern OCCGeometry * occgeometry;
-
-
-
-
-/* *********************** Draw OCC Geometry **************** */
-
-
-VisualSceneOCCGeometry :: VisualSceneOCCGeometry ()
-  : VisualScene()
-{
-  trilists.SetSize(0);
-  linelists.SetSize(1);
-
-}
-
-VisualSceneOCCGeometry :: ~VisualSceneOCCGeometry ()
-{
-  ;
-}
-
-void VisualSceneOCCGeometry :: DrawScene ()
-{
-  // int i, j, k;
-
-  if ( occgeometry->changed )
-    {
-      BuildScene();
-      occgeometry -> changed = 0;
-    }
-
-  glClearColor(backcolor, backcolor, backcolor, 1.0);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  SetLight();
-
-  glPushMatrix();
-  glMultMatrixf (transformationmat);
-
-  glShadeModel (GL_SMOOTH);
-  glDisable (GL_COLOR_MATERIAL);
-  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-
-  glEnable (GL_BLEND);
-  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-  //  glEnable (GL_LIGHTING);
-
-  double shine = vispar.shininess;
-  // double transp = vispar.transp;
-
-  glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shine);
-  glLogicOp (GL_COPY);
-
-
-  float mat_col[] = { 0.2f, 0.2f, 0.8f, 1.0f };
-  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-
-  glPolygonOffset (1, 1);
-  glEnable (GL_POLYGON_OFFSET_FILL);
-
-  GLfloat matcoledge[] = { 0, 0, 1, 1 };
-  GLfloat matcolhiedge[] = { 1, 0, 0, 1 };
-
-  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
-		matcoledge);
-  glLineWidth (1.0f);
-
-  if (vispar.occshowedges) glCallList (linelists.Get(1));
-  if (vispar.occshowsurfaces) glCallList (trilists.Get(1));
-
-  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
-		matcolhiedge);
-  glLineWidth (5.0f);
-
-  if (vispar.occshowedges) glCallList (linelists.Get(2));
-
-  for (int i = 1; i <= occgeometry->vmap.Extent(); i++)
-    if (occgeometry->vvispar[i-1].IsHighlighted())
-      {
-	glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
-		      matcolhiedge);
-	glLineWidth (5.0f);
-
-	glBegin (GL_LINES);
-
-	gp_Pnt p = BRep_Tool::Pnt(TopoDS::Vertex(occgeometry->vmap(i)));
-	double d = rad/100;
-	glVertex3f (p.X()-d, p.Y(), p.Z());
-	glVertex3f (p.X()+d, p.Y(), p.Z());
-	glVertex3f (p.X(), p.Y()-d, p.Z());
-	glVertex3f (p.X(), p.Y()+d, p.Z());
-	glVertex3f (p.X(), p.Y(), p.Z()-d);
-	glVertex3f (p.X(), p.Y(), p.Z()+d);
-	glEnd();
-      }
-
-  glDisable (GL_POLYGON_OFFSET_FILL);
- 
-  glPopMatrix();
-  //  DrawCoordinateCross ();
-  //  DrawNetgenLogo ();
-  glFinish();  
-
-  glDisable (GL_POLYGON_OFFSET_FILL);
-}
-
-
-/*
-void VisualSceneOCCGeometry :: BuildScene (int zoomall)
-{
-  int i = 0, j, k;
-  
-  TopExp_Explorer ex, ex_edge;
-
-  if (vispar.occvisproblemfaces || (occgeometry -> changed != 2))
-    {
-      Box<3> bb = occgeometry -> GetBoundingBox();
-
-      center = bb.Center();
-      rad = bb.Diam() / 2;
-  
-
-
-      if (vispar.occvisproblemfaces)
-	{
-	  for (i = 1; i <= occgeometry->fmap.Extent(); i++)
-	    if (occgeometry->facemeshstatus[i-1] == -1)
-	      {
-		GProp_GProps system;	       
-		BRepGProp::LinearProperties(occgeometry->fmap(i), system);
-		gp_Pnt pnt = system.CentreOfMass();
-		center = Point<3> (pnt.X(), pnt.Y(), pnt.Z());
-		cout << "Setting center to mid of face " << i << " = " << center << endl;
-	      }
-	}
-
-
-      CalcTransformationMatrices();
-    }
-  
-
-  for (i = 1; i <= linelists.Size(); i++)
-    glDeleteLists (linelists.Elem(i), 1);
-  linelists.SetSize(0);
-
-  linelists.Append (glGenLists (1));
-  glNewList (linelists.Last(), GL_COMPILE);
-  
-  i = 0;
-  for (ex_edge.Init(occgeometry -> shape, TopAbs_EDGE);
-       ex_edge.More(); ex_edge.Next())
-    {
-      if (BRep_Tool::Degenerated(TopoDS::Edge(ex_edge.Current()))) continue;
-      i++;
-
-      
-      TopoDS_Edge edge = TopoDS::Edge(ex_edge.Current());
-
-      Handle(Poly_PolygonOnTriangulation) aEdgePoly;
-      Handle(Poly_Triangulation) T;
-      TopLoc_Location aEdgeLoc;
-      BRep_Tool::PolygonOnTriangulation(edge, aEdgePoly, T, aEdgeLoc);
-     
-      if(aEdgePoly.IsNull())
-	{
-	  cout << "cannot visualize edge " << i << endl;
-	  continue;
-	}
-
-      glBegin (GL_LINE_STRIP);
-	  
-      int nbnodes = aEdgePoly -> NbNodes();
-      for (j = 1; j <= nbnodes; j++)
-	{
-	  gp_Pnt p = (T -> Nodes())(aEdgePoly->Nodes()(j)).Transformed(aEdgeLoc);
-	  glVertex3f (p.X(), p.Y(), p.Z());
-	}
-      
-      glEnd ();
-      
-   
-      }
-  
-  glEndList ();
-
-  for (i = 1; i <= trilists.Size(); i++)
-    glDeleteLists (trilists.Elem(i), 1);
-  trilists.SetSize(0);
-
-
-  trilists.Append (glGenLists (1));
-  glNewList (trilists.Last(), GL_COMPILE);
-
-  i = 0;
-
-  TopExp_Explorer exp0, exp1, exp2, exp3;
-  int shapenr = 0;
-  for (exp0.Init(occgeometry -> shape, TopAbs_SOLID); exp0.More(); exp0.Next())
-    {
-      shapenr++;
-
-      if (vispar.occshowvolumenr != 0 && 
-	  vispar.occshowvolumenr != shapenr) continue;
-
-      float mat_col[4];
-      mat_col[3] = 1;
-      switch (shapenr)
-	{
-	case 1:
-	  mat_col[0] = 0.2;
-	  mat_col[1] = 0.2;
-	  mat_col[2] = 0.8;
-	  break;
-	case 2:
-	  mat_col[0] = 0.8;
-	  mat_col[1] = 0.2;
-	  mat_col[2] = 0.8;
-	  break;
-	case 3:
-	  mat_col[0] = 0.2;
-	  mat_col[1] = 0.8;
-	  mat_col[2] = 0.8;
-	  break;
-	case 4:
-	  mat_col[0] = 0.8;
-	  mat_col[1] = 0.2;
-	  mat_col[2] = 0.2;
-	  break;
-	case 5:
-	  mat_col[0] = 0.8;
-	  mat_col[1] = 0.8;
-	  mat_col[2] = 0.8;
-	  break;
-	case 6:
-	  mat_col[0] = 0.6;
-	  mat_col[1] = 0.6;
-	  mat_col[2] = 0.6;
-	  break;
-	case 7:
-	  mat_col[0] = 0.2;
-	  mat_col[1] = 0.8;
-	  mat_col[2] = 0.2;
-	  break;
-	case 8:
-	  mat_col[0] = 0.8;
-	  mat_col[1] = 0.8;
-	  mat_col[2] = 0.2;
-	  break;
-	default:
-	  //	  mat_col[0] = 1-(1.0/double(shapenr));
-	  //	  mat_col[1] = 0.5;
-	  mat_col[0] = 0.5+double((shapenr*shapenr*shapenr*shapenr) % 10)/20.0;
-	  mat_col[1] = 0.5+double(int(shapenr*shapenr*shapenr*shapenr*sin(double(shapenr))) % 10)/20.0;
-	  mat_col[2] = 0.5+double((shapenr*shapenr*shapenr) % 10)/20.0;
-	}
-
-      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-
-      for (exp1.Init(exp0.Current(), TopAbs_SHELL); exp1.More(); exp1.Next())
-	for (exp2.Init(exp1.Current().Composed(exp0.Current().Orientation()), TopAbs_FACE); exp2.More(); exp2.Next())
-	  {
-	    TopoDS_Face face = TopoDS::Face (exp2.Current().Composed(exp1.Current().Orientation()));
-	    
-	    i = occgeometry->fmap.FindIndex(face);
-
-	    TopLoc_Location loc;
-	    Handle(Geom_Surface) surf = BRep_Tool::Surface (face);
-	    BRepAdaptor_Surface sf(face, Standard_False);
-	    BRepLProp_SLProps prop(sf, 1, 1e-5);
-	    Handle(Poly_Triangulation) triangulation = BRep_Tool::Triangulation (face, loc);
-	    
-	    if (triangulation.IsNull()) 
-	      {
-		cout << "cannot visualize face " << i << endl;
-		continue;
-	      }
-
-	    if (vispar.occvisproblemfaces)
-	      {
-		switch (occgeometry->facemeshstatus[i-1])
-		  {
-		  case 0:
-		    mat_col[0] = 0.2;
-		    mat_col[1] = 0.2;
-		    mat_col[2] = 0.8;
-		    break;		
-		  case 1:
-		    mat_col[0] = 0.2;
-		    mat_col[1] = 0.8;
-		    mat_col[2] = 0.2;
-		    break;		
-		  case -1:
-		    mat_col[0] = 0.8;
-		    mat_col[1] = 0.2;
-		    mat_col[2] = 0.2;
-		    break;		
-		  }
-		glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-
-      	      }
-	    glBegin (GL_TRIANGLES);
-	    
-	    int ntriangles = triangulation -> NbTriangles();
-	    for (j = 1; j <= ntriangles; j++)
-	      {
-		Poly_Triangle triangle = (triangulation -> Triangles())(j);
-		for (k = 1; k <= 3; k++)
-		  {
-		    gp_Pnt2d uv = (triangulation -> UVNodes())(triangle(k));
-		    gp_Pnt pnt;
-		    gp_Vec du, dv;
-		    prop.SetParameters (uv.X(), uv.Y());
-		    surf->D0 (uv.X(), uv.Y(), pnt);
-		    gp_Vec n;
-		    
-		    if (prop.IsNormalDefined())
-		      n = prop.Normal();
-		    else
-		      n = gp_Vec (0,0,0);
-		    
-		    if (face.Orientation() == TopAbs_REVERSED) n *= -1;
-		    glNormal3f (n.X(), n.Y(), n.Z());
-		    glVertex3f (pnt.X(), pnt.Y(), pnt.Z());
-		  }
-	      }
-	    glEnd ();
-
-	  }
-    }
-
-
-  glEndList ();
-
-}
-*/
-
-
-void VisualSceneOCCGeometry :: BuildScene (int zoomall)
-{
-  if (occgeometry -> changed == OCCGEOMETRYVISUALIZATIONFULLCHANGE)
-    {
-      center = occgeometry -> Center();
-      rad = occgeometry -> GetBoundingBox().Diam() / 2;
-
-      if (vispar.occzoomtohighlightedentity)
-	{
-	  bool hilite = false;
-	  bool hiliteonepoint = false;
-	  Bnd_Box bb;
-
-	  for (int i = 1; i <= occgeometry->fmap.Extent(); i++)
-	    if (occgeometry->fvispar[i-1].IsHighlighted())
-	      {
-		hilite = true;
-		BRepBndLib::Add (occgeometry->fmap(i), bb);
-	      }
-
-	  for (int i = 1; i <= occgeometry->emap.Extent(); i++)
-	    if (occgeometry->evispar[i-1].IsHighlighted())
-	      {
-		hilite = true;
-		BRepBndLib::Add (occgeometry->emap(i), bb);
-	      }
-
-	  for (int i = 1; i <= occgeometry->vmap.Extent(); i++)
-	    if (occgeometry->vvispar[i-1].IsHighlighted())
-	      {
-		hiliteonepoint = true;
-		BRepBndLib::Add (occgeometry->vmap(i), bb);
-	      }
-
-	  if (hilite || hiliteonepoint)
-	    {
-	      double x1,y1,z1,x2,y2,z2;
-	      bb.Get (x1,y1,z1,x2,y2,z2);
-	      Point<3> p1 = Point<3> (x1,y1,z1);
-	      Point<3> p2 = Point<3> (x2,y2,z2);
-	      Box<3> boundingbox(p1,p2);
-	      
-	      center = boundingbox.Center();
-	      if (hiliteonepoint)
-		rad = occgeometry -> GetBoundingBox().Diam() / 100; 
-	      else
-		rad = boundingbox.Diam() / 2;
-	    }
-	}
-  
-      CalcTransformationMatrices();
-    }
-  
-
-  // Clear lists
-
-  for (int i = 1; i <= linelists.Size(); i++)
-    glDeleteLists (linelists.Elem(i), 1);
-  linelists.SetSize(0);
-
-  for (int i = 1; i <= trilists.Size(); i++)
-    glDeleteLists (trilists.Elem(i), 1);
-  trilists.SetSize(0);
-
-
-  // Total wireframe
-
-  linelists.Append (glGenLists (1));
-  glNewList (linelists.Last(), GL_COMPILE);
- 
-  for (int i = 1; i <= occgeometry->emap.Extent(); i++)
-    {
-      TopoDS_Edge edge = TopoDS::Edge(occgeometry->emap(i));
-      if (BRep_Tool::Degenerated(edge)) continue;
-      if (occgeometry->evispar[i-1].IsHighlighted()) continue;
-
-      Handle(Poly_PolygonOnTriangulation) aEdgePoly;
-      Handle(Poly_Triangulation) T;
-      TopLoc_Location aEdgeLoc;
-      BRep_Tool::PolygonOnTriangulation(edge, aEdgePoly, T, aEdgeLoc);
-     
-      if(aEdgePoly.IsNull())
-	{
-	  (*testout) << "visualizing edge " << occgeometry->emap.FindIndex (edge)
-		     << " without using the occ visualization triangulation" << endl;
-
-	  double s0, s1;
-	  Handle(Geom_Curve) c = BRep_Tool::Curve(edge, s0, s1);
-	  
-	  glBegin (GL_LINE_STRIP);
-	  for (int i = 0; i<=50; i++)
-	    {
-	      gp_Pnt p = c->Value (s0 + i*(s1-s0)/50.0);
-	      glVertex3f (p.X(),p.Y(),p.Z());
-	    }
-	  glEnd ();
-
-	  continue;
-	}
-
-      int nbnodes = aEdgePoly -> NbNodes();
-      glBegin (GL_LINE_STRIP);
-      for (int j = 1; j <= nbnodes; j++)
-	{
-	  gp_Pnt p = (T -> Nodes())(aEdgePoly->Nodes()(j)).Transformed(aEdgeLoc);
-	  glVertex3f (p.X(), p.Y(), p.Z());
-	}
-      glEnd ();
-    }
-  
-  glEndList ();
-
-
-  // Highlighted edge list
-
-  linelists.Append (glGenLists (1));
-  glNewList (linelists.Last(), GL_COMPILE);
- 
-  for (int i = 1; i <= occgeometry->emap.Extent(); i++)
-    if (occgeometry->evispar[i-1].IsHighlighted())
-      {
-	TopoDS_Edge edge = TopoDS::Edge(occgeometry->emap(i));
-	if (BRep_Tool::Degenerated(edge)) continue;
-
-	Handle(Poly_PolygonOnTriangulation) aEdgePoly;
-	Handle(Poly_Triangulation) T;
-	TopLoc_Location aEdgeLoc;
-	BRep_Tool::PolygonOnTriangulation(edge, aEdgePoly, T, aEdgeLoc);
-     
-	if(aEdgePoly.IsNull())
-	  {
-	    (*testout) << "visualizing edge " << occgeometry->emap.FindIndex (edge)
-		       << " without using the occ visualization triangulation" << endl;
-
-	    double s0, s1;
-	    Handle(Geom_Curve) c = BRep_Tool::Curve(edge, s0, s1);
-	    
-	    glBegin (GL_LINE_STRIP);
-	    for (int i = 0; i<=50; i++)
-	      {
-		gp_Pnt p = c->Value (s0 + i*(s1-s0)/50.0);
-		glVertex3f (p.X(),p.Y(),p.Z());
-	      }
-	    glEnd ();
-	    
-	    continue;
-	  }
-
-	int nbnodes = aEdgePoly -> NbNodes();
-	glBegin (GL_LINE_STRIP);
-	for (int j = 1; j <= nbnodes; j++)
-	  {
-	    gp_Pnt p = (T -> Nodes())(aEdgePoly->Nodes()(j)).Transformed(aEdgeLoc);
-	    glVertex3f (p.X(), p.Y(), p.Z());
-	  }
-	glEnd ();
-      }
-  
-  glEndList ();
-
-
-
-
-
-  // display faces
-
-  trilists.Append (glGenLists (1));
-  glNewList (trilists.Last(), GL_COMPILE);
-
-  for (int i = 1; i <= occgeometry->fmap.Extent(); i++)
-    {
-      glLoadName (i);
-      float mat_col[4];
-      mat_col[3] = 1;
-
-      if (!occgeometry->fvispar[i-1].IsHighlighted())
-	{
-	  mat_col[0] = 0.2;
-	  mat_col[1] = 0.2;
-	  mat_col[2] = 0.8;
-	}
-      else
-	{
-	  mat_col[0] = 0.8;
-	  mat_col[1] = 0.2;
-	  mat_col[2] = 0.2;
-	}
-
-      glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_col);
-
-      TopoDS_Face face = TopoDS::Face(occgeometry->fmap(i));
-      TopLoc_Location loc;
-      Handle(Geom_Surface) surf = BRep_Tool::Surface (face);
-      BRepAdaptor_Surface sf(face, Standard_False);
-      BRepLProp_SLProps prop(sf, 1, 1e-5);
-      Handle(Poly_Triangulation) triangulation = BRep_Tool::Triangulation (face, loc);
-	    
-      if (triangulation.IsNull()) 
-	{
-	  cout << "cannot visualize face " << i << endl;
-	  occgeometry->fvispar[i-1].SetNotDrawable();
-	  continue;
-	}
-      
-      gp_Pnt2d uv;
-      gp_Pnt pnt;
-      gp_Vec n;
-
-      glBegin (GL_TRIANGLES);
-	    
-      int ntriangles = triangulation -> NbTriangles();
-      for (int j = 1; j <= ntriangles; j++)
-	{
-	  Poly_Triangle triangle = (triangulation -> Triangles())(j);
-	  for (int k = 1; k <= 3; k++)
-	    {
-	      uv = (triangulation -> UVNodes())(triangle(k));
-	      prop.SetParameters (uv.X(), uv.Y());
-
-	      pnt = (triangulation -> Nodes())(triangle(k)).Transformed(loc);
-
-	      //	      surf->D0 (uv.X(), uv.Y(), pnt);
-	      		    
-	      if (prop.IsNormalDefined())
-		n = prop.Normal();
-	      else
-		{
-		  (*testout) << "Visualization of face " << i
-			     << ": Normal vector not defined" << endl;
-		  n = gp_Vec (0,0,0);
-		}
-		    
-	      if (face.Orientation() == TopAbs_REVERSED) n *= -1;
-	      glNormal3f (n.X(), n.Y(), n.Z());
-	      glVertex3f (pnt.X(), pnt.Y(), pnt.Z());
-	    }
-	}
-      glEnd ();
-      
-    }
-  glEndList ();
-
-}
-
-void SelectFaceInOCCDialogTree (int facenr);
-
-void VisualSceneOCCGeometry :: MouseDblClick (int px, int py)
-{
-  int hits;
-
-  // select surface triangle by mouse click
-
-  GLuint selbuf[10000];
-  glSelectBuffer (10000, selbuf);
-
-
-  glRenderMode (GL_SELECT);
-
-  GLint viewport[4];
-  glGetIntegerv (GL_VIEWPORT, viewport);
-
-
-  glMatrixMode (GL_PROJECTION); 
-  glPushMatrix();
-
-  GLdouble projmat[16];
-  glGetDoublev (GL_PROJECTION_MATRIX, projmat);
-
-  glLoadIdentity(); 
-  gluPickMatrix (px, viewport[3] - py, 1, 1, viewport); 
-  glMultMatrixd (projmat);
-  
-
-
-  glClearColor(backcolor, backcolor, backcolor, 1.0);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-  glMatrixMode (GL_MODELVIEW); 
-
-  glPushMatrix();
-  glMultMatrixf (transformationmat);
-
-
-
-  glInitNames();
-  glPushName (1);
-
-  glPolygonOffset (1, 1);
-  glEnable (GL_POLYGON_OFFSET_FILL);
-
-  glDisable(GL_CLIP_PLANE0);
-  
-  glCallList (trilists.Get(1));
-
-  glDisable (GL_POLYGON_OFFSET_FILL);
-  
-  glPopName();
-
-  glMatrixMode (GL_PROJECTION); 
-  glPopMatrix();
-
-  glMatrixMode (GL_MODELVIEW); 
-  glPopMatrix();
-
-  glFlush();  
-
-	
-  hits = glRenderMode (GL_RENDER);
-
-  int minname = 0;
-  GLuint mindepth = 0;
-
-  // find clippingplane
-  GLuint clipdepth = 0; // GLuint(-1);
-
-  for (int i = 0; i < hits; i++)
-    {
-      int curname = selbuf[4*i+3];
-      if (!curname) clipdepth = selbuf[4*i+1];
-    }
-
-  for (int i = 0; i < hits; i++)
-    {
-      int curname = selbuf[4*i+3];
-      GLuint curdepth = selbuf[4*i+1];
-      if (curname && (curdepth > clipdepth) &&
-	  (curdepth < mindepth || !minname))
-	{
-	  mindepth = curdepth;
-	  minname = curname;
-	}
-    }
-
-  occgeometry->LowLightAll();
-
-  if (minname)
-    {
-      occgeometry->fvispar[minname-1].Highlight();
-      
-      if (vispar.occzoomtohighlightedentity)
-	occgeometry->changed = OCCGEOMETRYVISUALIZATIONFULLCHANGE;
-      else
-	occgeometry->changed = OCCGEOMETRYVISUALIZATIONHALFCHANGE;
-      cout << "Selected face: " << minname << endl;
-    }
-  else
-    {
-      occgeometry->changed = OCCGEOMETRYVISUALIZATIONHALFCHANGE;
-    }
-
-  glDisable(GL_CLIP_PLANE0);
-
-  SelectFaceInOCCDialogTree (minname);
-
-
-  //  selecttimestamp = NextTimeStamp();
-}
-
-
-
-
-
-
-}
-
-
-
-#endif
-
-
diff --git a/contrib/Netgen/libsrc/visualization/vssolution.cpp b/contrib/Netgen/libsrc/visualization/vssolution.cpp
deleted file mode 100644
index 62b6faab834af451c04acf80f2294f148999a60b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/vssolution.cpp
+++ /dev/null
@@ -1,3005 +0,0 @@
-#include <mystdlib.h>
-#include "incvis.hpp"
-
-
-#include <myadt.hpp>
-#include <meshing.hpp>
-#include <csg.hpp>
-#include <stlgeom.hpp>
-
-#include <visual.hpp>
-
-
-namespace netgen
-{
-
-  extern AutoPtr<Mesh> mesh;
-
-
-  VisualSceneSolution :: SolData :: SolData ()
-    : name (0), data (0), solclass(0)
-  { ; }
-
-  VisualSceneSolution :: SolData :: ~SolData ()
-  {
-    delete [] name;
-    delete data;
-    delete solclass;
-  }
-
-  
-  VisualSceneSolution :: VisualSceneSolution ()
-    : VisualScene()
-  {
-    surfellist = 0;
-    linelist = 0;
-    clipplanelist = 0;
-    isolinelist = 0;
-    clipplane_isolinelist = 0;
-    surface_vector_list = 0;
-    cone_list = 0;
-
-    surfeltimestamp = GetTimeStamp();
-    surfellinetimestamp = GetTimeStamp();
-    clipplanetimestamp = GetTimeStamp();
-    solutiontimestamp = GetTimeStamp();
-    fieldlinestimestamp = GetTimeStamp();
-    surface_vector_timestamp = GetTimeStamp();
-    AddVisualizationScene ("solution", &vssolution);
-  }
-  
-  VisualSceneSolution :: ~VisualSceneSolution ()
-  {
-    ClearSolutionData();
-  }
-
-  void VisualSceneSolution :: AddSolutionData (SolData * sd)
-  {
-    int funcnr = -1;
-    for (int i = 0; i < soldata.Size(); i++)
-      {
-	if (strcmp (soldata[i]->name, sd->name) == 0)
-	  {
-	    delete soldata[i];
-	    soldata[i] = sd;
-	    funcnr = i;
-	    break;
-	  }
-      }
-
-    if (funcnr == -1)
-      {
-	soldata.Append (sd);
-	funcnr = soldata.Size()-1;
-      }
-    
-    SolData * nsd = soldata[funcnr];
-
-    nsd->size = 0;
-    if (mesh)
-      {
-	switch (nsd->soltype)
-	  {
-	  case SOL_NODAL: nsd->size = mesh->GetNV(); break;
-	  case SOL_ELEMENT: nsd->size = mesh->GetNE(); break;
-	  case SOL_SURFACE_ELEMENT: nsd->size = mesh->GetNSE(); break;
-	  case SOL_NONCONTINUOUS: 
-	    {
-	      switch (nsd->order)
-		{
-		case 0: nsd->size =      mesh->GetNE(); break;
-		case 1: nsd->size =  6 * mesh->GetNE(); break;
-		case 2: nsd->size = 18 * mesh->GetNE(); break;
-		}
-	      break;
-	    }
-	  case SOL_SURFACE_NONCONTINUOUS: 
-	    {
-	      switch (nsd->order)
-		{
-		case 0: nsd->size =     mesh->GetNSE(); break;
-		case 1: nsd->size = 4 * mesh->GetNSE(); break;
-		case 2: nsd->size = 9 * mesh->GetNSE(); break;
-		}
-	      break;
-	    }
-	  }
-	solutiontimestamp = NextTimeStamp();
-      }
-  }
-
-  
-  void VisualSceneSolution :: ClearSolutionData ()
-  {
-    for (int i = 0; i < soldata.Size(); i++)
-      delete soldata[i];
-    soldata.SetSize (0);
-  }
-
-  void VisualSceneSolution :: UpdateSolutionTimeStamp ()
-  {
-    solutiontimestamp = NextTimeStamp();
-  }
-    
-  VisualSceneSolution::SolData * VisualSceneSolution :: GetSolData (int i)
-  { 
-    if (i >= 0 && i < soldata.Size())
-      return soldata[i];
-    else 
-      return NULL;
-  }
-  
-
-
-
-  void VisualSceneSolution :: SaveSolutionData (const char * filename) 
-  {
-    PrintMessage (1, "Write solution data to file ", filename);
-    int i, j, k;
-
-    ofstream ost(filename);
-    for (i = 0; i < soldata.Size(); i++)
-    {
-      const SolData & sol = *soldata[i];
-      
-      ost << "solution " 
-	  << sol.name
-	  << " -size=" << sol.size 
-	  << " -components=" << sol.components
-	  << " -order=" << sol.order;
-      if (sol.iscomplex)
-	ost << " -complex";
-      
-      switch (sol.soltype)
-	{
-	case SOL_NODAL:
-	  ost << " -type=nodal"; break;
-	case SOL_ELEMENT:
-	  ost << " -type=element"; break;
-	case SOL_SURFACE_ELEMENT:
-	  ost << " -type=surfaceelement"; break;
-	case SOL_NONCONTINUOUS:
-	  ost << " -type=noncontinuous"; break;
-	case SOL_SURFACE_NONCONTINUOUS:
-	  ost << " -type=surfacenoncontinuous"; break;
-	}
-      
-      ost << endl;
-      for (j = 0; j < sol.size; j++)
-	{
-	  for (k = 0; k < sol.components; k++)
-	    ost << sol.data[j*sol.dist+k] << " ";
-	  ost << "\n";
-	}
-    }
-  }
-  
-
-
-
-  void VisualSceneSolution :: DrawScene ()
-  {
-    if (!mesh) 
-      {
-	VisualScene::DrawScene();      
-	return;
-      }
-
-    static NgLock mem_lock(mem_mutex);
-    mem_lock.Lock();
-
-    NgLock meshlock (mesh->Mutex(), 1);
-
-    BuildScene();
-
-    CreateTexture (numtexturecols, lineartexture, GL_MODULATE);
-
-    glClearColor(backcolor, backcolor, backcolor, 1);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-    SetLight();
-    
-    glPushMatrix();
-    glMultMatrixf (transformationmat);
-
-  
-
-    glMatrixMode (GL_MODELVIEW); 
-    
-    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
-    
-    // glPolygonOffset (1, 1);
-    glPolygonOffset (2, 10);
-    glEnable (GL_POLYGON_OFFSET_FILL);
-
-    glEnable (GL_COLOR_MATERIAL);
-
-
-    if (usetexture)
-      glEnable (GL_TEXTURE_1D);
-
-
-    if (vispar.drawfilledtrigs || vispar.drawtetsdomain > 0 || vispar.drawdomainsurf > 0)
-      {
-	SetClippingPlane ();
-	
-	glCallList (surfellist);
-	glCallList (surface_vector_list);
-      
-	glDisable(GL_CLIP_PLANE0);
-      }
-
-    if (showclipsolution)
-      glCallList (clipplanelist);
-
-
-    if (draw_fieldlines)
-      {
-	BuildFieldLinesPlot ();
-
-	if (num_fieldlineslists <= 1)
-	  glCallList (fieldlineslist);
-	else
-	  {  // animated
-	    int start = int (time / 10 * num_fieldlineslists);
-	    for (int ln = 0; ln < 10; ln++)
-	      {
-		int nr = fieldlineslist + (start + ln) % num_fieldlineslists;
-		glCallList (nr);
-	      }
-	  }
-      }
-
-    if (usetexture)
-      glDisable (GL_TEXTURE_1D);
-
-
-
-    glDisable (GL_POLYGON_OFFSET_FILL);
-    
-    glDisable (GL_COLOR_MATERIAL);
-    
-    
-    GLfloat matcol0[] = { 0, 0, 0, 1 };
-    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, matcol0);
-    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, matcol0);
-    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matcol0);
-    
-    glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
-    glLineWidth (1.0f);
-    glColor3f (0.0f, 0.0f, 0.0f);
-    glDisable (GL_LINE_SMOOTH);
-
-
-    if (vispar.drawoutline && !numisolines)
-      {
-	SetClippingPlane ();
-	glCallList (linelist);
-       	glDisable(GL_CLIP_PLANE0);
-      }
-
-    if (numisolines)
-      {
-	SetClippingPlane ();
-	glCallList (isolinelist);
-
-	glDisable(GL_CLIP_PLANE0);
-	glCallList (clipplane_isolinelist);
-      }
-
-    glPopMatrix();
-    
-    glDisable(GL_CLIP_PLANE0);
-    DrawColorBar (minval, maxval, logscale, lineartexture);
-    
-    if (vispar.drawcoordinatecross)
-      DrawCoordinateCross ();
-    DrawNetgenLogo ();
-    
-    glFinish();  
-
-    
-    // delete lock;
-    mem_lock.UnLock();
-  }
-  
-
-
-  static void RealVec3d (const double * values, Vec3d & v, 
-		  bool iscomplex, bool imag)
-  {
-    if (!iscomplex)
-      {
-	v.X() = values[0];
-	v.Y() = values[1];
-	v.Z() = values[2];
-      }
-    else
-      {
-	if (!imag)
-	  {
-	    v.X() = values[0];
-	    v.Y() = values[2];
-	    v.Z() = values[4];
-	  }
-	else
-	  {
-	    v.X() = values[1];
-	    v.Y() = values[3];
-	    v.Z() = values[5];
-	  }
-      }
-  }
-
-
-  static void RealVec3d (const double * values, Vec3d & v, 
-			 bool iscomplex, double phaser, double phasei)
-  {
-    if (!iscomplex)
-      {
-	v.X() = values[0];
-	v.Y() = values[1];
-	v.Z() = values[2];
-      }
-    else
-      {
-	for (int i = 0; i < 3; i++)
-	  v.X(i+1) = phaser * values[2*i] + phasei * values[2*i+1];
-      }
-  }
-
-
-  
-
-  void VisualSceneSolution :: BuildScene (int zoomall)
-  {
-    int i, j, k;
- 
-    if (!mesh)
-      {
-	VisualScene::BuildScene (zoomall);
-	return;
-      }
-    
-    if (!cone_list)
-      {
-	cone_list = glGenLists (1);
-	glNewList (cone_list, GL_COMPILE);
-	DrawCone (Point<3> (0,0,0), Point<3> (0,0,1), 0.4);
-	glEndList();
-      }
-
-    
-    vispar.colormeshsize = 1;
-    
-    // recalc clipping plane
-    SetClippingPlane ();
-    glDisable(GL_CLIP_PLANE0);
-    
-    
-    SolData * sol = NULL;
-    SolData * vsol = NULL;
-  
-    if (scalfunction != -1) 
-      sol = soldata[scalfunction];
-    if (vecfunction != -1)
-      vsol = soldata[vecfunction];
-
-  if (mesh->GetTimeStamp () > solutiontimestamp)
-    {
-      sol = NULL;
-      vsol = NULL;
-    }
-
-
-  if (sol && sol->solclass) sol->solclass->SetMultiDimComponent (multidimcomponent);
-  if (vsol && vsol->solclass) vsol->solclass->SetMultiDimComponent (multidimcomponent);
-
-  if (!autoscale || scalfunction == -1)
-    {
-      minval = mminval;
-      maxval = mmaxval;
-    }
-  else
-    {
-      if (mesh->GetTimeStamp () > surfeltimestamp ||
-	  vispar.clipplanetimestamp > clipplanetimestamp ||
-	  solutiontimestamp > surfeltimestamp)
-	{
-	  GetMinMax (scalfunction, scalcomp, minval, maxval);
-	}
-    }
- 
-
-  if (mesh->GetTimeStamp() > surfeltimestamp ||
-      solutiontimestamp > surfeltimestamp || 
-      zoomall)
-    {
-      if (mesh->GetTimeStamp() > surfeltimestamp ||
-	  zoomall)
-	{
-	  // mesh has changed
-	  
-	  Point3d pmin, pmax;
-	  static double oldrad = 0;
-	  
-	  mesh->GetBox (pmin, pmax, -1);
-	  center = Center (pmin, pmax);
-	  rad = 0.5 * Dist (pmin, pmax);
-	  
-	  glEnable (GL_NORMALIZE);
-	  
-	  if (rad > 1.5 * oldrad ||
-	      mesh->GetMajorTimeStamp() > surfeltimestamp ||
-	      zoomall)
-	    {
-	      CalcTransformationMatrices();
-	      oldrad = rad;
-	    }
-	}
-
-      if (surfellist)
-	glDeleteLists (surfellist, 1);
-      
-      surfellist = glGenLists (1);
-      glNewList (surfellist, GL_COMPILE);
-      
-	  DrawSurfaceElements();
-      
-      glEndList ();
-      
-      surfeltimestamp = max2 (solutiontimestamp, mesh->GetTimeStamp());
-    }
-
-
-  if (mesh->GetTimeStamp() > surfellinetimestamp ||
-      solutiontimestamp > surfellinetimestamp || 
-      zoomall)
-    {
-      if (linelist)
-	glDeleteLists (linelist, 1);
-      
-      linelist = glGenLists (1);
-      glNewList (linelist, GL_COMPILE);
-      
-      DrawSurfaceElementLines();
-      
-      glEndList ();
-      
-      surfellinetimestamp = max2 (solutiontimestamp, mesh->GetTimeStamp());
-    }
-
-  
-
-  if (mesh->GetTimeStamp() > surface_vector_timestamp ||
-      solutiontimestamp > surface_vector_timestamp ||
-      zoomall)
-    {
-      if (surface_vector_list)
-	glDeleteLists (surface_vector_list, 1);
-      
-      surface_vector_list = glGenLists (1);
-      glNewList (surface_vector_list, GL_COMPILE);
-
-      glEnable (GL_NORMALIZE);
-      DrawSurfaceVectors();
-
-      glEndList ();
-
-      surface_vector_timestamp = 
-	max2 (mesh->GetTimeStamp(), solutiontimestamp);
-    }
-
-
-  if (clipplanetimestamp < vispar.clipplanetimestamp ||
-      clipplanetimestamp < solutiontimestamp)
-    {
-
-      //      cout << "clipsolution = " << clipsolution << endl;
-      if (vispar.clipenable && clipsolution)      
-	{
-	  // lock->UnLock();
-	  NgLock mlock (mesh->Mutex(), 0);
-	  mlock.UnLock();
-	  mesh->BuildElementSearchTree();
-	  mlock.Lock();
-
-	  // lock->Lock();
-	}
-
-      if (clipplanelist)
-	glDeleteLists (clipplanelist, 1);
-      
-
-      clipplanelist = glGenLists (1);
-      glNewList (clipplanelist, GL_COMPILE);
-      
-      if (vispar.clipenable && clipsolution == 1 && sol)
-	{
-	  glDisable(GL_CLIP_PLANE0);
-	  
-	  ARRAY<ClipPlaneTrig> cpt;
-	  GetClippingPlaneTrigs (cpt);
-	  
-	  glNormal3d (-clipplane[0], -clipplane[1], -clipplane[2]);
-	  
-	  glBegin (GL_TRIANGLES);
-	  for (i = 0; i < cpt.Size(); i++)
-	    DrawClipPlaneTrig (sol, scalcomp, cpt[i], 0); // 2*subdivisions);
-	  glEnd();
-
-	  glEnable(GL_CLIP_PLANE0);
-	}
-      
-      
-      if (vispar.clipenable && clipsolution == 2 && vsol)
-	{
-	  if (autoscale)
-	    GetMinMax (vecfunction, 0, minval, maxval);
-
-
-	  bool drawelem;
-	  ARRAY<ClipPlanePoint> cpp;
-	  GetClippingPlaneGrid (cpp);
-
-	  for (i = 0; i < cpp.Size(); i++)
-	    {
-	      const ClipPlanePoint & p = cpp[i];
-	      double values[6];
-	      Vec3d v;
-
-	      drawelem = GetValues (vsol, p.elnr, p.lam1, p.lam2, p.lam3, values);
-	      RealVec3d (values, v, vsol->iscomplex, imag_part);
-
-	      double val = v.Length();
-
-	      // "drawelem": added 07.04.2004 (FB)
-	      if (drawelem && val > 1e-10 * maxval)
-		{
-		  v *= (rad / val / gridsize * 0.5);
-		  
-		  SetOpenGlColor  (val, minval, maxval, logscale);
-		  DrawCone (p.p, p.p+v, rad / gridsize * 0.2);
-		}
-	    }
-	}
-
-      glEndList ();
-    }
-
-  if (
-      numisolines && 
-      (clipplanetimestamp < vispar.clipplanetimestamp ||
-       clipplanetimestamp < solutiontimestamp) 
-      )
-    {
-      if (isolinelist) glDeleteLists (isolinelist, 1);
-      
-      isolinelist = glGenLists (1);
-      glNewList (isolinelist, GL_COMPILE);
-
-      Point<3> points[1100];
-      double values[1100];
-      
-      int nse = mesh->GetNSE();
-
-      if (sol)
-	{
-	  glBegin (GL_LINES);
-	  
-	  for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-	    {
-	      const Element2d & el = (*mesh)[sei];
-	      
-	      if (el.GetType() == TRIG || el.GetType() == TRIG6)
-		{
-		  Point<3> lp1, lp2, lp3;
-		  if (!mesh->GetCurvedElements().IsHighOrder())
-		    {
-		      GetPointDeformation (el[0]-1, lp1);
-		      GetPointDeformation (el[1]-1, lp2);
-		      GetPointDeformation (el[2]-1, lp3);
-		    }
-		  
-		  int n = 1 << subdivisions;
-		  int ii = 0;
-		  int ix, iy;
-		  for (iy = 0; iy <= n; iy++)
-		    for (ix = 0; ix <= n-iy; ix++)
-		      {
-			double x = double(ix) / n;
-			double y = double(iy) / n;
-			
-			// TODO: consider return value (bool: draw/don't draw element)
-			GetSurfValue (sol, sei, x, y, scalcomp, values[ii]);
-			Point<2> xref(x,y);
-			
-			if (mesh->GetCurvedElements().IsHighOrder())
-			  mesh->GetCurvedElements().
-			    CalcSurfaceTransformation (xref, sei, points[ii]);
-			else
-			  points[ii] = lp3 + x * (lp1-lp3) + y * (lp2-lp3);
-			
-			if (deform)
-			  {
-			    Vec<3> def;
-			    GetSurfDeformation (sei, x, y, def);
-			    points[ii] += def;
-			  }
-			ii++;
-		      }
-		  
-		  ii = 0;
-		  for (iy = 0; iy < n; iy++, ii++)
-		    for (ix = 0; ix < n-iy; ix++, ii++)
-		      {
-			int index[] = { ii, ii+1, ii+n-iy+1,
-					ii+1, ii+n-iy+2, ii+n-iy+1 };
-			
-			DrawIsoLines (points[index[0]], points[index[1]], points[index[2]],
-				      values[index[0]], values[index[1]], values[index[2]],
-				      minval, maxval, numisolines);
-			if (ix < n-iy-1) 
-			  DrawIsoLines (points[index[3]], points[index[4]], points[index[5]],
-				      values[index[3]], values[index[4]], values[index[5]],
-					minval, maxval, numisolines);
-		      }    
-		}
-	      
-	      
-	      if (el.GetType() == QUAD || el.GetType() == QUAD6 || el.GetType() == QUAD8 )
-		{
-		  Point<3> lpi[4];
-		  Vec<3> vx, vy, vtwist, def;
-		  if (!mesh->GetCurvedElements().IsHighOrder())
-		    {
-		      for (int j = 0; j < 4; j++)
-			GetPointDeformation (el[j]-1, lpi[j]);
-		      vx = lpi[1]-lpi[0];
-		      vy = lpi[3]-lpi[0];
-		      vtwist = (lpi[0]-lpi[1]) + (lpi[2]-lpi[3]);
-		    }
-
-		  int n = 1 << subdivisions;
-		  int ix, iy, ii = 0;
-		  for (iy = 0; iy <= n; iy++)
-		    for (ix = 0; ix <= n; ix++, ii++)
-		      {
-			double x = double(ix) / n;
-			double y = double(iy) / n;
-			
-			// TODO: consider return value (bool: draw/don't draw element)
-			GetSurfValue (sol, sei, x, y, scalcomp, values[ii]);
-			Point<2> xref(x,y);
-			
-			if (mesh->GetCurvedElements().IsHighOrder())
-			  mesh->GetCurvedElements().
-			    CalcSurfaceTransformation (xref, sei, points[ii]);
-			else
-			  points[ii] = lpi[0] + x * vx + y * vy + x*y * vtwist;
-			
-			if (deform)
-			  {
-			    GetSurfDeformation (sei, x, y, def);
-			    points[ii] += def;
-			  }
-		      }
-		  
-		  ii = 0;
-		  for (iy = 0; iy < n; iy++, ii++)
-		    for (ix = 0; ix < n; ix++, ii++)
-		      {
-			DrawIsoLines (points[ii], points[ii+1], points[ii+n+1],
-				      values[ii], values[ii+1], values[ii+n+1],
-				      minval, maxval, numisolines);
-			DrawIsoLines (points[ii+1], points[ii+n+2], points[ii+n+1],
-				      values[ii+1], values[ii+n+2], values[ii+n+1],
-				      minval, maxval, numisolines);
-		      }	
-		}
-	    }
-	  glEnd();
-	}
-      glEndList ();
-
-      if (clipplane_isolinelist) glDeleteLists (clipplane_isolinelist, 1);
-            
-      if (vispar.clipenable && clipsolution == 1 && sol)
-	{
-	  clipplane_isolinelist = glGenLists (1);
-	  glNewList (clipplane_isolinelist, GL_COMPILE);
-
-	  ARRAY<ClipPlaneTrig> cpt;
-	  GetClippingPlaneTrigs (cpt);
-	  bool drawelem;
-	  
-	  glNormal3d (-clipplane[0], -clipplane[1], -clipplane[2]);
-	  
-	  if (numisolines)
-	    for (i = 0; i < cpt.Size(); i++)
-	      {
-		const ClipPlaneTrig & trig = cpt[i];
-		double vali[3];
-		for (j = 0; j < 3; j++)
-		  drawelem = GetValue (sol, trig.elnr, 
-				       trig.points[j].lami(0),
-				       trig.points[j].lami(1),
-				     trig.points[j].lami(2), scalcomp, vali[j]);
-		
-		if ( drawelem )
-		  DrawIsoLines (trig.points[0].p,
-				trig.points[1].p,
-				trig.points[2].p,
-				vali[0], vali[1], vali[2], minval, maxval, numisolines);
-	      }
-	  glEndList ();
-	}
-      glEnd();
-      
-
-    }
-  
-  clipplanetimestamp = max2 (vispar.clipplanetimestamp, solutiontimestamp);
-  }
-  
-
-  void VisualSceneSolution :: BuildFieldLinesPlot ()
-  {
-    if (fieldlinestimestamp >= solutiontimestamp) 
-      return;
-    fieldlinestimestamp = solutiontimestamp;
-    
-
-    if (fieldlineslist)
-      glDeleteLists (fieldlineslist, num_fieldlineslists);
-
-    if (vecfunction == -1)
-      return;
-
-
-    const SolData * vsol = soldata[vecfunction];
-
-    num_fieldlineslists = (vsol -> iscomplex) ? 100 : 1;
-
-    Point3d pmin, pmax;
-    mesh->GetBox (pmin, pmax);
-    double lami[3];
-    int i;
-    bool drawelem;
-
-    fieldlineslist = glGenLists (num_fieldlineslists);
-
-    for (int ln = 0; ln < num_fieldlineslists; ln++)
-      {
-	glNewList (fieldlineslist + ln, GL_COMPILE);      
-
-	double phi = 2*M_PI*ln / num_fieldlineslists;
-	double phaser = cos(phi);
-	double phasei = sin(phi);
-
-	for (i = 1; i <= num_fieldlines / num_fieldlineslists+1; i++)
-	  {
-	    Point3d p (pmin.X() + double (rand()) / RAND_MAX * (pmax.X()-pmin.X()),
-		       pmin.Y() + double (rand()) / RAND_MAX * (pmax.Y()-pmin.Y()),
-		       pmin.Z() + double (rand()) / RAND_MAX * (pmax.Z()-pmin.Z()));
-	    
-	    ElementIndex elnr = mesh->GetElementOfPoint (p, lami)-1;
-	    (*testout) << "p = " << p << "; elnr = " << elnr << endl;
-	    if (elnr != -1)
-	      {
-		Vec3d v;
-		double values[6];
-		drawelem = GetValues (vsol, elnr, lami[0], lami[1], lami[2], values);
-		RealVec3d (values, v, vsol->iscomplex, phaser, phasei);
-		
-		double val = v.Length();
-		
-		if (!fieldlines_randomstart ||
-		    (double (rand()) / RAND_MAX) < (val / maxval))
-		  {
-		    int i;
-		    Point3d p0 = p; 
-		    v *= (rad / val * 0.02);
-		    SetOpenGlColor  (val, minval, maxval, logscale);
-		    
-		    Point3d p2 = p + v; 
-		    cout << " p " << p << endl; 
-		    // "drawelem": added 07.04.2004 (FB)
-		    if ( drawelem ) DrawCylinder (p, p2, rad * 0.003);
-		    p = p2;  		
-		    
-		    for(i=0;i<20;i++) 
-		      {
-			ElementIndex elnr = mesh->GetElementOfPoint (p, lami)-1;
-			
-			if (elnr != -1)
-			  {
-			    drawelem = GetValues (vsol, elnr, lami[0], lami[1], lami[2], values);
-			    RealVec3d (values, v, vsol->iscomplex, phaser, phasei);
-			    val = v.Length();
-			    v *= (rad / val * 0.02);
-			    
-			    SetOpenGlColor  (val, minval, maxval, logscale);
-			    p2 = p +v; 
-			    // "drawelem": added 07.04.2004 (FB)
-			    if ( drawelem ) DrawCylinder (p, p2, rad * 0.003);
-			    p = p2;  	
-			  }
-			else break; 
-		      } 
-		    p=p0; 
-		    for(i=0;i<20;i++) 
-		      {
-			ElementIndex elnr = mesh->GetElementOfPoint (p, lami)-1;
-
-			if (elnr != -1)
-			  {
-			    drawelem = GetValues (vsol, elnr, lami[0], lami[1], lami[2], values);
-			    RealVec3d (values, v, vsol->iscomplex, phaser, phasei);
-			    
-			    val = v.Length();
-			    v *= (rad / val * 0.02);
-			    
-			    SetOpenGlColor  (val, minval, maxval, logscale);
-			    p2 = p - v; 
-			    // "drawelem": added 07.04.2004 (FB)
-			    if ( drawelem ) DrawCylinder (p, p2, rad * 0.003);
-			    p = p2;  	
-			  }
-			else break; 
-		      } 
-		  }		  
-	      }
-	  }
-	glEndList ();
-      }
-  }
-  
-
-
-
-  void  VisualSceneSolution :: DrawSurfaceElements ()
-  {
-    const SolData * sol = NULL;
-    const SolData * vsol = NULL;
-    bool drawelem = 0;
-    
-    if (scalfunction != -1)
-      sol = soldata[scalfunction];
-    if (vecfunction != -1)
-      vsol = soldata[vecfunction];
-    
-    if (mesh->GetTimeStamp () > solutiontimestamp)
-      {
-	sol = NULL;
-	vsol = NULL;
-      }
-
-    glLineWidth (1.0f);
-
-    if (!sol || !sol->draw_surface)
-      glDisable (GL_TEXTURE_1D);
-        
-    Point<3> points[1100];
-    Vec<3> nvs[1100];
-    double values[1100];
-
-    int nse = mesh->GetNSE();
-
-    glBegin (GL_TRIANGLES);
-
-    // glColor3f (0.4, 0.4, 0.4);
-    // glColor3d (0.8, 0.8, 0.8);
-    glColor3d (1.0, 1.0, 1.0);
-
-    for(SurfaceElementIndex sei = 0; sei < nse; sei++)
-      {
-	const Element2d & el = (*mesh)[sei];
-
-	if(vispar.drawdomainsurf > 0 &&
-	   ((mesh->GetDimension() == 3 && 
-	     vispar.drawdomainsurf != mesh->GetFaceDescriptor(el.GetIndex()).DomainIn() &&
-	     vispar.drawdomainsurf != mesh->GetFaceDescriptor(el.GetIndex()).DomainOut()) ||
-	    (mesh->GetDimension() == 2 && el.GetIndex() != vispar.drawdomainsurf))) continue;
-	
-	
-	if ( el.GetType() == TRIG || el.GetType() == TRIG6 )
-	  {
-	    Point<3> p1, p2, p3;
-	    if (!mesh->GetCurvedElements().IsHighOrder())
-	      {
-		GetPointDeformation (el[0]-1, p1, sei);
-		GetPointDeformation (el[1]-1, p2, sei);
-		GetPointDeformation (el[2]-1, p3, sei);
-	      }
-	    
-	    int n = 1 << subdivisions;
-	    int ii = 0;
-	    for (int iy = 0; iy <= n; iy++)
-	      for (int ix = 0; ix <= n-iy; ix++)
-		{
-		  double x = double(ix) / n;
-		  double y = double(iy) / n;
-		  
-		  if (sol && sol->draw_surface) 
-		    drawelem = GetSurfValue (sol, sei, x, y, scalcomp, values[ii]);
-
-		  Point<2> xref(x,y);
-		  Mat<3,2> dxdxi;
-
-		  if (mesh->GetCurvedElements().IsHighOrder())
-		    {
-		      mesh->GetCurvedElements().
-			CalcSurfaceTransformation (xref, sei, points[ii], dxdxi);
-		      nvs[ii] = Cross (dxdxi.Col(0), dxdxi.Col(1));
-		      nvs[ii].Normalize();
-		    }
-		  else
-		    {
-		      points[ii] = p3 + x * (p1-p3) + y * (p2-p3);
-		      nvs[ii] = Cross (p2-p1, p3-p1);
-		      nvs[ii].Normalize();
-		    }
-		  
-		  if (deform)
-		    {
-		      Vec<3> def;
-		      GetSurfDeformation (sei, x, y, def);
-		      points[ii] += def;
-		    }
-		  ii++;
-		}
-
-	    ii = 0;
-	    for (int iy = 0; iy < n; iy++, ii++)
-	      for (int ix = 0; ix < n-iy; ix++, ii++)
-		{
-		  double x = double(ix) / n;
-		  double y = double(iy) / n;
-		  
-		  int index[] = { ii, ii+1, ii+n-iy+1,
-				  ii+1, ii+n-iy+2, ii+n-iy+1 };
-		  
-		  int np = (ix == n-iy-1) ? 3 : 6;
-		  for (int j = 0; j < np; j++)
-		    {
-		      if (sol && sol->draw_surface && drawelem)
-			SetOpenGlColor  (values[index[j]], minval, maxval, logscale);
-		      else
-			glColor3f (0.4f, 0.4f, 0.4f);
-		      
-		      glNormal3dv (nvs[index[j]]);
-		      glVertex3dv (points[index[j]]);
-		    }
-		}	
-	  }
-      }
-    glEnd ();
-    
-      
-    
-  
-    
-    glBegin (GL_QUADS);
-    for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-      {
-	const Element2d & el = (*mesh)[sei];
-
-	if(vispar.drawdomainsurf > 0 &&
-	   ((mesh->GetDimension() == 3 && 
-	     vispar.drawdomainsurf != mesh->GetFaceDescriptor(el.GetIndex()).DomainIn() &&
-	     vispar.drawdomainsurf != mesh->GetFaceDescriptor(el.GetIndex()).DomainOut()) ||
-	    (mesh->GetDimension() == 2 && el.GetIndex() != vispar.drawdomainsurf))) continue;
-
-	if ( el.GetType() == QUAD || el.GetType() == QUAD6 )
-	  {
-	    Point<3> lpi[4];
-	    Vec<3> vx, vy, vtwist;
-	    
-	    if (!mesh->GetCurvedElements().IsHighOrder())
-	      {
-		for (int k = 0; k < 4; k++)
-		  GetPointDeformation (el[k]-1, lpi[k]);
-		
-		vx = lpi[1]-lpi[0];
-		vy = lpi[3]-lpi[0];
-		vtwist = (lpi[0]-lpi[1]) + (lpi[2]-lpi[3]);
-	      }
-	    Vec<3> nv = Cross (lpi[1]-lpi[0], Center (lpi[2],lpi[3]) - lpi[0]);
-	    nv.Normalize();
-	    glNormal3dv (nv);
-
-	    int n = 1 << subdivisions;
-	    int ii = 0;
-	    int ix, iy;
-	    for (iy = 0; iy <= n; iy++)
-	      for (ix = 0; ix <= n; ix++)
-		{
-		  double x = double(ix) / n;
-		  double y = double(iy) / n;
-		
-		  Point<2> xref(x,y);
-		  Mat<3,2> dxdxi;
-
-		  if (sol && sol->draw_surface) 
-		    drawelem = GetSurfValue (sol, sei, x, y, scalcomp, values[ii]);
-
-		  if (mesh->GetCurvedElements().IsHighOrder())
-		    {
-		      mesh->GetCurvedElements().
-			CalcSurfaceTransformation (xref, sei, points[ii], dxdxi);
-		      nvs[ii] = Cross (dxdxi.Col(0), dxdxi.Col(1));
-		      nvs[ii].Normalize();
-		    }
-		  else
-		    {
-		      points[ii] = lpi[0] + x * vx + y * vy + x*y * vtwist;
-		      nvs[ii] = Cross (vx, vy);
-		      nvs[ii].Normalize();
-		    }
-		  
-		  if (deform)
-		    {
-		      Vec<3> def;
-		      GetSurfDeformation (sei, x, y, def);
-		      points[ii] += def;
-		    }
-
-		  ii++;
-		}
-	  
-	    ii = 0;
-	    for (iy = 0; iy < n; iy++, ii++)
-	      for (ix = 0; ix < n; ix++, ii++)
-		{
-		  double x = double(ix) / n;
-		  double y = double(iy) / n;
-		  
-		  int index[] = { ii, ii+1, ii+n+2, ii+n+1 };
-		  
-		  for (int j = 0; j < 4; j++)
-		    {
-		      if (sol && sol->draw_surface && drawelem)
-			SetOpenGlColor  (values[index[j]], minval, maxval, logscale);
-		      else
-			glColor3f (0.4f, 0.4f, 0.4f);
-		      
-		      glNormal3dv (nvs[index[j]]);
-		      glVertex3dv (points[index[j]]);
-		    }
-		}	
-	  }
-      }
-    glEnd();
-    
-    if (usetexture)
-      glEnable (GL_TEXTURE_1D);
-  }
-
-
-  // Bernstein Pol B_{n,i}(x) = n! / i! / (n-i)! (1-x)^{n-i} x^i
-  static  double Bernstein (int n, int i, double x)
-  {
-    int j;
-    double val = 1;
-    for (j = 1; j <= i; j++)
-      val *= x / j;
-    for (j = 1; j <= n-i; j++)
-      val *= (1-x) / j;
-    for (j = 1; j <= n; j++)
-      val *= j;
-    return val;
-  }
-
-  void  VisualSceneSolution :: DrawSurfaceElementLines ()
-  {
-    int i, j, k, l;
-    SurfaceElementIndex sei;
-
-    /*
-    int p = 4;
-    DenseMatrix mat(p+1,p+1), invmat(p+1,p+1);
-    for (i = 0; i <= p; i++)
-      for (j = 0; j <= p; j++)
-	mat.Elem(i+1,j+1) = Bernstein(p, i, double(j)/p);
-    CalcIo
-nverse (mat, invmat);
-    */
-
-    glLineWidth (1.0f);
-    glNormal3d (1, 0, 0);
-
-    int nse = mesh->GetNSE();
-
-    for (sei = 0; sei < nse; sei++)
-      {
-	Element2d & el = (*mesh)[sei];
-
-	int nv;
-	if (el.GetType() == TRIG || el.GetType() == TRIG6)
-	  nv = 3;
-	else 
-	  nv = 4;
-	
-	Point<3> p1, p2, p3, p4;
-	if (!mesh->GetCurvedElements().IsHighOrder())
-	  {
-	    p1 = (*mesh)[el[0]];
-	    p2 = (*mesh)[el[1]];
-	    p3 = (*mesh)[el[2]];
-	    if (nv == 4)
-	      p4 = (*mesh)[el[3]];
-	  }
-
-
-	// glBegin (GL_LINE_LOOP);
-	int n = 1 << subdivisions;
-	// n = p;
-
-	Point<3> pnt;
-	for (k = 0; k < nv; k++)
-	  {
-	    Point<2> p0;
-	    Vec<2> vtau;
-	    if (nv == 3)
-	      switch (k)
-		{
-		case 0:
-		  p0 = Point<2> (0,0);
-		  vtau = Vec<2> (1,0);
-		  break;
-		case 1:
-		  p0 = Point<2> (1,0);
-		  vtau = Vec<2> (-1,1);
-		  break;
-		case 2:
-		  p0 = Point<2> (0,1);
-		  vtau = Vec<2> (0,-1);
-		  break;
-		}
-	    else
-	      switch (k)
-		{
-		case 0:
-		  p0 = Point<2> (0,0);
-		  vtau = Vec<2> (1,0);
-		  break;
-		case 1:
-		  p0 = Point<2> (1,0);
-		  vtau = Vec<2> (0,1);
-		  break;
-		case 2:
-		  p0 = Point<2> (1,1);
-		  vtau = Vec<2> (-1,0);
-		  break;
-		case 3:
-		  p0 = Point<2> (0,1);
-		  vtau = Vec<2> (0,-1);
-		  break;
-		}
-
-	    
-	    glBegin (GL_LINE_STRIP);
-	    Point<3> pts[33], pts2[33];
-	    if (n > 32) cerr << "too many subdivisions, code 433425" << endl;
-
-	    for (int ix = 0; ix <= n; ix++)
-	      {
-		Point<2> p = p0 + (double(ix) / n) * vtau;
-		double x = p(0);
-		double y = p(1);
-
-		if (mesh->GetCurvedElements().IsHighOrder())
-		  mesh->GetCurvedElements().
-		    CalcSurfaceTransformation (p, sei, pnt);
-		else
-		  {
-		    if (nv == 3)
-		      pnt = p3 + x * (p1-p3) + y * (p2-p3);
-		    else
-		      pnt = p1 + x * (p2-p1) + y * (p4-p1) + x*y * ( (p1-p2)+(p3-p4) );
-		  }
-		
-		if (deform)
-		  {
-		    Vec<3> def;
-		    GetSurfDeformation (sei, x, y, def);
-		    pnt += def;
-		  }
-		
-		glVertex3dv (pnt);
-
-		pts[ix] = pnt;
-	      }
-	    glEnd ();
-
-
-
-
-
-	    /*
-	    // convert from point-values to Bernstein basis
-	    for (i = 0; i < 3; i++)
-	      for (j = 0; j <= p; j++)
-		{
-		  pts2[j](i) = 0;
-		  for (l = 0; l <= p; l++)
-		    pts2[j](i) += invmat(l,j) * pts[l](i);
-		}
-
-
-	    glMap1d(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, n+1, &pts2[0](0));
-	    glEnable(GL_MAP1_VERTEX_3);
-
-	    int steps = 1 << subdivisions;
-
-// 	    glBegin (GL_LINE_STRIP);
-// 	    for (int hi = 0; hi <= 10; hi++)
-// 	      glEvalCoord1d (double(hi)/10.0);
-// 	    glEnd ();
-
-	    glMapGrid1d (steps, 0.0, 1.0);
-	    glEvalMesh1(GL_LINE, 0, steps);
-	    glDisable(GL_MAP1_VERTEX_3);
-	    */
-	  }
-	
-      }
-    
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void  VisualSceneSolution :: DrawSurfaceVectors ()
-{
-  int j, k;
-  int dir, dir1, dir2;
-  SurfaceElementIndex sei;
-
-  const SolData * vsol = NULL;
-  bool drawelem;
-
-  if (vecfunction != -1)
-    vsol = soldata[vecfunction];
-
-  if (mesh->GetTimeStamp () > solutiontimestamp)
-    {
-      vsol = NULL;
-    }
-
-  if (!vsol) return;
-
-
-  Point<3> pmin = center - Vec3d (rad, rad, rad);
-  Point<3> pmax = center - Vec3d (rad, rad, rad);
-
-  double s, t;
-
-  // draw surface cones
-  //  if (0)
-  /*
-  if (vsol->soltype==SOL_SURFACE_ELEMENT ||
-      vsol->soltype==SOL_SURFACE_NONCONTINUOUS ||
-      vsol->soltype==SOL_VIRTUALFUNCTION)
-  */
-
-  if (vsol->draw_surface && showsurfacesolution)
-    {
-      int nse = mesh->GetNSE();
-      for (sei = 0; sei < nse; sei++)
-	{
-	  const Element2d & el = (*mesh)[sei];
-	  
-	  if (el.GetType() != TRIG && el.GetType() != TRIG6) continue;
-	  
-	  Point<3> lp[3];
-	  Point<2> p2d[3];
-	  /*
-	  for (k = 0; k < 3; k++)
-	    lp[k] = mesh->Point (el[k]);
-	  */
-	  lp[0] = mesh->Point(el[2]);
-	  lp[1] = mesh->Point(el[0]);
-	  lp[2] = mesh->Point(el[1]);
-
-
-	  Vec<3> n = Cross (lp[1]-lp[0], lp[2]-lp[0]);
-	  Vec<3> na (fabs (n(0)), fabs(n(1)), fabs(n(2)));
-	  if (na(0) > na(1) && na(0) > na(2))
-	    dir = 1;
-	  else if (na(1) > na(2))
-	    dir = 2;
-	  else 
-	    dir = 3;
-
-	  dir1 = (dir % 3) + 1;
-	  dir2 = (dir1 % 3) + 1;
-	  
-	  for (k = 0; k < 3; k++)
-	    {
-	      p2d[k] = Point<2> ((lp[k](dir1-1) - pmin(dir1-1)) / (2*rad),
-				 (lp[k](dir2-1) - pmin(dir2-1)) / (2*rad));
-	    }
-	  
-	  double minx2d, maxx2d, miny2d, maxy2d;
-	  minx2d = maxx2d = p2d[0](0);
-	  miny2d = maxy2d = p2d[0](1);
-	  for (k = 1; k < 3; k++)
-	    {
-	      minx2d = min2 (minx2d, p2d[k](0));
-	      maxx2d = max2 (maxx2d, p2d[k](0));
-	      miny2d = min2 (miny2d, p2d[k](1));
-	      maxy2d = max2 (maxy2d, p2d[k](1));
-	    }
-
-	  double mat11 = p2d[1](0) - p2d[0](0);
-	  double mat21 = p2d[1](1) - p2d[0](1);
-	  double mat12 = p2d[2](0) - p2d[0](0);
-	  double mat22 = p2d[2](1) - p2d[0](1);
-
-	  double det = mat11*mat22-mat21*mat12;
-	  double inv11 = mat22/det;
-	  double inv21 = -mat21/det;
-	  double inv12 = -mat12/det;
-	  double inv22 = mat11/det;
-	  
-	  //	  cout << "drawsurfacevectors. xoffset = " << xoffset << ", yoffset = ";
-	  //	  cout << yoffset << endl;
-	  
-	  for (s = xoffset/gridsize; s <= 1+xoffset/gridsize; s += 1.0 / gridsize)
-	    if (s >= minx2d && s <= maxx2d)
-	      for (t = yoffset/gridsize; t <= 1+yoffset/gridsize; t += 1.0 / gridsize)
-		if (t >= miny2d && t <= maxy2d)
-		  {
-		    double lam1 = inv11 * (s - p2d[0](0)) + inv12 * (t-p2d[0](1));
-		    double lam2 = inv21 * (s - p2d[0](0)) + inv22 * (t-p2d[0](1));
-		    
-		    if (lam1 >= 0 && lam2 >= 0 && lam1+lam2 <= 1)
-		      {
-			Point<3> cp;
-			for (k = 0; k < 3; k++)
-			  cp(k) = lp[0](k) + 
-			    lam1 * (lp[1](k)-lp[0](k)) + 
-			    lam2 * (lp[2](k)-lp[0](k));
-
-			Vec<3> v;
-			double values[6];
-			drawelem = GetSurfValues (vsol, sei, lam1, lam2, values);
-
-			if (!vsol->iscomplex)
-			  for (k = 0; k < 3; k++)
-			    v(k) = values[k];
-			else
-			  {
-			    if (!imag_part)
-			      for (k = 0; k < 3; k++)
-				v(k) = values[2*k];
-			    else
-			      for (k = 0; k < 3; k++)
-				v(k) = values[2*k+1];
-			  }
-			
-			if (mesh->GetDimension() == 2)
-			  if ( (!vsol->iscomplex && vsol->components != 3) ||
-			       (vsol->iscomplex && vsol->components != 6) )
-			    v(2) = 0;
-			
-			double val = v.Length();
-			SetOpenGlColor  (val, minval, maxval, logscale);
-
-			if (val > 1e-10 * maxval)
-			  v *= (rad / val / gridsize * 0.5);
-			// "drawelem": added 07.04.2004 (FB)
-			if ( drawelem ) DrawCone (cp, cp+4*v, 0.8*rad / gridsize);
-
-
-			/*
-			v /= val;
-			
-			glPushMatrix();
-			glTranslated (cp(0), cp(1), cp(2));
-
-			double l = 2*rad/gridsize;
-			double r = 0.8*rad/gridsize;
-			glScaled (l, l, l);
-			
-			double phi = acos (v(2));
-			glRotated (-180/M_PI*phi, v(1), -v(0), 0);
-
-			glCallList (cone_list);
-			glPopMatrix();
-			*/
-		      }
-		  }
-	}
-    }
-}
-
-
-
-
-void VisualSceneSolution :: 
-DrawIsoLines (const Point3d & p1, 
-	      const Point3d & p2, 
-	      const Point3d & p3,
-	      double val1, double val2, double val3,
-	      double minval, double maxval, int n)
-{
-  DrawIsoLines2 (p1, p2, p1, p3, val1, val2, val1, val3, minval, maxval, n);
-  DrawIsoLines2 (p2, p1, p2, p3, val2, val1, val2, val3, minval, maxval, n);
-  DrawIsoLines2 (p3, p1, p3, p2, val3, val1, val3, val2, minval, maxval, n);
-}
-
-void VisualSceneSolution :: 
-DrawIsoLines2 (const Point3d & p1, 
-	       const Point3d & p2, 
-	       const Point3d & p3,
-	       const Point3d & p4,
-	       double val1, double val2, double val3, double val4,
-	       double minval, double maxval, int n)
-{
-  if (val1 > val2) 
-    DrawIsoLines2 (p2, p1, p3, p4, val2, val1, val3, val4, minval, maxval, n);
-  if (val3 > val4) 
-    DrawIsoLines2 (p1, p2, p4, p3, val1, val2, val4, val3, minval, maxval, n);
-
-  val2 += 1e-10;
-  val4 += 1e-10;
-
-  double fac = (maxval-minval) / n;
-  double idelta1 = 1.0 / (val2 - val1);
-  double idelta2 = 1.0 / (val4 - val3);
-
-  int mini = int ((max2 (val1, val3) - minval) / fac);
-  int maxi = int ((min2 (val2, val4) - minval) / fac);
-  if (mini < 0) mini = 0;
-  if (maxi > n-1) maxi = n-1;
-
-  for (int i = mini; i <= maxi+1; i++)
-    {
-      double val = minval + i * fac;
-      double lam1 = (val - val1) * idelta1;
-      double lam2 = (val - val3) * idelta2;
-      if (lam1 >= 0 && lam1 <= 1 && lam2 >= 0 && lam2 <= 1)
-	{
-	  Point3d lp1 = p1 + lam1 * Vec3d (p1, p2);
-	  Point3d lp2 = p3 + lam2 * Vec3d (p3, p4);
-	  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	  glVertex3d (lp2.X(), lp2.Y(), lp2.Z());
-	  glVertex3d (lp1.X(), lp1.Y(), lp1.Z());
-	}
-    }
-}
-
-
-
-
-
-
-
-void VisualSceneSolution :: 
-GetMinMax (int funcnr, int comp, double & minv, double & maxv) const
-{
-  int i, j;
-  const SolData * sol;
-  double val;
-  bool considerElem;
-
-  bool hasit = false;
-  minv = 0; maxv = 1;
-  if (funcnr != -1)
-    {
-      sol = soldata[funcnr];
-      if (sol->draw_volume)
-	{
-	  int ne = mesh->GetNE();
-	  for (int i = 0; i < ne; i++)
-	    {
-	      // "considerElem": added 07.04.2004 (FB)
-	      considerElem = GetValue (sol, i, 0.333, 0.333, 0.333, comp, val);
-	      if (considerElem)
-		{
-		  if (val > maxv || !hasit)
-		    maxv = val;
-		  if (val < minv || !hasit)
-		    minv = val;
-		  hasit = true;
-		}
-	    }
-	}
-      if (sol->draw_surface)
-	{
-	  int nse = mesh->GetNSE();
-	  for (int i = 0; i < nse; i++)
-	    {
-	      // "considerElem": added 07.04.2004 (FB)
-	      considerElem = GetSurfValue (sol, i, 0.333, 0.333, comp, val);
-	      if (considerElem)
-		{
-		  if (val > maxv || !hasit)
-		    maxv = val;
-		  if (val < minv || !hasit)
-		    minv = val;
-		  hasit = true;
-		}
-	    }
-	}
-    }
-}
-
-
-
-
-
-bool VisualSceneSolution :: 
-GetValues (const SolData * data, ElementIndex elnr, 
-	   double lam1, double lam2, double lam3,
-	   double * values) const
-{
-  bool ok;
-  switch (data->soltype)
-    {
-    case SOL_VIRTUALFUNCTION:
-      {
-	ok = data->solclass->GetValue (elnr, lam1, lam2, lam3, values);
-	break;
-      }
-    default:
-      {
-	for (int i = 0; i < data->components; i++)
-	  ok = GetValue (data, elnr, lam1, lam2, lam3, i+1, values[i]);
-      }
-    }
-  return ok;
-}
-
-
-bool VisualSceneSolution :: 
-GetValue (const SolData * data, ElementIndex elnr, 
-	  double lam1, double lam2, double lam3,
-	  int comp, double & val) const
-{
-  val = 0;
-  bool ok = 0;
-
-  if (comp == 0)
-    {
-      ArrayMem<double,20> values(data->components);
-      ok = GetValues (data, elnr, lam1, lam2, lam3, &values[0]);
-
-      switch (evalfunc)
-	{
-	case FUNC_ABS:
-	  {
-	    for (int ci = 0; ci < data->components; ci++)
-	      val += sqr (values[ci]);
-	    val = sqrt (val);
-	    break;
-	  }
-	case FUNC_ABS_TENSOR:
-	  {
-	    int d;
-	    switch (data->components)
-	      {
-	      case 1: d = 1; break;
-	      case 3: d = 2; break;
-	      case 6: d = 3; break;
-	      }
-	    int ci;
-	    for (ci = 0; ci < d; ci++)
-	      val += sqr (values[ci]);
-	    for (ci = d; ci < data->components; ci++)
-	      val += 2*sqr (values[ci]);
-	    val = sqrt (val);
-	    break;
-	  }
-
-	case FUNC_MISES:
-	{
-	    int d;
-	    switch(data->components)
-	      {
-	      case 1: d = 1; break;
-	      case 3: d = 2; break;
-	      case 6: d = 3; break;
-	      }
-	    int ci;
-	    double trace = 0.;
-	    for (ci = 0; ci < d; ci++)
-	      trace += 1./3.*(values[ci]);
-	    for (ci = 0; ci < d; ci++)
-	      val += sqr (values[ci]-trace);
-	    for (ci = d; ci < data->components; ci++)
-	      val += 2.*sqr (values[ci]);
-	    val = sqrt (val);
-	    break;
-	}
-	case FUNC_MAIN:
-	 {
-	    int d;
-	    switch(data->components)
-	      {
-	      case 1: d = 1; break;
-	      case 3: d = 2; break;
-	      case 6: d = 3; break;
-	      }
-	    Mat<3,3> m ;
-	    Vec<3> ev;
-	    int ci;
-            for (ci = 0; ci < d; ci++)
-	      m(ci,ci) = (values[ci]);
-	    m(0,1) = m(1,0) = values[3];
-	    m(0,2) = m(2,0) = values[4];
-	    m(1,2) = m(2,1) = values[5];
-
-	    EigenValues (m, ev);
-	    double help;
-            for (int i=0; i<d; i++)
-            {
-               for (int j=d-1; i<j; j--)
-               {
-                   if ( abs(ev(j)) > abs(ev(j-1)) )
-	           {
-	              help = ev(j);
-                      ev(j) = ev(j-1);
-	              ev(j-1) = help;
-	           }
-       		}
-  	    }
-            val = (ev(0));
-	    break;
-         }
-      }
-
-      return ok;	
-    }
-
-
-  switch (data->soltype)
-    {
-    case SOL_VIRTUALFUNCTION:
-      {
-	double values[20];
-	ok = data->solclass->GetValue (elnr, lam1, lam2, lam3, values);
-
-	val = values[comp-1];
-	return ok;
-      }
-    case SOL_NODAL:
-      {
-	const Element & el = (*mesh)[elnr];
-
-	double lami[8];
-	int np, i;
-	
-	switch (el.GetType())
-	  {
-	  case TET:
-	  case TET10:
-	    {
-	      lami[1] = lam1;
-	      lami[2] = lam2;
-	      lami[3] = lam3;
-	      lami[0] = 1-lam1-lam2-lam3;
-	      np = 4;
-	      break;
-	    }
-	  case PRISM:
-	  case PRISM12:
-	    {
-	      lami[0] = (1-lam3) * (1-lam1-lam2);
-	      lami[1] = (1-lam3) * lam1;
-	      lami[2] = (1-lam3) * lam2;
-	      lami[3] = (lam3) * (1-lam1-lam2);
-	      lami[4] = (lam3) * lam1;
-	      lami[5] = (lam3) * lam2;
-	      np = 6;
-	      break;
-	    }	    
-	  }
-
-	for (i = 0; i < np; i++)
-	  val += lami[i] * data->data[(el[i]-1) * data->dist + comp-1];
-
-	return 1;
-      }
-
-    case SOL_ELEMENT:
-      {
-	val = data->data[elnr * data->dist + comp-1];
-	return 1;
-      }
-
-    case SOL_SURFACE_ELEMENT:
-      return 0;
-
-    case SOL_NONCONTINUOUS:
-      {
-	const Element & el = (*mesh)[elnr];
-
-	double lami[8];
-	int np, i;
-
-	switch (el.GetType())
-	  {
-	  case TET:
-	  case TET10:
-	    {
-	      lami[1] = lam1;
-	      lami[2] = lam2;
-	      lami[3] = lam3;
-	      lami[0] = 1-lam1-lam2-lam3;
-	      np = 4;
-	      break;
-	    }
-	  case PRISM:
-	  case PRISM12:
-	    {
-	      lami[0] = (1-lam3) * (1-lam1-lam2);
-	      lami[1] = (1-lam3) * lam1;
-	      lami[2] = (1-lam3) * lam2;
-	      lami[3] = (lam3) * (1-lam1-lam2);
-	      lami[4] = (lam3) * lam1;
-	      lami[5] = (lam3) * lam2;
-	      np = 6;
-	      break;
-	    }
-	  case PYRAMID:
-	    {
-	      if (lam3 > 1-1e-5)
-		{
-		  lami[0] = lami[1] = lami[2] = lami[3] = 0;
-		  lami[4] = 1;
-		}
-	      else
-		{
-		  double x0 = lam1 / (1-lam3);
-		  double y0 = lam2 / (1-lam3);
-		  lami[0] = (1-x0) * (1-y0) * (1-lam3);
-		  lami[1] = (  x0) * (1-y0) * (1-lam3);
-		  lami[2] = (  x0) * (  y0) * (1-lam3);
-		  lami[3] = (1-x0) * (  y0) * (1-lam3);
-		  lami[4] = lam3;
-		  np = 5;
-		}
-	      break;
-	    }
-	  default:
-	    np = 0;
-	  }
-
-	int base;
-	if (data->order == 1)
-	  base = 6 * elnr;
-	else
-	  base = 10 * elnr;
-
-
-	for (i = 0; i < np; i++)
-	  val += lami[i] * data->data[(base+i) * data->dist + comp-1];
-
-	return 1;
-      }
-
-    case SOL_MARKED_ELEMENTS:
-      {
-	val = (*mesh)[elnr].TestRefinementFlag();
-	return 1;
-      }
-      
-    case SOL_ELEMENT_ORDER:
-      {
-	val = (*mesh)[elnr].GetOrder();
-	return 1;
-      }
-    }
-  return 0;
-}
-
-
-
-
-bool VisualSceneSolution :: 
-GetSurfValues (const SolData * data, SurfaceElementIndex selnr, 
-	       double lam1, double lam2, 
-	       double * values) const
-{
-  bool ok;
-  switch (data->soltype)
-    {
-    case SOL_VIRTUALFUNCTION:
-      {
-	ok = data->solclass->GetSurfValue (selnr, lam1, lam2, values);
-	break;
-      }
-    default:
-      {
-	for (int i = 0; i < data->components; i++)
-	  ok = GetSurfValue (data, selnr, lam1, lam2, i+1, values[i]);
-      }
-    }
-  return ok;
-}
-
-
-
-bool VisualSceneSolution :: 
-GetSurfValue (const SolData * data, SurfaceElementIndex selnr, 
-	      double lam1, double lam2, 
-	      int comp, double & val) const
-{
-  bool ok;
-  if (comp == 0)
-    {
-      val = 0;
-      ArrayMem<double,20> values(data->components);
-      ok = GetSurfValues (data, selnr, lam1, lam2, &values[0]);
-
-      switch (evalfunc)
-	{
-	case FUNC_ABS:
-	  {
-	    for (int ci = 0; ci < data->components; ci++)
-	      val += sqr (values[ci]);
-	    val = sqrt (val);
-	    break;
-	  }
-	case FUNC_ABS_TENSOR:
-	  {
-	    int d;
-	    switch (data->components)
-	      {
-	      case 1: d = 1; break;
-	      case 3: d = 2; break;
-	      case 6: d = 3; break;
-	      }
-	    int ci;
-	    for (ci = 0; ci < d; ci++)
-	      val += sqr (values[ci]);
-	    for (ci = d; ci < data->components; ci++)
-	      val += 2*sqr (values[ci]);
-	    val = sqrt (val);
-	    break;
-	  }
-
-	case FUNC_MISES:
-	{
-	    int d;
-	    switch(data->components)
-	      {
-	      case 1: d = 1; break;
-	      case 3: d = 2; break;
-	      case 6: d = 3; break;
-	      }
-	    int ci;
-	    double trace = 0.;
-	    for (ci = 0; ci < d; ci++)
-	      trace += 1./3.*(values[ci]);
-	    for (ci = 0; ci < d; ci++)
-	      val += sqr (values[ci]-trace);
-	    for (ci = d; ci < data->components; ci++)
-	      val += 2.*sqr (values[ci]);
-	    val = sqrt (val);
-	    break;
-	}
-	case FUNC_MAIN:
-	 {
-	    int d;
-	    switch(data->components)
-	      {
-	      case 1: d = 1; break;
-	      case 3: d = 2; break;
-	      case 6: d = 3; break;
-	      }
-	    Mat<3,3> m ;
-	    Vec<3> ev;
-	    int ci;
-            for (ci = 0; ci < d; ci++)
-	      m(ci,ci) = (values[ci]);
-	    m(0,1) = m(1,0) = values[3];
-	    m(0,2) = m(2,0) = values[4];
-	    m(1,2) = m(2,1) = values[5];
-
-	    EigenValues (m, ev);
-	    double help;
-            for (int i=0; i<d; i++)
-            {
-               for (int j=d-1; i<j; j--)
-               {
-                   if ( abs(ev(j)) > abs(ev(j-1)) )
-	           {
-	              help = ev(j);
-                      ev(j) = ev(j-1);
-	              ev(j-1) = help;
-	           }
-       		}
-  	    }
-            val = (ev(0));
-	    break;
-         }
-      }
-
-      return ok;	
-
-
-      /*
-      int ci;
-      double val = 0;
-      for (ci = 1; ci <= data->components; ci++)
-	val += sqr (GetSurfValue (data, selnr, lam1, lam2, ci));
-      return sqrt (val);
-      */
-    }
-
-
-  switch (data->soltype)
-    {
-   case SOL_VIRTUALFUNCTION:
-      {
-	ArrayMem<double,20> values(data->components);
-	bool ok;
-
-	ok = data->solclass->GetSurfValue (selnr, lam1, lam2, &values[0]);
-
-	if (ok)
-	  {
-	    if (!data->iscomplex)
-	      val =  values[comp-1];
-	    else
-	      {
-		// cout << "time = " << time << ", cos = " << cos(time) << endl;
-		val = values[comp-1]*cos(3*time) + values[comp]*sin(3*time);
-	      }
-	  }
-
-	return ok;
-      }
-
-
-    case SOL_NODAL:
-      {
-	const Element2d & el = (*mesh)[selnr];
-
-	double lami[8];
-	int np, i;
-	val = 0;
-	double lam3 = 1-lam1-lam2;
-
-	switch (el.GetType())
-	  {
-	  case TRIG:
-	    /*
-	    lami[0] = lam3;
-	    lami[1] = lam1;
-	    lami[2] = lam2;
-	    */
-	    lami[0] = lam1;
-	    lami[1] = lam2;
-	    lami[2] = lam3;
-	    np = 3;
-	    break;
-
-	  case TRIG6:
-	    /*
-	    lami[0] = lam3*(2*lam3-1);
-	    lami[1] = lam1*(2*lam1-1);
-	    lami[2] = lam2*(2*lam2-1);
-	    */
-	    // hierarchical basis:
-	    lami[0] = lam3;
-	    lami[1] = lam1;
-	    lami[2] = lam2;
-	    lami[3] = 4*lam1*lam2;
-	    lami[4] = 4*lam2*lam3;
-	    lami[5] = 4*lam1*lam3;
-	    np = 6;
-	    break;
-
-	  case QUAD:
-	  case QUAD6:
-	    lami[0] = (1-lam1)*(1-lam2);
-	    lami[1] = lam1 * (1-lam2);
-	    lami[2] = lam1 * lam2;
-	    lami[3] = (1-lam1) * lam2;
-	    np = 4;
-	    break;
-
-	  default:
-	    np = 0;
-	  }
-
-	for (i = 0; i < np; i++)
-	  val += lami[i] * data->data[(el[i]-1) * data->dist + comp-1];
-
-	return 1;
-      }
-
-    case SOL_ELEMENT:
-      {
-	int el1, el2;
-	mesh->GetTopology().GetSurface2VolumeElement (selnr+1, el1, el2);
-	el1--;
-
-	val = data->data[el1 * data->dist+comp-1];
-	return 1;
-      }
-
-    case SOL_NONCONTINUOUS:
-      {
-	val = 0;
-	// ?????
-	return 0;
-      }
-
-    case SOL_SURFACE_ELEMENT:
-      {
-	val = data->data[selnr * data->dist + comp-1];
-	return 1;
-      }
-
-    case SOL_SURFACE_NONCONTINUOUS:
-      {
-	const Element2d & el = (*mesh)[selnr];
-
-	double lami[8];
-	int np, i;
-	val = 0;
-	int order = data->order;
-
-	switch (order)
-	  {
-	  case 0:
-	    return data->data[selnr * data->dist + comp-1];
-	  case 1:
-	    {
-	      switch (el.GetType())
-		{
-		case TRIG:
-		case TRIG6:
-		  {
-		    lami[1] = lam1;
-		    lami[2] = lam2;
-		    lami[0] = 1-lam1-lam2;
-		    np = 3;
-		    break;
-		  }
-		}
-	      break;
-	    }
-	  case 2:
-	    {
-	      switch (el.GetType())
-		{
-		case TRIG:
-		  {
-		    lami[1] = lam1;
-		    lami[2] = lam2;
-		    lami[0] = 1-lam1-lam2;
-		    np = 3;
-		    break;
-		  }
-		case TRIG6:
-		  {
-		    double lam3 = 1-lam1-lam2;
-		    lami[1] = 2*lam1 * (lam1-0.5);
-		    lami[2] = 2*lam2 * (lam2-0.5);
-		    lami[0] = 2*lam3 * (lam3-0.5);
-		    lami[3] = 4*lam1*lam2;
-		    lami[4] = 4*lam2*lam3;
-		    lami[5] = 4*lam1*lam3;
-		    np = 6;
-		    break;
-		  }
-		}
-	      break;
-	    }
-	  }
-	
-	int base;
-	if (order == 1)
-	  base = 4 * selnr;
-	else 
-	  base = 9 * selnr;
-
-	for (i = 0; i < np; i++)
-	  {
-	    val += lami[i] * data->data[(base+i) * data->dist + comp-1];
-	  }
-	return 1;
-      }
-
-    case SOL_MARKED_ELEMENTS:
-      {
-	val = (*mesh)[selnr].TestRefinementFlag();
-	return 1;
-      }
-      
-    case SOL_ELEMENT_ORDER:
-      {
-	val = (*mesh)[selnr].GetOrder();
-	return 1;
-      }
-
-    }
-  return 0;
-}
-
-
-void VisualSceneSolution :: 
-GetDeformation (ElementIndex elnr, double lam1, double lam2, double lam3,
-		Vec<3> & def) const
-{
-  if (deform && vecfunction != -1)
-    {
-      GetValues (soldata[vecfunction], elnr, lam1, lam2, lam3, &def(0));
-      def *= scaledeform;
-
-      if (soldata[vecfunction]->dist == 2) def(2) = 0;
-    }
-  else
-    def = 0;
-}
-
-
-void VisualSceneSolution :: 
-GetSurfDeformation (SurfaceElementIndex elnr, double lam1, double lam2, 
-		    Vec<3> & def) const
-{
-  if (deform && vecfunction != -1)
-    {
-      GetSurfValues (soldata[vecfunction], elnr, lam1, lam2,  &def(0));
-      def *= scaledeform;
-
-      if (soldata[vecfunction]->dist == 2) def(2) = 0;
-    }
-  else
-    def = 0;
-}
-
-void VisualSceneSolution :: GetPointDeformation (int pnum, Point<3> & p, 
-						 SurfaceElementIndex elnr) const
-{
-  p = mesh->Point (pnum+1);
-
-  if (deform && vecfunction != -1)
-    {
-      const SolData * vsol = soldata[vecfunction];
-      
-      Vec<3> v(0,0,0);
-      if (vsol->soltype == SOL_NODAL)
-	{
-	  v = Vec3d(vsol->data[pnum * vsol->dist],
-		    vsol->data[pnum * vsol->dist+1],
-		    vsol->data[pnum * vsol->dist+2]);
-	}
-      else if (vsol->soltype == SOL_SURFACE_NONCONTINUOUS)
-	{
-	  const Element2d & el = (*mesh)[elnr];
-	  for (int j = 0; j < el.GetNP(); j++)
-	    if (el[j] == pnum+1)
-	      {
-		int base = (4*elnr+j-1) * vsol->dist;
-		v = Vec3d(vsol->data[base],
-			  vsol->data[base+1],
-			  vsol->data[base+2]);
-	      }
-	}
-
-      if (vsol->dist == 2) v(2) = 0;
-      
-      v *= scaledeform;
-      p += v;
-    }
-}
-
-
-
-
-
-
-
-
-void VisualSceneSolution :: GetClippingPlaneTrigs (ARRAY<ClipPlaneTrig> & trigs)
-{
-  //  cout << "get clipplane trigs" << endl;
-
-  int ii, j, k, l;
-  ElementIndex ei;
-
-  int np = mesh->GetNP();
-  int ne = mesh->GetNE();
-
-  ARRAY<double> nodevals(np);
-  
-  for (int i = 0; i < np; i++)
-    {
-      Point<3> p;
-      GetPointDeformation(i, p);
-      nodevals[i] =
-	p(0) * clipplane[0] +
-	p(1) * clipplane[1] +
-	p(2) * clipplane[2] +
-	clipplane[3];
-    }
-
-  const int edgei[6][2] =
-  { 
-    { 0, 1 },
-    { 0, 2 },
-    { 0, 3 },
-    { 1, 2 },
-    { 1, 3 },
-    { 2, 3 }
-  };
-  double edgelam[6];
-  Point<3> edgep[6];
-  double nodevali[4];
-
-  int cntce;
-  int cpe1 = 0, cpe2 = 0, cpe3 = 0;
-
-  ARRAY<Element> loctets;
-  ARRAY<Element> loctetsloc;
-  ARRAY<Point3d> pointsloc;
-
-
-  int n = 1 << subdivisions;
-  ARRAY<Point<3> > grid((n+1)*(n+1)*(n+1));
-  ARRAY<Point<3> > locgrid((n+1)*(n+1)*(n+1));
-  ARRAY<double> val((n+1)*(n+1)*(n+1));
-
-
-  for (ei = 0; ei < ne; ei++)
-    {
-      ELEMENT_TYPE type = (*mesh)[ei].GetType();
-      if (type == HEX || type == PRISM || type == TET || type == PYRAMID)
-	{
-	  const Element & el = (*mesh)[ei];
-
-	  Vector shape(el.GetNP());
-
-	  int ii = 0;
-	  for (int ix = 0; ix <= n; ix++)
-	    for (int iy = 0; iy <= n; iy++)
-	      for (int iz = 0; iz <= n; iz++, ii++)
-		{
-		  Point<3> ploc;
-		  if (type == PRISM)
-		    ploc = Point<3> (double(ix) / n * (1-double(iy)/n), double(iy) / n, double(iz) / n);
-		  if (type == TET)
-		    ploc = Point<3> (double(ix) / n * (1-double(iy)/n) * (1-double(iz)/n), 
-				     double(iy) / n * (1-double(iz)/n), 
-				     double(iz) / n);
-		  if (type == HEX)
-		    ploc = Point<3> (double(ix) / n, double(iy) / n, double(iz) / n);
-		  if (type == PYRAMID)
-		    ploc = Point<3> (double(ix) / n * (1-double(iz)/n),
-				     double(iy) / n * (1-double(iz)/n),
-				     double(iz)/n);
-
-		  Point<3> pglob;
-		  
-		  if (mesh->GetCurvedElements().IsHighOrder())
-		    {
-		      mesh->GetCurvedElements().
-			CalcElementTransformation (ploc, ei, pglob);
-		    }
-		  else
-		    {
-		      el.GetShapeNew (ploc, shape);
-		      for (int j = 0; j < 3; j++)
-			{
-			  pglob(j) = 0;
-			  for (int k = 0; k < el.GetNP(); k++)
-			    pglob(j) += shape(k) * (*mesh)[el[k]].X(j+1);
-			}
-		    }
-		  
-		  locgrid[ii] = ploc;
-		  grid[ii] = pglob;
-		  val[ii] = 
-		    pglob(0) * clipplane[0] + 
-		    pglob(1) * clipplane[1] + 
-		    pglob(2) * clipplane[2] + 
-		    clipplane[3];
-		}
-	  
-	  for (int ix = 0; ix < n; ix++)
-	    for (int iy = 0; iy < n; iy++)
-	      for (int iz = 0; iz < n; iz++)
-		{
-		  int base = iz + (n+1)*iy + (n+1)*(n+1)*ix;
-		  int pi[8] = 
-		    { base, base+(n+1)*(n+1), base+(n+1)*(n+1)+(n+1), base+(n+1),
-		      base+1, base+(n+1)*(n+1)+1, base+(n+1)*(n+1)+(n+1)+1, base+(n+1)+1 };
-		  
-		  int tets[6][4] = 
-		    { { 1, 7, 2, 3 },
-		      { 1, 7, 3, 4 },
-		      { 1, 7, 4, 8 },
-		      { 1, 7, 8, 5 },
-		      { 1, 7, 5, 6 },
-		      { 1, 7, 6, 2 }
-		    };
-		  
-
-		  for (int ii = 0; ii < 6; ii++)
-		    {
-		      int teti[4];
-		      for (int k = 0; k < 4; k++)
-			teti[k] = pi[tets[ii][k]-1];
-
-		      for (j = 0; j < 4; j++)
-			nodevali[j] = val[teti[j]];
-	  
-		      cntce = 0;
-		      for (j = 0; j < 6; j++)
-			{
-			  int lpi1 = edgei[j][0];
-			  int lpi2 = edgei[j][1];
-			  if ( (nodevali[lpi1] > 0) !=
-			       (nodevali[lpi2] > 0) )
-			    {
-			      edgelam[j] = nodevali[lpi2] / (nodevali[lpi2] - nodevali[lpi1]);
-			      Point<3> p1 = grid[teti[lpi1]];
-			      Point<3> p2 = grid[teti[lpi2]];
-		  
-			      edgep[j] = p1 + (1-edgelam[j]) * (p2-p1);
-		  
-			      cntce++;
-			      cpe3 = cpe2;
-			      cpe2 = cpe1;
-			      cpe1 = j;
-			      if (cntce >= 3)
-				{
-				  ClipPlaneTrig cpt;
-				  cpt.elnr = ei;
-				  
-				  for (int k = 0; k < 3; k++)
-				    {
-				      int ednr;
-				      switch (k)
-					{
-					case 0: ednr = cpe1; break;
-					case 1: ednr = cpe2; break;
-					case 2: ednr = cpe3; break;
-					}
-				      cpt.points[k].p = edgep[ednr];
-				      
-				      int pi1 = edgei[ednr][0];
-				      int pi2 = edgei[ednr][1];
-				      Point<3> p1 = locgrid[teti[pi1]];
-				      Point<3> p2 = locgrid[teti[pi2]];
-				      for (l = 0; l < 3; l++)
-					cpt.points[k].lami(l) = 
-					  edgelam[ednr]     * p1(l) + 
-					  (1-edgelam[ednr]) * p2(l);
-				    }
-				  
-				  trigs.Append (cpt);
-				}
-			    }
-			}
-		    }
-		}
-	}
-
-      else
-	{
-
-      // const Element & el = mesh->VolumeElement(i);
-
-      (*mesh)[ei].GetTets (loctets);
-      (*mesh)[ei].GetTetsLocal (loctetsloc);
-      // (*mesh)[ei].GetNodesLocal (pointsloc);
-      (*mesh)[ei].GetNodesLocalNew (pointsloc);
-
-      for (ii = 0; ii < loctets.Size(); ii++)
-	{
-	  const Element & el = loctets[ii];
-	  
-	  for (j = 0; j < 4; j++)
-	    nodevali[j] = nodevals.Get(el[j]);
-	  
-	  cntce = 0;
-	  for (j = 0; j < 6; j++)
-	    {
-	      int lpi1 = edgei[j][0];
-	      int lpi2 = edgei[j][1];
-	      if ( (nodevali[lpi1] > 0) !=
-		   (nodevali[lpi2] > 0) )
-		{
-		  edgelam[j] = nodevali[lpi2] / (nodevali[lpi2] - nodevali[lpi1]);
-		  Point<3> p1, p2;
-		  GetPointDeformation (el[lpi1]-1, p1);
-		  GetPointDeformation (el[lpi2]-1, p2);
-		  
-		  edgep[j] = p1 + (1-edgelam[j]) * (p2-p1);
-		  
-		  cntce++;
-		  cpe3 = cpe2;
-		  cpe2 = cpe1;
-		  cpe1 = j;
-		  if (cntce >= 3)
-		    {
-		      ClipPlaneTrig cpt;
-		      cpt.elnr = ei;
-
-		      for (k = 0; k < 3; k++)
-			{
-			  int ednr;
-			  switch (k)
-			    {
-			    case 0: ednr = cpe1; break;
-			    case 1: ednr = cpe2; break;
-			    case 2: ednr = cpe3; break;
-			    }
-			  cpt.points[k].p = edgep[ednr];
-
-			  int pi1 = edgei[ednr][0];
-			  int pi2 = edgei[ednr][1];
-			  Point<3> p1 = pointsloc.Get (loctetsloc[ii][pi1]);
-			  Point<3> p2 = pointsloc.Get (loctetsloc[ii][pi2]);
-			  for (l = 0; l < 3; l++)
-			    cpt.points[k].lami(l) = 
-			      edgelam[ednr]     * p1(l) + 
-			      (1-edgelam[ednr]) * p2(l);
-			}
-
-		      trigs.Append (cpt);
-		    }
-		}
-	    }
-	}
-	}
-      
-    }
-}
-
-void VisualSceneSolution :: GetClippingPlaneGrid (ARRAY<ClipPlanePoint> & pts)
-{
-  int i, j, k;
-  int np = mesh->GetNV();
-  int ne = mesh->GetNE();
-  
-  Vec3d n(clipplane[0], clipplane[1], clipplane[2]);
-
-  double mu = -clipplane[3] / n.Length2();
-  Point3d p(mu*n.X(), mu * n.Y(), mu * n.Z());
-
-  n /= n.Length();
-  Vec3d t1, t2;
-  n.GetNormal (t1);
-  t2 = Cross (n, t1);
-
-  double xi1, xi2;
-
-  double xi1mid = (center - p) * t1;
-  double xi2mid = (center - p) * t2;
-
-  pts.SetSize(0);
-
-  int elnr;
-  double lami[3];
-
-  //  cout << "getclippingplanegrid. xoffset = " << xoffset << ", yoffset = ";
-  //  cout << yoffset << endl;
-
-  for (xi1 = xi1mid-rad+xoffset/gridsize; xi1 <= xi1mid+rad+xoffset/gridsize; xi1 += rad / gridsize)
-    for (xi2 = xi2mid-rad+yoffset/gridsize; xi2 <= xi2mid+rad+yoffset/gridsize; xi2 += rad / gridsize)
-      //  for (xi1 = xi1mid-rad; xi1 <= xi1mid+rad; xi1 += rad / gridsize)
-      //    for (xi2 = xi2mid-rad; xi2 <= xi2mid+rad; xi2 += rad / gridsize)
-      {
-	Point3d hp = p + xi1 * t1 + xi2 * t2;
-
-	elnr = mesh->GetElementOfPoint (hp, lami)-1;
-
-	if (elnr != -1)
-	  {
-	    ClipPlanePoint cpp;
-	    cpp.p = hp;
-	    cpp.elnr = elnr;
-	    cpp.lam1 = lami[0];
-	    cpp.lam2 = lami[1];
-	    cpp.lam3 = lami[2];
-	    pts.Append (cpp);
-	  }
-      }
-};
-
-
-
-void VisualSceneSolution ::
-SetOpenGlColor(double h, double hmin, double hmax, int logscale)
-{
-  double value;
-
-  if (!logscale)
-    value = (h - hmin) / (hmax - hmin);
-  else
-    {
-      if (hmax <= 0) hmax = 1;
-      if (hmin <= 0) hmin = 1e-4 * hmax;
-      value = (log(fabs(h)) - log(hmin)) / (log(hmax) - log(hmin));
-    }
-
-  if (!invcolor)
-    value = 1 - value;
-
-  if (usetexture)
-    {
-      glTexCoord1f ( 0.999 * value + 0.001);
-      return;
-    };
-
-  if (value > 1) value = 1;
-  if (value < 0) value = 0;
-
-  value *= 4;
-
-  static const double colp[][3] =
-  {
-    { 1, 0, 0 },
-    { 1, 1, 0 },
-    { 0, 1, 0 },
-    { 0, 1, 1 },
-    { 0, 0, 1 },
-    { 1, 0, 1 },
-    { 1, 0, 0 },
-  };
-  
-  int i = int(value);
-  double r = value - i;
-
-  GLdouble col[3];
-  for (int j = 0; j < 3; j++)
-    col[j] = (1-r) * colp[i][j] + r * colp[i+1][j];
-  
-  glColor3d (col[0], col[1], col[2]);
-}
-
-
-
-
-void VisualSceneSolution ::
-DrawCone (const Point<3> & p1, const Point<3> & p2, double r)
-{
-  int n = 10, i;
-  Vec<3> p1p2 = p2 - p1;
-
-  p1p2.Normalize();
-  Vec<3> p2p1 = -p1p2;
-
-  Vec<3> t1 = p1p2.GetNormal();
-  Vec<3> t2 = Cross (p1p2, t1);
-
-  Point<3> oldp = p1 + r * t1;
-  Vec<3> oldn = t1;
-
-  Point<3> p;
-  Vec<3> normal;
-
-  Mat<2> rotmat;
-  Vec<2> cs, newcs;
-  cs(0) = 1;
-  cs(1) = 0;
-  rotmat(0,0) = rotmat(1,1) = cos(2*M_PI/n);
-  rotmat(1,0) = sin(2*M_PI/n);
-  rotmat(0,1) = -rotmat(1,0);
-
-  glBegin (GL_TRIANGLES);
-  double phi;
-  for (i = 1; i <= n; i++)
-    {
-      /*
-      phi = 2 * M_PI * i / n;
-      normal = cos(phi) * t1 + sin(phi) * t2;
-      */
-      newcs = rotmat * cs;
-      cs = newcs;
-      normal = cs(0) * t1 + cs(1) * t2;
-
-      p = p1 + r * normal;
-
-      // cone
-      glNormal3dv (normal);
-      glVertex3dv (p);
-      glVertex3dv (p2);
-      glNormal3dv (oldn);
-      glVertex3dv (oldp);
-
-      // base-circle
-      glNormal3dv (p2p1);
-      glVertex3dv (p);
-      glVertex3dv (p1);
-      glVertex3dv (oldp);
-
-      oldp = p;
-      oldn = normal;
-    }
-  glEnd ();
-}
-
-
-
-void VisualSceneSolution ::
-DrawCylinder (const Point<3> & p1, const Point<3> & p2, double r)
-{
-  int n = 10, i;
-  Vec<3> p1p2 = p2 - p1;
-
-  p1p2.Normalize();
-  Vec<3> p2p1 = -p1p2;
-
-  Vec<3> t1 = p1p2.GetNormal();
-  Vec<3> t2 = Cross (p1p2, t1);
-
-  Point<3> oldhp1 = p1 + r * t1;
-  Point<3> oldhp2 = p2 + r * t1;
-  Vec<3> oldn = t1;
-
-  Point<3> hp1, hp2;
-  Vec<3> normal;
-
-  Mat<2> rotmat;
-  Vec<2> cs, newcs;
-  cs(0) = 1;
-  cs(1) = 0;
-  rotmat(0,0) = rotmat(1,1) = cos(2*M_PI/n);
-  rotmat(1,0) = sin(2*M_PI/n);
-  rotmat(0,1) = -rotmat(1,0);
-
-  glBegin (GL_QUADS);
-  double phi;
-  for (i = 1; i <= n; i++)
-    {
-      newcs = rotmat * cs;
-      cs = newcs;
-      normal = cs(0) * t1 + cs(1) * t2;
-
-      hp1 = p1 + r * normal;
-      hp2 = p2 + r * normal;
-
-      // cylinder
-      glNormal3dv (normal);
-
-      glVertex3dv (hp1);
-      glVertex3dv (hp2);
-      glVertex3dv (oldhp2);
-      glVertex3dv (oldhp1);
-
-      oldhp1 = hp1;
-      oldhp2 = hp2;
-      oldn = normal;
-    }
-  glEnd ();
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-void VisualSceneSolution :: MouseDblClick (int px, int py)
-{
-  ;
-}
-
-
-void VisualSceneSolution :: 
-DrawClipPlaneTrig (const SolData * sol, 
-		   int comp,
-		   const ClipPlaneTrig & trig, 
-		   int level)
-{
-  int j;
-  double val;
-  if (level <= 0)
-    for (j = 0; j < 3; j++)
-      {
-	Point<3> p;
-	if (mesh->GetCurvedElements().IsHighOrder())
-	  {
-	    mesh->GetCurvedElements().
-	      CalcElementTransformation (trig.points[j].lami, trig.elnr, p);
-	  }
-	else
-	  p = trig.points[j].p;
-	
-	if (deform)
-	  {
-	    Vec<3> def;
-	    GetDeformation (trig.elnr, 		    
-			    trig.points[j].lami(0),
-			    trig.points[j].lami(1),
-			    trig.points[j].lami(2), def);
-	    p += def;
-	  }
-
-	
-	// TODO: consider return value (bool: draw/don't draw element)
-	GetValue (sol, trig.elnr, 
-		  trig.points[j].lami(0),
-		  trig.points[j].lami(1),
-		  trig.points[j].lami(2), scalcomp, val);
-      
-	SetOpenGlColor  (val, minval, maxval, logscale);
-	glVertex3dv (p);
-      }
-  else
-    {
-      Point<3> newp = Center (trig.points[1].p, trig.points[2].p);
-      Point<3> newlami = Center (trig.points[1].lami, trig.points[2].lami);
-      ClipPlaneTrig t1, t2;
-      t1.elnr = t2.elnr = trig.elnr;
-      t1.points[0].p = newp;
-      t1.points[0].lami = newlami;
-      t1.points[1] = trig.points[2];
-      t1.points[2] = trig.points[0];
-      t2.points[0].p = newp;
-      t2.points[0].lami = newlami;
-      t2.points[1] = trig.points[0];
-      t2.points[2] = trig.points[1];
-      DrawClipPlaneTrig (sol, comp, t1, level-1);
-      DrawClipPlaneTrig (sol, comp, t2, level-1);
-    }
-}
-
-
-
-
-
-int Ng_Vis_Set (ClientData clientData,
-		Tcl_Interp * interp,
-		int argc, tcl_const char *argv[])
-
-{
-  int i;
-  if (argc >= 2)
-    {
-      if (strcmp (argv[1], "parameters") == 0)
-	{
-	  vssolution.imag_part = 
-	    atoi (Tcl_GetVar (interp, "visoptions.imaginary", 0));	  
-	  vssolution.usetexture = 
-	    atoi (Tcl_GetVar (interp, "visoptions.usetexture", 0));	  
-	  vssolution.invcolor = 
-	    atoi (Tcl_GetVar (interp, "visoptions.invcolor", 0));	  
-
-	  vssolution.clipsolution = 0;
-
-	  if (strcmp (Tcl_GetVar (interp, "visoptions.clipsolution", 0), 
-		      "scal") == 0)
-	    vssolution.clipsolution = 1;
-	  if (strcmp (Tcl_GetVar (interp, "visoptions.clipsolution", 0), 
-		      "vec") == 0)
-	    vssolution.clipsolution = 2;
-	    
-	  // SZ const -> tcl_const
-	  tcl_const char * scalname =  
-	    Tcl_GetVar (interp, "visoptions.scalfunction", 0);
-	  // SZ const -> tcl_const 
-	  tcl_const char * vecname = 
-	    Tcl_GetVar (interp, "visoptions.vecfunction", 0);
-	  
-	  vssolution.scalfunction = -1;
-	  vssolution.vecfunction = -1;
-
-	  int pointpos; // SZ 
-	  char * pch;
-	  pch=strchr(scalname,'.');
-	  pointpos = int(pch-scalname+1);
-
-	  for (i = 0; i < vssolution.soldata.Size(); i++)
-	    {
-	      if (strlen (vssolution.soldata[i]->name) ==
-		  pointpos-1 &&
-		  strncmp (vssolution.soldata[i]->name, scalname,
-			   pointpos-1) == 0)
-		{
-		  vssolution.scalfunction = i;
-		  vssolution.scalcomp = atoi (scalname + pointpos);
-		}
-	      if (strcmp (vssolution.soldata[i]->name, vecname) == 0)
-		vssolution.vecfunction = i;
-	    }
-
-	  
-	  tcl_const char * evalname = 
-	    Tcl_GetVar (interp, "visoptions.evaluate", 0);
-	  
-	  if (strcmp(evalname, "abs") == 0) vssolution.evalfunc = VisualSceneSolution::FUNC_ABS;
-	  if (strcmp(evalname, "abstens") == 0) vssolution.evalfunc = VisualSceneSolution::FUNC_ABS_TENSOR;
-	  if (strcmp(evalname, "mises") == 0) vssolution.evalfunc = VisualSceneSolution::FUNC_MISES;
-	  if (strcmp(evalname, "main") == 0) vssolution.evalfunc = VisualSceneSolution::FUNC_MAIN;
-
-	  vssolution.gridsize = 
-	    atoi (Tcl_GetVar (interp, "visoptions.gridsize", 0));
-
-	  vssolution.xoffset = 
-	    atof (Tcl_GetVar (interp, "visoptions.xoffset", 0));
-
-	  //	  cout << "x-offset:" << vssolution.xoffset << endl;
-
-	  vssolution.yoffset = 
-	    atof (Tcl_GetVar (interp, "visoptions.yoffset", 0));
-
-	  vssolution.autoscale = 
-	    atoi (Tcl_GetVar (interp, "visoptions.autoscale", 0));
-
-	  /*
-	  vssolution.linear_colors = 
-	    atoi (Tcl_GetVar (interp, "visoptions.lineartexture", 0));
-	  */
-	  vssolution.logscale = 
-	    atoi (Tcl_GetVar (interp, "visoptions.logscale", 0));
-
-	  vssolution.mminval = 
-	    atof (Tcl_GetVar (interp, "visoptions.mminval", 0));
-	  vssolution.mmaxval = 
-	    atof (Tcl_GetVar (interp, "visoptions.mmaxval", 0));
-
-	  vssolution.showclipsolution = 
-	    atoi (Tcl_GetVar (interp, "visoptions.showclipsolution", 0));
-	  vssolution.showsurfacesolution = 
-	    atoi (Tcl_GetVar (interp, "visoptions.showsurfacesolution", 0));
-	  vssolution.lineartexture = 
-	    atoi (Tcl_GetVar (interp, "visoptions.lineartexture", 0));
-	  vssolution.numtexturecols = 
-	    atoi (Tcl_GetVar (interp, "visoptions.numtexturecols", 0));
-
-	  vssolution.multidimcomponent = 
-	    atoi (Tcl_GetVar (interp, "visoptions.multidimcomponent", 0));
-
-	  vssolution.draw_fieldlines = 
-	    atoi (Tcl_GetVar (interp, "visoptions.drawfieldlines", 0));
-	  vssolution.num_fieldlines = 
-	    atoi (Tcl_GetVar (interp, "visoptions.numfieldlines", 0));
-	  vssolution.fieldlines_randomstart =
-	    atoi (Tcl_GetVar (interp, "visoptions.fieldlinesrandomstart", 0));
-	    
-	  
-	  vssolution.deform =
-	    atoi (Tcl_GetVar (interp, "visoptions.deformation", 0));
-	  vssolution.scaledeform =
-	    atof (Tcl_GetVar (interp, "visoptions.scaledeform1", 0)) *
-	    atof (Tcl_GetVar (interp, "visoptions.scaledeform2", 0));
-
-
-	  if (atoi (Tcl_GetVar (interp, "visoptions.isolines", 0)))
-	    vssolution.numisolines = atoi (Tcl_GetVar (interp, "visoptions.numiso", 0));
-	  else
-	    vssolution.numisolines = 0;
-
-	  vssolution.subdivisions = 
-	    atoi (Tcl_GetVar (interp, "visoptions.subdivisions", 0));
-	  vssolution.UpdateSolutionTimeStamp();
-	}
-      
-      if (argc >= 3 && strcmp (argv[1], "time") == 0)
-	{
-	  vssolution.time = double (atoi (argv[2])) / 1000;
-	  vssolution.solutiontimestamp = NextTimeStamp();
-	  // cout << "time = " << vssolution.time << endl;
-	}
-
-    }
-  return TCL_OK;
-}
-
-int Ng_Vis_Field (ClientData clientData,
-		  Tcl_Interp * interp,
-		  int argc, tcl_const char *argv[])
-{
-  int i;
-  static char buf[1000];
-  buf[0] = 0;
-
-  if (argc >= 2)
-    {
-      if (strcmp (argv[1], "setfield") == 0)
-	{
-	  if (argc < 3)
-	    return TCL_ERROR;
-
-	  for (i = 0; i < vssolution.GetNSolData(); i++)
-	    if (strcmp (vssolution.GetSolData(i)->name, argv[2]) == 0)
-	      {
-		cout << "found soldata " << i << endl;
-	      }
-	}
-
-      if (strcmp (argv[1], "getnfieldnames") == 0)
-	{
-	  sprintf (buf, "%d", vssolution.GetNSolData());
-	}
-      
-      if (strcmp (argv[1], "getfieldname") == 0)
-	{
-	  sprintf (buf, "%s", vssolution.GetSolData(atoi(argv[2])-1)->name);
-	}
-
-      if (strcmp (argv[1], "iscomplex") == 0)
-	{
-	  sprintf (buf, "%d", vssolution.GetSolData(atoi(argv[2])-1)->iscomplex);
-	}
-
-      if (strcmp (argv[1], "getfieldcomponents") == 0)
-	{
-	  sprintf (buf, "%d", vssolution.GetSolData(atoi(argv[2])-1)->components);
-	}
-
-      
-      if (strcmp (argv[1], "getfieldnames") == 0)
-	{
-	  for (i = 0; i < vssolution.GetNSolData(); i++)
-	    {
-	      strcat (buf, vssolution.GetSolData(i)->name);
-	      strcat (buf, " ");
-	    }
-	  strcat (buf, "var1 var2 var3");
-	  Tcl_SetResult (interp, buf, TCL_STATIC);
-	}
-
-      if (strcmp (argv[1], "setcomponent") == 0)
-	{
-	  cout << "set component " << argv[2] << endl;
-	}
-
-      if (strcmp (argv[1], "getactivefield") == 0)
-	{
-	  sprintf (buf, "1");
-	}
-
-      if (strcmp (argv[1], "getdimension") == 0)
-	{
-	  sprintf (buf, "%d", mesh->GetDimension());
-	}
-    }
-
-  Tcl_SetResult (interp, buf, TCL_STATIC);
-  return TCL_OK;
-}
-
-
-extern "C" int Ng_Vis_Init (Tcl_Interp * interp);
-
-int Ng_Vis_Init (Tcl_Interp * interp)
-{
-  Tcl_CreateCommand (interp, "Ng_Vis_Set", Ng_Vis_Set,
-		     (ClientData)NULL,
-		     (Tcl_CmdDeleteProc*) NULL);
-
-  Tcl_CreateCommand (interp, "Ng_Vis_Field", Ng_Vis_Field,
-		     (ClientData)NULL,
-		     (Tcl_CmdDeleteProc*) NULL);
-
-
-  return TCL_OK;
-}
-}
diff --git a/contrib/Netgen/libsrc/visualization/vssolution.hpp b/contrib/Netgen/libsrc/visualization/vssolution.hpp
deleted file mode 100644
index d20654b5fc57a10a5c80efb28f74330d36df7581..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/visualization/vssolution.hpp
+++ /dev/null
@@ -1,220 +0,0 @@
-#ifndef FILE_VSSOLUTION
-#define FILE_VSSOLUTION
-
-
-
-
-
-extern int Ng_Vis_Set (ClientData clientData,
-		       Tcl_Interp * interp,
-		       int argc, tcl_const char *argv[]);
-
-class VisualSceneSolution : public VisualScene
-{
-  class ClipPlaneTrig
-  {
-  public:
-    struct ps 
-    {
-      Point<3> lami;
-      Point<3> p;
-    };
-    ps points[3];
-    ElementIndex elnr;
-  };
-
-  class ClipPlanePoint
-  {
-  public:
-    ElementIndex elnr;
-    double lam1, lam2, lam3;
-    Point<3> p;
-  };
-
-
-  int surfellist;
-  int linelist;
-  int clipplanelist;
-  int isolinelist;
-  int clipplane_isolinelist;
-  int surface_vector_list;
-  int cone_list;
-
-  bool draw_fieldlines;
-  int num_fieldlines;
-  bool fieldlines_randomstart;
-  int fieldlineslist;
-  int num_fieldlineslists;
-
-  int surfeltimestamp, clipplanetimestamp, solutiontimestamp;
-  int surfellinetimestamp;
-  int fieldlinestimestamp, surface_vector_timestamp;
-  double minval, maxval;
-
-  
-
-  NgLock *lock;
-
-public:
-
-  enum EvalFunc { 
-    FUNC_ABS = 1, 
-    FUNC_ABS_TENSOR = 2,
-    FUNC_MISES = 3, 
-    FUNC_MAIN = 4
-  };
-  EvalFunc evalfunc;
-
-  enum SolType
-    { 
-      SOL_NODAL = 1, 
-      SOL_ELEMENT = 2, 
-      SOL_SURFACE_ELEMENT = 3, 
-      SOL_NONCONTINUOUS = 4, 
-      SOL_SURFACE_NONCONTINUOUS = 5,
-      SOL_VIRTUALFUNCTION = 6,
-      SOL_MARKED_ELEMENTS = 10,
-      SOL_ELEMENT_ORDER = 11,
-    };
-
-  class SolData
-  {
-  public:
-    SolData ();
-    ~SolData ();
-    
-    char * name;
-    double * data;
-    int components;
-    int dist;
-    int order;
-    bool iscomplex;
-    bool draw_volume;
-    bool draw_surface;
-    SolType soltype;
-    SolutionData * solclass;
-
-    // internal variables:
-    int size;
-  };
-
-  ARRAY<SolData*> soldata;
-  
-
-
-  int usetexture;
-  int clipsolution;  // 0..no, 1..scal, 2..vec
-  int scalfunction, scalcomp, vecfunction;
-  int gridsize;
-  double xoffset, yoffset;
-
-  int autoscale, logscale;
-  double mminval, mmaxval;
-  int numisolines;
-  int subdivisions;
-
-  bool showclipsolution;
-  bool showsurfacesolution;
-  bool lineartexture;
-  int numtexturecols;
-
-  int multidimcomponent;
-
-  // bool fieldlineplot;
-  double time;
-
-  int deform;
-  double scaledeform;
-  bool imag_part;
-
-public:
-  VisualSceneSolution ();
-  virtual ~VisualSceneSolution ();
-
-  virtual void BuildScene (int zoomall = 0);
-  virtual void DrawScene ();
-  virtual void MouseDblClick (int px, int py);
-
-  void BuildFieldLinesPlot ();
-
-  void AddSolutionData (SolData * soldata);
-  void ClearSolutionData ();
-  void UpdateSolutionTimeStamp ();
-  SolData * GetSolData (int i);
-  int GetNSolData () { return soldata.Size(); }
-
-  void SaveSolutionData (const char * filename);
-private:
-  void GetMinMax (int funcnr, int comp, double & minv, double & maxv) const;
-
-  void GetClippingPlaneTrigs (ARRAY<ClipPlaneTrig> & trigs);
-  void GetClippingPlaneGrid (ARRAY<ClipPlanePoint> & pts);
-  void DrawCone (const Point<3> & p1, const Point<3> & p2, double r);
-  void DrawCylinder (const Point<3> & p1, const Point<3> & p2, double r);
-
-
-  // Get Function Value, local coordinates lam1, lam2, lam3, 
-  bool GetValue (const SolData * data, ElementIndex elnr, 
-		   double lam1, double lam2, double lam3,
-		   int comp, double & val) const;
-  bool GetSurfValue (const SolData * data, SurfaceElementIndex elnr,
-		     double lam1, double lam2, 
-		     int comp, double & val) const;
-  bool GetValues (const SolData * data, ElementIndex elnr, 
-		  double lam1, double lam2, double lam3,
-		  double * values) const;
-  bool GetSurfValues (const SolData * data, SurfaceElementIndex elnr,
-		      double lam1, double lam2, 
-		      double * values) const;
-
-  void GetDeformation (ElementIndex elnr, double lam1, double lam2, double lam3,
-		       Vec<3> & def) const;
-  void GetSurfDeformation (SurfaceElementIndex selnr, double lam1, double lam2,
-			   Vec<3> & def) const;
-
-  void GetPointDeformation (int pnum, Point<3> & p, SurfaceElementIndex elnr = -1) const;
-
-  /// draw elements (build lists)
-  void DrawSurfaceElements ();
-  void DrawSurfaceElementLines ();
-  void DrawSurfaceVectors ();
-  
-  void DrawIsoLines (const Point3d & p1, 
-		     const Point3d & p2, 
-		     const Point3d & p3,
-		     double val1, double val2, double val3,
-		     double minval, double maxval, int n);
-
-  // draw isolines between lines (p1,p2) and (p3,p4)
-  void DrawIsoLines2 (const Point3d & p1, 
-		      const Point3d & p2, 
-		      const Point3d & p3,
-		      const Point3d & p4,
-		      double val1, double val2, double val3, double val4,
-		      double minval, double maxval, int n);
-		     
-
-  void DrawClipPlaneTrig (const SolData * sol, 
-			  int comp,
-			  const ClipPlaneTrig & trig, 
-			  int level);
-			  
-  void SetOpenGlColor(double val, double valmin, double valmax, int logscale = 0);
-
-  
-  friend int Ng_Vis_Set (ClientData clientData,
-			 Tcl_Interp * interp,
-			 int argc, tcl_const char *argv[]);
-
-
-
-};
-
-
-extern VisualSceneSolution vssolution;
-
-
-
-
-#endif
-