diff --git a/contrib/Netgen/CMakeLists.txt b/contrib/Netgen/CMakeLists.txt
index c8e06366b824a1a575197db568e127f6b26815ee..62596d4a06a13dab55ca4491abd90d1c496a6d92 100644
--- a/contrib/Netgen/CMakeLists.txt
+++ b/contrib/Netgen/CMakeLists.txt
@@ -4,21 +4,20 @@
 # bugs and problems to <gmsh@geuz.org>.
 
 set(gen libsrc/general)
-set(int libsrc/interface)
 set(lin libsrc/linalg)
 set(gpr libsrc/gprim)
 set(mes libsrc/meshing)
 set(opt libsrc/opti)
 
 set(SRC
-  nglib_addon.cpp
+  nglib_gmsh.cpp
   ${gen}/array.cpp ${gen}/bitarray.cpp ${gen}/hashtabl.cpp 
     ${gen}/symbolta.cpp ${gen}/table.cpp ${gen}/flags.cpp
     ${gen}/spbita2d.cpp ${gen}/seti.cpp ${gen}/optmem.cpp ${gen}/sort.cpp 
-    ${gen}/mystring.cpp ${gen}/parthreads.cpp ${gen}/moveablemem.cpp 
+    ${gen}/mystring.cpp ${gen}/parthreads.cpp
     ${gen}/dynamicmem.cpp ${gen}/ngexception.cpp ${gen}/profiler.cpp
-  ${int}/nglib.cpp
-  ${lin}/densemat.cpp ${lin}/polynomial.cpp
+  ${lin}/densemat.cpp ${lin}/polynomial.cpp ${lin}/bfgs.cpp
+    ${lin}/linopt.cpp ${lin}/linsearch.cpp
   ${gpr}/geom2d.cpp ${gpr}/geom3d.cpp ${gpr}/geomtest3d.cpp ${gpr}/adtree.cpp 
     ${gpr}/transform3d.cpp ${gpr}/geomfuncs.cpp
   ${mes}/meshclass.cpp ${mes}/adfront2.cpp ${mes}/adfront3.cpp 
@@ -34,8 +33,7 @@ set(SRC
     ${mes}/refine.cpp ${mes}/bisect.cpp ${mes}/boundarylayer.cpp 
     ${mes}/specials.cpp ${mes}/msghandler.cpp ${mes}/pyramidrls.cpp
     ${mes}/pyramid2rls.cpp ${mes}/prism2rls.cpp ${mes}/curvedelems.cpp
-    ${mes}/curvedelems2.cpp ${mes}/curvedelems_new.cpp ${mes}/validate.cpp
-  ${opt}/bfgs.cpp ${opt}/linsearch.cpp ${opt}/linopt.cpp
+    ${mes}/validate.cpp ${mes}/basegeom.cpp
 )
 
 file(GLOB_RECURSE HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h)
diff --git a/contrib/Netgen/COPYING.LIB b/contrib/Netgen/COPYING.LIB
deleted file mode 100644
index b1e3f5a2638797271cbc9b91b856c05ed6942c8f..0000000000000000000000000000000000000000
--- a/contrib/Netgen/COPYING.LIB
+++ /dev/null
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/contrib/Netgen/README.txt b/contrib/Netgen/README.txt
index 758926ba0fddcb4d6015a8ca1a8e5632c8acc319..0b05180fa494b05b39b66c2c3eb9cfafbdefec1e 100644
--- a/contrib/Netgen/README.txt
+++ b/contrib/Netgen/README.txt
@@ -1,18 +1,14 @@
 
-This directory contains a (very) slightly modified version of Joachim
-Sch\"oberl's NETGEN mesh generator:
+This directory contains the Joachim Sch\"oberl's NETGEN mesh
+generator:
 
-- only (part of the) the libsrc directory was kept from the original
-  distribution
+- the libsrc and nglib directories are unmodified copies taken from 
+  svn co https://netgen-mesher.svn.sourceforge.net/svnroot/netgen-mesher
+  (SVN rev. 469)
 
-- some of the makefiles were changed
+- the nglib_gmsh.cpp file replaces the original nglib/nglib.cpp file
 
-- parts of interface/nglib.cpp were #ifdef'd to remove the dependency
-  towards netgen's CAD engine
-
-All the changes are marked with "MODIFIED FOR GMSH" in the source code
-
-See COPYING.LIB for license information
+See the LICENSE file for license information
 
 **************************************************************
 
diff --git a/contrib/Netgen/VERSION b/contrib/Netgen/VERSION
deleted file mode 100644
index c910f26a991e177c33fe74f3198505fc87df5866..0000000000000000000000000000000000000000
--- a/contrib/Netgen/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-NG Version 4.5-development
diff --git a/contrib/Netgen/libsrc/general/array.cpp b/contrib/Netgen/libsrc/general/array.cpp
deleted file mode 100644
index 95d711a96fc7d09fb2e65a28b9c9fd490ed3fae9..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 3d90894edfacb5551297a3ee7bada29ec5f0991a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/array.hpp
+++ /dev/null
@@ -1,632 +0,0 @@
-#ifndef FILE_ARRAY
-#define FILE_ARRAY
-
-/**************************************************************************/
-/* File:   array.hpp                                                      */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-
-
-
-// template <class T, int B1, int B2> class IndirectArray;
-
-
-
-/**
-   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
-  FlatArray (int asize, T * adata) 
-    : size(asize), data(adata) { ; }
-
-  /// the size
-  int Size() const { return size; }
-
-  int Begin() const { return BASE; }
-  int End() const { return size+BASE; }
-
-  /*
-  /// access array. 
-  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. BASE-based
-  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]; 
-  }
-
-  /*
-  template <int B2>
-  IndirectArray<T, BASE, B2> operator[] (const FlatArray<int, B2> & ind) 
-  { return IndirectArray<T, BASE, B2>  (*this, ind); }
-  */
-
-  /// Access array, one-based  (old fashioned)
-  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]; 
-  }
-  
-  /// Access array, one-based  (old fashioned)
-  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]; 
-  }
-
-  /// Access array, one-based  (old fashioned)
-  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 first element
-  T & First () const
-  {
-    return data[0];
-  }
-
-
-  /// access last element. check by macro CHECK_RANGE
-  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;
-  }
-
-  /// takes range starting from position start of end-start elements
-  const FlatArray<T> Range (int start, int end)
-  {
-    return FlatArray<T> (end-start, data+start);
-  }
-
-  /// first position of element elem, returns -1 if element not contained in array 
-  int Pos(const T & elem) const
-  {
-    int pos = -1;
-    for(int i=0; pos==-1 && i < this->size; i++)
-      if(elem == data[i]) pos = i;
-    return pos;
-  }
-
-  /// does the array contain element elem ?
-  bool Contains(const T & elem) const
-  {
-    return ( Pos(elem) >= 0 );
-  }
-};
-
-
-
-// print array
-template <class T, int BASE>
-inline ostream & operator<< (ostream & s, const FlatArray<T,BASE> & a)
-{
-  for (int i = a.Begin(); i < a.End(); 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;
-  }
-
-  template <typename T2, int B2>
-  void Append (FlatArray<T2, B2> a2)
-  {
-    if (this->size+a2.Size() > allocsize)
-      ReSize (this->size+a2.Size());
-    for (int i = 0; i < a2.Size(); i++)
-      this->data[this->size+i] = a2[i+B2];
-    this->size += a2.Size();
-  }
-
-
-  /*
-  template <int B1, int B2>
-  void Append (const IndirectArray<T,B1,B2> & a2)
-  {
-    if (this->size+a2.Size() > allocsize)
-      ReSize (this->size+a2.Size());
-    for (int i = 0; i < a2.Size(); i++)
-      this->data[this->size+i] = a2[i+B2];
-    this->size += a2.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;
-  }
-
-  /// array copy
-  ARRAY & operator= (const FlatArray<T> & 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];     // Intel C++ calls dummy constructor
-  // 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, int B1, int B2>
-class IndirectArray
-{
-  const FlatArray<T, B1> & array;
-  const FlatArray<int, B2> & ia; 
-
-public:
-  IndirectArray (const FlatArray<T,B1> & aa, const FlatArray<int, B2> & aia)
-    : array(aa), ia(aia) { ; }
-  int Size() const { return ia.Size(); }
-  const T & operator[] (int i) const { return array[ia[i]]; }
-};
-*/
-
-
-
-
-
-
-
-
-
-
-///
-template <class T, int BASE = 0> 
-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-BASE]; }
-
-  ///
-  const T & operator[] (int i) const
-  { return ((const T*)data)[i-BASE]; }
-
-  ///
-  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;
-  }
-
-
-  MoveableArray & Copy (const MoveableArray & a2)
-  {
-    SetSize (a2.Size());
-    for (int i = 0; i < this->size; i++)
-      data[i] = a2.data[i];
-    return *this;
-  }
-
-  /// array copy
-  MoveableArray & operator= (const MoveableArray & a2)
-  {
-    return Copy(a2);
-  }
-
-
-  void SetName (const 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;
-}
-
-
-/// bubble sort array
-template <class T>
-inline void BubbleSort (const FlatArray<T> & data)
-{
-  T hv;
-  for (int i = 0; i < data.Size(); i++)
-    for (int j = i+1; j < data.Size(); j++)
-      if (data[i] > data[j])
-	{
-	  hv = data[i];
-	  data[i] = data[j];
-	  data[j] = hv;
-	}
-}
-/// bubble sort array
-template <class T, class S>
-inline void BubbleSort (FlatArray<T> & data, FlatArray<S> & slave)
-{
-  T hv;
-  S hvs;
-  for (int i = 0; i < data.Size(); i++)
-    for (int j = i+1; j < data.Size(); j++)
-      if (data[i] > data[j])
-	{
-	  hv = data[i];
-	  data[i] = data[j];
-	  data[j] = hv;
-
-	  hvs = slave[i];
-	  slave[i] = slave[j];
-	  slave[j] = hvs;
-	}
-}
-
-
-template <class T> 
-void Intersection (const FlatArray<T> & in1, const FlatArray<T> & in2, 
-		   ARRAY<T> & out)
-{
-  out.SetSize(0);
-  for(int i=0; i<in1.Size(); i++)
-    if(in2.Contains(in1[i]))
-      out.Append(in1[i]);
-}
-template <class T> 
-void Intersection (const FlatArray<T> & in1, const FlatArray<T> & in2, const FlatArray<T> & in3,
-		   ARRAY<T> & out)
-{
-  out.SetSize(0);
-  for(int i=0; i<in1.Size(); i++)
-    if(in2.Contains(in1[i]) && in3.Contains(in1[i]))
-      out.Append(in1[i]);
-}
-
-
-
-
-#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 1c36e5fc043b42213f48bc8a06807a7f9b357762..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 ee3478da417f337e646c3c5c655f9de4694b95e7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/bitarray.hpp
+++ /dev/null
@@ -1,222 +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);
-  ///
-  INDEX Size () const
-  {
-    return size;
-  }
-
-  ///
-  void Set ();
-  ///
-  void Set (INDEX i)
-  {
-    data[Addr(i)] |= Mask(i);
-  }
-  
-  void Clear ();
-
-
-  void Clear (INDEX i)
-  {
-    data[Addr(i)] &= ~Mask(i);
-  }
-
-  bool Test (INDEX i) const
-  {
-    return (data[i / CHAR_BIT] & (char(1) << (i % CHAR_BIT) ) ) ? true : false;
-  }
-
-  ///
-  void Invert ();
-  ///
-  void And (const BitArray & ba2);
-  ///
-  void Or (const BitArray & ba2);
-private:
-  ///
-  inline unsigned char Mask (INDEX i) const
-  {
-    return char(1) << (i % CHAR_BIT);
-  }
-  ///
-  inline INDEX Addr (INDEX i) const
-  {
-  return (i / CHAR_BIT);
-  }
-
-  ///
-  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 << int (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 f41422f54c0cf13c881457981174712fe4261663..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/dynamicmem.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-#include <iostream>
-#include <iomanip>
-
-#ifdef SSE
-#include <emmintrin.h>
-#endif
-
-#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];
-
-    if (!ptr)
-      {
-	cerr << "BaseynamicMem, cannot allocate " << s << " bytes" << endl;
-	Print ();
-	throw ("BaseDynamicMem::Alloc: out of memory");
-      }
-    // ptr = (char*)malloc (s);
-    // ptr = (char*) _mm_malloc (s,16);
-  }
-
-  void BaseDynamicMem :: ReAlloc (size_t s)
-  {
-    if (size == s) return;
-
-    char * old = ptr;
-    ptr = new char[s];
-
-    if (!ptr)
-      {
-	cerr << "BaseynamicMem, cannot Reallocate " << s << " bytes" << endl;
-	Print ();
-	throw ("BaseDynamicMem::Alloc: out of memory");
-      }
-
-
-    // ptr = (char*)malloc(s);
-    // ptr = (char*) _mm_malloc (s,16);
-    memmove (ptr, old, (s < size) ? s : size);
-    delete [] old;
-    // free (old);
-    // _mm_free (old);
-    size = s;
-  }
-
-  void BaseDynamicMem :: Free ()
-  {
-    delete [] ptr;
-    // free (ptr);
-    // _mm_free (ptr);
-    ptr = 0;
-  }
-
-  void BaseDynamicMem :: Swap (BaseDynamicMem & m2)
-  {
-    size_t 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;
-    size_t mem = 0;
-    int cnt = 0;
-    while (p)
-      {
-	mem += p->size;
-	cnt++;
-
-	cout << setw(10) << p->size << " Bytes";
-	cout << ", addr = " << (void*)p->ptr;
-	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;
-  }
-
-
-#pragma warning(push)
-#ifdef __INTEL_COMPILER
-#pragma warning(disable:1684)
-#endif
-
-  void BaseDynamicMem :: GetUsed (int nr, char * ch)
-  {
-    BaseDynamicMem * p = first;
-
-    for (int i = 0; i < nr; i++)
-      ch[i] = '0';
-
-    while (p)
-      {
-        long unsigned hptr = (long unsigned) (p->ptr);
-	// uintptr_t hptr = reinterpret_cast<uintptr_t>(p->ptr); //??
-
-	hptr /= (1024*1024);
-	hptr /= (4096/nr);
-
-	size_t blocks = p->size / (1024*1024);
-	blocks /= (4096/nr);
-	
-	// cout << "ptr = " << (void*)(p->ptr) << ", size = " << p->size << ", hptr = " << hptr << " blocks = " << blocks << endl;
-
-	for (size_t i = 0; i <= blocks; i++)
-	  ch[hptr+i] = '1';
-
-	p = p->next;
-      }
-    
-    {
-
-    BaseMoveableMem * pm = BaseMoveableMem::first;
-    while (pm)
-      {
-        long unsigned hptr = (long unsigned) p->ptr;
-        // uintptr_t hptr = reinterpret_cast<uintptr_t>(pm->ptr);
-
-	hptr /= (1024*1024);
-	hptr /= (4096/nr);
-
-	size_t blocks = pm->size / (1024*1024);
-	blocks /= (4096/nr);
-	
-	// cout << "moveable, ptr = " << (void*)(pm->ptr) << ", size = " << pm->size << ", hptr = " << hptr << " blocks = " << blocks << endl;
-
-	for (size_t i = 0; i <= blocks; i++)
-	  ch[hptr+i] = '1';
-
-	pm = pm->next;
-      }
-    }
-
-
-
-  }
-
-#pragma warning(pop)
-}
diff --git a/contrib/Netgen/libsrc/general/dynamicmem.hpp b/contrib/Netgen/libsrc/general/dynamicmem.hpp
deleted file mode 100644
index 483c9a7f17be91bf46974ffb2037c6fd9a098843..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/dynamicmem.hpp
+++ /dev/null
@@ -1,95 +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 ();
-  static void GetUsed (int nr, char * ch);
-};
-
-
-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 b6b5ccf26871420e6700590ed9318bff2ffbd7d6..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;
-  }
-  
-  bool 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;
-      }
-  }
-
-
-  bool Flags :: StringFlagDefined (const char * name) const
-  {
-    return strflags.Used (name);
-  }
-
-  bool Flags :: NumFlagDefined (const char * name) const
-  {
-    return numflags.Used (name);
-  }
-
-  bool Flags :: StringListFlagDefined (const char * name) const
-  {
-    return strlistflags.Used (name);
-  }
-
-  bool 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 59c365ee18ed0e7722214f30893b379233f7e48d..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
-  bool 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
-  bool StringFlagDefined (const char * name) const;
-  /// Test, if num flag is defined
-  bool NumFlagDefined (const char * name) const;
-  /// Test, if string list flag is defined
-  bool StringListFlagDefined (const char * name) const;
-  /// Test, if num list flag is defined
-  bool 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 d5b77f3cba0bd68a1141ca8aa16872af41525d42..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/hashtabl.cpp
+++ /dev/null
@@ -1,327 +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_CLOSED_HASHTABLE ::
-  BASE_INDEX_CLOSED_HASHTABLE (int size)
-    : hash(size)
-  {
-    hash.SetName ("index-hashtable, hash");
-
-    invalid = -1;
-    for (int i = 1; i <= size; i++)
-      hash.Elem(i) = invalid;
-  }
-
-  void BASE_INDEX_CLOSED_HASHTABLE ::
-  BaseSetSize (int size)
-  {
-    hash.SetSize(size);
-    for (int i = 1; i <= size; i++)
-      hash.Elem(i) = invalid;
-  }
-
-  int BASE_INDEX_CLOSED_HASHTABLE ::
-  Position2 (const INDEX & ind) const
-  {
-    int i = HashValue(ind);
-    while (1)
-      {
-	i++;
-	if (i > hash.Size()) i = 1;
-	if (hash.Get(i) == ind) return i;
-	if (hash.Get(i) == invalid) return 0;
-      }
-  }
-
-  int BASE_INDEX_CLOSED_HASHTABLE ::
-  PositionCreate2 (const INDEX & ind, int & apos) 
-  {
-    int i = HashValue(ind);
-    int startpos = i;
-    while (1)
-      {
-	i++;
-	if (i > hash.Size()) i = 1;
-	if (hash.Get(i) == ind) 
-	  {
-	    apos = i;
-	    return 0;
-	  }
-	if (hash.Get(i) == invalid) 
-	  {
-	    hash.Elem(i) = ind;
-	    apos = i;
-	    return 1;
-	  }
-	if (i == startpos)
-	  throw NgException ("Try to set new element in full closed hashtable");
-      }
-  }
-
-  int BASE_INDEX_CLOSED_HASHTABLE :: UsedElements () const
-  {
-    int n = hash.Size();
-    int cnt = 0;
-    for (int i = 1; i <= n; i++)
-      if (hash.Get(i) != invalid)
-	cnt++;
-    return cnt;
-  }
-
-
-
-
-
-
-
-
-
-
-
-  BASE_INDEX_2_CLOSED_HASHTABLE ::
-  BASE_INDEX_2_CLOSED_HASHTABLE (int size)
-    : hash(size)
-  {
-    hash.SetName ("i2-hashtable, hash");
-
-    invalid = -1;
-    for (int i = 1; i <= size; i++)
-      hash.Elem(i).I1() = invalid;
-  }
-
-  void BASE_INDEX_2_CLOSED_HASHTABLE ::
-  BaseSetSize (int size)
-  {
-    hash.SetSize(size);
-    for (int i = 1; i <= size; i++)
-      hash.Elem(i).I1() = invalid;
-  }
-
-
-  int BASE_INDEX_2_CLOSED_HASHTABLE ::
-  Position2 (const INDEX_2 & ind) const
-  {
-    int 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 = HashValue(ind);
-    int startpos = i;
-    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;
-	  }
-	if (i == startpos)
-	  throw NgException ("Try to set new element in full closed hashtable");
-      }
-  }
-
-  int BASE_INDEX_2_CLOSED_HASHTABLE :: UsedElements () const
-  {
-    int n = hash.Size();
-    int cnt = 0;
-    for (int i = 1; i <= n; i++)
-      if (hash.Get(i).I1() != invalid)
-	cnt++;
-    return cnt;
-  }
-
-
-
-
-
-
-
-
-  void BASE_INDEX_3_CLOSED_HASHTABLE ::
-  BaseSetSize (int size)
-  {
-    hash.SetSize(size);
-    for (int i = 0; i < size; i++)
-      hash[i].I1() = invalid;
-  }
-
-  bool BASE_INDEX_3_CLOSED_HASHTABLE ::
-  PositionCreate2 (const INDEX_3 & ind, int & apos) 
-  {
-    int i = HashValue(ind);
-    int startpos = i;
-    while (1)
-      {
-        /*
-	i++;
-	if (i >= hash.Size()) i = 0;
-        */
-        i = (i+1) % hash.Size();
-	if (hash[i] == ind) 
-	  {
-	    apos = i;
-	    return false;
-	  }
-	if (hash[i].I1() == invalid) 
-	  {
-	    hash[i] = ind;
-	    apos = i;
-	    return true;
-	  }
-	if (i == startpos)
-	  throw NgException ("Try to set new element in full closed hashtable");
-      }
-  }
-}
-
diff --git a/contrib/Netgen/libsrc/general/hashtabl.hpp b/contrib/Netgen/libsrc/general/hashtabl.hpp
deleted file mode 100644
index bc1781b9650f110cd5cbcd44a74077e3839857ac..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/hashtabl.hpp
+++ /dev/null
@@ -1,1322 +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);
-  }
-
-
-  void DeleteData ()
-  {
-    int n = hash.Size();
-    hash.SetSize (n);
-    cont.SetSize (n);
-  }
-
-
-  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 ();
-
-
-
-
-
-
-
-
-
-  class Iterator
-  {
-    const INDEX_3_HASHTABLE & ht;    
-    int bagnr, pos;
-  public:
-    Iterator (const INDEX_3_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_3 & ahash, T & acont) const
-  {
-    ahash = hash[it.BagNr()][it.Pos()];
-    acont = cont[it.BagNr()][it.Pos()];
-  }
-
-  const INDEX_3 & 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_3_HASHTABLE<T> & ht)
-{
-  for (typename INDEX_3_HASHTABLE<T>::Iterator it = ht.Begin();
-       it != ht.End(); it++)
-    {
-      ost << ht.GetHash(it) << ": " << ht.GetData(it) << endl;
-    }
-
-  return ost;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/// Closed Hashing HT
-
-class BASE_INDEX_CLOSED_HASHTABLE
-{
-protected:
-  ///
-  MoveableArray<INDEX> hash;
-  ///
-  int invalid;
-public:
-  ///
-  BASE_INDEX_CLOSED_HASHTABLE (int size);
-
-  int Size() const { return hash.Size(); }
-  int UsedPos (int pos) const { return ! (hash.Get(pos) == invalid); }
-  int UsedElements () const;
-
-  ///
-  int HashValue (const INDEX & ind) const
-  {
-    return ind % hash.Size() + 1;
-  }
-
-
-  int Position (const INDEX & ind) const
-  {
-    int i = HashValue(ind);
-    while (1)
-      {
-	if (hash.Get(i) == ind) return i;
-	if (hash.Get(i) == invalid) return 0;
-	i++;
-	if (i > hash.Size()) i = 1;
-      }
-  }
-
-  // returns 1, if new postion is created
-  int PositionCreate (const INDEX & ind, int & apos)
-  {
-    int i = HashValue (ind);
-    if (hash.Get(i) == ind) 
-      {
-	apos = i;
-	return 0;
-      }
-    if (hash.Get(i) == invalid)
-      {
-	hash.Elem(i) = ind; 
-	apos = i;
-	return 1;
-      }
-    return PositionCreate2 (ind, apos);    
-  }
-
-protected:
-  int Position2 (const INDEX & ind) const;
-  int PositionCreate2 (const INDEX & ind, int & apos);
-  void BaseSetSize (int asize);
-};
-
-
-template <class T>
-class INDEX_CLOSED_HASHTABLE : public BASE_INDEX_CLOSED_HASHTABLE
-{
-  ///
-  MoveableArray<T> cont;
-
-public:
-  ///
-  INDEX_CLOSED_HASHTABLE (int size)
-    : BASE_INDEX_CLOSED_HASHTABLE(size), cont(size)
-  {
-    cont.SetName ("ind-hashtable, contents");
-  }
-
-
-  void Set (const INDEX & ahash, const T & acont)
-  {
-    int pos;
-    PositionCreate (ahash, pos);
-    hash.Elem(pos) = ahash;
-    cont.Elem(pos) = acont;
-  }
-
-  const T & Get (const INDEX & ahash) const
-  {
-    int pos = Position (ahash);
-    return cont.Get(pos);
-  }
-
-  ///
-  bool Used (const INDEX & ahash) const
-  {
-    int pos = Position (ahash);
-    return (pos != 0);
-  }
-  
-  
-  ///
-  inline void SetData (int pos, const INDEX & ahash, const T & acont)
-  {
-    hash.Elem(pos) = ahash;
-    cont.Elem(pos) = acont;
-  }
-
-  ///
-  void GetData (int pos, INDEX & ahash, T & acont) const
-  {
-    ahash = hash.Get(pos);
-    acont = cont.Get(pos);
-  }
-  
-  ///
-  inline void SetData (int pos, const T & acont)
-  {
-    cont.Elem(pos) = acont;
-  }
-  
-  ///
-  void GetData (int pos, T & acont) const
-  {
-    acont = cont.Get(pos);
-  }
-  
-  ///
-  const T & GetData (int pos) { return cont.Get(pos); }
-  ///
-  inline void SetSize (int size)
-  {
-    BaseSetSize(size);
-  cont.SetSize(size);
-  }
-  
-  ///
-  inline void DeleteData ()
-  { SetSize (cont.Size()); }
-
-  void SetName (const char * aname)
-  {
-    cont.SetName(aname);
-    hash.SetName(aname);
-  }
-};
-
-
-
-
-
-
-
-/// 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;
-      }
-  }
-
-  // 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;
-
-protected: 
-  // public:    //SZ
-  BASE_INDEX_3_CLOSED_HASHTABLE (int size)
-    : hash(size)
-  {
-    hash.SetName ("i3-hashtable, hash");
-    invalid = -1;
-    for (int i = 0; i < size; i++)
-      hash[i].I1() = invalid;
-  }
-
-public:
-  int Size() const 
-  {
-    return hash.Size(); 
-  }
-
-  bool UsedPos (int pos) const 
-  { 
-    return ! (hash[pos].I1() == invalid); 
-  }
-
-  int UsedElements () const
-  {
-    int n = hash.Size();
-    int cnt = 0;
-    for (int i = 0; i < n; i++)
-      if (hash[i].I1() != invalid)
-	cnt++;
-    return cnt;
-  }
-
-  int HashValue (const INDEX_3 & ind) const
-  {
-    return (ind.I1() + 15 * ind.I2() + 41 * ind.I3()) % hash.Size();
-  }
-  
-  int Position (const INDEX_3 & ind) const
-  {
-    int i = HashValue(ind);
-    while (1)
-      {
-	if (hash[i] == ind) return i;
-	if (hash[i].I1() == invalid) return -1;
-        i = (i+1) % hash.Size();
-      }
-  }
-
-  int Costs (const INDEX_3 & ind) const
-  {
-    int i = HashValue(ind);
-    int c = 1;
-    while (1)
-      {
-	if (hash[i] == ind) return c;
-	if (hash[i].I1() == invalid) return c;
-        i = (i+1) % hash.Size();
-        c++;
-      }
-  }
-
-
-  
-  // returns true, if new postion is created
-  bool PositionCreate (const INDEX_3 & ind, int & apos)
-  {
-    int i = HashValue (ind);
-    if (hash[i] == ind) 
-      {
-	apos = i;
-	return false;
-      }
-    if (hash[i].I1() == invalid)
-      {
-	hash[i] = ind; 
-	apos = i;
-	return true;
-      }
-    return PositionCreate2 (ind, apos);    
-  }
-
-protected:
-  bool 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,0> cont;
-
-public:
-  INDEX_3_CLOSED_HASHTABLE (int size)
-    : BASE_INDEX_3_CLOSED_HASHTABLE(size), cont(size)
-  {
-    cont.SetName ("i3-hashtable, contents");
-  }
-  
-  void Set (const INDEX_3 & ahash, const T & acont)
-  {
-    int pos;
-    PositionCreate (ahash, pos);
-    hash[pos] = ahash;
-    cont[pos] = acont;
-  }
-
-  const T & Get (const INDEX_3 & ahash) const
-  {
-    return cont[Position (ahash)];
-  }
-
-  bool Used (const INDEX_3 & ahash) const
-  {
-    return (Position (ahash) != -1);
-  }
-
-  void SetData (int pos, const INDEX_3 & ahash, const T & acont)
-  {
-    hash[pos] = ahash;
-    cont[pos] = acont;
-  }
-
-  void GetData (int pos, INDEX_3 & ahash, T & acont) const
-  {
-    ahash = hash[pos];
-    acont = cont[pos];
-  }
-
-  void SetData (int pos, const T & acont)
-  {
-    cont[pos] = acont;
-  }
-
-  void GetData (int pos, T & acont) const
-  {
-    acont = cont[pos];
-  }
-
-  const T & GetData (int pos) const
-  {
-    return cont[pos];
-  }
-
-   void SetSize (int size)
-  {
-    BaseSetSize(size);
-    cont.SetSize(size);
-  }
-
-  void PrintMemInfo (ostream & ost) const
-  {
-    cout << "Hashtable: " << Size() 
-         << " entries of size " << sizeof(INDEX_3) << " + " << sizeof(T) 
-         << " = " << Size() * (sizeof(INDEX_3) + sizeof(T)) << " bytes" << endl;
-    
-  }
-
-  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[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 e7f3c1dab6df0a8d8e32417fc28aeeee60271f42..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/moveablemem.cpp
+++ /dev/null
@@ -1,271 +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);
-      ptr = new char[s];
-
-      if (!ptr)
-	{
-	  cerr << "BaseynamicMem, cannot allocate " << s << " bytes" << endl;
-	  Print ();
-	  throw ("BaseDynamicMem::Alloc: out of memory");
-	}
-
-      return;
-    }
-
-
-  used += s - size;
-
-  size_t 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);
-	  largeblock = new char[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 = new char[s];
-
-      if (!ptr)
-	{
-	  cerr << "BaseynamicMem, cannot Reallocate " << s << " bytes" << endl;
-	  Print ();
-	  throw ("BaseDynamicMem::Alloc: out of memory");
-	}
-      
-
-
-      memmove (ptr, old, (s < size) ? s : size);
-      //free (old);
-      delete [] old;
-      size = s;
-      return;
-    }
-
-  Alloc (s);
-}
-
-void BaseMoveableMem :: MoveTo (size_t newpos)
-{
-  //  cout << "move block, oldpos = " << pos << "; newpos = " << newpos
-  // << ", size = " << size << endl;
-  static size_t 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);
-      delete [] 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()
-{
-  size_t 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;
-  long int mem = 0;
-  int cnt = 0;
-  while (p)
-    {
-      mem += long(p->size);
-      cnt++;
-
-      cout << setw(10) << p->size << " Bytes";
-      cout << ", pos = " << p->pos;
-      cout << ", addr = " << (void*)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 b0761ee233ad51f40bfbece3e8913dd4157928a7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/moveablemem.hpp
+++ /dev/null
@@ -1,99 +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; }
-  char * Ptr() const { return ptr; }
-  void Swap (BaseMoveableMem & m2) throw(); 
-public:
-  void SetName (const char * aname);
-  static void Print ();
-
-  friend class BaseDynamicMem;
-};
-
-
-
-
-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 T* () const
-  {
-    return reinterpret_cast<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 ec0740296065f7934d8443f84b5a1de64b5332b7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/myadt.hpp
+++ /dev/null
@@ -1,46 +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 "../include/mystdlib.h"
-#include "../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"
-#include "profiler.hpp"
-#include "netgenout.hpp"
-
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/mystring.cpp b/contrib/Netgen/libsrc/general/mystring.cpp
deleted file mode 100644
index 6538a460310e91d460230b09a6ea88022420059c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/mystring.cpp
+++ /dev/null
@@ -1,437 +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 ReadEnclString(istream & in, string & str, const char encl)
-  {
-    char currchar;
-    str = "";
-
-    in.get(currchar);
-    while(in && currchar == ' ' || currchar == '\t' || currchar == '\n')
-      in.get(currchar);
-	
-    if(currchar == encl)
-      {
-	in.get(currchar);
-	while(in && currchar != encl)
-	  {
-	    str += currchar;
-	    in.get(currchar);
-	  }
-      }
-    else
-      {
-	in.putback(currchar);
-	in >> str;
-      }
-  }
-	    
-	
-    
-  
-
-
-void DefaultStringErrHandler()
-{
-  cerr << "Error : string operation out of range\n" << flush;
-}
-
-void (*MyStr::ErrHandler)() = DefaultStringErrHandler;
-
-  /*     
-MyStr::MyStr()
-{
-  length = 0;
-  str = shortstr;
-  str[0] = 0;
-}
-  */
-
-MyStr::MyStr(const char *s)
-{
-  length = unsigned(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 = unsigned(strlen(buffer));
-  if (length > SHORTLEN)
-    str = new char[length + 1];
-  else
-    str = shortstr;
-  strcpy(str, buffer);
-}
-
-MyStr::MyStr(void * p)
-{
-  char buffer[32];
-  sprintf(buffer, "%p", p);
-  length = unsigned(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 = unsigned(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 = unsigned(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 = unsigned(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 = unsigned(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 string & st)
-{
-  length = unsigned(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;
-  }
-  unsigned 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;
-  }
-}
-
-string MyStr::cpp_string(void) const
-{
-  string aux(str,length);
-  return aux;
-}
-
-/*
-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 434ba9a3cb8b06d7f72b1332572cfd8d00df7ee7..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/mystring.hpp
+++ /dev/null
@@ -1,216 +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;
-
-
-// extract string str which is enclosed by the given character encl from a given string in
-void ReadEnclString(istream & in, string & str, const char encl);
-
-
-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(void *);
-  MyStr(long);
-  MyStr(double);
-  MyStr(const Point3d& p);
-  MyStr(const Vec3d& p);
-  MyStr(const 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();
-  string cpp_string(void) const;
-
-  //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/netgenout.hpp b/contrib/Netgen/libsrc/general/netgenout.hpp
deleted file mode 100644
index 2338445ad068ff10b1fbb648be05f86aead265b9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/netgenout.hpp
+++ /dev/null
@@ -1,184 +0,0 @@
-#ifndef NETGEN_OUT_STREAM_HPP__
-#define NETGEN_OUT_STREAM_HPP__
-
-// #include <ostream>
-// #include <mystdlib.h>
-// #include <meshing.hpp>
-
-#ifdef PARALLEL
-extern int id;
-extern int ntasks;
-#endif
-extern int printmessage_importance;
-
-
-
-class Imp
-{
-  int importance;
-public:
-  Imp () : importance(0) { ; }
-
-  Imp ( int aimportance ) : importance(aimportance) { ; }
-
-  int GetImp () const { return importance; }
-};
-
-
-class Proc
-{
-  int proc;
-public:
-  Proc () : proc(0) { ; }
-
-  Proc ( int aproc ) : proc(aproc) { ; }
-
-  int GetProc () const { return proc; }
-};
-
-class Procs
-{
-  const netgen::FlatArray<int> procs;
-
-public:
-
-  Procs ( const netgen::FlatArray<int> & aprocs ) : procs (aprocs) { ; }
-
-  const netgen::FlatArray<int> & GetProcs () const { return procs; }
-};
-
-
-
-class NetgenOutStream
-{
-  ostream * out;
-
-  bool print;
-  bool printheader;
-
-
-public:
-  NetgenOutStream() :
-    out(&std::cout),
-    print(1),
-    printheader(1)
-  {
-    ;
-  }  
-
-  NetgenOutStream(ostream * aout, Imp imp ) :
-    out(aout),
-    printheader(1)
-  { 
-    if ( netgen::printmessage_importance >= imp.GetImp() )
-      print = true;
-    else
-      print = false;
-  }
-
-  NetgenOutStream(ostream * aout, Proc proc ) :
-    out(aout),
-    printheader(1)
-  { 
-#ifdef PARALLEL
-    if ( netgen::id == proc.GetProc() )
-      print = true;
-    else
-      print = false;
-#else
-    if ( 0 == proc.GetProc() )
-      print = true;
-    else
-      print = false;
-
-#endif
-  }
-
-  NetgenOutStream(ostream * aout, Procs & procs ) :
-    out(aout),
-    printheader(1)
-  { 
-#ifdef PARALLEL
-    if ( procs.GetProcs().Contains(netgen::id) )
-      print = true;
-    else
-      print = false;
-#else
-    if ( procs.GetProcs().Contains(0) )
-      print = true;
-    else
-      print = false;
-
-#endif
-  }
-
-  ostream & OStream ()
-  {
-    return *out;
-  }
-
-  template <typename T>
-  NetgenOutStream & operator<< (T & var)
-  {
-    if ( print )
-      {
-#ifdef PARALLEL
-	if ( printheader )
-	  {
-	    *out << "proc " << netgen::id << ": ";
-	    printheader = false;
-	  }
-#endif
-	*out << var;
-      }
-    return (*this); 
-  }
-
-  NetgenOutStream& operator<< (ostream& ( *pf )(ostream&))
-  {
-    if ( print )
-      *out << (*pf) ;
-
-    return (*this);
-  }
-
-  NetgenOutStream& operator<< (ios& ( *pf )(ios&))
-  {
-    if ( print)
-      *out << (*pf) ;
-
-    printheader = 1;
-
-    return (*this);
-  }
-
-  NetgenOutStream& operator<< (ios_base& ( *pf )(ios_base&))
-  {
-    if (print )
-      *out << (*pf) ;
-    return (*this);
-  }
-
-
-};
-
-
-NetgenOutStream operator<< ( ostream & ost, Imp  imp );
-NetgenOutStream operator<< ( ostream & ost, Proc proc );
-NetgenOutStream operator<< ( ostream & ost, Procs & procs );
-// {
-//   return ( NetgenOutStream ( &ost, imp.GetImp() ) );
-// }
-
-// template <typename T>
-// NetgenOutStream& operator<< (NetgenOutStream& out, T c )
-// {
-//   out.OStream() << c << endl;
-//   return out;
-// }
-
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/ngexception.cpp b/contrib/Netgen/libsrc/general/ngexception.cpp
deleted file mode 100644
index 2496f6b3be3b2b410727d4cd04234a3015d10df0..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 d3f939ac1ae4453536490016806c929611d7590f..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/optmem.cpp
+++ /dev/null
@@ -1,64 +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++)
-    for (int i = 0; i < bablocks.Size(); i++)
-      delete [] bablocks[i];
-  }
-
-  void * BlockAllocator :: Alloc ()
-  {
-    //  return new char[size];
-    if (!freelist)
-      {
-	// cout << "freelist = " << freelist << endl;
-	// 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 0015b20b783efb4f199df420efb9d4dab144447a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/optmem.hpp
+++ /dev/null
@@ -1,59 +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;
-    freelist = *static_cast<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 a00ff9e287caec8361d94da6a9193a6de8e576b0..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/parthreads.hpp
+++ /dev/null
@@ -1,129 +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 _MSC_VER
-
-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 = false)
-    : 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 = true;
-  }
-  void UnLock ()
-  {
-    pthread_mutex_unlock (&mut);
-    locked = false;
-  }
-  /*
-  int TryLock ()
-  {
-    return pthread_mutex_trylock (&mut);
-  }
-  */
-};
-
-#endif
-
-#endif
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/profiler.cpp b/contrib/Netgen/libsrc/general/profiler.cpp
deleted file mode 100644
index bbe0423c2969374a0c773eeb33827020e605ee65..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/profiler.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/**************************************************************************/
-/* File:   profiler.cpp                                                   */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   19. Apr. 2002                                                  */
-/**************************************************************************/
-
-
-#include <myadt.hpp>
-
-namespace netgen
-{
-  //using namespace netgen;
-
-  long int NgProfiler::tottimes[SIZE];
-  long int NgProfiler::starttimes[SIZE];
-  long int NgProfiler::counts[SIZE];
-  string NgProfiler::names[SIZE];
-  int NgProfiler::usedcounter[SIZE];
-  
-
-  NgProfiler :: NgProfiler()
-  {
-    for (int i = 0; i < SIZE; i++)
-      {
-	tottimes[i] = 0;
-	usedcounter[i] = 0;
-      }
-
-    total_timer = CreateTimer ("total CPU time");
-    StartTimer (total_timer);
-  }
-
-  NgProfiler :: ~NgProfiler()
-  {
-    StopTimer (total_timer);
-
-    //ofstream prof;
-    //prof.open("ng.prof");
-
-    // ofstream-constructor may be called after STL-stuff is destructed,
-    // which leads to an "order of destruction"-problem,
-    // thus we use the C-variant:
-
-    char filename[100];
-#ifdef PARALLEL
-    sprintf (filename, "netgen.prof.%d", id);
-#else
-    sprintf (filename, "netgen.prof");
-#endif
-
-    // MODIFIED FOR GMSH
-    //FILE *prof = fopen(filename,"w");
-    //Print (prof);
-    //fclose(prof);
-  }
-
-
-//   void NgProfiler :: Print (ostream & prof)
-//   {
-//     for (int i = 0; i < SIZE; i++)
-//       if (counts[i] != 0 || usedcounter[i] != 0)
-// 	{
-// 	  prof.setf (ios::fixed, ios::floatfield);
-// 	  prof.setf (ios::showpoint);
-
-// 	  prof // << "job " << setw(3) << i 
-// 	    << "calls " << setw(8) << counts[i] 
-// 	    << ", time " << setprecision(2) << setw(6) << double(tottimes[i]) / CLOCKS_PER_SEC << " sec";
-
-// 	  if (usedcounter[i]) 
-// 	    prof << " " << names[i];
-// 	  else
-// 	    prof << " " << i;
-	    
-// 	  prof << endl;
-// 	}
-//   }
-
-
-  void NgProfiler :: Print (FILE * prof)
-  {
-    for (int i = 0; i < SIZE; i++)
-      if (counts[i] != 0 || usedcounter[i] != 0)
-	{
-	  //fprintf(prof,"job %3i calls %8i, time %6.2f sec",i,counts[i],double(tottimes[i]) / CLOCKS_PER_SEC);
-	  fprintf(prof,"calls %8i, time %6.2f sec",counts[i],double(tottimes[i]) / CLOCKS_PER_SEC);
-	  if(usedcounter[i])
-	    fprintf(prof," %s",names[i].c_str());
-	  else
-	    fprintf(prof," %i",i);
-	  fprintf(prof,"\n");
-	}
-  }
-
-  int NgProfiler :: CreateTimer (const string & name)
-  {
-    for (int i = SIZE-1; i > 0; i--)
-      if(names[i] == name)
-	return i;
-
-    for (int i = SIZE-1; i > 0; i--)
-      if (!usedcounter[i])
-	{
-	  usedcounter[i] = 1;
-	  names[i] = name;
-	  return i;
-	}
-    return -1;
-  }
-
-
-  NgProfiler prof;
-}
diff --git a/contrib/Netgen/libsrc/general/profiler.hpp b/contrib/Netgen/libsrc/general/profiler.hpp
deleted file mode 100644
index b08708be83a056e6284e67c650b6373f708513b8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/profiler.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef FILE_NG_PROFILER
-#define FILE_NG_PROFILER
-
-/**************************************************************************/
-/* File:   profiler.hpp                                                   */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   5. Jan. 2005                                                  */
-/**************************************************************************/
-
-
-
-#ifdef VTRACE
-#include "vt_user.h"
-#else
-  #define VT_USER_START(n)
-  #define VT_USER_END(n)
-  #define VT_TRACER(n)
-#endif
-
-
-
-class NgProfiler
-{
-  enum { SIZE = 1000 };
-
-  static long int tottimes[SIZE];
-  static long int starttimes[SIZE];
-  static long int counts[SIZE];
-  static string names[SIZE];
-  static int usedcounter[SIZE];
-
-  int total_timer;
-public: 
-  NgProfiler();
-  ~NgProfiler();
-  static int CreateTimer (const string & name);
-
-  static void StartTimer (int nr) 
-  { 
-    starttimes[nr] = clock(); counts[nr]++; 
-    VT_USER_START (const_cast<char*> (names[nr].c_str())); 
-  }
-  static void StopTimer (int nr) 
-  { 
-    tottimes[nr] += clock()-starttimes[nr]; 
-    VT_USER_END (const_cast<char*> (names[nr].c_str())); 
-  }
-
-  //static void Print (ostream & ost);
-  static void Print (FILE * prof);
-
-  class RegionTimer
-  {
-    int nr;
-  public:
-    RegionTimer (int anr) : nr(anr)
-      { StartTimer (nr); }
-    ~RegionTimer () { StopTimer (nr); }
-  };
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/seti.cpp b/contrib/Netgen/libsrc/general/seti.cpp
deleted file mode 100644
index e7f5b2ea74b1ee42c2f1299fd0a3a5b908eb1852..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 f65aa24fce073cadeab371ce71d3d4aa3b658ea9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/sort.hpp
+++ /dev/null
@@ -1,42 +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);
-
-
-
-
-template <class T>
-inline void BubbleSort (int size, T * data)
-{
-  T hv;
-  for (int i = 0; i < size; i++)
-    for (int j = i+1; j < size; j++)
-      if (data[i] > data[j])
-	{
-	  hv = data[i];
-	  data[i] = data[j];
-	  data[j] = hv;
-	}
-}
-
-template <class T>
-inline void BubbleSort (ARRAY<T> & data)
-{
-  if(data.Size() > 0)
-	  BubbleSort (data.Size(), &data[data.Begin()]);
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/general/spbita2d.cpp b/contrib/Netgen/libsrc/general/spbita2d.cpp
deleted file mode 100644
index 5badfe9a7c99b21254b7310024c4b92627f344f4..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 bd35ac7cb229c6370d599e0d9e108f794eb0a5fd..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 38895dee8e740abd1c5d48eb450d4a578d74f286..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/symbolta.hpp
+++ /dev/null
@@ -1,158 +0,0 @@
-#ifndef FILE_SYMBOLTA
-#define FILE_SYMBOLTA
-
-
-/**************************************************************************/
-/* File:   symbolta.hh                                                    */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Jun. 95                                                    */
-/**************************************************************************/
-
-/**
-   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 bool 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 bool SYMBOLTABLE<T> :: Used (const char * name) const
-{
-  return (Index(name)) ? true : false;
-}
-
-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 b6168374bdb000aa175cc2ed55b540f264cf162a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/table.cpp
+++ /dev/null
@@ -1,193 +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 :: ChangeSize (int size)
-  {
-    int oldsize = data.Size();
-    if (size == oldsize) 
-      return;
-
-    if (size < oldsize)
-      for (int i = size; i < oldsize; i++)
-	delete [] (char*)data[i].col;
-    
-    data.SetSize(size);
-
-    for (int i = oldsize; 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;
-  }
-
-  void BASE_TABLE :: SetElementSizesToMaxSizes ()
-  {
-    for (int i = 0; i < data.Size(); i++)
-      data[i].size = data[i].maxsize;
-  }
-
-}
diff --git a/contrib/Netgen/libsrc/general/table.hpp b/contrib/Netgen/libsrc/general/table.hpp
deleted file mode 100644
index f9ed02f18c4c893347a8468f972a86ddb02911a9..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/general/table.hpp
+++ /dev/null
@@ -1,223 +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);
-  ///
-  void ChangeSize (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;
-
-  void SetElementSizesToMaxSizes ();
-};
-
-
-
-
-
-
-
-/** 
-   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 maximal 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);
-  }
-
-  /// Changes Size of table to size, keep data
-  inline void ChangeSize (int size)
-  {
-    BASE_TABLE::ChangeSize (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 enough memory
-  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, const TABLE<T,BASE> & table)
-{
-  for (int i = BASE; i < table.Size()+BASE; i++)
-    {
-      ost << i << ": ";
-      FlatArray<T> row = table[i];
-      ost << "(" << row.Size() << ") ";
-      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 9fb378a7bc0648623902579ba96984cf5f37cc07..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)
-  {
-    if (i1 > i2) Swap (i1, i2);
-    if (i2 > i3) Swap (i2, i3);
-    if (i1 > i2) Swap (i1, i2);
-    return INDEX_3 (i1, i2, i3);
-  }
-
-  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/adtree.cpp b/contrib/Netgen/libsrc/gprim/adtree.cpp
deleted file mode 100644
index 0b5a319707bfce9923fbdec4d58f4eb712605061..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/adtree.cpp
+++ /dev/null
@@ -1,2165 +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(NULL);
-    ADTreeNode *next;
-    int dir;
-    int lr(1);
-
-    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(NULL);
-    ADTreeNode3 *next;
-    int dir;
-    int lr(0);
-
-    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(NULL);
-    ADTreeNode6 *next;
-    int dir;
-    int lr(0);
-
-    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);
-
-    stack.SetSize (10000);
-    pis.SetSize(0);
-
-    stack[0].node = root;
-    stack[0].dir = 0;
-    int stacks = 0;
-
-    while (stacks >= 0)
-      {
-	ADTreeNode6 * node = stack[stacks].node;
-	int dir = stack[stacks].dir; 
-
-	stacks--;
-
-	if (node->pi != -1)
-	  {
-	    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) % 6;
-
-	if (node->left && bmin[dir] <= node->sep)
-	  {
-	    stacks++;
-	    stack[stacks].node = node->left;
-	    stack[stacks].dir = ndir;
-	  }
-	if (node->right && bmax[dir] >= node->sep)
-	  {
-	    stacks++;
-	    stack[stacks].node = node->right;
-	    stack[stacks].dir = 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 4cac0f2945d90707dd765cc17e78c707674cd822..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/adtree.hpp
+++ /dev/null
@@ -1,481 +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 "../include/mystdlib.h"
-#include "../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 Insert (const Box<3> & box, int pi)
-  {
-    Insert (box.PMin(), box.PMax(), 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 34263348cc327ba2a652e6d7ec6c44c5af96018f..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geom2d.cpp
+++ /dev/null
@@ -1,489 +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 0c4c616fac8686b8d54b9d79cb81f5778124cf01..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geom2d.hpp
+++ /dev/null
@@ -1,883 +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 bool 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;
-    }  /**
-    Points counter-clock-wise ?
-    Are the points (p1, p2, p3) counter-clock-wise ?
-    */
-  friend inline bool CCW (const Point2d & p1, const Point2d & p2, const Point2d & p3, double eps)
-    {
-      //      return Cross (p2 - p1, p3 - p2) > 0;
-      double ax = p2.px - p1.px;
-      double ay = p2.py - p1.py;
-      double bx = p3.px - p2.px;
-      double by = p3.py - p2.py;
-
-      return ax*by - ay*bx > eps*eps*max2(ax*ax+ay*ay,bx*bx+by*by);
-    }
-
-  ///
-  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 71970ffee39d81ca921f7f3d08c8030ed0e8905a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geom3d.cpp
+++ /dev/null
@@ -1,731 +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)
-{
-  // changed by MW
-  double matrix[3][3];
-  double locrhs[3];
-  int retval = 0;
-
-  for(int i=0; i<3; i++)
-    {
-      matrix[i][0] = col1.X(i+1);
-      matrix[i][1] = col2.X(i+1);
-      matrix[i][2] = col3.X(i+1);
-      locrhs[i] = rhs.X(i+1);
-    }
-
-  for(int i=0; i<2; i++)
-    {
-      int pivot = i;
-      double maxv = fabs(matrix[i][i]);
-      for(int j=i+1; j<3; j++)
-	if(fabs(matrix[j][i]) > maxv)
-	  {
-	    maxv = fabs(matrix[j][i]);
-	    pivot = j;
-	  }
-
-      if(fabs(maxv) > 1e-40)
-	{
-	  if(pivot != i)
-	    {
-	      swap(matrix[i][0],matrix[pivot][0]);
-	      swap(matrix[i][1],matrix[pivot][1]);
-	      swap(matrix[i][2],matrix[pivot][2]);
-	      swap(locrhs[i],locrhs[pivot]);
-	    }
-	  for(int j=i+1; j<3; j++)
-	    {
-	      double fac = matrix[j][i] / matrix[i][i];
-	      
-	      for(int k=i+1; k<3; k++)
-		matrix[j][k] -= fac*matrix[i][k];
-	      locrhs[j] -= fac*locrhs[i];
-	    }
-	}
-      else
-	retval = 1;
-    }
-
-  if(fabs(matrix[2][2]) < 1e-40)
-    retval = 1;
-
-  if(retval != 0)
-    return retval;
-  
-
-  for(int i=2; i>=0; i--)
-    {
-      double sum = locrhs[i];
-      for(int j=2; j>i; j--)
-	sum -= matrix[i][j]*sol.X(j+1);
-
-      sol.X(i+1) = sum/matrix[i][i];
-    }
-
-  return 0;
-  
-  
-  
-
-
-  /*
-  double 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;
-  */
-  /*
-  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 c5e8eecbda12398f6cf2a18ed8735db500df2f08..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geom3d.hpp
+++ /dev/null
@@ -1,731 +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 4c8a51ee439ad968c895736e42a4f4199b253463..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomfuncs.hpp
+++ /dev/null
@@ -1,157 +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;
-}
-
-template <int D>
-inline Point<D> Center (const Point<D> & a, const Point<D> & b, const Point<D> & c, const Point<D> & d)
-{
-  Point<D> res;
-  for (int i = 0; i < D; i++)
-    res(i) = (1.0/4.0) * (a(i) + b(i) + c(i) + d(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) );
-}
-
-
-inline double Determinant (const Vec<3> & col1,
-			   const Vec<3> & col2,
-			   const Vec<3> & col3)
-{
-  return
-    col1(0) * ( col2(1) * col3(2) - col2(2) * col3(1)) +
-    col1(1) * ( col2(2) * col3(0) - col2(0) * col3(2)) +
-    col1(2) * ( col2(0) * col3(1) - col2(1) * col3(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 87c38d9bffb2cacb984d747d34707ae9c827e1dc..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomobjects.hpp
+++ /dev/null
@@ -1,359 +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;
-  }
-
-  Point & operator= (double val)
-  {
-    for (int i = 0; i < D; i++) x[i] = val;
-    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 () { ; } // for (int i = 0; i < D; i++) x[i] = 0; }
-  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));
-      }
-  }
-
-  enum EB_TYPE { EMPTY_BOX = 1 };
-  Box ( EB_TYPE et ) 
-  {
-    pmin = Point<3> (1e99, 1e99, 1e99);
-    pmax = Point<3> (-1e99, -1e99, -1e99);
-  }
-
-  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> apmin, Point<D> apmax )
-    : Box<D> (apmin, apmax)
-  {
-    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/geomtest3d.cpp b/contrib/Netgen/libsrc/gprim/geomtest3d.cpp
deleted file mode 100644
index 20a3be0b349734219799ab428cfd11286e9fcaed..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/geomtest3d.cpp
+++ /dev/null
@@ -1,1150 +0,0 @@
-#include <mystdlib.h>
-#include <myadt.hpp>
-
-#include <linalg.hpp>
-#include <gprim.hpp>
-
-namespace netgen
-{
-int
-IntersectTriangleLine (const Point<3> ** tri, const Point<3> ** 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 Point<3> ** tet, const Point<3> ** 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;
-
-  double eps2 = eps * eps;
-  int cnt = 0;
-
-  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;
-
-
-  //  (*testout) << "tet-trig inters, cnt = " << cnt << endl;
-  
-  // cnt .. number of common points
-  switch (cnt)
-    {
-    case 0:
-      {
-	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 Point<3> * 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:
-      {
-	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:
-      {
-	// 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:
-      {
-	// common face
-	return 0;
-      }
-    }
-
-  (*testout) << "hit, cnt = " << cnt << endl;
-  return 1;
-}
-
-
-
-
-
-int IntersectTetTriangleRef (const Point<3> ** tri, const int * tripi)
-{
-  int i, j;
-  double eps = 1e-8;
-  double eps2 = eps * eps;
-
-  static Point<3> rtetp1(0, 0, 0);
-  static Point<3> rtetp2(1, 0, 0);  
-  static Point<3> rtetp3(0, 1, 0); 
-  static Point<3> rtetp4(0, 0, 1);
-
-  static const Point<3> * 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;
-
-
-  switch (cnt)
-    {
-    case 0:
-      {
-	Vec3d no, n;
-	//	int inpi[3];
-	int pside[3][4];
-
-	for (j = 0; j < 3; j++)
-	  {
-	    pside[j][0] = (*tri[j])(0) > -eps;
-	    pside[j][1] = (*tri[j])(1) > -eps;
-	    pside[j][2] = (*tri[j])(2) > -eps;
-	    pside[j][3] = (*tri[j])(0) + (*tri[j])(1) + (*tri[j])(2) < 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 Point<3> * 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:
-      {
-	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:
-      {
-	// 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:
-      {
-	// common face
-	return 0;
-      }
-    }
-
-  (*testout) << "hit, cnt = " << cnt << endl;
-  return 1;
-}
-
-
-
-
-
-
-
-
-
-
-
-int IntersectTriangleTriangle (const Point<3> ** tri1, const Point<3> ** 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 Point<3> * 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 Point<3> ** pts, Point<3> & c)
-{
-  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 7ce362d05222c857288ea0e8d9c8fc1f25fc90e6..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 Point<3> ** tri, const Point<3> ** 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 Point<3> ** tet, const Point<3> ** 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 Point<3> ** tri1, const Point<3> ** 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 Point<3> ** pts, Point<3> & 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/transform3d.cpp b/contrib/Netgen/libsrc/gprim/transform3d.cpp
deleted file mode 100644
index ea62fffe5a0e9563644b0428f822ca1bbf2cac77..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/transform3d.cpp
+++ /dev/null
@@ -1,173 +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;
-    }
-}
-
-
-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 2754173e2469ebf5e2df1823abb6a03ddf17e26f..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/gprim/transform3d.hpp
+++ /dev/null
@@ -1,190 +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);
-	}
-    }
-
-  ///
-  void Transform (Point3d & p) const
-  {
-    Point3d hp;
-    Transform (p, hp);
-    p = hp;
-  }
-
-  /// 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));
-  }
-
-  void Transform (Point<D> & p) const
-  {
-    p = Point<D> (v + m * Vec<D>(p));
-  }
-
-
-
-  /// 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 f6120759597d8b5aae428f7f8940481a6fa40fd5..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.3 2008-09-24 18:04:44 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/acisgeom.hpp b/contrib/Netgen/libsrc/include/acisgeom.hpp
deleted file mode 100644
index 491b7720dbdb18f49b2fce4530708f0c890170f0..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/acisgeom.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#ifdef ACIS
-#include "../acisgeom/acisgeom.hpp"
-#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 0f2b1026a0670f49b5976cd82249dea3e1815f6c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/incvis.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-// libraries for User interface:
-
-
-#ifndef NOTCL
-
-#include <tcl.h>
-#include <tk.h>
-
-#if TK_MAJOR_VERSION==8 && TK_MINOR_VERSION>=4
-#define tcl_const const
-#else
-#define tcl_const
-#endif
-
-#endif
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-#ifndef NOTCL
-#include "../../togl/togl.h"
-#endif
-
-
-
-
-// part of OpenGL 1.2, but not in Microsoft's OpenGL 1.1 header:
-// GL version sould be checked at runtime
-#ifndef GL_CLAMP_TO_EDGE
-#define GL_CLAMP_TO_EDGE 0x812F
-#endif
-
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 939a268e6ea1eebe0d3c8d7235a75c256f0b5abb..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/mystdlib.h
+++ /dev/null
@@ -1,104 +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>
-#include <cstring>
-#include <climits>
-#endif
-
-
-
-#include <new>
-#include <string>
-#include <typeinfo>
-
-#ifdef PARALLEL
-#undef SEEK_SET
-#undef SEEK_CUR
-#undef SEEK_END
-#include <mpi.h>
-#endif
-
-#ifdef _OPENMP
-#include <omp.h>
-#endif
-
-
-#ifdef METIS
-namespace metis { extern "C" {
-#include <metis.h>
-} }
-#endif
-
-
-
-#ifndef NO_PARALLEL_THREADS
-#ifndef WIN32
-#include <pthread.h>
-#endif
-#endif
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-
-/*** Windows headers ***/
-#ifdef _MSC_VER
-# define WIN32_LEAN_AND_MEAN
-# ifndef NO_PARALLEL_THREADS
-#  include <afxwin.h>
-#  include <afxmt.h>
-# endif
-# include <windows.h>
-# undef WIN32_LEAN_AND_MEAN
-# include <winnt.h>
-
-#else
-# ifndef NO_PARALLEL_THREADS
-#  include <pthread.h>
-# endif
-#endif
-
-/*
-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/parallel.hpp b/contrib/Netgen/libsrc/include/parallel.hpp
deleted file mode 100644
index 4ba662f810ea4c6240c57cf64608803abc18f602..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/include/parallel.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "../parallel/parallel.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/importsolution.cpp b/contrib/Netgen/libsrc/interface/importsolution.cpp
deleted file mode 100644
index 4f9d3e6727658f295aacf6fee57333d4a414a834..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/importsolution.cpp
+++ /dev/null
@@ -1,129 +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, 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;
-          soldata.draw_surface = 1;
-          soldata.draw_volume = 1;
-	  if (strcmp (type, "element") == 0)
-            {
-              soldata.soltype = NG_SOLUTION_ELEMENT;
-              soldata.draw_surface = 0;
-            }
-	  if (strcmp (type, "surfaceelement") == 0)
-            {
-              soldata.soltype = NG_SOLUTION_SURFACE_ELEMENT;
-              soldata.draw_volume = 0;
-            }
-	  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 400a7a19eb9c5ad4b610659db2d7b749d91b9496..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/nginterface.cpp
+++ /dev/null
@@ -1,2412 +0,0 @@
-#include <mystdlib.h>
-
-
-#include <meshing.hpp>
-#include <csg.hpp>
-#include <geometry2d.hpp>
-#include <stlgeom.hpp>
-
-
-#ifdef OCCGEOMETRY
-#include <occgeom.hpp>
-#endif
-
-#ifdef ACIS
-#include <acisgeom.hpp>
-#endif
-
-#ifdef SOCKETS
-#include "../sockets/sockets.hpp"
-#endif
-
-#ifndef NOTCL
-#include <visual.hpp>
-#endif
-
-
-#include "nginterface.h"
-
-// #include <FlexLexer.h>
-
-
-// #include <mystdlib.h>
-
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-	extern AutoPtr<Mesh> mesh;
-#ifndef NOTCL
-  extern VisualSceneMesh vsmesh;
-  extern Tcl_Interp * tcl_interp;
-#endif
-
-  extern AutoPtr<SplineGeometry2d> geometry2d;
-  extern AutoPtr<CSGeometry> geometry;
-  extern STLGeometry * stlgeometry;
-
-#ifdef OCCGEOMETRY
-  extern OCCGeometry * occgeometry;
-#endif
-#ifdef ACIS
-  extern ACISGeometry * acisgeometry;
-#endif
-
-#ifdef OPENGL
-  extern VisualSceneSolution vssolution;
-#endif
-  extern CSGeometry * ParseCSG (istream & istr);
-
-#ifdef SOCKETS
-  extern AutoPtr<ClientSocket> clientsocket;
-  //extern ARRAY< AutoPtr < ServerInfo > > servers;
-  extern ARRAY< ServerInfo* > servers;
-#endif
-}
-
-
-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 (const char * filename)
-{
-
-  
-  if (printmessage_importance>0)
-    cout << "CALLED NG LOAD GEOMETRY" << endl; 
-  
-  geometry.Reset (new CSGeometry ());
-  geometry2d.Reset ();
-
-#ifdef OCCGEOMETRY
-  delete occgeometry;
-  occgeometry = 0;
-#endif
-#ifdef ACIS
-  delete acisgeometry;
-  acisgeometry = 0;
-#endif
-  
-  // he: if filename is empty, return
-  // can be used to reset geometry
-  if (strcmp(filename,"")==0) 
-    return;
-     
-  ifstream infile (filename);
-  
-  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");
-	  cerr << "Error: input file \"" << filename << "\" not found" << endl;
-	}
-
-      geometry -> FindIdenticSurfaces(1e-6);
-
-#ifdef PARALLEL
-      int id, rc, ntasks;
-      MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
-      MPI_Comm_rank(MPI_COMM_WORLD, &id);
-      if ( id > 0 )
-	{
-	  geometry->CalcTriangleApproximation ( geometry->BoundingBox(), 0.001, 20 );
-	  return;
-	}
-#endif
-
-      Box<3> box (geometry->BoundingBox());
-#ifdef NOTCL
-      double detail = 0.001;
-      double facets = 20;
-      geometry->CalcTriangleApproximation(box, detail, facets);
-      
-#else
-      double detail = atof (Tcl_GetVar (tcl_interp, "::geooptions.detail", 0));
-      double facets = atof (Tcl_GetVar (tcl_interp, "::geooptions.facets", 0));
-      
-      if (atoi (Tcl_GetVar (tcl_interp, "::geooptions.drawcsg", 0)))
-	geometry->CalcTriangleApproximation(box, detail, facets);
-#endif
-    }
-
-  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))
-    {
-      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
-
-#ifdef ACIS
-  else if (
-		  strcmp (&filename[strlen(filename)-3], "sat") == 0 ||
-		  ( strlen(filename) >= 7 && strcmp ( &filename[ strlen( filename)-7 ], "sat.tet" ) == 0 )
-		)
-    {
-      PrintMessage (1, "Load ACIS geometry file ", filename);
-      acisgeometry = LoadACIS_SAT (filename);
-    }
-#endif
-  else
-    {
-      //throw NgException("Unknown geometry extension");
-		cerr << "Error: Unknown geometry extension \"" << filename[strlen(filename)-3] << "\"" << endl;
-    }
-
-
-}                          
-
-
-void Ng_LoadMeshFromStream ( istream & input )
-{
-  mesh.Reset (new Mesh());
-  mesh -> Load(input);
-  if(input.good())
-    {
-      string auxstring;
-      input >> auxstring;
-      if(auxstring == "csgsurfaces")
-	{
-	  if (geometry)
-            {
-              geometry.Reset (new CSGeometry (""));
-            }
-	  if (stlgeometry)
-	    {
-	      delete stlgeometry;
-	      stlgeometry = NULL;
-	    }
-#ifdef OCCGEOMETRY
-	  if (occgeometry)
-	    {
- 	      delete occgeometry;
- 	      occgeometry = NULL;
-	    }
-#endif
-#ifdef ACIS
-	  if (acisgeometry)
-	    {
- 	      delete acisgeometry;
- 	      acisgeometry = NULL;
-	    }
-#endif
- 	  geometry2d.Reset (0);
-	  
- 	  geometry -> LoadSurfaces(input);
-	}
-    }
- 
-}
-
-
-void Ng_LoadMesh (const char * filename)
-{
-  if ( (strlen (filename) > 4) &&
-       strcmp (filename + (strlen (filename)-4), ".vol") != 0 )
-    {
-      mesh.Reset (new Mesh());
-      ReadFile(*mesh,filename);
-
-      //mesh->SetGlobalH (mparam.maxh);
-      //mesh->CalcLocalH();
-      return;
-    }
-
-  ifstream infile(filename);
-  Ng_LoadMeshFromStream(infile);
-}
-
-void Ng_LoadMeshFromString (char * mesh_as_string)
-{
-  istringstream instream(mesh_as_string);
-  Ng_LoadMeshFromStream(instream);
-}
-  
-
-
-
-int Ng_GetDimension ()
-{
-  return (mesh) ? mesh->GetDimension() : -1;
-}
-
-int Ng_GetNP ()
-{
-  return (mesh) ? mesh->GetNP() : 0;
-}
-
-int Ng_GetNV ()
-{
-  return (mesh) ? mesh->GetNV() : 0;
-}
-
-int Ng_GetNE ()
-{
-  if(!mesh) return 0;
-  if (mesh->GetDimension() == 3)
-    return mesh->GetNE();
-  else
-    return mesh->GetNSE();
-}
-
-int Ng_GetNSE ()
-{
-  if(!mesh) return 0;
-  if (mesh->GetDimension() == 3)
-    return mesh->GetNSE();
-  else
-    return mesh->GetNSeg();
-}
-
-void Ng_GetPoint (int pi, double * p)
-{
-  if (pi < 1 || pi > mesh->GetNP())
-    {
-      if (printmessage_importance>0)
-        cout << "Ng_GetPoint: illegal point " << pi << endl;
-      return;
-    }
-
-  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:
-                if (printmessage_importance>0)
-                  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:
-	      {
-                if (printmessage_importance>0)
-                  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
-    {
-      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;
-    }
-}
-
-void Ng_SetElementIndex(const int ei, const int index)
-{
-  mesh->VolumeElement(ei).SetIndex(index);
-}
-
-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;
-    }
-  // add astrid
-  else
-    {
-      int ind = mesh->SurfaceElement(ei).GetIndex();
-      ind = mesh->GetFaceDescriptor(ind).BCProperty();
-      const char * mat = mesh->GetMaterial ( ind );
-      if (mat)
-	return const_cast<char*> (mat);
-      else
-	return empty;
-    }
-  return 0;
-}
-
-char * Ng_GetDomainMaterial (int dom)
-{
-  static char empty[] = "";
-  // astrid
-  if ( 1 ) // mesh->GetDimension() == 3)
-    {
-      const char * mat = mesh->GetMaterial(dom);
-      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;
-}
-
-int Ng_GetSurfaceElementSurfaceNumber (int ei)
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->GetFaceDescriptor(mesh->SurfaceElement(ei).GetIndex()).SurfNr();
-  else
-    return mesh->LineSegment(ei).si;
-}
-int Ng_GetSurfaceElementFDNumber (int ei)
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->SurfaceElement(ei).GetIndex();
-  else
-    return -1;
-}
-
-
-char * Ng_GetSurfaceElementBCName (int ei)
-{
-  if ( mesh->GetDimension() == 3 )
-    return const_cast<char *>(mesh->GetFaceDescriptor(mesh->SurfaceElement(ei).GetIndex()).GetBCName().c_str());
-  else
-    return const_cast<char *>(mesh->LineSegment(ei).GetBCName().c_str());
-}
-
-
-// Inefficient (but maybe safer) version:
-//void Ng_GetSurfaceElementBCName (int ei, char * name)
-//{
-//  if ( mesh->GetDimension() == 3 )
-//      strcpy(name,mesh->GetFaceDescriptor(mesh->SurfaceElement(ei).GetIndex()).GetBCName().c_str());
-//  else
-//      strcpy(name,mesh->LineSegment(ei).GetBCName().c_str());
-//}
-
-char * Ng_GetBCNumBCName (int bcnr)
-{
-  return const_cast<char *>(mesh->GetBCName(bcnr).c_str());
-}
-
-
-// Inefficient (but maybe safer) version:
-//void Ng_GetBCNumBCName (int bcnr, char * name)
-//{
-//    strcpy(name,mesh->GetBCName(bcnr).c_str());
-//}
-
-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);
-	}
-    }
-}
-
-
-
-void Ng_SetPointSearchStartElement(const int el)
-{
-  mesh->SetPointSearchStartElement(el);
-}
-
-
-int Ng_FindElementOfPoint (double * p, double * lami, int build_searchtree, 
-			   const int * const indices, const int numind)
-  
-{
-  ARRAY<int> * dummy(NULL);
-  int ind = -1;
-
-  if(indices != NULL)
-    {
-      dummy = new ARRAY<int>(numind);
-      for(int i=0; i<numind; i++) (*dummy)[i] = indices[i];
-    }
-
-  if (mesh->GetDimension() == 3)
-    {
-      Point3d p3d(p[0], p[1], p[2]);
-      ind = 
-	mesh->GetElementOfPoint(p3d, lami, dummy, build_searchtree != 0);
-    }
-  else
-    {
-      double lam3[3];
-      Point3d p2d(p[0], p[1], 0);
-      ind = 
-	mesh->GetElementOfPoint(p2d, lam3, dummy, build_searchtree != 0);
-      
-
-      if(mesh->SurfaceElement(ind).GetType()==QUAD)
-	{
-	  lami[0] = lam3[0];
-	  lami[1] = lam3[1];
-	}
-      else 
-	{
-	  lami[0] = 1-lam3[0]-lam3[1];
-	  lami[1] = lam3[0];
-	}
-    }
-
-  delete dummy;
-
-  return ind;
-}
-
-int Ng_FindSurfaceElementOfPoint (double * p, double * lami, int build_searchtree, 
-				  const int * const indices, const int numind)
-  
-{
-  ARRAY<int> * dummy(NULL);
-  int ind = -1;
-
-  if(indices != NULL)
-    {
-      dummy = new ARRAY<int>(numind);
-      for(int i=0; i<numind; i++) (*dummy)[i] = indices[i];
-    }
-
-  if (mesh->GetDimension() == 3)
-    {
-      Point3d p3d(p[0], p[1], p[2]);
-      ind = 
-	mesh->GetSurfaceElementOfPoint(p3d, lami, dummy, build_searchtree != 0);
-    }
-  else
-    {
-      //throw NgException("FindSurfaceElementOfPoint for 2D meshes not yet implemented");
-		cerr << "FindSurfaceElementOfPoint for 2D meshes not yet implemented" << endl;
-    }
-
-  delete dummy;
-
-  return ind;
-}
-
-
-int Ng_IsElementCurved (int ei)
-{
-  if (mesh->GetDimension() == 2)
-    return mesh->GetCurvedElements().IsSurfaceElementCurved (ei-1);
-  else
-    return mesh->GetCurvedElements().IsElementCurved (ei-1);
-}
-
-
-int Ng_IsSurfaceElementCurved (int sei)
-{
-  if (mesh->GetDimension() == 2)
-    return mesh->GetCurvedElements().IsSegmentCurved (sei-1);
-  else
-    return mesh->GetCurvedElements().IsSurfaceElementCurved (sei-1);
-}
-
-
-
-
-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]);
-      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_GetBufferedElementTransformation (int ei, const double * xi, 
-                                          double * x, double * dxdxi,
-                                          void * buffer, int buffervalid)
-{
-  // buffer = 0;
-  // buffervalid = 0;
-  if (mesh->GetDimension() == 2)
-    {
-      return Ng_GetElementTransformation (ei, xi, x, dxdxi);
-    }
-  else
-    {
-      mesh->GetCurvedElements().CalcElementTransformation (reinterpret_cast<const Point<3> &> (*xi), 
-                                                           ei-1, 
-                                                           reinterpret_cast<Point<3> &> (*x), 
-                                                           reinterpret_cast<Mat<3,3> &> (*dxdxi), 
-                                                           buffer, (buffervalid != 0));
-
-      /*
-      Point<3> xl(xi[0], xi[1], xi[2]);
-      Point<3> xg;
-      Mat<3,3> dx;
-      // buffervalid = 0;
-      mesh->GetCurvedElements().CalcElementTransformation (xl, ei-1, xg, dx, buffer, buffervalid);
-
-      // 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_GetMultiElementTransformation (int ei, int n,
-                                       const double * xi, int sxi,
-                                       double * x, int sx,
-                                       double * dxdxi, int sdxdxi)
-{
-  if (mesh->GetDimension() == 2)
-    {
-      for (int i = 0; i < n; i++)
-        {
-          Point<2> xl(xi[i*sxi], xi[i*sxi+1]);
-          Point<3> xg;
-          Mat<3,2> dx;
-
-          mesh->GetCurvedElements().CalcSurfaceTransformation (xl, ei-1, xg, dx);
-
-          if (x)
-            {
-              x[i*sx  ] = xg(0);
-              x[i*sx+1] = xg(1);
-            }
-	  
-          if (dxdxi)
-            {
-              dxdxi[i*sdxdxi  ] = dx(0,0);
-              dxdxi[i*sdxdxi+1] = dx(0,1);
-              dxdxi[i*sdxdxi+2] = dx(1,0);
-              dxdxi[i*sdxdxi+3] = dx(1,1);
-            }
-        }
-    }
-  else
-    {
-      mesh->GetCurvedElements().CalcMultiPointElementTransformation (ei-1, n, xi, sxi, x, sx, dxdxi, sdxdxi);
-    }
-}
-
-
-
-
-
-
-
-
-void Ng_GetSurfaceElementTransformation (int sei, const double * xi, 
-					 double * x, double * dxdxi)
-{
-  if (mesh->GetDimension() == 2)
-    {
-      Point<3> xg;
-      Vec<3> dx;
-
-      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;
-      
-      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)
-{
-  if ( mesh->GetDimension() == 3 )
-    {
-      in = mesh->GetFaceDescriptor(mesh->SurfaceElement(selnr).GetIndex()).DomainIn();
-      out = mesh->GetFaceDescriptor(mesh->SurfaceElement(selnr).GetIndex()).DomainOut();
-    }
-  else
-    {
-      in = mesh -> LineSegment(selnr) . domin;
-      out = mesh -> LineSegment(selnr) . domout;
-    }
-}
-
-
-#ifdef PARALLEL
-// Is Element ei an element of this processor ??
-bool Ng_IsGhostEl (int ei)
-{
-  if ( mesh->GetDimension() == 3 )
-    return mesh->VolumeElement(ei).IsGhost();
-  else
-    return false;
-}
-
-void Ng_SetGhostEl(const int ei, const bool aisghost )
-{
-  if ( mesh -> GetDimension () == 3 )
-    mesh -> VolumeElement(ei).SetGhost (aisghost);
-}
-
-bool Ng_IsGhostSEl (int ei)
-{
-  if ( mesh -> GetDimension () == 3 )
-    return mesh->SurfaceElement(ei).IsGhost();
-  else
-    return false;
-}
-
-void Ng_SetGhostSEl(const int ei, const bool aisghost )
-{
-  if ( mesh -> GetDimension () == 3 )
-    mesh -> SurfaceElement(ei).SetGhost (aisghost);
-}
-
-
-bool Ng_IsGhostVert ( int pnum )
-{
-  return mesh -> Point ( pnum ).IsGhost() ;  
-}
-bool Ng_IsGhostEdge ( int ednum )
-{
-  return mesh -> GetParallelTopology() . IsGhostEdge ( ednum ); 
-}
-
-bool Ng_IsGhostFace ( int fanum )
-{
-  return mesh -> GetParallelTopology() . IsGhostFace ( fanum ); 
-}
-
-// void Ng_SetGhostVert ( const int pnum, const bool aisghost );
-// void Ng_SetGhostEdge ( const int ednum, const bool aisghost );
-// void Ng_SetGhostFace ( const int fanum, const bool aisghost );
-
-
-bool Ng_IsExchangeEl ( int elnum )
-{ return mesh -> GetParallelTopology() . IsExchangeElement ( elnum ); }
-
-bool Ng_IsExchangeSEl ( int selnum )
-{ return mesh -> GetParallelTopology() . IsExchangeSEl ( selnum ); }
-
-void Ng_UpdateOverlap()
-{ mesh->UpdateOverlap(); }
-
-int Ng_Overlap ()
-{ return mesh->GetParallelTopology() . Overlap(); }
-
-#endif
-
-void Ng_SetRefinementFlag (int ei, int flag)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      mesh->VolumeElement(ei).SetRefinementFlag (flag != 0);
-      mesh->VolumeElement(ei).SetStrongRefinementFlag (flag >= 10);
-    }
-  else
-    {
-      mesh->SurfaceElement(ei).SetRefinementFlag (flag != 0);
-      mesh->SurfaceElement(ei).SetStrongRefinementFlag (flag >= 10);
-    }
-}
-
-void Ng_SetSurfaceRefinementFlag (int ei, int flag)
-{
-  if (mesh->GetDimension() == 3)
-    {
-      mesh->SurfaceElement(ei).SetRefinementFlag (flag != 0);
-      mesh->SurfaceElement(ei).SetStrongRefinementFlag (flag >= 10);
-    }
-}
-
-
-void Ng_Refine (NG_REFINEMENT_TYPE reftype)
-{
-  NgLock meshlock (mesh->MajorMutex(), 1);
-
-  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;
-  MeshOptimize2d * opt = NULL;
-
-  if (geometry2d)
-    ref = new Refinement2d(*geometry2d);
-  else if (stlgeometry)
-    ref = new RefinementSTLGeometry(*stlgeometry);
-#ifdef OCCGEOMETRY
-  else if (occgeometry)
-    ref = new OCCRefinementSurfaces (*occgeometry);
-#endif
-#ifdef ACIS
-  else if (acisgeometry)
-    {
-      ref = new ACISRefinementSurfaces (*acisgeometry);
-      opt = new ACISMeshOptimize2dSurfaces(*acisgeometry);
-      ref->Set2dOptimizer(opt);
-    }
-#endif
-  else if (geometry && mesh->GetDimension() == 3)
-    {
-      ref = new RefinementSurfaces(*geometry);
-      opt = new MeshOptimize2dSurfaces(*geometry);
-      ref->Set2dOptimizer(opt);
-    }
-  else
-    {
-      ref = new Refinement();
-    }
-
-
-  ref -> Bisect (*mesh, biopt);
-
-  mesh -> UpdateTopology();
-
-  // mesh -> GetCurvedElements().BuildCurvedElements (ref, mparam.elementorder);
-  delete ref;
-  delete opt;
-}
-
-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
-    {
-      if (printmessage_importance>0)
-        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_HPRefinement (int levels, double parameter)
-{
-  Refinement * ref;
-
-  if (stlgeometry)
-    ref = new RefinementSTLGeometry (*stlgeometry);
-  else if (geometry2d)
-    ref = new Refinement2d (*geometry2d);
-  else
-    ref = new RefinementSurfaces (*geometry);
-
-
-  HPRefinement (*mesh, ref, levels, parameter);
-}
-*/
-
-void Ng_HPRefinement (int levels, double parameter, bool setorders,
-                      bool ref_level)
-{
-  Refinement * ref;
-
-  if (stlgeometry)
-    ref = new RefinementSTLGeometry (*stlgeometry);
-  else if (geometry2d)
-    ref = new Refinement2d (*geometry2d);
-  else
-    ref = new RefinementSurfaces (*geometry);
-
-
-  HPRefinement (*mesh, ref, levels, parameter, setorders, ref_level);
-}
-
-
-void Ng_HighOrder (int order, bool rational)
-{
-  NgLock meshlock (mesh->MajorMutex(), true);
-
-  Refinement * ref;
-
-  if (stlgeometry)
-    ref = new RefinementSTLGeometry (*stlgeometry);
-#ifdef OCCGEOMETRY
-  else if (occgeometry)
-    ref = new OCCRefinementSurfaces (*occgeometry);
-#endif
-#ifdef ACIS
-  else if (acisgeometry)
-    {
-      ref = new ACISRefinementSurfaces (*acisgeometry);
-    }
-#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, rational);
-
-
-  /*
-  if(mesh)
-    mesh -> GetCurvedElements().BuildCurvedElements (ref, order, rational);
-  */
-
-  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();
-}
-
-void Ng_GetElementOrders (int enr, int * ox, int * oy, int * oz)
-{
-  if (mesh->GetDimension() == 3)
-    mesh->VolumeElement(enr).GetOrder(*ox, *oy, *oz);
-  else
-    mesh->SurfaceElement(enr).GetOrder(*ox, *oy, *oz);
-}
-
-void Ng_SetElementOrder (int enr, int order)
-{
-  if (mesh->GetDimension() == 3)
-    return mesh->VolumeElement(enr).SetOrder(order);
-  else
-    return mesh->SurfaceElement(enr).SetOrder(order);
-}
-
-void Ng_SetElementOrders (int enr, int ox, int oy, int oz)
-{
-  if (mesh->GetDimension() == 3)
-    mesh->VolumeElement(enr).SetOrder(ox, oy, oz);
-  else
-    mesh->SurfaceElement(enr).SetOrder(ox, oy);
-}
-
-
-int Ng_GetSurfaceElementOrder (int enr)
-{
-  return mesh->SurfaceElement(enr).GetOrder();
-}
-
-//HERBERT: falsche Anzahl von Argumenten
-//void Ng_GetSurfaceElementOrders (int enr, int * ox, int * oy, int * oz)
-void Ng_GetSurfaceElementOrders (int enr, int * ox, int * oy)
-{
-  int d; 
-  mesh->SurfaceElement(enr).GetOrder(*ox, *oy, d);
-}
-
-void Ng_SetSurfaceElementOrder (int enr, int order)
-{
-  return mesh->SurfaceElement(enr).SetOrder(order);
-}
-
-void Ng_SetSurfaceElementOrders (int enr, int ox, int oy)
-{
-  mesh->SurfaceElement(enr).SetOrder(ox, oy);
-}
-
-
-int Ng_GetNLevels ()
-{
-  return (mesh) ? mesh->mglevels : 0;
-}
-
-
-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 ()
-{
-#ifdef OPENGL
-  vssolution.ClearSolutionData();
-#endif
-}
-
-
-
-void Ng_Redraw ()
-{
-#ifdef OPENGL
-  extern bool nodisplay; // he: global in ngappinit.cpp
-  if (!nodisplay)
-  {
-    vssolution.UpdateSolutionTimeStamp();
-    Render();
-  }
-#endif
-}
-
-
-void Ng_SetVisualizationParameter (const char * name, const char * value)
-{
-#ifdef OPENGL
-#ifndef NOTCL
-  char buf[100];
-  sprintf (buf, "visoptions.%s", name);
-  if (printmessage_importance>0)
-  {
-    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
-#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;
-
-  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);
-
-  if (printmessage_importance>0)
-    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) = Point<3> (p);
-	}
-
-      //firsttime = 0;
-      Ng_Redraw();
-   }
-}
-
-		
-int Ng_GetNPeriodicVertices (int idnr)
-{
-  ARRAY<INDEX_2> apairs;
-  mesh->GetIdentifications().GetPairs (idnr, apairs);
-  return apairs.Size();
-}
-
-
-// pairs should be an integer array of 2*npairs
-void Ng_GetPeriodicVertices (int idnr, int * pairs)
-{
-  ARRAY<INDEX_2> apairs;
-  mesh->GetIdentifications().GetPairs (idnr, 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 (int idnr)
-{
-  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(idnr, 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 idnr, 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(idnr, 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);
-}
-
-void Ng_GetStatus (char ** str, double & percent)
-{
-  MyStr s;
-  GetStatus(s,percent);
-  *str = new char[s.Length()+1];
-  strcpy(*str,s.c_str());  
-}
-
-
-void Ng_SetTerminate(void)
-{
-  multithread.terminate = 1;
-}
-void Ng_UnSetTerminate(void)
-{
-  multithread.terminate = 0;
-}
-
-int Ng_ShouldTerminate(void)
-{
-  return multithread.terminate;
-}
-
-///// 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();
-}
-
-
-
-#ifdef SOCKETS
-int Ng_SocketClientOpen( const int port, const char * host )
-{
-  try
-    {
-      if(host)
-	clientsocket.Reset(new ClientSocket(port,host));
-      else
-	clientsocket.Reset(new ClientSocket(port));
-    }
-  catch( SocketException e)
-    {
-      cerr << e.Description() << endl;
-      return 0;
-    }
-  return 1;
-}
- 
-void Ng_SocketClientWrite( const char * write, char** reply)
-{
-  string output = write;
-  (*clientsocket) << output;
-  string sreply;
-  (*clientsocket) >> sreply;
-  *reply = new char[sreply.size()+1];
-  strcpy(*reply,sreply.c_str());
-}
-
-
-void Ng_SocketClientClose ( void )
-{
-  clientsocket.Reset(NULL);
-}
-
-
-void Ng_SocketClientGetServerHost ( const int number, char ** host )
-{
-  *host = new char[servers[number]->host.size()+1];
-  strcpy(*host,servers[number]->host.c_str());
-}
-
-void Ng_SocketClientGetServerPort ( const int number, int * port )
-{
-  *port = servers[number]->port;
-}
-
-void Ng_SocketClientGetServerClientID ( const int number, int * id )
-{
-  *id = servers[number]->clientid;
-}
-
-#endif // SOCKETS
-
-
-
-
-#ifdef PARALLEL
-void Ng_SetElementPartition ( const int elnr, const int part )
-{
-  mesh->VolumeElement(elnr+1).SetPartition(part);
-
-}
-int Ng_GetElementPartition ( const int elnr )
-{
-  return mesh->VolumeElement(elnr+1).GetPartition();
-}
-#endif
-
-
-void Ng_InitPointCurve(double red, double green, double blue)
-{
-  mesh->InitPointCurve(red, green, blue);
-}
-
-void Ng_AddPointCurvePoint(const double * point)
-{
-  Point3d pt;
-  pt.X() = point[0];
-  pt.Y() = point[1];
-  pt.Z() = point[2];
-  mesh->AddPointCurvePoint(pt);
-}
-
-
-void Ng_SaveMesh ( const char * meshfile )
-{
-  mesh -> Save(string(meshfile));
-}
-
-
-int Ng_Bisect_WithInfo ( const char * refinementfile, double ** qualityloss, int * qualityloss_size )
-{
-  BisectionOptions biopt;
-  biopt.outfilename = NULL; // "ngfepp.vol";
-  biopt.femcode = "fepp";
-  biopt.refinementfilename = refinementfile;
-  
-  Refinement * ref;
-  MeshOptimize2d * opt = NULL;
-  if (stlgeometry)
-    ref = new RefinementSTLGeometry(*stlgeometry);
-#ifdef OCCGEOMETRY
-  else if (occgeometry)
-    ref = new OCCRefinementSurfaces (*occgeometry);
-#endif
-#ifdef ACIS
-  else if (acisgeometry)
-    {
-      ref = new ACISRefinementSurfaces(*acisgeometry);
-      opt = new ACISMeshOptimize2dSurfaces(*acisgeometry);
-      ref->Set2dOptimizer(opt);
-    }
-#endif
-  else
-    {
-      ref = new RefinementSurfaces(*geometry);
-      opt = new MeshOptimize2dSurfaces(*geometry);
-      ref->Set2dOptimizer(opt);
-    }
-  
-  if(!mesh->LocalHFunctionGenerated())
-    mesh->CalcLocalH();
-  
-  mesh->LocalHFunction().SetGrading (mparam.grading);
-
-  ARRAY<double> * qualityloss_arr = NULL;
-  if(qualityloss != NULL)
-    qualityloss_arr = new ARRAY<double>;
-
-  ref -> Bisect (*mesh, biopt, qualityloss_arr);
-
-  int retval = 0;
-
-  if(qualityloss != NULL)
-    {
-      *qualityloss = new double[qualityloss_arr->Size()+1];
-
-      for(int i = 0; i<qualityloss_arr->Size(); i++)
-	(*qualityloss)[i+1] = (*qualityloss_arr)[i];
-
-      retval = qualityloss_arr->Size();
-
-      delete qualityloss_arr;
-    }
-
-  mesh -> UpdateTopology();
-  mesh -> GetCurvedElements().BuildCurvedElements (ref, mparam.elementorder);
-  
-  multithread.running = 0;
-  delete ref;
-  delete opt;
-
-  return retval;
-}
-
-void Ng_Bisect ( const char * refinementfile )
-{
-  Ng_Bisect_WithInfo( refinementfile, NULL, NULL );
-}
-
-
-
-
-
-/*
-  number of nodes of type nt
-  nt = 0 is Vertex
-  nt = 1 is Edge
-  nt = 2 is Face
-  nt = 3 is Cell
-*/
-int Ng_GetNNodes (int nt)
-{
-  switch (nt)
-    {
-    case 0: return mesh -> GetNV();
-    case 1: return mesh->GetTopology().GetNEdges();
-    case 2: return mesh->GetTopology().GetNFaces();
-    case 3: return mesh -> GetNE();
-    }
-  return -1;
-}
-
-
-int Ng_GetClosureNodes (int nt, int nodenr, int nodeset, int * nodes)
-{
-  switch (nt)
-    {
-    case 3:  // The closure of a cell
-      {
-        int cnt = 0;
-        if (nodeset & 1)  // Vertices
-          {
-            const Element & el = (*mesh)[ElementIndex(nodenr)];
-            for (int i = 0; i < el.GetNP(); i++)
-              { 
-                nodes[cnt++] = 0;
-                nodes[cnt++] = el[i] - PointIndex::BASE;
-              }
-          }
-
-        if (nodeset & 2)  // Edges
-          {
-            int edges[12];
-            int ned;
-            ned = mesh->GetTopology().GetElementEdges (nodenr+1, edges, 0);
-            for (int i = 0; i < ned; i++)
-              {
-                nodes[cnt++] = 1;
-                nodes[cnt++] = edges[i]-1;
-              }
-          }
-
-        if (nodeset & 4)  // Faces
-          {
-            int faces[12];
-            int nfa;
-            nfa = mesh->GetTopology().GetElementFaces (nodenr+1, faces, 0);
-            for (int i = 0; i < nfa; i++)
-              {
-                nodes[cnt++] = 2;
-                nodes[cnt++] = faces[i]-1;
-              }
-          }
-
-        if (nodeset & 8)  // Cell
-          {
-            nodes[cnt++] = 3;
-            nodes[cnt++] = nodenr;
-          }
-
-        return cnt/2;
-      }
-    default:
-      {
-        cerr << "GetClosureNodes not implemented for Nodetype " << nt << endl;
-      }
-    }
-  return 0;
-}
-
-
-
-int Ng_GetNElements (int dim)
-{
-  switch (dim)
-    {
-    case 0: return mesh -> GetNV();
-    case 1: return mesh -> GetNSeg();
-    case 2: return mesh -> GetNSE();
-    case 3: return mesh -> GetNE();
-    }
-  return -1;
-}
-
-
-
-  /*
-    closure nodes of element
-    nodeset is bit-coded, bit 0 includes Vertices, bit 1 edges, etc
-    E.g., nodeset = 6 includes edge and face nodes
-    nodes is pair of integers (nodetype, nodenr) 
-    return value is number of nodes
-   */
-int Ng_GetElementClosureNodes (int dim, int elementnr, int nodeset, int * nodes)
-{
-  switch (dim)
-    {
-    case 3:  // The closure of a volume element = CELL
-      {
-        return Ng_GetClosureNodes (3, elementnr, nodeset, nodes);
-      }
-    case 2:
-      {
-        int cnt = 0;
-        if (nodeset & 1)  // Vertices
-          {
-            const Element2d & el = (*mesh)[SurfaceElementIndex(elementnr)];
-            for (int i = 0; i < el.GetNP(); i++)
-              { 
-                nodes[cnt++] = 0;
-                nodes[cnt++] = el[i] - PointIndex::BASE;
-              }
-          }
-
-        if (nodeset & 2)  // Edges
-          {
-            int edges[12];
-            int ned;
-            ned = mesh->GetTopology().GetSurfaceElementEdges (elementnr+1, edges, 0);
-            for (int i = 0; i < ned; i++)
-              {
-                nodes[cnt++] = 1;
-                nodes[cnt++] = edges[i]-1;
-              }
-          }
-
-        if (nodeset & 4)  // Faces
-          {
-            int face = mesh->GetTopology().GetSurfaceElementFace (elementnr+1);
-            nodes[cnt++] = 2;
-            nodes[cnt++] = face-1;
-          }
-
-        return cnt/2;
-      }
-    default:
-      {
-        cerr << "GetClosureNodes not implemented for Element of dimension " << dim << endl;
-      }
-    }
-  return 0;
-}
diff --git a/contrib/Netgen/libsrc/interface/nginterface.h b/contrib/Netgen/libsrc/interface/nginterface.h
deleted file mode 100644
index 6301c23d822d6658f87892abb1218cec4e341fa4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/nginterface.h
+++ /dev/null
@@ -1,422 +0,0 @@
-#ifndef NGINTERFACE
-#define NGINTERFACE
-
-
-/**************************************************************************/
-/* File:   nginterface.h                                                  */
-/* 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 (const char * filename);
-  
-  // load netgen mesh
-  void Ng_LoadMesh (const char * filename);
-
-  // load netgen mesh
-  void Ng_LoadMeshFromString (const char * mesh_as_string);
-
-  // 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);
-
-  void Ng_SetElementIndex(const int ei, const int index);
-
-  // Get Material of element ei
-  char * Ng_GetElementMaterial (int ei);
-
-  // Get Material of domain dom
-  char * Ng_GetDomainMaterial (int dom);
-
-  // Get Surface Element Points
-  NG_ELEMENT_TYPE Ng_GetSurfaceElement (int ei, int * epi, int * np = 0);
-
-  // Get Surface Element Type
-  NG_ELEMENT_TYPE Ng_GetSurfaceElementType (int ei);
-
-  // Get Surface Element Index
-  int Ng_GetSurfaceElementIndex (int ei);
-
-  // Get Surface Element Surface Number
-  int Ng_GetSurfaceElementSurfaceNumber (int ei);
-  
-  // Get Surface Element Number
-  int Ng_GetSurfaceElementFDNumber (int ei);
-
-  // Get BCName for Surface Element  
-  char * Ng_GetSurfaceElementBCName (int ei);
-  //void Ng_GetSurfaceElementBCName (int ei, char * name);
-
-  // Get BCName for bc-number
-  char * Ng_GetBCNumBCName (int bcnr);
-  //void Ng_GetBCNumBCName (int bcnr, char * name);
-
-  // Get normal vector of surface element node
-  void Ng_GetNormalVector (int sei, int locpi, double * nv);     
-  
-
-  void Ng_SetPointSearchStartElement(int el);
-  
-  // Find element of point, returns local coordinates
-  int Ng_FindElementOfPoint (double * p, double * lami,
-			     int build_searchtrees = 0, 
-			     const int * const indices = NULL, const int numind = 0);
-  
-  // Find surface element of point, returns local coordinates
-  int Ng_FindSurfaceElementOfPoint (double * p, double * lami,
-				    int build_searchtrees = 0, 
-				    const int * const indices = NULL, const int numind = 0);
-  
-
-  // is elment ei curved ?
-  int Ng_IsElementCurved (int ei);
-  // is elment sei curved ?
-  int Ng_IsSurfaceElementCurved (int sei);
-
-  /// 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);
-
-  
-  /// buffer must be at least 100 doubles, alignment of double
-  void Ng_GetBufferedElementTransformation (int ei, const double * xi, 
-                                            double * x, double * dxdxi,
-                                            void * buffer, int buffervalid);
-  
-
-
-  /// Curved Elemens:
-  /// xi..local coordinates
-  /// x ..global coordinates
-  /// dxdxi...D x D-1 Jacobian matrix (row major storage)
-  /// curved ...is element curved ?
-  void Ng_GetSurfaceElementTransformation (int sei, const double * xi, 
-                                           double * x, double * dxdxi);
-
-  /// Curved Elemens:
-  /// xi..local coordinates
-  /// sxi..step xi
-  /// x ..global coordinates
-  /// dxdxi...D x D Jacobian matrix (row major storage)
-  void Ng_GetMultiElementTransformation (int ei, int n,
-                                         const double * xi, int sxi,
-                                         double * x, int sx,
-                                         double * dxdxi, int sdxdxi);
-
-  
-  // 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, bool rational = false);
-  //void Ng_HPRefinement (int levels, double parameter = 0.125);
-  void Ng_HPRefinement (int levels, double parameter = 0.125,
-			bool setorders = true,bool ref_level = false);
-  // void Ng_HPRefinement (int levels);
-  // void Ng_HPRefinement (int levels, double parameter);
-
-
-  // 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);
-  void Ng_GetElementOrders (int enr, int * ox, int * oy, int * oz);
-
-  void Ng_SetElementOrder (int enr, int order);
-  void Ng_SetElementOrders (int enr, int ox, int oy, int oz);
-
-  int Ng_GetSurfaceElementOrder (int enr);
-  void Ng_GetSurfaceElementOrders (int enr, int * ox, int * oy);
-
-  void Ng_SetSurfaceElementOrder (int enr, int order);
-  void Ng_SetSurfaceElementOrders (int enr, int ox, int oy);
-
-  // Multilevel functions:
-
-  // number of levels:
-  int Ng_GetNLevels ();
-  // get two parent nodes (indeed vertices !) 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);
-
-#ifdef PARALLEL
-  // Is Element ei an element of this processor ??
-  bool Ng_IsGhostEl (int ei);
-
-  void Ng_SetGhostEl(const int ei, const bool aisghost );
-
-  bool Ng_IsGhostSEl (int ei);
-
-  void Ng_SetGhostSEl(const int ei, const bool aisghost );
-
-  bool Ng_IsGhostVert ( int pnum );
-  bool Ng_IsGhostEdge ( int ednum );
-  bool Ng_IsGhostFace ( int fanum );
-
-  bool Ng_IsExchangeEl ( int elnum );
-  bool Ng_IsExchangeSEl ( int selnr );
-
-  void Ng_UpdateOverlap ();
-  int Ng_Overlap();
-/*   void Ng_SetGhostVert ( const int pnum, const bool aisghost ); */
-/*   void Ng_SetGhostEdge ( const int ednum, const bool aisghost ); */
-/*   void Ng_SetGhostFace ( const int fanum, const bool aisghost ); */
-
-#endif
-  
-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
-  {
-    const 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 (int idnr);
-  // pairs should be an integer array of 2*npairs
-  void Ng_GetPeriodicVertices (int idnr, int * pairs); 
-
-  // number of periodic edges  
-  int Ng_GetNPeriodicEdges (int idnr);
-  // pairs should be an integer array of 2*npairs
-  void Ng_GetPeriodicEdges (int idnr, int * pairs); 
-
-
-  void Ng_PushStatus (const char * str);
-  void Ng_PopStatus ();
-  void Ng_SetThreadPercentage (double percent);
-  void Ng_GetStatus (char ** str, double & percent);
-
-  void Ng_SetTerminate(void);
-  void Ng_UnSetTerminate(void);
-  int Ng_ShouldTerminate(void);
-  
-  
-  //// 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 SOCKETS
-  int Ng_SocketClientOpen( const int port, const char * host );
-  void Ng_SocketClientWrite( const char * write, char ** reply);
-  void Ng_SocketClientClose ( void );
-  void Ng_SocketClientGetServerHost ( const int number, char ** host );
-  void Ng_SocketClientGetServerPort ( const int number, int * port );
-  void Ng_SocketClientGetServerClientID ( const int number, int * id );
-#endif
-
-  void Ng_InitPointCurve(double red, double green, double blue);
-  void Ng_AddPointCurvePoint(const double * point);
-
-
-#ifdef PARALLEL
-  void Ng_SetElementPartition ( int elnr, int part );
-  int  Ng_GetElementPartition ( int elnr );
-#endif
-
-  void Ng_SaveMesh ( const char * meshfile );
-  void Ng_Bisect ( const char * refinementfile );
-
-  // if qualityloss is not equal to NULL at input, a (1-based) list of qualitylosses (due to projection)
-  // is saved in *qualityloss, its size is the return value
-  int Ng_Bisect_WithInfo ( const char * refinementfile, double ** qualityloss);
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-
-
-
-
-
-/*
-  The new node interface ...
-  it is 0-based !
- */
-
-extern "C" {
-  
-  /*
-    number of nodes of type nt
-    nt = 0 is Vertex
-    nt = 1 is Edge
-    nt = 2 is Face
-    nt = 3 is Cell
-   */
-  int Ng_GetNNodes (int nt);
-
-  /*
-    closure nodes of node (nt, nodenr):
-    nodeset is bit-coded, bit 0 includes Vertices, bit 1 edges, etc
-    E.g., nodeset = 6 includes edge and face nodes
-    nodes consists of pairs of integers (nodetype, nodenr) 
-    return value is number of nodes
-   */
-  int Ng_GetClosureNodes (int nt, int nodenr, int nodeset, int * nodes);
-
-  
-  /*
-    number of dim-dimensional elements 
-    dim = 3 ... volume elements
-    dim = 2 ... surface elements
-    dim = 1 ... segments
-    dim = 0 ... not available
-  */
-  int Ng_GetNElements (int dim);
-
-  /*
-    closure nodes of dim-dimensional element elmentnr:
-    nodeset is bit-coded, bit 0 includes Vertices, bit 1 edges, etc
-    E.g., nodeset = 6 includes edge and face nodes
-    nodes consists of pairs of integers (nodetype, nodenr) 
-    return value is number of nodes
-   */
-  int Ng_GetElementClosureNodes (int dim, int elementnr, int nodeset, int * nodes);
-}
diff --git a/contrib/Netgen/libsrc/interface/nglib.cpp b/contrib/Netgen/libsrc/interface/nglib.cpp
deleted file mode 100644
index 861c62cd97f692521c5e8ec202a081c6b7ff5396..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/nglib.cpp
+++ /dev/null
@@ -1,602 +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>
-
-// MODIFIED FOR GMSH
-//#include <csg.hpp>
-//#include <stlgeom.hpp>
-//#include <geometry2d.hpp>
-
-#include <meshing.hpp>
-
-
-
-// #include <FlexLexer.h>
-
-// MODIFIED FOR GMSH
-//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;
-}
-
-void Ng_RestrictMeshSizeGlobal (Ng_Mesh * mesh, double h)
-{
-  ((Mesh*)mesh) -> SetGlobalH (h);
-}
-
-void Ng_RestrictMeshSizePoint (Ng_Mesh * mesh, double * p, double h)
-{
-  ((Mesh*)mesh) -> RestrictLocalH (Point3d (p[0], p[1], p[2]), h);
-}
-
-void Ng_RestrictMeshSizeBox (Ng_Mesh * mesh, double * pmin, double * pmax, double h)
-{
-  for (double x = pmin[0]; x < pmax[0]; x += h)
-    for (double y = pmin[1]; y < pmax[1]; y += h)
-      for (double z = pmin[2]; z < pmax[2]; z += h)
-        ((Mesh*)mesh) -> RestrictLocalH (Point3d (x, y, z), h);
-}
-
-
-// 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;
-}
-
-
-
-// 2D Meshing Functions:
-
-#if 0 // MODIFIED FOR GMSH
-
-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;
-
-  Point<3> & p = m->Point(num);
-  x[0] = p(0);
-  x[1] = p(1);
-}
-
-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);
-}
-
-void Ng_HP_Refinement (Ng_Geometry_2D * geom,
-		       Ng_Mesh * mesh,
-		       int levels, double parameter)
-{
-  Refinement2d ref(*(SplineGeometry2d*)geom);
-  HPRefinement (*(Mesh*)mesh, &ref, levels, parameter);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-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 // MODIFIED FOR GMSH
-
-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 968aeb9179e199e748e64cf780c1f93913689ea8..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/nglib.h
+++ /dev/null
@@ -1,221 +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 };
-
-
-
-
-  
-// 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 ACIS
-
-// **********************************************************
-// **   ACIS Meshing                                       **
-// **********************************************************
-
-/// Data type for NETGEN STL geomty
-typedef void * Ng_ACIS_Geometry;
-
-// loads geometry from STL file
-Ng_ACIS_Geometry * Ng_ACIS_LoadGeometry (const char * filename);
-  
-// generates mesh, empty mesh must be already created.
-Ng_Result Ng_ACIS_GenerateSurfaceMesh (Ng_ACIS_Geometry * geom,
-                                       Ng_Mesh * mesh,
-                                       Ng_Meshing_Parameters * mp);
-
-
-#endif
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/interface/readtetmesh.cpp b/contrib/Netgen/libsrc/interface/readtetmesh.cpp
deleted file mode 100644
index 4a81e5e7ab107f9294726f0b5a320d7033a94067..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/readtetmesh.cpp
+++ /dev/null
@@ -1,797 +0,0 @@
-
-//
-//  Read CST file format
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-#include <sys/stat.h>
-
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-
-
-  void ReadTETFormat (Mesh & mesh, 
-                      const string & hfilename)
-  {
-    const char * filename = hfilename.c_str();
-
-    cout << "Reading .tet mesh" << endl;
-
-    ifstream in (filename);
-
-    int inputsection = 0;
-    bool done = false;
-
-    char ch;
-    string str;
-
-    string version;
-
-    int unitcode;
-    double tolerance;
-    double dS1, dS2, alphaDeg, x3D, y3D, z3D;
-    int nelts,nfaces,nedges,nnodes;
-    int nperiodicmasternodes,ncornerperiodicmasternodes,ncubicperiodicmasternodes;
-    int nperiodicmasteredges,ncornerperiodicmasteredges;
-    int nperiodicmasterfaces;
-    int nodeid,type,pid;
-    int dummyint;
-    int modelverts,modeledges,modelfaces,modelcells;
-    Point3d p;
-    int numObj3D,numObj2D,numObj1D,numObj0D;
-    bool nullstarted;
-    ARRAY<int> eldom;
-    int minId3D,minId2D;
-    int maxId3D(-1), maxId2D(-1), maxId1D(-1), maxId0D(-1);
-    ARRAY<ARRAY<int> *> segmentdata;
-    ARRAY<Element2d* > tris;
-
-    ARRAY<int> userdata_int;  // just save data for 1:1 output
-    ARRAY<double> userdata_double;
-    ARRAY<int> point_pids;
-    ARRAY<int> tetfacedata;
-    ARRAY<int> uid_to_group_3D, uid_to_group_2D, uid_to_group_1D, uid_to_group_0D;
-
-    while(!done)
-      {
-        // skip "//" comment
-        bool comment = true;
-        while(comment)
-          {
-            ch = in.get();
-            while(ch == ' ' || ch == '\n' || ch == '\t' || ch =='\r')
-              ch = in.get();
-	      
-            if(ch != '/')
-              {
-                comment = false;
-                in.putback(ch);
-              }
-            else
-              {
-                ch = in.get();
-                if(ch != '/')
-                  {
-                    comment = false;
-                    in.putback(ch);
-                    in.putback('/');
-                  }
-                else
-                  {
-                    in.ignore(10000,'\n');
-                  }
-              }
-          }
-
-	  
-        switch(inputsection)
-          {
-          case 0:
-            // version number
-            in >> version;
-            cout << "Version number " << version << endl;
-            if(version != "1.1" && version != "2" && version != "2.0")
-              {
-                cerr << "WARNING: import only tested for versions 1.1 and 2" << endl;
-                //done = true;
-              }
-            userdata_double.Append(atof(version.c_str()));
-            break;
-
-          case 1:
-            // unit code (1=CM 2=MM 3=M 4=MIC 5=NM 6=FT 7=IN 8=MIL)
-            in >> unitcode;
-            cout << "unit code " << unitcode << endl;
-            userdata_int.Append(unitcode);
-            break;
-
-          case 2:
-            // Geometric coord "zero" tolerance threshold
-            in >> tolerance;
-            cout << "tolerance " << tolerance << endl;
-            userdata_double.Append(tolerance);
-            break;
-
-          case 3:
-            // Periodic UnitCell dS1 , dS2 , alphaDeg
-            in >> dS1 >> dS2 >> alphaDeg;
-            userdata_double.Append(dS1);
-            userdata_double.Append(dS2);
-            userdata_double.Append(alphaDeg);
-            break;
-
-          case 4:
-            // Periodic UnitCell origin in global coords (x3D,y3D,z3D)
-            in >> x3D >> y3D >> z3D;
-            userdata_double.Append(x3D);
-            userdata_double.Append(y3D);
-            userdata_double.Append(z3D);
-            break;
-
-          case 5:
-            // Model entity count: Vertices, Edges, Faces, Cells (Version 2)
-            in >> modelverts >> modeledges >> modelfaces >> modelcells;
-            userdata_int.Append(modelverts);
-            userdata_int.Append(modeledges);
-            userdata_int.Append(modelfaces);
-            userdata_int.Append(modelcells);
-            break;
-
-          case 6:
-            // Topological mesh-entity counts (#elements,#faces,#edges,#nodes)
-            in >> nelts >> nfaces >> nedges >> nnodes;
-            cout << nelts << " elements, " << nfaces << " faces, " << nedges << " edges, " << nnodes << " nodes" << endl;
-            mesh.SetAllocSize(nnodes,2*nedges,nfaces,nelts);
-            break;
-
-          case 7:
-            // NodeID, X, Y, Z, Type (0=Reg 1=PMaster 2=PSlave 3=CPMaster 4=CPSlave), PID:
-            {
-              cout << "read nodes" << endl;
-              for(int i=0; i<nnodes; i++)
-                {
-                  in >> nodeid >> p.X() >> p.Y() >> p.Z() >> type >> pid;
-                  mesh.AddPoint(p);		  
-                  point_pids.Append(pid);
-                  if(pid > maxId0D)
-                    maxId0D = pid;
-                  //(*testout) << "point " << p << " type " << type << " mastersexist " << mastersexist << endl;
-                }
-            }
-            break;
-
-          case 8:
-            // Number of Periodic Master Nodes
-            in >> nperiodicmasternodes;
-            break;
-
-          case 9:
-            // MasterNodeID, SlaveNodeID, TranslCode (1=dS1 2=dS2 3=dS1+dS2)
-            for(int i=0; i<nperiodicmasternodes; i++)
-              {
-                for(int j=0; j<2; j++)
-                  in >> dummyint;
-
-                in >> dummyint;
-              }
-            break;
-
-          case 10:
-            // Number of Corner Periodic Master Nodes
-            in >> ncornerperiodicmasternodes;
-            break;
-
-          case 11:
-            // MasterNodeID, 3-SlaveNodeID's, 3-TranslCodes (1=dS1 2=dS2 3=dS1+dS2)
-            for(int i=0; i<ncornerperiodicmasternodes; i++)
-              {
-                for(int j=0; j<4; j++)
-                  in >> dummyint;
-
-                for(int j=0; j<3; j++)
-                  in >> dummyint;
-              }
-            break;
-
-          case 12:
-            // Number of Cubic Periodic Master Nodes
-            in >> ncubicperiodicmasternodes;
-            break;
-
-          case 13:
-            //MasterNodeID, 7-SlaveNodeID's, TranslCodes
-            for(int i=0; i<ncubicperiodicmasternodes; i++)
-              {
-                for(int j=0; j<8; j++)
-                  in >> dummyint;
-
-                for(int j=0; j<7; j++)
-                  in >> dummyint;
-              }
-            break;
-
-          case 14:
-            // EdgeID, NodeID0, NodeID1, Type (0=Reg 1=PMaster 2=PSlave 3=CPMaster 4=CPSlave), PID
-            cout << "read edges" << endl;
-            nullstarted = false;
-            segmentdata.SetSize(nedges);
-            for(int i=0; i<nedges; i++)
-              {
-                segmentdata[i] = new ARRAY<int>(7);
-                *segmentdata[i] = -1;
-                in >> dummyint;
-                in >> (*segmentdata[i])[0] >> (*segmentdata[i])[1];
-                in >> type;
-                in >> (*segmentdata[i])[2];
-                if((*segmentdata[i])[2] > maxId1D)
-                  maxId1D = (*segmentdata[i])[2];
-              }
-            break;
-
-          case 15:
-            // Number of Periodic Master Edges
-            in >> nperiodicmasteredges;
-            break;
-
-          case 16:
-            // MasterEdgeID, SlaveEdgeID, TranslCode (1=dS1 2=dS2 3=dS1+dS2)
-            for(int i=0; i<nperiodicmasteredges; i++)
-              in >> dummyint >> dummyint >> dummyint;
-            break;
-
-          case 17:
-            // Number of Corner Periodic Master Edges
-            in >> ncornerperiodicmasteredges;
-            break;
-
-          case 18:
-            // MasterEdgeID, 3 SlaveEdgeID's, 3 TranslCode (1=dS1 2=dS2 3=dS1+dS2)
-            for(int i=0; i<ncornerperiodicmasteredges; i++)
-              {
-                in >> dummyint;
-                for(int j=0; j<3; j++)
-                  in >> dummyint;
-                for(int j=0; j<3; j++)
-                  in >> dummyint;
-              }
-            break;
-
-          case 19:
-            // FaceID, EdgeID0, EdgeID1, EdgeID2, FaceType (0=Reg 1=PMaster 2=PSlave), PID
-            {
-              //Segment seg;
-              int segnum_ng[3];
-              bool neg[3];
-              cout << "read faces" << endl;
-              nullstarted = false;
-              for(int i=0; i<nfaces; i++)
-                {
-                  int trinum;
-                  int segnum;
-		    
-                  tris.Append(new Element2d(TRIG));
-
-                  in >> trinum;
-                  for(int j=0; j<3; j++)
-                    {
-                      in >> segnum;
-                      neg[j] = (segnum<0);
-                      if(!neg[j])
-                        segnum_ng[j] = segnum-1;
-                      else
-                        segnum_ng[j] = -segnum-1;
-			
-                      if(neg[j])
-                        tris.Last()->PNum(j+1) = (*segmentdata[segnum_ng[j]])[1];
-                      else
-                        tris.Last()->PNum(j+1) = (*segmentdata[segnum_ng[j]])[0];
-
-                      tris.Last()->GeomInfoPi(j+1).trignum = trinum;
-                    }
-                  in >> type;
-                  int faceid;
-                  in >> faceid;
-		    
-                  if(faceid > maxId2D)
-                    maxId2D = faceid;
-
-                  if(i==0 || faceid < minId2D)
-                    minId2D = faceid;
-		    
-                  tris.Last()->SetIndex(faceid);
-
-                  if(faceid > 0)
-                    {
-                      //if(nullstarted)
-                      //  {
-                      //    cout << "Faces: Assumption about index 0 wrong (face"<<trinum <<")" << endl;
-                      //  }
-                      //mesh.AddSurfaceElement(tri);
-			
-                      for(int j=0; j<3; j++)
-                        {
-                          if(neg[j])
-                            {
-                              (*segmentdata[segnum_ng[j]])[4] = faceid;
-                              (*segmentdata[segnum_ng[j]])[6] = trinum;
-                            }
-                          else
-                            {
-                              (*segmentdata[segnum_ng[j]])[3] = faceid;
-                              (*segmentdata[segnum_ng[j]])[5] = trinum;
-                            }
-                        }
-                    }
-                  else
-                    nullstarted = true;
-                }
-            }
-            break;
-
-          case 20:
-            // Number of Periodic Master Faces
-            in >> nperiodicmasterfaces;
-            break;
-
-          case 21:
-            // MasterFaceID, SlaveFaceID, TranslCode (1=dS1 2=dS2)
-            {
-              Vec<3> randomvec(-1.32834,3.82399,0.5429151);
-              int maxtransl = -1;
-              for(int i=0; i<nperiodicmasterfaces; i++)
-                {
-                  int tri1,tri2,transl;
-                  ARRAY<PointIndex> nodes1(3),nodes2(3);
-                  ARRAY<double> sortval1(3),sortval2(3);
-                  in >> tri1 >> tri2 >> transl;
-
-                  if(transl > maxtransl)
-                    maxtransl = transl;
-		    
-		    
-                  for(int j=0; j<3; j++)
-                    {
-                      nodes1[j] = tris[tri1-1]->PNum(j+1);
-                      sortval1[j] = Vec<3>(mesh[nodes1[j]])*randomvec;
-                      nodes2[j] = tris[tri2-1]->PNum(j+1);
-                      sortval2[j] = Vec<3>(mesh[nodes2[j]])*randomvec;
-                    }
-
-                  BubbleSort(sortval1,nodes1);
-                  BubbleSort(sortval2,nodes2);
-
-                  for(int j=0; j<3; j++)
-                    mesh.GetIdentifications().Add(nodes1[j],nodes2[j],transl);
-			
-                }
-              for(int i=1; i<= maxtransl; i++)
-                mesh.GetIdentifications().SetType(i,Identifications::PERIODIC);
-            }	      
-            break;
-
-          case 22:
-            // ElemID, FaceID0, FaceID1, FaceID2, FaceID3, PID
-            {
-              cout << "read elements (1)" << endl;
-
-              //SurfaceElementIndex surf[4];
-              bool neg[4];
-              int elemid;
-              int domain;
-		
-              eldom.SetSize(nelts);
-
-              for(int i=0; i<nelts; i++)
-                {
-                  if(int(100.*i/nelts) % 5 == 0)
-                    cout << int(100.*i/nelts)
-#ifdef WIN32
-                         << "%%\r"
-#else
-                         << "\%\r"
-#endif 
-                         << flush;
-                  in >> elemid;
-                  for(int j=0; j<4;j++)
-                    {
-                      in >> dummyint;
-                      neg[j] = (dummyint < 0);
-                      if(neg[j])
-                        tetfacedata.Append(-dummyint-1);
-                      //surf[j] = -dummyint-1;
-                      else
-                        tetfacedata.Append(dummyint-1);
-                      tetfacedata.Append(((neg[j]) ? 1 : 0));
-                      //surf[j] = dummyint-1;
-                    }
-		    
-                  in >> domain;
-                  eldom[i] = domain;
-                  tetfacedata.Append(domain);
-
-                  if(i==0 || domain < minId3D)
-                    minId3D = domain;
-
-                  if(domain > maxId3D)
-                    maxId3D = domain;
-		    
-                  // 		    for(int j=0; j<4; j++)
-                  // 		      {
-                  // 			if(mesh.GetNSE() <= surf[j])
-                  // 			  continue;
-
-                  // 			int faceind = 0;
-                  // 			for(int k=1; k<=mesh.GetNFD(); k++)
-                  // 			  {
-                  // 			    if(mesh.GetFaceDescriptor(k).SurfNr() == mesh[surf[j]].GetIndex())
-                  // 			      faceind = k;
-                  // 			  }
-                  // 			if(faceind)
-                  // 			  {
-                  // 			    if(neg[j])
-                  // 			      mesh.GetFaceDescriptor(faceind).SetDomainOut(domain);
-                  // 			    else
-                  // 			      mesh.GetFaceDescriptor(faceind).SetDomainIn(domain);
-                  // 			  }
-                  // 			else
-                  // 			  {
-                  // 			    if(neg[j])
-                  // 			      faceind = mesh.AddFaceDescriptor(FaceDescriptor(mesh[surf[j]].GetIndex(),0,domain,0));
-                  // 			    else
-                  // 			      faceind = mesh.AddFaceDescriptor(FaceDescriptor(mesh[surf[j]].GetIndex(),domain,0,0));
-                  // 			    mesh.GetFaceDescriptor(faceind).SetBCProperty(mesh[surf[j]].GetIndex());
-                  // 			  }
-                  // 		      }
-                }
-              cout << endl;
-		
-		
-              // 		ARRAY<int> indextodescriptor(maxId2D+1);
-		
-              // 		for(int i=1; i<=mesh.GetNFD(); i++)
-              // 		  indextodescriptor[mesh.GetFaceDescriptor(i).SurfNr()] = i;
-		
-		
-              // 		for(SurfaceElementIndex i=0; i<mesh.GetNSE(); i++)
-              // 		  mesh[i].SetIndex(indextodescriptor[mesh[i].GetIndex()]);
-            }
-            break;
-
-          case 23:
-            // ElemID, NodeID0, NodeID1, NodeID2, NodeID3
-            { 
-              cout << "read elements (2)" << endl;
-              Element el(TET);
-              for(ElementIndex i=0; i<nelts; i++)
-                {
-                  in >> dummyint;
-                  for(int j=1; j<=4; j++)
-                    in >> el.PNum(j);
-                  swap(el.PNum(1),el.PNum(2));
-		    
-                  el.SetIndex(eldom[i]);
-                  mesh.AddVolumeElement(el);
-                }	
-            }	  
-            break;
-	      
-          case 24:
-            // Physical Object counts (#Obj3D,#Obj2D,#Obj1D,#Obj0D)
-            {
-              in >> numObj3D;
-              userdata_int.Append(numObj3D);
-              in >> numObj2D;
-              userdata_int.Append(numObj2D);
-              in >> numObj1D;
-              userdata_int.Append(numObj1D);
-              in >> numObj0D;
-              userdata_int.Append(numObj0D);
-            }
-            break;
-
-          case 25:
-            // Number of Ports (Ports are a subset of Object2D list)
-            {
-              in >> dummyint;
-              //userdata_int.Append(dummyint);
-            }
-            break;
-
-          case 26:
-            // Object3D GroupID, #Elems <immediately followed by> ElemID List
-            {
-              uid_to_group_3D.SetSize(maxId3D+1);
-              uid_to_group_3D = -1;
-              for(int i=0; i<numObj3D; i++)
-                {
-                  int groupid;
-                  in >> groupid;
-                  (*testout) << "3d groupid " << groupid << endl;
-                  //userdata_int.Append(groupid);
-                  int nelems;
-                  in >> nelems;
-                  //userdata_int.Append(nelems);
-                  for(int j=0; j<nelems; j++)
-                    {
-                      in >> dummyint;
-			
-                      (*testout) << "read " << dummyint << endl;
-                      //userdata_int.Append(dummyint);
-			
-                      if(dummyint < 0) 
-                        dummyint *= -1;
-                      uid_to_group_3D[eldom[dummyint-1]] = groupid;
-                    }
-                }
-            }
-            break;
-
-          case 27:
-            // Object2D GroupID, #Faces <immediately followed by> FaceID List
-            {
-              ARRAY<int> ports;
-              //int totnum = 0;
-              uid_to_group_2D.SetSize(maxId2D+1);
-              uid_to_group_2D = -1;
-
-              for(int i=0; i<numObj2D; i++)
-                {
-                  int groupid;
-                  in >> groupid;
-                  (*testout) << "2d groupid " << groupid << endl;
-                  //userdata_int.Append(groupid);
-                  int nelems;
-                  in >> nelems;
-                  //userdata_int.Append(nelems);
-                  for(int j=0; j<nelems; j++)
-                    {
-                      in >> dummyint;
-                      char port;
-                      while((port = in.get()) == ' ')
-                        ;
-
-                      (*testout) << "read " << dummyint << endl;
-                      if(dummyint < 0) 
-                        dummyint *= -1;
-                      int uid = tris[dummyint-1]->GetIndex();
-
-                      if(port == 'P' || port == 'p')
-                        {
-                          if(!ports.Contains(uid))
-                            ports.Append(uid);
-                        }
-                      else
-                        in.putback(port);
-			
-                      //userdata_int.Append(dummyint);
-			
-                      uid_to_group_2D[uid] = groupid;
-                      (*testout) << "setting " << uid << endl;
-
-                      //totnum++;
-                    }
-                }
-              mesh.SetUserData("TETmesh:ports",ports);
-            }
-            break;
-
-          case 28:
-            // Object1D GroupID, #Edges <immediately followed by> EdgeID List
-            {
-              uid_to_group_1D.SetSize(maxId1D+1);
-              uid_to_group_1D = -1;
-
-              for(int i=0; i<numObj1D; i++)
-                {
-                  int groupid;
-                  in >> groupid;
-                  //userdata_int.Append(groupid);
-                  int nelems;
-                  in >> nelems;
-                  //userdata_int.Append(nelems);
-                  for(int j=0; j<nelems; j++)
-                    {
-                      in >> dummyint;
-                      //userdata_int.Append(dummyint);
-
-                      if(dummyint < 0) 
-                        dummyint *= -1;
-                      uid_to_group_1D[(*segmentdata[dummyint-1])[2]] = groupid;
-                    }
-                }
-            }
-            break;
-
-          case 29:
-            // Object0D GroupID, #Nodes <immediately followed by> NodeID List
-            {
-              uid_to_group_0D.SetSize(maxId0D+1);
-              uid_to_group_0D = -1;
-              for(int i=0; i<numObj0D; i++)
-                {
-                  int groupid;
-                  in >> groupid;
-                  //userdata_int.Append(groupid);
-                  int nelems;
-                  in >> nelems;
-                  //userdata_int.Append(nelems);
-                  for(int j=0; j<nelems; j++)
-                    {
-                      in >> dummyint;
-                      //userdata_int.Append(dummyint);
-
-                      if(dummyint < 0) 
-                        dummyint *= -1;
-                      uid_to_group_0D[point_pids[dummyint-1]] = groupid;
-                    }
-                }
-            }
-            break;
-
-
-
-          default:
-            done = true;
-	      
-          }
-	  
-        if(inputsection == 4 && version == "1.1")
-          inputsection++;
-
-        inputsection++;
-      }
-    in.close();
-
-
-    mesh.SetUserData("TETmesh:double",userdata_double);
-    userdata_int.Append(minId2D);
-    userdata_int.Append(minId3D);
-    mesh.SetUserData("TETmesh:int",userdata_int);   
-    //if(version == "1.1")
-    mesh.SetUserData("TETmesh:point_id",point_pids);
-
-    mesh.SetUserData("TETmesh:uid_to_group_3D",uid_to_group_3D);
-    mesh.SetUserData("TETmesh:uid_to_group_2D",uid_to_group_2D);
-    mesh.SetUserData("TETmesh:uid_to_group_1D",uid_to_group_1D);
-    mesh.SetUserData("TETmesh:uid_to_group_0D",uid_to_group_0D);
-
-
-    ARRAY<SurfaceElementIndex> surfindices(tris.Size());
-    surfindices = -1;
-
-    for(int i=0; i<tris.Size(); i++)
-      {
-        if(atof(version.c_str()) <= 1.999999)
-          {
-            if(tris[i]->GetIndex() > 0)
-              surfindices[i] = mesh.AddSurfaceElement(*tris[i]);
-          }
-        else
-          {
-            if(tris[i]->GetIndex() > 0 &&
-               tris[i]->GetIndex() < minId3D)
-              {
-                tris[i]->SetIndex(tris[i]->GetIndex()-minId2D+1);
-                surfindices[i] = mesh.AddSurfaceElement(*tris[i]);
-              }
-          }
-        delete tris[i];
-      }
-
-      
-    mesh.ClearFaceDescriptors();
-    if(atof(version.c_str()) <= 1.999999)
-      for(int i = 1; i <= maxId2D; i++)
-        mesh.AddFaceDescriptor(FaceDescriptor(i,0,0,0));
-    else
-      for(int i=minId2D; i<minId3D; i++)
-        mesh.AddFaceDescriptor(FaceDescriptor(i,0,0,0));
-	
-
-    for(int i=0; i<tetfacedata.Size(); i+=9)
-      {
-        for(int j=0; j<4; j++)
-          {
-            SurfaceElementIndex surf = surfindices[tetfacedata[i+2*j]];
-	      
-            //if(mesh.GetNSE() <= surf)
-            if(surf == -1)
-              continue;
-
-            if(tetfacedata[i+2*j+1] == 1)
-              mesh.GetFaceDescriptor(mesh[surf].GetIndex()).SetDomainOut(tetfacedata[i+8]);
-            else
-              mesh.GetFaceDescriptor(mesh[surf].GetIndex()).SetDomainIn(tetfacedata[i+8]);
-			
-
-            /*
-	      int faceind = 0;
-	      for(int k=1; k<=mesh.GetNFD(); k++)
-              {
-              if(mesh.GetFaceDescriptor(k).SurfNr() == mesh[surf].GetIndex())
-              faceind = k;
-              }
-	      if(faceind)
-              {
-              if(tetfacedata[i+4+j] == 1)
-              mesh.GetFaceDescriptor(faceind).SetDomainOut(tetfacedata[i+8]);
-              else
-              mesh.GetFaceDescriptor(faceind).SetDomainIn(tetfacedata[i+8]);
-              }
-	      else
-              {
-              if(tetfacedata[i+4+j] == 1)
-              faceind = mesh.AddFaceDescriptor(FaceDescriptor(mesh[surf].GetIndex(),0,tetfacedata[i+8],0));
-              else
-              faceind = mesh.AddFaceDescriptor(FaceDescriptor(mesh[surf].GetIndex(),tetfacedata[i+8],0,0));
-              mesh.GetFaceDescriptor(faceind).SetBCProperty(mesh[surf].GetIndex());
-              }
-            */
-          }
-
-      }
-      
-    //       ARRAY<int> indextodescriptor(maxId2D+1);
-		
-    //       for(int i=1; i<=mesh.GetNFD(); i++)
-    // 	indextodescriptor[mesh.GetFaceDescriptor(i).SurfNr()] = i;
-		
-		
-    //       for(SurfaceElementIndex i=0; i<mesh.GetNSE(); i++)
-    // 	mesh[i].SetIndex(indextodescriptor[mesh[i].GetIndex()]);
-
-
-    for(int i=0; i<segmentdata.Size(); i++)
-      {
-        Segment seg;
-
-	  
-        if((atof(version.c_str()) <= 1.999999 && (*segmentdata[i])[2] > 0) ||
-           (atof(version.c_str()) > 1.999999  && (*segmentdata[i])[2] > 0 && (*segmentdata[i])[2] < minId2D))
-          {
-            seg.p1 = (*segmentdata[i])[0];
-            seg.p2 = (*segmentdata[i])[1];
-            seg.edgenr = (*segmentdata[i])[2];
-            seg.epgeominfo[0].edgenr = (*segmentdata[i])[2];
-            seg.epgeominfo[1].edgenr = (*segmentdata[i])[2];
-            seg.si = (*segmentdata[i])[3]-minId2D+1;
-            seg.surfnr1 = -1;//(*segmentdata[i])[3];
-            seg.surfnr2 = -1;//(*segmentdata[i])[4];
-            seg.geominfo[0].trignum = (*segmentdata[i])[5];
-            seg.geominfo[1].trignum = (*segmentdata[i])[5];
-            mesh.AddSegment(seg);
-
-            seg.p1 = (*segmentdata[i])[1];
-            seg.p2 = (*segmentdata[i])[0];
-            seg.si = (*segmentdata[i])[4]-minId2D+1;
-            seg.surfnr1 = -1;//(*segmentdata[i])[3];
-            seg.surfnr2 = -1;//(*segmentdata[i])[4];
-            seg.geominfo[0].trignum = (*segmentdata[i])[6];
-            seg.geominfo[1].trignum = (*segmentdata[i])[6];
-            mesh.AddSegment(seg);
-          }
-        delete segmentdata[i];
-      }
-
-    /*
-      for(int i=mesh.GetNSeg(); i>=1; i--)
-      if(mesh.LineSegment(i).epgeominfo[0].edgenr == 0 ||
-      mesh.LineSegment(i).epgeominfo[1].edgenr == 0)
-      mesh.FullDeleteSegment(i);
-    */	
-  
-    mesh.CalcSurfacesOfNode();
-      
-  }
-}
-
-
diff --git a/contrib/Netgen/libsrc/interface/readuser.cpp b/contrib/Netgen/libsrc/interface/readuser.cpp
deleted file mode 100644
index cb677d8d72421cf35bce5f96dd8fb64a72478688..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/readuser.cpp
+++ /dev/null
@@ -1,407 +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);
-          }
-
-        mesh.ClearFaceDescriptors();
-        mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-      
-        in >> nbe;
-        //      int invert = globflags.GetDefineFlag ("invertsurfacemesh");
-        for (i = 1; i <= nbe; i++)
-          {
-            Element2d el;
-            int hi;
-	  
-            el.SetIndex(1);
-	  
-            // in >> hi; 
-            for (j = 1; j <= 3; j++)
-              {
-                in >> el.PNum(j);
-                // 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);
-          }
-      
-      
-        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);
-
-        mesh.ClearFaceDescriptors();
-        mesh.AddFaceDescriptor (FaceDescriptor(0,1,0,0));
-
-
-        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;
-                  }
-              }
-          }
-      
-
-        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);
-              }
-
-            mesh.AddFaceDescriptor (FaceDescriptor (1, 1, 0, 0));
-	  
-            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)(0) < 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);
-          }
-      }
-
-
-    // .tet mesh
-    if ( (strlen (filename) > 4) &&
-         strcmp (&filename[strlen (filename)-4], ".tet") == 0 )
-      {
-        ReadTETFormat (mesh, filename);
-      }
-  }
-  
-}
-
diff --git a/contrib/Netgen/libsrc/interface/writeabaqus.cpp b/contrib/Netgen/libsrc/interface/writeabaqus.cpp
deleted file mode 100644
index 2564da0be6af9523482a487cdda872a81f32f0e5..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)(0) << ", ";
-      outfile << mesh.Point(i)(1) << ", ";
-      outfile << mesh.Point(i)(2) << "\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);
-      size_t 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(0);
-
-      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 649702521ff5568baf2e2531c7132cc8da4e707c..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[PointIndex(i)].Type() != 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[PointIndex(i)].Type() != 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/writedolfin.cpp b/contrib/Netgen/libsrc/interface/writedolfin.cpp
deleted file mode 100644
index 0fe36e94af8b45a9a49058967c262283968cf92b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writedolfin.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-//  Write dolfin file
-//
-//  by
-//  Kent-Andre Mardal <kent-and@simula.no>
-
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-
-#include "writeuser.hpp"
-
-
-
-  void WriteDolfinFormat (const Mesh & mesh, const string & filename)
-  {
-    cout << "start writing dolfin export" << endl;
-
-    int np = mesh.GetNP();
-    int ne = mesh.GetNE();
-    int nse = mesh.GetNSE();
-    int nsd = mesh.GetDimension(); 
-    int invertsurf = mparam.inverttrigs;
-    int i, j;
-
-    ofstream outfile (filename.c_str());
-
-    char str[100];
-    outfile.precision(8);
-    outfile.setf (ios::fixed, ios::floatfield);
-    outfile.setf (ios::showpoint);
-
-    if ( nsd == 3) {
-
-      outfile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" <<endl; 
-      outfile << ""<<endl; 
-
-      outfile << "<dolfin xmlns:dolfin=\"http://www.phi.chalmers.se/dolfin/\">"<<endl;
-      outfile << "  <mesh celltype=\"tetrahedron\" dim=\"3\">" <<endl; 
-      outfile << "      <vertices size=\""<<np<<"\">"<<endl; 
-      for (i = 1; i <= np; i++) { 
-        const Point3d & p = mesh.Point(i);
-        outfile << "      <vertex index=\""<<i-1<<"\" x=\""<<p.X()<<"\" y=\""<<p.Y()<<"\" z=\""<<p.Z()<<"\"/>"<<endl; 
-      }
-      outfile << "      </vertices>"<<endl; 
-
-
-
-      outfile << "      <cells size=\""<<ne<<"\">"<<endl; 
-      for (i = 1; i <= ne; i++) {
-        const Element & el = mesh.VolumeElement(i);
-
-        outfile << "      <tetrahedron index=\""<<i-1<<"\" v0=\""<<el.PNum(1)-1<<"\" v1=\""<<el.PNum(2)-1<<"\" v2=\""<<el.PNum(3)-1<<"\" v3=\""<<el.PNum(4)-1<<"\"/>"<<endl; 
-      }
-      outfile << "      </cells>"<<endl; 
-    }
-    outfile << "   </mesh>"<<endl; 
-    outfile << "</dolfin>"<<endl; 
-
-    cout << "done writing dolfin export" << endl;
-  }
-}
diff --git a/contrib/Netgen/libsrc/interface/writeelmer.cpp b/contrib/Netgen/libsrc/interface/writeelmer.cpp
deleted file mode 100644
index f902cdeb23c1ee06e0f74ed92c4344d381eb1822..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writeelmer.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-
-//
-//  Write Elmer file
-//
-//
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-#include <sys/stat.h>
-
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-
-
-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;
-  char str[200];
-  
-  int inverttets = mparam.inverttets;
-  int invertsurf = mparam.inverttrigs;
-
-#ifdef WIN32
-  char a[256];
-  sprintf( a, "mkdir %s", filename.c_str() );
-  system( a );
-#else
-  int 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 << "2"     << "\n";
-  outfile_h << "303 " << nse << "\n";
-  outfile_h << "504 " << ne << "\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 85681aa0cf63d1ad1186864a8aefaf4f01aa5bb8..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;
-
-  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)(0)/scale << "  ";
-      outfile.width(10);
-      outfile << mesh.Point(i)(1)/scale << "  ";
-      outfile.width(10);
-      outfile << mesh.Point(i)(2)/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/writejcm.cpp b/contrib/Netgen/libsrc/interface/writejcm.cpp
deleted file mode 100644
index 00ef4f9f49a3dc36d74b38ee51250defb4804672..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writejcm.cpp
+++ /dev/null
@@ -1,430 +0,0 @@
-//
-//  Write JCMwave file
-//  07.07.2005, Sven Burger, ZIB Berlin
-//
-
-
-#include <mystdlib.h>
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <meshing.hpp>
-#include <sys/stat.h>
-
-namespace netgen
-{
-#include "writeuser.hpp"
-
-void WriteJCMFormat (const Mesh & mesh,
-                     const CSGeometry & geom,
-                     const string & filename)
-{
-  if (mesh.GetDimension() != 3)
-  {
-    cout <<"\n Error: Dimension 3 only supported by this output format!"<<endl;
-    return;
-  }
-
-  int bc_at_infinity = 0;
-  int i, j, jj, ct(0), counter;
-  double dx1, dx2, dx3, dy1, dy2, dy3, dz1, dz2, dz3, vol;
-
-  // number of points
-  int np = mesh.GetNP();
-
-  // Identic points
-  ARRAY<int,1> identmap1, identmap2, identmap3;
-  mesh.GetIdentifications().GetMap(1, identmap1);
-  mesh.GetIdentifications().GetMap(2, identmap2);
-  mesh.GetIdentifications().GetMap(3, identmap3);
-
-  // number of volume elements
-  int ne = mesh.GetNE();
-  int ntets = 0;
-  int nprisms = 0;
-  for (i = 1; i <= ne; i++)
-  {
-    Element el = mesh.VolumeElement(i);
-    if (el.GetNP() == 4)
-    {
-      ntets++;
-      // Check that no two points on a tetrahedron are identified with each other
-      for (j = 1; j <= 4; j++)
-        for (jj = 1; jj <=4; jj++)
-        {
-          if (identmap1.Elem(el.PNum(j)) == el.PNum(jj))
-          {
-            cout << "\n Error: two points on a tetrahedron identified (1) with each other"
-                 << "\n REFINE MESH !" << endl;
-            return;
-          }
-          if (identmap2.Elem(el.PNum(j)) == el.PNum(jj))
-          {
-            cout << "\n Error: two points on a tetrahedron identified (2) with each other"
-                 << "\n REFINE MESH !" << endl;
-            return;
-          }
-          if (identmap3.Elem(el.PNum(j)) == el.PNum(jj))
-          {
-            cout << "\n Error: two points on a tetrahedron identified (3) with each other"
-                 << "\n REFINE MESH !" << endl;
-            return;
-          }
-        }      
-      
-    }
-    else if (el.GetNP() == 6)
-      nprisms++;
-  }
-  if ( ne != (ntets+nprisms))
-  {
-    cout<< "\n Error in determining number of volume elements!\n"
-        << "\n Prisms and tetrahedra only implemented in the JCMwave format!\n"<<endl;
-    return;
-  }
-
-  if (nprisms > 0)
-    cout << " Please note: Boundaries at infinity have to carry the bc-attribute '-bc="
-         << bc_at_infinity <<"'."<<endl; 
-
-  // number of surface elements
-  int nse = mesh.GetNSE();
-  // number of boundary triangles
-  int nbtri = 0;
-  // number of boundary quadrilaterals
-  int nbquad = 0;
-  // array with 1 if point on any tetra, 0 else 
-  // this is needed in order to arrange the prism points in the right order
-  ARRAY<int,1> pointsOnTetras;
-  pointsOnTetras.SetSize (mesh.GetNP());
-  pointsOnTetras = 0;
-  for (i = 1; i <= ne; i++)
-  {
-    Element el = mesh.VolumeElement(i);
-    if (el.GetNP() == 4)
-    {
-      for (j = 1; j <= 4; j++)
-        pointsOnTetras.Set(el.PNum(j).GetInt(),1);     
-    }
-  }
-
-  // number of boundary triangles and boundary quadrilaterals
-  for (i = 1; i <= nse; i++)
-  {
-    Element2d el = mesh.SurfaceElement(i);
-    if (el.GetNP() == 3 &&
-        ( mesh.GetFaceDescriptor (el.GetIndex()).DomainIn()==0  ||
-          mesh.GetFaceDescriptor (el.GetIndex()).DomainOut()==0 ) )
-      nbtri++;
-    else if (el.GetNP() == 4 &&
-             ( mesh.GetFaceDescriptor (el.GetIndex()).DomainIn()==0 ||
-               mesh.GetFaceDescriptor (el.GetIndex()).DomainOut()==0 ) )
-      nbquad++;
-  }
-  
-  ofstream outfile (filename.c_str());
-  outfile.precision(6);
-  outfile.setf (ios::fixed, ios::floatfield);
-  outfile.setf (ios::showpoint);
-  
-  outfile << "/* <BLOBHead>\n";
-  outfile << "__BLOBTYPE__=Grid\n";
-  outfile << "__OWNER__=JCMwave\n";
-  outfile << "<I>SpaceDim=3\n";
-  outfile << "<I>ManifoldDim=3\n";
-  outfile << "<I>NRefinementSteps=0\n";
-  outfile << "<I>NPoints="<<np<<"\n";
-  outfile << "<I>NTetrahedra="<<ntets<<"\n";
-  outfile << "<I>NPrisms="<<nprisms<<"\n";
-  outfile << "<I>NBoundaryTriangles="<<nbtri<<"\n";
-  outfile << "<I>NBoundaryQuadrilaterals="<<nbquad<<"\n";
-  outfile << "*/\n";
-  outfile << "\n";
-  outfile << "# output from Netgen\n\n";
-  int nDomains=mesh.GetNDomains();
-  for (i=1; i<=nDomains; i++)
-  {
-    if (mesh.GetMaterial(i))
-      outfile << "#" << mesh.GetMaterial(i) 
-              << ": Material ID = " 
-              << i << "\n";
-  }
-
-  outfile << "# Points\n";
-  cout << " Please note: The unit of length in the .geo file is assumed to be 'microns'."<<endl; 
-  for (i = 1; i <= np; i++)
-  {
-    const Point<3> & p = mesh.Point(i);
-    outfile << i << "\n";
-    outfile << p(0) << "e-6\n";
-    outfile << p(1) << "e-6\n";
-    outfile << p(2) << "e-6\n\n";
-  }
-
-  outfile << "\n";
-  outfile << "# Tetrahedra\n";
-  counter = 0;
-  for (i = 1; i <= ne; i++)
-  {
-    Element el = mesh.VolumeElement(i);
-    if (el.GetNP() == 4)
-    {
-      counter++;
-      dx1 = mesh.Point(el.PNum(2))(0) - mesh.Point(el.PNum(1))(0);
-      dx2 = mesh.Point(el.PNum(3))(0) - mesh.Point(el.PNum(1))(0);
-      dx3 = mesh.Point(el.PNum(4))(0) - mesh.Point(el.PNum(1))(0);
-      dy1 = mesh.Point(el.PNum(2))(1) - mesh.Point(el.PNum(1))(1);
-      dy2 = mesh.Point(el.PNum(3))(1) - mesh.Point(el.PNum(1))(1);
-      dy3 = mesh.Point(el.PNum(4))(1) - mesh.Point(el.PNum(1))(1);
-      dz1 = mesh.Point(el.PNum(2))(2) - mesh.Point(el.PNum(1))(2);
-      dz2 = mesh.Point(el.PNum(3))(2) - mesh.Point(el.PNum(1))(2);
-      dz3 = mesh.Point(el.PNum(4))(2) - mesh.Point(el.PNum(1))(2);
-      vol = (dy1*dz2-dz1*dy2)*dx3 + (dz1*dx2-dx1*dz2)*dy3 + (dx1*dy2-dy1*dx2)*dz3;
-
-      if ( vol > 0 )
-        for (j = 1; j <= 4; j++)
-          outfile << el.PNum(j)<<"\n";
-      else
-      {
-        for (j = 2; j >= 1; j--)
-          outfile << el.PNum(j)<<"\n";
-        for (j = 3; j <= 4; j++)
-          outfile << el.PNum(j)<<"\n";
-      }  
-      outfile << el.GetIndex() << "\n\n";
-    }
-  }
-  if ( counter != ntets)
-  {
-    cout<< "\n Error in determining number of tetras!\n"<<endl;
-    return;
-  }
-
-  outfile << "\n";
-  outfile << "# Prisms\n";
-  counter = 0;
-  for (i = 1; i <= ne; i++)
-  {
-    Element el = mesh.VolumeElement(i);
-    if (el.GetNP() == 6)
-    {
-      counter++;
-      dx1 = mesh.Point(el.PNum(2))(0) - mesh.Point(el.PNum(1))(0);
-      dx2 = mesh.Point(el.PNum(3))(0) - mesh.Point(el.PNum(1))(0);
-      dx3 = mesh.Point(el.PNum(4))(0) - mesh.Point(el.PNum(1))(0);
-      dy1 = mesh.Point(el.PNum(2))(1) - mesh.Point(el.PNum(1))(1);
-      dy2 = mesh.Point(el.PNum(3))(1) - mesh.Point(el.PNum(1))(1);
-      dy3 = mesh.Point(el.PNum(4))(1) - mesh.Point(el.PNum(1))(1);
-      dz1 = mesh.Point(el.PNum(2))(2) - mesh.Point(el.PNum(1))(2);
-      dz2 = mesh.Point(el.PNum(3))(2) - mesh.Point(el.PNum(1))(2);
-      dz3 = mesh.Point(el.PNum(4))(2) - mesh.Point(el.PNum(1))(2);
-      vol = (dy1*dz2-dz1*dy2)*dx3 + (dz1*dx2-dx1*dz2)*dy3 + (dx1*dy2-dy1*dx2)*dz3;
-
-      if (pointsOnTetras.Get(el.PNum(1)) &&
-          pointsOnTetras.Get(el.PNum(2)) &&
-          pointsOnTetras.Get(el.PNum(3)))
-      {
-        if (vol > 0)
-          for (j = 1; j <= 6; j++)
-            outfile << el.PNum(j)<<"\n";
-        else
-        {
-          for (j = 3; j >= 1; j--)
-            outfile << el.PNum(j)<<"\n";
-          for (j = 6; j >= 4; j--)
-            outfile << el.PNum(j)<<"\n";
-        }
-      }
-      else if ( pointsOnTetras.Get(el.PNum(4)) &&
-                pointsOnTetras.Get(el.PNum(5)) &&
-                pointsOnTetras.Get(el.PNum(6))    )
-      {
-        if ( vol < 0 )
-        {
-          for (j = 4; j <= 6; j++)
-            outfile << el.PNum(j)<<"\n";
-          for (j = 1; j <= 3; j++)
-            outfile << el.PNum(j)<<"\n";
-        }
-        else
-        {
-          for (j = 6; j >= 4; j--)
-            outfile << el.PNum(j)<<"\n";
-          for (j = 3; j >= 1; j--)
-            outfile << el.PNum(j)<<"\n";
-        }
-      }
-      else 
-      {
-        cout << "\n Error in determining prism point numbering!\n"<<endl;
-        return;
-      }
-      outfile << el.GetIndex() << "\n\n";
-    }
-  }
-  if ( counter != nprisms)
-  {
-    cout<< "\n Error in determining number of prisms!\n"<<endl;
-    return;
-  }
-
-  int npid1 = 0;
-  int npid2 = 0;
-  int npid3 = 0;
-  for (i=1; i<=np; i++)
-  {
-    if (identmap1.Elem(i))
-      npid1++;
-    if (identmap2.Elem(i))
-      npid2++;
-    if (identmap3.Elem(i))
-      npid3++;
-  }
-
-  outfile << "\n";
-  outfile << "# Boundary triangles\n";  
-  outfile << "# Number of identified points in 1-direction: " << npid1 << "\n";
-  outfile << "# Number of identified points in 2-direction: " << npid2 << "\n";
-  outfile << "# Number of identified points in 3-direction: " << npid3 << "\n";
-  for (i = 1; i <= nse; i++)
-  {
-    Element2d el = mesh.SurfaceElement(i);
-    if (el.GetNP() == 3
-        && (mesh.GetFaceDescriptor (el.GetIndex()).DomainIn()==0
-            || mesh.GetFaceDescriptor (el.GetIndex()).DomainOut()==0))
-    {
-      outfile <<"# T\n";
-      for (j = 1; j <= 3; j++)
-        outfile << el.PNum(j)<<"\n";
-      if (mesh.GetFaceDescriptor (el.GetIndex()).BCProperty()==bc_at_infinity)
-        outfile << 1000 << "\n";      
-      else
-        outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << "\n";      
-      if (mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() == bc_at_infinity)
-        outfile << "-2\n\n";
-      else if (identmap1.Elem(el.PNum(1))
-               &&identmap1.Elem(el.PNum(2))
-               &&identmap1.Elem(el.PNum(3)))
-      {
-        outfile << "-1\n";
-        for (j = 1; j <= 3; j++)
-          outfile << identmap1.Elem(el.PNum(j))<<"\n";
-        outfile << "\n";
-      }
-      else if (identmap2.Elem(el.PNum(1))
-               &&identmap2.Elem(el.PNum(2))
-               &&identmap2.Elem(el.PNum(3)))
-      {
-        outfile << "-1\n";
-        for (j = 1; j <= 3; j++)
-          outfile << identmap2.Elem(el.PNum(j))<<"\n";
-        outfile << "\n";
-      }
-      else if (identmap3.Elem(el.PNum(1))
-               &&identmap3.Elem(el.PNum(2))
-               &&identmap3.Elem(el.PNum(3)))
-      {
-        outfile << "-1\n";
-        for (j = 1; j <= 3; j++)
-          outfile << identmap3.Elem(el.PNum(j))<<"\n";
-        outfile << "\n";
-      }
-      else
-        outfile << "1\n\n";
-        
-    }
-  }
-
-  outfile << "\n";
-  outfile << "# Boundary quadrilaterals\n";
-  for (i = 1; i <= nse; i++)
-  {
-    Element2d el = mesh.SurfaceElement(i);
-
-    if (el.GetNP() == 4
-        && (mesh.GetFaceDescriptor (el.GetIndex()).DomainIn()==0
-            || mesh.GetFaceDescriptor (el.GetIndex()).DomainOut()==0))
-    {
-      if      (pointsOnTetras.Get(el.PNum(1)) &&
-               pointsOnTetras.Get(el.PNum(2)))
-        ct = 0;
-      else if (pointsOnTetras.Get(el.PNum(2)) &&
-               pointsOnTetras.Get(el.PNum(3)))
-        ct = 1;
-      else if (pointsOnTetras.Get(el.PNum(3)) &&
-               pointsOnTetras.Get(el.PNum(4)))
-        ct = 2;
-      else if (pointsOnTetras.Get(el.PNum(4)) &&
-               pointsOnTetras.Get(el.PNum(1)))
-        ct = 3;
-      else
-        cout << "\nWarning: Quadrilateral with inconsistent points found!"<<endl;
-      
-      for (j = 1; j <= 4; j++)
-      {
-        jj = j + ct;
-        if ( jj >= 5 )
-          jj = jj - 4;
-        outfile << el.PNum(jj)<<"\n";
-      }
-      outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << "\n";      
-      if (mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() == bc_at_infinity)
-      {
-        outfile << "-2\n\n";
-        cout << "\nWarning: Quadrilateral at infinity found (this should not occur)!"<<endl;
-      }
-      else if ( identmap1.Elem(el.PNum(1)) &&
-                identmap1.Elem(el.PNum(2)) &&
-                identmap1.Elem(el.PNum(3)) &&
-                identmap1.Elem(el.PNum(4))    )
-      {
-        outfile << "-1\n";
-        for (j = 1; j <= 4; j++)
-        {
-          jj = j + ct;
-          if ( jj >= 5 )
-            jj = jj - 4;
-          outfile << identmap1.Elem(el.PNum(jj))<<"\n";
-        }
-        outfile << "\n";
-      }
-      else if ( identmap2.Elem(el.PNum(1)) &&
-                identmap2.Elem(el.PNum(2)) &&
-                identmap2.Elem(el.PNum(3)) &&
-                identmap2.Elem(el.PNum(4))    )
-      {
-        outfile << "-1\n";
-        for (j = 1; j <= 4; j++)
-        {
-          jj = j + ct;
-          if ( jj >= 5 )
-            jj = jj - 4;
-          outfile << identmap2.Elem(el.PNum(jj))<<"\n";
-        }
-        outfile << "\n";
-      }
-      else if ( identmap3.Elem(el.PNum(1)) &&
-                identmap3.Elem(el.PNum(2)) &&
-                identmap3.Elem(el.PNum(3)) &&
-                identmap3.Elem(el.PNum(4))    )
-      {
-        outfile << "-1\n";
-        for (j = 1; j <= 4; j++)
-        {
-          jj = j + ct;
-          if ( jj >= 5 )
-            jj = jj - 4;
-          outfile << identmap3.Elem(el.PNum(jj))<<"\n";
-        }
-        outfile << "\n";
-      }
-      else
-        outfile << "1\n\n";
-    }
-  }
-
-  cout << " JCMwave grid file written." << endl;
-}
-
-}
-
diff --git a/contrib/Netgen/libsrc/interface/writepermas.cpp b/contrib/Netgen/libsrc/interface/writepermas.cpp
deleted file mode 100644
index fc46e87cd9c9e225d4cb2a961d4e27e570ac9ccb..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(0);
-                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)(0) << " ";
-            outfile << mesh.Point(i)(1) << " ";
-            outfile << mesh.Point(i)(2) << "\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/writetecplot.cpp b/contrib/Netgen/libsrc/interface/writetecplot.cpp
deleted file mode 100644
index 6f6063747a28c416034ab21a92596108670789fa..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 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)(0) << " " /* Knoten Koordinaten */
-		    << mesh.Point(i)(1) << " "
-		    << mesh.Point(i)(2) << " "
-		    << 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 (k = 1; k <= nse; k++)
-		{
-		  const Element2d & sel = mesh.SurfaceElement(k);
-		  INDEX_3 i3;
-		  for (j = 1; j <= 3; j++)
-		    i3.I(j) = sel.PNum(j);
-		  i3.Sort();
-		  
-		  //int elind = face2volelement.Get(i3);
-		}
-	}
-    }
-}
-
-
-}
diff --git a/contrib/Netgen/libsrc/interface/writetet.cpp b/contrib/Netgen/libsrc/interface/writetet.cpp
deleted file mode 100644
index 581cc0a3feb5220e3356ca12a932fe5212a3b815..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writetet.cpp
+++ /dev/null
@@ -1,1096 +0,0 @@
-
-#include <mystdlib.h>
-
-#include <myadt.hpp>
-#include <linalg.hpp>
-#include <csg.hpp>
-#include <acisgeom.hpp>
-#include <meshing.hpp>
-
-namespace netgen
-{
-
-#include "writeuser.hpp"
-  
-  
-  void WriteTETFormat (const Mesh & mesh,
-		       const string & filename)//, const string& problemType )
-  {
-    string problemType = "";
-    if(!mesh.PureTetMesh())
-      throw NgException("Can only export pure tet mesh in this format");
-
-    cout << "starting .tet export to file " << filename << endl;
-
-
-    ARRAY<int> point_ids,edge_ids,face_ids;
-    ARRAY<int> elnum(mesh.GetNE());
-    elnum = -1;
-
-    
-    ARRAY<int> userdata_int;
-    ARRAY<double> userdata_double;
-    ARRAY<int> ports;
-
-    ARRAY<int> uid_to_group_3D, uid_to_group_2D, uid_to_group_1D, uid_to_group_0D;
-
-    int pos_int = 0;
-    int pos_double = 0;
-    
-    bool haveuserdata = 
-      (mesh.GetUserData("TETmesh:double",userdata_double) &&
-       mesh.GetUserData("TETmesh:int",userdata_int) && 
-       mesh.GetUserData("TETmesh:ports",ports) &&
-       mesh.GetUserData("TETmesh:point_id",point_ids,PointIndex::BASE) &&
-       mesh.GetUserData("TETmesh:uid_to_group_3D",uid_to_group_3D) &&
-       mesh.GetUserData("TETmesh:uid_to_group_2D",uid_to_group_2D) &&
-       mesh.GetUserData("TETmesh:uid_to_group_1D",uid_to_group_1D) &&
-       mesh.GetUserData("TETmesh:uid_to_group_0D",uid_to_group_0D));
-
-
-    int version,subversion;
-
-    if(haveuserdata)
-      {
-	version = int(userdata_double[0]);
-	subversion = int(10*(userdata_double[0] - version));
-	pos_double++;
-      }
-    else
-      {
-	version = 2;
-	subversion = 0;
-      }
-
-    
-    if(version >= 2)
-      {
-	// test if ids are disjunct, if not version 2.0 not possible
-	int maxbc(-1),mindomain(-1);
-	
-	for(ElementIndex i=0; i<mesh.GetNE(); i++)
-	  if(i==0 || mesh[i].GetIndex() < mindomain)
-	    mindomain = mesh[i].GetIndex();
-	for(int i=1; i<=mesh.GetNFD(); i++)
-	  if(i==1 || mesh.GetFaceDescriptor(i).BCProperty() > maxbc)
-	    maxbc = mesh.GetFaceDescriptor(i).BCProperty();
-	
-	if(maxbc >= mindomain)
-	  {
-	    cout << "WARNING: writing version " << version << "." << subversion << " tetfile not possible, ";
-	    version = 1; subversion = 1;
-	    cout << "using version " << version << "." << subversion << endl;
-	  }
-      }
-
-
-
-    int startsize = point_ids.Size();
-    point_ids.SetSize(mesh.GetNP()+1);
-    for(int i=startsize; i<point_ids.Size(); i++)
-      point_ids[i] = -1;
-
-
-    for(int i=0; i<PointIndex::BASE; i++)
-      point_ids[i] = -1;
-
-
-    INDEX_2_CLOSED_HASHTABLE<int> edgenumbers(6*mesh.GetNE()+3*mesh.GetNSE());;
-    INDEX_3_CLOSED_HASHTABLE<int> facenumbers(4*mesh.GetNE()+mesh.GetNSE());
-
-    ARRAY<INDEX_2> edge2node;
-    ARRAY<INDEX_3> face2edge;
-    ARRAY<INDEX_4> element2face;
-
-    int numelems(0),numfaces(0),numedges(0),numnodes(0);
-
-    for(SegmentIndex si = 0; si < mesh.GetNSeg(); si++)
-      {
-	const Segment & seg = mesh[si];
-	INDEX_2 i2(seg.p1,seg.p2);
-	i2.Sort();
-	if(edgenumbers.Used(i2))
-	  continue;
-
-	numedges++;
-	edgenumbers.Set(i2,numedges);
-	edge2node.Append(i2);
-
-	edge_ids.Append(seg.edgenr);
-
-	if(point_ids[seg.p1] == -1)
-	  point_ids[seg.p1] = (version >= 2) ? seg.edgenr : 0;
-	if(point_ids[seg.p2] == -1)
-	  point_ids[seg.p2] = (version >= 2) ? seg.edgenr : 0;
-      }
-
-    for(SurfaceElementIndex si = 0; si < mesh.GetNSE(); si++)
-      {
-	if(mesh[si].IsDeleted())
-	  continue;
-
-	const Element2d & elem = mesh[si];
-
-	numfaces++;
-	INDEX_3 i3(elem[0], elem[1], elem[2]);
-
-	int min = i3[0];
-	int minpos = 0;
-	for(int j=1; j<3; j++)
-	  if(i3[j] < min)
-	    {
-	      min = i3[j]; minpos = j;
-	    }
-	if(minpos == 1)
-	  {
-	    int aux = i3[0]; i3[0] = i3[1]; i3[1] = i3[2]; i3[2] = aux;
-	  }
-	else if(minpos == 2)
-	  {
-	    int aux = i3[0]; i3[0] = i3[2]; i3[2] = i3[1]; i3[1] = aux;
-	  }
-	facenumbers.Set(i3,numfaces);
-
-	int bc = mesh.GetFaceDescriptor(elem.GetIndex()).BCProperty();
-	face_ids.Append(bc);
-
-	for(int j=0; j<3; j++)
-	  if(point_ids[elem[j]] == -1)
-	    point_ids[elem[j]] = (version >= 2) ? bc : 0;
-
-	INDEX_2 i2a,i2b;
-	INDEX_3 f_to_n;
-	for(int j=0; j<3; j++)
-	  {
-	    i2a = INDEX_2(i3[j],i3[(j+1)%3]);
-	    i2b[0] = i2a[1]; i2b[1] = i2a[0];
-	    if(edgenumbers.Used(i2a))
-	      f_to_n[j] = edgenumbers.Get(i2a);
-	    else if(edgenumbers.Used(i2b))
-	      f_to_n[j] = -edgenumbers.Get(i2b);
-	    else
-	      {
-		numedges++;
-		edgenumbers.Set(i2a,numedges);
-		edge2node.Append(i2a);
-		f_to_n[j] = numedges;
-		if(version >= 2)
-		  edge_ids.Append(bc);
-		else
-		  edge_ids.Append(0);
-	      }
-	  }
-	face2edge.Append(f_to_n);
-      }
-    
-    for(ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-      {
-	const Element & el = mesh[ei];
-
-	if(el.IsDeleted())
-	  continue;
-
-	numelems++;
-	elnum[ei] = numelems;
-
-	static int tetfaces[4][3] =
-	  { { 0, 2, 1 },
-	    { 0, 1, 3 },
-	    { 1, 2, 3 },
-	    { 2, 0, 3 } };
-	
-	for(int j=0; j<4; j++)
-	  if(point_ids[el[j]] == -1)
-	    point_ids[el[j]] = (version >= 2) ? el.GetIndex() : 0;
-
-	INDEX_4 e_to_f;
-
-	for(int i = 0; i < 4; i++)
-	  {
-	    INDEX_3 i3a(el[tetfaces[i][0]],el[tetfaces[i][1]],el[tetfaces[i][2]]);
-	    
-	    int min = i3a[0];
-	    int minpos = 0;
-	    for(int j=1; j<3; j++)
-	      if(i3a[j] < min)
-		{
-		  min = i3a[j]; minpos = j;
-		}
-	    if(minpos == 1)
-	      {
-		int aux = i3a[0]; i3a[0] = i3a[1]; i3a[1] = i3a[2]; i3a[2] = aux;
-	      }
-	    else if(minpos == 2)
-	      {
-		int aux = i3a[0]; i3a[0] = i3a[2]; i3a[2] = i3a[1]; i3a[1] = aux;
-	      }
-	    INDEX_3 i3b(i3a[0],i3a[2],i3a[1]);
-	    
-
-	    if(facenumbers.Used(i3a))
-	      e_to_f[i] = facenumbers.Get(i3a);
-	    else if(facenumbers.Used(i3b))
-	      e_to_f[i] = -facenumbers.Get(i3b);
-	    else
-	      {
-		numfaces++;
-		facenumbers.Set(i3a,numfaces);
-		e_to_f[i] = numfaces;
-		if(version >= 2)
-		  face_ids.Append(el.GetIndex());
-		else
-		  face_ids.Append(0);
-
-		INDEX_2 i2a,i2b;
-		INDEX_3 f_to_n;
-		for(int j=0; j<3; j++)
-		  {
-		    i2a = INDEX_2(i3a[j],i3a[(j+1)%3]);
-		    i2b[0] = i2a[1]; i2b[1] = i2a[0];
-		    if(edgenumbers.Used(i2a))
-		      f_to_n[j] = edgenumbers.Get(i2a);
-		    else if(edgenumbers.Used(i2b))
-		      f_to_n[j] = -edgenumbers.Get(i2b);
-		    else
-		      {
-			numedges++;
-			edgenumbers.Set(i2a,numedges);
-			edge2node.Append(i2a);
-			f_to_n[j] = numedges;
-			if(version >= 2)
-			  edge_ids.Append(el.GetIndex());
-			else
-			  edge_ids.Append(0);
-		      }
-		  }
-		face2edge.Append(f_to_n);	  
-	      }
-	  }
-	element2face.Append(e_to_f);
-      }
-
-
-
-
-    ofstream outfile(filename.c_str());
-
-    outfile.precision(16);
-
-    int unitcode;
-    double tolerance;
-    double dS1,dS2, alphaDeg;
-    double x3D,y3D,z3D;
-    int modelverts(0), modeledges(0), modelfaces(0), modelcells(0);
-
-    int numObj0D,numObj1D,numObj2D,numObj3D;
-    int numports = ports.Size();
-
-    ARRAY<int> nodenum(point_ids.Size()+1);
-
-    nodenum = -1;
-	    
-
-
-    numnodes = 0;
-    for(int i=0; i<point_ids.Size(); i++)
-      {
-	if(point_ids[i] != -1)
-	  {
-	    numnodes++;
-	    nodenum[i] = numnodes;
-	  }
-      }
-
-
-    if(haveuserdata)
-      {
-	unitcode = userdata_int[pos_int];
-	pos_int++;
-
-	tolerance = userdata_double[pos_double];
-	pos_double++;
-
-	dS1 = userdata_double[pos_double];
-	pos_double++;
-	dS2 = userdata_double[pos_double];
-	pos_double++;
-	alphaDeg = userdata_double[pos_double];
-	pos_double++;
-
-	x3D = userdata_double[pos_double];
-	pos_double++;
-	y3D = userdata_double[pos_double];
-	pos_double++;
-	z3D = userdata_double[pos_double];
-	pos_double++;
-
-	if(version == 2)
-	  {
-	    modelverts = userdata_int[pos_int];
-	    pos_int++;
-	    modeledges = userdata_int[pos_int];
-	    pos_int++;
-	    modelfaces = userdata_int[pos_int];
-	    pos_int++;
-	    modelcells = userdata_int[pos_int];
-	    pos_int++;
-	  }
-
-	numObj3D = userdata_int[pos_int];
-	pos_int++;
-	numObj2D = userdata_int[pos_int];
-	pos_int++;
-	numObj1D = userdata_int[pos_int];
-	pos_int++;
-	numObj0D = userdata_int[pos_int];
-	pos_int++;
-      }
-    else
-      {
-	unitcode = 3;
-
-	tolerance = 1e-5;
-
-	dS1 = dS2 = alphaDeg = 0;
-
-	x3D = y3D = z3D = 0;
-
-	modelverts = modeledges = modelfaces = modelcells = 0;
-	
-	numObj3D = numObj2D = numObj1D = numObj0D = 0;
-      }
-
-    string uidpid;
-    if(version == 1)
-      uidpid = "PID";
-    else if (version == 2)
-      uidpid = "UID";
-    
-
-    ARRAY< ARRAY<int,PointIndex::BASE>* > idmaps;
-    for(int i=1; i<=mesh.GetIdentifications().GetMaxNr(); i++)
-      {
-	if(mesh.GetIdentifications().GetType(i) == Identifications::PERIODIC)
-	  {
-	    idmaps.Append(new ARRAY<int,PointIndex::BASE>);
-	    mesh.GetIdentifications().GetMap(i,*idmaps.Last(),true);
-	  }
-      }
-
-    ARRAY<int> id_num,id_type;
-    ARRAY< ARRAY<int> *> id_groups;
-
-
-	// sst 2008-03-12: Write problem class...
-	{
-		std::string block;
-		block  = "// CST Tetrahedral ";
-		block += !problemType.empty() ? problemType : "High Frequency";
-		block += " Mesh, Version no.:\n";
-		
-		size_t size = block.size()-3;
-		block += "// ";
-		block.append( size, '^' );
-		block += "\n";
-
-		outfile
-			<< block
-			<< version << "." << subversion << "\n\n";
-	}
-
-	outfile 
-	    << "// User Units Code (1=CM 2=MM 3=M 4=MIC 5=NM 6=FT 7=IN 8=MIL):\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-	    << unitcode << "\n\n"					\
-	    << "// Geometric coord \"zero\" tolerance threshold:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-	    << tolerance << "\n\n"				  \
-	    << "// Periodic UnitCell dS1 , dS2 , alphaDeg:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-	    << dS1 << " " << dS2 << " " << alphaDeg <<"\n\n"	\
-	    << "// Periodic UnitCell origin in global coords (x3D,y3D,z3D):\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-	    << x3D << " " << y3D << " " << z3D << "\n" << endl;
-
-    if(version == 2)
-      {
-	outfile << "// Model entity count: Vertices, Edges, Faces, Cells:\n" \
-		<< "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-		<< modelverts << " " << modeledges << " " << modelfaces << " " << modelcells << endl << endl;
-      }
-
-
-    outfile << "// Topological mesh-entity counts (#elements,#faces,#edges,#nodes):\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    outfile << numelems << " " 
-	    << numfaces << " "
-	    << numedges << " " 
-	    << numnodes << endl << endl;
-
-    outfile << "// NodeID, X, Y, Z, Type (0=Reg 1=PMaster 2=PSlave 3=CPMaster 4=CPSlave), "<< uidpid <<":\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-       
-
-
-    id_num.SetSize(mesh.GetNP()+1);
-    id_type.SetSize(mesh.GetNP()+1);
-    id_num = 0;
-    id_type = 0;
-
-    int n2,n4,n8;
-    n2 = n4 = n8 = 0;
-
- 
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      {
-	if(id_num[i] != 0)
-	  continue;
-
-	if(nodenum[i] == -1)
-	  continue;
-
-	ARRAY<int> group;
-	group.Append(i);
-	for(int j=0; j<idmaps.Size(); j++)
-	  {
-	    startsize = group.Size();
-	    for(int k=0; k<startsize; k++)
-	      {
-		int id = (*idmaps[j])[group[k]];
-		if(id != 0 && !group.Contains(id) && nodenum[id] != -1)
-		  {
-		    group.Append(id);
-		    id_num[id] = j+1+id_num[group[k]];
-		  }
-	      }
-	  }
-	if(group.Size() > 1)
-	  {
-	    id_groups.Append(new ARRAY<int>(group));
-	    if(group.Size() == 2)
-	      {
-		id_type[i] = 1;
-		id_type[group[1]] = 2;
-		n2++;
-	      }
-	    else if(group.Size() == 4)
-	      {
-		id_type[i] = 3;
-		for(int j=1; j<group.Size(); j++)
-		  id_type[group[j]] = 4;
-		n4++;
-	      }
-	    else if(group.Size() == 8)
-	      {
-		id_type[i] = 5;
-		for(int j=1; j<group.Size(); j++)
-		  id_type[group[j]] = 6;
-		n8++;
-	      }
-	    else
-	      cerr << "ERROR: Identification group size = " << group.Size() << endl;
-	  }
-	
-      }
-
-
-    for(PointIndex i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      {
-	if(nodenum[i] == -1)
-	  continue;
-	outfile << nodenum[i] << " "
-		<< mesh[i](0) << " "
-		<< mesh[i](1) << " "
-		<< mesh[i](2) << " " << id_type[i] << " ";
-	if(i-PointIndex::BASE < point_ids.Size())
-	  outfile << point_ids[i];
-	else
-	  outfile << "0";
-	outfile << "\n";
-      }
-    outfile << endl;
-
-    outfile << "\n// Number of Periodic Master Nodes:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-	    << n2 << "\n"			       \
-	    << "\n" \
-	    << "// MasterNodeID, SlaveNodeID, TranslCode (1=dS1 2=dS2 3=dS1+dS2):\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<id_groups.Size(); i++)
-      {
-	if(id_groups[i]->Size() != 2)
-	  continue;
-
-	for(int j=0; j<id_groups[i]->Size(); j++)
-	  outfile << nodenum[(*id_groups[i])[j]] << " ";
-	for(int j=1; j<id_groups[i]->Size(); j++)
-	  outfile << id_num[(*id_groups[i])[j]] << " ";
-	outfile << "\n";
-
-	delete id_groups[i];
-	id_groups[i] = NULL;
-      }
-    outfile << endl;
-	
-	
-    outfile << "// Number of Corner Periodic Master Nodes:\n"	      \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-	    << n4 << "\n"				      \
-	    << "\n" \
-	    << "// MasterNodeID, 3-SlaveNodeID's, 3-TranslCodes (1=dS1 2=dS2 3=dS1+dS2):\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-
-
-    for(int i=0; i<id_groups.Size(); i++)
-      {
-	if(!id_groups[i] || id_groups[i]->Size() != 4)
-	  continue;
-
-	for(int j=0; j<id_groups[i]->Size(); j++)
-	  outfile << nodenum[(*id_groups[i])[j]] << " ";
-	for(int j=1; j<id_groups[i]->Size(); j++)
-	  {
-	    outfile << id_num[(*id_groups[i])[j]] << " ";
-	  }
-	outfile << "\n";
-
-	delete id_groups[i];
-	id_groups[i] = NULL;
-      }
-    outfile << endl;
-
-
-    outfile << "// Number of Cubic Periodic Master Nodes:\n"	     \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-	    << n8 << "\n"				     \
-	    << "\n" \
-	    << "// MasterNodeID, 7-SlaveNodeID's, TranslCodes:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<id_groups.Size(); i++)
-      {
-	if(!id_groups[i] || id_groups[i]->Size() != 8)
-	  continue;
-
-	for(int j=0; j<id_groups[i]->Size(); j++)
-	  outfile << nodenum[(*id_groups[i])[j]] << " ";
-	for(int j=1; j<id_groups[i]->Size(); j++)
-	  outfile << id_num[(*id_groups[i])[j]] << " ";
-	outfile << "\n";
-
-	delete id_groups[i];
-	id_groups[i] = NULL;
-      }
-    outfile << endl;
-
-    
-
-
-    outfile << "// EdgeID, NodeID0, NodeID1, Type (0=Reg 1=PMaster 2=PSlave 3=CPMaster 4=CPSlave), "<<uidpid<<":\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-
-    
-      
-    ARRAY< ARRAY<int>* > vertex_to_edge(mesh.GetNP()+1);
-    for(int i=0; i<=mesh.GetNP(); i++)
-      vertex_to_edge[i] = new ARRAY<int>;
-
-    ARRAY< ARRAY<int,PointIndex::BASE>* > idmaps_edge(idmaps.Size());
-    for(int i=0; i<idmaps_edge.Size(); i++)
-      {
-	idmaps_edge[i] = new ARRAY<int,PointIndex::BASE>(numedges);
-	(*idmaps_edge[i]) = 0;
-      }
-
-    ARRAY<int> possible;
-    for(int i=0; i<edge2node.Size(); i++)
-      {
-	const INDEX_2 & v = edge2node[i];
-	for(int j=0; j<idmaps.Size(); j++)
-	  {
-	    INDEX_2 vid((*idmaps[j])[v[0]], (*idmaps[j])[v[1]]);
-	    if(vid[0] != 0 && vid[0] != v[0] && vid[1] != 0 && vid[1] != v[1])
-	      {
-		Intersection(*vertex_to_edge[vid[0]],*vertex_to_edge[vid[1]],possible);
-		if(possible.Size() == 1)
-		  {
-		    (*idmaps_edge[j])[possible[0]] = i+1;
-		    (*idmaps_edge[j])[i+1] = possible[0];
-		  }
-		else if(possible.Size() > 0)
-		  {
-		    cerr << "ERROR: too many possible edge identifications" << endl;
-		    (*testout) << "ERROR: too many possible edge identifications" << endl
-			       << "*vertex_to_edge["<<vid[0]<<"] " << *vertex_to_edge[vid[0]] << endl
-			       << "*vertex_to_edge["<<vid[1]<<"] " << *vertex_to_edge[vid[1]] << endl
-			       << "possible " << possible << endl;
-		  }
-	      }
-	  }
-	vertex_to_edge[v[0]]->Append(i+1);
-	vertex_to_edge[v[1]]->Append(i+1);
-      }
-
-
-    for(int i=0; i<vertex_to_edge.Size(); i++)
-      delete vertex_to_edge[i];
-
-
-    id_groups.SetSize(0);
-    id_num.SetSize(numedges+1);
-    id_num = 0;
-    id_type.SetSize(numedges+1);
-    id_type = 0;
-
-    n2 = n4 = n8 = 0;
-
-    for(int i=1; i<=edge2node.Size(); i++)
-      {
-	if(id_num[i] != 0)
-	  continue;
-
-
-	ARRAY<int> group;
-	group.Append(i);
-	for(int j=0; j<idmaps_edge.Size(); j++)
-	  {
-	    startsize = group.Size();
-	    for(int k=0; k<startsize; k++)
-	      {
-		int id = (*idmaps_edge[j])[group[k]];
-		if(id != 0 && !group.Contains(id))
-		  {
-		    group.Append(id);
-		    id_num[id] = j+1+id_num[group[k]];
-		  }
-	      }
-	  }
-	if(group.Size() > 1)
-	  {
-	    id_num[i] = 1;
-	    id_groups.Append(new ARRAY<int>(group));
-	    if(group.Size() == 2)
-	      {
-		id_type[i] = 1;
-		id_type[group[1]] = 2;
-		n2++;
-	      }
-	    else if(group.Size() == 4)
-	      {
-		id_type[i] = 3;
-		for(int j=1; j<group.Size(); j++)
-		  id_type[group[j]] = 4;
-		n4++;
-	      }
-	    else
-	      {
-		cerr << "ERROR: edge identification group size = " << group.Size() << endl;
-		(*testout) << "edge group " << group << endl;
-		for(int j=0; j<idmaps_edge.Size(); j++)
-		  {
-		    (*testout) << "edge id map " << j << endl << *idmaps_edge[j] << endl;
-		  }
-	      }
-	  }
-      }
-
-
-
-    for(int i=1; i<=edge2node.Size(); i++)
-      {
-	if(id_num[i] != 0)
-	  continue;
-
-
-	ARRAY<int> group;
-	group.Append(i);
-	for(int j=0; j<idmaps_edge.Size(); j++)
-	  {
-	    startsize = group.Size();
-	    for(int k=0; k<startsize; k++)
-	      {
-		int id = (*idmaps_edge[j])[group[k]];
-		if(id != 0 && !group.Contains(id))
-		  {
-		    group.Append(id);
-		    id_num[id] = j+1+id_num[group[k]];
-		  }
-	      }
-	  }
-	if(group.Size() > 1)
-	  {
-	    id_num[i] = 1;
-	    id_groups.Append(new ARRAY<int>(group));
-	    if(group.Size() == 2)
-	      {
-		id_type[i] = 1;
-		id_type[group[1]] = 2;
-		n2++;
-	      }
-	    else if(group.Size() == 4)
-	      {
-		id_type[i] = 3;
-		for(int j=1; j<group.Size(); j++)
-		  id_type[group[j]] = 4;
-		n4++;
-	      }
-	    else
-	      {
-		cerr << "ERROR: edge identification group size = " << group.Size() << endl;
-		(*testout) << "edge group " << group << endl;
-		for(int j=0; j<idmaps_edge.Size(); j++)
-		  {
-		    (*testout) << "edge id map " << j << endl << *idmaps_edge[j] << endl;
-		  }
-	      }
-	  }
-	
-      }
-
-    
-    for(int i=0; i<edge2node.Size(); i++)
-      outfile << i+1 << " " << nodenum[edge2node[i][0]] << " " << nodenum[edge2node[i][1]] 
-	      << " " << id_type[i+1] << " " << edge_ids[i] << "\n";
-
-    outfile << endl;
-
-    
-
-    outfile << "// Number of Periodic Master Edges:\n"\
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"\
-	    << n2 << "\n"			      \
-	    << "\n"\
-	    << "// MasterEdgeID, SlaveEdgeID, TranslCode (1=dS1 2=dS2 3=dS1+dS2):\n"\
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<id_groups.Size(); i++)
-      {
-	if(id_groups[i]->Size() != 2)
-	  continue;
-
-	for(int j=0; j<id_groups[i]->Size(); j++)
-	  outfile << (*id_groups[i])[j] << " ";
-	for(int j=1; j<id_groups[i]->Size(); j++)
-	  outfile << id_num[(*id_groups[i])[j]] << " ";
-	outfile << "\n";
-
-	delete id_groups[i];
-	id_groups[i] = NULL;
-      }
-    outfile << endl;
-
-    outfile << "// Number of Corner Periodic Master Edges:\n"		\
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"\
-	    << n4 << "\n"				     \
-	    << "\n"\
-	    << "// MasterEdgeID, 3 SlaveEdgeID's, 3 TranslCode (1=dS1 2=dS2 3=dS1+dS2):\n"\
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<id_groups.Size(); i++)
-      {
-	if(!id_groups[i] || id_groups[i]->Size() != 4)
-	  continue;
-
-	for(int j=0; j<id_groups[i]->Size(); j++)
-	  outfile << (*id_groups[i])[j] << " ";
-	for(int j=1; j<id_groups[i]->Size(); j++)
-	  outfile << id_num[(*id_groups[i])[j]] << " ";
-	outfile << "\n";
-
-	delete id_groups[i];
-	id_groups[i] = NULL;
-      }
-    outfile << endl;
-
-
-    outfile << "// FaceID, EdgeID0, EdgeID1, EdgeID2, FaceType (0=Reg 1=PMaster 2=PSlave), "<<uidpid<<":\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-
-    
-    
-    ARRAY< ARRAY<int>* > edge_to_face(numedges+1);
-    for(int i=0; i<edge_to_face.Size(); i++)
-      edge_to_face[i] = new ARRAY<int>;
-
-    
-    for(int i=0; i<idmaps.Size(); i++)
-      {
-	idmaps[i]->SetSize(numfaces);
-	(*idmaps[i]) = 0;
-      }
-
-    
-    for(int i=0; i<face2edge.Size(); i++)
-      {
-	for(int j=0; j<idmaps_edge.Size(); j++)
-	  {
-	    int e1id,e2id,e3id;
-	    e1id = (*idmaps_edge[j])[abs(face2edge[i][0])];
-	    e2id = (*idmaps_edge[j])[abs(face2edge[i][1])];
-	    e3id = (*idmaps_edge[j])[abs(face2edge[i][2])];
-	    if(e1id != 0 && e1id != abs(face2edge[i][0]) &&
-	       e2id != 0 && e2id != abs(face2edge[i][1]) &&
-	       e3id != 0 && e3id != abs(face2edge[i][2]))
-	      {
-		Intersection(*edge_to_face[e1id],*edge_to_face[e2id],*edge_to_face[e3id],possible);
-		if(possible.Size() == 1)
-		  {
-		    (*idmaps[j])[possible[0]] = i+1;
-		    (*idmaps[j])[i+1] = possible[0];
-		  }
-		else if(possible.Size() > 0)
-		  cerr << "ERROR: too many possible face identifications" << endl;
-	      }
-	  }
-
-	edge_to_face[abs(face2edge[i][0])]->Append(i+1);
-	edge_to_face[abs(face2edge[i][1])]->Append(i+1);
-	edge_to_face[abs(face2edge[i][2])]->Append(i+1);
-      }
-
-    for(int i=0; i<edge_to_face.Size(); i++)
-      delete edge_to_face[i];
-
-
-    for(int i=0; i<idmaps_edge.Size(); i++)
-      delete idmaps_edge[i];
-
-    
-    id_groups.SetSize(0);
-    id_num.SetSize(numfaces+1);
-    id_num = 0;
-
-    n2 = n4 = n8 = 0;
-
-    for(int i=1; i<=numfaces; i++)
-      {
-	if(id_num[i] != 0)
-	  continue;
-
-	ARRAY<int> group;
-	group.Append(i);
-	for(int j=0; j<idmaps.Size(); j++)
-	  {
-	    startsize = group.Size();
-	    for(int k=0; k<startsize; k++)
-	      {
-		int id = (*idmaps[j])[group[k]];
-		if(id != 0 && !group.Contains(id))
-		  {
-		    group.Append(id);
-		    id_num[id] = j+1+id_num[group[k]];
-		  }
-	      }
-	  }
-	if(group.Size() > 1)
-	  {
-	    id_num[i] = -1;
-	    id_groups.Append(new ARRAY<int>(group));
-	    if(group.Size() == 2)
-	      n2++;
-	    else
-	      cerr << "ERROR: face identification group size = " << group.Size() << endl;
-	  }
-	
-      }
-
-
-    for(int i=0; i<idmaps.Size(); i++)
-      delete idmaps[i];
-
-
-
-
-    for(int i=0; i<face2edge.Size(); i++)
-      {	
-	outfile << i+1 << " ";
-	for(int j=0; j<3; j++)
-	  outfile << face2edge[i][j] << " ";
-
-	if(id_num[i+1] == 0)
-	  outfile << 0;
-	else if(id_num[i+1] == -1)
-	  outfile << 1;
-	else
-	  outfile << 2;
-
-	outfile << " " << face_ids[i] <<"\n";
-      }
-    outfile << endl;
-
-
-    outfile << "// Number of Periodic Master Faces:\n"\
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"\
-	    << n2 << "\n"			      \
-	    << "\n"\
-	    << "// MasterFaceID, SlaveFaceID, TranslCode (1=dS1 2=dS2):\n"\
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<id_groups.Size(); i++)
-      {
-	if(id_groups[i]->Size() != 2)
-	  continue;
-
-	for(int j=0; j<id_groups[i]->Size(); j++)
-	  outfile << (*id_groups[i])[j] << " ";
-	for(int j=1; j<id_groups[i]->Size(); j++)
-	  outfile << id_num[(*id_groups[i])[j]] << " ";
-	outfile << "\n";
-
-	delete id_groups[i];
-      }
-    outfile << endl;
-
-    
-
-
-    outfile << "// ElemID, FaceID0, FaceID1, FaceID2, FaceID3, "<<uidpid<<":\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-
-    for(ElementIndex i=0; i<mesh.GetNE(); i++)
-      {
-	if(elnum[i] >= 0)
-	  {
-	    outfile << elnum[i] << " ";
-	    for(int j=0; j<4; j++)
-	      outfile << element2face[elnum[i]-1][j] << " ";
-
-	    outfile << mesh[i].GetIndex() << "\n";
-	  }
-      }
-    outfile << endl;
-
-    outfile << "// ElemID, NodeID0, NodeID1, NodeID2, NodeID3:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-
-    
-    for(ElementIndex i=0; i<mesh.GetNE(); i++)
-      {
-	if(elnum[i] >= 0)
-	  outfile << elnum[i] << " "
-		  << nodenum[mesh[i][1]] << " " << nodenum[mesh[i][0]] << " " << nodenum[mesh[i][2]] << " " << nodenum[mesh[i][3]] << "\n";
-      }
-    outfile << endl;
-    
-
-    
-
-    outfile << "// Physical Object counts (#Obj3D,#Obj2D,#Obj1D,#Obj0D):\n"
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"
-	    << " "<< numObj3D << " " << numObj2D << " " << numObj1D << " " << numObj0D << "\n" \
-	    << "\n" \
-	    << "// Number of Ports (Ports are a subset of Object2D list):\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" \
-	    << numports << "\n"						\
-	    << endl;
-
-
-    ARRAY< ARRAY<int> * > groups;
-
-    int maxg = -1;
-    for(int i = 0; i<uid_to_group_3D.Size(); i++)
-      if(uid_to_group_3D[i] > maxg)
-	maxg = uid_to_group_3D[i];
-    for(int i = 0; i<uid_to_group_2D.Size(); i++)
-      if(uid_to_group_2D[i] > maxg)
-	maxg = uid_to_group_2D[i];
-    for(int i = 0; i<uid_to_group_1D.Size(); i++)
-      if(uid_to_group_1D[i] > maxg)
-	maxg = uid_to_group_1D[i];
-    for(int i = 0; i<uid_to_group_0D.Size(); i++)
-      if(uid_to_group_0D[i] > maxg)
-	maxg = uid_to_group_0D[i];
-
-    groups.SetSize(maxg+1);
-    for(int i=0; i<groups.Size(); i++)
-      groups[i] = new ARRAY<int>;
-
-    for(ElementIndex i=0; i<mesh.GetNE(); i++)
-      if(uid_to_group_3D[mesh[i].GetIndex()] >= 0)
-	groups[uid_to_group_3D[mesh[i].GetIndex()]]->Append(i+1);
-      
-    
-
-
-    outfile << "// Object3D GroupID, #Elems <immediately followed by> ElemID List:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<numObj3D; i++)
-      {
-	outfile << i << " " << groups[i]->Size() << "\n";
-	for(int j=0; j<groups[i]->Size(); j++)
-	  outfile << (*groups[i])[j] << "\n";
-      }
-
-    for(int i=0; i<groups.Size(); i++)
-      groups[i]->SetSize(0);
-
-    for(int i=0; i<face_ids.Size(); i++)
-      if(uid_to_group_2D[face_ids[i]] >= 0)
-	groups[uid_to_group_2D[face_ids[i]]]->Append(i+1);
-      
-
-    outfile << "// Object2D GroupID, #Faces <immediately followed by> FaceID List:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<numObj2D; i++)
-      {
-	outfile << i << " " << groups[i]->Size() << "\n";
-	for(int j=0; j<groups[i]->Size(); j++)
-	  {
-	    outfile << (*groups[i])[j];
-	    if(ports.Contains(face_ids[(*groups[i])[j]-1]))
-	      outfile << " P";
-	    outfile << "\n";
-	  }
-      }
-    outfile << endl;
-
-    
-    for(int i=0; i<groups.Size(); i++)
-      groups[i]->SetSize(0);
-
-    for(int i=0; i<edge_ids.Size(); i++)
-      if(uid_to_group_1D[edge_ids[i]] >= 0)
-	groups[uid_to_group_1D[edge_ids[i]]]->Append(i+1);
-
-
-
-    outfile << "// Object1D GroupID, #Edges <immediately followed by> EdgeID List:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<numObj1D; i++)
-      {
-	outfile << i << " " << groups[i]->Size() << "\n";
-	for(int j=0; j<groups[i]->Size(); j++)
-	  outfile << (*groups[i])[j] << "\n";
-      }
-    outfile << endl;
-
-    
-    for(int i=0; i<groups.Size(); i++)
-      groups[i]->SetSize(0);
-    for(PointIndex i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      {
-	if(i-PointIndex::BASE < point_ids.Size())
-	  {
-	    if(uid_to_group_0D[point_ids[i]] >= 0)
-	      groups[uid_to_group_0D[point_ids[i]]]->Append(i+1-PointIndex::BASE);
-	  }
-	else
-	  groups[uid_to_group_0D[0]]->Append(i+1-PointIndex::BASE);
-      }
-
-
-    outfile << "// Object0D GroupID, #Nodes <immediately followed by> NodeID List:\n" \
-	    << "// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
-    for(int i=0; i<numObj0D; i++)
-      {
-	outfile << i << " " << groups[i]->Size() << "\n";
-	for(int j=0; j<groups[i]->Size(); j++)
-	  outfile << (*groups[i])[j] << "\n";
-      }
-    outfile << endl;
-
-    for(int i=0; i<groups.Size(); i++)
-      delete groups[i];
-
-
-    outfile.close();
-
-    cout << ".tet export done" << endl;
-  }
-}
diff --git a/contrib/Netgen/libsrc/interface/writetochnog.cpp b/contrib/Netgen/libsrc/interface/writetochnog.cpp
deleted file mode 100644
index c9ec6e3ce9c6b2c6faae0b771f484a928eb0ce17..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;
-
-  for (i = 1; i <= np; i++)
-    {
-      outfile << "node " << " " << i << " ";
-      outfile << mesh.Point(i)(0) << " ";
-      outfile << mesh.Point(i)(1) << " ";
-      outfile << mesh.Point(i)(2) << "\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 92b76520dcbe9d0a8819f2ef7f5ecb754bff6ae4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writeuser.cpp
+++ /dev/null
@@ -1,910 +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)
-{
-  const 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",
-      "JCMwave Format",
-      "TET 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 if (format == "JCMwave Format")
-    WriteJCMFormat (mesh, geom, filename);
-
-#ifdef OLIVER
-  else if (format == "TET Format")
-    WriteTETFormat( mesh, filename);//, "High Frequency" );
-#endif
-
-  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 = 0; j < 3; j++)
-	{
-	  outfile.width(10);
-	  outfile << mesh.Point(i)(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;
-  
-  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;
-
-      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;
-
-      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 61dd5aa27f1ff0e89488ce503850adc81b5cc358..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/writeuser.hpp
+++ /dev/null
@@ -1,140 +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 WriteJCMFormat (const Mesh & mesh,
-                     const CSGeometry & geom,
-                     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);
-
-
-
-#ifdef OLIVER
-extern
-void WriteTETFormat (const Mesh & mesh,
-		     const string & filename);
-
-#endif
-
-extern void ReadTETFormat (Mesh & mesh,
-                      const string & filename);
-
-
-void WriteDolfinFormat (const Mesh & mesh,
-			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 147d0d4d06b2e9badab48195942a4b9e904eb832..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/interface/wuchemnitz.cpp
+++ /dev/null
@@ -1,313 +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;
-		 default:
-			 i3.I1()=i3.I2()=i3.I3()=0;
-        }
-      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;
-		 default:
-			 i2.I1()=i2.I2()=0;
-        }
-      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/densemat.cpp b/contrib/Netgen/libsrc/linalg/densemat.cpp
deleted file mode 100644
index 762792f5c523031c9efd250b5ae545cc598280e3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/densemat.cpp
+++ /dev/null
@@ -1,1444 +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; height = width = 0;
-    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 a63d5a875751b55fb97b008ef4e78230aec2b418..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/densemat.hpp
+++ /dev/null
@@ -1,284 +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 (int 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(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]; }
-};
-
-
-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]; }
-
-
-  MatrixFixWidth & operator*= (double v)
-  {
-    if (data)
-      for (int i = 0; i < height*WIDTH; i++)
-        data[i] *= v;
-    return *this;
-  }
-
-
-
-  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]; }
-};
-
-
-template <int WIDTH>
-extern ostream & operator<< (ostream & ost, const MatrixFixWidth<WIDTH> & 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;
-};
-
-
-
-extern void CalcInverse (const DenseMatrix & m1, DenseMatrix & m2);
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/linalg/linalg.hpp b/contrib/Netgen/libsrc/linalg/linalg.hpp
deleted file mode 100644
index 7be9b4adedc36945fd3ce917ae87352b0e8734cf..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/linalg.hpp
+++ /dev/null
@@ -1,33 +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 "../include/myadt.hpp"
-namespace netgen
-{
-#include "vector.hpp"
-#include "densemat.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 f947e0a19124088c132db8acd5dc995174a22e62..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/vector.cpp b/contrib/Netgen/libsrc/linalg/vector.cpp
deleted file mode 100644
index b9dabda3669d6f4879de4999f3ef7d1317bcb45a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/vector.cpp
+++ /dev/null
@@ -1,786 +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() && Length() == hv3.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 c6c2dcce30ad62a36abd84c5f81f8a2c65415891..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/linalg/vector.hpp
+++ /dev/null
@@ -1,138 +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[i];
-    return *this;
-  }
-
-  FlatVector & Set (double scal, const FlatVector & v2)
-  {
-    for (int i = 0; i < s; i++) 
-      data[i] = scal * v2[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[i] + scal2 * v2[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;
-}
-
-
-
-#endif
-
-
diff --git a/contrib/Netgen/libsrc/makefile.inc b/contrib/Netgen/libsrc/makefile.inc
deleted file mode 100644
index 091210bc91fc8e56954fbeacda977965a39f3516..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/makefile.inc
+++ /dev/null
@@ -1,19 +0,0 @@
-# MODIFIED FOR 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
-
-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/meshing/adfront2.cpp b/contrib/Netgen/libsrc/meshing/adfront2.cpp
deleted file mode 100644
index 37a7c385f6be371098865058c3cd0c3aa3db6ac0..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/adfront2.cpp
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
-  Advancing front class for surfaces
-*/
-
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-  AdFront2::FrontPoint2 :: FrontPoint2 (const Point<3> & ap, PointIndex agi,
-					MultiPointGeomInfo * amgi, bool aonsurface)
-  {
-    p = ap;
-    globalindex = agi;
-    nlinetopoint = 0;
-    frontnr = INT_MAX-10;
-    onsurface = aonsurface;
-
-    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 :: AdFront2 (const Box3d & aboundingbox)
-    : boundingbox(aboundingbox), 
-      linesearchtree(boundingbox.PMin(), boundingbox.PMax()),
-      pointsearchtree(boundingbox.PMin(), boundingbox.PMax()),
-      cpointsearchtree(boundingbox.PMin(), boundingbox.PMax())
-  {
-    nfl = 0;
-    allflines = 0;
-
-    minval = 0;
-    starti = lines.Begin();
-  }
-
-  AdFront2 :: ~AdFront2 ()
-  {
-    delete allflines;
-  }
-
-
-  void AdFront2 :: PrintOpenSegments (ostream & ost) const
-  {
-    if (nfl > 0)
-      {
-	ost << nfl << " open front segments left:" << endl;
-	for (int i = lines.Begin(); i < lines.End(); i++)
-	  if (lines[i].Valid())
-	    ost << i << ": " 
-                << GetGlobalIndex (lines[i].L().I1()) << "-"
-		<< GetGlobalIndex (lines[i].L().I2()) << endl;
-      }
-  }
-
-  /*
-  void AdFront2 :: GetPoints (ARRAY<Point<3> > & apoints) const
-  {
-    apoints.Append (points);
-    // for (int i = 0; i < points.Size(); i++)
-    // apoints.Append (points[i].P());
-  }
-  */
-
-
-
-  int AdFront2 :: AddPoint (const Point<3> & p, PointIndex globind, 
-                            MultiPointGeomInfo * mgi,
-                            bool pointonsurface)
-  {
-    // inserts at empty position or resizes array
-    int pi;
-
-    if (delpointl.Size() != 0)
-      {
-	pi = delpointl.Last();
-	delpointl.DeleteLast ();
-
-	points[pi] = FrontPoint2 (p, globind, mgi, pointonsurface);
-      }
-    else
-      {
-	pi = points.Append (FrontPoint2 (p, globind, mgi, pointonsurface)) - 1;
-      }
-
-    if (mgi)
-      cpointsearchtree.Insert (p, pi);
-
-    pointsearchtree.Insert (p, pi);
-
-    return pi;
-  }
-
-
-  int AdFront2 :: AddLine (int pi1, int pi2,
-                           const PointGeomInfo & gi1, const PointGeomInfo & gi2)
-  {
-    int minfn;
-    int li;
-
-    FrontPoint2 & p1 = points[pi1];
-    FrontPoint2 & p2 = points[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[li] = FrontLine (INDEX_2(pi1, pi2));
-      }
-    else
-      {
-	li = lines.Append(FrontLine (INDEX_2(pi1, pi2))) - 1;
-      }
-
-  
-    if (!gi1.trignum || !gi2.trignum)
-      {
-	cout << "ERROR: in AdFront::AddLine, illegal geominfo" << endl;
-      }
-  
-    lines[li].SetGeomInfo (gi1, gi2);
-
-    Box3d lbox;
-    lbox.SetPoint(p1.P());
-    lbox.AddPoint(p2.P());
-
-    linesearchtree.Insert (lbox.PMin(), lbox.PMax(), li);
-
-    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 (int li)
-  {
-    int pi;
-
-    nfl--;
-
-    for (int i = 1; i <= 2; i++)
-      {
-	pi = lines[li].L().I(i);
-	points[pi].RemoveLine();
-
-	if (!points[pi].Valid())
-	  {
-	    delpointl.Append (pi);
-	    if (points[pi].mgi)
-	      {
-		cpointsearchtree.DeleteElement (pi);
-		delete points[pi].mgi;
-		points[pi].mgi = NULL;
-	      }
-
-            pointsearchtree.DeleteElement (pi);
-	  }
-      }
-
-    if (allflines)
-      {
-	allflines->Set (INDEX_2 (GetGlobalIndex (lines[li].L().I1()),
-				 GetGlobalIndex (lines[li].L().I2())), 2);
-      }
-
-    lines[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 (int li)
-  {
-    lines[li].IncrementClass();
-  }
-
-
-  void AdFront2 :: ResetClass (int li)
-  {
-    lines[li].ResetClass();
-  }
-  */
-
-  int AdFront2 :: SelectBaseLine (Point<3>  & p1, Point<3>  & p2, 
-				  const PointGeomInfo *& geominfo1,
-				  const PointGeomInfo *& geominfo2,
-				  int & qualclass)
-  {
-    int baselineindex = -1; 
-
-    for (int i = starti; i < lines.End(); i++)
-      {
-	if (lines[i].Valid())
-	  {
-	    int hi = lines[i].LineClass() +
-	      points[lines[i].L().I1()].FrontNr() +
-	      points[lines[i].L().I2()].FrontNr();
-	  
-	    if (hi <= minval)
-	      {
-		minval = hi;
-		baselineindex = i;
-		break;
-	      }
-	  }
-      }
-  
-    if (baselineindex == -1)
-      {
-	minval = INT_MAX;
-	for (int i = lines.Begin(); i < lines.End(); i++)
-	  if (lines[i].Valid())
-	    {
-	      int hi = lines[i].LineClass() +
-		points[lines[i].L().I1()].FrontNr() +
-		points[lines[i].L().I2()].FrontNr();
-	    
-	      if (hi < minval)
-		{
-		  minval = hi;
-		  baselineindex = i;
-		}
-	    }
-      }
-    starti = baselineindex+1;
-
-    p1 = points[lines[baselineindex].L().I1()].P();
-    p2 = points[lines[baselineindex].L().I2()].P();
-    geominfo1 = &lines[baselineindex].GetGeomInfo(1);
-    geominfo2 = &lines[baselineindex].GetGeomInfo(2);
-
-    qualclass = lines[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)
-  {
-    // baselineindex += 1-lines.Begin();
-
-    int pstind;
-    Point<3>  midp, p0;
-
-    pstind = lines[baselineindex].L().I1();
-    p0 = points[pstind].P();
-
-    loclines.Append(lines[baselineindex].L());
-    lindex.Append(baselineindex);  //  +1-lines.Begin());
-
-    static ARRAY<int> nearlines;
-    nearlines.SetSize(0);
-    static ARRAY<int> nearpoints;
-    nearpoints.SetSize(0);
-
-    linesearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh),
-				    p0 + Vec3d(xh, xh, xh),
-				    nearlines);
-
-    pointsearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh),
-                                     p0 + Vec3d(xh, xh, xh),
-                                     nearpoints);
-
-
-    for (int ii = 1; ii <= nearlines.Size(); ii++)
-      {
-	int i = nearlines.Get(ii);
-	if (lines[i].Valid() && i != baselineindex) //  + 1-lines.Begin())
-	  {
-            loclines.Append(lines[i].L());
-            lindex.Append(i);
-	  }
-      }
-
-    static ARRAY<int> invpindex;
-    invpindex.SetSize (points.Size()); 
-    // invpindex = -1;
-    for (int i = 0; i < nearpoints.Size(); i++)
-      invpindex[nearpoints[i]] = -1;
-
-    for (int i = 0; i < loclines.Size(); i++)
-      {
-	invpindex[loclines[i].I1()] = 0;
-	invpindex[loclines[i].I2()] = 0;
-      }
-
-
-    for (int i = 0; i < loclines.Size(); i++)
-      {
-	for (int j = 0; j < 2; j++)
-	  {
-	    int pi = loclines[i][j];
-	    if (invpindex[pi] == 0)
-	      {
-		pindex.Append (pi);
-		invpindex[pi] = pindex.Size();
-		loclines[i][j] = locpoints.Append (points[pi].P());
-	      }
-	    else
-	      loclines[i][j] = invpindex[pi];
-	  }
-      }
-
-
-    // double xh2 = xh*xh;
-    for (int ii = 0; ii < nearpoints.Size(); ii++)
-      {
-        int i = nearpoints[ii];
-	if (points[i].Valid() && 
-	    points[i].OnSurface() &&
-	    // Dist2 (points.Get(i).P(), p0) <= xh2 &&
-	    invpindex[i] <= 0)
-	  {
-	    invpindex[i] = locpoints.Append (points[i].P());
-	    pindex.Append(i);
-	  }
-      }
-    /*
-    double xh2 = xh*xh;
-    for (i = 1; i <= points.Size(); i++)
-      {
-	if (points.Get(i).Valid() && 
-	    points.Get(i).OnSurface() &&
-	    Dist2 (points.Get(i).P(), p0) <= xh2 &&
-	    invpindex.Get(i) <= 0)
-	  {
-	    invpindex.Elem(i) =
-	      locpoints.Append (points.Get(i).P());
-	    pindex.Append(i);
-	  }
-      }
-    */
-
-    pgeominfo.SetSize (locpoints.Size());
-    for (int i = 0; i < pgeominfo.Size(); i++)
-      pgeominfo[i].Init();
-
-
-    for (int i = 0; i < loclines.Size(); i++)
-      for (int j = 0; j < 2; j++)
-	{
-	  int lpi = loclines[i][j];
-	
-	  const PointGeomInfo & gi = 
-	    lines[lindex[i]].GetGeomInfo (j+1);
-	  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 (int i = 0; i < locpoints.Size(); i++)
-      {
-	int pi = pindex[i];
-      
-	if (points[pi].mgi)
-	  for (int j = 1; j <= points[pi].mgi->GetNPGI(); j++)
-	    pgeominfo[i].AddPointGeomInfo (points[pi].mgi->GetPGI(j));
-      }
-   
-    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[baselineindex].LineClass();
-  }
-
-
-
-  void AdFront2 :: SetStartFront ()
-  {
-    for (int i = lines.Begin(); i < lines.End(); i++)
-      if (lines[i].Valid())
-	for (int j = 1; j <= 2; j++)
-	  points[lines[i].L().I(j)].DecFrontNr(0);
-  }
-
-
-  void AdFront2 :: Print (ostream & ost) const
-  {
-    ost << points.Size() << " Points: " << endl;
-    for (int i = points.Begin(); i < points.End(); i++)
-      if (points[i].Valid())
-	ost << i << "  " << points[i].P() << endl;
-
-    ost << nfl << " Lines: " << endl;
-    for (int i = lines.Begin(); i < lines.End(); i++)
-      if (lines[i].Valid())
-	ost << lines[i].L().I1() << " - " << lines[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 4266d3332ecba37c2fc0d4d192f6826a1bd807ae..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/adfront2.hpp
+++ /dev/null
@@ -1,264 +0,0 @@
-#ifndef FILE_ADFRONT2
-#define FILE_ADFRONT2
-
-/**************************************************************************/
-/* File:   adfront2.hpp                                                   */
-/* Author: Joachim Schoeberl                                              */
-/* Date:   01. Okt. 95                                                    */
-/**************************************************************************/
-
-
-/**
-
-    Advancing front class for surfaces
-
-*/
-class AdFront2
-{
-
-  ///
-  class FrontPoint2
-  {
-    /// coordinates
-    Point<3> p;            
-    /// global node index
-    PointIndex globalindex;   
-    /// number of front lines connected to point 
-    int nlinetopoint;    
-    /// distance to original boundary
-    int frontnr;          
-
-    bool onsurface;
-
-  public:
-    ///
-    MultiPointGeomInfo * mgi;
-
-    ///
-    FrontPoint2 ()
-    {
-      globalindex = -1;
-      nlinetopoint = 0;
-      frontnr = INT_MAX-10;    // attention: overflow on calculating  INT_MAX + 1
-      mgi = NULL;
-      onsurface = true;
-    }
-
-    ///
-    FrontPoint2 (const Point<3> & ap, PointIndex agi,
-		 MultiPointGeomInfo * amgi, bool aonsurface = true);
-    ///
-    ~FrontPoint2 () { ; }
-
-    ///
-    const Point<3> & P () const { return p; }
-    ///
-    operator const Point<3> & () 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; }
-
-    ///
-    bool OnSurface() const
-    { return onsurface; }
-
-    ///
-    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
-    PointGeomInfo geominfo[2];
-  public:
-
-    FrontLine ()
-    {
-      lineclass = 1;
-    }
-
-    ///
-    FrontLine (const INDEX_2 & al)
-    {
-      l = al;
-      lineclass = 1;
-    }
-
-
-    ///
-    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 pointsearchtree;    /// search tree for points
-  Point3dTree cpointsearchtree;   /// search tree for cone points (not used ???)
-
-  ARRAY<int> delpointl;     /// list of deleted front points
-  ARRAY<int> dellinel;      /// list of deleted front lines
-
-  int 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<Point<3> > & apoints) const;
-  ///
-  void Print (ostream & ost) const;
-
-  ///
-  bool Empty () const
-  {
-    return nfl == 0;
-  }
-  ///
-  int GetNFL () const { return nfl; }
-  ///
-  int SelectBaseLine (Point<3> & p1, Point<3> & 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<int> & pindex,
-                 ARRAY<int> & lindex,
-                 double xh);
-
-  ///
-  void DeleteLine (int li);
-  ///
-  int AddPoint (const Point<3> & p, PointIndex globind, 
-                MultiPointGeomInfo * mgi = NULL,
-                bool pointonsurface = true);
-  ///
-  int AddLine (int pi1, int pi2, 
-               const PointGeomInfo & gi1, const PointGeomInfo & gi2);
-  ///
-  int ExistsLine (int gpi1, int gpi2);
-
-  ///
-  void IncrementClass (int li)
-  {
-    lines[li].IncrementClass();
-  }
-
-  ///
-  void ResetClass (int li)
-  {
-    lines[li].ResetClass();
-  }
-
-  ///
-  const PointGeomInfo & GetLineGeomInfo (int li, int lend) const
-    { return lines[li].GetGeomInfo (lend); }
-  ///
-
-  PointIndex GetGlobalIndex (int pi) const
-  {
-    return points[pi].GlobalIndex();
-  }
-  ///
-  void SetStartFront ();
-  ///
-  void PrintOpenSegments (ostream & ost) const;
-};
-
-
-
-#endif
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/adfront3.cpp b/contrib/Netgen/libsrc/meshing/adfront3.cpp
deleted file mode 100644
index dfe2edc839881517939f5eddf73f0f985c831492..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/adfront3.cpp
+++ /dev/null
@@ -1,876 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-/* ********************** FrontPoint ********************** */
-
-namespace netgen
-{
-
-FrontPoint3 :: FrontPoint3 () 
-{ 
-  globalindex = -1;
-  nfacetopoint = 0; 
-  frontnr = 1000; 
-  cluster = 0;
-}
-
-
-FrontPoint3 :: FrontPoint3 (const Point<3> & 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 MiniElement2d & 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<Point<3> > & apoints) const
-{
-  for (PointIndex pi = PointIndex::BASE; 
-       pi < points.Size()+PointIndex::BASE; pi++)
-    
-    apoints.Append (points[pi].P());
-}
-
-
-PointIndex AdFront3 :: AddPoint (const Point<3> & 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 MiniElement2d & 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 MiniElement2d & 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 :: CreateTrees ()
-{
-  int i, j;
-  PointIndex pi;
-  Point3d pmin, pmax;
-
-  for (pi = PointIndex::BASE; 
-       pi < GetNP()+PointIndex::BASE; pi++)
-    {
-      const Point<3> & 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 MiniElement2d & el = GetFace(i);
-      pmin = GetPoint (el[0]);
-      pmax = pmin;
-      for (j = 1; j < 3; j++)
-	{
-	  const Point<3> & 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 Point<3> & pmin, const Point<3> & 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 ()
-{
-  static int timer_a = NgProfiler::CreateTimer ("Adfront3::RebuildInternal A");
-  static int timer_b = NgProfiler::CreateTimer ("Adfront3::RebuildInternal B");
-  static int timer_c = NgProfiler::CreateTimer ("Adfront3::RebuildInternal C");
-  static int timer_d = NgProfiler::CreateTimer ("Adfront3::RebuildInternal D");
-
-
-  NgProfiler::StartTimer (timer_a);	  
-  int hi = 0;
-  for (int 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 (int i = PointIndex::BASE; 
-       i < np+PointIndex::BASE; i++)
-    points[i].cluster = i;
-  
-  NgProfiler::StopTimer (timer_a);	  
-  NgProfiler::StartTimer (timer_b);	  
-
-  int change;
-  do
-    {
-      change = 0;
-      for (int i = 1; i <= faces.Size(); i++)
-	{
-	  const MiniElement2d & el = faces.Get(i).Face();
-
-	  int mini = points[el.PNum(1)].cluster;
-	  int maxi = mini;
-	  
-	  for (int 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 (int j = 1; j <= 3; j++)
-		points[el.PNum(j)].cluster = mini;
-	    }
-	}
-    }
-  while (change);
-
-
-  NgProfiler::StopTimer (timer_b);	  
-  NgProfiler::StartTimer (timer_c);	  
-
-
-
-
-  BitArrayChar<PointIndex::BASE> usecl(np);
-  usecl.Clear();
-  for (int 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 (int i = PointIndex::BASE; 
-       i < np+PointIndex::BASE; i++)
-    if (usecl.Test(i))
-      cntcl++;
-
-  ARRAY<double, PointIndex::BASE> clvol (np);
-  clvol = 0.0;
-
-  for (int i = 1; i <= faces.Size(); i++)
-    {
-      const MiniElement2d & 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;
-    }
-
-  NgProfiler::StopTimer (timer_c);	  
-  NgProfiler::StartTimer (timer_d);	  
-
-
-
-  int negvol = 0;
-  for (int i = PointIndex::BASE; 
-       i < clvol.Size()+PointIndex::BASE; i++)
-    {
-      if (clvol[i] < 0)
-	negvol = 1;
-    }
-
-  if (negvol)
-    {
-      for (int i = 1; i <= faces.Size(); i++)
-	faces.Elem(i).cluster = 1;
-      for (int i = PointIndex::BASE; 
-	   i < points.Size()+PointIndex::BASE; i++)
-	points[i].cluster = 1;
-    }
-
-  if (hashon) 
-    hashtable.Create();
-
-  NgProfiler::StopTimer (timer_d);	  
-}
-
-
-
-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<MiniElement2d> & locfaces,   // local index
-			   ARRAY<PointIndex> & pindex,
-			   ARRAY<INDEX> & findex,
-			   INDEX_2_HASHTABLE<int> & getconnectedpairs,
-			   float xh,
-			   float relh,
-			   INDEX& facesplit)
-{
-  static int timer = NgProfiler::CreateTimer ("AdFront3::GetLocals");
-  NgProfiler::RegionTimer reg (timer);
-
-
-  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<MiniElement2d> 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 MiniElement2d & face = faces.Get(i).Face();
-	  if (faces.Get(i).cluster == cluster && faces.Get(i).Valid() && i != fstind)
-	    {
-	      Box3d b2;
-	      b2.SetPoint (points[face[0]].P());
-	      b2.AddPoint (points[face[1]].P());
-	      b2.AddPoint (points[face[2]].P());
-
-	      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 MiniElement2d & face = locfaces2.Get(i);
-      const Point3d & p1 = points[face[0]].P();
-      const Point3d & p2 = points[face[1]].P();
-      const Point3d & p3 = points[face[2]].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 pind = pindex.Get(i);
-	  if (pind >= 1 && pind <= connectedpairs->Size ())
-	    {
-	      for (j = 1; j <= connectedpairs->EntrySize(pind); j++)
-		{
-		  int oi = connectedpairs->Get(pind, 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 (INDEX_2::Sort (i, other), 1);
-		    }
-		}
-	    }
-	}
-    }
-  
-
-  /*
-    // add isolated points
-  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<MiniElement2d> & groupelements,
-			   ARRAY<PointIndex> & pindex,
-			   ARRAY<INDEX> & findex) const
-{
-  static ARRAY<char> pingroup;
-  int i, j, changed;
-
-  pingroup.SetSize(points.Size());
-
-  pingroup = 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 MiniElement2d & face = faces.Get(i).Face();
-
-	    int 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())
-      {
-	int 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 MiniElement2d & 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;
-    }
-    */
-}
-
-
-bool AdFront3 :: Inside (const Point<3> & 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 Point<3> & p1 = points[faces.Get(i).Face().PNum(1)].P();
-	const Point<3> & p2 = points[faces.Get(i).Face().PNum(2)].P();
-	const Point<3> & 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(0) - p1(0);
-	b.Elem(2) = p(1) - p1(1);
-	b.Elem(3) = p(2) - p1(2);
-
-	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) != 0);
-}
-
-
-
-
-
-int AdFront3 :: SameSide (const Point<3> & lp1, const Point<3> & lp2,
-			  const ARRAY<int> * testfaces) const
-{
-  int i, ii, cnt;
-
-  const Point<3> *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 Point<3> *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 40d6eabb99c391d046cde49f3e9a2f8623f3432d..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/adfront3.hpp
+++ /dev/null
@@ -1,319 +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
-Point<3> 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 Point<3> & ap, PointIndex agi);
-  
-  ///
-  const Point<3> & 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;
-};
-
-
-
-class MiniElement2d
-{
-protected:
-  int np;
-  PointIndex pnum[4];
-  bool deleted;
-public:
-  MiniElement2d ()
-  { np = 3; deleted = 0; }
-  MiniElement2d (int anp)
-  { np = anp; deleted = 0; }
-
-  int GetNP() const { return np; }
-  PointIndex & operator[] (int i) { return pnum[i]; }
-  const PointIndex operator[] (int i) const { return pnum[i]; }
-
-  const PointIndex PNum (int i) const { return pnum[i-1]; }
-  PointIndex & PNum (int i) { return pnum[i-1]; }
-  const PointIndex PNumMod (int i) const { return pnum[(i-1)%np]; }
-
-  void Delete () { deleted = 1; pnum[0] = pnum[1] = pnum[2] = pnum[3] = PointIndex::BASE-1; }
-  bool IsDeleted () const { return deleted; }
-};
-
-
-inline ostream & operator<<(ostream  & s, const MiniElement2d & el)
-{
-  s << "np = " << el.GetNP();
-  for (int j = 0; j < el.GetNP(); j++)
-    s << " " << el[j];
-  return s;
-}
-
-
-
-
-/// Face in advancing front
-class FrontFace
-{
-private:
-  ///
-  MiniElement2d f;
-  ///
-  int qualclass;
-  ///
-  char oldfront;
-  ///
-  int hashvalue;
-  ///
-  int cluster;
-
-public:
-  ///
-  FrontFace ();
-  ///
-  FrontFace (const MiniElement2d & af);
-  ///
-  const MiniElement2d & 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<Point<3> > & apoints) const;
-  ///
-  int GetNP() const 
-  { return points.Size(); }
-  ///
-  const Point<3> & GetPoint (PointIndex pi) const
-  { return points[pi].P(); }
-  ///
-  int GetNF() const
-  { return nff; }
-  ///
-  const MiniElement2d & 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 Point<3> & pmin, const Point<3> & pmax, 
-			     ARRAY<int> & ifaces) const;
-
-  ///
-  void GetFaceBoundingBox (int i, Box3d & box) const;
-
-  ///
-  int GetLocals (int baseelement,
-		 ARRAY<Point3d > & locpoints,
-                 ARRAY<MiniElement2d> & 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<MiniElement2d> & groupelements,
-                 ARRAY<PointIndex> & pindex,
-                 ARRAY<INDEX> & findex
-                 ) const;
-
-  ///
-  void DeleteFace (INDEX fi);
-  ///
-  PointIndex AddPoint (const Point<3> & p, PointIndex globind);
-  ///
-  INDEX AddFace (const MiniElement2d & e);
-  ///
-  INDEX AddConnectedPair (const INDEX_2 & pair);
-  ///
-  void IncrementClass (INDEX fi)
-  { faces.Elem(fi).IncrementQualClass(); }
-
-  ///
-  void ResetClass (INDEX fi)
-  { faces.Elem(fi).ResetQualClass(); }
-
-  ///
-  void SetStartFront (int baseelnp = 0);
-
-  /// is Point p inside Surface ?
-  bool Inside (const Point<3> & p) const;
-  /// both points on same side ?
-  int SameSide (const Point<3> & lp1, const Point<3> & 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 c56671b547ecdc076dea8840465c935cc0a18fcb..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/bisect.cpp
+++ /dev/null
@@ -1,3994 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-  //#include "../interface/writeuser.hpp"
-  class MarkedTet;
-  class MarkedPrism;
-  class MarkedIdentification;
-  class MarkedTri;
-  class MarkedQuad;
-  
-  typedef MoveableArray<MarkedTet> T_MTETS;
-  typedef MoveableArray<MarkedPrism> T_MPRISMS;
-  typedef MoveableArray<MarkedIdentification> T_MIDS;
-  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;
-
-  };
-
-  ostream & operator<< (ostream & ost, const MarkedTet & mt)
-  {
-    for(int i=0; i<4; i++)
-      ost << mt.pnums[i] << " ";
-
-    ost << mt.matindex << " " << int(mt.marked) << " " << int(mt.flagged) << " " << int(mt.tetedge1) << " " << int(mt.tetedge2) << " ";
-    
-    for(int i=0; i<4; i++)
-      ost << char(mt.faceedges[i]) << " ";
-
-    ost << mt.incorder << " " << int(mt.order) << "\n";
-    return ost;
-  }
-  istream & operator>> (istream & ost, MarkedTet & mt)
-  {
-    for(int i=0; i<4; i++)
-      ost >> mt.pnums[i];
-
-    ost >> mt.matindex;
-
-    int auxint;
-    ost >> auxint;
-    mt.marked = auxint;
-    ost >> auxint;
-    mt.flagged = auxint;
-    ost >> auxint;
-    mt.tetedge1 = auxint;
-    ost >> auxint;
-    mt.tetedge2 = auxint;
-    
-    char auxchar;
-
-    for(int i=0; i<4; i++)
-      {
-	ost >> auxchar;
-	mt.faceedges[i] = auxchar;
-      }
-
-    ost >> mt.incorder;
-    ost >> auxint;
-    mt.order = auxint;
-    return ost;
-  }
-
-  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;
-  };
-
-  
-  ostream & operator<< (ostream & ost, const MarkedPrism & mp)
-  {
-    for(int i=0; i<6; i++)
-      ost << mp.pnums[i] << " ";
-
-    ost << mp.matindex << " " << mp.marked << " " << mp.markededge << " " << mp.incorder << " " << int(mp.order) << "\n";
-    return ost;
-  }
-  istream & operator>> (istream & ist, MarkedPrism & mp)
-  {
-    for(int i=0; i<6; i++)
-      ist >> mp.pnums[i];
-
-    ist >> mp.matindex >> mp.marked >> mp.markededge >> mp.incorder;
-    int auxint;
-    ist >> auxint;
-    mp.order = auxint;
-    return ist;
-  }
-
-
-  class MarkedIdentification
-  {
-  public:
-    // number of points of one face (3 or 4)
-    int np;
-    /// 6 or 8 point numbers
-    PointIndex pnums[8];
-    /// marked for refinement
-    int marked;
-    /// edge starting with node k (0,1,2, or 3)
-    int markededge;
-
-    bool incorder;
-    unsigned int order:6;
-  };
-    
-  
-  ostream & operator<< (ostream & ost, const MarkedIdentification & mi)
-  {
-    ost << mi.np << " ";
-    for(int i=0; i<2*mi.np; i++)
-      ost << mi.pnums[i] << " ";
-    ost << mi.marked << " " << mi.markededge << " " << mi.incorder << " " << int(mi.order) << "\n";
-    return ost;
-  }
-  istream & operator>> (istream & ist, MarkedIdentification & mi)
-  {
-    ist >> mi.np;
-    for(int i=0; i<2*mi.np; i++)
-      ist >> mi.pnums[i];
-    ist >> mi.marked >> mi.markededge >> mi.incorder;
-    int auxint;
-    ist >> auxint;
-    mi.order = auxint;
-    return ist;
-  }
-  
-
-
-
-
-  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;
-  };
-  
-  ostream & operator<< (ostream & ost, const MarkedTri & mt)
-  {
-    for(int i=0; i<3; i++)
-      ost << mt.pnums[i] << " ";
-    for(int i=0; i<3; i++)
-      ost << mt.pgeominfo[i] << " ";
-    ost << mt.marked << " " << mt.markededge << " " << mt.surfid << " " << mt.incorder << " " << int(mt.order) << "\n";
-    return ost;
-  } 
-  istream & operator>> (istream & ist, MarkedTri & mt)
-  {
-    for(int i=0; i<3; i++)
-      ist >> mt.pnums[i];
-    for(int i=0; i<3; i++)
-      ist >> mt.pgeominfo[i];
-    ist >> mt.marked >> mt.markededge >> mt.surfid >> mt.incorder;
-    int auxint;
-    ist >> auxint;
-    mt.order = auxint;
-    return ist;
-  }
-    
-
-
-  class MarkedQuad
-  {
-  public:
-    /// point numbers
-    PointIndex pnums[4];
-    ///
-    PointGeomInfo pgeominfo[4];
-    /// marked for refinement
-    int marked;
-    /// marked edge: 0/2 = vertical, 1/3 = horizontal
-    int markededge;
-    /// surface id
-    int surfid;
-
-    bool incorder;
-    unsigned int order:6;
-  };
-
-  ostream & operator<< (ostream & ost, const MarkedQuad & mt)
-  {
-    for(int i=0; i<4; i++)
-      ost << mt.pnums[i] << " ";
-    for(int i=0; i<4; i++)
-      ost << mt.pgeominfo[i] << " ";
-    ost << mt.marked << " " << mt.markededge << " " << mt.surfid << " " << mt.incorder << " " << int(mt.order) << "\n";
-    return ost;
-  } 
-  istream & operator>> (istream & ist, MarkedQuad & mt)
-  {
-    for(int i=0; i<4; i++)
-      ist >> mt.pnums[i];
-    for(int i=0; i<4; i++)
-      ist >> mt.pgeominfo[i];
-    ist >> mt.marked >> mt.markededge >> mt.surfid >> mt.incorder;
-    int auxint;
-    ist >> auxint;
-    mt.order = auxint;
-    return ist;
-  }
-
-
-
-
-  void PrettyPrint(ostream & ost, const MarkedTet & mt)
-  {
-    int te1 = mt.tetedge1;
-    int te2 = mt.tetedge2;
-    int order = mt.order;
-
-    ost << "MT: " << mt.pnums[0] << " - " << mt.pnums[1] << " - " 
-	<< mt.pnums[2] << " - " << mt.pnums[3] << endl
-	<< "marked edge: " << te1 << " - " << te2
-	<< ", order = " << order << endl;
-    //for (int k = 0; k < 4; k++)
-    //  ost << int(mt.faceedges[k]) << "  ";
-    for (int k = 0; k < 4; k++)
-      {
-	ost << "face";
-	for (int j=0; j<4; j++)
-	  if(j != k)
-	    ost << " " << mt.pnums[j];
-	for(int i=0; i<3; i++)
-	  for(int j=i+1; j<4; j++)
-	    if(i != k && j != k && mt.faceedges[k] == 6-k-i-j)
-	      ost << " marked edge " << mt.pnums[i] << " " << mt.pnums[j] << endl;
-      }
-    ost << endl;
-  }
-
-
-
-
-  int BTSortEdges (const Mesh & mesh,
-		   const ARRAY< ARRAY<int,PointIndex::BASE>* > & idmaps,
-		   INDEX_2_CLOSED_HASHTABLE<int> & edgenumber)
-  {
-    PrintMessage(4,"sorting ... ");
-
-    //  if (mesh.PureTetMesh())
-    if (1)
-      {
-	// new, fast version
-      
-	ARRAY<INDEX_2> edges;
-	ARRAY<int> eclasses;
-      
-	int i, j, k;
-	int cntedges = 0;
-	int go_on;
-	int ned(0);
-      
-	// 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] = NULL;
-	  
-	    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();
-		//(*testout) << "edge " << i2 << endl;
-		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] = NULL;
-	  
-	    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
-	  {
-	    go_on = 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] = NULL;
-		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);
-			go_on = 1;
-		      }
-		    else if (eclasses.Get(eclass2) >
-			     eclasses.Get(eclass1))
-		      {
-			eclasses.Elem(eclass2) = 
-			  eclasses.Get(eclass1);
-			go_on = 1;
-		      }
-		  }
-	      }
-
-	    for(SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
-	      {
-		const Element2d & el2d = mesh[sei];
-
-		for(i = 0; i < el2d.GetNP(); i++)
-		  {
-		    INDEX_2 e1(el2d[i], el2d[(i+1) % el2d.GetNP()]);
-		    e1.Sort();
-		    INDEX_2 e2;
-		    
-		    for(k = 0; k < idmaps.Size(); k++)
-		      {
-			e2.I1() = (*idmaps[k])[e1.I1()];
-			e2.I2() = (*idmaps[k])[e1.I2()];
-			
-			if(e2.I1() == 0 || e2.I2() == 0 ||
-			   e1.I1() == e2.I1() || e1.I2() == e2.I2())
-			  continue;
-			
-			e2.Sort();
-			if(!edgenumber.Used(e2))
-			  continue;
-			
-
-			int eclass1 = edgenumber.Get (e1);
-			int eclass2 = edgenumber.Get (e2);
-			
-			if (eclasses.Get(eclass1) >
-			    eclasses.Get(eclass2))
-			  {
-			    eclasses.Elem(eclass1) = 
-			      eclasses.Get(eclass2);
-
-
-			    go_on = 1;
-			  }
-			else if (eclasses.Get(eclass2) >
-				 eclasses.Get(eclass1))
-			  {
-			    eclasses.Elem(eclass2) = 
-			      eclasses.Get(eclass1);
-			    go_on = 1;
-			  }
-		      }		      
-		  }
-		
-	      }
-
-	  }
-	while (go_on);
-
-// 	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); 
-	      }
-	  }
-	return cnt;
-      }
-
-    else
-    
-      {
-	// old version
-      
-	int i, j;
-	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 go_on = 0;
-		do
-		  {
-		    go_on = 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);
-				go_on = 1;
-			      }
-			    if (used2 && !used1)
-			      {
-				cnt++;
-				edgenumber.Set (e1, cnt);
-				go_on = 1;
-			      }
-			  }
-		      }
-		  }
-		while (go_on);
-	      }
-	  }
-	while (found);
-
-	return cnt;
-      }
-  }
-
-
-
-
-  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;
-
-    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;
-	    }
-	}
-  }
-
-
-
-  bool BTDefineMarkedId(const Element2d & el, 
-			INDEX_2_CLOSED_HASHTABLE<int> & edgenumber, 
-			const ARRAY<int,PointIndex::BASE> & idmap,
-			MarkedIdentification & mi)
-  {
-
-    bool identified = true;
-    mi.np = el.GetNP();
-    int min1(0),min2(0);
-    for(int j = 0; identified && j < mi.np; j++)
-      {
-	mi.pnums[j] = el[j];
-	mi.pnums[j+mi.np] = idmap[el[j]];
-
-	if(j == 0 || el[j] < min1)
-	  min1 = el[j];
-	if(j == 0 || mi.pnums[j+mi.np] < min2)
-	  min2 = mi.pnums[j+mi.np];
-
-	identified = (mi.pnums[j+mi.np] != 0 && mi.pnums[j+mi.np] != mi.pnums[j]);
-      }
-
-    identified = identified && (min1 < min2);
-
-    if(identified)
-      {
-	mi.marked = 0;
-	
-	mi.incorder = 0;
-	mi.order = 1;
-
-	int val = 0;
-	for (int i = 0; i < mi.np; i++)
-	  {
-	    INDEX_2 i2(mi.pnums[i], mi.pnums[(i+1)%mi.np]);
-	    i2.Sort();
-	    int hval = edgenumber.Get(i2);
-	    if (hval > val)
-	      {
-		val = hval;
-		mi.markededge = i;
-	      }
-	  }
-      }
-
-    return identified;
-  }
-
-
-  void BTDefineMarkedTri (const Element2d & el,
-			  INDEX_2_CLOSED_HASHTABLE<int> & edgenumber,
-			  MarkedTri & mt)
-  {
-    int i, j;
-    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 PrettyPrint(ostream & ost, const MarkedTri & mt)
-  {
-    ost << "MarkedTrig: " << endl;
-    ost << "  pnums = "; for (int i=0; i<3; i++) ost << mt.pnums[i] << " "; ost << endl; 
-    ost << "  marked = " << mt.marked << ", markededge=" << mt.markededge << endl;
-    for(int i=0; i<2; i++)
-      for(int j=i+1; j<3; j++)
-	if(mt.markededge == 3-i-j)
-	  ost << "  marked edge pnums = " << mt.pnums[i] << " " << mt.pnums[j] << endl;
-  }
-
-
-  void PrettyPrint(ostream & ost, const MarkedQuad & mq)
-  {
-    ost << "MarkedQuad: " << endl;
-    ost << "  pnums = "; for (int i=0; i<4; i++) ost << mq.pnums[i] << " "; ost << endl; 
-    ost << "  marked = " << mq.marked << ", markededge=" << mq.markededge << endl;
-  }
-
-
-
-
-
-  void BTDefineMarkedQuad (const Element2d & el,
-			   INDEX_2_CLOSED_HASHTABLE<int> & edgenumber,
-			   MarkedQuad & mq)
-  {
-    int i;
-    for (i = 0; i < 4; i++)
-      mq.pnums[i] = el[i];
-    Swap (mq.pnums[2], mq.pnums[3]);  
-
-    mq.marked = 0;
-    mq.markededge = 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 Point<3> & p1 = mesh.Point (mtets.Get(i).pnums[j]);
-		  const Point<3> & 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 Point<3> & p1 = mesh.Point (mprisms.Get(i).pnums[j]);
-		  const Point<3> & 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;
-
-    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 BTBisectIdentification (const MarkedIdentification & oldid,
-			       ARRAY<int> & newp,
-			       MarkedIdentification & newid1,
-			       MarkedIdentification & newid2)
-  {
-    for(int i=0; i<2*oldid.np; i++)
-      {
-	newid1.pnums[i] = oldid.pnums[i];
-	newid2.pnums[i] = oldid.pnums[i];
-      }
-    newid1.np = newid2.np = oldid.np;
-
-    if(oldid.np == 3)
-      {
-	newid1.pnums[(oldid.markededge+1)%3] = newp[0];
-	newid1.pnums[(oldid.markededge+1)%3+3] = newp[1];
-	newid1.markededge = (oldid.markededge+2)%3;
-
-	newid2.pnums[oldid.markededge] = newp[0];
-	newid2.pnums[oldid.markededge+3] = newp[1];
-	newid2.markededge = (oldid.markededge+1)%3;
-      }
-    else if(oldid.np == 4)
-      {
-	newid1.pnums[(oldid.markededge+1)%4] = newp[0];
-	newid1.pnums[(oldid.markededge+2)%4] = newp[2];
-	newid1.pnums[(oldid.markededge+1)%4+4] = newp[1];
-	newid1.pnums[(oldid.markededge+2)%4+4] = newp[3];
-	newid1.markededge = (oldid.markededge+3)%4;
-
-	newid2.pnums[oldid.markededge] = newp[0];
-	newid2.pnums[(oldid.markededge+3)%4] = newp[2];
-	newid2.pnums[oldid.markededge+4] = newp[1];
-	newid2.pnums[(oldid.markededge+3)%4+4] = newp[3];
-	newid2.markededge = (oldid.markededge+1)%4;
-      }
-
-    
-    int nm = oldid.marked - 1;
-    if (nm < 0) nm = 0;
-    newid1.marked = newid2.marked = nm;
-
-    newid1.incorder = newid2.incorder = 0;
-    newid1.order = newid2.order = oldid.order;
-  }
-
-
-
-  void BTBisectTri (const MarkedTri & oldtri, int newp, const PointGeomInfo & newpgi,
-		    MarkedTri & newtri1, MarkedTri & newtri2)
-  {
-    int i;
-
-    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;
-
-    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];
-      }  
-
-/*    if (oldquad.marked==1) // he/sz: 2d quads or 3d prism
-    {   
-      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;
-    }
-      
-    else if (oldquad.marked==2) // he/sz: 2d quads only
-    {
-      newquad1.pnums[0] = newp1;
-      newquad1.pnums[1] = newp2;
-      newquad1.pnums[3] = oldquad.pnums[2];  
-      newquad1.pnums[2] = oldquad.pnums[0]; 
-      newquad1.pgeominfo[0] = npgi1;
-      newquad1.pgeominfo[1] = npgi2;
-      newquad1.pgeominfo[3] = oldquad.pgeominfo[2]; 
-      newquad1.pgeominfo[2] = oldquad.pgeominfo[0];
-
-      newquad2.pnums[0] = newp2;
-      newquad2.pnums[1] = newp1;
-      newquad2.pnums[3] = oldquad.pnums[1];  
-      newquad2.pnums[2] = oldquad.pnums[3]; 
-      newquad2.pgeominfo[0] = npgi2;
-      newquad2.pgeominfo[1] = npgi1;
-      newquad2.pgeominfo[3] = oldquad.pgeominfo[1]; 
-      newquad2.pgeominfo[2] = oldquad.pgeominfo[3];
-    }
-      
-    */
-      
-    if (oldquad.markededge==0 || oldquad.markededge==2)
-    {
-      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;
-    }
-    else // 1 || 3 
-    {
-      newquad1.pnums[2] = newp1;
-      newquad1.pgeominfo[2] = npgi1;
-      newquad1.pnums[3] = newp2;
-      newquad1.pgeominfo[3] = npgi2;
-
-      newquad2.pnums[0] = newp1;
-      newquad2.pgeominfo[0] = npgi1;
-      newquad2.pnums[1] = newp2;
-      newquad2.pgeominfo[1] = 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;
-    
-    if (nm==1)
-    {
-      newquad1.markededge=1;
-      newquad2.markededge=1;
-    }
-    else
-    {
-      newquad1.markededge=0;
-      newquad2.markededge=0;
-    }
-    
-  }
-
-
-  int MarkHangingIdentifications(T_MIDS & mids, 
-				 const INDEX_2_CLOSED_HASHTABLE<int> & cutedges)
-  {
-    int i, j;
-    
-    int hanging = 0;
-    for (i = 1; i <= mids.Size(); i++)
-      {
-	if (mids.Elem(i).marked)
-	  {
-	    hanging = 1;
-	    continue;
-	  }
-
-	const int np = mids.Get(i).np;
-
-	for(j = 0; j < np; j++)
-	  {
-	    INDEX_2 edge1(mids.Get(i).pnums[j],
-			  mids.Get(i).pnums[(j+1) % np]);
-	    INDEX_2 edge2(mids.Get(i).pnums[j+np],
-			  mids.Get(i).pnums[((j+1) % np) + np]);
-
-	    edge1.Sort();
-	    edge2.Sort();
-	    if (cutedges.Used (edge1) ||
-		cutedges.Used (edge2))
-	      {
-		mids.Elem(i).marked = 1;
-		hanging = 1;
-	      }
-	  }
-      }
-
-    return hanging;
-  }
-
-
-  /*
-  void IdentifyCutEdges(Mesh & mesh,
-			INDEX_2_CLOSED_HASHTABLE<int> & cutedges)
-  {
-    int i,j,k;
-
-    ARRAY< ARRAY<int,PointIndex::BASE>* > idmaps;
-    for(i=1; i<=mesh.GetIdentifications().GetMaxNr(); i++)
-      {
-	idmaps.Append(new ARRAY<int,PointIndex::BASE>);
-	mesh.GetIdentifications().GetMap(i,*idmaps.Last());
-      }
-
-
-    
-    for(SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
-      {
-	const Element2d & el2d = mesh[sei];
-	
-	for(i = 0; i < el2d.GetNP(); i++)
-	  {
-	    INDEX_2 e1(el2d[i], el2d[(i+1) % el2d.GetNP()]);
-	    e1.Sort();
-
-	    if(!cutedges.Used(e1))
-	      continue;
-
-	    
-	    for(k = 0; k < idmaps.Size(); k++)
-	      {
-		INDEX_2 e2((*idmaps[k])[e1.I1()],
-			   (*idmaps[k])[e1.I2()]);
-		
-		if(e2.I1() == 0 || e2.I2() == 0 ||
-		   e1.I1() == e2.I1() || e1.I2() == e2.I2())
-		  continue;
-		
-		e2.Sort();
-
-		if(cutedges.Used(e2))
-		  continue;
-
-		Point3d np = Center(mesh.Point(e2.I1()),
-				    mesh.Point(e2.I2()));
-		int newp = mesh.AddPoint(np);
-		cutedges.Set(e2,newp);
-		(*testout) << "DAAA" << endl;
-	      }
-	  }
-      }
-
-    
-    for(i=0; i<idmaps.Size(); i++)
-      delete idmaps[i];
-    idmaps.DeleteAll();
-  }
-  */
-
-
-  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;
-            mquads.Elem(i).markededge = 0;
-	    hanging = 1;
-            continue;
-	  }
-          
-        // he/sz: second case: split horizontally
-        INDEX_2 edge3(mquads.Get(i).pnums[1],
-                      mquads.Get(i).pnums[3]);
-        INDEX_2 edge4(mquads.Get(i).pnums[2],
-                      mquads.Get(i).pnums[0]);
-
-        edge3.Sort();
-        edge4.Sort();
-        if (cutedges.Used (edge3) ||
-            cutedges.Used (edge4))
-        {
-          mquads.Elem(i).marked = 1;
-          mquads.Elem(i).markededge = 1;
-          hanging = 1; 
-          continue; 
-        }
-    
-      }
-    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_MIDS mids;
-  T_MTRIS mtris;
-  T_MQUADS mquads;
-
-
-  void WriteMarkedElements(ostream & ost)
-  {
-    ost << "Marked Elements\n";
-
-    ost << mtets.Size() << "\n";
-    for(int i=0; i<mtets.Size(); i++)
-      ost << mtets[i];
-
-    ost << mprisms.Size() << "\n";
-    for(int i=0; i<mprisms.Size(); i++)
-      ost << mprisms[i];
-
-    ost << mids.Size() << "\n";
-    for(int i=0; i<mids.Size(); i++)
-      ost << mids[i];
-
-    ost << mtris.Size() << "\n";
-    for(int i=0; i<mtris.Size(); i++)
-      ost << mtris[i];
-
-    ost << mquads.Size() << "\n";
-    for(int i=0; i<mquads.Size(); i++)
-      ost << mquads[i];
-    ost << endl;
-  }
-
-  bool ReadMarkedElements(istream & ist, const Mesh & mesh)
-  {
-    string auxstring("");
-    if(ist)
-      ist >> auxstring;
-
-    if(auxstring != "Marked")
-      return false;
-
-    if(ist)
-      ist >> auxstring;
-
-    if(auxstring != "Elements")
-      return false;
-
-    int size;
-
-    ist >> size;
-    mtets.SetSize(size);
-    for(int i=0; i<size; i++)
-		{
-			ist >> mtets[i];
-			if(mtets[i].pnums[0] > mesh.GetNV() || 
-				mtets[i].pnums[1] > mesh.GetNV() || 
-				mtets[i].pnums[2] > mesh.GetNV() || 
-				mtets[i].pnums[3] > mesh.GetNV())
-				return false;
-		}
-
-    ist >> size;
-    mprisms.SetSize(size);
-    for(int i=0; i<size; i++)
-      ist >> mprisms[i];
-
-    ist >> size;
-    mids.SetSize(size);
-    for(int i=0; i<size; i++)
-      ist >> mids[i];
-
-    ist >> size;
-    mtris.SetSize(size);
-    for(int i=0; i<size; i++)
-      ist >> mtris[i];
-
-    ist >> size;
-    mquads.SetSize(size);
-    for(int i=0; i<size; i++)
-      ist >> mquads[i];
-
-    return true;
-  }
-
-
-
-
-
-  void BisectTetsCopyMesh (Mesh & mesh, const class CSGeometry *,
-			   BisectionOptions & opt,
-			   const ARRAY< ARRAY<int,PointIndex::BASE>* > & idmaps,
-			   const string & refinfofile)
-  {
-    mtets.SetName ("bisection, tets");
-    mprisms.SetName ("bisection, prisms");
-    mtris.SetName ("bisection, trigs");
-    mquads.SetName ("bisection, quads");
-    mids.SetName ("bisection, identifications");
-
-    //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;
-    */
-
-    bool readok = false;
-
-    if(refinfofile != "")
-      {
-	PrintMessage(3,"Reading marked-element information from \"",refinfofile,"\"");
-	ifstream ist(refinfofile.c_str());
-
-	readok = ReadMarkedElements(ist,mesh);
-
-	ist.close();
-      }
-
-    if(!readok)
-      {
-	PrintMessage(3,"resetting marked-element information");
-	mtets.SetSize(0);
-	mprisms.SetSize(0);
-	mids.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, idmaps, 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);
-	      }
-	    
-	    MarkedIdentification mi;
-	    for(j=0; j<idmaps.Size(); j++)
-	      if(BTDefineMarkedId(el, edgenumber, *idmaps[j], mi))
-		mids.Append(mi);
-	  }
-      }
-	
-
-
-
-    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;
-  
-    if (printmessage_importance>0)
-    {
-      ostringstream str1,str2;
-      str1 << "copied " << mtets.Size() << " tets, " << mprisms.Size() << " prisms";
-      str2 << "       " << mtris.Size() << " trigs, " << mquads.Size() << " quads";
-
-      PrintMessage(4,str1.str());
-      PrintMessage(4,str2.str());
-    }
-  }
-
-
-  /*
-  void UpdateEdgeMarks2(Mesh & mesh,
-			const ARRAY< ARRAY<int,PointIndex::BASE>* > & idmaps)
-  {
-    ARRAY< ARRAY<MarkedTet>*,PointIndex::BASE > mtets_old(mesh.GetNP());
-    ARRAY< ARRAY<MarkedPrism>*,PointIndex::BASE > mprisms_old(mesh.GetNP());
-    ARRAY< ARRAY<MarkedIdentification>*,PointIndex::BASE > mids_old(mesh.GetNP());
-    ARRAY< ARRAY<MarkedTri>*,PointIndex::BASE > mtris_old(mesh.GetNP());
-    ARRAY< ARRAY<MarkedQuad>*,PointIndex::BASE > mquads_old(mesh.GetNP());
-
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      mtets_old[i] = new ARRAY<MarkedTet>;
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      mprisms_old[i] = new ARRAY<MarkedPrism>;
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      mids_old[i] = new ARRAY<MarkedIdentification>;
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      mtris_old[i] = new ARRAY<MarkedTri>;
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      mquads_old[i] = new ARRAY<MarkedQuad>;
-
-    for(int i=0; i<mtets.Size(); i++)
-      mtets_old[mtets[i].pnums[0]]->Append(mtets[i]);
-    for(int i=0; i<mprisms.Size(); i++)
-      mprisms_old[mprisms[i].pnums[0]]->Append(mprisms[i]);
-    for(int i=0; i<mids.Size(); i++)
-      mids_old[mids[i].pnums[0]]->Append(mids[i]);
-    for(int i=0; i<mtris.Size(); i++)
-      {
-	(*testout) << "i " << i << endl;
-	(*testout) << "mtris[i] " << mtris[i].pnums[0] << " " << mtris[i].pnums[1] << " " << mtris[i].pnums[2] << endl; 
-	mtris_old[mtris[i].pnums[0]]->Append(mtris[i]);
-      }
-    for(int i=0; i<mquads.Size(); i++)
-      mquads_old[mquads[i].pnums[0]]->Append(mquads[i]);
-
-   
-    
-    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);
-    mids.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, idmaps, 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;
-		  
-		  int oldind = -1;
-		  for(l = 0; oldind < 0 && l<mtets_old[el[0]]->Size(); l++)
-		    if(el[1] == (*mtets_old[el[0]])[l].pnums[1] &&
-		       el[2] == (*mtets_old[el[0]])[l].pnums[2] &&
-		       el[3] == (*mtets_old[el[0]])[l].pnums[3])
-		      oldind = l;
-
-		  if(oldind >= 0)
-		    mtets.Append((*mtets_old[el[0]])[oldind]);
-		  else
-		    {
-		      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);
-	  }
-	
-	MarkedIdentification mi;
-
-	
-
-	for(j=0; j<idmaps.Size(); j++)
-	  if(BTDefineMarkedId(el, edgenumber, *idmaps[j], mi))
-	    {
-	      mids.Append(mi);
-		
-	      int oldind = -1;
-	      for(l = 0; oldind < 0 && l<mids_old[mi.pnums[0]]->Size(); l++)
-		{
-		  bool equal = true;
-		  for(int m = 1; equal && m < mi.np; m++)
-		    equal = (mi.pnums[m] == (*mids_old[el[0]])[l].pnums[m]);
-		  if(equal)
-		    oldind = l;
-		}
-
-	      if(oldind >= 0)
-		mids.Last() = (*mids_old[mi.pnums[0]])[oldind];
-	    }
-
-      }
-
-
-
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      delete mtets_old[i];
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      delete mprisms_old[i];
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      delete mids_old[i];
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      delete mtris_old[i];
-    for(int i=PointIndex::BASE; i<mesh.GetNP()+PointIndex::BASE; i++)
-      delete mquads_old[i];
-  }
-*/
-
-  
-  void UpdateEdgeMarks (Mesh & mesh,
-			const ARRAY< ARRAY<int,PointIndex::BASE>* > & idmaps)
-  //const ARRAY < ARRAY<Element>* > & elements_before,
-  //const ARRAY < ARRAY<int>* > & markedelts_num,
-  //		const ARRAY < ARRAY<Element2d>* > & surfelements_before,
-  //		const ARRAY < ARRAY<int>* > & markedsurfelts_num)
-  {
-    T_MTETS mtets_old; mtets_old.Copy(mtets);
-    T_MPRISMS mprisms_old; mprisms_old.Copy(mprisms);
-    T_MIDS mids_old; mids_old.Copy(mids);
-    T_MTRIS mtris_old; mtris_old.Copy(mtris);
-    T_MQUADS mquads_old; mquads_old.Copy(mquads);
-
-
-
-    
-    mtets.SetSize(0);
-    mprisms.SetSize(0);
-    mids.SetSize(0);
-    mtris.SetSize(0);
-    mquads.SetSize(0);
-
-    //int nv = mesh.GetNV();
-
-
-    INDEX_2_CLOSED_HASHTABLE<int> edgenumber(9*mesh.GetNE()+4*mesh.GetNSE());  
-    
-    int maxnum = BTSortEdges (mesh, idmaps, edgenumber);
-
-    for(int m = 0; m < mtets_old.Size(); m++)
-      {
-	MarkedTet & mt = mtets_old[m];
-
-	//(*testout) << "old mt " << mt;
-	
-	INDEX_2 edge (mt.pnums[mt.tetedge1],mt.pnums[mt.tetedge2]);
-	edge.Sort();
-	if(edgenumber.Used(edge))
-	  {
-	    int val = edgenumber.Get(edge);
-	    //(*testout) << "set voledge " << edge << " from " << val;
-	    if(val <= maxnum)
-	      {
-		val += 2*maxnum;
-		edgenumber.Set(edge,val);
-	      }
-	    else if(val <= 2*maxnum)
-	      {
-		val += maxnum;
-		edgenumber.Set(edge,val);
-	      }
-	    //(*testout) << " to " << val << endl;
-	  }
-	
-	for(int k=0; k<4; k++)
-	  for(int i=0; i<3; i++)
-	    for(int j=i+1; i != k && j<4; j++)
-	      if(j != k && mt.faceedges[k] == 6-k-i-j)
-		{
-		  edge[0] = mt.pnums[i];
-		  edge[1] = mt.pnums[j];
-		  edge.Sort();
-		  if(edgenumber.Used(edge))
-		    {
-		      int val = edgenumber.Get(edge);
-		      //(*testout) << "set faceedge " << edge << " from " << val;
-		      if(val <= maxnum)
-			{
-			  val += maxnum;
-			  edgenumber.Set(edge,val);
-			}
-		      //(*testout) << " to " << val << endl;
-		    }		      
-		}
-      }
-
-	
-    
-    
-    for(ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-      {
-	const Element & el = mesh[ei];
-	
-	//int pos = elements_before[el[0]]->Pos(el);
-	//int elnum = (pos >= 0) ? (*markedelts_num[el[0]])[pos] : -1;
-	 
-	switch (el.GetType())
-	  {
-	  case TET:
-	  case TET10:
-	    {
-	      //if(elnum >= 0)
-	      // {
-	      //   mtets.Append(mtets_old[elnum]);
-	      // } 
-	      //else
-	      // {
-	      MarkedTet mt;
-	      BTDefineMarkedTet (el, edgenumber, mt);
-	      mt.matindex = el.GetIndex();
-	      
-	      mtets.Append (mt);
-	    
-	      //(*testout) << "mtet " << mtets.Last() << endl;
-	      break;
-	    }
-	  case PYRAMID:
-	    {
-	      cerr << "Refinement :: UpdateEdgeMarks not yet implemented for pyramids"
-		   << endl;
-	      break;
-	    }
-	    
-	  case PRISM:
-	  case PRISM12:
-	    {
-	      cerr << "Refinement :: UpdateEdgeMarks not yet implemented for prisms"
-		   << endl;
-	      break;
-	    }
-	  }
-	
-      }
-    
-
-    
-     for(SurfaceElementIndex sei = 0; sei < mesh.GetNSE(); sei++)
-       {
-	 const Element2d & el = mesh[sei];
-
-	 /*
-	 for(int k=0; k<3; k++)
-	   auxind3[k] = el[k];
-
-	 auxind3.Sort();
-	 
-	 int pos = oldfaces[auxind3[0]]->Pos(auxind3);
-	 if(pos < 0)
-	   cout << "UIUIUI" << endl;
-	 */	 
-	 
-	 switch (el.GetType())
-	   {
-	   case TRIG:
-	   case TRIG6:
-	     {
-	       MarkedTri mt;
-	       BTDefineMarkedTri (el, edgenumber, mt);
-	       mtris.Append (mt);
-	       break;
-	     }
-	     
-	   case QUAD:
-	   case QUAD6:
-	     {
-	       MarkedQuad mt;
-	       BTDefineMarkedQuad (el, edgenumber, mt);
-	       mquads.Append (mt);
-	       break;
-	     }
-	   }
-
-	 
-	MarkedIdentification mi;
-	for(int j=0; j<idmaps.Size(); j++)
-	  if(BTDefineMarkedId(el, edgenumber, *idmaps[j], mi))
-	    mids.Append(mi);
-
-
-	 /*
-	 int pos = surfelements_before[el[0]]->Pos(el);
-	 int elnum = (pos >= 0) ? (*markedsurfelts_num[el[0]])[pos] : -1;
-	 
-	 
-	 switch (el.GetType())
-	   {
-	   case TRIG:
-	   case TRIG6:
-	     {
-	       if(elnum >= 0)
-		 mtris.Append(mtris_old[elnum]);
-	       else
-		 {
-		   MarkedTri mt;
-		   BTDefineMarkedTri (el, edgenumber, mt);
-		   mtris.Append (mt);
-		   (*testout) << "(new) ";
-		 }
-	       (*testout) << "mtri " << mtris.Last();
-	       break;
-	     }
-	     
-	   case QUAD:
-	   case QUAD6:
-	     {
-	       if(elnum >= 0)
-		 mquads.Append(mquads_old[elnum]);
-	       else
-		 {
-		   MarkedQuad mt;
-		   BTDefineMarkedQuad (el, edgenumber, mt);
-		   mquads.Append (mt);
-		 }
-	       break;
-	     }
-	   }
-	 */
-       }
-     
-     /*
-     for(int i=0; i<oldfaces.Size(); i++)
-       {
-	 delete oldfaces[i];
-	 delete oldmarkededges[i];
-       }
-     */
-     
-  }
-				      
-
-
-
-  void Refinement :: Bisect (Mesh & mesh, 
-			     BisectionOptions & opt,
-			     ARRAY<double> * quality_loss)
-  {
-    PrintMessage(1,"Mesh bisection");
-    PushStatus("Mesh bisection");
-
-    static int localizetimer = NgProfiler::CreateTimer("localize edgepoints");
-    NgProfiler::RegionTimer * loct = new NgProfiler::RegionTimer(localizetimer);   
-    LocalizeEdgePoints(mesh);
-    delete loct;
-
-    ARRAY< ARRAY<int,PointIndex::BASE>* > idmaps;
-    for(int i=1; i<=mesh.GetIdentifications().GetMaxNr(); i++)
-      {
-	if(mesh.GetIdentifications().GetType(i) == Identifications::PERIODIC)
-	  {
-	    idmaps.Append(new ARRAY<int,PointIndex::BASE>);
-	    mesh.GetIdentifications().GetMap(i,*idmaps.Last(),true);
-	  }
-      }
-
-    
-    string refelementinfofileread = "";
-    string refelementinfofilewrite = "";
-
-    if(opt.refinementfilename)
-      {
-	ifstream inf(opt.refinementfilename);
-	string st;
-	inf >> st;
-	if(st == "refinementinfo")
-	  {
-	    while(inf)
-	      {
-		while(inf && st != "markedelementsfile")
-		  inf >> st;
-		
-		if(inf)
-		  inf >> st;
-		
-		if(st == "read" && inf)
-		  ReadEnclString(inf,refelementinfofileread,'\"');
-		else if(st == "write" && inf)
-		  ReadEnclString(inf,refelementinfofilewrite,'\"');
-	      }
-	  }
-	inf.close();
-      }
-	
-
-
-    if (mesh.mglevels == 1 || idmaps.Size() > 0)
-      BisectTetsCopyMesh(mesh, NULL, opt, idmaps, refelementinfofileread);
-
-
-    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 ox,oy,oz; 
-	for (ElementIndex ei = 0; ei < ne; ei++)
-	  if (mesh[ei].TestRefinementFlag())
-	    {
-	      mesh[ei].GetOrder(ox,oy,oz);
-	      mesh[ei].SetOrder (ox+1,oy+1,oz+1);
-	      if (mesh[ei].TestStrongRefinementFlag())
-		mesh[ei].SetOrder (ox+2,oy+2,oz+2);
-	    }
-	for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-	  if (mesh[sei].TestRefinementFlag())
-	    {
-	      mesh[sei].GetOrder(ox,oy);
-	      mesh[sei].SetOrder(ox+1,oy+1);
-	      if (mesh[sei].TestStrongRefinementFlag())
-		mesh[sei].SetOrder(ox+2,oy+2);
-	    }
-
-	/*
-	  #ifndef SABINE //Nachbarelemente mit ordx,ordy,ordz 
-      
-	  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);
-	    
-	  #endif
-	*/
-
-	PopStatus();
-	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()));
-
-    bool noprojection = false;
-
-    for (l = 1; l <= 1; l++)
-      {
-	int marked = 0;
-	if (opt.refinementfilename)
-	  {
-	    ifstream inf(opt.refinementfilename);
-	    PrintMessage(3,"load refinementinfo from file ",opt.refinementfilename);
-
-	    string st;
-	    inf >> st;
-	    if(st == "refinementinfo")
-	      // new version
-	      {
-		for(i=1; i<=mtets.Size(); i++)
-		  mtets.Elem(i).marked = 0;
-		for(i=1; i<=mprisms.Size(); i++)
-		  mprisms.Elem(i).marked = 0;
-		for(i=1; i<=mtris.Size(); i++)
-		  mtris.Elem(i).marked = 0;
-		for(i=1; i<=mquads.Size(); i++)
-		  mquads.Elem(i).marked = 0;
-		for(i=1; i<=mprisms.Size(); i++)
-		  mids.Elem(i).marked = 0;
-
-		inf >> st;
-		while(inf)
-		  {
-		    if(st[0] == '#')
-		      {
-			inf.ignore(10000,'\n');
-			inf >> st;
-		      }
-		    else if(st == "markedelementsfile")
-		      {
-			inf >> st;
-			ReadEnclString(inf,st,'\"');
-			inf >> st;
-		      }
-		    else if(st == "noprojection")
-		      {
-			noprojection = true;
-			inf >> st;
-		      }
-		    else if(st == "refine")
-		      {
-			inf >> st;
-			if(st == "elements")
-			  {
-			    inf >> st;
-			    bool isint = true;
-				for(string::size_type ii=0; isint && ii<st.size(); ii++)
-			      isint = (isdigit(st[ii]) != 0);
-			    
-			    while(inf && isint)
-			      {
-				mtets.Elem(atoi(st.c_str())).marked = 3;
-				marked = 1;
-
-				inf >> st;
-				isint = true;
-				for(string::size_type ii=0; isint && ii<st.size(); ii++)
-				  isint = (isdigit(st[ii]) != 0);
-			      }
-			  }
-			else if(st == "orthobrick")
-			  {
-			    double bounds[6];
-			    for(i=0; i<6; i++)
-			      inf >> bounds[i];
-			    
-			    int cnt = 0;
-
-			    for(ElementIndex ei = 0; ei < mesh.GetNE(); ei++)
-			      {
-				const Element & el = mesh[ei];
-				
-				//
-				Point<3> center(0,0,0);
-				for(i=0; i<el.GetNP(); i++)
-				  {
-				    const MeshPoint & point = mesh[el[i]];
-				    center(0) += point(0);
-				    center(1) += point(1);
-				    center(2) += point(2);
-				  }
-				for(i=0; i<3; i++)
-				  center(i) *= 1./double(el.GetNP());
-				if(bounds[0] <= center(0) && center(0) <= bounds[3] &&
-				   bounds[1] <= center(1) && center(1) <= bounds[4] &&
-				   bounds[2] <= center(2) && center(2) <= bounds[5])
-				  {
-				    mtets[ei].marked = 3;
-				    cnt++;
-				  }
-				
-				  
-// 				bool contained = false;
-// 				for(int i=0; !contained && i<el.GetNP(); i++)
-// 				  {
-// 				    const MeshPoint & point = mesh[el[i]];
-// 				    contained = (bounds[0] <= point.X() && point.X() <= bounds[3] &&
-// 						 bounds[1] <= point.Y() && point.Y() <= bounds[4] &&
-// 						 bounds[2] <= point.Z() && point.Z() <= bounds[5]);
-// 				  }
-// 				if(contained)
-// 				  {
-// 				    mtets[ei].marked = 3;
-// 				    cnt++;
-// 				  }
-			      }
-
-
-			    ostringstream strstr;
-			    strstr.precision(2);
-			    strstr << "marked " << float(cnt)/float(mesh.GetNE())*100. 
-#ifdef WIN32
-				   << "%%"
-#else
-				   << "%"
-#endif
-				   <<" of the elements";
-			    PrintMessage(4,strstr.str());
-
-			    if(cnt > 0)
-			      marked = 1;
-
-
-			    inf >> st;
-			  }
-			else
-			  {
-			    throw NgException("something wrong with refinementinfo file");
-			  }
-		      }
-		  }		
-	      }
-	    else
-	      {
-		inf.close();
-		inf.open(opt.refinementfilename);
-
-		char ch;
-		for (i = 1; i <= mtets.Size(); i++)
-		  {
-		    inf >> ch;
-		    if(!inf)
-		      throw NgException("something wrong with refinementinfo file (old format)");
-		    mtets.Elem(i).marked = (ch == '1');
-		  }
-		marked = 1;
-	      }
-	    inf.close();
-	  }
-
-	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;
-	    */
-
-	    if (printmessage_importance>0)
-	      {
-		ostringstream str;
-		str << "marked elements: " << cntm;
-		PrintMessage(4,str.str());
-	      }
-
-	    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++;
-                    // 2d: marked=2, 3d prisms: marked=1
-		    mquads.Elem(cntquad).marked =
-                        mesh.SurfaceElement(i).TestRefinementFlag() ? 4-mesh.GetDimension() : 0 ;
-		    // mquads.Elem(cntquad).marked = 0;
-		    if (mquads.Elem(cntquad).marked)
-		      cntm++;
-		  }
-	      }
-
-              if (printmessage_importance>0)
-		{
-		  ostringstream str;
-		  str << "with surface-elements: " << cntm;
-		  PrintMessage(4,str.str());
-		}
-
-            // he/sz: das wird oben schon richtig gemacht.
-            // hier sind die quads vergessen!
-            /*
-	    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;
-        
-
-	//(*testout) << "mtets " << mtets << endl;
-
-	if (opt.refine_p)
-	  {
-	    PrintMessage(3,"refine p");
-
-	    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)
-	  {
-	    PrintMessage(3,"refine hp");
-	    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);
-		  }
-		/*
-		  for ( i=1; i<= mesh.GetNSE(); i++)
-		  {
-		  const Element2d & sel = mesh.SurfaceElement(i);
-		  for(int j=1; j<=sel.GetNP(); j++)
-		  singv.Set(sel.PNum(j));
-		  }
-		*/
-	      }
-	    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 (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;
-
-	//cout << "write?" << endl;
-	//string yn;
-	//cin >> yn;
-
-	(*testout) << "refine volume elements" << endl;
-	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);
-		  //if(yn == "y")
-		  //  (*testout) << "bisected tet " << oldtet;
-		  INDEX_2 edge(oldtet.pnums[oldtet.tetedge1],
-			       oldtet.pnums[oldtet.tetedge2]);
-		  edge.Sort();
-		  if (cutedges.Used (edge))
-		    {
-		      newp = cutedges.Get(edge);
-		    }
-		  else
-		    {
-		      Point<3> npt = Center (mesh.Point (edge.I1()),
-					   mesh.Point (edge.I2()));
-		      newp = mesh.AddPoint (npt);
-		      cutedges.Set (edge, newp);
-		    }
-
-		  BTBisectTet (oldtet, newp, newtet1, newtet2);
-
-		  mtets.Elem(i) = newtet1;
-		  mtets.Append (newtet2);
-		  //if(yn == "y")
-		  //  (*testout) << "and got " << newtet1 << "and " << newtet2 << endl;
-
-		  mesh.mlparentelement.Append (i);
-		}
-
-	    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
-		    {
-		      Point<3> npt = Center (mesh.Point (edge1.I1()),
-					    mesh.Point (edge1.I2()));
-		      newp1 = mesh.AddPoint (npt);
-		      cutedges.Set (edge1, newp1);
-		    }
-		  if (cutedges.Used (edge2))
-		    newp2 = cutedges.Get(edge2);
-		  else
-		    {
-		      Point<3> npt = Center (mesh.Point (edge2.I1()),
-					    mesh.Point (edge2.I2()));
-		      newp2 = mesh.AddPoint (npt);
-		      cutedges.Set (edge2, newp2);
-		    }
-		
-
-		  BTBisectPrism (oldprism, newp1, newp2, newprism1, newprism2);
-		  //if(yn == "y")
-		  //  (*testout) << "bisected prism " << oldprism << "and got " << newprism1 << "and " << newprism2 << endl;
-		  mprisms.Elem(i) = newprism1;
-		  mprisms.Append (newprism2);
-		}
-
-	    int nid = mids.Size();
-	    for (i = 1; i <= nid; i++)
-	      if (mids.Elem(i).marked)
-		{
-		  MarkedIdentification oldid,newid1,newid2;
-		  ARRAY<int> newp;
-
-		  oldid = mids.Get(i);
-		  
-		  ARRAY<INDEX_2> edges;
-		  edges.Append(INDEX_2(oldid.pnums[oldid.markededge],
-				       oldid.pnums[(oldid.markededge+1)%oldid.np]));
-		  edges.Append(INDEX_2(oldid.pnums[oldid.markededge + oldid.np],
-				       oldid.pnums[(oldid.markededge+1)%oldid.np + oldid.np]));
-
-		  if(oldid.np == 4)
-		    {
-		      edges.Append(INDEX_2(oldid.pnums[(oldid.markededge+2)%oldid.np],
-					   oldid.pnums[(oldid.markededge+3)%oldid.np]));
-		      edges.Append(INDEX_2(oldid.pnums[(oldid.markededge+2)%oldid.np + oldid.np],
-					   oldid.pnums[(oldid.markededge+3)%oldid.np + oldid.np]));
-		    }
-		  for (j = 0; j < edges.Size(); j++)
-		    {
-		      edges[j].Sort();
-
-		      if(cutedges.Used(edges[j]))
-			newp.Append(cutedges.Get(edges[j]));
-		      else
-			{
-			  Point<3> npt = Center (mesh.Point (edges[j].I1()),
-						mesh.Point (edges[j].I2()));
-			  newp.Append(mesh.AddPoint(npt));
-			  cutedges.Set(edges[j],newp[j]);
-			}			 
-		    }
-		  
-		  BTBisectIdentification(oldid,newp,newid1,newid2);
-		  mids.Elem(i) = newid1;
-		  mids.Append(newid2);		  
-		}
-
-	    
-	    //IdentifyCutEdges(mesh, cutedges);
-
-
-	    hangingvol = 
-	      MarkHangingTets (mtets, cutedges) +
-	      MarkHangingPrisms (mprisms, cutedges) +
-	      MarkHangingIdentifications (mids, cutedges);
-
-
-	    int nsel = mtris.Size();
-
-	    for (i = 1; i <= nsel; i++)
-	      if (mtris.Elem(i).marked)
-		{
-		  MarkedTri oldtri;
-		  MarkedTri newtri1, newtri2;
-		  PointIndex 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
-		    {
-		      Point<3> npt = Center (mesh.Point (edge.I1()),
-					    mesh.Point (edge.I2()));
-		      newp = mesh.AddPoint (npt);
-                      cutedges.Set (edge, newp);
-		    }
-		  //		newp = cutedges.Get(edge);
-		
-		  int si = mesh.GetFaceDescriptor (oldtri.surfid).SurfNr();
-		  //  geom->GetSurface(si)->Project (mesh.Point(newp));
-		  PointGeomInfo npgi;
-		
-//                   cerr << "project point " << newp << " old: " << mesh.Point(newp);
-                  if (mesh[newp].Type() != 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);
-//                   cerr << " new: " << mesh.Point(newp) << endl;
-		
-		  BTBisectTri (oldtri, newp, npgi, newtri1, newtri2);
-		  //if(yn == "y")
-		  //  (*testout) << "bisected tri " << oldtri << "and got " << newtri1 << "and " << newtri2 << endl;
-		
-		
-		  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]);
-                  */
-                  INDEX_2 edge1, edge2;
-                  PointGeomInfo pgi11, pgi12, pgi21, pgi22;
-                  if (oldquad.markededge==0 || oldquad.markededge==2)
-                  {
-                    edge1.I1()=oldquad.pnums[0]; pgi11=oldquad.pgeominfo[0];
-                    edge1.I2()=oldquad.pnums[1]; pgi12=oldquad.pgeominfo[1];
-                    edge2.I1()=oldquad.pnums[2]; pgi21=oldquad.pgeominfo[2];
-                    edge2.I2()=oldquad.pnums[3]; pgi22=oldquad.pgeominfo[3];
-                  }
-                  else // 3 || 1
-                  {
-                    edge1.I1()=oldquad.pnums[0]; pgi11=oldquad.pgeominfo[0];
-                    edge1.I2()=oldquad.pnums[2]; pgi12=oldquad.pgeominfo[2];
-                    edge2.I1()=oldquad.pnums[1]; pgi21=oldquad.pgeominfo[1];
-                    edge2.I2()=oldquad.pnums[3]; pgi22=oldquad.pgeominfo[3];
-                  }
-                  
-                  edge1.Sort();
-		  edge2.Sort();
-
-		  if (cutedges.Used (edge1))
-		    {
-		      newp1 = cutedges.Get(edge1);
-		    }
-		  else
-		    {
-		      Point<3> np1 = Center (mesh.Point (edge1.I1()),
-					   mesh.Point (edge1.I2()));
-		      newp1 = mesh.AddPoint (np1);
-		      cutedges.Set (edge1, newp1);
-                    }
-
-		  if (cutedges.Used (edge2))
-		    {
-		      newp2 = cutedges.Get(edge2);
-		    }
-		  else
-		    {
-		      Point<3> np2 = Center (mesh.Point (edge2.I1()),
-					   mesh.Point (edge2.I2()));
-		      newp2 = mesh.AddPoint (np2);
-		      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)
-//                   cerr << "project point 1 " << newp1 << " old: " << mesh.Point(newp1);
-                  PointBetween (mesh.Point (edge1.I1()), mesh.Point (edge1.I2()),
-				0.5, si,
-				pgi11,
-				pgi12,
-				mesh.Point (newp1), npgi1);
-// 		  (*testout)
-//                   cerr << " new: " << mesh.Point(newp1) << endl;
-
-		
-//                   cerr << "project point 2 " << newp2 << " old: " << mesh.Point(newp2);
-                  PointBetween (mesh.Point (edge2.I1()), mesh.Point (edge2.I2()),
-				0.5, si,
-				pgi21,
-				pgi22,
-				mesh.Point (newp2), npgi2);
-//                   cerr << " new: " << mesh.Point(newp2) << endl;
-		
-
-		  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;
-		  
- 
-//                     
-//                     cerr << "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);
-// 		    cerr << " to " << mesh.Point (newpi) << endl;
-
-		    
-		    nseg1.epgeominfo[1] = newepgi;
-		    nseg2.epgeominfo[0] = newepgi;
-		  
-		    mesh.LineSegment (i) = nseg1;
-		    mesh.AddSegment (nseg2);
-		  }
-	      }
-	  }
-	while (hangingvol || hangingsurf || hangingedge);
-        
-        if (printmessage_importance>0)
-	  {
-	    ostringstream strstr;
-	    strstr << mtets.Size() << " tets" << endl
-		   << mtris.Size() << " trigs" << endl;
-	    if (mprisms.Size())
-	      {
-		strstr << mprisms.Size() << " prisms" << endl
-		       << mquads.Size() << " quads" << endl;
-	      }
-	    strstr << mesh.GetNP() << " points";
-	    PrintMessage(4,strstr.str());
-	    
-	  }
-      }
-
-
-    // (*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 (int(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 (int(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 (int(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 (int(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());
-    mids.SetAllocSize (mids.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)
-      {
-	PrintMessage(4,"RESETTING mlbetweennodes");
-	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;
-      }
-    */
-
-    BitArray isnewpoint(np);
-    isnewpoint.Clear();
-
-    for (i = 1; i <= cutedges.Size(); i++)
-      if (cutedges.UsedPos(i))
-	{
-	  INDEX_2 edge;
-	  int newpi;
-	  cutedges.GetData (i, edge, newpi);
-	  isnewpoint.Set(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();
-
-  
-    
-    // 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);
-		}
-	    }
-      }
-
-    
-
-
-    
-    bool do_repair = true;
-
-    //if(mesh.mglevels == 3)
-    //  noprojection = true;
-
-    //noprojection = true;
-
-    if(noprojection)
-      {
-	do_repair = false;
-	for(int ii=1; ii<=mesh.GetNP(); ii++)
-	  {
-	    if(isnewpoint.Test(ii) && mesh.mlbetweennodes[ii][0] > 0)
-	      {
-		mesh.Point(ii) = Center(mesh.Point(mesh.mlbetweennodes[ii][0]),mesh.Point(mesh.mlbetweennodes[ii][1]));
-	      }
-	  }
-      }
-
-
-    // Check/Repair
-
-	//cout << "Hallo Welt" << endl;
-	//getchar();
-
-    static bool repaired_once;
-    if(mesh.mglevels == 1)
-      repaired_once = false;
-
-    //mesh.Save("before.vol");
-
-    static int reptimer = NgProfiler::CreateTimer("check/repair");
-	NgProfiler::RegionTimer * regt(NULL);
-    regt = new NgProfiler::RegionTimer(reptimer); 
-
-    ARRAY<ElementIndex> bad_elts;
-    ARRAY<double> pure_badness;
-   
-    if(do_repair || quality_loss != NULL)
-      {
-	pure_badness.SetSize(mesh.GetNP()+2);
-	GetPureBadness(mesh,pure_badness,isnewpoint);
-      }
-
-
-    if(do_repair)
-      {
-	const double max_worsening = 1;
-	
-	const bool uselocalworsening = false;
-	
-	bool repaired = false;
-	
-	Validate(mesh,bad_elts,pure_badness,max_worsening,uselocalworsening);
-	
-        if (printmessage_importance>0)
-	  {
-	    ostringstream strstr;
-	    for(int ii=0; ii<bad_elts.Size(); ii++)
-	      strstr << "bad element " << bad_elts[ii] << "\n";
-	    PrintMessage(1,strstr.str());
-	  }
-	if(repaired_once || bad_elts.Size() > 0)
-	  {
-	    clock_t t1(clock());
-	    
-	    
-	    // update id-maps
-	    j=0;
-	    for(i=1; i<=mesh.GetIdentifications().GetMaxNr(); i++)
-	      {
-		if(mesh.GetIdentifications().GetType(i) == Identifications::PERIODIC)
-		  {
-		    mesh.GetIdentifications().GetMap(i,*idmaps[j],true);
-		    j++;
-		  }
-	      }
-
-    
-	    // do the repair
-	    try
-	      {
-		RepairBisection(mesh,bad_elts,isnewpoint,*this,
-				pure_badness,
-				max_worsening,uselocalworsening,
-				idmaps);
-		repaired = true;
-		repaired_once = true;
-	      }
-	    catch(NgException & ex)
-	      {
-		PrintMessage(1,string("Problem: ") + ex.What());
-	      }
-
-
-            if (printmessage_importance>0)
-            {
-	      ostringstream strstr;
-              strstr << "Time for Repair: " << double(clock() - t1)/double(CLOCKS_PER_SEC) << endl
-		     << "bad elements after repair: " << bad_elts << endl;
-	      PrintMessage(1,strstr.str());
-            }
-	    
-	    if(quality_loss != NULL)
-	      Validate(mesh,bad_elts,pure_badness,1e100,uselocalworsening,quality_loss);
-
-	    if(idmaps.Size() == 0)
-	      UpdateEdgeMarks(mesh,idmaps);
-	    
-	    /*
-	    if(1==1)
-	      UpdateEdgeMarks(mesh,idmaps);
-	    else
-	      mesh.mglevels = 1;
-	    */
-	    
-	    //mesh.ImproveMesh();
-	    
-	  }
-      }
-    delete regt;
-
-
-    
-    
-
-
-
-    for(i=0; i<idmaps.Size(); i++)
-      delete idmaps[i];
-    idmaps.DeleteAll();
-
-    mesh.UpdateTopology();
-
-    if(refelementinfofilewrite != "")
-      {
-	PrintMessage(3,"writing marked-elements information to \"",refelementinfofilewrite,"\"");
-	ofstream ofst(refelementinfofilewrite.c_str());
-
-	WriteMarkedElements(ofst);
-
-	ofst.close();
-      }
-
-
-    PrintMessage (1, "Bisection done");
-
-    PopStatus();
-  }
-
-
-
-
-  BisectionOptions :: BisectionOptions ()
-  {
-    outfilename = NULL;
-    mlfilename = NULL;
-    refinementfilename = NULL;
-    femcode = NULL;
-    maxlevel = 50;
-    usemarkedelements = 0;
-    refine_hp = 0;
-    refine_p = 0;
-  }
-
-
-  Refinement :: Refinement ()
-  {
-    optimizer2d = NULL;
-  }
-
-  Refinement :: ~Refinement ()
-  {
-    ;
-  }
-
-
-  void Refinement :: PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint,
-				   int surfi, 
-				   const PointGeomInfo & gi1, 
-				   const PointGeomInfo & gi2,
-				   Point<3> & newp, PointGeomInfo & newgi)
-  {
-    newp = p1+secpoint*(p2-p1);
-  }
-
-  void Refinement :: PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint,
-				   int surfi1, int surfi2, 
-				   const EdgePointGeomInfo & ap1, 
-				   const EdgePointGeomInfo & ap2,
-				   Point<3> & newp, EdgePointGeomInfo & newgi)
-  {
-    newp = p1+secpoint*(p2-p1);
-  }
-
-
-  Vec<3> Refinement :: GetTangent (const Point<3> & p, int surfi1, int surfi2,
-                                   const EdgePointGeomInfo & ap1) const
-  {
-    cerr << "Refinement::GetTangent not overloaded" << endl;
-    return Vec<3> (0,0,0);
-  }
-
-  Vec<3> Refinement :: GetNormal (const Point<3> & p, int surfi1, 
-                                  const PointGeomInfo & gi) const
-  {
-    cerr << "Refinement::GetNormal not overloaded" << endl;
-    return Vec<3> (0,0,0);
-  }
-
-
-  void Refinement :: ProjectToSurface (Point<3> & p, int surfi)
-  {
-    if (printmessage_importance>0)
-      cerr << "Refinement :: ProjectToSurface    ERROR: no geometry set" << endl;
-  };
-
-  void Refinement :: ProjectToEdge (Point<3> & p, int surfi1, int surfi2, const EdgePointGeomInfo & egi) const
-  {
-    cerr << "Refinement::ProjectToEdge not overloaded" << endl;
-  }
-}
diff --git a/contrib/Netgen/libsrc/meshing/bisect.hpp b/contrib/Netgen/libsrc/meshing/bisect.hpp
deleted file mode 100644
index e47033f255de9ce30e1f170767629b908328d5e3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/bisect.hpp
+++ /dev/null
@@ -1,99 +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
-{
-  MeshOptimize2d * optimizer2d;
-
-public:
-  Refinement ();
-  virtual ~Refinement ();
-  
-  void Refine (Mesh & mesh);
-  void Bisect (Mesh & mesh, class BisectionOptions & opt, ARRAY<double> * quality_loss = NULL);
-  void MakeSecondOrder (Mesh & mesh);
-
-  virtual void PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint, 
-			     int surfi, 
-			     const PointGeomInfo & gi1, 
-			     const PointGeomInfo & gi2,
-			     Point<3> & newp, PointGeomInfo & newgi);
-
-  virtual void PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint,
-			     int surfi1, int surfi2, 
-			     const EdgePointGeomInfo & ap1, 
-			     const EdgePointGeomInfo & ap2,
-			     Point<3> & newp, EdgePointGeomInfo & newgi);
-
-  virtual Vec<3> GetTangent (const Point<3> & p, int surfi1, int surfi2,
-                             const EdgePointGeomInfo & egi) const;
-
-  virtual Vec<3> GetNormal (const Point<3> & p, int surfi1, 
-                            const PointGeomInfo & gi) const;
-
-
-  virtual void ProjectToSurface (Point<3> & p, int surfi);
-
-  virtual void ProjectToSurface (Point<3> & p, int surfi, const PointGeomInfo & /* gi */)
-  {
-    ProjectToSurface (p, surfi);
-  }
-
-  virtual void ProjectToEdge (Point<3> & p, int surfi1, int surfi2, const EdgePointGeomInfo & egi) const;
-
-
-  void ValidateSecondOrder (Mesh & mesh);
-  void ValidateRefinedMesh (Mesh & mesh, 
-			    ARRAY<INDEX_2> & parents);
-
-  MeshOptimize2d * Get2dOptimizer(void)
-  {
-    return optimizer2d;
-  }
-  void Set2dOptimizer(MeshOptimize2d * opti)
-  {
-    optimizer2d = opti;
-  }
-
-  
-  virtual void LocalizeEdgePoints(Mesh & mesh) const {;}
-};
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/boundarylayer.cpp b/contrib/Netgen/libsrc/meshing/boundarylayer.cpp
deleted file mode 100644
index 1dd3403807c843bf14ed69892c5c8c079a8e71a4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/boundarylayer.cpp
+++ /dev/null
@@ -1,92 +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(QUAD);
-	  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/classifyhpel.hpp b/contrib/Netgen/libsrc/meshing/classifyhpel.hpp
deleted file mode 100644
index 96bf1b62c43e43bc968e5463202119f01a361f87..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/classifyhpel.hpp
+++ /dev/null
@@ -1,1713 +0,0 @@
-HPREF_ELEMENT_TYPE ClassifyTet(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-		 BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges, 
-		 INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)
-{
-  int ep1(0), ep2(0), ep3(0), ep4(0), cp1(0), cp2(0), cp3(0), cp4(0), fp1, fp2, fp3, fp4;
-  int isedge1(0), isedge2(0), isedge3(0), isedge4(0), isedge5(0), isedge6(0);
-  int isfedge1, isfedge2, isfedge3, isfedge4, isfedge5, isfedge6;
-  int isface1(0), isface2(0), isface3(0), isface4(0);
-
-  HPREF_ELEMENT_TYPE type = HP_NONE; 
-  
-
-  int debug = 0;
-  for (int j = 0;j < 4; j++)
-    {
-      if (el.pnums[j] == 444) debug++;
-      if (el.pnums[j] == 115) debug++;
-      if (el.pnums[j] == 382) debug++;
-      if (el.pnums[j] == 281) debug++;
-    }
-  if (debug < 4) debug = 0;
-  
-
-
-  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.pnums[j]);
-	ep2 = edgepoint.Test (el.pnums[k]);
-	ep3 = edgepoint.Test (el.pnums[pi3]);
-	ep4 = edgepoint.Test (el.pnums[pi4]);
-	
-	cp1 = cornerpoint.Test (el.pnums[j]);
-	cp2 = cornerpoint.Test (el.pnums[k]);
-	cp3 = cornerpoint.Test (el.pnums[pi3]);
-	cp4 = cornerpoint.Test (el.pnums[pi4]);
-	
-	isedge1 = edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[k]));
-	isedge2 = edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi3]));
-	isedge3 = edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi4]));
-	isedge4 = edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi3]));
-	isedge5 = edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi4]));
-	isedge6 = edges.Used (INDEX_2::Sort (el.pnums[pi3], el.pnums[pi4]));
-	
-	if (debug)
-	  {
-	    cout << "debug" << endl;
-	    *testout  << "debug" << endl;
-	    *testout << "ep = " << ep1 << ep2 << ep3 << ep4 << endl;
-	    *testout << "cp = " << cp1 << cp2 << cp3 << cp4 << endl;
-	    *testout << "edge = " << isedge1 << isedge2 << isedge3 << isedge4 << isedge5 << isedge6 << endl;
-	  }
-
-
-	isface1 = isface2 = isface3 = isface4 = 0;
-	for (int l = 0; l < 4; l++)
-	  {
-	    INDEX_3 i3(0,0,0);
-	    switch (l)
-	      {
-		case 0: i3.I1() = el.pnums[k]; i3.I1() = el.pnums[pi3]; i3.I1() = el.pnums[pi4]; break;
-		case 1: i3.I1() = el.pnums[j]; i3.I1() = el.pnums[pi3]; i3.I1() = el.pnums[pi4]; break;
-		case 2: i3.I1() = el.pnums[j]; i3.I1() = el.pnums[k]; i3.I1() = el.pnums[pi4]; break;
-		case 3: i3.I1() = el.pnums[j]; i3.I1() = el.pnums[k]; i3.I1() = el.pnums[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.pnums[k], el.pnums[pi3], el.pnums[pi4]));
-	  isface2 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[pi3], el.pnums[pi4]));
-	  isface3 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[k], el.pnums[pi4]));
-	  isface4 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[k], el.pnums[pi3]));
-	*/
-	
-	isfedge1 = isfedge2 = isfedge3 = isfedge4 = isfedge5 = isfedge6 = 0;
-	for (int l = 0; l < 6; l++)
-	  {
-	    INDEX_2 i2(0,0);
-	    switch (l)
-	      {
-		case 0: i2.I1() = el.pnums[j]; i2.I2() = el[k]; break;
-		case 1: i2.I1() = el.pnums[j]; i2.I2() = el.pnums[pi3]; break;
-		case 2: i2.I1() = el.pnums[j]; i2.I2() = el.pnums[pi4]; break;
-		case 3: i2.I1() = el.pnums[k]; i2.I2() = el.pnums[pi3]; break;
-		case 4: i2.I1() = el.pnums[k]; i2.I2() = el.pnums[pi4]; break;
-		case 5: i2.I1() = el.pnums[pi3]; i2.I2() = el.pnums[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.pnums[j], el.pnums[k]));
-	  isfedge2 = face_edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi3]));
-	  isfedge3 = face_edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi4]));
-	  isfedge4 = face_edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi3]));
-	  isfedge5 = face_edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi4]));
-	  isfedge6 = face_edges.Used (INDEX_2::Sort (el.pnums[pi3], el.pnums[pi4]));
-	*/
-	
-	fp1 = fp2 = fp3 = fp4 = 0;
-	for (int l = 0; l < 4; l++)
-	  {
-	    int pti(0);
-	    switch (l)
-	      {
-	      case 0: pti = el.pnums[j]; break;
-	      case 1: pti = el.pnums[k]; break;
-	      case 2: pti = el.pnums[pi3]; break;
-	      case 3: pti = el.pnums[pi4]; break;
-	      }
-	    int domnr = facepoint[pti];
-	    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.pnums[j]] != 0;
-	  fp2 = facepoint[el.pnums[k]] != 0;
-	  fp3 = facepoint[el.pnums[pi3]] != 0;
-	  fp4 = facepoint[el.pnums[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;
-		      }
-		    break;
-		  }
-		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:  // two singular faces
-	    {
-	      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)
-	  {
-	    int pnums[4]; 
-	    pnums[0] = el.pnums[j];
-	    pnums[1] = el.pnums[k];
-	    pnums[2] = el.pnums[pi3];
-	    pnums[3] = el.pnums[pi4];
-	    for(k=0;k<4;k++) el.pnums[k] = pnums[k]; 
-	    break;
-	  }
-      }
-  
-  
-  if (debug) cout << "type = " << type << endl;
-
-  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
-		 << "isface = " << isface1 << isface2 << isface3 << isface4 << endl;
-      cout << "undefined element !!! " << endl;
-
-      
-    }
-  return(type); 
-}
-
-
-
-HPREF_ELEMENT_TYPE ClassifyPrism(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-		 BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges, 
-		 INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)
-{
-
-  HPREF_ELEMENT_TYPE type = HP_NONE;
-  
-  int p[6];
-  for(int m=1;m<=6;m++)
-    {
-      int point_sing[6]={0,0,0,0,0,0}; 
-      int face_sing[5]={0,0,0,0,0};
-      int edge_sing[9]={0,0,0,0,0,0,0,0,0}; 
-      
-      if(m<4)
-	{ 
-	  p[0]= m; p[1]=m%3+1; p[2]=(m%3+1)%3+1;
-	  for(int l=3;l<6;l++) p[l]=p[l-3]+3;  
-	}
-      else
-	{
-	  p[0] = m; p[1]=(m%3+1)%3+4; p[2]=m%3+4;
-	  for(int l=3;l<6;l++) p[l]=p[l-3]-3; 
-	}
-      
-      for(int j=0;j<6;j++) 
-	{ 
-	  if(cornerpoint.Test(el.PNum(p[j])))  { point_sing[p[j]-1]=3;}
-	  else if(edgepoint.Test(el.PNum(p[j]))) point_sing[p[j]-1]=2;
-	  else if (facepoint[el.PNum(p[j])] == -1 || facepoint[el.PNum(p[j])] == el.GetIndex())
-	    point_sing[p[j]-1] = 1;  
-	}
-      
-      const ELEMENT_EDGE * eledges = MeshTopology::GetEdges (PRISM);
-      for(int k=0;k<9;k++)
-	{
-	  INDEX_2 i2 = INDEX_2 :: Sort(el.PNum(p[eledges[k][0]-1]),el.PNum(p[eledges[k][1]-1])); 
-	  if (edges.Used(i2)) edge_sing[k] = 2;
-	  else edge_sing[k] = face_edges.Used(i2);
-	}
-      
-      const ELEMENT_FACE * elfaces  = MeshTopology::GetFaces (PRISM);
-      for (int k=0;k<5;k++)
-	{
-	  INDEX_3 i3; 
-	  
-	  if(k<2) 
-	    i3 = INDEX_3::Sort(el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1], 
-			       el.pnums[p[elfaces[k][2]-1]-1]); 
-	  else 
-	    { 
-	      INDEX_4  i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1], el.pnums[p[elfaces[k][2]-1]-1],el.pnums[p[elfaces[k][3]-1]-1]); 
-	      i4.Sort();
-	      i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3()); 
-	    }
-	  
-	  if (faces.Used (i3))
-	    {
-	      int domnr = faces.Get(i3); 
-	      if (domnr == -1 || domnr == el.GetIndex())
-		face_sing[k] = 1; 
-	      
-	    } 
-	} 
-      if (face_sing[1] > face_sing[0]) {m=m+2; continue;}  
-      
-      
-      //int cp = 0;  
-      
-      int qfsing = face_sing[2] + face_sing[3] + face_sing[4];
-      int tfsing = face_sing[0] + face_sing[1]; 
-      int evsing = edge_sing[6] + edge_sing[7] + edge_sing[8];
-      int ehsing = edge_sing[0] + edge_sing[1] + edge_sing[2] + edge_sing[3] + edge_sing[4] + edge_sing[5];
-      
-      if (qfsing + tfsing + evsing + ehsing == 0)  
-	{ type = HP_PRISM;  break;}
-      
-      HPREF_ELEMENT_TYPE types[] = {HP_NONE,HP_NONE,HP_NONE};   
-      
-      int fb = (1-face_sing[4])* face_sing[3] * (face_sing[2] + face_sing[3]) + 3*face_sing[4]*face_sing[3]*face_sing[2];  
-      int sve[3] = {edge_sing[7] , edge_sing[8], edge_sing[6]}; 
-      
-            
-      if(fb!=qfsing) continue; 
-      
-      
-      switch(fb)
-	{ 
-	case 0: 
-	  if (evsing == 0 && ehsing==3*tfsing) 
-	    {
-	      types[0] = HP_PRISM; 
-	      types[1] = HP_PRISM_1FA_0E_0V;   
-	      types[2] = HP_PRISM_2FA_0E_0V; 
-	    } 
-	  if(evsing > 0 &&  sve[0] == evsing) // 1 vertical edge 1-4 
-	    { 
-	      types[0] = HP_PRISM_SINGEDGE;
-	      types[1] = HP_PRISM_1FA_1E_0V;
-	      types[2] = HP_PRISM_2FA_1E_0V;   
-	    }
-	  
-	  if(sve[0] > 0 && sve[1] > 0 && sve[2] == 0)
-	    {
-	      types[0] = HP_PRISM_SINGEDGE_V12;
-	      types[1] = HP_PRISM_1FA_2E_0V; 
-	      types[2] = HP_PRISM_2FA_2E_0V; 
-	    }
-	  if(sve[0] > 0 && sve[1] > 0 && sve[2] > 0) 
-	    {
-	      types[0] = HP_PRISM_3E_0V;
-	      types[1] = HP_PRISM_1FA_3E_0V;
-	      types[2] = HP_PRISM_2FA_3E_0V;
-	      
-	      if ( edge_sing[0] > 1 && edge_sing[2] > 1 &&  
-		   edge_sing[4] > 1 && edge_sing[5] > 1 && tfsing==0)
-		types[0] = HP_PRISM_3E_4EH; 
-	    }
-	  
-	  break;
-	case 1:
-	  if(sve[0] <= 1 && sve[1] <= 1)  
-	    if(sve[2]==0)
-	      { 
-		types[0] = HP_PRISM_1FB_0E_0V;
-		types[1] = HP_PRISM_1FA_1FB_0E_0V;
-		types[2] = HP_PRISM_2FA_1FB_0E_0V;  
-	      }
-	    else
-	      { 
-		types[0] = HP_PRISM_1FB_1EC_0V;
-		types[1] = HP_PRISM_1FA_1FB_1EC_0V;
-		types[2] = HP_PRISM_2FA_1FB_1EC_0V; 
-	      }
-	  
-	  if(sve[0] > 1 && sve[2] >= 1 && sve[1] <= 1)
-	    { 
-	      types[0] = HP_PRISM_1FB_2EB_0V;  
-	      types[1] = HP_PRISM_1FA_1FB_2EB_0V;
-	      types[2] = HP_PRISM_2FA_1FB_2EB_0V; 
-	    }
-	  
-	  if(sve[0] > 1 && sve[1] <= 1 && sve[2] == 0) // ea && !eb  
-	    {
-	      types[0] = HP_PRISM_1FB_1EA_0V;
-	      types[1] = HP_PRISM_1FA_1FB_1EA_0V;
-	      types[2] = HP_PRISM_2FA_1FB_1EA_0V; 
-	    } 
-	  
-	  if(sve[0] <= 1 && sve[1] > 1 && sve[2] == 0)
-	    types[1] = HP_PRISM_1FA_1FB_1EB_0V; 
-	  
-	  if(sve[0] > 1 && sve[1]>1) 
-	    if(sve[2] == 0)  // ea && eb 
-	      {
-		types[0] = HP_PRISM_1FB_2EA_0V;
-		types[1] = HP_PRISM_1FA_1FB_2EA_0V;
-		types[2] = HP_PRISM_2FA_1FB_2EA_0V; 
-	      }
-	  if(sve[0] <= 1 && sve[1] > 1 && sve[2] >0)
-	    types[1] = HP_PRISM_1FA_1FB_2EC_0V; 
-	  
-	  if(sve[0] > 1 && sve[1] > 1 && sve[2] >= 1) //sve[2] can also be a face-edge  
-	    {
-	      types[0] = HP_PRISM_1FB_3E_0V;  
-	      types[1] = HP_PRISM_1FA_1FB_3E_0V; 
-	      types[2] = HP_PRISM_2FA_1FB_3E_0V; 
-	    } 
-	  
-	  break;  
-	  
-	case 2:
-	  if(sve[0] <= 1) 
-	    cout << " **** WARNING: Edge between to different singular faces should be marked singular " << endl; 
-		      
-	  if(sve[1] <= 1)   
-	    if(sve[2] <=1) 
-	      { 
-		types[0] = HP_PRISM_2FB_0E_0V; 
-		types[1] = HP_PRISM_1FA_2FB_0E_0V;
-		types[2] = HP_PRISM_2FA_2FB_0E_0V;
-	      }
-	    else
-	      { 
-		types[0] = HP_PRISM_2FB_1EC_0V; 
-		types[1] = HP_PRISM_1FA_2FB_1EC_0V; 
-		types[2] = HP_PRISM_2FA_2FB_1EC_0V;   
-	      }
-	  else
-	    if(sve[2] <= 1) 
-	      types[1] = HP_PRISM_1FA_2FB_1EB_0V; 
-	    else
-	      { 
-		types[0] = HP_PRISM_2FB_3E_0V; 
-		types[1] = HP_PRISM_1FA_2FB_3E_0V; 
-		types[2] = HP_PRISM_2FA_2FB_3E_0V; 
-	      }
-	  
-	  break;
-	  
-	case 3: 
-	  types[0] = HP_PRISM_3FB_0V; 
-	  types[1] = HP_PRISM_1FA_3FB_0V; 
-	  types[2] = HP_PRISM_2FA_3FB_0V; 
-	  break;
-	}
-      type = types[tfsing];
-      
-         
-      if(type != HP_NONE)  
-	break;
-    }
-	 
-  /*
-   *testout << " Prism with pnums " << endl; 
-   for(int j=0;j<6;j++) *testout << el.pnums[j] << "\t"; 
-   *testout << endl; 
-   */
-  
-  if(type != HP_NONE) 
-    {
-      int pnums[6]; 
-      for(int j=0;j<6;j++) pnums[j] = el.PNum (p[j]);
-      for(int k=0;k<6;k++) el.pnums[k] = pnums[k]; 
-    }
-
-  /* *testout << " Classified Prism with pnums " << endl; 
-  for(int j=0;j<6;j++) *testout << el.pnums[j] << "\t"; 
-  *testout << endl; 
-  */ 
-  return(type); 
-}
-
-
-// #ifdef SABINE 
-HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-		 BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int>  & face_edges, 
-				INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int dim, const FaceDescriptor & fd)
-
-{
-  HPREF_ELEMENT_TYPE type = HP_NONE; 
-  
-  int pnums[3]; 
-  int p[3];   
-  
-  INDEX_3 i3 (el.pnums[0], el.pnums[1], el.pnums[2]);
-  i3.Sort();
-  bool sing_face = faces.Used (i3);
-  
-  // *testout << " facepoint " << facepoint << endl;  
-      
-
-  // Try all rotations of the trig 
-  for (int j=0;j<3;j++) 
-    {
-      int point_sing[3] = {0,0,0}; 
-      int edge_sing[3] = {0,0,0}; 
-      // *testout << " actual rotation of trig points " ;  
-      for(int m=0;m<3;m++) 
-	{ 
-	  p[m] = (j+m)%3 +1; // local vertex number
-	  pnums[m] = el.PNum(p[m]); // global vertex number 
-	  // *testout << pnums[m] << " \t "; 
-	}
-      // *testout << endl ; 
-      
-      if(dim == 3) 
-	{
-	  // face point 
-	  for(int k=0;k<3;k++)
-	    if(!sing_face)
-	      { 
-		//	*testout << " fp [" << k << "] = " << facepoint[pnums[k]] << endl;   
-		//	*testout << " fd.DomainIn()" <<  fd.DomainIn() << endl; 
-		//	*testout  << " fd.DomainOut()" <<  fd.DomainOut() << endl; 
-		if( facepoint[pnums[k]]  && (facepoint[pnums[k]] ==-1 || 
-					     facepoint[pnums[k]] == fd.DomainIn() ||   facepoint[pnums[k]] == fd.DomainOut()))
-		  point_sing[p[k]-1] = 1; 
-	      } 
-	  // if point is on face_edge in next step sing = 2 
-
-	  /*	  *testout << " pointsing NACH FACEPOints ... FALLS EDGEPOINT UMSETZEN" ; 
-	  for (int k=0;k<3;k++) *testout << "\t" << point_sing[p[k]-1] ;
-	  *testout << endl; */
-	}
-      
-      const ELEMENT_EDGE * eledges = MeshTopology::GetEdges(TRIG); 
-      
-      if(dim==3)
-	{
-	  for(int k=0;k<3;k++) 
-	    { 
-	      int ep1=p[eledges[k][0]-1];  
-	      int ep2=p[eledges[k][1]-1];  
-	      INDEX_2 i2(el.PNum(ep1),el.PNum(ep2)); 
-	      
-	      if(edges.Used(i2)) 
-		{
-		  
-		  edge_sing[k]=2;
-		  point_sing[ep1-1] = 2; 
-		  point_sing[ep2-1] = 2; 
-		}
-	      else // face_edge? 
-		{	  
-		  i2.Sort();  
-		  if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1)  // edge not face_edge acc. to surface in which trig lies
-		    if(face_edges.Get(i2)==-1 ||face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut() )
-		      { 
-			edge_sing[k]=1;
-		      } 
-		    else
-		      { 
-			point_sing[ep1-1] = 0; // set to edge_point 
-			point_sing[ep2-1] = 0; // set to edge_point
-		      } 
-		}
-	      
-	      /*  *testout << " pointsing NACH edges UND FACEEDGES UMSETZEN ... " ; 
-	      for (int k=0;k<3;k++) *testout << "\t" << point_sing[p[k]-1] ; 
-	      *testout << endl;          
-	      */
-	    }
-	}
-      /*
-      *testout << " dim " << dim << endl; 
-      *testout << " edgepoint_dom " << edgepoint_dom << endl; 
-      */
-      if(dim==2)
-	{
-	  for(int k=0;k<3;k++) 
-	    { 
-	      int ep1=p[eledges[k][0]-1];  
-	      int ep2=p[eledges[k][1]-1];  
-	     
-	      INDEX_2 i2(el.PNum(ep1),el.PNum(ep2));  
-	     
-	      if(edges.Used(i2)) 
-		{
-		  
-		  if(edgepoint_dom.Used(INDEX_2(fd.SurfNr(),pnums[ep1-1])) || 
-		     edgepoint_dom.Used(INDEX_2(-1,pnums[ep1-1])) || 
-		     edgepoint_dom.Used(INDEX_2(fd.SurfNr(),pnums[ep2-1])) || 
-		     edgepoint_dom.Used(INDEX_2(-1,pnums[ep2-1]))) 
-		    {
-		      edge_sing[k]=2;
-		      point_sing[ep1-1] = 2;
-		      point_sing[ep2-1] = 2; 
-		    }
-		}
-	     
-	    }
-	}
-
-     
-	 
-      for(int k=0;k<3;k++) 
-	if(edgepoint.Test(pnums[k])) //edgepoint, but not member of sing_edge on trig -> cp 
-	  {
-	    INDEX_2 i2a=INDEX_2::Sort(el.PNum(p[k]), el.PNum(p[(k+1)%3])); 
-	    INDEX_2 i2b=INDEX_2::Sort(el.PNum(p[k]), el.PNum(p[(k+2)%3])); 
-	    
-	    if(!edges.Used(i2a) && !edges.Used(i2b)) 
-	      point_sing[p[k]-1] = 3; 	
-	  } 
-      
-      for(int k=0;k<3;k++) 
-	if(cornerpoint.Test(el.PNum(p[k]))) 
-	  point_sing[p[k]-1] = 3; 
-      
-
-     if(edge_sing[0] + edge_sing[1] + edge_sing[2] == 0) 
-       { 
-	 int ps = point_sing[0] + point_sing[1] + point_sing[2]; 
-	 
-	 if(ps==0) 
-	   type = HP_TRIG; 
-	 else if(point_sing[p[0]-1]  && !point_sing[p[1]-1] && !point_sing[p[2]-1])
-	   type = HP_TRIG_SINGCORNER;
-	 else if(point_sing[p[0]-1] && point_sing[p[1]-1] && !point_sing[p[2]-1]) 
-	   type = HP_TRIG_SINGCORNER12; 
-	 else if(point_sing[p[0]-1] && point_sing[p[1]-1] && point_sing[p[2]-1]) 
-	   { 
-	     if(dim==2) type = HP_TRIG_SINGCORNER123_2D; 
-	     else type = HP_TRIG_SINGCORNER123; 
-	   } 
-       } 
-     else
-       if (edge_sing[2] && !edge_sing[0] && !edge_sing[1]) //E[2]=(1,2) 
-      { 
-	int code = 0; 
-	if(point_sing[p[0]-1] > edge_sing[2]) code+=1; 
-	if(point_sing[p[1]-1] > edge_sing[2]) code+=2; 
-	if(point_sing[p[2]-1]) 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]; 
-	
-      }  // E[0] = [0,2], E[1] =[1,2], E[2] = [0,1]
-    else 
-      if(edge_sing[2] && !edge_sing[1] && edge_sing[0])
-	{
-	  if(point_sing[p[2]-1] <= edge_sing[0] ) 
-	    { 
-	      if(point_sing[p[1]-1]<= edge_sing[2]) type = HP_TRIG_SINGEDGES; 
-	      else type = HP_TRIG_SINGEDGES2; 
-	    } 
-	  else 
-	    {
-	      if(point_sing[p[1]-1]<= edge_sing[2]) 
-		type = HP_TRIG_SINGEDGES3; 
-	      else type = HP_TRIG_SINGEDGES23; 
-	    }
-	}
-      else if (edge_sing[2] && edge_sing[1] && edge_sing[0])
-	type = HP_TRIG_3SINGEDGES; 
-     
-     //  cout << " run for " <<  j << " gives type " << type << endl; 
-     //*testout << " run for " <<  j << " gives type " << type << endl; 
-     if(type!=HP_NONE) break;
-    }
-    
-  for(int k=0;k<3;k++) el[k] = pnums[k]; 
-  /*if(type != HP_NONE) 
-   {
-     
-      cout << " TRIG with pnums " << pnums[0] << "\t"  << 
-	pnums[1] << "\t"  << pnums[2] << endl; 
-      cout << " type "  << type << endl; 
-      }
-  */
-  return(type);
-}
-#ifdef HPREF_OLD 
-HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-				BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges, 
-				INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int dim, const FaceDescriptor & fd)
-{
-  HPREF_ELEMENT_TYPE type = HP_NONE; 
-  
-  int pnums[3]; 
-	      
-  INDEX_3 i3 (el.pnums[0], el.pnums[1], el.pnums[2]);
-  i3.Sort();
-  bool sing_face = faces.Used (i3);
-   
-  
-  for (int 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 (dim == 2)
-	{
-	  // JS, Dec 11
-	  ep1 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j))) ||
-	    edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j)));
-	  ep2 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j+1))) ||
-	    edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j+1)));
-	  ep3 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j+2))) ||
-	    edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j+2)));
-	  /*
-	  ep1 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j)));
-	  ep2 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j+1)));
-	  ep3 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j+2)));
-	  */
-	  // 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;
-      
-      
-      // (*testout) << "cp = " << cp1 << cp2 << cp3 << ", ep = " << ep1 << ep2 << ep3 << endl;
-
-      int p[3] = { el.PNumMod (j), el.PNumMod (j+1), el.PNumMod (j+2)};
-      if(ep1)
-	{
-	  INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]); 
-	  INDEX_2 i2b=INDEX_2::Sort(p[0], p[2]); 
-	  if(!edges.Used(i2a) && !edges.Used(i2b)) 
-	    cp1 = 1; 
-	}
-      if(ep2)
-	{
-	  INDEX_2 i2a=INDEX_2::Sort(p[1], p[0]); 
-	  INDEX_2 i2b=INDEX_2::Sort(p[1], p[2]); 
-	  if(!edges.Used(i2a) && !edges.Used(i2b)) 
-	    cp2 = 1; 
-	}
-      if(ep3)
-	{
-	  INDEX_2 i2a=INDEX_2::Sort(p[2], p[0]); 
-	  INDEX_2 i2b=INDEX_2::Sort(p[2], p[1]); 
-	  if(!edges.Used(i2a) && !edges.Used(i2b)) 
-	    cp3= 1; 
-	}		      
-      
-      
-      int isedge1=0, isedge2=0, isedge3=0; 
-      if(dim == 3 )
-	{
-	  INDEX_2 i2;
-	  i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
-	  isedge1 = edges.Used (i2);
-	  i2.Sort();
-	  if(surf_edges.Used(i2) &&  surf_edges.Get(i2)   != fd.SurfNr()+1 && 
-	     (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) ) 
-	    {
-	      isedge1=1;
-	      ep1 = 1; ep2=1;
-	    }
-	  
-	  i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
-	  isedge2 = edges.Used (i2);
-	  i2.Sort();
-	  if(surf_edges.Used(i2) &&  surf_edges.Get(i2)   != fd.SurfNr()+1 &&
-	     (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) ) 
-	    {
-	      isedge2=1;
-	      ep2 = 1; ep3=1;
-	    }
-	  i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
-	  isedge3 = edges.Used (i2);
-	  i2.Sort();
-	  if(surf_edges.Used(i2) &&  surf_edges.Get(i2)   != fd.SurfNr()+1 && 
-	     (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) ) 
-	    {
-	      isedge3=1;
-	      ep1 = 1; ep3=1;
-	    }
-	  
-	  // cout << " isedge " << isedge1 << " \t " << isedge2 << " \t " << isedge3 << endl;  
-	
-	  if (!sing_face)
-	{
-	  /*
-	    if (!isedge1)  { cp1 |= ep1; cp2 |= ep2; }
-	    if (!isedge2)  { cp2 |= ep2; cp3 |= ep3; }
-	    if (!isedge3)  { cp3 |= ep3; cp1 |= ep1; }
-	  */
-	  ep1 |= facepoint [el.PNumMod(j)] != 0;
-	  ep2 |= facepoint [el.PNumMod(j+1)] != 0;
-	  ep3 |= facepoint [el.PNumMod(j+2)] != 0;
-	  
-	  
-	  isedge1 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j), el.PNumMod(j+1)));
-	  isedge2 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j+1), el.PNumMod(j+2)));
-	  isedge3 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j+2), el.PNumMod(j+3)));
-	}
-	}
-      
-      if(dim ==2) 
-	{ 
-	  INDEX_2 i2;
-	  i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
-	  i2.Sort();
-	  isedge1 = edges.Used (i2);
-	  if(isedge1)
-	    {
-	      ep1 = 1; ep2=1;
-	    }
-	  
-	  i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
-	  i2.Sort();
-	  isedge2 = edges.Used (i2);
-	  if(isedge2)
-	    {
-	      ep2 = 1; ep3=1;
-	    }
-	  i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
-	  i2.Sort();
-	  isedge3 = edges.Used (i2);
-	  if(isedge3)
-	    {
-	      ep1 = 1; ep3=1;
-	    }
-	  
-	  
-	}
-      
-		  
-		  /*
-		  cout << " used " << face_edges.Used (INDEX_2::Sort (el.PNumMod(j), el.PNumMod(j+1))) << endl; 
-
-		  cout << " isedge " << isedge1 << " \t " << isedge2 << " \t " << isedge3 << endl; 
-		  cout << " ep " << ep1 << "\t" << ep2 << " \t " << ep3 << endl; 
-		  cout << " cp " << cp1 << "\t" << cp2 << " \t " << cp3 << endl; 
-		  */
-		  
-
-      
-      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 (dim == 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;
-	}
-    }
-  
-  for(int k=0;k<3;k++) el[k] = pnums[k]; 
-  /*if(type != HP_NONE) 
-   {
-     
-      cout << " TRIG with pnums " << pnums[0] << "\t"  << 
-	pnums[1] << "\t"  << pnums[2] << endl; 
-      cout << " type "  << type << endl; 
-      }
-  */
-  return(type);
-}
-#endif
-HPREF_ELEMENT_TYPE ClassifyQuad(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-		 BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int>  & face_edges, 
-				INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int dim, const FaceDescriptor & fd)
-{
-  HPREF_ELEMENT_TYPE type = HP_NONE; 
-  
-  int ep1(-1), ep2(-1), ep3(-1), ep4(-1), cp1(-1), cp2(-1), cp3(-1), cp4(-1);
-	      int isedge1, isedge2, isedge3, isedge4;
-
-	      for (int 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 (dim == 2)
-		    {
-		      ep1 = edgepoint_dom.Used (INDEX_2 (el.GetIndex(), el.PNumMod(j)));
-		      ep2 = edgepoint_dom.Used (INDEX_2 (el.GetIndex(), el.PNumMod(j+1)));
-		      ep3 = edgepoint_dom.Used (INDEX_2 (el.GetIndex(), el.PNumMod(j+2)));
-		      ep4 = edgepoint_dom.Used (INDEX_2 (el.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;
-		
-		  int p[4] = { el.PNumMod (j), el.PNumMod (j+1), el.PNumMod (j+2), el.PNumMod(j+4)};
-		  //int epp[4] = { ep1, ep2, ep3, ep4}; 
-		  int cpp[4] = { cp1, cp2, cp3, cp4};
-		  for(int k=0;k<0;k++)
-		    {
-		      INDEX_2 i2a=INDEX_2::Sort(p[k], p[(k+1)%4]); 
-		      INDEX_2 i2b=INDEX_2::Sort(p[k], p[(k-1)%4]); 
-		      if(!edges.Used(i2a) && !edges.Used(i2b)) 
-			cpp[k] = 1; 
-		    }
-		  cp1= cpp[0]; cp2=cpp[1]; cp3=cpp[2]; cp4=cpp[3];
-		  
-
-		  if(dim ==3) 
-		    { 
-		      INDEX_2 i2;
-		      i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
-		      // i2.Sort();
-		      isedge1 = edges.Used (i2);
-		      i2.Sort();
-		      if(surf_edges.Used(i2)  &&  surf_edges.Get(i2)   != fd.SurfNr()+1 && 
-			 (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) ) 
-			{
-			  isedge1=1;
-			  ep1 = 1; ep2=1;
-			}
-		      i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
-		      // i2.Sort();
-		      isedge2 = edges.Used (i2);
-		      i2.Sort();
-		      if(surf_edges.Used(i2)  &&  surf_edges.Get(i2)   != fd.SurfNr()+1 && 
-			 (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) ) 
-			{  
-			  isedge2=1;
-			  ep2=1; ep3=1;
-			}
-		      i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
-		      // i2.Sort();
-		      isedge3 = edges.Used (i2); 
-		      i2.Sort();
-		      if(surf_edges.Used(i2)   &&  surf_edges.Get(i2)   != fd.SurfNr()+1 && (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) ) 
-			{
-			  isedge3=1;
-			  ep3=1; ep4=1;
-			}
-		      i2 = INDEX_2(el.PNumMod (j+3), el.PNumMod (j+4));
-		      // i2.Sort();
-		      isedge4 = edges.Used (i2);
-		      i2.Sort();
-		      if(surf_edges.Used(i2)  &&  surf_edges.Get(i2)   != fd.SurfNr()+1 && 
-			 (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) ) 
-			{ 
-			  isedge4=1;
-			  ep4=1; ep1=1;
-			} 
-		    
-
-//MH***********************************************************************************************************
-		      if(ep1)
-			if(edgepoint.Test(p[0]))
-			{
-			  INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]); 
-	  		  INDEX_2 i2b=INDEX_2::Sort(p[0], p[3]); 
-	  		  if(!edges.Used(i2a) && !edges.Used(i2b)) 
-	    		    cp1 = 1; 
-			}
-		      if(ep2)
-			if(edgepoint.Test(p[1]))
-			{
-			  INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]); 
-	  		  INDEX_2 i2b=INDEX_2::Sort(p[1], p[2]); 
-	  		  if(!edges.Used(i2a) && !edges.Used(i2b)) 
-	    		    cp2 = 1; 
-			}
-		      if(ep3)
-			if(edgepoint.Test(p[2]))
-			{
-			  INDEX_2 i2a=INDEX_2::Sort(p[2], p[1]); 
-	  		  INDEX_2 i2b=INDEX_2::Sort(p[3], p[2]); 
-	  		  if(!edges.Used(i2a) && !edges.Used(i2b)) 
-	    		    cp3 = 1; 
-			}
-		      if(ep4)
-			if(edgepoint.Test(p[3]))
-			{
-			  INDEX_2 i2a=INDEX_2::Sort(p[0], p[3]); 
-	  		  INDEX_2 i2b=INDEX_2::Sort(p[3], p[2]); 
-	  		  if(!edges.Used(i2a) && !edges.Used(i2b)) 
-	    		    cp4 = 1; 
-			}
-//MH*****************************************************************************************************************************
-		}
-		  else
-		    { 
-		      INDEX_2 i2;
-		      i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
-		      i2.Sort();
-		      isedge1 = edges.Used (i2);
-		      if(isedge1)
-			{
-			  ep1 = 1; ep2=1;
-			}
-		      i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
-		      i2.Sort();
-		      isedge2 = edges.Used (i2);
-		      if(isedge2)
-			{  
-			  ep2=1; ep3=1;
-			}
-		      i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
-		      i2.Sort();
-		      isedge3 = edges.Used (i2); 
-		      
-		      if(isedge3)
-			{
-			  ep3=1; ep4=1;
-			}
-		      i2 = INDEX_2(el.PNumMod (j+3), el.PNumMod (j+4));
-		      i2.Sort();
-		      isedge4 = edges.Used (i2);
-		      if(isedge4)
-			{ 
-			  ep4=1; ep1=1;
-			} 
-		    }
-
-		  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)
-		    {
-		      int pnums[4]; 
-		      pnums[0] = el.PNumMod (j); 
-		      pnums[1] = el.PNumMod (j+1);
-		      pnums[2] = el.PNumMod (j+2); 
-		      pnums[3] = el.PNumMod (j+3);
-		      for (int k=0;k<4;k++) el[k] = pnums[k]; 
-	
-		      /*  cout << " QUAD with pnums " << pnums[0] << "\t"  << 
-			pnums[1] << "\t"  << pnums[2] << "\t"  << pnums[3] 
-			<< endl << " of type " << type << endl; */
-		   		      
-		      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;
-		}
-	    
-
-	      return(type);  
-}	    
-
-
-HPREF_ELEMENT_TYPE ClassifyHex(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-		 BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges, 
-		 INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)
-{
-  HPREF_ELEMENT_TYPE type = HP_NONE;
-  
-  // implementation only for HP_HEX_1F_0E_0V
-  //                         HP_HEX_1FA_1FB_0E_0V
-  //                         HP_HEX 
-  // up to now other cases are refine dummies 
-  
-  // indices of bot,top-faces combinations
-  int index[6][2] = {{0,1},{1,0},{2,4},{4,2},{3,5},{5,3}}; 
-  int p[8]; 
-  const ELEMENT_FACE * elfaces  = MeshTopology::GetFaces (HEX);
-  const ELEMENT_EDGE * eledges = MeshTopology::GetEdges (HEX);
-  
-  for(int m=0;m<6 && type == HP_NONE;m++) 
-    for(int j=0;j<4 && type == HP_NONE;j++) 
-      { 
-	int point_sing[8]={0,0,0,0,0,0,0,0}; 
-	int face_sing[6] = {0,0,0,0,0,0};
-	int edge_sing[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
-	int spoint=0, sface=0, sedge=0; 
-	for(int l=0;l<4;l++) 
-	  {
-	    p[l] = elfaces[index[m][0]][(4-j-l)%4]; 
-	    p[l+4] = elfaces[index[m][1]][(j+l)%4];
-	  }
-	
-	for(int l=0;l<8;l++) 
-	  if(cornerpoint.Test(el.PNum(p[l])))  
-	    { 
-	      point_sing[p[l]-1]=3;
-	      spoint++; 
-	    }
-	  else if(edgepoint.Test(el.PNum(p[l]))) point_sing[p[l]-1]=2;
-	  else if (facepoint[el.PNum(p[l])] == -1 || facepoint[el.PNum(p[l])] == el.GetIndex())
-	    point_sing[p[l]-1] = 1;   
-	
-	for(int k=0;k<12;k++)
-	{
-	  INDEX_2 i2 = INDEX_2 :: Sort(el.PNum(p[eledges[k][0]-1]),el.PNum(p[eledges[k][1]-1])); 
-	  if (edges.Used(i2)) 
-	    { 
-	      edge_sing[k] = 2;
-	      sedge++; 
-	    }
-	  else edge_sing[k] = face_edges.Used(i2);
-	}
-	
-	for (int k=0;k<6;k++)
-	{
-	  INDEX_3 i3; 
-	  
-	
-	  INDEX_4  i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1], el.pnums[p[elfaces[k][2]-1]-1],el.pnums[p[elfaces[k][3]-1]-1]); 
-	  i4.Sort();
-	  i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3()); 
-	  
-	  if (faces.Used (i3))
-	    {
-	      
-	      int domnr = faces.Get(i3); 
-	      if (domnr == -1 || domnr == el.GetIndex())
-		{
-		  face_sing[k] = 1;
-		  sface++;
-		}
-	      
-	    } 
-	} 
-	
-	if(!sface && !sedge && !spoint) type = HP_HEX; 
-	if(!sedge && !spoint) 
-	  {
-	    if(face_sing[0] && face_sing[2] && sface==2) 
-	      type = HP_HEX_1FA_1FB_0E_0V; 
-	    if (face_sing[0] && sface==1)  
-	      type = HP_HEX_1F_0E_0V; 
-	  }
-	
-	el.type=type; 
-
-	if(type != HP_NONE) 
-	  {
-	    int pnums[8]; 
-	    for(int l=0;l<8;l++) pnums[l] = el[p[l]-1];
-	    for(int l=0;l<8;l++) el[l] = pnums[l];
-	    /* cout << " HEX with pnums " << pnums[0] << "\t"  << 
-	      pnums[1] << "\t"  << pnums[2] << "\t"  << pnums[3] << "\t"  << 
-	      pnums[4] << "\t"  <<  pnums[5] << endl << " of type " << type << endl; */
-	    break; 
-	  }
-      }
-  
-  return (type); 
-
-}
-
-HPREF_ELEMENT_TYPE ClassifySegm(HPRefElement & hpel, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-		 BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges, 
-		 INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)
-{
-  
-  int cp1 = cornerpoint.Test (hpel[0]);
-  int cp2 = cornerpoint.Test (hpel[1]);
-  
-  INDEX_2 i2;
-  i2 = INDEX_2(hpel[0], hpel[1]);
-  i2.Sort();
-  if (!edges.Used (i2))
-    {
-      cp1 = edgepoint.Test (hpel[0]);
-      cp2 = edgepoint.Test (hpel[1]);
-    }
-  
-  if(!edges.Used(i2) && !face_edges.Used(i2))
-    {
-      if(facepoint[hpel[0]]!=0) cp1=1; 
-      if(facepoint[hpel[1]]!=0) cp2=1; 
-    }
-  
-  if(edges.Used(i2) && !face_edges.Used(i2))
-    {
-      if(facepoint[hpel[0]]) cp1 = 1; 
-	    if(facepoint[hpel[1]]) cp2 = 1; 
-    }
-  
-  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;
-  
-  // cout << " SEGM found with " << hpel[0] << " \t" << hpel[1] << endl << " of type " << hpel.type << endl; 
-  return(hpel.type) ; 
-} 
-
-
-HPREF_ELEMENT_TYPE ClassifyPyramid(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-		 BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges, 
-		 INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)
-{
-  HPREF_ELEMENT_TYPE type = HP_NONE;
-  
-  // implementation only for HP_PYRAMID
-  //                         HP_PYRAMID_0E_1V
-  //                         HP_PYRAMID_EDGES
-  //                         HP_PYRAMID_1FB_0E_1VA
-  // up to now other cases are refine dummies 
-  
-  // indices of bot,top-faces combinations
-  // int index[6][2] = {{0,1},{1,0},{2,4},{4,2},{3,5},{5,3}}; 
-
-  const ELEMENT_FACE * elfaces  = MeshTopology::GetFaces (PYRAMID);
-  const ELEMENT_EDGE * eledges = MeshTopology::GetEdges (PYRAMID);
-  
-  int point_sing[5]={0,0,0,0,0}; 
-  int face_sing[5] = {0,0,0,0,0};
-  int edge_sing[8] = {0,0,0,0,0,0,0,0};
-  
-  int spoint=0, sedge=0, sface=0; 
-   
-  for(int m=0;m<4 && type == HP_NONE;m++) 
-    {
-      int p[5] = {m%4, m%4+1, m%4+2, m%4+3, 4}; 
-
-      for(int l=0;l<5;l++) 
-	{
-	  if(cornerpoint.Test(el.pnums[p[l]]))  
-	    point_sing[l]=3;
-	  
-	     else if(edgepoint.Test(el.pnums[p[l]]))
-	    point_sing[l]=2;
-	  
-	  else if (facepoint[el.pnums[p[l]]] == -1 || facepoint[el.pnums[p[l]]] == el.GetIndex())
-	    point_sing[l] = 1;   
-	  
-	  spoint += point_sing[l]; 
-	}
-      
-      for(int k=0;k<8;k++)
-	{
-	  INDEX_2 i2 = INDEX_2 :: Sort(el.pnums[p[eledges[k][0]-1]],
-				       el.pnums[p[eledges[k][1]-1]]); 
-	  if (edges.Used(i2)) 
-	    edge_sing[k] = 2;
-	  else 
-	    edge_sing[k] = face_edges.Used(i2);
-	  
-	  sedge += edge_sing[k]; 
-	}
-  
-      for (int k=0;k<5;k++)
-	{
-	  INDEX_3 i3; 
-	  INDEX_4  i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]], el.pnums[p[elfaces[k][1]-1]], el.pnums[p[elfaces[k][2]-1]],
-				el.pnums[p[elfaces[k][3]-1]]); 
-	  i4.Sort();
-	  i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3()); 
-	  
-	  if (faces.Used (i3))
-	    {
-	      
-	      int domnr = faces.Get(i3); 
-	      if (domnr == -1 || domnr == el.GetIndex())
-		face_sing[k] = 1;
-	    } 
-	  sface +=face_sing[k]; 
-	} 
-  
-      if(!sface && !spoint && !sedge) return(HP_PYRAMID); 
-      
-      if(!sface && !sedge && point_sing[p[0]] == spoint) 
-	type = HP_PYRAMID_0E_1V; 
-      
-      if(!sface && edge_sing[0] + edge_sing[2] == sedge && 
-	 spoint == point_sing[0] + point_sing[1] + point_sing[3]) 
-	type = HP_PYRAMID_EDGES; 
-      
-      if(sface && sface == face_sing[0] && spoint == point_sing[4] + 2)
-	type = HP_PYRAMID_1FB_0E_1VA; 
-      
-      
-      if(type != HP_NONE) 
-	{ 
-	  int pnums[8]; 
-	  for(int l=0;l<5;l++) pnums[l] = el[p[l]];
-	  for(int l=0;l<5;l++) el[l] = pnums[l];
-	  el.type=type; 
-	  break; 
-	} 
-    }
-  
-  return (type); 
-  
-}
diff --git a/contrib/Netgen/libsrc/meshing/clusters.cpp b/contrib/Netgen/libsrc/meshing/clusters.cpp
deleted file mode 100644
index da6c66fe3512b2531d0400db12c4753f3eb310fa..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/clusters.cpp
+++ /dev/null
@@ -1,267 +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();
-
-  bool hasedges = top.HasEdges();
-  bool hasfaces = top.HasFaces();
-
-  if (!hasedges || !hasfaces) 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) = -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 6db15893ae44b8d8299aabae40e42cdda4a5f7d3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/curvedelems.cpp
+++ /dev/null
@@ -1,2899 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#ifndef CURVEDELEMS_NEW
-
-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 :: CalcScaledLegendrePolynomials (double x, double t)
-  {
-    double p1 = 1.0, p2 = 0.0, p3;
-
-    lp[0] = 1.0;
-	
-    double x2mt = 2*x-t;
-    double t2 = t*t;
-
-    for (int j=1; j<=order; j++)
-      {
-	p3=p2; p2=p1;
-	p1=((2.0*j-1.0)*x2mt*p2-t2*(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];
-  }
-
-
-  void PolynomialBasis :: CalcFScaled (double x, double t)
-  {
-    double tt = t*t;
-    double x2mt = 2*x-t;
-
-
-      
-
-    double p1 = 0.5*x2mt, p2 = -0.5, p3 = 0.0;
-    for (int j=2; j<=order; j++)
-      {
-	p3=p2; p2=p1;
-	p1=((2.0*j-3.0) * x2mt * p2 - tt*(j-3.0)*p3)/j;
-	f[j-2] = p1;
-      }
-
-    /*
-      CalcF (x/t);
-      double fac = t*t;
-      for (int j = 0; j<=order-2; j++, fac*=t) 
-      f[j] *= fac;
-    */
-  }
-
-  void PolynomialBasis :: CalcFScaled (int p, double x, double t, double * values)
-  {
-    double tt = t*t;
-    double x2mt = 2*x-t;
-    
-    double p1 = 0.5*x2mt, p2 = -0.5, p3 = 0.0;
-    for (int j=2; j<=p; j++)
-      {
-	p3=p2; p2=p1;
-	p1=((2.0*j-3.0) * x2mt * p2 - tt*(j-3.0)*p3)/j;
-	values[j-2] = p1;
-      }
-    
-    /*
-      CalcF (x/t);
-      double fac = t*t;
-      for (int j = 0; j<=order-2; j++, fac*=t) 
-      f[j] *= fac;
-    */
-  }
-
-
-
-
-  // ----------------------------------------------------------------------------
-  //      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) << "index = " << index << endl;
-    // (*testout) << "eshape = " << eshape << ", edshape = " << edshape << endl;
-
-
-    // eshape = 0.0;
-    //	edshape = 0.0;
-
-    /*
-      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;
-
-      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;
-      for (int k = 0; k < 2; k++)
-      edshape[index](k) = 
-      p1x * ( dlambda(i1,k) - dlambda(i0,k) ) + 
-      p1y * (-dlambda(i1,k) - dlambda(i0,k) );
-      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 :: CalcVertexShapesOnly ()
-  {
-    for (int v = 0; v < nvertices; v++)
-      vshape[v] = lambda(v);
-  }
-
-
-  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++;
-	  }
-      }
-
-
-
-    /*
-      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;
-
-      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;
-      for (int k = 0; k < 3; k++)
-      edshape[index](k) = 
-      p1x * ( dlambda(i1,k) - dlambda(i0,k) ) + 
-      p1y * (-dlambda(i1,k) - dlambda(i0,k) );
-      index++;
-      }    
-
-      }
-
-    */
-
-
-
-
-  }
-
-
-
-
-  void FETet :: CalcEdgeShapesOnly ()
-  {
-    int 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);
-
-	double arg = lambda(i0)+lambda(i1);
-	double xi = lambda[i1];
-
-	/*
-	  b1.SetOrder (edgeorder[e]);
-	  b1.CalcFScaled (xi, arg);
-	    
-	  for (int k = 2; k <= edgeorder[e]; k++, index++)
-	  eshape[index] = b1.GetF (k); 
-	*/
-	b1.CalcFScaled (edgeorder[e], xi, arg, &eshape[index]);
-	index += edgeorder[e]-1;
-      }
-  }
-
-
-
-
-
-
-  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++;
-	}
-	*/
-
-	// JS linear in z-direction (for thin plates !)
-	for (int k = 2; k <= edgeorder[e]; k++)
-	  {        
-	    ddecay = k*decay;
-	    decay *= arg;
-
-	    // dzcomp = k*zcomp;
-	    // zcomp *= zarg;
-	    dzcomp = 1;
-	    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)
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [ mesh[(SegmentIndex) segnr].hp_elnr];
-	  
-	// xi umrechnen
-	double lami[2];
-	lami[0] = xi;
-	lami[1] = 1-xi;
-
-	double coarse_xi = 0;
-	for (int i = 0; i < 2; i++)
-	  coarse_xi += hpref_el.param[i][0] * lami[i];
-
-	mesh.coarsemesh->GetCurvedElements().CalcSegmentTransformation (coarse_xi, hpref_el.coarse_elnr, x, dxdxi);
-	return;
-      }
-
-
-    // xi = 1-xi;  // or, this way  ????? JS
-    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 :: CalcMultiPointSegmentTransformation (ARRAY<double> * xi, int segnr,
-							      ARRAY<Point<3> > * x,
-							      ARRAY<Vec<3> > * dxdxi)
-  {
-    int size = xi->Size();
-
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [ mesh[(SegmentIndex) segnr].hp_elnr];
-	  
-	// xi umrechnen
-	ARRAY< Point<2> > lami;
-	lami.SetSize (size);
-	for (int i = 0; i<size; i++)
-	  {
-	    lami[i](0) = (*xi)[i];
-	    lami[i](1) = 1-(*xi)[i];
-	  }
-
-	ARRAY<double> coarse_xi;
-	coarse_xi.SetSize (size);
-	coarse_xi = 0;
-
-	  
-	for (int j = 0; j < 2; j++)
-	  for (int i = 0; i<size; i++)
-	    coarse_xi[i] += hpref_el.param[j][0] * lami[i](j);
-
-	mesh.coarsemesh->GetCurvedElements().CalcMultiPointSegmentTransformation
-	  (&coarse_xi, hpref_el.coarse_elnr, x, dxdxi);
-	return;
-      }
-
-
-
-    FESegm segm (*this);
-    segm.SetElementNumber (segnr+1);
-    x->SetSize (size);
-    dxdxi->SetSize (size);
-
-    for (int i = 0; i < size; i++)
-      {
-	segm.SetReferencePoint (Point<1>((*xi)[i]));
-
-	//	segm.CalcVertexShapes (x != NULL, dxdxi != NULL);
-	segm.CalcVertexShapes ();
-
-	(*x)[i] = Point<3>(0,0,0);
-	(*dxdxi)[i] = Vec<3>(0,0,0);
-
-	for (int v = 0; v < 2; v++)
-	  {
-	    (*x)[i] = (*x)[i] + segm.GetVertexShape(v) * mesh.Point(segm.GetVertexNr(v));
-	    (*dxdxi)[i] = (*dxdxi)[i] + segm.GetVertexDShape(v) * mesh.Point(segm.GetVertexNr(v));
-	  }
-
-	if (segm.GetEdgeOrder() > 1)
-	  {
-	    //	    segm.CalcEdgeShapes (x != NULL, dxdxi != NULL);
-	    segm.CalcEdgeShapes ();
-
-	    int gindex = edgecoeffsindex[segm.GetEdgeNr()-1];
-	    for (int k = 2; k <= segm.GetEdgeOrder(); k++, gindex++)
-	      {
-		(*x)[i] = (*x)[i] + segm.GetEdgeShape(k-2) * edgecoeffs[gindex];
-		(*dxdxi)[i] = (*dxdxi)[i] + 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];
-	FlatVector vlami(4, lami);
-	vlami = 0;
-	mesh[(SurfaceElementIndex) elnr] . GetShapeNew (xi, vlami);
-
-	Mat<2,2> trans;
-	Mat<3,2> dxdxic;
-	if (dxdxi)
-	  {
-	    MatrixFixWidth<2> dlami(4);
-	    dlami = 0;
-	    mesh[(SurfaceElementIndex) elnr] . GetDShapeNew (xi, dlami);	  
-	      
-	    trans = 0;
-	    for (int k = 0; k < 2; k++)
-	      for (int l = 0; l < 2; l++)
-		{
-		  double sum = 0;
-		  for (int i = 0; i < 4; i++)
-		    sum += hpref_el.param[i][l] * dlami(i, k);
-		  trans(l,k) = sum;
-		}
-	  }
-
-	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, &dxdxic);
-
-	if (dxdxi)
-	  *dxdxi = dxdxic * trans;
-
-	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);
-    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(elem[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(elem[v]).X(i+1);
-	// (*dxdxi)(i,j) += fe2d->GetVertexDShape(v)(j) * mesh.Point(fe2d->GetVertexNr(v)).X(i+1);
-      }
-
-    if (IsHighOrder())
-      {
-	fe2d->SetElementNumber (elnr+1);
-
-	//	    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 :: CalcMultiPointSurfaceTransformation (ARRAY< Point<2> > * xi, int elnr,
-							      ARRAY< Point<3> > * x,
-							      ARRAY< Mat<3,2> > * dxdxi)
-  {
-
-    int size = xi->Size();
-      
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [ mesh[(SurfaceElementIndex) elnr].hp_elnr];
-	  
-	// xi umrechnen
-	ARRAY< Point<2> > coarse_xi;
-	ARRAY< Mat<2,2> > trans;
-	ARRAY< Mat<3,2> > dxdxic;
-
-	coarse_xi.SetSize (size);
-	coarse_xi = 0;
-	trans.SetSize (size);
-	dxdxic.SetSize (size);
-
-	for (int mp = 0; mp<size; mp++)
-	  {
-	    double lami[4];
-	    FlatVector vlami(4, lami);
-	    vlami = 0;
-	    mesh[(SurfaceElementIndex) elnr] . GetShapeNew ((*xi)[mp], vlami);
-	      
-	    MatrixFixWidth<2> dlami(4);
-	    dlami = 0;
-	    mesh[(SurfaceElementIndex) elnr] . GetDShapeNew ((*xi)[mp], dlami);	  
-	      
-	    trans[mp] = 0;
-	    for (int k = 0; k < 2; k++)
-	      for (int l = 0; l < 2; l++)
-		{
-		  double sum = 0;
-		  for (int i = 0; i < 4; i++)
-		    sum += hpref_el.param[i][l] * dlami(i, k);
-		  trans[mp](l,k) = sum;
-		}
-	      
-	    for (int i = 0; i < 4; i++)
-	      {
-		coarse_xi[mp](0) += hpref_el.param[i][0] * lami[i];
-		coarse_xi[mp](1) += hpref_el.param[i][1] * lami[i];
-	      }
-	  }
-	  
-	mesh.coarsemesh->GetCurvedElements().CalcMultiPointSurfaceTransformation (&coarse_xi, hpref_el.coarse_elnr, x, &dxdxic);
-	  
-	for (int mp = 0; mp < size; mp++)
-	  {
-	    (*dxdxi)[mp] = dxdxic[mp] * trans[mp];
-	  }
-	  
-	return;
-      }
-    
-
-    x->SetSize (size);
-    dxdxi->SetSize (size);
-
-    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);
-
-    for (int mp = 0; mp < size; mp++)
-      {
-	fe2d->SetReferencePoint ((*xi)[mp]);
-	fe2d->CalcVertexShapes ();
-      
-	(*x)[mp] = Point<3>(0,0,0);
-      
-	for (int i = 0; i < 3; i++)
-	  for (int j = 0; j < 2; j++)
-	    (*dxdxi)[mp](i,j) = 0;
-      
-	for (int v = 0; v < fe2d->GetNVertices(); v++)
-	  {
-	    (*x)[mp] = (*x)[mp] + fe2d->GetVertexShape(v) * mesh.Point(fe2d->GetVertexNr(v));
-	    for (int i = 0; i < 3; i++)
-	      for (int j = 0; j < 2; j++)
-		(*dxdxi)[mp](i,j) += fe2d->GetVertexDShape(v)(j) * mesh.Point(fe2d->GetVertexNr(v)).X(i+1);
-	  }
-	  
-	if (IsHighOrder())
-	  {
-	    //	    fe2d->CalcEdgeShapes (x != NULL, dxdxi != NULL);
-	    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++)
-		  {
-		    (*x)[mp] = (*x)[mp] + fe2d->GetEdgeShape(index) * edgecoeffs[gindex];
-		    for (int i = 0; i < 3; i++)
-		      for (int j = 0; j < 2; j++)
-			(*dxdxi)[mp](i,j) += fe2d->GetEdgeDShape(index)(j) * edgecoeffs[gindex](i);	    
-		  }
-	      }
-
-
-	    if (mesh.GetDimension() == 3)
-	      {
-		//		fe2d->CalcFaceShapes (x != NULL, dxdxi != NULL);
-		fe2d->CalcFaceShapes ();
-
-		int gindex = facecoeffsindex[fe2d->GetFaceNr()-1];
-		for (int index = 0; index < fe2d->GetNFaceShapes(); index++, gindex++)
-		  {
-		    (*x)[mp] = (*x)[mp] + fe2d->GetFaceShape(index) * facecoeffs[gindex];
-		    for (int i = 0; i < 3; i++)
-		      for (int j = 0; j < 2; j++)
-			(*dxdxi)[mp](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];
-	
-
-	/*
-	 *testout << " Curved Element " << elnr << endl; 
-	 *testout << " hpref_el.coarse_elnr " << hpref_el.coarse_elnr << endl; 
-	 *testout << " hpref_el.param = " << endl; 
-	 for(int j=0;j< hpref_el.np; j++) 
-	 { 
-	 for(int k=0;k<3;k++)
-	 *testout << hpref_el.param[j][k] << "\t"; 
-	 *testout << endl; 
-	 } 
-	*/
-
-	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 < hpref_el.np; 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 < hpref_el.np; i++)
-		    sum += hpref_el.param[i][l] * dlami(i, k);
-		  trans(l,k) = sum;
-		}
-	  }
-	/*	  
-	 *testout << " x " << x << endl;
-	 // << "\t" << x.X(2) << "\t" << x.X(3) << endl;  
-	 *testout << " Element Trafo " << coarse_xi(0) << " \t " << coarse_xi(1) << " \t " << coarse_xi(2) << endl;
-	 */
-	 
-
-
-	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(elem[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(elem[v]).X(i+1);
-      }
-
-    if (IsHighOrder())
-      {
-	fe3d->SetElementNumber (elnr+1);
-	//	    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);
-	      }
-	  }
-
-
-	// cout << "switched off face mapping" << endl;
-	if (mesh.GetDimension() == 3)   // JS
-	  {
-	    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();
-  }
-
-
-
-
-
-
-
-
-
-#ifdef ROBERT
-
-  void CurvedElements :: CalcMultiPointElementTransformation (ARRAY< Point<3> > * xi, int elnr,
-							      ARRAY< Point<3> > * x,
-							      ARRAY< Mat<3,3> > * dxdxi)
-  {
-    int size = (*xi).Size();
-    x->SetSize (size);
-
-    if (dxdxi) dxdxi->SetSize (size);
-
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [ mesh[(ElementIndex) elnr].hp_elnr];
-	
-	ARRAY< Mat<3,3> > trans, dxdxic;
-	if (dxdxi)
-	  {
-	    trans.SetSize (size);
-	    dxdxic.SetSize (size);
-	  }
-
-	ARRAY<Point<3> > coarse_xi(size);
-
-	double lami[8];
-	FlatVector vlami(8, lami);
-	const Element & el = mesh[(ElementIndex) elnr];
-	int el_np = el.GetNP();
-
-	for (int mp = 0; mp < size; mp++)
-	  {
-	    el.GetShapeNew ((*xi)[mp], vlami);
-	    
-	    Point<3> pc(0,0,0);
-	    for (int i = 0; i < el_np; i++)
-	      for (int l = 0; l < 3; l++)
-		pc(l) += hpref_el.param[i][l] * lami[i];
-	
-	    coarse_xi[mp] = pc;
-
-	    if (dxdxi)
-	      {
-		MatrixFixWidth<3> dlami(8);
-		dlami = 0;
-		mesh[(ElementIndex) elnr] . GetDShapeNew ((*xi)[mp], dlami);	  
-		
-		trans[mp] = 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[mp](l,k) = sum;
-		    }
-	      }
-	  }
-
-	if (dxdxi)
-	  mesh.coarsemesh->GetCurvedElements().CalcMultiPointElementTransformation (&coarse_xi, hpref_el.coarse_elnr, x, &dxdxic);
-	else
-	  mesh.coarsemesh->GetCurvedElements().CalcMultiPointElementTransformation (&coarse_xi, hpref_el.coarse_elnr, x, 0);
-	
-	if (dxdxi)
-	  for (int mp = 0; mp < size; mp++)
-	    (*dxdxi)[mp] = dxdxic[mp] * trans[mp];
-	
-	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);
-
-
-    for (int mp = 0; mp < size; mp++)
-      {
-	fe3d->SetReferencePoint ((*xi)[mp]);
-    
-	fe3d->CalcVertexShapes ();
-	//	fe3d->CalcVertexShapes (x != NULL, dxdxi != NULL);
-    
-	(*x)[mp] = Point<3>(0,0,0);
-	if (dxdxi)
-	  for (int i = 0; i < 3; i++)
-	    for (int j = 0; j < 3; j++)
-	      (*dxdxi)[mp](i,j) = 0;
-	
-	for (int v = 0; v < fe3d->GetNVertices(); v++)
-	  {
-	    (*x)[mp] += 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)[mp](i,j) += fe3d->GetVertexDShape(v)(j) * mesh.Point(fe3d->GetVertexNr(v)).X(i+1);
-	  }
-    
-
-	if (IsHighOrder())
-	  {
-	    //	    fe3d->CalcEdgeShapes (x != NULL, dxdxi != NULL);
-	    fe3d->CalcEdgeShapes ();
-	
-	    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)[mp] += fe3d->GetEdgeShape(index) * edgecoeffs[gindex];
-		    if (dxdxi)
-		      for (int i = 0; i < 3; i++)
-			for (int j = 0; j < 3; j++)
-			  (*dxdxi)[mp](i,j) += fe3d->GetEdgeDShape(index)(j) * edgecoeffs[gindex](i);
-		  }
-	      }
-
-	    if (mesh.GetDimension() == 3)
-	      {
-		fe3d->CalcFaceShapes ();
-		//		fe3d->CalcFaceShapes (x != NULL, dxdxi != NULL);
-	    
-		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)[mp] += fe3d->GetFaceShape(index) * facecoeffs[gindex];
-			if (dxdxi)
-			  for (int i = 0; i < 3; i++)
-			    for (int j = 0; j < 3; j++)
-			      (*dxdxi)[mp](i,j) += fe3d->GetFaceDShape(index)(j) * facecoeffs[gindex](i);
-		      }
-		  }
-	      }
-	  }
-      }
-	
-    fe3d -> ~BaseFiniteElement3D();
-  }
-
-#endif
-
-
-
-
-
-
-  void CurvedElements :: CalcMultiPointElementTransformation (ARRAY< Point<3> > * xi, int elnr,
-							      ARRAY< Point<3> > * x,
-							      ARRAY< Mat<3,3> > * dxdxi)
-  {
-    int size = (*xi).Size();
-    x->SetSize (size);
-
-    if (dxdxi) dxdxi->SetSize (size);
-
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [ mesh[(ElementIndex) elnr].hp_elnr];
-	
-	ARRAY< Mat<3,3> > trans, dxdxic;
-	if (dxdxi)
-	  {
-	    trans.SetSize (size);
-	    dxdxic.SetSize (size);
-	  }
-
-	ARRAY<Point<3> > coarse_xi(size);
-
-	double lami[8];
-	FlatVector vlami(8, lami);
-	const Element & el = mesh[(ElementIndex) elnr];
-	int el_np = el.GetNP();
-
-	for (int mp = 0; mp < size; mp++)
-	  {
-	    el.GetShapeNew ((*xi)[mp], vlami);
-	    
-	    Point<3> pc(0,0,0);
-	    for (int i = 0; i < el_np; i++)
-	      for (int l = 0; l < 3; l++)
-		pc(l) += hpref_el.param[i][l] * lami[i];
-	
-	    coarse_xi[mp] = pc;
-
-	    if (dxdxi)
-	      {
-		MatrixFixWidth<3> dlami(8);
-		dlami = 0;
-		mesh[(ElementIndex) elnr] . GetDShapeNew ((*xi)[mp], dlami);	  
-		
-		trans[mp] = 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[mp](l,k) = sum;
-		    }
-	      }
-	  }
-
-	if (dxdxi)
-	  mesh.coarsemesh->GetCurvedElements().CalcMultiPointElementTransformation (&coarse_xi, hpref_el.coarse_elnr, x, &dxdxic);
-	else
-	  mesh.coarsemesh->GetCurvedElements().CalcMultiPointElementTransformation (&coarse_xi, hpref_el.coarse_elnr, x, 0);
-	
-	if (dxdxi)
-	  for (int mp = 0; mp < size; mp++)
-	    (*dxdxi)[mp] = dxdxic[mp] * trans[mp];
-	
-	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);
-
-    if (dxdxi)
-      for (int mp = 0; mp < size; mp++)
-	(*dxdxi)[mp] = 0.0;
-    
-    Vec<3> vertices[8];
-    ArrayMem<Vec<3>, 100> loc_edgecoefs(0);
-    ArrayMem<Vec<3>, 100> loc_facecoefs(0);
-
-    for (int v = 0; v < fe3d->GetNVertices(); v++)
-      vertices[v] = Vec<3> (mesh.Point(fe3d->GetVertexNr(v)));
-
-    if (IsHighOrder())
-      {
-	for (int e = 0; e < fe3d->GetNEdges(); e++)
-	  {
-	    int gindex = edgecoeffsindex[fe3d->GetEdgeNr(e)-1];
-	    for (int k = 2; k <= fe3d->GetEdgeOrder(e); k++, gindex++)
-	      loc_edgecoefs.Append (edgecoeffs[gindex]);
-	  }    
-	
-	if (mesh.GetDimension() == 3)
-	  for (int f = 0; f < fe3d->GetNFaces(); f++)
-	    {
-	      int gindex = facecoeffsindex[fe3d->GetFaceNr(f)-1];
-	      for (int k = 0; k < fe3d->GetNFaceShapes(f); k++, gindex++)
-		loc_facecoefs.Append (facecoeffs[gindex]);
-	    }    
-      }
-
-
-
-    if (!dxdxi)
-
-      for (int mp = 0; mp < size; mp++)
-	{
-	  fe3d->SetReferencePoint ((*xi)[mp]);
-	  fe3d->CalcVertexShapesOnly ();
-	  
-	  if (IsHighOrder())
-	    {
-	      fe3d->CalcEdgeShapesOnly ();
-	      if (mesh.GetDimension() == 3)
-		fe3d->CalcFaceShapes ();
-	    }
-	  
-	  Point<3> hp (0,0,0);
-	  for (int v = 0; v < fe3d->GetNVertices(); v++)
-	    hp += fe3d->GetVertexShape(v) * vertices[v];
-	  for (int index = 0; index < loc_edgecoefs.Size(); index++)
-	    hp += fe3d->GetEdgeShape(index) * loc_edgecoefs[index]; 
-	  for (int index = 0; index < loc_facecoefs.Size(); index++)
-	    hp += fe3d->GetFaceShape(index) * loc_facecoefs[index]; // edgecoeffs[gindex];
-	  (*x)[mp] = hp;
-	}
-    
-    else
-      
-      for (int mp = 0; mp < size; mp++)
-	{
-	  fe3d->SetReferencePoint ((*xi)[mp]);
-	  fe3d->CalcVertexShapes ();
-	  
-	  if (IsHighOrder())
-	    {
-	      fe3d->CalcEdgeShapes ();
-	      if (mesh.GetDimension() == 3)
-		fe3d->CalcFaceShapes ();
-	    }
-	  
-	  Point<3> hp (0,0,0);
-	  for (int v = 0; v < fe3d->GetNVertices(); v++)
-	    hp += fe3d->GetVertexShape(v) * vertices[v];
-	  for (int index = 0; index < loc_edgecoefs.Size(); index++)
-	    hp += fe3d->GetEdgeShape(index) * loc_edgecoefs[index]; 
-	  for (int index = 0; index < loc_facecoefs.Size(); index++)
-	    hp += fe3d->GetFaceShape(index) * loc_facecoefs[index]; // edgecoeffs[gindex];
-	  (*x)[mp] = hp;
-	  
-
-	  for (int v = 0; v < fe3d->GetNVertices(); v++)
-	    for (int i = 0; i < 3; i++)
-	      for (int j = 0; j < 3; j++)
-		(*dxdxi)[mp](i,j) += fe3d->GetVertexDShape(v)(j) * vertices[v](i);
-	  
-	  for (int index = 0; index < loc_edgecoefs.Size(); index++)
-	    for (int i = 0; i < 3; i++)
-	      for (int j = 0; j < 3; j++)
-		(*dxdxi)[mp](i,j) += fe3d->GetEdgeDShape(index)(j) * loc_edgecoefs[index](i);
-	  
-	  for (int index = 0; index < loc_facecoefs.Size(); index++)
-	    for (int i = 0; i < 3; i++)
-	      for (int j = 0; j < 3; j++)
-		(*dxdxi)[mp](i,j) += fe3d->GetFaceDShape(index)(j) * loc_facecoefs[index](i);
-	}
-    
-    fe3d -> ~BaseFiniteElement3D();
-  }
-
-
-
-  /*
-    class Init
-    {
-    PolynomialBasis b;
-    public:
-    Init ();
-    };
-
-    Init :: Init()
-    {
-    ofstream edge("edge.out");
-    b.SetOrder(10);
-    for (double x = 0; x <= 1; x += 0.01)
-    {
-    b.CalcFScaled(x, 1);
-    edge << x;
-    for (int j = 2; j <= 5; j++)
-    edge << " " << b.GetF(j);
-    edge << endl;
-    }
-    }
-
-    Init in;
-  */
-
-} // namespace netgen
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/curvedelems.hpp b/contrib/Netgen/libsrc/meshing/curvedelems.hpp
deleted file mode 100644
index 5e621f6d338eb56e3e157165b8dcc5f3ab01d7d5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/curvedelems.hpp
+++ /dev/null
@@ -1,868 +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, bool rational=false);
-
-  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 (const Point<2> & xi, int elnr,
-				  Point<3> & x)
-  { CalcSurfaceTransformation (xi, elnr, &x, NULL); };
-
-  void CalcSurfaceTransformation (const Point<2> & xi, int elnr,
-				  Mat<3,2> & dxdxi)
-  { CalcSurfaceTransformation (xi, elnr, NULL, &dxdxi); };
-
-  void CalcSurfaceTransformation (const Point<2> & xi, int elnr,
-				  Point<3> & x, Mat<3,2> & dxdxi)
-  { CalcSurfaceTransformation (xi, elnr, &x, &dxdxi); };
-
-
-  void CalcElementTransformation (const Point<3> & xi, int elnr,
-				  Point<3> & x)
-  { CalcElementTransformation (xi, elnr, &x, NULL); };
-
-  void CalcElementTransformation (const Point<3> & xi, int elnr,
-				  Mat<3,3> & dxdxi)
-  { CalcElementTransformation (xi, elnr, NULL, &dxdxi); };
-
-  void CalcElementTransformation (const Point<3> & xi, int elnr,
-				  Point<3> & x, Mat<3,3> & dxdxi)
-  { CalcElementTransformation (xi, elnr, &x, &dxdxi); };
-
-
-
-
-  void CalcMultiPointSegmentTransformation (ARRAY<double> * xi, int segnr,
-					    ARRAY<Point<3> > * x,
-					    ARRAY<Vec<3> > * dxdxi);
-
-  void CalcMultiPointSurfaceTransformation (ARRAY< Point<2> > * xi, int elnr,
-					    ARRAY< Point<3> > * x,
-					    ARRAY< Mat<3,2> > * dxdxi);
-
-  void CalcMultiPointElementTransformation (ARRAY< Point<3> > * xi, int elnr,
-					    ARRAY< Point<3> > * x,
-					    ARRAY< Mat<3,3> > * 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);
-  // P_i(x/t) t^i
-  inline void CalcScaledLegendrePolynomials (double x, double t);
-  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);
-
-  // compute F_i(x/t) t^i
-  inline void CalcFScaled (double x, double t);
-  static inline void CalcFScaled (int p, double x, double t, double * values);
-
-  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,300> fshape;
-  ArrayMem<Vec<3>,300> 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 CalcVertexShapesOnly()
-  { CalcVertexShapes(); }
-
-  virtual void CalcEdgeShapes() = 0;
-  virtual void CalcEdgeShapesOnly() 
-    { CalcEdgeShapes(); }
-
-  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 CalcVertexShapesOnly();
-  virtual void CalcEdgeShapes();
-  virtual void CalcEdgeShapesOnly();
-  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 6b44b19e5f6c972b371d0ad675b21fd63cbcd5ff..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/curvedelems2.cpp
+++ /dev/null
@@ -1,758 +0,0 @@
-
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#ifndef CURVEDELEMS_NEW
-
-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, bool rational)
-    {
-      if (mesh.coarsemesh)
-	{
-	  mesh.coarsemesh->GetCurvedElements().BuildCurvedElements (ref, polydeg, rational);
-	  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;
-
-	if (polydeg == 1)
-	{
-	    isHighOrder = 0;
-	    return;
-	}
-
-	
-	/*
-	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;
-	      }
-	  }
-
-
-	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
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/curvedelems_new.cpp b/contrib/Netgen/libsrc/meshing/curvedelems_new.cpp
deleted file mode 100644
index 26580bf73b27a4626cf0cab3a4f0140ed0a9b175..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/curvedelems_new.cpp
+++ /dev/null
@@ -1,2820 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#ifdef CURVEDELEMS_NEW
-
-namespace netgen
-{
-  
-  //   bool rational = true;
-
-
-
-  static 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);
-      }
-  }
-  
-  
-
-  // compute edge bubbles up to order n, x \in (-1, 1)
-  static void CalcEdgeShape (int n, double x, double * shape)
-  {
-    double p1 = x, p2 = -1, p3 = 0;
-    for (int j=2; j<=n; j++)
-      {
-	p3=p2; p2=p1;
-	p1=( (2*j-3) * x * p2 - (j-3) * p3) / j;
-	shape[j-2] = p1;
-      } 
-  }
-
-  static void CalcEdgeDx (int n, double x, double * dshape)
-  {
-    double p1 = x, p2 = -1, p3 = 0;
-    double p1dx = 1, p2dx = 0, p3dx = 0;
-
-    for (int j=2; j<=n; j++)
-      {
-	p3=p2; p2=p1;
-	p3dx = p2dx; p2dx = p1dx;
-
-	p1=( (2*j-3) * x * p2 - (j-3) * p3) / j;
-	p1dx = ( (2*j-3) * (x * p2dx + p2) - (j-3) * p3dx) / j;
-
-	dshape[j-2] = p1dx;
-      }    
-  }
-
-  static void CalcEdgeShapeDx (int n, double x, double * shape, double * dshape)
-  {
-    double p1 = x, p2 = -1, p3 = 0;
-    double p1dx = 1, p2dx = 0, p3dx = 0;
-
-    for (int j=2; j<=n; j++)
-      {
-	p3=p2; p2=p1;
-	p3dx = p2dx; p2dx = p1dx;
-
-	p1=( (2*j-3) * x * p2 - (j-3) * p3) / j;
-	p1dx = ( (2*j-3) * (x * p2dx + p2) - (j-3) * p3dx) / j;
-
-	shape[j-2] = p1;
-	dshape[j-2] = p1dx;
-      }    
-  }
-
-  // compute L_i(x/t) * t^i
-  static void CalcScaledEdgeShape (int n, double x, double t, double * shape)
-  {
-    double p1 = x, p2 = -1, p3 = 0;
-    for (int j=0; j<=n-2; j++)
-      {
-	p3=p2; p2=p1;
-	p1=( (2*j+1) * x * p2 - t*t*(j-1) * p3) / (j+2);
-	shape[j] = p1;
-      }    
-  }
-
-  template <int DIST>
-  static void CalcScaledEdgeShapeDxDt (int n, double x, double t, double * dshape)
-  {
-    double p1 = x, p2 = -1, p3 = 0;
-    double p1dx = 1, p1dt = 0;
-    double p2dx = 0, p2dt = 0;
-    double p3dx = 0, p3dt = 0;
-     
-    for (int j=0; j<=n-2; j++)
-      {
-	p3=p2; p3dx=p2dx; p3dt = p2dt;
-	p2=p1; p2dx=p1dx; p2dt = p1dt;
-
-	p1   = ( (2*j+1) * x * p2 - t*t*(j-1) * p3) / (j+2);
-	p1dx = ( (2*j+1) * (x * p2dx + p2) - t*t*(j-1) * p3dx) / (j+2);
-	p1dt = ( (2*j+1) * x * p2dt - (j-1)* (t*t*p3dt+2*t*p3)) / (j+2);
-
-	// shape[j] = p1;
-	dshape[DIST*j  ] = p1dx;
-	dshape[DIST*j+1] = p1dt;
-      }    
-  }
-
-
-  static void LegendrePolynomial (int n, double x, double * values)
-  {
-    switch (n)
-      {
-      case 0:
-	values[0] = 1;
-	break;
-      case 1:
-	values[0] = 1;
-	values[1] = x;
-	break;
-
-      default:
-
-	if (n < 0) return;
-
-	double p1 = 1.0, p2 = 0.0, p3;
-	
-	values[0] = 1.0;
-	for (int j=1; j<=n; j++)
-	  {
-	    p3 = p2; p2 = p1;
-	    p1 = ((2.0*j-1.0)*x*p2 - (j-1.0)*p3) / j;
-	    values[j] = p1;
-	  }
-      }
-  }
-
-
-  static void ScaledLegendrePolynomial (int n, double x, double t, double * values)
-  {
-    switch (n)
-      {
-      case 0:
-	values[0] = 1;
-	break;
-
-      case 1:
-	values[0] = 1;
-	values[1] = x;
-	break;
-
-      default:
-
-	if (n < 0) return;
-
-	double p1 = 1.0, p2 = 0.0, p3;
-	values[0] = 1.0;
-	for (int j=1; j<=n; j++)
-	  {
-	    p3 = p2; p2 = p1;
-	    p1 = ((2.0*j-1.0)*x*p2 - t*t*(j-1.0)*p3) / j;
-	    values[j] = p1;
-	  }
-      }
-  }
-
-
-  // compute face bubbles up to order n, 0 < y, y-x < 1, x+y < 1
-  static void CalcTrigShape (int n, double x, double y, double * shape)
-  { 
-    if (n < 3) return;
-    double hx[20], hy[20];
-    ScaledLegendrePolynomial (n-3, 2*x-1, 1-y, hx);
-    LegendrePolynomial (n-3, 2*y-1, hy);
-
-    int ii = 0;
-    double bub = (1+x-y)*y*(1-x-y);
-    for (int iy = 0; iy <= n-3; iy++)
-      for (int ix = 0; ix <= n-3-iy; ix++)
-	shape[ii++] = bub * hx[ix]*hy[iy];
-  }
-
-  static void CalcTrigShapeDxDy (int n, double x, double y, double * dshape)
-  { 
-    if (n < 3) return;
-    
-    int ndof = (n-1)*(n-2)/2;
-    double h1[20], h2[20];
-    double eps = 1e-4;
-  
-    CalcTrigShape (n, x+eps, y, h1);
-    CalcTrigShape (n, x-eps, y, h2);
-
-    for (int i = 0; i < ndof; i++)
-      dshape[2*i] = (h1[i]-h2[i])/(2*eps);
-
-    CalcTrigShape (n, x, y+eps, h1);
-    CalcTrigShape (n, x, y-eps, h2);
-
-    for (int i = 0; i < ndof; i++)
-      dshape[2*i+1] = (h1[i]-h2[i])/(2*eps);
-  }
-
-
-  // compute face bubbles up to order n, 0 < y, y-x < 1, x+y < 1
-  static void CalcScaledTrigShape (int n, double x, double y, double t, double * shape)
-  {
-    if (n < 3) return;
-
-    double hx[20], hy[20];
-    ScaledLegendrePolynomial (n-3, (2*x-1), t-y, hx);
-    ScaledLegendrePolynomial (n-3, (2*y-1), t, hy);
-
-    int ii = 0;
-    double bub = (t+x-y)*y*(t-x-y);
-    for (int iy = 0; iy <= n-3; iy++)
-      for (int ix = 0; ix <= n-3-iy; ix++)
-	shape[ii++] = bub * hx[ix]*hy[iy];
-  }
-
-
-  // compute face bubbles up to order n, 0 < y, y-x < 1, x+y < 1
-  static void CalcScaledTrigShapeDxDyDt (int n, double x, double y, double t, double * dshape)
-  {
-    if (n < 3) return;
-    double hvl[100], hvr[100];
-    int nd = (n-1)*(n-2)/2;
-    
-    double eps = 1e-6;
-
-    CalcScaledTrigShape (n, x-eps, y, t, hvl);
-    CalcScaledTrigShape (n, x+eps, y, t, hvr);
-    for (int i = 0; i < nd; i++)
-      dshape[3*i] = (hvr[i]-hvl[i])/(2*eps);
-
-    CalcScaledTrigShape (n, x, y-eps, t, hvl);
-    CalcScaledTrigShape (n, x, y+eps, t, hvr);
-    for (int i = 0; i < nd; i++)
-      dshape[3*i+1] = (hvr[i]-hvl[i])/(2*eps);
-
-    CalcScaledTrigShape (n, x, y, t-eps, hvl);
-    CalcScaledTrigShape (n, x, y, t+eps, hvr);
-    for (int i = 0; i < nd; i++)
-      dshape[3*i+2] = (hvr[i]-hvl[i])/(2*eps);
-  }
-
-    
-
-  
-
-  CurvedElements :: CurvedElements (const Mesh & amesh)
-    : mesh (amesh)
-  {
-    order = 1;
-    rational = 0;
-  }
-
-
-  CurvedElements :: ~CurvedElements()
-  {
-    ;
-  }
-
-
-  void CurvedElements :: BuildCurvedElements(Refinement * ref, int aorder,
-                                             bool arational)
-  {
-    if (mesh.coarsemesh)
-      {
-	mesh.coarsemesh->GetCurvedElements().BuildCurvedElements (ref, aorder, arational);
-        order = aorder;
-        rational = arational;
-	return;
-      }
-    
-    PrintMessage (1, "Curve elements, order = ", aorder);
-    if (rational) PrintMessage (1, "curved elements with rational splines");
-
-    const_cast<Mesh&> (mesh).UpdateTopology();
-    const MeshTopology & top = mesh.GetTopology();
-
-
-    rational = arational;
-
-    ARRAY<int> edgenrs;
-
-    edgeorder.SetSize (top.GetNEdges());
-    faceorder.SetSize (top.GetNFaces());
-
-    edgeorder = 1;
-    faceorder = 1;
-
-    if (rational)
-      {
-        edgeweight.SetSize (top.GetNEdges());
-        edgeweight = 1.0;
-      }
-
-    
-    if (aorder <= 1) return;
-
-
-    if (rational) aorder = 2;
-
-
-    if (mesh.GetDimension() == 3)
-      for (SurfaceElementIndex i = 0; i < mesh.GetNSE(); i++)
-	{
-	  top.GetSurfaceElementEdges (i+1, edgenrs);
-	  for (int j = 0; j < edgenrs.Size(); j++)
-	    edgeorder[edgenrs[j]-1] = aorder;
-	  faceorder[top.GetSurfaceElementFace (i+1)-1] = aorder;
-	}
-    for (SegmentIndex i = 0; i < mesh.GetNSeg(); i++)
-      edgeorder[top.GetSegmentEdge (i+1)-1] = aorder;
-
-    if (rational)
-      {
-        edgeorder = 2;
-        faceorder = 1;
-      }
-
-
-    edgecoeffsindex.SetSize (top.GetNEdges()+1);
-    int nd = 0;
-    for (int i = 0; i < top.GetNEdges(); i++)
-      {
-	edgecoeffsindex[i] = nd;
-	nd += max (0, edgeorder[i]-1);
-      }
-    edgecoeffsindex[top.GetNEdges()] = nd;
-
-    edgecoeffs.SetSize (nd);
-    edgecoeffs = Vec<3> (0,0,0);
-    
-
-    facecoeffsindex.SetSize (top.GetNFaces()+1);
-    nd = 0;
-    for (int i = 0; i < top.GetNFaces(); i++)
-      {
-	facecoeffsindex[i] = nd;
-	if (top.GetFaceType(i+1) == TRIG)
-	  nd += max (0, (faceorder[i]-1)*(faceorder[i]-2)/2);
-	else
-	  nd += max (0, sqr(faceorder[i]-1));
-      }
-    facecoeffsindex[top.GetNFaces()] = nd;
-
-    facecoeffs.SetSize (nd);
-    facecoeffs = Vec<3> (0,0,0);
-
-
-    if (!ref || aorder <= 1) 
-      {
-        order = aorder;
-        return;
-      }
-    
-    ARRAY<double> xi, weight;
-
-    ComputeGaussRule (aorder+4, xi, weight);  // on (0,1)
-
-    PrintMessage (3, "Curving edges");
-
-    if (mesh.GetDimension() == 3 || rational)
-      for (SurfaceElementIndex i = 0; i < mesh.GetNSE(); i++)
-        {
-	  SetThreadPercent(double(i)/mesh.GetNSE()*100.);
-          const Element2d & el = mesh[i];
-          top.GetSurfaceElementEdges (i+1, edgenrs);
-          for (int j = 0; j < edgenrs.Size(); j++)
-            edgenrs[j]--;
-          const ELEMENT_EDGE * edges = MeshTopology::GetEdges (el.GetType());
-
-          for (int i2 = 0; i2 < edgenrs.Size(); i2++)
-            {
-              PointIndex pi1 = edges[i2][0]-1;
-              PointIndex pi2 = edges[i2][1]-1;
-
-              bool swap = el[pi1] > el[pi2];
-
-              Point<3> p1 = mesh[el[pi1]];
-              Point<3> p2 = mesh[el[pi2]];
-
-              int order1 = edgeorder[edgenrs[i2]];
-              int ndof = max (0, order1-1);
-
-              if (rational && order1 >= 2)
-                {
-                  Point<3> pm = Center (p1, p2);
-
-                  int surfnr = mesh.GetFaceDescriptor(el.GetIndex()).SurfNr();
-
-                  Vec<3> n1 = ref -> GetNormal (p1, surfnr, el.GeomInfoPi(edges[i2][0]));
-                  Vec<3> n2 = ref -> GetNormal (p2, surfnr, el.GeomInfoPi(edges[i2][1]));
-
-                  // p3 = pm + alpha1 n1 + alpha2 n2
-                  
-                  Mat<2> mat, inv;
-                  Vec<2> rhs, sol;
-
-                  mat(0,0) = n1*n1;
-                  mat(0,1) = mat(1,0) = n1*n2;
-                  mat(1,1) = n2*n2;
-                  
-                  rhs(0) = n1 * (p1-pm);
-                  rhs(1) = n2 * (p2-pm);
-                  
-
-                  Point<3> p3;
-
-                  if (fabs (Det (mat)) > 1e-10)
-                    {
-                      CalcInverse (mat, inv);
-                      sol = inv * rhs;
-
-                      p3 = pm + sol(0) * n1 + sol(1) * n2;
-                    }
-                  else
-                    p3 = pm;
-
-                  edgecoeffs[edgecoeffsindex[edgenrs[i2]]] = Vec<3> (p3);
-
-
-                  double wold = 1, w = 1, dw = 0.1;
-                  double dold = 1e99;
-                  while (fabs (dw) > 1e-12)
-                    {
-                      Vec<3> v05 = 0.25 * Vec<3> (p1) + 0.5*w* Vec<3>(p3) + 0.25 * Vec<3> (p2);
-                      v05 /= 1 + (w-1) * 0.5;
-                      Point<3> p05 (v05), pp05(v05);
-                      ref -> ProjectToSurface (pp05, surfnr,  el.GeomInfoPi(edges[i2][0]));
-                      double d = Dist (pp05, p05);
-                      
-                      if (d < dold)
-                        {
-                          dold = d;
-                          wold = w;
-                          w += dw;
-                        }
-                      else
-                        {
-                          dw *= -0.7;
-                          w = wold + dw;
-                        }
-                    }
-                  
-                  edgeweight[edgenrs[i2]] = w;
-                  continue;
-                }
-	    
-              Vector shape(ndof);
-              DenseMatrix mat(ndof, ndof), inv(ndof, ndof),
-                rhs(ndof, 3), sol(ndof, 3);
-	    
-              rhs = 0.0;
-              mat = 0.0;
-              for (int j = 0; j < xi.Size(); j++)
-                {
-                  Point<3> p;
-                  Point<3> pp;
-                  PointGeomInfo ppgi;
-		
-                  if (swap)
-                    {
-                      p = p1 + xi[j] * (p2-p1);
-                      ref -> PointBetween (p1, p2, xi[j], 
-                                           mesh.GetFaceDescriptor(el.GetIndex()).SurfNr(),
-                                           el.GeomInfoPi(edges[i2][0]),
-                                           el.GeomInfoPi(edges[i2][1]),
-                                           pp, ppgi);
-                    }
-                  else
-                    {
-                      p = p2 + xi[j] * (p1-p2);
-                      ref -> PointBetween (p2, p1, xi[j], 
-                                           mesh.GetFaceDescriptor(el.GetIndex()).SurfNr(),
-                                           el.GeomInfoPi(edges[i2][1]),
-                                           el.GeomInfoPi(edges[i2][0]),
-                                           pp, ppgi);
-                    }
-		
-                  Vec<3> dist = pp - p;
-		
-                  CalcEdgeShape (order1, 2*xi[j]-1, &shape(0));
-		
-                  for (int k = 0; k < ndof; k++)
-                    for (int l = 0; l < ndof; l++)
-                      mat(k,l) += weight[j] * shape(k) * shape(l);
-		
-                  for (int k = 0; k < ndof; k++)
-                    for (int l = 0; l < 3; l++)
-                      rhs(k,l) += weight[j] * shape(k) * dist(l);
-                }
-	    
-              CalcInverse (mat, inv);
-              Mult (inv, rhs, sol);
-	    
-              int first = edgecoeffsindex[edgenrs[i2]];
-              for (int j = 0; j < ndof; j++)
-                for (int k = 0; k < 3; k++)
-                  edgecoeffs[first+j](k) = sol(j,k);
-            }
-        }
-
-
-    
-    for (SegmentIndex i = 0; i < mesh.GetNSeg(); i++)
-      {
-	SetThreadPercent(double(i)/mesh.GetNSeg()*100.);
-	const Segment & seg = mesh[i];
-	PointIndex pi1 = mesh[i].p1;
-	PointIndex pi2 = mesh[i].p2;
-
-	bool swap = (pi1 > pi2);
-
-	Point<3> p1 = mesh[pi1];
-	Point<3> p2 = mesh[pi2];
-
-	int segnr = top.GetSegmentEdge (i+1)-1;
-
-	int order1 = edgeorder[segnr];
-	int ndof = max (0, order1-1);
-
-
-        if (rational)
-          {
-            Vec<3> tau1 = ref -> GetTangent (p1, seg.surfnr2, seg.surfnr1, seg.epgeominfo[0]);
-            Vec<3> tau2 = ref -> GetTangent (p2, seg.surfnr2, seg.surfnr1, seg.epgeominfo[1]);
-            // p1 + alpha1 tau1 = p2 + alpha2 tau2;
-
-            Mat<3,2> mat;
-            Mat<2,3> inv;
-            Vec<3> rhs;
-            Vec<2> sol;
-            for (int j = 0; j < 3; j++)
-              {
-                mat(j,0) = tau1(j); 
-                mat(j,1) = -tau2(j); 
-                rhs(j) = p2(j)-p1(j); 
-              }
-            CalcInverse (mat, inv);
-            sol = inv * rhs;
-
-            Point<3> p3 = p1+sol(0) * tau1;
-            edgecoeffs[edgecoeffsindex[segnr]] = Vec<3> (p3);
-
-            
-//             double dopt = 1e99;
-//             double wopt = 0;
-//             for (double w = 0; w <= 2; w += 0.0001)
-//               {
-//                 Vec<3> v05 = 0.25 * Vec<3> (p1) + 0.5*w* Vec<3>(p3) + 0.25 * Vec<3> (p2);
-//                 v05 /= 1 + (w-1) * 0.5;
-//                 Point<3> p05 (v05), pp05(v05);
-//                 ref -> ProjectToEdge (pp05, seg.surfnr1, seg.surfnr2, seg.epgeominfo[0]);
-//                 double d = Dist (pp05, p05);
-//                 if (d < dopt)
-//                   {
-//                     wopt = w;
-//                     dopt = d;
-//                   }
-//               }
-            
-            double wold = 1, w = 1, dw = 0.1;
-            double dold = 1e99;
-            while (fabs (dw) > 1e-12)
-              {
-                Vec<3> v05 = 0.25 * Vec<3> (p1) + 0.5*w* Vec<3>(p3) + 0.25 * Vec<3> (p2);
-                v05 /= 1 + (w-1) * 0.5;
-                Point<3> p05 (v05), pp05(v05);
-                ref -> ProjectToEdge (pp05, seg.surfnr1, seg.surfnr2, seg.epgeominfo[0]);
-                double d = Dist (pp05, p05);
-
-                if (d < dold)
-                  {
-                    dold = d;
-                    wold = w;
-                    w += dw;
-                  }
-                else
-                  {
-                    dw *= -0.7;
-                    w = wold + dw;
-                  }
-                // *testout << "w = " << w << ", dw = " << dw << endl;
-              }
-
-            // cout << "wopt = " << w << ", dopt = " << dold << endl;
-            edgeweight[segnr] = w;
-            
-//             cout << "p1 = " << p1 << ", tau1 = " << tau1 << ", alpha1 = " << sol(0) << endl;
-//             cout << "p2 = " << p2 << ", tau2 = " << tau2 << ", alpha2 = " << -sol(1) << endl;
-//             cout << "p+alpha tau = " << p1 + sol(0) * tau1 
-//                  << " =?= " << p2 +sol(1) * tau2 << endl;
-            
-          }
-
-        else
-          
-          {
-
-            Vector shape(ndof);
-            DenseMatrix mat(ndof, ndof), inv(ndof, ndof),
-              rhs(ndof, 3), sol(ndof, 3);
-
-            rhs = 0.0;
-            mat = 0.0;
-            for (int j = 0; j < xi.Size(); j++)
-              {
-                Point<3> p;
-
-                Point<3> pp;
-                EdgePointGeomInfo ppgi;
-	    
-                if (swap)
-                  {
-                    p = p1 + xi[j] * (p2-p1);
-                    ref -> PointBetween (p1, p2, xi[j], 
-                                         seg.surfnr2, seg.surfnr1, 
-                                         seg.epgeominfo[0], seg.epgeominfo[1],
-                                         pp, ppgi);
-                  }
-                else
-                  {
-                    p = p2 + xi[j] * (p1-p2);
-                    ref -> PointBetween (p2, p1, xi[j], 
-                                         seg.surfnr2, seg.surfnr1, 
-                                         seg.epgeominfo[1], seg.epgeominfo[0],
-                                         pp, ppgi);
-                  }
-	    
-                Vec<3> dist = pp - p;
-
-                CalcEdgeShape (order1, 2*xi[j]-1, &shape(0));
-
-                for (int k = 0; k < ndof; k++)
-                  for (int l = 0; l < ndof; l++)
-                    mat(k,l) += weight[j] * shape(k) * shape(l);
-
-                for (int k = 0; k < ndof; k++)
-                  for (int l = 0; l < 3; l++)
-                    rhs(k,l) += weight[j] * shape(k) * dist(l);
-              }
-
-            CalcInverse (mat, inv);
-            Mult (inv, rhs, sol);
-
-            int first = edgecoeffsindex[segnr];
-            for (int j = 0; j < ndof; j++)
-              for (int k = 0; k < 3; k++)
-                edgecoeffs[first+j](k) = sol(j,k);
-          }
-      }
-
-   
-
-    
-    PrintMessage (3, "Curving faces");
-
-    if (mesh.GetDimension() == 3)
-    for (SurfaceElementIndex i = 0; i < mesh.GetNSE(); i++)
-      {
-	SetThreadPercent(double(i)/mesh.GetNSE()*100.);
-	const Element2d & el = mesh[i];
-	int facenr = top.GetSurfaceElementFace (i+1)-1;
-
-	if (el.GetType() == TRIG && order >= 3)
-	  {
-	    int fnums[] = { 0, 1, 2 };
-	    if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-	    if (el[fnums[1]] > el[fnums[2]]) swap (fnums[1], fnums[2]);
-	    if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-
-	    int order1 = faceorder[facenr];
-	    int ndof = max (0, (order1-1)*(order1-2)/2);
-	    
-	    Vector shape(ndof);
-	    DenseMatrix mat(ndof, ndof), inv(ndof, ndof),
-	      rhs(ndof, 3), sol(ndof, 3);
-	    
-	    rhs = 0.0;
-	    mat = 0.0;
-
-	    for (int jx = 0; jx < xi.Size(); jx++)
-	      for (int jy = 0; jy < xi.Size(); jy++)
-		{
-		  double y = xi[jy];
-		  double x = (1-y) * xi[jx];
-		  double lami[] = { x, y, 1-x-y };
-		  double wi = weight[jx]*weight[jy]*(1-y);
-
-		  Point<2> xii (x, y);
-		  Point<3> p1, p2;
-		  CalcSurfaceTransformation (xii, i, p1);
-		  p2 = p1;
-		  ref -> ProjectToSurface (p2, mesh.GetFaceDescriptor(el.GetIndex()).SurfNr());
-
-		  Vec<3> dist = p2-p1;
-		
-		  CalcTrigShape (order1, lami[fnums[1]]-lami[fnums[0]],
-				 1-lami[fnums[1]]-lami[fnums[0]], &shape(0));
-
-		  for (int k = 0; k < ndof; k++)
-		    for (int l = 0; l < ndof; l++)
-		      mat(k,l) += wi * shape(k) * shape(l);
-		  
-		  for (int k = 0; k < ndof; k++)
-		    for (int l = 0; l < 3; l++)
-		      rhs(k,l) += wi * shape(k) * dist(l);
-		}
-
-	    CalcInverse (mat, inv);
-	    Mult (inv, rhs, sol);
-	    
-	    int first = facecoeffsindex[facenr];
-	    for (int j = 0; j < ndof; j++)
-	      for (int k = 0; k < 3; k++)
-		facecoeffs[first+j](k) = sol(j,k);
-	  }
-      }
-    
-    PrintMessage (3, "Complete");
-
-
-    // compress edge and face tables
-    int newbase = 0;
-    for (int i = 0; i < edgeorder.Size(); i++)
-      {
-	bool curved = 0;
-	int oldbase = edgecoeffsindex[i];
-	nd = edgecoeffsindex[i+1] - edgecoeffsindex[i];
-
-	for (int j = 0; j < nd; j++)
-	  if (edgecoeffs[oldbase+j].Length() > 1e-10)
-	    curved = 1;
-        if (rational) curved = 1;
-
-	if (curved && newbase != oldbase)
-	  for (int j = 0; j < nd; j++)
-	    edgecoeffs[newbase+j] = edgecoeffs[oldbase+j];
-
-	edgecoeffsindex[i] = newbase;
-	if (!curved) edgeorder[i] = 1;
-	if (curved) newbase += nd;
-      }
-    edgecoeffsindex.Last() = newbase;
-
-
-    newbase = 0;
-    for (int i = 0; i < faceorder.Size(); i++)
-      {
-	bool curved = 0;
-	int oldbase = facecoeffsindex[i];
-	nd = facecoeffsindex[i+1] - facecoeffsindex[i];
-
-	for (int j = 0; j < nd; j++)
-	  if (facecoeffs[oldbase+j].Length() > 1e-10)
-	    curved = 1;
-
-	if (curved && newbase != oldbase)
-	  for (int j = 0; j < nd; j++)
-	    facecoeffs[newbase+j] = facecoeffs[oldbase+j];
-
-	facecoeffsindex[i] = newbase;
-	if (!curved) faceorder[i] = 1;
-	if (curved) newbase += nd;
-      }
-    facecoeffsindex.Last() = newbase;
-
-    order = aorder;
-
-    // (*testout) << "edgecoeffs = " << endl << edgecoeffs << endl;
-    // (*testout) << "facecoeffs = " << endl << facecoeffs << endl;
-  }
-
-
-
-
-
-
-
-
-
-
-  // ***********************  Transform edges *****************************
-
-  
-  bool CurvedElements ::  IsSegmentCurved (SegmentIndex elnr) const
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	
-	return mesh.coarsemesh->GetCurvedElements().IsSegmentCurved (hpref_el.coarse_elnr);
-      }
-
-    SegmentInfo info;
-    info.elnr = elnr;
-    info.order = order;
-    info.ndof = info.nv = 2;
-    if (info.order > 1)
-      {
-	const MeshTopology & top = mesh.GetTopology();
-	info.edgenr = top.GetSegmentEdge (elnr+1)-1;	
-	info.ndof += edgeorder[info.edgenr]-1;
-      }
-
-    return (info.ndof > info.nv);
-  }
-
-
- 
-  
-
-  void CurvedElements :: 
-  CalcSegmentTransformation (double xi, SegmentIndex elnr,
-			     Point<3> * x, Vec<3> * dxdxi, bool * curved)
-  {
-    if (mesh.coarsemesh)
-      {
-        *testout << "calcSegmentTrafo, coarse edge" << endl;
-
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	
-	// xi umrechnen
-	double lami[2] = { xi, 1-xi };
-	double dlami[2] = { 1, -1 };
-
-	double coarse_xi = 0;
-	double trans = 0;
-	for (int i = 0; i < 2; i++)
-	  {
-	    coarse_xi += hpref_el.param[i][0] * lami[i];
-	    trans += hpref_el.param[i][0] * dlami[i];
-	  }
-
-	mesh.coarsemesh->GetCurvedElements().CalcSegmentTransformation (coarse_xi, hpref_el.coarse_elnr, x, dxdxi, curved);
-	if (dxdxi) *dxdxi *= trans;
-	
-	return;
-      }
-    
-
-    Vector shapes, dshapes;
-    ARRAY<Vec<3> > coefs;
-
-    SegmentInfo info;
-    info.elnr = elnr;
-    info.order = order;
-    info.ndof = info.nv = 2;
-
-    if (info.order > 1)
-      {
-	const MeshTopology & top = mesh.GetTopology();
-	info.edgenr = top.GetSegmentEdge (elnr+1)-1;	
-	info.ndof += edgeorder[info.edgenr]-1;
-      }
-
-    CalcElementShapes (info, xi, shapes);
-    GetCoefficients (info, coefs);
-
-    *x = 0;
-    for (int i = 0; i < shapes.Size(); i++)
-      *x += shapes(i) * coefs[i];
-
-
-    if (dxdxi)
-      {
-	CalcElementDShapes (info, xi, dshapes);
-	
-	*dxdxi = 0;
-	for (int i = 0; i < shapes.Size(); i++)
-	  for (int j = 0; j < 3; j++)
-	    (*dxdxi)(j) += dshapes(i) * coefs[i](j);
-      }
-
-    if (curved)
-      *curved = (info.order > 1);
-  }
-
-
-
-
-  void CurvedElements :: 
-  CalcElementShapes (SegmentInfo & info, double xi, Vector & shapes) const
-  {
-    if (rational && info.order == 2)
-      {
-        shapes.SetSize(3);
-        double w = edgeweight[info.edgenr];
-        shapes(0) = xi*xi;
-        shapes(1) = (1-xi)*(1-xi);
-        shapes(2) = 2*w*xi*(1-xi);
-        shapes *= 1.0 / (1 + (w-1) *2*xi*(1-xi));
-        return;
-      }
-
-
-    shapes.SetSize(info.ndof);
-    shapes(0) = xi;
-    shapes(1) = 1-xi;
-
-    if (info.order >= 2)
-      {
-	if (mesh[info.elnr].p1 > mesh[info.elnr].p2)
-	  xi = 1-xi;
-	CalcEdgeShape (edgeorder[info.edgenr], 2*xi-1, &shapes(2));
-      }
-  }
-
-  void CurvedElements :: 
-  CalcElementDShapes (SegmentInfo & info, double xi, Vector & dshapes) const
-  {
-    if (rational && info.order == 2)
-      {
-        dshapes.SetSize(3);
-        double wi = edgeweight[info.edgenr];
-        double shapes[3];
-        shapes[0] = xi*xi;
-        shapes[1] = (1-xi)*(1-xi);
-        shapes[2] = 2*wi*xi*(1-xi);
-        double w = 1 + (wi-1) *2*xi*(1-xi);
-        double dw = (wi-1) * (2 - 4*xi);
-        
-        dshapes(0) = 2*xi;
-        dshapes(1) = 2*(xi-1);
-        dshapes(2) = 2*wi*(1-2*xi);
-
-        for (int j = 0;j < 3; j++)
-          dshapes(j) = dshapes(j) / w - shapes[j] * dw / (w*w);
-        return;
-      }
-
-
-
-
-
-
-    dshapes.SetSize(info.ndof);
-    dshapes = 0;
-    dshapes(0) = 1;
-    dshapes(1) = -1;
-
-    // int order = edgeorder[info.edgenr];
-
-    if (info.order >= 2)
-      {
-        double fac = 2;
-	if (mesh[info.elnr].p1 > mesh[info.elnr].p2)
-          {
-            xi = 1-xi; 
-            fac *= -1;
-          }
-	CalcEdgeDx (edgeorder[info.edgenr], 2*xi-1, &dshapes(2));
-        for (int i = 2; i < dshapes.Size(); i++)
-          dshapes(i) *= fac;
-      }
-
-    // ??? not implemented ????
-  }
-
-  void CurvedElements :: 
-  GetCoefficients (SegmentInfo & info, ARRAY<Vec<3> > & coefs) const
-  {
-    const Segment & el = mesh[info.elnr];
-
-    coefs.SetSize(info.ndof);
-
-    coefs[0] = Vec<3> (mesh[el.p1]);
-    coefs[1] = Vec<3> (mesh[el.p2]);
-
-    if (info.order >= 2)
-      {
-	int first = edgecoeffsindex[info.edgenr]; 
-	int next = edgecoeffsindex[info.edgenr+1]; 
-	for (int i = 0; i < next-first; i++)
-	  coefs[i+2] = edgecoeffs[first+i];
-      }
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-
-  // ********************** Transform surface elements *******************
-
-
-  bool CurvedElements :: IsSurfaceElementCurved (SurfaceElementIndex elnr) const
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	
-	return mesh.coarsemesh->GetCurvedElements().IsSurfaceElementCurved (hpref_el.coarse_elnr);
-      }
-
-    const Element2d & el = mesh[elnr];
-    ELEMENT_TYPE type = el.GetType();
-    
-    SurfaceElementInfo info;
-    info.elnr = elnr;
-    info.order = order;
-    info.ndof = info.nv = (type == TRIG) ? 3 : 4;
-    if (info.order > 1)
-      {
-	const MeshTopology & top = mesh.GetTopology();
-	
-	top.GetSurfaceElementEdges (elnr+1, info.edgenrs);
-	for (int i = 0; i < info.edgenrs.Size(); i++)
-	  info.edgenrs[i]--;
-	info.facenr = top.GetSurfaceElementFace (elnr+1)-1;
-
-	for (int i = 0; i < info.edgenrs.Size(); i++)
-	  info.ndof += edgecoeffsindex[info.edgenrs[i]+1] - edgecoeffsindex[info.edgenrs[i]];
-	info.ndof += facecoeffsindex[info.facenr+1] - facecoeffsindex[info.facenr];
-      }
-
-    return (info.ndof > info.nv);
-  }
-  
-  void CurvedElements :: 
-  CalcSurfaceTransformation (Point<2> xi, SurfaceElementIndex elnr,
-			     Point<3> * x, Mat<3,2> * dxdxi, bool * curved)
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	
-	  // xi umrechnen
-	double lami[4];
-	FlatVector vlami(4, lami);
-	vlami = 0;
-	mesh[elnr].GetShapeNew (xi, vlami);
-	
-	Mat<2,2> trans;
-	Mat<3,2> dxdxic;
-	if (dxdxi)
-	  {
-	    MatrixFixWidth<2> dlami(4);
-	    dlami = 0;
-	    mesh[elnr].GetDShapeNew (xi, dlami);	  
-	    
-	    trans = 0;
-	    for (int k = 0; k < 2; k++)
-	      for (int l = 0; l < 2; l++)
-		for (int i = 0; i < hpref_el.np; i++)
-		  trans(l,k) += hpref_el.param[i][l] * dlami(i, k);
-	    }
-	
-	Point<2> coarse_xi(0,0);
-	for (int i = 0; i < hpref_el.np; i++)
-	  for (int j = 0; j < 2; j++)
-	    coarse_xi(j) += hpref_el.param[i][j] * lami[i];
-	
-	mesh.coarsemesh->GetCurvedElements().CalcSurfaceTransformation (coarse_xi, hpref_el.coarse_elnr, x, &dxdxic, curved);
-	
-	if (dxdxi)
-	  *dxdxi = dxdxic * trans;
-	
-	return;
-      }
-    
-
-
-    Vector shapes;
-    DenseMatrix dshapes;
-    ARRAY<Vec<3> > coefs;
-
-    const Element2d & el = mesh[elnr];
-    ELEMENT_TYPE type = el.GetType();
-
-    SurfaceElementInfo info;
-    info.elnr = elnr;
-    info.order = order;
-    info.ndof = info.nv = (type == TRIG) ? 3 : 4;
-    if (info.order > 1)
-      {
-	const MeshTopology & top = mesh.GetTopology();
-	
-	top.GetSurfaceElementEdges (elnr+1, info.edgenrs);
-	for (int i = 0; i < info.edgenrs.Size(); i++)
-	  info.edgenrs[i]--;
-	info.facenr = top.GetSurfaceElementFace (elnr+1)-1;
-
-
-	bool firsttry = true;
-	bool problem = false;
-
-	while(firsttry || problem)
-	  {
-	    problem = false;
-
-	    for (int i = 0; !problem && i < info.edgenrs.Size(); i++)
-	      {
-		if(info.edgenrs[i]+1 >= edgecoeffsindex.Size())
-		  problem = true;
-		else
-		  info.ndof += edgecoeffsindex[info.edgenrs[i]+1] - edgecoeffsindex[info.edgenrs[i]];
-	      }
-	    if(info.facenr+1 >= facecoeffsindex.Size())
-	      problem = true;
-	    else
-	      info.ndof += facecoeffsindex[info.facenr+1] - facecoeffsindex[info.facenr];
-
-	    if(problem && !firsttry)
-	      throw NgException("something wrong with curved elements");
-	    
-	    if(problem)
-	      BuildCurvedElements(NULL,order,rational);
-
-	    firsttry = false;
-	  }
-      }
-
-    CalcElementShapes (info, xi, shapes);
-    GetCoefficients (info, coefs);
-
-    *x = 0;
-    for (int i = 0; i < coefs.Size(); i++)
-      *x += shapes(i) * coefs[i];
-
-    if (dxdxi)
-      {
-	CalcElementDShapes (info, xi, dshapes);
-	
-	*dxdxi = 0;
-	for (int i = 0; i < coefs.Size(); i++)
-	  for (int j = 0; j < 3; j++)
-	    for (int k = 0; k < 2; k++)
-	      (*dxdxi)(j,k) += dshapes(i,k) * coefs[i](j);
-      }
-
-    if (curved)
-      *curved = (info.ndof > info.nv);
-  }
-
-
-
-
-  void CurvedElements :: 
-  CalcElementShapes (SurfaceElementInfo & info, const Point<2> & xi, Vector & shapes) const
-  {
-    const Element2d & el = mesh[info.elnr];
-
-    shapes.SetSize(info.ndof);
-    shapes = 0;	  
-
-    if (rational && info.order >= 2)
-      {
-        shapes.SetSize(6);
-        double w = 1;
-        double lami[3] = { xi(0), xi(1), 1-xi(0)-xi(1) };
-        for (int j = 0; j < 3; j++)
-          shapes(j) = lami[j] * lami[j];
-
-        const ELEMENT_EDGE * edges = MeshTopology::GetEdges (TRIG);
-        for (int j = 0; j < 3; j++)
-          {
-            double wi = edgeweight[info.edgenrs[j]];
-            shapes(j+3) = 2 * wi * lami[edges[j][0]-1] * lami[edges[j][1]-1];
-            w += (wi-1) * 2 * lami[edges[j][0]-1] * lami[edges[j][1]-1];
-          }
-
-        shapes *= 1.0 / w;
-        return;
-      }
-
-    switch (el.GetType())
-      {
-      case TRIG:
-	{
-	  shapes(0) = xi(0);
-	  shapes(1) = xi(1);
-	  shapes(2) = 1-xi(0)-xi(1);
-
-	  if (info.order == 1) return;
-
-	  int ii = 3;
-	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (TRIG);
-	  
-	  for (int i = 0; i < 3; i++)
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = edges[i][0]-1, vi2 = edges[i][1]-1;
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  CalcScaledEdgeShape (eorder, shapes(vi1)-shapes(vi2), shapes(vi1)+shapes(vi2), &shapes(ii));
-		  ii += eorder-1;
-		}
-	    }
-
-	  int forder = faceorder[info.facenr];
-	  if (forder >= 3)
-	    {
-	      int fnums[] = { 0, 1, 2 };
-	      if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-	      if (el[fnums[1]] > el[fnums[2]]) swap (fnums[1], fnums[2]);
-	      if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-	      
-	      CalcTrigShape (forder, 
-			     shapes(fnums[1])-shapes(fnums[0]),
-			     1-shapes(fnums[1])-shapes(fnums[0]), &shapes(ii));
-	    }
-	  break;
-	}
-
-      case QUAD:
-	{
-	  shapes(0) = (1-xi(0))*(1-xi(1));
-	  shapes(1) =    xi(0) *(1-xi(1));
-	  shapes(2) =    xi(0) *   xi(1) ;
-	  shapes(3) = (1-xi(0))*   xi(1) ;
-
-	  if (info.order == 1) return;
-	  
-	  double mu[4] = { 
-	    1 - xi(0) + 1 - xi(1), 
-	        xi(0) + 1 - xi(1), 
-	        xi(0) +     xi(1), 
-	    1 - xi(0) +     xi(1), 
-	  };
-	    
-	  int ii = 4;
-	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (QUAD);
-	  
-	  for (int i = 0; i < 4; i++)
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = edges[i][0]-1, vi2 = edges[i][1]-1;
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  CalcEdgeShape (eorder, mu[vi1]-mu[vi2], &shapes(ii));
-		  double lame = shapes(vi1)+shapes(vi2);
-		  for (int j = 0; j < order-1; j++)
-		    shapes(ii+j) *= lame;
-		  ii += eorder-1;
-		}
-	    }
-	  
-	  for (int i = ii; i < info.ndof; i++)
-	    shapes(i) = 0;
-
-	  break;
-	}
-      };
-  }
-
-
-  void CurvedElements :: 
-  CalcElementDShapes (SurfaceElementInfo & info, const Point<2> & xi, DenseMatrix & dshapes) const
-  {
-    const Element2d & el = mesh[info.elnr];
-    ELEMENT_TYPE type = el.GetType();
-
-    double lami[4];
-
-    dshapes.SetSize(info.ndof,2);
-    dshapes = 0;	  
-
-
-
-    if (rational && info.order >= 2)
-      {
-        double w = 1;
-        double dw[2] = { 0, 0 };
-
-
-        lami[0] = xi(0); lami[1] = xi(1); lami[2] = 1-xi(0)-xi(1);
-        double dlami[3][2] = { { 1, 0 }, { 0, 1 }, { -1, -1 }};
-        double shapes[6];
-
-        for (int j = 0; j < 3; j++)
-          {
-            shapes[j] = lami[j] * lami[j];
-            dshapes(j,0) = 2 * lami[j] * dlami[j][0];
-            dshapes(j,1) = 2 * lami[j] * dlami[j][1];
-          }
-
-        const ELEMENT_EDGE * edges = MeshTopology::GetEdges (TRIG);
-        for (int j = 0; j < 3; j++)
-          {
-            double wi = edgeweight[info.edgenrs[j]];
-
-            shapes[j+3] = 2 * wi * lami[edges[j][0]-1] * lami[edges[j][1]-1];
-            for (int k = 0; k < 2; k++)
-              dshapes(j+3,k) = 2*wi* (lami[edges[j][0]-1] * dlami[edges[j][1]-1][k] +
-                                      lami[edges[j][1]-1] * dlami[edges[j][0]-1][k]);
-
-            w += (wi-1) * 2 * lami[edges[j][0]-1] * lami[edges[j][1]-1];
-            for (int k = 0; k < 2; k++)
-              dw[k] += 2*(wi-1) * (lami[edges[j][0]-1] * dlami[edges[j][1]-1][k] +
-                                  lami[edges[j][1]-1] * dlami[edges[j][0]-1][k]);
-          }
-        // shapes *= 1.0 / w;
-        dshapes *= 1.0 / w;
-        for (int i = 0; i < 6; i++)
-          for (int j = 0; j < 2; j++)
-            dshapes(i,j) -= shapes[i] * dw[j] / (w*w);
-        return;
-      }
-
-
-
-
-
-    switch (type)
-      {
-      case TRIG:
-	{
-	  dshapes(0,0) = 1;
-	  dshapes(1,1) = 1;
-	  dshapes(2,0) = -1;
-	  dshapes(2,1) = -1;
-	  
-	  if (info.order == 1) return;
-
-	  lami[0] = xi(0);
-	  lami[1] = xi(1);
-	  lami[2] = 1-xi(0)-xi(1);
-
-	  int ii = 3;
-	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (TRIG);
-	  
-	  for (int i = 0; i < 3; i++)
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = edges[i][0]-1, vi2 = edges[i][1]-1;
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  CalcScaledEdgeShapeDxDt<2> (eorder, lami[vi1]-lami[vi2], lami[vi1]+lami[vi2], &dshapes(ii,0));
-
-		  Mat<2,2> trans;
-		  for (int j = 0; j < 2; j++)
-		    {
-		      trans(0,j) = dshapes(vi1,j)-dshapes(vi2,j);
-		      trans(1,j) = dshapes(vi1,j)+dshapes(vi2,j);
-		    }
-		  
-		  for (int j = 0; j < eorder-1; j++)
-		    {
-		      double ddx = dshapes(ii+j,0);
-		      double ddt = dshapes(ii+j,1);
-		      dshapes(ii+j,0) = ddx * trans(0,0) + ddt * trans(1,0);
-		      dshapes(ii+j,1) = ddx * trans(0,1) + ddt * trans(1,1);
-		    }
-
-		  ii += eorder-1;
-		}
-	    }
-
-	  int forder = faceorder[info.facenr];
-	  if (forder >= 3)
-	    {
-	      int fnums[] = { 0, 1, 2 };
-	      if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-	      if (el[fnums[1]] > el[fnums[2]]) swap (fnums[1], fnums[2]);
-	      if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-	      
-	      CalcTrigShapeDxDy (forder, 
-				 lami[fnums[1]]-lami[fnums[0]],
-				 1-lami[fnums[1]]-lami[fnums[0]], &dshapes(ii,0));
-
-	      int nd = (forder-1)*(forder-2)/2;
-	      Mat<2,2> trans;
-	      for (int j = 0; j < 2; j++)
-		{
-		  trans(0,j) = dshapes(fnums[1],j)-dshapes(fnums[0],j);
-		  trans(1,j) = -dshapes(fnums[1],j)-dshapes(fnums[0],j);
-		}
-
-	      for (int j = 0; j < nd; j++)
-		{
-		  double ddx = dshapes(ii+j,0);
-		  double ddt = dshapes(ii+j,1);
-		  dshapes(ii+j,0) = ddx * trans(0,0) + ddt * trans(1,0);
-		  dshapes(ii+j,1) = ddx * trans(0,1) + ddt * trans(1,1);
-		}
-	    }
-
-	  break;
-	}
-      case QUAD:
-	{
-	  dshapes(0,0) = -(1-xi(1));
-	  dshapes(0,1) = -(1-xi(0));
-	  dshapes(1,0) =  (1-xi(1));
-	  dshapes(1,1) =    -xi(0);
-	  dshapes(2,0) =     xi(1);
-	  dshapes(2,1) =     xi(0);
-	  dshapes(3,0) =    -xi(1);
-	  dshapes(3,1) =  (1-xi(0));
-
-	  if (info.order == 1) return;
-
-	  double shapes[4] = {
-	    (1-xi(0))*(1-xi(1)),
-	       xi(0) *(1-xi(1)),
-	       xi(0) *   xi(1) ,
-	    (1-xi(0))*   xi(1) 
-	  };
-
-	  double mu[4] = { 
-	    1 - xi(0) + 1 - xi(1), 
-	        xi(0) + 1 - xi(1), 
-	        xi(0) +     xi(1), 
-	    1 - xi(0) +     xi(1), 
-	  };
-
-	  double dmu[4][2] = {
-	    { -1, -1 },
-	    { 1, -1 },
-	    { 1, 1 },
-	    { -1, 1 } };
-	    
-	  // double hshapes[20], hdshapes[20];
-          ArrayMem<double, 20> hshapes(order+1), hdshapes(order+1);
-
-	  int ii = 4;
-	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (QUAD);
-	  
-	  for (int i = 0; i < 4; i++)
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = edges[i][0]-1, vi2 = edges[i][1]-1;
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  CalcEdgeShapeDx (eorder, mu[vi1]-mu[vi2], &hshapes[0], &hdshapes[0]);
-
-		  double lame = shapes[vi1]+shapes[vi2];
-		  double dlame[2] = {
-		    dshapes(vi1, 0) + dshapes(vi2, 0),
-		    dshapes(vi1, 1) + dshapes(vi2, 1) };
-		    
-		  for (int j = 0; j < eorder-1; j++)
-		    for (int k = 0; k < 2; k++)
-		      dshapes(ii+j, k) = 
-			lame * hdshapes[j] * (dmu[vi1][k]-dmu[vi2][k])
-			+ dlame[k] * hshapes[j];
-
-		  ii += eorder-1;
-		}
-	    }
-
-	  /*	  
-	  *testout << "quad, dshape = " << endl << dshapes << endl;
-	  for (int i = 0; i < 2; i++)
-	    {
-	      Point<2> xil = xi, xir = xi;
-	      Vector shapesl(dshapes.Height()), shapesr(dshapes.Height());
-	      xil(i) -= 1e-6;
-	      xir(i) += 1e-6;
-	      CalcElementShapes (info, xil, shapesl);
-	      CalcElementShapes (info, xir, shapesr);
-	      
-	      for (int j = 0; j < dshapes.Height(); j++)
-		dshapes(j,i) = 1.0 / 2e-6 * (shapesr(j)-shapesl(j));
-	    }
-	  
-	  *testout << "quad, num dshape = " << endl << dshapes << endl;
-	  */
-	  break;
-	}
-      };
-  }
-
-
-
-  void CurvedElements :: 
-  GetCoefficients (SurfaceElementInfo & info, ARRAY<Vec<3> > & coefs) const
-  {
-    const Element2d & el = mesh[info.elnr];
-
-    coefs.SetSize (info.ndof);
-    // coefs = Vec<3> (0,0,0);
-    
-    for (int i = 0; i < info.nv; i++)
-      coefs[i] = Vec<3> (mesh[el[i]]);
-    
-    if (info.order == 1) return;
-
-    int ii = info.nv;
-	  
-    for (int i = 0; i < info.edgenrs.Size(); i++)
-      {
-	int first = edgecoeffsindex[info.edgenrs[i]];
-	int next = edgecoeffsindex[info.edgenrs[i]+1];
-	for (int j = first; j < next; j++, ii++)
-	  coefs[ii] = edgecoeffs[j];
-      }
-    
-    int first = facecoeffsindex[info.facenr];
-    int next = facecoeffsindex[info.facenr+1];
-    for (int j = first; j < next; j++, ii++)
-      coefs[ii] = facecoeffs[j];
-  }
-
-
-
-
-
-
-
-  // ********************** Transform volume elements *******************
-
-
-  bool CurvedElements :: IsElementCurved (ElementIndex elnr) const
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	
-	return mesh.coarsemesh->GetCurvedElements().IsElementCurved (hpref_el.coarse_elnr);
-      }
-
-    const Element & el = mesh[elnr];
-    ELEMENT_TYPE type = el.GetType();
-    
-    ElementInfo info;
-    info.elnr = elnr;
-    info.order = order;
-    info.ndof = info.nv = MeshTopology::GetNVertices (type);
-    if (info.order > 1)
-      {
-	const MeshTopology & top = mesh.GetTopology();
-	
-	info.nedges = top.GetElementEdges (elnr+1, info.edgenrs, 0);
-	for (int i = 0; i < info.nedges; i++)
-	  info.edgenrs[i]--;
-
-	info.nfaces = top.GetElementFaces (elnr+1, info.facenrs, 0);
-	for (int i = 0; i < info.nfaces; i++)
-	  info.facenrs[i]--;
-
-	for (int i = 0; i < info.nedges; i++)
-	  info.ndof += edgecoeffsindex[info.edgenrs[i]+1] - edgecoeffsindex[info.edgenrs[i]];
-	for (int i = 0; i < info.nfaces; i++)
-	  info.ndof += facecoeffsindex[info.facenrs[i]+1] - facecoeffsindex[info.facenrs[i]];
-      }
-
-    return (info.ndof > info.nv);
-  }
-
-
-
-
-
-
-  void CurvedElements :: 
-  CalcElementTransformation (Point<3> xi, ElementIndex elnr,
-			     Point<3> * x, Mat<3,3> * dxdxi, //  bool * curved,
-                             void * buffer, bool valid)
-  {
-    if (mesh.coarsemesh)
-      {
-	  const HPRefElement & hpref_el =
-	    (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	  
-	  // xi umrechnen
-	  double lami[8];
-	  FlatVector vlami(8, lami);
-	  vlami = 0;
-	  mesh[elnr].GetShapeNew (xi, vlami);
-
-	  Mat<3,3> trans, dxdxic;
-	  if (dxdxi)
-	    {
-	      MatrixFixWidth<3> dlami(8);
-	      dlami = 0;
-	      mesh[elnr].GetDShapeNew (xi, dlami);	  
-	      
-	      trans = 0;
-	      for (int k = 0; k < 3; k++)
-		for (int l = 0; l < 3; l++)
-		  for (int i = 0; i < hpref_el.np; i++)
-		    trans(l,k) += hpref_el.param[i][l] * dlami(i, k);
-	    }
-
-	  Point<3> coarse_xi(0,0,0);
-	  for (int i = 0; i < hpref_el.np; i++)
-	    for (int j = 0; j < 3; j++)
-	      coarse_xi(j) += hpref_el.param[i][j] * lami[i];
-
-	  mesh.coarsemesh->GetCurvedElements().CalcElementTransformation (coarse_xi, hpref_el.coarse_elnr, x, &dxdxic /* , curved */);
-
-	  if (dxdxi)
-	    *dxdxi = dxdxic * trans;
-
-	  return;
-	}
-
-
-    Vector shapes;
-    MatrixFixWidth<3> dshapes;
-
-    const Element & el = mesh[elnr];
-    ELEMENT_TYPE type = el.GetType();
-
-    ElementInfo hinfo;
-    ElementInfo & info = (buffer) ? *static_cast<ElementInfo*> (buffer) : hinfo;
-    
-
-    if (!valid)
-      {
-        info.elnr = elnr;
-        info.order = order;
-        info.ndof = info.nv = MeshTopology::GetNVertices (type);
-        if (info.order > 1)
-          {
-            const MeshTopology & top = mesh.GetTopology();
-            
-            info.nedges = top.GetElementEdges (elnr+1, info.edgenrs, 0);
-            for (int i = 0; i < info.nedges; i++)
-              info.edgenrs[i]--;
-            
-            info.nfaces = top.GetElementFaces (elnr+1, info.facenrs, 0);
-            for (int i = 0; i < info.nfaces; i++)
-              info.facenrs[i]--;
-            
-            for (int i = 0; i < info.nedges; i++)
-              info.ndof += edgecoeffsindex[info.edgenrs[i]+1] - edgecoeffsindex[info.edgenrs[i]];
-            for (int i = 0; i < info.nfaces; i++)
-              info.ndof += facecoeffsindex[info.facenrs[i]+1] - facecoeffsindex[info.facenrs[i]];
-          }
-      }
-
-    CalcElementShapes (info, xi, shapes);
-
-    Vec<3> * coefs =  (info.ndof <= 10) ? 
-      &info.hcoefs[0] : new Vec<3> [info.ndof];
-
-    if (info.ndof > 10 || !valid)
-      GetCoefficients (info, coefs);
-
-    if (x)
-      {
-        *x = 0;
-        for (int i = 0; i < shapes.Size(); i++)
-          *x += shapes(i) * coefs[i];
-      }
-
-    if (dxdxi)
-      {
-        if (valid && info.order == 1 && info.nv == 4)   // a linear tet
-          {
-            *dxdxi = info.hdxdxi;
-          }
-        else
-          {
-            CalcElementDShapes (info, xi, dshapes);
-            
-            *dxdxi = 0;
-            for (int i = 0; i < shapes.Size(); i++)
-              for (int j = 0; j < 3; j++)
-                for (int k = 0; k < 3; k++)
-                  (*dxdxi)(j,k) += dshapes(i,k) * coefs[i](j);
-            
-            info.hdxdxi = *dxdxi;
-          }
-      }
-
-    // *testout << "curved_elements, dshapes = " << endl << dshapes << endl;
-
-    //    if (curved) *curved = (info.ndof > info.nv);
-
-    if (info.ndof > 10) delete [] coefs;
-  }
-
-
-
-
-  void CurvedElements ::   CalcElementShapes (ElementInfo & info, const Point<3> & xi, Vector & shapes) const
-  {
-    const Element & el = mesh[info.elnr];
-
-    if (rational && info.order >= 2)
-      {
-        shapes.SetSize(10);
-        double w = 1;
-        double lami[4] = { xi(0), xi(1), xi(2), 1-xi(0)-xi(1)-xi(2) };
-        for (int j = 0; j < 4; j++)
-          shapes(j) = lami[j] * lami[j];
-
-        const ELEMENT_EDGE * edges = MeshTopology::GetEdges (TET);
-        for (int j = 0; j < 6; j++)
-          {
-            double wi = edgeweight[info.edgenrs[j]];
-            shapes(j+4) = 2 * wi * lami[edges[j][0]-1] * lami[edges[j][1]-1];
-            w += (wi-1) * 2 * lami[edges[j][0]-1] * lami[edges[j][1]-1];
-          }
-
-        shapes *= 1.0 / w;
-        return;
-      }
-
-    shapes.SetSize(info.ndof);
-    
-    switch (el.GetType())
-      {
-      case TET:
-	{
-	  shapes(0) = xi(0);
-	  shapes(1) = xi(1);
-	  shapes(2) = xi(2);
-	  shapes(3) = 1-xi(0)-xi(1)-xi(2);
-
-	  if (info.order == 1) return;
-
-	  int ii = 4;
-	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (TET);
-	  for (int i = 0; i < 6; i++)
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = edges[i][0]-1, vi2 = edges[i][1]-1;
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  CalcScaledEdgeShape (eorder, shapes(vi1)-shapes(vi2), shapes(vi1)+shapes(vi2), &shapes(ii));
-		  ii += eorder-1;
-		}
-	    }
-	  const ELEMENT_FACE * faces = MeshTopology::GetFaces (TET);
-	  for (int i = 0; i < 4; i++)
-	    {
-	      int forder = faceorder[info.facenrs[i]];
-	      if (forder >= 3)
-		{
-		  int fnums[] = { faces[i][0]-1, faces[i][1]-1, faces[i][2]-1 }; 
-		  if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-		  if (el[fnums[1]] > el[fnums[2]]) swap (fnums[1], fnums[2]);
-		  if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-
-		  CalcScaledTrigShape (forder, 
-				       shapes(fnums[1])-shapes(fnums[0]), shapes(fnums[2]), 
-				       shapes(fnums[0])+shapes(fnums[1])+shapes(fnums[2]), &shapes(ii));
-		  ii += (forder-1)*(forder-2)/2;
-		  // CalcScaledEdgeShape (forder, shapes(vi1)-shapes(vi2), shapes(vi1)+shapes(vi2), &shapes(ii));
-		  // ii += forder-1;
-		}
-	    }
-
-
-	  break;
-	}
-      case PRISM:
-	{
-	  double lami[6] = { xi(0), xi(1), 1-xi(0)-xi(1), xi(0), xi(1), 1-xi(0)-xi(1) };
-	  double lamiz[6] = { 1-xi(2), 1-xi(2), 1-xi(2), xi(2), xi(2), xi(2) };
-	  for (int i = 0; i < 6; i++)
-	    shapes(i) = lami[i%3] * ( (i < 3) ? (1-xi(2)) : xi(2) );
-	  for (int i = 6; i < info.ndof; i++)
-	    shapes(i) = 0;
-
-          if (info.order == 1) return;
-
-
-	  int ii = 6;
- 	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (PRISM);
-	  for (int i = 0; i < 6; i++)    // horizontal edges
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = (edges[i][0]-1) % 3, vi2 = (edges[i][1]-1) % 3;
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  CalcScaledEdgeShape (eorder, lami[vi1]-lami[vi2], lami[vi1]+lami[vi2], &shapes(ii));
-		  double facz = (i < 3) ? (1-xi(2)) : xi(2);
-		  for (int j = 0; j < eorder-1; j++)
-		    shapes(ii+j) *= facz;
-
-		  ii += eorder-1;
-		}
-	    }
-
-	  for (int i = 6; i < 9; i++)    // vertical edges
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = (edges[i][0]-1), vi2 = (edges[i][1]-1);
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  double bubz = lamiz[vi1]*lamiz[vi2];
-		  double polyz = lamiz[vi1] - lamiz[vi2];
-		  double bubxy = lami[(vi1)%3];
-
-		  for (int j = 0; j < eorder-1; j++)
-		    {
-		      shapes(ii+j) = bubxy * bubz;
-		      bubz *= polyz;
-		    }
-		  ii += eorder-1;
-		}
-	    }
-
-	  // FACE SHAPES
-	  const ELEMENT_FACE * faces = MeshTopology::GetFaces (PRISM);
-	  for (int i = 0; i < 2; i++)
-	    {
-	      int forder = faceorder[info.facenrs[i]];
-	      if ( forder < 3 ) continue;
-	      int fav[3] = { faces[i][0]-1, faces[i][1]-1, faces[i][2]-1 };
-	      if(el[fav[0]] > el[fav[1]]) swap(fav[0],fav[1]); 
-	      if(el[fav[1]] > el[fav[2]]) swap(fav[1],fav[2]);
-	      if(el[fav[0]] > el[fav[1]]) swap(fav[0],fav[1]); 	
-
-	      CalcTrigShape (forder, 
-			     lami[fav[2]]-lami[fav[1]], lami[fav[0]],
-			     &shapes(ii));
-	      
-	      int ndf = (forder+1)*(forder+2)/2 - 3 - 3*(forder-1);
-	      for ( int j = 0; j < ndf; j++ )
-		shapes(ii+j) *= lamiz[fav[1]];
-	      ii += ndf;
-	    }
-	  break;
-	}
-
-      case PYRAMID:
-	{
-	  shapes = 0.0;
-	  double x = xi(0);
-	  double y = xi(1);
-	  double z = xi(2);
-	  
-	  if (z == 1.) z = 1-1e-10;
-	  shapes[0] = (1-z-x)*(1-z-y) / (1-z);
-	  shapes[1] = x*(1-z-y) / (1-z);
-	  shapes[2] = x*y / (1-z);
-	  shapes[3] = (1-z-x)*y / (1-z);
-	  shapes[4] = z;
-          
-          if (info.order == 1) return;
-
-	  int ii = 5;
-	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (PYRAMID);
-	  for (int i = 0; i < 4; i++)    // horizontal edges
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = (edges[i][0]-1), vi2 = (edges[i][1]-1);
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  CalcScaledEdgeShape (eorder, shapes[vi1]-shapes[vi2], shapes[vi1]+shapes[vi2], &shapes(ii));
-		  double fac = (shapes[vi1]+shapes[vi2]) / (1-z);
-		  for (int j = 0; j < eorder-1; j++)
-		    shapes(ii+j) *= fac;
-
-		  ii += eorder-1;
-		}
-	    }
-
-
-
-	  break;
-	}
-
-      case HEX:
-        {
-	  shapes = 0.0;
-	  double x = xi(0);
-	  double y = xi(1);
-	  double z = xi(2);
-	  
-	  shapes[0] = (1-x)*(1-y)*(1-z);
-	  shapes[1] =    x *(1-y)*(1-z);
-	  shapes[2] =    x *   y *(1-z);
-	  shapes[3] = (1-x)*   y *(1-z);
-	  shapes[4] = (1-x)*(1-y)*(z);
-	  shapes[5] =    x *(1-y)*(z);
-	  shapes[6] =    x *   y *(z);
-	  shapes[7] = (1-x)*   y *(z);
-          break;
-        }
-      };
-  }
-
-
-  void CurvedElements :: 
-  CalcElementDShapes (ElementInfo & info, const Point<3> & xi, MatrixFixWidth<3> & dshapes) const
-  {
-    const Element & el = mesh[info.elnr];
-
-    dshapes.SetSize(info.ndof);
-    dshapes = 0.0;
-
-
-
-    if (rational && info.order >= 2)
-      {
-        double w = 1;
-        double dw[3] = { 0, 0, 0 };
-
-        double lami[4] = { xi(0), xi(1), xi(2), 1-xi(0)-xi(1)-xi(2) };
-        double dlami[4][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }, { -1, -1, -1 }};
-        double shapes[10];
-
-        for (int j = 0; j < 4; j++)
-          {
-            shapes[j] = lami[j] * lami[j];
-            dshapes(j,0) = 2 * lami[j] * dlami[j][0];
-            dshapes(j,1) = 2 * lami[j] * dlami[j][1];
-            dshapes(j,2) = 2 * lami[j] * dlami[j][2];
-          }
-
-        const ELEMENT_EDGE * edges = MeshTopology::GetEdges (TET);
-        for (int j = 0; j < 6; j++)
-          {
-            double wi = edgeweight[info.edgenrs[j]];
-
-            shapes[j+4] = 2 * wi * lami[edges[j][0]-1] * lami[edges[j][1]-1];
-            for (int k = 0; k < 3; k++)
-              dshapes(j+4,k) = 2*wi* (lami[edges[j][0]-1] * dlami[edges[j][1]-1][k] +
-                                      lami[edges[j][1]-1] * dlami[edges[j][0]-1][k]);
-
-            w += (wi-1) * 2 * lami[edges[j][0]-1] * lami[edges[j][1]-1];
-            for (int k = 0; k < 3; k++)
-              dw[k] += 2*(wi-1) * (lami[edges[j][0]-1] * dlami[edges[j][1]-1][k] +
-                                   lami[edges[j][1]-1] * dlami[edges[j][0]-1][k]);
-          }
-        // shapes *= 1.0 / w;
-        dshapes *= 1.0 / w;
-        for (int i = 0; i < 10; i++)
-          for (int j = 0; j < 3; j++)
-            dshapes(i,j) -= shapes[i] * dw[j] / (w*w);
-        return;
-      }
-
-    switch (el.GetType())
-      {
-      case TET:
-	{
-	  dshapes(0,0) = 1;
-	  dshapes(1,1) = 1;
-	  dshapes(2,2) = 1;
-	  dshapes(3,0) = -1;
-	  dshapes(3,1) = -1;
-	  dshapes(3,2) = -1;
-
-	  if (info.order == 1) return;
-
-	  double lami[] = { xi(0), xi(1), xi(2), 1-xi(0)-xi(1)-xi(2) };
-	  int ii = 4;
-	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (TET);
-	  for (int i = 0; i < 6; i++)
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = edges[i][0]-1, vi2 = edges[i][1]-1;
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  CalcScaledEdgeShapeDxDt<3> (eorder, lami[vi1]-lami[vi2], lami[vi1]+lami[vi2], &dshapes(ii,0));
-
-		  Mat<2,3> trans;
-		  for (int j = 0; j < 3; j++)
-		    {
-		      trans(0,j) = dshapes(vi1,j)-dshapes(vi2,j);
-		      trans(1,j) = dshapes(vi1,j)+dshapes(vi2,j);
-		    }
-		  
-		  for (int j = 0; j < order-1; j++)
-		    {
-		      double ddx = dshapes(ii+j,0);
-		      double ddt = dshapes(ii+j,1);
-		      dshapes(ii+j,0) = ddx * trans(0,0) + ddt * trans(1,0);
-		      dshapes(ii+j,1) = ddx * trans(0,1) + ddt * trans(1,1);
-		      dshapes(ii+j,2) = ddx * trans(0,2) + ddt * trans(1,2);
-		    }
-
-		  ii += eorder-1;
-		}
-	    }
-
-	  const ELEMENT_FACE * faces = MeshTopology::GetFaces (TET);
-	  for (int i = 0; i < 4; i++)
-	    {
-	      int forder = faceorder[info.facenrs[i]];
-	      if (forder >= 3)
-		{
-		  int fnums[] = { faces[i][0]-1, faces[i][1]-1, faces[i][2]-1 }; 
-		  if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-		  if (el[fnums[1]] > el[fnums[2]]) swap (fnums[1], fnums[2]);
-		  if (el[fnums[0]] > el[fnums[1]]) swap (fnums[0], fnums[1]);
-
-		  CalcScaledTrigShapeDxDyDt (forder, 
-					     lami[fnums[1]]-lami[fnums[0]], 
-					     lami[fnums[2]], lami[fnums[0]]+lami[fnums[1]]+lami[fnums[2]],
-					     &dshapes(ii,0));
-
-		  Mat<3,3> trans;
-		  for (int j = 0; j < 3; j++)
-		    {
-		      trans(0,j) = dshapes(fnums[1],j)-dshapes(fnums[0],j);
-		      trans(1,j) = dshapes(fnums[2],j);
-		      trans(2,j) = dshapes(fnums[0],j)+dshapes(fnums[1],j)+dshapes(fnums[2],j);
-		    }
-		  
-		  int nfd = (forder-1)*(forder-2)/2;
-		  for (int j = 0; j < nfd; j++)
-		    {
-		      double ddx = dshapes(ii+j,0);
-		      double ddy = dshapes(ii+j,1);
-		      double ddt = dshapes(ii+j,2);
-		      dshapes(ii+j,0) = ddx * trans(0,0) + ddy * trans(1,0) + ddt * trans(2,0);
-		      dshapes(ii+j,1) = ddx * trans(0,1) + ddy * trans(1,1) + ddt * trans(2,1);
-		      dshapes(ii+j,2) = ddx * trans(0,2) + ddy * trans(1,2) + ddt * trans(2,2);
-		    }
-
-		  ii += nfd;
-		}
-	    }
-
-	  break;
-	}
-      case PRISM:
-	{
-	  double lami[6] = { xi(0), xi(1), 1-xi(0)-xi(1), xi(0), xi(1), 1-xi(0)-xi(1)  };
-	  double lamiz[6] = { 1-xi(2), 1-xi(2), 1-xi(2), xi(2), xi(2), xi(2) };
-	  double dlamiz[6] = { -1, -1, -1, 1, 1, 1 };
-	  double dlami[6][2] = 
-	    { { 1, 0, },
-	      { 0, 1, },
-	      { -1, -1 },
-	      { 1, 0, },
-	      { 0, 1, },
-	      { -1, -1 } };
-	  for (int i = 0; i < 6; i++)
-	    {
-	      // shapes(i) = lami[i%3] * ( (i < 3) ? (1-xi(2)) : xi(2) );
-	      dshapes(i,0) = dlami[i%3][0] * ( (i < 3) ? (1-xi(2)) : xi(2) );
-	      dshapes(i,1) = dlami[i%3][1] * ( (i < 3) ? (1-xi(2)) : xi(2) );
-	      dshapes(i,2) = lami[i%3] * ( (i < 3) ? -1 : 1 );
-	    }
-
-	  int ii = 6;
-
-	  if (info.order == 1) return;
-
-
-	  const ELEMENT_EDGE * edges = MeshTopology::GetEdges (PRISM);
-	  for (int i = 0; i < 6; i++)    // horizontal edges
-	    {
-	      int order = edgeorder[info.edgenrs[i]];
-	      if (order >= 2)
-		{
-		  int vi1 = (edges[i][0]-1) % 3, vi2 = (edges[i][1]-1) % 3;
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  Vector shapei(order+1);
-		  CalcScaledEdgeShapeDxDt<3> (order, lami[vi1]-lami[vi2], lami[vi1]+lami[vi2], &dshapes(ii,0) );
-		  CalcScaledEdgeShape(order, lami[vi1]-lami[vi2], lami[vi1]+lami[vi2], &shapei(0) );
-
-		  Mat<2,2> trans;
-		  for (int j = 0; j < 2; j++)
-		    {
-		      trans(0,j) = dlami[vi1][j]-dlami[vi2][j];
-		      trans(1,j) = dlami[vi1][j]+dlami[vi2][j];
-		    }
-		  
-		  for (int j = 0; j < order-1; j++)
-		    {
-		      double ddx = dshapes(ii+j,0);
-		      double ddt = dshapes(ii+j,1);
-		      dshapes(ii+j,0) = ddx * trans(0,0) + ddt * trans(1,0);
-		      dshapes(ii+j,1) = ddx * trans(0,1) + ddt * trans(1,1);
-		    }
-
-
-
-		  double facz = (i < 3) ? (1-xi(2)) : xi(2);
-		  double dfacz = (i < 3) ? (-1) : 1;
-		  for (int j = 0; j < order-1; j++)
-		    {
-		      dshapes(ii+j,0) *= facz;
-		      dshapes(ii+j,1) *= facz;
-		      dshapes(ii+j,2) = shapei(j) * dfacz;
-		    }
-
-		  ii += order-1;
-		}
-	    }
-	  for (int i = 6; i < 9; i++)    // vertical edges
-	    {
-	      int eorder = edgeorder[info.edgenrs[i]];
-	      if (eorder >= 2)
-		{
-		  int vi1 = (edges[i][0]-1), vi2 = (edges[i][1]-1);
-		  if (el[vi1] > el[vi2]) swap (vi1, vi2);
-
-		  double bubz = lamiz[vi1] * lamiz[vi2];
-		  double dbubz = dlamiz[vi1]*lamiz[vi2] + lamiz[vi1]*dlamiz[vi2];
-		  double polyz = lamiz[vi1] - lamiz[vi2];
-		  double dpolyz = dlamiz[vi1] - dlamiz[vi2];
-		  double bubxy = lami[(vi1)%3];
-		  double dbubxydx = dlami[(vi1)%3][0];
-		  double dbubxydy = dlami[(vi1)%3][1];
-
-		  for (int j = 0; j < eorder-1; j++)
-		    {
-		      dshapes(ii+j,0) = dbubxydx * bubz;
-		      dshapes(ii+j,1) = dbubxydy * bubz;
-		      dshapes(ii+j,2) = bubxy * dbubz;
-
-		      dbubz = bubz * dpolyz + dbubz * polyz;
-		      bubz *= polyz;
-		    }
-		  ii += eorder-1;
-		}
-	    }
-
-
-	  if (info.order == 2) return;
-	  // FACE SHAPES
-	  const ELEMENT_FACE * faces = MeshTopology::GetFaces (PRISM);
-	  for (int i = 0; i < 2; i++)
-	    {
-	      int forder = faceorder[info.facenrs[i]];
-	      if ( forder < 3 ) continue;
-	      int ndf = (forder+1)*(forder+2)/2 - 3 - 3*(forder-1);
-
-	      int fav[3] = { faces[i][0]-1, faces[i][1]-1, faces[i][2]-1 };
-	      if(el[fav[0]] > el[fav[1]]) swap(fav[0],fav[1]); 
-	      if(el[fav[1]] > el[fav[2]]) swap(fav[1],fav[2]);
-	      if(el[fav[0]] > el[fav[1]]) swap(fav[0],fav[1]); 	
-
-	      MatrixFixWidth<2> dshapei(ndf);
-	      Vector shapei(ndf);
-
-	      CalcTrigShapeDxDy (forder, 
-				 lami[fav[2]]-lami[fav[1]], lami[fav[0]],
-				 &dshapei(0,0));
-	      CalcTrigShape (forder, lami[fav[2]]-lami[fav[1]], lami[fav[0]],
-				 &shapei(0));
-	      
-	      Mat<2,2> trans;
-	      for (int j = 0; j < 2; j++)
-		{
-		  trans(0,j) = dlami[fav[2]][j]-dlami[fav[1]][j];
-		  trans(1,j) = dlami[fav[0]][j];
-		}
-		  
-	      for (int j = 0; j < order-1; j++)
-		{
-		  double ddx = dshapes(ii+j,0);
-		  double ddt = dshapes(ii+j,1);
-		  dshapes(ii+j,0) = ddx * trans(0,0) + ddt * trans(1,0);
-		  dshapes(ii+j,1) = ddx * trans(0,1) + ddt * trans(1,1);
-		}
-
-	      for ( int j = 0; j < ndf; j++ )
-		{
-		  dshapes(ii+j,0) *= lamiz[fav[1]];
-		  dshapes(ii+j,1) *= lamiz[fav[1]];
-		  dshapes(ii+j,2) = shapei(j) * dlamiz[fav[1]];
-		}
-	      ii += ndf;
-	    }
-
-	  break;
-
-	}
-
-      case PYRAMID:
-	{
-	  dshapes = 0.0;
-	  double x = xi(0);
-	  double y = xi(1);
-	  double z = xi(2);
-	  
-	  if (z == 1.) z = 1-1e-10;
-	  double z1 = 1-z;
-	  double z2 = z1*z1;
-	  
-	  dshapes(0,0) = -(z1-y)/z1;
-	  dshapes(0,1) = -(z1-x)/z1;
-	  dshapes(0,2) = ((x+y+2*z-2)*z1+(z1-y)*(z1-x))/z2;
-
-	  dshapes(1,0) = (z1-y)/z1;
-	  dshapes(1,1) = -x/z1;
-	  dshapes(1,2) = (-x*z1+x*(z1-y))/z2;
-
-	  dshapes(2,0) = y/z1;
-	  dshapes(2,1) = x/z1;
-	  dshapes(2,2) = x*y/z2;
-
-	  dshapes(3,0) = -y/z1;
-	  dshapes(3,1) = (z1-x)/z1;
-	  dshapes(3,2) = (-y*z1+y*(z1-x))/z2;
-
-	  dshapes(4,0) = 0;
-	  dshapes(4,1) = 0;
-	  dshapes(4,2) = 1;
-		  /* old:
-	  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 );
-		  */
-	  break;
-	}
-
-      case HEX:
-        {
-          dshapes = 0.0;
-
-	  double x = xi(0);
-	  double y = xi(1);
-	  double z = xi(2);
-
-	  // shapes[0] = (1-x)*(1-y)*(1-z);
-          dshapes(0,0) = - (1-y)*(1-z);
-          dshapes(0,1) = (1-x) * (-1) * (1-z);
-          dshapes(0,2) = (1-x) * (1-y) * (-1);
-
-	  // shapes[1] =    x *(1-y)*(1-z);
-          dshapes(1,0) = (1-y)*(1-z);
-          dshapes(1,1) = -x * (1-z);
-          dshapes(1,2) = -x * (1-y);
-
-	  // shapes[2] =    x *   y *(1-z);
-          dshapes(2,0) = y * (1-z);
-          dshapes(2,1) = x * (1-z);
-          dshapes(2,2) = -x * y;
-
-	  // shapes[3] = (1-x)*   y *(1-z);
-          dshapes(3,0) = -y * (1-z);
-          dshapes(3,1) = (1-x) * (1-z);
-          dshapes(3,2) = -(1-x) * y;
-
-	  // shapes[4] = (1-x)*(1-y)*z;
-          dshapes(4,0) = - (1-y)*z;
-          dshapes(4,1) = (1-x) * (-1) * z;
-          dshapes(4,2) = (1-x) * (1-y) * 1;
-
-	  // shapes[5] =    x *(1-y)*z;
-          dshapes(5,0) = (1-y)*z;
-          dshapes(5,1) = -x * z;
-          dshapes(5,2) = x * (1-y);
-
-	  // shapes[6] =    x *   y *z;
-          dshapes(6,0) = y * z;
-          dshapes(6,1) = x * z;
-          dshapes(6,2) = x * y;
-
-	  // shapes[7] = (1-x)*   y *z;
-          dshapes(7,0) = -y * z;
-          dshapes(7,1) = (1-x) * z;
-          dshapes(7,2) = (1-x) * y;
-
-          break;
-        }
-      }
-    
-    /*
-    DenseMatrix dshapes2 (info.ndof, 3);
-    Vector shapesl(info.ndof); 
-    Vector shapesr(info.ndof); 
-    
-    double eps = 1e-6;
-    for (int i = 0; i < 3; i++)
-      {
-	Point<3> xl = xi;
-	Point<3> xr = xi;
-	
-	xl(i) -= eps;
-	xr(i) += eps;
-	CalcElementShapes (info, xl, shapesl);
-	CalcElementShapes (info, xr, shapesr);
-	
-	for (int j = 0; j < info.ndof; j++)
-	  dshapes2(j,i) = (shapesr(j)-shapesl(j)) / (2*eps);
-      }
-    (*testout) << "dshapes = " << endl << dshapes << endl;
-    (*testout) << "dshapes2 = " << endl << dshapes2 << endl;
-    dshapes2 -= dshapes;
-    (*testout) << "diff = " << endl << dshapes2 << endl;
-    */
-  }
-
-
-
-  void CurvedElements :: 
-  GetCoefficients (ElementInfo & info, Vec<3> * coefs) const
-  {
-    // cout << "getcoeffs, info.elnr = " << info.elnr << endl;
-    // cout << "getcoeffs, info.nv = " << info.nv << endl;
-
-    const Element & el = mesh[info.elnr];
-
-    /*
-    coefs.SetSize (info.ndof);
-    coefs = Vec<3> (0,0,0);
-    */
-    /*
-    for (int i = 0; i < info.ndof; i++)
-      coefs[i] = Vec<3> (0,0,0);
-    */
-    for (int i = 0; i < info.nv; i++)
-      coefs[i] = Vec<3> (mesh[el[i]]);
-
-    if (info.order == 1) return;
-
-    int ii = info.nv;
-	  
-    for (int i = 0; i < info.nedges; i++)
-      {
-	int first = edgecoeffsindex[info.edgenrs[i]];
-	int next = edgecoeffsindex[info.edgenrs[i]+1];
-	for (int j = first; j < next; j++, ii++)
-	  coefs[ii] = edgecoeffs[j];
-      }
-    for (int i = 0; i < info.nfaces; i++)
-      {
-	int first = facecoeffsindex[info.facenrs[i]];
-	int next = facecoeffsindex[info.facenrs[i]+1];
-	for (int j = first; j < next; j++, ii++)
-	  coefs[ii] = facecoeffs[j];
-      }
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  void CurvedElements :: 
-  CalcMultiPointSegmentTransformation (ARRAY<double> * xi, SegmentIndex segnr,
-				       ARRAY<Point<3> > * x,
-				       ARRAY<Vec<3> > * dxdxi)
-  {
-    ;
-  }
-
-  void CurvedElements :: 
-  CalcMultiPointSurfaceTransformation (ARRAY< Point<2> > * xi, SurfaceElementIndex elnr,
-				       ARRAY< Point<3> > * x,
-				       ARRAY< Mat<3,2> > * dxdxi)
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	
-	  // xi umrechnen
-	double lami[4];
-	FlatVector vlami(4, lami);
-
-	ArrayMem<Point<2>, 50> coarse_xi (xi->Size());
-	
-	for (int pi = 0; pi < xi->Size(); pi++)
-	  {
-	    vlami = 0;
-	    mesh[elnr].GetShapeNew ( (*xi)[pi], vlami);
-	    
-	    Point<2> cxi(0,0);
-	    for (int i = 0; i < hpref_el.np; i++)
-	      for (int j = 0; j < 2; j++)
-		cxi(j) += hpref_el.param[i][j] * lami[i];
-
-	    coarse_xi[pi] = cxi;
-	  }
-
-	mesh.coarsemesh->GetCurvedElements().
-	  CalcMultiPointSurfaceTransformation (&coarse_xi, hpref_el.coarse_elnr, x, dxdxi);
-
-
-	Mat<2,2> trans;
-        Mat<3,2> dxdxic;
-	if (dxdxi)
-	  {
-	    MatrixFixWidth<2> dlami(4);
-	    dlami = 0;
-
-	    for (int pi = 0; pi < xi->Size(); pi++)
-	      {
-		mesh[elnr].GetDShapeNew ( (*xi)[pi], dlami);	  
-		
-		trans = 0;
-		for (int k = 0; k < 2; k++)
-		  for (int l = 0; l < 2; l++)
-		    for (int i = 0; i < hpref_el.np; i++)
-		      trans(l,k) += hpref_el.param[i][l] * dlami(i, k);
-		
-		dxdxic = (*dxdxi)[pi];
-		(*dxdxi)[pi] = dxdxic * trans;
-	      }
-	  }	
-
-	return;
-      }
-
-
-
-
-
-    Vector shapes;
-    DenseMatrix dshapes;
-    ARRAY<Vec<3> > coefs;
-
-
-    const Element2d & el = mesh[elnr];
-    ELEMENT_TYPE type = el.GetType();
-
-    SurfaceElementInfo info;
-    info.elnr = elnr;
-    info.order = order;
-    info.ndof = info.nv = (type == TRIG) ? 3 : 4;
-    if (info.order > 1)
-      {
-	const MeshTopology & top = mesh.GetTopology();
-	
-	top.GetSurfaceElementEdges (elnr+1, info.edgenrs);
-	for (int i = 0; i < info.edgenrs.Size(); i++)
-	  info.edgenrs[i]--;
-	info.facenr = top.GetSurfaceElementFace (elnr+1)-1;
-
-	for (int i = 0; i < info.edgenrs.Size(); i++)
-	  info.ndof += edgecoeffsindex[info.edgenrs[i]+1] - edgecoeffsindex[info.edgenrs[i]];
-	info.ndof += facecoeffsindex[info.facenr+1] - facecoeffsindex[info.facenr];
-      }
-
-    GetCoefficients (info, coefs);
-
-    if (x)
-      {
-	for (int j = 0; j < xi->Size(); j++)
-	  {
-	    CalcElementShapes (info, (*xi)[j], shapes);
-	    (*x)[j] = 0;
-	    for (int i = 0; i < coefs.Size(); i++)
-	      (*x)[j] += shapes(i) * coefs[i];
-	  }
-      }
-
-    if (dxdxi)
-      {
-	for (int ip = 0; ip < xi->Size(); ip++)
-	  {
-	    CalcElementDShapes (info, (*xi)[ip], dshapes);
-	
-	    (*dxdxi)[ip] = 0;
-	    for (int i = 0; i < coefs.Size(); i++)
-	      for (int j = 0; j < 3; j++)
-		for (int k = 0; k < 2; k++)
-		  (*dxdxi)[ip](j,k) += dshapes(i,k) * coefs[i](j);
-	  }
-      }
-  }
-
-  void CurvedElements :: 
-  CalcMultiPointElementTransformation (ARRAY< Point<3> > * xi, ElementIndex elnr,
-				       ARRAY< Point<3> > * x,
-				       ARRAY< Mat<3,3> > * dxdxi)
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	
-	  // xi umrechnen
-	double lami[8];
-	FlatVector vlami(8, lami);
-
-
-	ArrayMem<Point<3>, 50> coarse_xi (xi->Size());
-	
-	for (int pi = 0; pi < xi->Size(); pi++)
-	  {
-	    vlami = 0;
-	    mesh[elnr].GetShapeNew ( (*xi)[pi], vlami);
-	    
-	    Point<3> cxi(0,0,0);
-	    for (int i = 0; i < hpref_el.np; i++)
-	      for (int j = 0; j < 3; j++)
-		cxi(j) += hpref_el.param[i][j] * lami[i];
-
-	    coarse_xi[pi] = cxi;
-	  }
-
-	mesh.coarsemesh->GetCurvedElements().
-	  CalcMultiPointElementTransformation (&coarse_xi, hpref_el.coarse_elnr, x, dxdxi);
-
-
-	Mat<3,3> trans, dxdxic;
-	if (dxdxi)
-	  {
-	    MatrixFixWidth<3> dlami(8);
-	    dlami = 0;
-
-	    for (int pi = 0; pi < xi->Size(); pi++)
-	      {
-		mesh[elnr].GetDShapeNew ( (*xi)[pi], dlami);	  
-		
-		trans = 0;
-		for (int k = 0; k < 3; k++)
-		  for (int l = 0; l < 3; l++)
-		    for (int i = 0; i < hpref_el.np; i++)
-		      trans(l,k) += hpref_el.param[i][l] * dlami(i, k);
-		
-		dxdxic = (*dxdxi)[pi];
-		(*dxdxi)[pi] = dxdxic * trans;
-	      }
-	  }	
-
-	return;
-      }
-
-
-
-
-
-
-
-
-    Vector shapes;
-    MatrixFixWidth<3> dshapes;
-
-
-    const Element & el = mesh[elnr];
-    ELEMENT_TYPE type = el.GetType();
-
-    ElementInfo info;
-    info.elnr = elnr;
-    info.order = order;
-    info.ndof = info.nv = MeshTopology::GetNVertices (type);
-    if (info.order > 1)
-      {
-	const MeshTopology & top = mesh.GetTopology();
-	
-	info.nedges = top.GetElementEdges (elnr+1, info.edgenrs, 0);
-	for (int i = 0; i < info.nedges; i++)
-	  info.edgenrs[i]--;
-
-	info.nfaces = top.GetElementFaces (elnr+1, info.facenrs, 0);
-	for (int i = 0; i < info.nfaces; i++)
-	  info.facenrs[i]--;
-
-	for (int i = 0; i < info.nedges; i++)
-	  info.ndof += edgecoeffsindex[info.edgenrs[i]+1] - edgecoeffsindex[info.edgenrs[i]];
-	for (int i = 0; i < info.nfaces; i++)
-	  info.ndof += facecoeffsindex[info.facenrs[i]+1] - facecoeffsindex[info.facenrs[i]];
-	// info.ndof += facecoeffsindex[info.facenr+1] - facecoeffsindex[info.facenr];
-      }
-
-    ARRAY<Vec<3> > coefs(info.ndof);
-    GetCoefficients (info, &coefs[0]);
-    if (x)
-      {
-	for (int j = 0; j < xi->Size(); j++)
-	  {
-	    CalcElementShapes (info, (*xi)[j], shapes);
-	    (*x)[j] = 0;
-	    for (int i = 0; i < coefs.Size(); i++)
-	      (*x)[j] += shapes(i) * coefs[i];
-	  }
-      }
-    if (dxdxi)
-      {
-	for (int ip = 0; ip < xi->Size(); ip++)
-	  {
-	    CalcElementDShapes (info, (*xi)[ip], dshapes);
-	
-	    (*dxdxi)[ip] = 0;
-	    for (int i = 0; i < coefs.Size(); i++)
-	      for (int j = 0; j < 3; j++)
-		for (int k = 0; k < 3; k++)
-		  (*dxdxi)[ip](j,k) += dshapes(i,k) * coefs[i](j);
-	  }
-      }
-  }
-
-
-
-
-  void  CurvedElements :: 
-  CalcMultiPointElementTransformation (ElementIndex elnr, int n,
-                                       const double * xi, int sxi,
-                                       double * x, int sx,
-                                       double * dxdxi, int sdxdxi)
-  {
-    if (mesh.coarsemesh)
-      {
-	const HPRefElement & hpref_el =
-	  (*mesh.hpelements) [mesh[elnr].hp_elnr];
-	
-	  // xi umrechnen
-	double lami[8];
-	FlatVector vlami(8, lami);
-
-
-	ArrayMem<double, 100> coarse_xi (3*n);
-	
-	for (int pi = 0; pi < n; pi++)
-	  {
-	    vlami = 0;
-            Point<3> pxi;
-            for (int j = 0; j < 3; j++)
-              pxi(j) = xi[pi*sxi+j];
-
-	    mesh[elnr].GetShapeNew ( pxi, vlami);
-	    
-	    Point<3> cxi(0,0,0);
-	    for (int i = 0; i < hpref_el.np; i++)
-	      for (int j = 0; j < 3; j++)
-		cxi(j) += hpref_el.param[i][j] * lami[i];
-
-            for (int j = 0; j < 3; j++)
-              coarse_xi[3*pi+j] = cxi(j);
-	  }
-
-	mesh.coarsemesh->GetCurvedElements().
-	  CalcMultiPointElementTransformation (hpref_el.coarse_elnr, n, 
-                                               &coarse_xi[0], 3, 
-                                               x, sx, 
-                                               dxdxi, sdxdxi);
-
-	Mat<3,3> trans, dxdxic;
-	if (dxdxi)
-	  {
-	    MatrixFixWidth<3> dlami(8);
-	    dlami = 0;
-
-	    for (int pi = 0; pi < n; pi++)
-	      {
-                Point<3> pxi;
-                for (int j = 0; j < 3; j++)
-                  pxi(j) = xi[pi*sxi+j];
-
-		mesh[elnr].GetDShapeNew (pxi, dlami);	  
-		
-		trans = 0;
-		for (int k = 0; k < 3; k++)
-		  for (int l = 0; l < 3; l++)
-		    for (int i = 0; i < hpref_el.np; i++)
-		      trans(l,k) += hpref_el.param[i][l] * dlami(i, k);
-
-                Mat<3> mat_dxdxic, mat_dxdxi;
-                for (int j = 0; j < 3; j++)
-                  for (int k = 0; k < 3; k++)
-                    mat_dxdxic(j,k) = dxdxi[pi*sdxdxi+3*j+k];
-		
-                mat_dxdxi = mat_dxdxic * trans;
-
-                for (int j = 0; j < 3; j++)
-                  for (int k = 0; k < 3; k++)
-                    dxdxi[pi*sdxdxi+3*j+k] = mat_dxdxi(j,k);
-
-		// dxdxic = (*dxdxi)[pi];
-		// (*dxdxi)[pi] = dxdxic * trans;
-	      }
-	  }	
-	return;
-      }
-
-
-
-
-
-
-
-
-    Vector shapes;
-    MatrixFixWidth<3> dshapes;
-
-
-    const Element & el = mesh[elnr];
-    ELEMENT_TYPE type = el.GetType();
-
-    ElementInfo info;
-    info.elnr = elnr;
-    info.order = order;
-    info.ndof = info.nv = MeshTopology::GetNVertices (type);
-    if (info.order > 1)
-      {
-	const MeshTopology & top = mesh.GetTopology();
-	
-	info.nedges = top.GetElementEdges (elnr+1, info.edgenrs, 0);
-	for (int i = 0; i < info.nedges; i++)
-	  info.edgenrs[i]--;
-
-	info.nfaces = top.GetElementFaces (elnr+1, info.facenrs, 0);
-	for (int i = 0; i < info.nfaces; i++)
-	  info.facenrs[i]--;
-
-	for (int i = 0; i < info.nedges; i++)
-	  info.ndof += edgecoeffsindex[info.edgenrs[i]+1] - edgecoeffsindex[info.edgenrs[i]];
-	for (int i = 0; i < info.nfaces; i++)
-	  info.ndof += facecoeffsindex[info.facenrs[i]+1] - facecoeffsindex[info.facenrs[i]];
-	// info.ndof += facecoeffsindex[info.facenr+1] - facecoeffsindex[info.facenr];
-      }
-
-    ARRAY<Vec<3> > coefs(info.ndof);
-    GetCoefficients (info, &coefs[0]);
-    if (x)
-      {
-	for (int j = 0; j < n; j++)
-	  {
-            Point<3> xij, xj;
-            for (int k = 0; k < 3; k++)
-              xij(k) = xi[j*sxi+k];
-
-	    CalcElementShapes (info, xij, shapes);
-	    xj = 0;
-	    for (int i = 0; i < coefs.Size(); i++)
-	      xj += shapes(i) * coefs[i];
-
-            for (int k = 0; k < 3; k++)
-              x[j*sx+k] = xj(k);
-	  }
-      }
-    if (dxdxi)
-      {
-	for (int ip = 0; ip < n; ip++)
-	  {
-            Point<3> xij;
-            for (int k = 0; k < 3; k++)
-              xij(k) = xi[ip*sxi+k];
-
-	    CalcElementDShapes (info, xij, dshapes);
-            
-            Mat<3> dxdxij;
-            dxdxij = 0.0;
-	    for (int i = 0; i < coefs.Size(); i++)
-	      for (int j = 0; j < 3; j++)
-		for (int k = 0; k < 3; k++)
-		  dxdxij(j,k) += dshapes(i,k) * coefs[i](j);
-
-
-	      for (int j = 0; j < 3; j++)
-		for (int k = 0; k < 3; k++)
-                  dxdxi[ip*sdxdxi+3*j+k] = dxdxij(j,k);
-	  }
-      }
-  }
-
-
-
-
-
-
-
-
-
-};
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/curvedelems_new.hpp b/contrib/Netgen/libsrc/meshing/curvedelems_new.hpp
deleted file mode 100644
index ff9cd88071d0f799d80ed31486313c23e3088d7b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/curvedelems_new.hpp
+++ /dev/null
@@ -1,205 +0,0 @@
-#ifndef CURVEDELEMS_NEWH
-#define CURVEDELEMS_NEWH
-
-/**************************************************************************/
-/* File:   curvedelems.hpp                                                */
-/* Author: Robert Gaisbauer (first version)                               */
-/*         redesign by Joachim Schoeberl                                  */
-/* Date:   27. Sep. 02, Feb 2006                                          */
-/**************************************************************************/
-
-
-
-
-class Refinement;
-
-
-class CurvedElements
-{
-  const Mesh & mesh;
-
-  ARRAY<int> edgeorder;
-  ARRAY<int> faceorder;
-
-  ARRAY<int> edgecoeffsindex;
-  ARRAY<int> facecoeffsindex;
-
-  ARRAY< Vec<3> > edgecoeffs;
-  ARRAY< Vec<3> > facecoeffs;
-
-  ARRAY< double > edgeweight;  // for rational 2nd order splines
-
-  int order;
-  bool rational;
-
-public:
-  CurvedElements (const Mesh & amesh);
-  ~CurvedElements();
-
-  bool IsHighOrder() const { return order > 1; }
-
-  void SetHighOrder (int aorder) { order=aorder; }
-  
-  void BuildCurvedElements(Refinement * ref, int aorder, bool arational = false);
-
-  int GetOrder () { return order; }
-
-
-  bool IsSegmentCurved (SegmentIndex segnr) const;
-  bool IsSurfaceElementCurved (SurfaceElementIndex sei) const;
-  bool IsElementCurved (ElementIndex ei) const;
-
-
-  void CalcSegmentTransformation (double xi, SegmentIndex segnr,
-				  Point<3> & x)
-  { CalcSegmentTransformation (xi, segnr, &x, NULL); };
-
-  void CalcSegmentTransformation (double xi, SegmentIndex segnr,
-				  Vec<3> & dxdxi)
-  { CalcSegmentTransformation (xi, segnr, NULL, &dxdxi); };
-
-  void CalcSegmentTransformation (double xi, SegmentIndex segnr,
-				  Point<3> & x, Vec<3> & dxdxi)
-  { CalcSegmentTransformation (xi, segnr, &x, &dxdxi, NULL); };
-
-  void CalcSegmentTransformation (double xi, SegmentIndex segnr,
-				  Point<3> & x, Vec<3> & dxdxi, bool & curved)
-  { CalcSegmentTransformation (xi, segnr, &x, &dxdxi, &curved); };
-
-
-
-  void CalcSurfaceTransformation (const Point<2> & xi, SurfaceElementIndex elnr,
-				  Point<3> & x)
-  { CalcSurfaceTransformation (xi, elnr, &x, NULL); };
-
-  void CalcSurfaceTransformation (const Point<2> & xi, SurfaceElementIndex elnr,
-				  Mat<3,2> & dxdxi)
-  { CalcSurfaceTransformation (xi, elnr, NULL, &dxdxi); };
-
-  void CalcSurfaceTransformation (const Point<2> & xi, SurfaceElementIndex elnr,
-				  Point<3> & x, Mat<3,2> & dxdxi)
-  { CalcSurfaceTransformation (xi, elnr, &x, &dxdxi, NULL); };
-
-  void CalcSurfaceTransformation (const Point<2> & xi, SurfaceElementIndex elnr,
-				  Point<3> & x, Mat<3,2> & dxdxi, bool & curved)
-  { CalcSurfaceTransformation (xi, elnr, &x, &dxdxi, &curved); };
-
-
-
-
-
-  void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
-				  Point<3> & x)
-  { CalcElementTransformation (xi, elnr, &x, NULL); };
-
-  void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
-				  Mat<3,3> & dxdxi)
-  { CalcElementTransformation (xi, elnr, NULL, &dxdxi); };
-
-  void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
-				  Point<3> & x, Mat<3,3> & dxdxi)
-  { CalcElementTransformation (xi, elnr, &x, &dxdxi /* , NULL */ ); };
-
-  void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
-				  Point<3> & x, Mat<3,3> & dxdxi,
-                                  void * buffer, bool valid)
-  { CalcElementTransformation (xi, elnr, &x, &dxdxi, /* NULL, */ buffer, valid ); };
-
-  // void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
-  // 				  Point<3> & x, Mat<3,3> & dxdxi) // , bool & curved)
-  //   { CalcElementTransformation (xi, elnr, &x, &dxdxi /* , &curved * ); }
-
-
-
-  void CalcMultiPointSegmentTransformation (ARRAY<double> * xi, SegmentIndex segnr,
-					    ARRAY<Point<3> > * x,
-					    ARRAY<Vec<3> > * dxdxi);
-
-  void CalcMultiPointSurfaceTransformation (ARRAY< Point<2> > * xi, SurfaceElementIndex elnr,
-					    ARRAY< Point<3> > * x,
-					    ARRAY< Mat<3,2> > * dxdxi);
-
-  void CalcMultiPointElementTransformation (ARRAY< Point<3> > * xi, ElementIndex elnr,
-					    ARRAY< Point<3> > * x,
-					    ARRAY< Mat<3,3> > * dxdxi);
-
-  void CalcMultiPointElementTransformation (ElementIndex elnr, int n,
-                                            const double * xi, int sxi,
-                                            double * x, int sx,
-                                            double * dxdxi, int sdxdxi);
-
-
-
-
-private:
-  
-  void CalcSegmentTransformation (double xi, SegmentIndex segnr,
-				  Point<3> * x = NULL, Vec<3> * dxdxi = NULL, bool * curved = NULL);
-
-  void CalcSurfaceTransformation (Point<2> xi, SurfaceElementIndex elnr,
-				  Point<3> * x = NULL, Mat<3,2> * dxdxi = NULL, bool * curved = NULL);
-
-  void CalcElementTransformation (Point<3> xi, ElementIndex elnr,
-				  Point<3> * x = NULL, Mat<3,3> * dxdxi = NULL, // bool * curved = NULL,
-                                  void * buffer = NULL, bool valid = 0);
-
-
-
-
-
-
-  class SegmentInfo
-  {
-  public:
-    SegmentIndex elnr;
-    int order;
-    int nv;
-    int ndof;
-    int edgenr;
-  };
-
-  void CalcElementShapes (SegmentInfo &  elnr, double xi, Vector & shapes) const;
-  void GetCoefficients (SegmentInfo & elnr, ARRAY<Vec<3> > & coefs) const;
-  void CalcElementDShapes (SegmentInfo & elnr, double xi, Vector & dshapes) const;
-
-
-  class ElementInfo
-  {
-  public:
-    ElementIndex elnr;
-    int order;
-    int nv;
-    int ndof;
-    int nedges;
-    int nfaces;
-    int edgenrs[12];
-    int facenrs[6];
-    Mat<3> hdxdxi;
-    Vec<3> hcoefs[10]; // enough for second order tets
-  };
-
-
-  void CalcElementShapes (ElementInfo & info, const Point<3> & xi, Vector & shapes) const;
-  void GetCoefficients (ElementInfo & info, Vec<3> * coefs) const;
-  void CalcElementDShapes (ElementInfo & info, const Point<3> & xi, MatrixFixWidth<3> & dshapes) const;
-
-  
-  class SurfaceElementInfo
-  {
-  public:
-    SurfaceElementIndex elnr;
-    int order;
-    int nv;
-    int ndof;
-    ArrayMem<int,4> edgenrs;
-    int facenr;
-  };
-
-  void CalcElementShapes (SurfaceElementInfo & elinfo, const Point<2> & xi, Vector & shapes) const;
-  void GetCoefficients (SurfaceElementInfo & elinfo, ARRAY<Vec<3> > & coefs) const;
-  void CalcElementDShapes (SurfaceElementInfo & elinfo, const Point<2> & xi, DenseMatrix & dshapes) const;
-};
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/delaunay.cpp b/contrib/Netgen/libsrc/meshing/delaunay.cpp
deleted file mode 100644
index e74afec32b67c6a60115bfe470ee4a1e18556289..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/delaunay.cpp
+++ /dev/null
@@ -1,1676 +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<Point<3> > & centers, ARRAY<double> & radi2,
-			 ARRAY<int> & connected, ARRAY<int> & treesearch, 
-			 ARRAY<int> & freelist, SphereList & list,
-			 IndexSet & insphere, IndexSet & closesphere)
-  {
-    /*
-      find any sphere, such that newp is contained in
-    */
-  
-    DelaunayTet el;
-    int cfelind = -1;
-
-    const Point<3> * pp[4];
-    Point<3> pc;
-    double r2;
-    Point3d tpmin, tpmax;
-
-    tettree.GetIntersecting (newp, newp, treesearch);
-    
-    double quot,minquot(1e20);
-
-    for (int j = 0; j < treesearch.Size(); j++)
-      {
-	int jjj = treesearch[j];
-	quot = Dist2 (centers.Get(jjj), newp) / radi2.Get(jjj);
-	
-	if((cfelind == -1 || quot < 0.99*minquot) && quot < 1)
-	  {
-	    minquot = quot;
-	    el = tempels.Get(jjj);
-	    cfelind = jjj;
-	    if(minquot < 0.917632)
-	      break;
-	  }
-      }
-
-
-    /*
-      int i, j, k, l;
-      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 (int 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 (int j = starti; j < nstarti; j++)
-	  {
-	    list.GetList (insphere.Array().Get(j), connected);
-	    for (int k = 0; k < connected.Size(); k++)
-	      {
-		int celind = connected[k];
-
-		if (tempels.Get(celind)[0] != -1 && 
-		    !insphere.IsIn (celind))
-		  {
-		    changed = 1;
-		    insphere.Add (celind);
-		  }
-	      }
-	  }
-	
-	// check neighbour-tets
-	for (int j = starti; j < nstarti; j++)
-	  for (int k = 1; k <= 4; k++)
-	    {
-	      int helind = insphere.Array().Get(j);
-	      int nbind = meshnb.GetNB (helind, k);
-
-	      if (nbind && !insphere.IsIn (nbind) )
-		{
-		  //changed
-		  //int prec = testout->precision();
-		  //testout->precision(12);
-		  //(*testout) << "val1 " << Dist2 (centers.Get(nbind), newp)
-		  //	     << " val2 " << radi2.Get(nbind) * (1+1e-8)
-		  //	     << " val3 " << radi2.Get(nbind)
-		  //	     << " val1 / val3 " << Dist2 (centers.Get(nbind), newp)/radi2.Get(nbind) << endl;
-		  //testout->precision(prec);
-		  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 (int j = 1; j <= insphere.Array().Size(); j++)
-      for (int 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 (int l = 0; l < 3; l++)
-                newel[l] = face[l];
-              newel[3] = newpi;
-
-	      newels.Append (newel);
-
-              Vec<3> v1 = mesh[face[1]] - mesh[face[0]];
-              Vec<3> v2 = mesh[face[2]] - mesh[face[0]];
-	      Vec<3> n = Cross (v1, v2);
-
-	      n.Normalize();
-	      if (n * Vec3d(mesh.Point (face[0]), 
-			    mesh.Point (tempels.Get(insphere.Array().Get(j))[k-1]))
-		  > 0)
-		n *= -1;
-
-              double hval = n *  ( newp - mesh[face[0]]);
-		
-	      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 (int j = 1; j <= insphere.Array().Size(); j++)
-      {
-	//	  int elind = 
-	int celind = insphere.Array().Get(j);
-
-	meshnb.Delete (celind); 
-	list.DeleteElement (celind);
-	  
-	for (int k = 0; k < 4; k++)
-	  tempels.Elem(celind)[k] = -1;
-
-	((ADTree6&)tettree.Tree()).DeleteElement (celind);
-	freelist.Append (celind);
-      }
-
-
-    int hasclose = 0;
-    for (int 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 (int 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 (int k = 0; k < 4; k++)
-	  pp[k] = &mesh.Point (newels.Get(j)[k]);
-
-	if (CalcSphereCenter (&pp[0], pc) )
-	  {
-	    PrintSysError ("Delaunay: New tet is flat");
-
-	    (*testout) << "new tet is flat" << endl;
-	    for (int k = 1; k <= 4; k++)
-	      (*testout) << newels.Get(j).PNum(k) << " ";
-	    (*testout) << endl;
-	    for (int k = 1; k <= 4; k++)
-	      (*testout) << *pp[k-1] << " ";
-	    (*testout) << endl;
-	  }
-
-	r2 = Dist2 (*pp[0], pc);
-	if (hasclose)
-	  for (int 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 (int 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;
-    const Point<3> * pp[4];
-
-    ARRAY<Point<3> > 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 MiniElement2d & 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 MiniElement2d & 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);
-
-
-    Point<3> 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());
-
-
-
-    // "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 % 1000 == 0)
-	  {
-	    if (i % 10000 == 0)
-	      PrintDot ('+');
-	    else
-	      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);
-      }
-
-    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, int domainnr, const MeshingParameters & mp)
-  {
-    int np, ne;
-
-    PrintMessage (1, "Delaunay meshing");
-    PrintMessage (3, "number of points: ", mesh.GetNP());
-    PushStatus ("Delaunay meshing");
-
-
-    ARRAY<DelaunayTet> tempels;
-    Point3d pmin, pmax;
-
-    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 (PointIndex pi = PointIndex::BASE; pi < mesh.GetNP()+PointIndex::BASE; pi++)
-	tempmesh.AddPoint (mesh[pi]);
-      
-      for (int i = 1; i <= tempels.Size(); i++)
-	{   
-	  Element el(4);
-	  for (int 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);
-
-      tempmesh.AddFaceDescriptor (FaceDescriptor (1, 1, 0, 0));
-      tempmesh.AddFaceDescriptor (FaceDescriptor (2, 1, 0, 0));
-
-
-    
-      for (int 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 (int i = 1; i <= 4; i++)
-	{
-	  Element2d self(TRIG);
-	  self.SetIndex (1);
-	  startel.GetFace1 (i, self);
-	  tempmesh.AddSurfaceElement (self);
-	}
-
-      
-      //  for (i = mesh.GetNP() - 3; i <= mesh.GetNP(); i++)
-      //    tempmesh.AddLockedPoint (i);
-      for (PointIndex pi = PointIndex::BASE; 
-	   pi < tempmesh.GetNP() + PointIndex::BASE; pi++)
-	tempmesh.AddLockedPoint (pi);
-      
-      //    tempmesh.PrintMemInfo(cout);
-      // tempmesh.Save ("tempmesh.vol");
-
-      for (int i = 1; i <= 2; i++)
-	{ 
-	  tempmesh.FindOpenElements ();
-
-	  PrintMessage (5, "Num open: ", tempmesh.GetNOpenElements());
-	  tempmesh.CalcSurfacesOfNode ();
-
-	  tempmesh.FreeOpenElementsEnvironment (1);
-
-	  MeshOptimize3d meshopt;
-	  // tempmesh.CalcSurfacesOfNode();
-	  meshopt.SwapImprove(tempmesh, OPT_CONFORM);
-	}
-    
-      MeshQuality3d (tempmesh);
-    
-      tempels.SetSize(0);
-      for (int i = 1; i <= tempmesh.GetNE(); i++)
-	tempels.Append (tempmesh.VolumeElement(i));
-    }
-
-
-
-    // remove degenerated
-
-    BitArray badnode(mesh.GetNP());
-    badnode.Clear();
-    int ndeg = 0;
-    for (int i = 1; i <= tempels.Size(); i++)
-      {
-	Element el(4);
-	for (int 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 (int 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 (int 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 (int i = 1; i <= tempels.Size(); i++)
-      {
-	for (int 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 (int i = 1; i <= openeltab.GetNBags(); i++)
-      for (int 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 (int ii = 1; ii <= openels.Size(); ii++)
-      {
-	int i = openels.Get(ii);
-	const Element2d & el = mesh.OpenElement(i);
-	for (int 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 (int i = 1; i <= tempels.Size(); i++)
-      {
-	const DelaunayTet & el = tempels.Get(i);
-	INDEX_2 i2;
-	for (int j = 1; j <= 6; j++)
-	  {
-	    switch (j)
-	      {
-	      case 1: i2.I1()=el[0]; i2.I2()=el[1]; break;
-	      case 2: i2.I1()=el[0]; i2.I2()=el[2]; break;
-	      case 3: i2.I1()=el[0]; i2.I2()=el[3]; break;
-	      case 4: i2.I1()=el[1]; i2.I2()=el[2]; break;
-	      case 5: i2.I1()=el[1]; i2.I2()=el[3]; break;
-	      case 6: i2.I1()=el[2]; i2.I2()=el[3]; break;
-		  default: i2.I1()=i2.I2()=0; 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 (int 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 (int 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 (ltpmin);
-	      
-		for (int 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 (int i = 1; i <= tempels.Size(); i++)
-	  {
-	    const Point<3> *pp[4];
-	    int tetpi[4];
-	    DelaunayTet & el = tempels.Elem(i);
-	  
-	    int intersect = 0;
-	  
-	    for (int j = 0; j < 4; j++)
-	      {
-		pp[j] = &mesh.Point(el[j]);
-		tetpi[j] = el[j];
-	      }
-	  
-	    Point3d tetpmin(*pp[0]);
-	    Point3d tetpmax(tetpmin);
-	    for (int 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++)
-	      {
-		int j = neartrias.Get(jj);
-	      
-		const Element2d & tri = mesh.OpenElement(j);
-		const Point<3> *tripp[3];
-		int tripi[3];
-	      
-		for (int 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--;
-	      }
-	  }
-      }
-  
-
-
-
-    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 (int 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 (int 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 (int i = 0; i < tempels.Size(); i++)
-      for (int j = 0; j < 4; j++)
-	tempels[i].NB(j) = 0;
-  
-    TABLE<int,PointIndex::BASE> elsonpoint(mesh.GetNP());
-    for (int 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 (int 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 (PointIndex pi = PointIndex::BASE; 
-	 pi < mesh.GetNP()+PointIndex::BASE; pi++)
-      {
-	faceht.SetSize (4 * elsonpoint[pi].Size());
-	for (int ii = 0; ii < elsonpoint[pi].Size(); ii++)
-	  {
-	    int i = elsonpoint[pi][ii];
-	    const DelaunayTet & el = tempels.Get(i);
-
-	    for (int 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 i3i(hel[0], hel[1], hel[2]);
-			    INDEX_2 i2(i, j);
-			    faceht.Set (i3i, 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;
-
-	int i;
-	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 (int 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 (int 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 (int 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 (int i = ne; i >= 1; i--)
-      {
-	if (outer.Test(i))
-	  tempels.DeleteElement(i);
-      }
-
-
-    // mesh.points.SetSize(mesh.points.Size()-4);
-
-    for (int i = 0; i < tempels.Size(); i++)
-      {
-	Element el(4);
-	for (int j = 0; j < 4; j++)
-	  el[j] = tempels[i][j];
-	mesh.AddVolumeElement (el);
-      }
-
-    PrintMessage (5, "outer removed");
-
-    mesh.FindOpenElements(domainnr);
-
-    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 2d9058fc5c8c65f7b962533142ad79a4dc254224..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/findip.hpp
+++ /dev/null
@@ -1,192 +0,0 @@
-// find inner point
-
-
-
-inline void Minimize (const ARRAY<Vec3d> & a,
-		      const ARRAY<double> & c,
-		      int * act, 
-		      Vec<3> & x, double & f,
-		      int * sol)
-{
-  int act1[4];
-  Mat<3> m, inv;
-  Vec<3> rs, xmax, center;
-
-  f = 1e99;
-
-  for (int j = 0; j < 5; j++)
-    {
-      for (int hk = 0, k = 0; hk < 4; hk++)
-	{
-	  if (hk == j) k++;
-	  act1[hk] = act[k];
-	  k++;
-	}
-
-      for (int k = 0; k < 3; k++)
-	{
-	  m(k, 0) = a[act1[0]].X() - a[act1[k+1]].X();
-	  m(k, 1) = a[act1[0]].Y() - a[act1[k+1]].Y();
-	  m(k, 2) = a[act1[0]].Z() - a[act1[k+1]].Z();
-	  rs(k) = c[act1[k+1]] - c[act1[0]];
-	}
-
-      /*
-      (*testout) << "act1 = "
-		 << act1[0] << " "
-		 << act1[1] << " "
-		 << act1[2] << " "
-		 << act1[3] << endl;
-      (*testout) << "Det = " << Det(m) << endl;
-      */
-
-      if (fabs (Det (m)) > 1e-10)
-	{
-	  CalcInverse (m, inv);
-	  xmax = inv * rs;
-	  
-	  double fmax = -1e10;
-	  for (int k = 0; k < 5; k++)
-	    {
-	      double hd = 
-		xmax(0) * a[act[k]].X() + xmax(1) * a[act[k]].Y() + xmax(2) * a[act[k]].Z() + c[act[k]];
-	      if (hd > fmax) fmax = hd;
-	    }
-
-	  if (fmax < f)
-	    {
-	      f = fmax;
-	      x = xmax;
-	      for (int k = 0; k < 4; k++)
-		sol[k] = act1[k];
-	    }
-	}
-    }
-}
-
-
-
-
-template <typename POINTARRAY, typename FACEARRAY>
-inline int FindInnerPoint (POINTARRAY & points,
-			   FACEARRAY & faces,
-			   Point3d & p)
-{
-  static int timer = NgProfiler::CreateTimer ("FindInnerPoint");
-  NgProfiler::RegionTimer reg (timer);
-
-  ARRAY<Vec3d> a;
-  ARRAY<double> c;
-  Mat<3> m, inv;
-  Vec<3> rs, x, center;
-  double f;
-
-  int nf = faces.Size();
-
-  // minimize_x  max_i  a_i x + c_i
-
-  a.SetSize (nf+4);
-  c.SetSize (nf+4);
-
-  for (int i = 0; i < nf; i++)
-    {
-      Point3d p1 = points.Get(faces[i][0]);
-      a[i] = Cross (points.Get(faces[i][1]) - p1,
-		    points.Get(faces[i][2]) - p1);
-      a[i] /= a[i].Length();
-      c[i] = - (a[i].X() * p1.X() + a[i].Y() * p1.Y() + a[i].Z() * p1.Z());
-    }
-
-  /*
-  center = 0;
-  for (int i = 0; i < points.Size(); i++)
-    center += Vec<3> (points[i]);
-  center /= points.Size();
-  */
-
-  center = 0;
-  for (int i = 0; i < faces.Size(); i++)
-    for (int j = 0; j < 3; j++)
-      center += Vec<3> (points.Get(faces[i][j]));
-  center /= (3*faces.Size());
-
-
-  // (*testout) << "center = " << center << endl;
-
-  double hmax = 0;
-  for (int i = 0; i < nf; i++)
-    {
-      // const Element2d & el = faces[i];
-      // (*testout) << "el[" << i << "] = " << el << endl;
-      for (int j = 1; j <= 3; j++)
-	{
-	  double hi = Dist (points.Get(faces[i].PNumMod(j)),
-			    points.Get(faces[i].PNumMod(j+1)));
-	  if (hi > hmax) hmax = hi;
-	}
-    }
-  
-  // (*testout) << "hmax = " << hmax << endl;
-  
-  a[nf] = Vec<3> (1, 0, 0);
-  c[nf] = -center(0) - hmax;
-  a[nf+1] = Vec<3> (0, 1, 0);
-  c[nf+1] = -center(1) - hmax;
-  a[nf+2] = Vec<3> (0, 0, 1);
-  c[nf+2] = -center(2) - hmax;
-  a[nf+3] = Vec<3> (-1, -1, -1);
-  c[nf+3] = center(0)+center(1)+center(2)-3*hmax;
-
-  /*
-  (*testout) << "findip, a now = " << endl << a << endl;
-  (*testout) << "findip, c now = " << endl << c << endl;
-  */
-
-  int act[5] = { 0, nf, nf+1, nf+2, nf+3 };
-  int sol[4];
-
-  while (1)
-    {
-      /*
-      (*testout) << "try ";
-      for (int j = 0; j < 5; j++)
-	(*testout)  << act[j] << " ";
-      */
-
-      Minimize (a, c, act, x, f, sol);
-
-      /*
-      (*testout) << endl << "sol = ";
-      for (int j = 0; j < 4; j++)
-	(*testout)  << sol[j] << " ";
-
-      (*testout) << " fmin = " << f << endl;
-      */
-      for (int j = 0; j < 4; j++) act[j] = sol[j];
-      
-      bool found = 0;
-      double maxval = f;
-      for (int j = 0; j < nf; j++)
-	{
-	  double val = x(0) * a[j].X() + x(1) * a[j].Y() + x(2) * a[j].Z() + c[j];
-	  if (val > maxval + hmax * 1e-6)
-	    {
-	      found = 1;
-	      maxval = val;
-	      act[4] = j;
-	    }
-	}
-      
-      // (*testout) << "maxval = " << maxval << endl;
-      if (!found) break;
-    }
-  
-  // cout << "converged, f = " << f << endl;
-  
-  p = Point3d (x(0), x(1), x(2));
-  // (*testout) << "findip, f = " << f << ", hmax = " << hmax << endl;
-  return (f < -1e-5 * hmax);
-}
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/findip2.hpp b/contrib/Netgen/libsrc/meshing/findip2.hpp
deleted file mode 100644
index fa9215d95c25264943e5d09adc7ecd4691c59982..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/findip2.hpp
+++ /dev/null
@@ -1,95 +0,0 @@
-// find inner point
-
-template <typename POINTARRAY, typename FACEARRAY>
-inline int FindInnerPoint2 (POINTARRAY & points,
-			    FACEARRAY & faces,
-			    Point3d & p)
-{
-  static int timer = NgProfiler::CreateTimer ("FindInnerPoint2");
-  NgProfiler::RegionTimer reg (timer);
-
-  ARRAY<Vec3d> a;
-  ARRAY<double> c;
-  Mat<3> m, inv;
-  Vec<3> rs, x, pmin;
-
-  int nf = faces.Size();
-
-  a.SetSize (nf);
-  c.SetSize (nf);
-
-  for (int i = 0; i < nf; i++)
-    {
-      Point3d p1 = points.Get(faces[i][0]);
-      a[i] = Cross (points.Get(faces[i][1]) - p1,
-		    points.Get(faces[i][2]) - p1);
-      a[i] /= a[i].Length();
-      c[i] = - (a[i].X() * p1.X() + a[i].Y() * p1.Y() + a[i].Z() * p1.Z());
-    }
-
-
-  x = 0;
-  
-  
-  double hmax = 0;
-  for (int i = 0; i < nf; i++)
-    {
-      const Element2d & el = faces[i];
-      for (int j = 1; j <= 3; j++)
-	{
-	  double hi = Dist (points.Get(el.PNumMod(j)),
-			    points.Get(el.PNumMod(j+1)));
-	  if (hi > hmax) hmax = hi;
-	}
-    }
-
-  double fmin = 0;
-
-  for (int i1 = 1; i1 <= nf; i1++)
-    for (int i2 = i1+1; i2 <= nf; i2++)
-      for (int i3 = i2+1; i3 <= nf; i3++)
-        for (int i4 = i3+1; i4 <= nf; i4++)
-          {
-	    m(0, 0) = a.Get(i1).X() - a.Get(i2).X();
-	    m(0, 1) = a.Get(i1).Y() - a.Get(i2).Y();
-	    m(0, 2) = a.Get(i1).Z() - a.Get(i2).Z();
-	    rs(0) = c.Get(i2) - c.Get(i1);
-
-	    m(1, 0) = a.Get(i1).X() - a.Get(i3).X();
-	    m(1, 1) = a.Get(i1).Y() - a.Get(i3).Y();
-	    m(1, 2) = a.Get(i1).Z() - a.Get(i3).Z();
-	    rs(1) = c.Get(i3) - c.Get(i1);
-
-	    m(2, 0) = a.Get(i1).X() - a.Get(i4).X();
-	    m(2, 1) = a.Get(i1).Y() - a.Get(i4).Y();
-	    m(2, 2) = a.Get(i1).Z() - a.Get(i4).Z();
-	    rs(2) = c.Get(i4) - c.Get(i1);
-
-
-	    if (fabs (Det (m)) > 1e-10)
-	      {
-		CalcInverse (m, inv);
-		x = inv * rs;
-
-		double f = -1e10;
-		for (int i = 0; i < nf; i++)
-		  {
-		    double hd = 
-		      x(0) * a[i].X() + x(1) * a[i].Y() + x(2) * a[i].Z() + c[i];
-		    if (hd > f) f = hd;
-		    if (hd > fmin) break;
-		  }
-
-		if (f < fmin)
-		  {
-		    fmin = f;
-		    pmin = x;
-		  }
-	      }
-          }
-
-  p = Point3d (pmin(0), pmin(1), pmin(2));
-  (*testout) << "fmin = " << fmin << endl;
-  return (fmin < -1e-3 * hmax);
-}
-
diff --git a/contrib/Netgen/libsrc/meshing/geomsearch.cpp b/contrib/Netgen/libsrc/meshing/geomsearch.cpp
deleted file mode 100644
index 1bedd23ccb899fbf48bbd61c524ded8eab8e4a5a..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 MiniElement2d& elem)
-  {
-    maxp.X()=(*points)[elem.PNum(1)].P()(0);
-    maxp.Y()=(*points)[elem.PNum(1)].P()(1);
-    maxp.Z()=(*points)[elem.PNum(1)].P()(2);
-    minp.X()=(*points)[elem.PNum(1)].P()(0);
-    minp.Y()=(*points)[elem.PNum(1)].P()(1);
-    minp.Z()=(*points)[elem.PNum(1)].P()(2);
-  
-    for (int i=2; i <= 3; i++)
-      {
-	maxp.X()=max2((*points)[elem.PNum(i)].P()(0),maxp.X());
-	maxp.Y()=max2((*points)[elem.PNum(i)].P()(1),maxp.Y());
-	maxp.Z()=max2((*points)[elem.PNum(i)].P()(2),maxp.Z());
-	minp.X()=min2((*points)[elem.PNum(i)].P()(0),minp.X());
-	minp.Y()=min2((*points)[elem.PNum(i)].P()(1),minp.Y());
-	minp.Z()=min2((*points)[elem.PNum(i)].P()(2),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 MiniElement2d& 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.);
-  
-    for (int ix = sx; ix <= ex; ix++)
-      for (int iy = sy; iy <= ey; iy++)
-        for (int 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;
-		    throw NgException ("Illegal position in Geomsearch");
-              }
-            hashtable.Elem(ind)->Append(elemnum);		      
-          }
-  }
-
-  void GeomSearch3d :: GetLocals(ARRAY<MiniElement2d> & 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 MiniElement2d & 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)  
-                        if((Dist2 (p1, p0) <= xh*xh) ||
-                           (Dist2 (p2, p0) <= xh*xh) ||
-                           (Dist2 (p3, p0) <= xh*xh) ||
-                           (Dist2 (midp, p0) <= xh*xh) )  // by Jochen Wild
-			  {
-			    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 236c98b13f35b25ca395e86d7dd734f6a6810d22..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/geomsearch.hpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#ifndef FILE_GEOMSEARCH
-#define FILE_GEOMSEARCH
-
-/**************************************************************************/
-/* File:   geomsearch.hh                                                  */
-/* Author: Johannes Gerstmayr                                             */
-/* Date:   19. Nov. 97                                                    */
-/**************************************************************************/
-
-class FrontPoint3;
-class FrontFace;
-class MiniElement2d;
-
-  /// 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 MiniElement2d& 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 MiniElement2d& elem, INDEX elemnum);
-
-  ///GetLocal faces in sphere with radius xh and middlepoint p
-  void GetLocals(ARRAY<MiniElement2d> & 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 1019624518a27d15530e48a6910bb4838b45627b..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;
-  const 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_hex.hpp b/contrib/Netgen/libsrc/meshing/hpref_hex.hpp
deleted file mode 100644
index 11e3f86e4949da4beccb772f2c2d4beeff066e8d..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_hex.hpp
+++ /dev/null
@@ -1,236 +0,0 @@
-// SZ 
-
-// HP_HEX  ... no refinement
-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_1F  ... face (1 - 4 - 3 -2) singular 
-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,
-    HP_HEX_1F_0E_0V,
-    HP_NONE,
-  };
-int  refhex_1f_0e_0v_newels[][8] =
-  {
-    { 9, 10, 11, 12, 5, 6, 7, 8 }, 
-    { 1, 2, 3, 4, 9, 10, 11, 12}  
- }; 
-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
-  };
-
-
-
-// HP_HEX_1FA_1FB  ... face (1 - 4 - 3 -2) and face (1-2-6-5) singular 
-int refhex_1fa_1fb_0e_0v_splitedges[][3] =
-  {
-    { 1, 5, 9 },
-    { 2, 6, 10 },
-    { 3, 7, 11 },
-    { 4, 8, 12 },
-    { 1, 4, 13 },
-    { 2, 3, 14 },  
-    { 6, 7, 15 }, 
-    { 5, 8, 16 }, 
-    { 0, 0, 0 }
-  };
-
-int refhex_1fa_1fb_0e_0v_splitfaces[][4] =
-  {
-    { 2, 3, 6, 17 },
-    { 1, 4, 5, 18 },
-    { 0, 0, 0, 0 },
-  };
-HPREF_ELEMENT_TYPE refhex_1fa_1fb_0e_0v_newelstypes[] =
-  {
-    HP_HEX,
-    HP_HEX_1F_0E_0V,
-    HP_HEX_1F_0E_0V, 
-    HP_HEX_1FA_1FB_0E_0V, 
-    HP_NONE,
-  };
-int  refhex_1fa_1fb_0e_0v_newels[][8] =
-  {
-    {18, 17, 11, 12, 16, 15, 7, 8}, 
-    {13, 14, 3, 4, 18, 17, 11, 12},
-    { 5, 6, 10, 9, 16, 15, 17, 18}, 
-    { 1, 2, 14, 13, 9, 10, 17, 18} 
-  }; 
-HPRef_Struct refhex_1fa_1fb_0e_0v =
-  {
-    HP_HEX,
-    refhex_1fa_1fb_0e_0v_splitedges, 
-    refhex_1fa_1fb_0e_0v_splitfaces, 0,
-    refhex_1fa_1fb_0e_0v_newelstypes, 
-    refhex_1fa_1fb_0e_0v_newels
-  };
-
-
-
-// Refine Dummies 
-  // 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
-    };
-
-
-
-// Refine Dummies 
-  // 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
-    };
-
-
-// Refine Dummies 
-  // 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
-    };
-
-
-
-// Refine Dummies 
-  // 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_SINGEDGE_H1,
-      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
-    };
-
-
diff --git a/contrib/Netgen/libsrc/meshing/hpref_prism.hpp b/contrib/Netgen/libsrc/meshing/hpref_prism.hpp
deleted file mode 100644
index 3cceb44a5726d52fa25f5c0af623fe375bd096a0..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_prism.hpp
+++ /dev/null
@@ -1,3405 +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_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-      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, 16 },
-      { 2, 5, 17 },
-      { 3, 6, 18 },
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_1fa_0e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_PRISM_1FA_0E_0V,
-      HP_NONE,
-    };
-  int refprism_1fa_0e_0v_newels[][8] =
-    {
-      { 16, 17, 18, 4, 5, 6 },      
-      { 1, 2, 3, 16, 17, 18 }
-    };
-  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_1FA_1E_0V
-  int refprism_1fa_1e_0v_splitedges[][3] =
-    {
-      { 1, 4, 16 },
-      { 2, 5, 17 },
-      { 3, 6, 18 },
-      { 1, 2, 7},
-      { 1, 3, 12},
-      { 4, 6, 45},
-      { 4, 5, 40},
-      { 0, 0, 0 }
-    };
-  int refprism_1fa_1e_0v_splitfaces[][4] =
-    {
-      {1,2,4,19},
-      {1,3,4,24},
-      {0,0,0,0}
-    }; 
-
-  HPREF_ELEMENT_TYPE refprism_1fa_1e_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE,
-      HP_HEX,
-      HP_PRISM_1FA_1E_0V,
-      HP_HEX_1F_0E_0V,
-      HP_NONE,
-    };
-  int refprism_1fa_1e_0v_newels[][8] =
-    {
-      { 16, 19, 24, 4, 40, 45 }, 
-      { 24, 19,  17, 18, 45 , 40, 5, 6 }, 
-      { 1, 7 , 12 , 16, 19, 24 }, 
-      { 7, 2, 3, 12,  19, 17, 18, 24 }
-    };
-  HPRef_Struct refprism_1fa_1e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1e_0v_splitedges, 
-      refprism_1fa_1e_0v_splitfaces, 
-      0,
-      refprism_1fa_1e_0v_newelstypes, 
-      refprism_1fa_1e_0v_newels
-    };
-
-//  HP_PRISM_2FA_1E_0V
-  int refprism_2fa_1e_0v_splitedges[][3] =
-    {
-      { 1, 4, 16 },
-      { 2, 5, 17 },
-      { 3, 6, 18 },
-      { 1, 2, 7}, 
-      { 1, 3, 12},
-      { 4, 6, 45},
-      { 4, 5, 40},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 0, 0, 0 }
-    };
-  int refprism_2fa_1e_0v_splitfaces[][4] =
-    {
-      {1,2,4,19},
-      {1,3,4,24},
-      {4,1,5,31},
-      {4,1,6,36},
-      {0,0,0,0}
-    }; 
-
-  HPREF_ELEMENT_TYPE refprism_2fa_1e_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE,
-      HP_HEX,
-      HP_PRISM_1FA_1E_0V,
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_NONE,
-    };
-  int refprism_2fa_1e_0v_newels[][8] =
-    {
-      { 16, 19, 24, 28, 31, 36 }, 
-      { 24, 19,  17, 18, 36, 31, 29, 30 }, 
-      { 1, 7 , 12 , 16, 19, 24 }, 
-      { 12, 7, 2, 3, 24, 19, 17, 18 },
-      { 4, 45, 40, 28, 36, 31 }, 
-      { 40, 45, 6, 5, 31, 36, 30, 29,}
-    };
-  HPRef_Struct refprism_2fa_1e_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_1e_0v_splitedges, 
-      refprism_2fa_1e_0v_splitfaces,
-      0,
-      refprism_2fa_1e_0v_newelstypes, 
-      refprism_2fa_1e_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
-    };
-
-//  HP_PRISM_1FB_1EC_0V   ... quad face 1-2-4-5 with singular edge 3-6 
-  int refprism_1fb_1ec_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {3,2,10},
-      {3,1,11},
-      {5,6,42},
-      {4,6,45},
-      {6,5,43},
-      {6,4,44},
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_1fb_1ec_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE, 
-      HP_HEX, 
-      HP_HEX_1F_0E_0V,
-      HP_NONE,
-    };
-  int refprism_1fb_1ec_0v_newels[][8] =
-    {
-      { 3, 11, 10, 6, 44, 43},
-      { 12, 9, 10, 11, 45, 42, 43, 44}, 
-      { 4, 5, 2, 1, 45, 42, 9, 12 } 
-    };
-  HPRef_Struct refprism_1fb_1ec_0v =
-    {
-      HP_PRISM,
-      refprism_1fb_1ec_0v_splitedges, 
-      0, 0,
-      refprism_1fb_1ec_0v_newelstypes, 
-      refprism_1fb_1ec_0v_newels
-    };
-
-//  HP_PRISM_1FA_1FB_1EC_0V   ... bot-trig face, quad face 1-2-4-5 with singular edge 3-6 
-  int refprism_1fa_1fb_1ec_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {3,2,10},
-      {3,1,11},
-      {5,6,42},
-      {4,6,45},
-      {6,5,43},
-      {6,4,44},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      { 0, 0, 0 }
-    };
-
- int refprism_1fa_1fb_1ec_0v_splitfaces[][4] =
-   {
-     {2,3,5,21},
-     {3,2,6,22},
-     {3,1,6,23},
-     {1,3,4,24},
-     {0,0,0,0}
-   }; 
-  HPREF_ELEMENT_TYPE refprism_1fa_1fb_1ec_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE, 
-      HP_HEX, 
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_NONE,
-    };
-  int refprism_1fa_1fb_1ec_0v_newels[][8] =
-    {
-      { 18, 23, 22, 6, 44, 43},
-      { 24, 21, 22, 23, 45, 42, 43, 44}, 
-      { 4, 5, 17, 16, 45, 42, 21, 24}, 
-      { 3, 11, 10, 18, 23, 22}, 
-      { 12, 9, 10, 11, 24, 21, 22, 23},
-      { 1, 2, 9, 12, 16, 17, 21, 24}
-    };
-  HPRef_Struct refprism_1fa_1fb_1ec_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_1ec_0v_splitedges,
-      refprism_1fa_1fb_1ec_0v_splitfaces, 0,
-      refprism_1fa_1fb_1ec_0v_newelstypes, 
-      refprism_1fa_1fb_1ec_0v_newels
-    };
-
-
-//  HP_PRISM_1FA_1FB_2EB_0V  
-  int refprism_1fa_1fb_2eb_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {3,2,10},
-      {3,1,11},
-      {5,6,42},
-      {4,6,45},
-      {6,5,43},
-      {6,4,44},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      { 4, 5, 40},
-      { 4, 6, 45},
-      { 1, 2, 7},
-      { 0, 0, 0 }
-    };
-
- int refprism_1fa_1fb_2eb_0v_splitfaces[][4] =
-   {
-     {2,3,5,21},
-     {3,2,6,22},
-     {3,1,6,23},
-     {1,3,4,24},
-     {1,2,4,19},
-     {0,0,0,0}
-   }; 
-  HPREF_ELEMENT_TYPE refprism_1fa_1fb_2eb_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE, 
-      HP_HEX, 
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_NONE,
-    };
-  int refprism_1fa_1fb_2eb_0v_newels[][8] =
-    {
-      { 18, 23, 22, 6, 44, 43},
-      { 24, 21, 22, 23, 45, 42, 43, 44}, 
-      { 40, 5, 17, 19, 45, 42, 21, 24}, 
-      { 3, 11, 10, 18, 23, 22}, 
-      { 12, 9, 10, 11, 24, 21, 22, 23},
-      { 7, 2, 9, 12, 19, 17, 21, 24},
-      {16,19,24,4,40,45},
-      {1,7,12,16,19,24}
-    };
-  HPRef_Struct refprism_1fa_1fb_2eb_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_2eb_0v_splitedges, 
-      refprism_1fa_1fb_2eb_0v_splitfaces, 0,
-      refprism_1fa_1fb_2eb_0v_newelstypes, 
-      refprism_1fa_1fb_2eb_0v_newels
-    };
-
- //  HP_PRISM_1FA_1FB_2EC_0V 
-  int refprism_1fa_1fb_2ec_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {3,2,10},
-      {3,1,11},
-      {5,6,42},
-      {4,6,45},
-      {6,5,43},
-      {6,4,44},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,4,41},
-      {2,1,8},
-      { 0, 0, 0 }
-    };
-
- int refprism_1fa_1fb_2ec_0v_splitfaces[][4] =
-   {
-     {2,3,5,21},
-     {3,2,6,22},
-     {3,1,6,23},
-     {1,3,4,24},
-     {2,1,5,20},
-     {0,0,0,0}
-   }; 
-  HPREF_ELEMENT_TYPE refprism_1fa_1fb_2ec_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE, 
-      HP_HEX, 
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_NONE,
-    };
-  int refprism_1fa_1fb_2ec_0v_newels[][8] =
-    {
-      { 18, 23, 22, 6, 44, 43},
-      { 24, 21, 22, 23, 45, 42, 43, 44}, 
-      { 4, 41, 20, 16, 45, 42, 21, 24}, 
-      { 3, 11, 10, 18, 23, 22}, 
-      { 12, 9, 10, 11, 24, 21, 22, 23},
-      { 1, 8, 9, 12, 16, 20, 21, 24}, 
-      {8,2,9,20,17,21}, 
-      {5,41,42,17,20,21}
-    };
-  HPRef_Struct refprism_1fa_1fb_2ec_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_2ec_0v_splitedges, 
-      refprism_1fa_1fb_2ec_0v_splitfaces,
-      0,
-      refprism_1fa_1fb_2ec_0v_newelstypes, 
-      refprism_1fa_1fb_2ec_0v_newels
-    };
-
-
-
-
-
-
-
-//  HP_PRISM_2FA_1FB_1EC_0V   ... trig faces, quad face 1-2-4-5 with singular edge 3-6 
-  int refprism_2fa_1fb_1ec_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {3,2,10},
-      {3,1,11},
-      {5,6,42},
-      {4,6,45},
-      {6,5,43},
-      {6,4,44},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 0, 0, 0 }
-    };
-
- int refprism_2fa_1fb_1ec_0v_splitfaces[][4] =
-   {
-     {2,3,5,21},
-     {3,2,6,22},
-     {3,1,6,23},
-     {1,3,4,24},
-     {5,2,6,33},
-     {6,5,3,34},
-     {6,4,3,35},
-     {4,1,6,36},
-     {0,0,0,0}
-   }; 
-  HPREF_ELEMENT_TYPE refprism_2fa_1fb_1ec_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE, 
-      HP_HEX, 
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FA_1E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_NONE,
-    };
-  int refprism_2fa_1fb_1ec_0v_newels[][8] =
-    {
-      { 18, 23, 22, 30, 35, 34},
-      { 24, 21, 22, 23, 36, 33, 34, 35}, 
-      { 28, 29, 17, 16, 36, 33, 21, 24}, 
-      { 3, 11, 10, 18, 23, 22}, 
-      { 12, 9, 10, 11, 24, 21, 22, 23},
-      { 1, 2, 9, 12, 16, 17, 21, 24},
-      { 6, 43, 44, 30, 34, 35},
-      { 44, 43, 42, 45, 35, 34, 33, 36}, 
-      { 5, 4, 45, 42, 29, 28, 36, 33 }, 
-    };
-  HPRef_Struct refprism_2fa_1fb_1ec_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_1fb_1ec_0v_splitedges, 
-      refprism_2fa_1fb_1ec_0v_splitfaces,
-      0,
-      refprism_2fa_1fb_1ec_0v_newelstypes, 
-      refprism_2fa_1fb_1ec_0v_newels
-    };
-
-//  HP_PRISM_2FA_1FB_2EB_0V  
-  int refprism_2fa_1fb_2eb_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {3,2,10},
-      {3,1,11},
-      {5,6,42},
-      {4,6,45},
-      {6,5,43},
-      {6,4,44},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      {4,5,40},
-      {1,2,7},
-      { 0, 0, 0 }
-    };
-
- int refprism_2fa_1fb_2eb_0v_splitfaces[][4] =
-   {
-     {2,3,5,21},
-     {3,2,6,22},
-     {3,1,6,23},
-     {1,3,4,24},
-     {5,6,2,33},
-     {6,5,3,34},
-     {6,4,3,35},
-     {4,1,6,36},
-     {4,1,5,31},
-     {1,2,4,19},
-     {0,0,0,0}
-   }; 
-  HPREF_ELEMENT_TYPE refprism_2fa_1fb_2eb_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE, 
-      HP_HEX, 
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FA_1E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_NONE,
-    };
-  int refprism_2fa_1fb_2eb_0v_newels[][8] =
-    {
-      { 18, 23, 22, 30, 35, 34},
-      { 24, 21, 22, 23, 36, 33, 34, 35}, 
-      { 31, 29, 17, 19, 36, 33, 21, 24}, 
-      { 3, 11, 10, 18, 23, 22}, 
-      { 12, 9, 10, 11, 24, 21, 22, 23},
-      { 7, 2, 9, 12, 19, 17, 21, 24},
-      { 6, 43, 44, 30, 34, 35},
-      { 44, 43, 42, 45, 35, 34, 33, 36}, 
-      { 5, 40, 45, 42, 29, 31, 36, 33 }, 
-      { 1, 7, 12, 16, 19, 24 }, 
-      { 16, 19, 24, 28, 31, 36 }, 
-      { 40, 4, 45, 31, 28, 36 }, 
-    };
-  HPRef_Struct refprism_2fa_1fb_2eb_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_1fb_2eb_0v_splitedges, 
-      refprism_2fa_1fb_2eb_0v_splitfaces, 0,
-      refprism_2fa_1fb_2eb_0v_newelstypes, 
-      refprism_2fa_1fb_2eb_0v_newels
-    };
-
-//  HP_PRISM_1FB_2EA_0V   ... quad face 1-2-4-5 with singular edges 1-4, 2-5
-  int refprism_1fb_2ea_0v_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 3, 8 },
-      { 1, 2, 9 }, 
-      { 2, 1, 10 }, 
-      { 4, 6, 11 }, 
-      { 5, 6, 12 }, 
-      { 4, 5, 13 }, 
-      { 5, 4, 14 }, 
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_1fb_2ea_0v_newelstypes[] =
-    {
-      HP_PRISM, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V, 
-      HP_NONE,
-    };
-  int refprism_1fb_2ea_0v_newels[][8] =
-    {
-      { 7, 8, 3, 11, 12, 6 }, 
-      { 1, 9, 7, 4, 13, 11 }, 
-      { 13, 14, 10, 9, 11, 12, 8, 7 }, 
-      { 5, 14, 12, 2, 10, 8 }, 
-    };
-  HPRef_Struct refprism_1fb_2ea_0v =
-    {
-      HP_PRISM,
-      refprism_1fb_2ea_0v_splitedges, 
-      0, 0,
-      refprism_1fb_2ea_0v_newelstypes, 
-      refprism_1fb_2ea_0v_newels
-    };
-
-//  HP_PRISM_1FB_2EB_0V   ... quad face 1-2-4-5 with singular edges 1-4, 3-6 
-  int refprism_1fb_2eb_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 4, 5, 40},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0 }
-    };
-HPREF_ELEMENT_TYPE refprism_1fb_2eb_0v_newelstypes[] =
-    {
-      HP_PRISM_SINGEDGE,
-      HP_HEX, 
-      HP_PRISM_1FB_1EA_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_NONE,
-    };
-  int refprism_1fb_2eb_0v_newels[][8] =
-    {
-      { 3, 11, 10, 6, 44, 43 },  
-      { 12, 9, 10, 11, 45, 42, 43, 44}, 
-      { 1, 7, 12, 4, 40, 45}, 
-      { 40, 5, 2, 7, 45, 42, 9, 12}
-    };
-  HPRef_Struct refprism_1fb_2eb_0v =
-    {
-      HP_PRISM,
-      refprism_1fb_2eb_0v_splitedges, 
-      0, 0,
-      refprism_1fb_2eb_0v_newelstypes, 
-      refprism_1fb_2eb_0v_newels
-    };
-
-//  HP_PRISM_1FB_3E_0V   ... quad face 1-2-4-5 with singular edges 1-4, 3-6
-  int refprism_1fb_3e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_1fb_3e_0v_newelstypes[] =
-    { 
-      HP_PRISM_SINGEDGE,
-      HP_HEX, 
-      HP_PRISM_1FB_1EA_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V, 
-      HP_NONE,
-    };
-  int refprism_1fb_3e_0v_newels[][8] =
-    {
-      { 3, 11, 10, 6, 44, 43 }, 
-      { 12, 9, 10, 11, 45, 42, 43, 44}, 
-      { 1, 7, 12, 4, 40, 45 }, 
-      { 40, 41, 8, 7, 45, 42, 9, 12}, 
-      { 5, 41, 42, 2, 8, 9}, 
-    };
-  HPRef_Struct refprism_1fb_3e_0v =
-    {
-      HP_PRISM,
-      refprism_1fb_3e_0v_splitedges, 
-      0, 0,
-      refprism_1fb_3e_0v_newelstypes, 
-      refprism_1fb_3e_0v_newels
-    };
-
-
-
-//  HP_PRISM_2FB    ... quad face 1-2-4-5 and quad face 1-4-6-3
-  int refprism_2fb_0e_0v_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 3, 8 },
-      { 1, 2, 9 }, 
-      { 3, 2, 10 }, 
-      { 4, 6, 11 },
-      { 5, 6, 12 },
-      { 4, 5, 13 },
-      { 6, 5, 14 },
-      { 0, 0, 0 }
-    };
- int refprism_2fb_0e_0v_splitfaces[][4] =
-    {
-      { 1, 2, 3, 15 },
-      { 4, 5, 6, 16 },
-      { 0, 0, 0, 0 },
-    };
-  HPREF_ELEMENT_TYPE refprism_2fb_0e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_NONE,
-    };
-  int refprism_2fb_0e_0v_newels[][8] =
-    {
-      { 15, 8, 10, 16, 12, 14 }, 
-      { 13, 5, 2, 9, 16, 12, 8, 15}, 
-      { 11, 7, 3, 6, 16, 15, 10, 14 }, 
-      { 1, 9, 15, 4, 13, 16 }, 
-      { 4, 11, 16, 1,7, 15 }
-    };
-  HPRef_Struct refprism_2fb_0e_0v =
-    {
-      HP_PRISM,
-      refprism_2fb_0e_0v_splitedges, 
-      refprism_2fb_0e_0v_splitfaces,
-      0,
-      refprism_2fb_0e_0v_newelstypes, 
-      refprism_2fb_0e_0v_newels
-    };
-
-//  HP_PRISM_2FB    ... quad face 1-2-4-5 and quad face 1-4-6-3 and sing edge 3-6
-  int refprism_2fb_1ec_0v_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 3, 8 },
-      { 1, 2, 9 }, 
-      { 3, 2, 10 }, 
-      { 4, 6, 11 },
-      { 5, 6, 12 },
-      { 4, 5, 13 },
-      { 6, 5, 14 },
-      { 3, 1, 17},
-      { 6, 4, 18}, 
-      { 0, 0, 0 }
-    };
- int refprism_2fb_1ec_0v_splitfaces[][4] =
-    {
-      { 1, 2, 3, 15 },
-      { 4, 5, 6, 16 },
-      { 0, 0, 0, 0 },
-    };
-  HPREF_ELEMENT_TYPE refprism_2fb_1ec_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_NONE,
-    };
-  int refprism_2fb_1ec_0v_newels[][8] =
-    {
-      { 15, 8, 10, 16, 12, 14 }, 
-      { 13, 5, 2, 9, 16, 12, 8, 15}, 
-      { 11, 7, 17, 18, 16, 15, 10, 14 }, 
-      { 1, 9, 15, 4, 13, 16 }, 
-      { 4, 11, 16, 1,7, 15 }, 
-      { 3, 17, 10, 6, 18, 14 } 
-    };
-  HPRef_Struct refprism_2fb_1ec_0v =
-    {
-      HP_PRISM,
-      refprism_2fb_1ec_0v_splitedges, 
-      refprism_2fb_1ec_0v_splitfaces,
-      0,
-      refprism_2fb_1ec_0v_newelstypes, 
-      refprism_2fb_1ec_0v_newels
-    };
-
-
-
-//  HP_PRISM_2FB    ... quad face 1-2-4-5 and quad face 1-4-6-3 and 3 sing edges
-  int refprism_2fb_3e_0v_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 3, 8 },
-      { 1, 2, 9 }, 
-      { 3, 2, 10 }, 
-      { 4, 6, 11 },
-      { 5, 6, 12 },
-      { 4, 5, 13 },
-      { 6, 5, 14 },
-      { 3, 1, 17},
-      { 6, 4, 18}, 
-      { 2, 1, 19},
-      { 5, 4, 20}, 
-      { 0, 0, 0 }
-    };
- int refprism_2fb_3e_0v_splitfaces[][4] =
-    {
-      { 1, 2, 3, 15 },
-      { 4, 5, 6, 16 },
-      { 0, 0, 0, 0 },
-    };
-  HPREF_ELEMENT_TYPE refprism_2fb_3e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_NONE,
-    };
-  int refprism_2fb_3e_0v_newels[][8] =
-    {
-      { 15, 8, 10, 16, 12, 14 }, 
-      { 13, 20, 19, 9, 16, 12, 8, 15}, 
-      { 11, 7, 17, 18, 16, 15, 10, 14 }, 
-      { 1, 9, 15, 4, 13, 16 }, 
-      { 4, 11, 16, 1,7, 15 }, 
-      { 3, 17, 10, 6, 18, 14 }, 
-      { 5, 20, 12, 2, 19, 8 }
-    };
-  HPRef_Struct refprism_2fb_3e_0v =
-    {
-      HP_PRISM,
-      refprism_2fb_3e_0v_splitedges, 
-      refprism_2fb_3e_0v_splitfaces, 0,
-      refprism_2fb_3e_0v_newelstypes, 
-      refprism_2fb_3e_0v_newels
-    };
-
-
-
-//  HP_PRISM_1FA_1FB_0E_0V   ... quad face 1-2-4-5 and trig face 1-2-3
-  int refprism_1fa_1fb_0e_0v_splitedges[][3] = 
-    {
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {2,3,9},
-      {1,3,12},
-      {5,6,42},
-      {4,6,45},
-      {0,0,0}
-    };
-  int refprism_1fa_1fb_0e_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      { 0, 0, 0, 0 }
-    };
-
-HPREF_ELEMENT_TYPE refprism_1fa_1fb_0e_0v_newelstypes[] =
-    {
-      HP_PRISM, 
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_NONE,
-    };
-  int refprism_1fa_1fb_0e_0v_newels[][8] =
-    {
-      { 24, 21, 18, 45, 42, 6 }, 
-      { 4, 5, 17, 16, 45, 42, 21, 24 },
-      { 12, 9, 3, 24, 21, 18 }, 
-      { 1, 2, 9, 12, 16, 17, 21, 24 } 
-    };
-  HPRef_Struct refprism_1fa_1fb_0e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_0e_0v_splitedges, 
-
-      refprism_1fa_1fb_0e_0v_splitfaces, 0,
-      refprism_1fa_1fb_0e_0v_newelstypes, 
-      refprism_1fa_1fb_0e_0v_newels
-    };
-
-/*
-//  HP_PRISM_1FA_1FB_1EC_0V   ... quad face 1-2-4-5 and trig face 1-2-3
-int refprism_1fa_1fb_1ec_0v_splitedges[][3] =
-    {
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {2,3,9},
-      {1,3,12},
-      {5,6,42},
-      {4,6,45},
-      {6,5,43},
-      {6,4,44},
-      {3,2,10},
-      {3,1,11},
-      {0,0,0}
-    };
-  int refprism_1fa_1fb_1ec_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      { 0, 0, 0, 0 }
-    };
-
-  HPREF_ELEMENT_TYPE refprism_1fa_1fb_1ec_0v_newelstypes[] =
-    {
-      HP_PRISM, 
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_1FA_1E_0V, 
-      HP_PRISM_
-      HP_NONE,
-    };
-  int refprism_1fa_1fb_0e_0v_newels[][8] =
-    {
-      { 24, 21, 18, 45, 42, 6 }, 
-      { 4, 5, 17, 16, 45, 42, 21, 24 },
-      { 12, 9, 3, 24, 21, 18 }, 
-      { 1, 2, 9, 12, 16, 17, 21, 24 } 
-    };
-  HPRef_Struct refprism_1fa_1fb_0e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_1ec_0v_splitedges, 
-
-      refprism_1fa_1fb_1ec_0v_splitfaces, 0,
-      refprism_1fa_1fb_1ec_0v_newelstypes, 
-      refprism_1fa_1fb_1ec_0v_newels
-    };
-
-
-*/
-
-
-
-
-//  HP_PRISM_2FA_1FB_0E_0V   ... quad face 1-2-4-5 and trig face 1-2-3 
-  int refprism_2fa_1fb_0e_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {4,1,28},
-      {5,2,29},
-      {6,3,30},
-      {0,0,0}
-      
-    };
-  int refprism_2fa_1fb_0e_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {5,6,2,33},
-      {4,1,6,36},
-      {0,0,0,0}
-    };
-
-  HPREF_ELEMENT_TYPE refprism_2fa_1fb_0e_0v_newelstypes[] =
-    {  
-      HP_HEX_1F_0E_0V,
-      HP_PRISM,
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_NONE,
-    };
-  int refprism_2fa_1fb_0e_0v_newels[][8] =
-    {
-      {28,29,17,16,36,33,21,24}, 
-      {24,21,18, 36, 33, 30}, 
-      {12,9,3,24,21,18},
-      {1,2,9,12,16,17,21,24}, 
-      {6,42,45,30,33,36},
-      {4,5,29,28,45,42,33,36}
-    };
-  HPRef_Struct refprism_2fa_1fb_0e_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_1fb_0e_0v_splitedges, 
-
-      refprism_2fa_1fb_0e_0v_splitfaces, 0,
-      refprism_2fa_1fb_0e_0v_newelstypes, 
-      refprism_2fa_1fb_0e_0v_newels
-    };
-
-
-//  HP_PRISM_1FA_1FB_1EA_0V   ... quad face 1-2-4-5 and trig face 1-2-3 
-  int refprism_1fa_1fb_1ea_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {4,5,40},
-      {1,2,7},
-      {0,0,0}, 
-    };
-  int refprism_1fa_1fb_1ea_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {1,2,4,19},
-      {0,0,0,0}, 
-    };
-
-  HPREF_ELEMENT_TYPE refprism_1fa_1fb_1ea_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_PRISM,
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_NONE
-    };
-  int refprism_1fa_1fb_1ea_0v_newels[][8] =
-    {
-      {40,5,17,19,45,42,21,24}, 
-      {24,21,18,45,42,6},
-      {12,9,3,24,21,18},
-      {7,2,9,12,19,17,21,24}, 
-      {16,19,24,4,40,45},
-      {1,7,12,16,19,24}
-      
-    };
-  HPRef_Struct refprism_1fa_1fb_1ea_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_1ea_0v_splitedges, 
-      refprism_1fa_1fb_1ea_0v_splitfaces, 0,
-      refprism_1fa_1fb_1ea_0v_newelstypes, 
-      refprism_1fa_1fb_1ea_0v_newels
-    };
-
-//  HP_PRISM_2FA_1FB_1EA_0V   
-  int refprism_2fa_1fb_1ea_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {4,1,28},
-      {5,2,29},
-      {6,3,30},
-      {4,5,40},
-      {1,2,7},
-      {0,0,0}, 
-    };
-  int refprism_2fa_1fb_1ea_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {1,2,4,19},
-      {4,1,6,36},
-      {4,1,5,31},
-      {5,6,2,33},
-      {0,0,0,0}, 
-    };
-
-  HPREF_ELEMENT_TYPE refprism_2fa_1fb_1ea_0v_newelstypes[] =
-    {
-      HP_PRISM, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V, 
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_NONE
-    };
-  int refprism_2fa_1fb_1ea_0v_newels[][8] =
-    {
-      { 18, 24, 21, 30, 36, 33}, 
-      { 31, 29, 17, 19, 36, 33, 21, 24}, 
-      { 16,19, 24, 28, 31, 36 }, 
-      { 3, 12, 9, 18, 24, 21 }, 
-      { 7, 2, 9, 12, 19, 17, 21, 24},  
-      { 1, 7, 12, 16, 19, 24 }, 
-      { 6, 42, 45, 30, 33, 36 }, 
-      { 40, 5, 29, 31, 45, 42, 33, 36 },
-      { 40, 4, 45, 31, 28, 36} 
-    };
-  HPRef_Struct refprism_2fa_1fb_1ea_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_1fb_1ea_0v_splitedges, 
-      refprism_2fa_1fb_1ea_0v_splitfaces, 0,
-      refprism_2fa_1fb_1ea_0v_newelstypes, 
-      refprism_2fa_1fb_1ea_0v_newels
-    };
-
-
-//  HP_PRISM_2FA_1FB_2EA_0V   
-  int refprism_2fa_1fb_2ea_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {4,1,28},
-      {5,2,29},
-      {6,3,30},
-      {4,5,40},
-      {1,2,7},
-      { 5, 4, 41},
-      { 2, 1, 8},
-      {0,0,0}, 
-    };
-  int refprism_2fa_1fb_2ea_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {1,2,4,19},
-      {4,1,6,36},
-      {4,1,5,31},
-      {5,6,2,33},
-      {5,4,2,32},
-      {2,1,5,20},
-      {0,0,0,0}, 
-    };
-
-  HPREF_ELEMENT_TYPE refprism_2fa_1fb_2ea_0v_newelstypes[] =
-    {
-      HP_PRISM, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V, 
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_NONE
-    };
-  int refprism_2fa_1fb_2ea_0v_newels[][8] =
-    {
-      { 18, 24, 21, 30, 36, 33}, 
-      { 31, 32, 20, 19, 36, 33, 21, 24}, 
-      { 16,19, 24, 28, 31, 36 }, 
-      { 3, 12, 9, 18, 24, 21 }, 
-      {7,8,9,12,19,20,21,24},
-      { 1, 7, 12, 16, 19, 24 }, 
-      { 6, 42, 45, 30, 33, 36 }, 
-      { 40, 41, 32, 31, 45, 42, 33, 36}, 
-      { 40, 4, 45, 31, 28, 36}, 
-      { 8, 2, 9, 20, 17, 21 },  
-      { 29, 32, 33, 17, 20, 21 }, 
-      { 5, 41, 42, 29, 32, 33 }, 
-    };
-  HPRef_Struct refprism_2fa_1fb_2ea_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_1fb_2ea_0v_splitedges, 
-      refprism_2fa_1fb_2ea_0v_splitfaces, 0,
-      refprism_2fa_1fb_2ea_0v_newelstypes, 
-      refprism_2fa_1fb_2ea_0v_newels
-    };
-
-//  HP_PRISM_2FA_1FB_3E_0V   
-  int refprism_2fa_1fb_3e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      {0,0,0}, 
-    };
-  int refprism_2fa_1fb_3e_0v_splitfaces[][4] = 
-    {
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,1,5,31},
-      {5,4,2,32},
-      {5,6,2,33},
-      {6,5,3,34},
-      {6,4,3,35},
-      {4,1,6,36},
-      {0,0,0,0}, 
-    };
-
-  HPREF_ELEMENT_TYPE refprism_2fa_1fb_3e_0v_newelstypes[] =
-    {
-      HP_HEX,
-      HP_PRISM_SINGEDGE,
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V, 
-      HP_PRISM_1FB_1EA_0V, 
-
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_HEX_1FA_1FB_0E_0V,
-      
-      HP_NONE
-    };
-  int refprism_2fa_1fb_3e_0v_newels[][8] =
-    {
-      {24, 21, 22, 23, 36, 33, 34, 35},
-      {18, 23, 22, 30, 35, 34}, 
-      { 31, 32, 20, 19, 36, 33, 21, 24}, 
-      { 16,19, 24, 28, 31, 36 }, 
-      { 29, 32, 33, 17, 20, 21},
-      
-      
-      { 12, 9,10,11, 24, 21, 22, 23 }, 
-      { 3, 11, 10, 18,23,22}, 
-      { 1, 7, 12 , 16, 19, 24}, 
-      { 8,2,9, 20, 17,21}, 
-      { 7,8,9,12,19, 20, 21, 24}, 
-      
-      { 44, 43, 42, 45, 35, 34, 33, 36}, 
-      { 6, 43, 44, 30, 34, 35}, 
-      { 40, 4, 45, 31,28, 36}, 
-      { 5, 41,42, 29, 32, 33},  
-      { 40, 41, 32, 31, 45, 42, 33, 36}, 
-    };
-  HPRef_Struct refprism_2fa_1fb_3e_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_1fb_3e_0v_splitedges, 
-
-      refprism_2fa_1fb_3e_0v_splitfaces, 0,
-      refprism_2fa_1fb_3e_0v_newelstypes, 
-      refprism_2fa_1fb_3e_0v_newels
-    };
-
-
-
-
-//  HP_PRISM_1FA_1FB_1EB_0V   ... quad face 1-2-4-5 and trig face 1-2-3 
-  int refprism_1fa_1fb_1eb_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {5,4,41},
-      {2,1,8},
-      {0,0,0}, 
-    };
-  int refprism_1fa_1fb_1eb_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {2,1,5,20},
-      {0,0,0,0}, 
-    };
-
-  HPREF_ELEMENT_TYPE refprism_1fa_1fb_1eb_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_PRISM,
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V ,
-      HP_NONE
-    };
-  int refprism_1fa_1fb_1eb_0v_newels[][8] =
-    {
-      {4,41,20,16,45,42,21,24}, 
-      {24,21,18,45,42,6},
-      {12,9,3,24,21,18},
-      {1,8,9,12,16,20,21,24},
-      {5,41,42,17,20,21},
-      {8,2,9,20,17,21}
-    };
-  HPRef_Struct refprism_1fa_1fb_1eb_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_1eb_0v_splitedges, 
-
-       refprism_1fa_1fb_1eb_0v_splitfaces, 0,
-      refprism_1fa_1fb_1eb_0v_newelstypes, 
-      refprism_1fa_1fb_1eb_0v_newels
-    };
-
-
-//  HP_PRISM_1FA_1FB_2EA_0V   ... quad face 1-2-4-5 and trig face 1-2-3 
-  int refprism_1fa_1fb_2ea_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {5,4,41},
-      {2,1,8},
-      {4,5,40},
-      {1,2,7},
-      {0,0,0},
-
-    };
-  int refprism_1fa_1fb_2ea_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {2,1,5,20},
-      {1,2,4,19},
-      {0,0,0,0},
-    };
-
-  HPREF_ELEMENT_TYPE refprism_1fa_1fb_2ea_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_PRISM,
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V ,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_NONE
-    };
-  int refprism_1fa_1fb_2ea_0v_newels[][8] =
-    {
-      {40,41,20,19,45,42,21,24}, 
-      {24,21,18,45,42,6},
-      {12,9,3,24,21,18},
-      {7,8,9,12,19,20,21,24},
-      {5,41,42,17,20,21},
-      {8,2,9,20,17,21},
-      {16,19,24,4,40,45},
-      {1,7,12,16,19,24}
-    };
-  HPRef_Struct refprism_1fa_1fb_2ea_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_2ea_0v_splitedges, 
-
-      refprism_1fa_1fb_2ea_0v_splitfaces, 0,
-      refprism_1fa_1fb_2ea_0v_newelstypes, 
-      refprism_1fa_1fb_2ea_0v_newels
-    };
-
-
-//  HP_PRISM_1FA_1FB_3E_0V   
-  int refprism_1fa_1fb_3e_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {5,4,41},
-      {2,1,8},
-      {4,5,40},
-      {1,2,7},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      {0,0,0},
-
-    };
-  int refprism_1fa_1fb_3e_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {2,1,5,20},
-      {1,2,4,19},
-      {3,2,6,22},
-      {3,1,6,23},
-      {0,0,0,0},
-    };
-
-  HPREF_ELEMENT_TYPE refprism_1fa_1fb_3e_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_HEX,
-      HP_PRISM_SINGEDGE,
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V ,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_NONE
-    };
-  int refprism_1fa_1fb_3e_0v_newels[][8] =
-    {
-      {40,41,20,19,45,42,21,24}, 
-      {24, 21, 22, 23, 45, 42, 43, 44},
-      {18, 23, 22, 6, 44, 43}, 
-      {12, 9, 10, 11, 24, 21, 22, 23}, 
-      {3, 11, 10, 18, 23, 22}, 
-      {7,8,9,12,19,20,21,24},
-      {5,41,42,17,20,21},
-      {8,2,9,20,17,21},
-      {16,19,24,4,40,45},
-      {1,7,12,16,19,24}
-    };
-  HPRef_Struct refprism_1fa_1fb_3e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_1fb_3e_0v_splitedges, 
-
-      refprism_1fa_1fb_3e_0v_splitfaces, 0,
-      refprism_1fa_1fb_3e_0v_newelstypes, 
-      refprism_1fa_1fb_3e_0v_newels
-    };
-
-
-
-
-
-
-
-
-//  HP_PRISM_2FA_0E_0V  singular trig faces
-  int refprism_2fa_0e_0v_splitedges[][3] =
-    {
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {4,1,28},
-      {5,2,29},
-      {6,3,30},
-      {0,0,0}
-    };
-  
-HPREF_ELEMENT_TYPE refprism_2fa_0e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_NONE
-    };
-  int refprism_2fa_0e_0v_newels[][8] =
-    {
-      {16,17,18,28,29,30},
-      {1,2,3,16,17,18},
-      {4,6,5,28,30,29}, 
-    };
-
-HPRef_Struct refprism_2fa_0e_0v = 
-
-    {
-      HP_PRISM,
-      refprism_2fa_0e_0v_splitedges, 
-      0, 0,
-      refprism_2fa_0e_0v_newelstypes, 
-      refprism_2fa_0e_0v_newels
-    };
-
-
-
-
-
-//  HP_PRISM_1FA_2FB    ... quad face 1-2-4-5 and quad face 1-4-6-3
-int refprism_1fa_2fb_0e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 5, 40},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 4, 6, 45},
-      { 0, 0, 0 }
-    };
-int refprism_1fa_2fb_0e_0v_splitfaces[][4] =
-    {
-      {1,2,3,13},
-      {1,2,4,19},
-      {2,3,5,21},
-      {3,2,6,22},
-      {1,3,4,24},
-      {4,5,6,46},
-      { 0, 0, 0, 0 }
-    };
-int refprism_1fa_2fb_0e_0v_splitelement[][5] = 
-  {
-    {1,2,3,4,25}, 
-    {0,0,0,0,0} 
-  };
-  
-HPREF_ELEMENT_TYPE refprism_1fa_2fb_0e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_NONE,
-    };
-  int refprism_1fa_2fb_0e_0v_newels[][8] =
-    {
-      { 25, 21, 22, 46, 42, 43 }, 
-      { 40, 5, 17, 19, 46, 42, 21, 25 }, 
-      { 24, 18, 6, 45, 25, 22, 43, 46}, 
-      { 16, 19, 25, 4, 40, 46 }, 
-      { 4, 45, 46, 16, 24, 25 }, 
-      { 13, 9, 10, 25, 21, 22 }, 
-      { 7, 2, 9, 13, 19, 17, 21, 25 }, 
-      { 3, 12, 13, 10, 18, 24, 25, 22 }, 
-      { 1, 7, 13, 16, 19, 25 }, 
-      { 12, 1, 13, 24, 16, 25 }
-      
-    };
-  HPRef_Struct refprism_1fa_2fb_0e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_2fb_0e_0v_splitedges, 
-      refprism_1fa_2fb_0e_0v_splitfaces, 
-      refprism_1fa_2fb_0e_0v_splitelement, 
-      refprism_1fa_2fb_0e_0v_newelstypes, 
-      refprism_1fa_2fb_0e_0v_newels
-    };
-
-//  HP_PRISM_1FA_2FB_1EC    ... quad face 1-2-4-5 and quad face 1-4-6-3
-int refprism_1fa_2fb_1ec_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 5, 40},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0 }
-    };
-int refprism_1fa_2fb_1ec_0v_splitfaces[][4] =
-    {
-      {1,2,3,13},
-      {1,2,4,19},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,5,6,46},
-      { 0, 0, 0, 0 }
-    };
-int refprism_1fa_2fb_1ec_0v_splitelement[][5] = 
-  {
-    {1,2,3,4,25}, 
-    {0,0,0,0,0} 
-  };
-  
-HPREF_ELEMENT_TYPE refprism_1fa_2fb_1ec_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V, 
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      
-      HP_NONE,
-    };
-  int refprism_1fa_2fb_1ec_0v_newels[][8] =
-    {
-      { 25, 21, 22, 46, 42, 43 }, 
-      { 40, 5, 17, 19, 46, 42, 21, 25 }, 
-      { 24, 23, 44, 45, 25, 22, 43, 46}, 
-      { 16, 19, 25, 4, 40, 46 }, 
-      { 4, 45, 46, 16, 24, 25 }, 
-      { 18, 23, 22, 6, 44, 43}, 
-
-
-      { 13, 9, 10, 25, 21, 22 }, 
-      { 7, 2, 9, 13, 19, 17, 21, 25 }, 
-      { 11, 12, 13, 10, 23, 24, 25, 22 }, 
-      { 1, 7, 13, 16, 19, 25 }, 
-      { 12, 1, 13, 24, 16, 25 }, 
-      { 3, 11, 10, 18, 23, 22},
-      
-    };
-  HPRef_Struct refprism_1fa_2fb_1ec_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_2fb_1ec_0v_splitedges, 
-      refprism_1fa_2fb_1ec_0v_splitfaces, 
-      refprism_1fa_2fb_1ec_0v_splitelement, 
-      refprism_1fa_2fb_1ec_0v_newelstypes, 
-      refprism_1fa_2fb_1ec_0v_newels
-    };
-
-
-//  HP_PRISM_1FA_2FB_3E    ... quad face 1-2-4-5 and quad face 1-4-6-3
-int refprism_1fa_2fb_3e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0 }
-    };
-int refprism_1fa_2fb_3e_0v_splitfaces[][4] =
-    {
-      {1,2,3,13},
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,5,6,46},
-      { 0, 0, 0, 0 }
-    };
-int refprism_1fa_2fb_3e_0v_splitelement[][5] = 
-  {
-    {1,2,3,4,25}, 
-    {0,0,0,0,0} 
-  };
-  
-HPREF_ELEMENT_TYPE refprism_1fa_2fb_3e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V,
-      
-      HP_NONE,
-    };
-  int refprism_1fa_2fb_3e_0v_newels[][8] =
-    {
-      { 25, 21, 22, 46, 42, 43 }, 
-      { 40, 41, 20, 19, 46, 42, 21, 25 }, 
-      { 24, 23, 44, 45, 25, 22, 43, 46}, 
-      { 16, 19, 25, 4, 40, 46 }, 
-      { 4, 45, 46, 16, 24, 25 }, 
-      { 18, 23, 22, 6, 44, 43}, 
-      { 5, 41, 42, 17, 20, 21}, 
-      
-
-      { 13, 9, 10, 25, 21, 22 }, 
-      { 7, 8, 9, 13, 19, 20, 21, 25 }, 
-      { 11, 12, 13, 10, 23, 24, 25, 22 }, 
-      { 1, 7, 13, 16, 19, 25 }, 
-      
-      { 12, 1, 13, 24, 16, 25 }, 
-      { 3, 11, 10, 18, 23, 22},
-      { 8, 2, 9, 20, 17, 21}, 
-      
-    };
-  HPRef_Struct refprism_1fa_2fb_3e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_2fb_3e_0v_splitedges, 
-      refprism_1fa_2fb_3e_0v_splitfaces, 
-      refprism_1fa_2fb_3e_0v_splitelement, 
-      refprism_1fa_2fb_3e_0v_newelstypes, 
-      refprism_1fa_2fb_3e_0v_newels
-    };
-
-
-
-
-
-
-
-
-
-//  HP_PRISM_1FA_2FB_1eb    ... quad face 1-2-4-5 and quad face 1-4-6-3
-int refprism_1fa_2fb_1eb_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 4, 6, 45},
-      { 0, 0, 0 }
-    };
-int refprism_1fa_2fb_1eb_0v_splitfaces[][4] =
-    {
-      {1,2,3,13},
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {1,3,4,24},
-      {4,5,6,46},
-      { 0, 0, 0, 0 }
-    };
-int refprism_1fa_2fb_1eb_0v_splitelement[][5] = 
-  {
-    {1,2,3,4,25}, 
-    {0,0,0,0,0} 
-  };
-
-
-HPREF_ELEMENT_TYPE refprism_1fa_2fb_1eb_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V,
-      
-      HP_NONE,
-    };
-
-  int refprism_1fa_2fb_1eb_0v_newels[][8] =
-    {
-      { 25, 21, 22, 46, 42, 43 }, 
-      { 40, 41, 20, 19, 46, 42, 21, 25 }, 
-      { 24, 18, 6, 45, 25, 22, 43, 46}, 
-      { 16, 19, 25, 4, 40, 46 },
-      { 4, 45, 46, 16, 24, 25 }, 
-      { 5, 41, 42, 17, 20, 21 },
-
-
-      { 13, 9, 10, 25, 21, 22 }, 
-      { 7, 8, 9, 13, 19, 20, 21, 25 }, 
-      { 3, 12, 13, 10, 18, 24, 25, 22 }, 
-      { 1, 7, 13, 16, 19, 25 },  
-      { 12, 1, 13, 24, 16, 25 }, 
-      { 8, 2, 9, 20, 17, 21}, 
-      
-    };
-  HPRef_Struct refprism_1fa_2fb_1eb_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_2fb_1eb_0v_splitedges, 
-      refprism_1fa_2fb_1eb_0v_splitfaces, 
-      refprism_1fa_2fb_1eb_0v_splitelement, 
-      refprism_1fa_2fb_1eb_0v_newelstypes, 
-      refprism_1fa_2fb_1eb_0v_newels
-    };
-
-
-
-
-
-
-//  HP_PRISM_2FA_2FB 
-int refprism_2fa_2fb_0e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 5, 40},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 4, 6, 45},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 0, 0, 0 }
-    };
-int refprism_2fa_2fb_0e_0v_splitfaces[][4] =
-    {
-      {1,2,3,13},
-      {1,2,4,19},
-      {2,3,5,21},
-      {3,2,6,22},
-      {1,3,4,24},
-      {4,5,6,46},  
-      {4,1,5,31},
-      {5,6,2,33},
-      {6,5,3,34},
-      {4,1,6,36},
-      { 0, 0, 0, 0 }
-    };
-int refprism_2fa_2fb_0e_0v_splitelement[][5] = 
-  {
-    {1,2,3,4,25}, 
-    {4,1,6,5,37},
-    {0,0,0,0,0} 
-  };
-  
-HPREF_ELEMENT_TYPE refprism_2fa_2fb_0e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V,
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_PRISM_1FA_1FB_1EA_0V,
-      
-      HP_NONE,
-    };
-  int refprism_2fa_2fb_0e_0v_newels[][8] =
-    {
-      { 25, 21, 22, 37, 33, 34}, 
-      { 31, 29, 17, 19, 37, 33, 21, 25}, 
-      { 36, 24, 18, 30, 37, 25, 22, 34}, 
-      { 16, 19, 25, 28, 31, 37}, 
-      { 28, 36, 37, 16, 24, 25},
-      
-      { 13, 9, 10, 25, 21, 22 }, 
-      { 7, 2, 9, 13, 19, 17, 21, 25 }, 
-      { 3, 12, 13, 10, 18, 24, 25, 22 }, 
-      { 1, 7, 13, 16, 19, 25 }, 
-      { 12, 1, 13, 24, 16, 25 }, 
-
-      {  46, 43, 42 ,37, 34, 33},
-      { 40, 5, 29, 31, 46, 42, 33, 37 }, 
-      { 6, 45, 36, 30, 43, 46, 37, 34 }, 
-      { 40, 4, 46, 31, 28, 37 }, 
-      { 4, 45, 46, 28, 36, 37},  
-      
-    };
-  HPRef_Struct refprism_2fa_2fb_0e_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_2fb_0e_0v_splitedges, 
-      refprism_2fa_2fb_0e_0v_splitfaces, 
-      refprism_2fa_2fb_0e_0v_splitelement, 
-      refprism_2fa_2fb_0e_0v_newelstypes, 
-      refprism_2fa_2fb_0e_0v_newels
-    };
-
-
-//  HP_PRISM_2FA_2FB_1EC 
-int refprism_2fa_2fb_1ec_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 4, 5, 40},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0 }
-    };
-int refprism_2fa_2fb_1ec_0v_splitfaces[][4] =
-    {
-      {1,2,3,13},
-      {1,2,4,19},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,5,6,46},  
-      {4,1,5,31},
-      {5,6,2,33},
-      {6,5,3,34},
-      {6,4,3,35},
-      {4,1,6,36},
-      { 0, 0, 0, 0 }
-    };
-int refprism_2fa_2fb_1ec_0v_splitelement[][5] = 
-  {
-    {1,2,3,4,25}, 
-    {4,1,6,5,37},
-    {0,0,0,0,0} 
-  };
-  
-HPREF_ELEMENT_TYPE refprism_2fa_2fb_1ec_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      
-      HP_NONE,
-    };
-  int refprism_2fa_2fb_1ec_0v_newels[][8] =
-    {
-      { 25, 21, 22, 37, 33, 34}, 
-      { 31, 29, 17, 19, 37, 33, 21, 25}, 
-      { 36, 24, 23, 35, 37, 25, 22, 34}, 
-      { 16, 19, 25, 28, 31, 37}, 
-      { 28, 36, 37, 16, 24, 25},
-      { 18, 23, 22, 30, 35, 34}, 
-            
-      { 13, 9, 10, 25, 21, 22 }, 
-      { 7, 2, 9, 13, 19, 17, 21, 25 }, 
-      { 11, 12, 13, 10, 23, 24, 25, 22 }, 
-      { 1, 7, 13, 16, 19, 25 }, 
-      { 12, 1, 13, 24, 16, 25 }, 
-      { 3, 11, 10, 18, 23, 22 }, 
-
-      { 46, 43, 42 ,37, 34, 33},
-      { 40, 5, 29, 31, 46, 42, 33, 37 }, 
-      { 44, 45, 36, 35, 43, 46, 37, 34 }, 
-      { 40, 4, 46, 31, 28, 37 }, 
-      { 4, 45, 46, 28, 36, 37},  
-      { 44, 6, 43, 35, 30, 34}, 
-      
-    };
-  HPRef_Struct refprism_2fa_2fb_1ec_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_2fb_1ec_0v_splitedges, 
-      refprism_2fa_2fb_1ec_0v_splitfaces, 
-      refprism_2fa_2fb_1ec_0v_splitelement, 
-      refprism_2fa_2fb_1ec_0v_newelstypes, 
-      refprism_2fa_2fb_1ec_0v_newels
-    };
-
-
-
-//  HP_PRISM_2FA_2FB_3E 
-int refprism_2fa_2fb_3e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0 }
-    };
-int refprism_2fa_2fb_3e_0v_splitfaces[][4] =
-    {
-      {1,2,3,13},
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,5,6,46},  
-      {4,1,5,31},
-      {5,4,2,32},
-      {5,6,2,33},
-      {6,5,3,34},
-      {6,4,3,35},
-      {4,1,6,36},
-      { 0, 0, 0, 0 }
-    };
-int refprism_2fa_2fb_3e_0v_splitelement[][5] = 
-  {
-    {1,2,3,4,25}, 
-    {4,1,6,5,37},
-    {0,0,0,0,0} 
-  };
-  
-HPREF_ELEMENT_TYPE refprism_2fa_2fb_3e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V, 
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V,
-      HP_PRISM_1FA_1FB_1EA_0V,
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      
-      HP_NONE,
-    };
-  int refprism_2fa_2fb_3e_0v_newels[][8] =
-    {
-      { 25, 21, 22, 37, 33, 34}, 
-      { 31, 32, 20, 19, 37, 33, 21, 25}, 
-      { 36, 24, 23, 35, 37, 25, 22, 34}, 
-      { 16, 19, 25, 28, 31, 37}, 
-      { 28, 36, 37, 16, 24, 25},
-      { 18, 23, 22, 30, 35, 34}, 
-      { 29, 32, 33, 17, 20, 21}, 
-            
-      { 13, 9, 10, 25, 21, 22 }, 
-      { 7, 8, 9, 13, 19, 20, 21, 25 }, 
-      { 11, 12, 13, 10, 23, 24, 25, 22 }, 
-      { 1, 7, 13, 16, 19, 25 }, 
-      { 12, 1, 13, 24, 16, 25 }, 
-      { 3, 11, 10, 18, 23, 22 }, 
-      { 8, 2, 9, 20, 17, 21 }, 
-
-      { 46, 43, 42 ,37, 34, 33},
-      { 40, 41, 32, 31, 46, 42, 33, 37 }, 
-      { 44, 45, 36, 35, 43, 46, 37, 34 }, 
-      { 40, 4, 46, 31, 28, 37 }, 
-      { 4, 45, 46, 28, 36, 37},  
-      { 44, 6, 43, 35, 30, 34},
-      { 5, 41, 42, 29, 32, 33}, 
-      
-    };
-  HPRef_Struct refprism_2fa_2fb_3e_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_2fb_3e_0v_splitedges, 
-      refprism_2fa_2fb_3e_0v_splitfaces, 
-      refprism_2fa_2fb_3e_0v_splitelement, 
-      refprism_2fa_2fb_3e_0v_newelstypes, 
-      refprism_2fa_2fb_3e_0v_newels
-    };
-
-
-
-
-//  HP_PRISM_1FA_2E_0V  
-  int refprism_1fa_2e_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {5,4,41},
-      {2,1,8},
-      {4,5,40},
-      {1,2,7},
-      {0,0,0},
-
-    };
-  int refprism_1fa_2e_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {2,1,5,20},
-      {1,2,4,19},
-      {0,0,0,0},
-    };
-
-  HPREF_ELEMENT_TYPE refprism_1fa_2e_0v_newelstypes[] =
-    {
-      HP_HEX,
-      HP_PRISM,
-      HP_PRISM_1FA_0E_0V, 
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_SINGEDGE, 
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_1FA_1E_0V,
-      HP_NONE
-    };
-  int refprism_1fa_2e_0v_newels[][8] =
-    {
-      {40,41,20,19,45,42,21,24}, 
-      {24,21,18,45,42,6},
-      {12,9,3,24,21,18},
-      {9, 12, 7, 8, 21, 24, 19, 20}, 
-      { 17, 21, 20, 5, 42, 41},
-      {2, 9, 8, 17, 21, 20},
-      {16,19,24,4,40,45},
-      {1,7,12,16,19,24}
-    };
-  HPRef_Struct refprism_1fa_2e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_2e_0v_splitedges, 
-
-      refprism_1fa_2e_0v_splitfaces, 0,
-      refprism_1fa_2e_0v_newelstypes, 
-      refprism_1fa_2e_0v_newels
-    };
-    
-//  HP_PRISM_2FA_2E_0V   
-  int refprism_2fa_2e_0v_splitedges[][3] =
-    {
-      {2,3,9},
-      {1,3,12},
-      {1,4,16}, 
-      {2,5,17},
-      {3,6,18},
-      {5,6,42},
-      {4,6,45},
-      {4,1,28},
-      {5,2,29},
-      {6,3,30},
-      {4,5,40},
-      {1,2,7},
-      { 5, 4, 41},
-      { 2, 1, 8},
-      {0,0,0}, 
-    };
-  int refprism_2fa_2e_0v_splitfaces[][4] = 
-    {
-      {2,3,5,21},
-      {1,3,4,24},
-      {1,2,4,19},
-      {4,1,6,36},
-      {4,1,5,31},
-      {5,6,2,33},
-      {5,4,2,32},
-      {2,1,5,20},
-      {0,0,0,0}, 
-    };
-
-  HPREF_ELEMENT_TYPE refprism_2fa_2e_0v_newelstypes[] =
-    {
-      HP_PRISM, 
-      HP_HEX, 
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE, 
-      
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FA_1E_0V, 
-      HP_PRISM_1FA_1E_0V, 
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FA_1E_0V, 
-      HP_PRISM_1FA_1E_0V, 
-      HP_NONE,
-      
-    };
-  int refprism_2fa_2e_0v_newels[][8] =
-    {
-      { 24, 21, 18, 36, 33, 30}, 
-      { 19, 20, 21, 24, 31, 32, 33, 36}, 
-      { 16, 19, 24, 28, 31, 36}, 
-      { 17, 21, 20, 29, 33, 32}, 
-      
-      { 12, 9, 3, 24, 21, 18}, 
-      { 7, 8, 9, 12, 19, 20, 21, 24}, 
-      { 1, 7, 12, 16, 19, 24},
-      { 2, 9, 8, 17, 21, 20}, 
-      
-      { 45, 6, 42, 36, 30, 33}, 
-      { 40, 45, 42, 41, 31, 36, 33, 32}, 
-      { 4, 45, 40, 28, 36, 31 }, 
-      { 5, 41, 42, 29, 32, 33 },
-    };
-  HPRef_Struct refprism_2fa_2e_0v =
-    {
-      HP_PRISM,
-      refprism_2fa_2e_0v_splitedges, 
-      refprism_2fa_2e_0v_splitfaces, 0,
-      refprism_2fa_2e_0v_newelstypes, 
-      refprism_2fa_2e_0v_newels
-    };
-
-
- 
-//  HP_PRISM_3E_0V   
-  int refprism_3e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0}, 
-    };
-  int refprism_3e_0v_splitfaces[][4] = 
-    {
-      {1,2,3,13},
-      {2,3,1,14},
-      {3,1,2,15},
-      {4,5,6,46},
-      {5,4,6,47},
-      {6,4,5,48},
-      {0,0,0,0}, 
-    };
-
-  HPREF_ELEMENT_TYPE refprism_3e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX,
-      HP_HEX,
-      HP_HEX,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-      HP_NONE
-    };
-  int refprism_3e_0v_newels[][8] =
-    {
-      { 13, 14, 15, 46, 47, 48}, 
-      { 7, 8, 14, 13, 40, 41, 47, 46}, 
-      { 15, 14, 9, 10, 48, 47, 42, 43}, 
-      { 12, 13, 15, 11, 45, 46, 48, 44}, 
-      { 14, 8, 9, 47, 41, 42 }, 
-      { 11, 15, 10, 44, 48, 43 }, 
-      { 7, 13, 12, 40, 46, 45}, 
-      { 1, 7, 12, 4, 40, 45}, 
-      { 2, 9, 8, 5, 42, 41 }, 
-      { 3, 11, 10, 6, 44, 43 }
-    };
-  HPRef_Struct refprism_3e_0v =
-    {
-      HP_PRISM,
-      refprism_3e_0v_splitedges, 
-      refprism_3e_0v_splitfaces, 0,
-      refprism_3e_0v_newelstypes, 
-      refprism_3e_0v_newels
-    };
-
-
-//  HP_PRISM_3E_0V   
-int refprism_1fa_3e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      
-      { 0, 0, 0}, 
-    };
-int refprism_1fa_3e_0v_splitfaces[][4] = 
-    {
-      {1,2,3,13},
-      {2,3,1,14},
-      {3,1,2,15},
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,5,6,46},
-      {5,4,6,47},
-      {6,4,5,48}, 
-      {0,0,0,0}, 
-    };
-
-int refprism_1fa_3e_0v_splitelements[][5] = 
-  {
-      {1,2,3,4,25},
-      {2,1,3,5,26},
-      {3,1,2,6,27}, 
-      {0,0,0,0,0},
-  };
-
-  HPREF_ELEMENT_TYPE refprism_1fa_3e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX,
-      HP_HEX,
-      HP_HEX,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_NONE
-    };
-int refprism_1fa_3e_0v_newels[][8] =
-    {
-      { 25, 26, 27, 46, 47, 48}, 
-      { 19, 20, 26, 25, 40, 41, 47, 46},  
-      { 27, 26, 21, 22, 48, 47, 42, 43}, 
-      { 23, 24, 25, 27, 44, 45, 46, 48}, 
-      { 19, 25, 24, 40, 46, 45}, 
-      { 26, 20, 21, 47, 41, 42},
-      { 23, 27, 22, 44, 48, 43}, 
-      { 16, 19, 24, 4, 40, 45}, 
-      { 17, 21, 20, 5, 42, 41}, 
-      { 18, 23, 22, 6, 44, 43}, 
-
-      { 13, 14, 15, 25, 26, 27}, 
-      { 7, 8, 14, 13, 19, 20, 26, 25},
-      { 15, 14, 9, 10, 27, 26, 21, 22}, 
-      { 12, 13, 15, 11, 24, 25, 27, 23}, 
-      { 14, 8, 9, 26, 20, 21}, 
-      { 11, 15, 10, 23, 27, 22}, 
-      { 7, 13 , 12, 19, 25, 24}, 
-      { 2, 9, 8, 17, 21, 20}, 
-      { 3, 11, 10, 18, 23, 22}, 
-      { 1, 7, 12, 16, 19, 24}, 
-    };
-  HPRef_Struct refprism_1fa_3e_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_3e_0v_splitedges, 
-      refprism_1fa_3e_0v_splitfaces, 
-      refprism_1fa_3e_0v_splitelements, 
-      refprism_1fa_3e_0v_newelstypes, 
-      refprism_1fa_3e_0v_newels
-    };
-
-
-
-//  HP_PRISM_2FA_3E_0V   
-int refprism_2fa_3e_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0}, 
-    };
-int refprism_2fa_3e_0v_splitfaces[][4] = 
-    {
-      {1,2,3,13},
-      {2,3,1,14},
-      {3,1,2,15},
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,1,5,31},
-      {5,4,2,32},
-      {5,6,2,33},
-      {6,5,3,34},
-      {6,4,3,35},
-      {4,1,6,36},
-      {4,5,6,46},
-      {5,4,6,47},
-      {6,4,5,48}, 
-      {0,0,0,0}, 
-    };
-
-int refprism_2fa_3e_0v_splitelements[][5] = 
-  {
-      {1,2,3,4,25},
-      {2,1,3,5,26},
-      {3,1,2,6,27}, 
-      {4,1,6,5,37},
-      {5,2,4,6,38},
-      {6,4,5,3,39}, 
-      {0,0,0,0,0},
-  };
-
-  HPREF_ELEMENT_TYPE refprism_2fa_3e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX,
-      HP_HEX,
-      HP_HEX,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-
-      HP_NONE
-    };
-
-  int refprism_2fa_3e_0v_newels[][8] =
-    {
-      { 25, 26, 27, 37, 38, 39}, 
-      { 19, 20, 26, 25, 31, 32, 38, 37},  
-      { 27, 26, 21, 22, 39, 38, 33, 34}, 
-      { 23, 24, 25, 27, 35, 36, 37, 39}, 
-      { 19, 25, 24, 31, 37, 36}, 
-      { 26, 20, 21, 38, 32, 33},
-      { 23, 27, 22, 35, 39, 34}, 
-      { 16, 19, 24, 28, 31, 36}, 
-      { 17, 21, 20, 29, 33, 32}, 
-      { 18, 23, 22, 30, 35, 34}, 
-
-      { 13, 14, 15, 25, 26, 27}, 
-      { 7, 8, 14, 13, 19, 20, 26, 25},
-      { 15, 14, 9, 10, 27, 26, 21, 22}, 
-      { 12, 13, 15, 11, 24, 25, 27, 23}, 
-      { 14, 8, 9, 26, 20, 21}, 
-      { 11, 15, 10, 23, 27, 22}, 
-      { 7, 13 , 12, 19, 25, 24}, 
-      { 2, 9, 8, 17, 21, 20}, 
-      { 3, 11, 10, 18, 23, 22}, 
-      { 1, 7, 12, 16, 19, 24}, 
-
-      { 48, 47, 46, 39, 38, 37 }, 
-      { 48, 43, 42, 47, 39, 34, 33, 38}, 
-      { 45, 44, 48, 46, 36, 35, 39, 37},
-      { 46, 47, 41, 40, 37, 38, 32, 31}, 
-      { 47, 42, 41, 38, 33, 32}, 
-      { 45, 46, 40, 36, 37, 31}, 
-      { 44, 43, 48, 35, 34, 39},
-      { 6, 43, 44, 30, 34, 35}, 
-      { 5, 41, 42, 29, 32, 33}, 
-      { 4, 45, 40, 28, 36, 31},
-    };
-
-HPRef_Struct refprism_2fa_3e_0v =
-  {
-    HP_PRISM,
-    refprism_2fa_3e_0v_splitedges, 
-    refprism_2fa_3e_0v_splitfaces, 
-    refprism_2fa_3e_0v_splitelements, 
-    refprism_2fa_3e_0v_newelstypes, 
-    refprism_2fa_3e_0v_newels
-  };
-
-
-
-//  HP_PRISM_3FB_0V   
-  int refprism_3fb_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0}, 
-    };
-  int refprism_3fb_0v_splitfaces[][4] = 
-    {
-      {1,2,3,13},
-      {2,3,1,14},
-      {3,1,2,15},
-      {4,5,6,46},
-      {5,4,6,47},
-      {6,4,5,48},
-      {0,0,0,0}, 
-    };
-
-  HPREF_ELEMENT_TYPE refprism_3fb_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V,
-      HP_HEX_1F_0E_0V,
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_NONE
-    };
-  int refprism_3fb_0v_newels[][8] =
-    {
-      { 13, 14, 15, 46, 47, 48}, 
-      { 8, 7, 40, 41, 14,13, 46, 47 }, 
-      { 10, 9, 42, 43, 15, 14, 47, 48 }, 
-      { 44, 45, 12, 11, 48, 46, 13, 15}, 
-      { 1, 7, 13, 4, 40, 46 }, 
-      { 4, 45, 46, 1, 12, 13}, 
-      { 2, 9, 14, 5, 42, 47 }, 
-      { 5, 41, 47, 2, 8, 14 }, 
-      { 3, 11, 15, 6, 44, 48}, 
-      { 6, 43, 48, 3, 10, 15},
-
-    };
-  HPRef_Struct refprism_3fb_0v =
-    {
-      HP_PRISM,
-      refprism_3fb_0v_splitedges, 
-      refprism_3fb_0v_splitfaces, 0,
-      refprism_3fb_0v_newelstypes, 
-      refprism_3fb_0v_newels
-    };
-
-
-//  HP_PRISM_3FB_0V   
-int refprism_1fa_3fb_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0}, 
-    };
-int refprism_1fa_3fb_0v_splitfaces[][4] = 
-    {
-      {1,2,3,13},
-      {2,3,1,14},
-      {3,1,2,15},
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,5,6,46},
-      {5,4,6,47},
-      {6,4,5,48}, 
-      {0,0,0,0}, 
-    };
-
-int refprism_1fa_3fb_0v_splitelements[][5] = 
-  {
-      {1,2,3,4,25},
-      {2,1,3,5,26},
-      {3,1,2,6,27}, 
-      {0,0,0,0,0},
-  };
-
-  HPREF_ELEMENT_TYPE refprism_1fa_3fb_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX_1F_0E_0V,
-      HP_HEX_1F_0E_0V,
-      HP_HEX_1F_0E_0V,
-      
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      
-      HP_NONE
-    };
-  int refprism_1fa_3fb_0v_newels[][8] =
-    {
-      { 25, 26, 27, 46, 47, 48}, 
-      { 19, 40, 41, 20, 25, 46, 47, 26}, 
-      { 22, 21, 42, 43, 27, 26, 47, 48}, 
-      { 24, 23, 44, 45, 25, 27, 48, 46},
-      
-      { 16, 19, 25, 4, 40, 46 }, 
-      { 4, 45, 46, 16, 24, 25 }, 
-      { 17, 21, 26, 5, 42, 47 }, 
-      { 5, 41, 47, 17, 20, 26}, 
-      { 18, 23, 27, 6, 44, 48}, 
-      { 6, 43, 48, 18, 22, 27},
-
-      { 13, 14, 15, 25, 26, 27}, 
-      { 7, 8, 14, 13, 19, 20, 26, 25}, 
-      { 9, 10, 15, 14, 21, 22, 27, 26},
-      { 11, 12, 13, 15, 23, 24, 25, 27},
-
-      { 2, 9, 14, 17, 21, 26}, 
-      { 8, 2, 14, 20, 17, 26}, 
-      { 1, 7, 13, 16, 19, 25}, 
-      { 12, 1, 13, 24, 16, 25 }, 
-      { 3, 11, 15, 18, 23, 27 },
-      { 10, 3, 15, 22, 18, 27}, 
-      
-      };
-  HPRef_Struct refprism_1fa_3fb_0v =
-    {
-      HP_PRISM,
-      refprism_1fa_3fb_0v_splitedges, 
-      refprism_1fa_3fb_0v_splitfaces, 
-      refprism_1fa_3fb_0v_splitelements, 
-      refprism_1fa_3fb_0v_newelstypes, 
-      refprism_1fa_3fb_0v_newels
-    };
-     
-
-
-//  HP_PRISM_2FA_3E_0V   
-int refprism_2fa_3fb_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0}, 
-    };
-int refprism_2fa_3fb_0v_splitfaces[][4] = 
-    {
-      {1,2,3,13},
-      {2,3,1,14},
-      {3,1,2,15},
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,1,5,31},
-      {5,4,2,32},
-      {5,6,2,33},
-      {6,5,3,34},
-      {6,4,3,35},
-      {4,1,6,36},
-      {4,5,6,46},
-      {5,4,6,47},
-      {6,4,5,48}, 
-      {0,0,0,0}, 
-    };
-
-int refprism_2fa_3fb_0v_splitelements[][5] = 
-  {
-      {1,2,3,4,25},
-      {2,1,3,5,26},
-      {3,1,2,6,27}, 
-      {4,1,6,5,37},
-      {5,2,4,6,38},
-      {6,4,5,3,39}, 
-      {0,0,0,0,0},
-  };
-
-  HPREF_ELEMENT_TYPE refprism_2fa_3fb_0v_newelstypes[] =
-    {
-
-      HP_PRISM,
-      HP_HEX_1F_0E_0V,
-      HP_HEX_1F_0E_0V,
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V, 
-      HP_HEX_1FA_1FB_0E_0V,
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-      HP_PRISM_1FA_1FB_1EA_0V, 
-      HP_PRISM_1FA_1FB_1EB_0V, 
-
-      HP_NONE
-    };
-  int refprism_2fa_3fb_0v_newels[][8] =
-    {
-      { 25, 26, 27, 37, 38, 39}, 
-      { 19, 31, 32, 20, 25, 37, 38, 26}, 
-      { 33, 34, 22, 21, 38, 39, 27, 26}, 
-      { 35, 36, 24, 23, 39, 37, 25, 27}, 
-
-      { 16, 19, 25, 28, 31, 37}, 
-      { 28, 36, 37, 16, 24, 25 }, 
-      { 17, 21, 26, 29, 33, 38 }, 
-      { 29, 32, 38, 17, 20, 26}, 
-      { 18, 23, 27, 30, 35, 39}, 
-      { 30, 34, 39, 18, 22, 27},
-
- 
-      { 13, 14, 15, 25, 26, 27}, 
-      { 7, 8, 14, 13, 19, 20, 26, 25}, 
-      { 9, 10, 15, 14, 21, 22, 27, 26},
-      { 11, 12, 13, 15, 23, 24, 25, 27},
-
-      { 2, 9, 14, 17, 21, 26}, 
-      { 8, 2, 14, 20, 17, 26}, 
-      { 1, 7, 13, 16, 19, 25}, 
-      { 12, 1, 13, 24, 16, 25 }, 
-      { 3, 11, 15, 18, 23, 27 },
-      { 10, 3, 15, 22, 18, 27}, 
-
-      
-      { 48, 47, 46, 39, 38, 37 }, 
-      { 44, 45, 36, 35, 48, 46, 37, 39}, 
-      { 40, 41, 32, 31, 46, 47, 38, 37}, 
-      { 42, 43, 34, 33, 47, 48, 39, 38}, 
-      
-      { 6, 43, 48, 30, 34, 39}, 
-      { 44, 6, 48, 35, 30, 39}, 
-      { 4, 45, 46, 28, 36, 37}, 
-      { 40, 4, 46, 31, 28, 37}, 
-      { 5, 41, 47, 29, 32, 38}, 
-      { 42, 5, 47, 33, 29, 38},
-    };
-
-HPRef_Struct refprism_2fa_3fb_0v =
-  {
-    HP_PRISM,
-    refprism_2fa_3fb_0v_splitedges, 
-    refprism_2fa_3fb_0v_splitfaces, 
-    refprism_2fa_3fb_0v_splitelements, 
-    refprism_2fa_3fb_0v_newelstypes, 
-    refprism_2fa_3fb_0v_newels
-  };
-
-
-/* 
-
-
-//  HP_PRISM_3E_4EH
-int refprism_3e_4eh_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0},
-
-    };
-int refprism_3e_4eh_splitfaces[][4] = 
-    {
-      {3,1,2,15},
-      {6,4,5,48}, 
-      {0,0,0,0}, 
-    };
-
-HPREF_ELEMENT_TYPE refprism_2fa_3fb_0v_newelstypes[] =
-  {
-    HP_PRISM, 
-    HP_HEX_2EH_0V,
-    HP_HEX_2EH_0V,
-    HP_TET_2E,
-    HP_TET_2E,
-    HP_PRISM_1E_2EH_0V, 
-    HP_PRISM_1E_2EH_0V, 
-    HP_NONE
-    };
-  int refprism_2fa_3fb_0v_newels[][8] =
-    {
-      {15, 7, 8, 48, 40, 41 }, 
-      
-    };
-
-HPRef_Struct refprism_2fa_3fb_0v =
-  {
-    HP_PRISM,
-    refprism_2fa_3fb_0v_splitedges, 
-    refprism_2fa_3fb_0v_splitfaces, 
-    refprism_2fa_3fb_0v_splitelements, 
-    refprism_2fa_3fb_0v_newelstypes, 
-    refprism_2fa_3fb_0v_newels
-  };
-*/ 
-
-/*
-//  HP_PRISM_2FA_3E_0V   
-int refprism_3e_4_0v_splitedges[][3] =
-    {
-      { 1, 2, 7},
-      { 2, 1, 8},
-      { 2, 3, 9},
-      { 3, 2, 10},
-      { 3, 1, 11},
-      { 1, 3, 12},
-      { 1, 4, 16}, 
-      { 2, 5, 17},
-      { 3, 6, 18},
-      { 4, 1, 28},
-      { 5, 2, 29},
-      { 6, 3, 30},
-      { 4, 5, 40},
-      { 5, 4, 41},
-      { 5, 6, 42},
-      { 6, 5, 43},
-      { 6, 4, 44},
-      { 4, 6, 45},
-      { 0, 0, 0}, 
-    };
-int refprism_2fa_3e_0v_splitfaces[][4] = 
-    {
-      {1,2,3,13},
-      {2,3,1,14},
-      {3,1,2,15},
-      {1,2,4,19},
-      {2,1,5,20},
-      {2,3,5,21},
-      {3,2,6,22},
-      {3,1,6,23},
-      {1,3,4,24},
-      {4,1,5,31},
-      {5,4,2,32},
-      {5,6,2,33},
-      {6,5,3,34},
-      {6,4,3,35},
-      {4,1,6,36},
-      {4,5,6,46},
-      {5,4,6,47},
-      {6,4,5,48}, 
-      {0,0,0,0}, 
-    };
-
-int refprism_2fa_3e_0v_splitelements[][5] = 
-  {
-      {1,2,3,4,25},
-      {2,1,3,5,26},
-      {3,1,2,6,27}, 
-      {4,1,6,5,37},
-      {5,2,4,6,38},
-      {6,4,5,3,39}, 
-      {0,0,0,0,0},
-  };
-
-  HPREF_ELEMENT_TYPE refprism_2fa_3e_0v_newelstypes[] =
-    {
-      HP_PRISM,
-      HP_HEX,
-      HP_HEX,
-      HP_HEX,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-      HP_PRISM_SINGEDGE,
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-
-      HP_PRISM_1FA_0E_0V,
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_HEX_1F_0E_0V, 
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_0E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-      HP_PRISM_1FA_1E_0V,
-
-      HP_NONE
-    };
-
-  int refprism_2fa_3e_0v_newels[][8] =
-    {
-      { 25, 26, 27, 37, 38, 39}, 
-      { 19, 20, 26, 25, 31, 32, 38, 37},  
-      { 27, 26, 21, 22, 39, 38, 33, 34}, 
-      { 23, 24, 25, 27, 35, 36, 37, 39}, 
-      { 19, 25, 24, 31, 37, 36}, 
-      { 26, 20, 21, 38, 32, 33},
-      { 23, 27, 22, 35, 39, 34}, 
-      { 16, 19, 24, 28, 31, 36}, 
-      { 17, 21, 20, 29, 33, 32}, 
-      { 18, 23, 22, 30, 35, 34}, 
-
-      { 13, 14, 15, 25, 26, 27}, 
-      { 7, 8, 14, 13, 19, 20, 26, 25},
-      { 15, 14, 9, 10, 27, 26, 21, 22}, 
-      { 12, 13, 15, 11, 24, 25, 27, 23}, 
-      { 14, 8, 9, 26, 20, 21}, 
-      { 11, 15, 10, 23, 27, 22}, 
-      { 7, 13 , 12, 19, 25, 24}, 
-      { 2, 9, 8, 17, 21, 20}, 
-      { 3, 11, 10, 18, 23, 22}, 
-      { 1, 7, 12, 16, 19, 24}, 
-
-      { 48, 47, 46, 39, 38, 37 }, 
-      { 48, 43, 42, 47, 39, 34, 33, 38}, 
-      { 45, 44, 48, 46, 36, 35, 39, 37},
-      { 46, 47, 41, 40, 37, 38, 32, 31}, 
-      { 47, 42, 41, 38, 33, 32}, 
-      { 45, 46, 40, 36, 37, 31}, 
-      { 44, 43, 48, 35, 34, 39},
-      { 6, 43, 44, 30, 34, 35}, 
-      { 5, 41, 42, 29, 32, 33}, 
-      { 4, 45, 40, 28, 36, 31},
-    };
-
-HPRef_Struct refprism_2fa_3e_0v =
-  {
-    HP_PRISM,
-    refprism_2fa_3e_0v_splitedges, 
-    refprism_2fa_3e_0v_splitfaces, 
-    refprism_2fa_3e_0v_splitelements, 
-    refprism_2fa_3e_0v_newelstypes, 
-    refprism_2fa_3e_0v_newels
-  };
-
-*/
-/*
-
-//  HP_PRISM_1FB_1EB_0V   ... quad face 1-2-4-5
-  int refprism_1fb_1eb_0v_splitedges[][3] =
-    {
-      { 1, 3, 7 },
-      { 2, 3, 8 },
-      { 4, 6, 9 },
-      { 5, 6, 10 },
-      { 2, 1, 11 },
-      { 5, 4, 12 },
-      { 0, 0, 0 }
-    };
-  HPREF_ELEMENT_TYPE refprism_1fb_1eb_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FB_1EB_0V,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_1fb_1eb_0v_newels[][8] =
-    {
-      { 1, 4, 12, 11, 7, 9, 10, 8  },
-      { 11, 2, 8, 12, 5, 10 },
-      { 7, 8, 3, 9, 10, 6 }
-    };
-  HPRef_Struct refprism_1fb_1eb_0v =
-    {
-      HP_PRISM,
-      refprism_1fb_1eb_0v_splitedges, 
-      0, 0,
-      refprism_1fb_1eb_0v_newelstypes, 
-      refprism_1fb_1eb_0v_newels
-    };
-
-
-
-
-
-
-
-
-
-
-  // HP_PRISM_2F_0E_0V
-  int refprism_2f_0e_0v_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_2f_0e_0v_splitfaces[][4] =
-    {
-      { 2, 1, 3, 11 },
-      { 5, 4, 6, 16 },
-      { 0, 0, 0, 0 },
-    };
-
-  HPREF_ELEMENT_TYPE refprism_2f_0e_0v_newelstypes[] =
-    {
-      HP_HEX_1F_0E_0V,
-      HP_HEX_1F_0E_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM_1FB_1EA_0V,
-      HP_PRISM,
-      HP_NONE,
-    };
-  int refprism_2f_0e_0v_newels[][8] =
-    {
-      //{ 1, 8, 11, 7, 4, 13, 16, 12 },
-      // { 9, 3, 10, 11, 14, 6, 15, 16 },
-      { 1, 4, 13, 8, 7, 12, 16, 11 },
-      { 9, 14, 6, 3, 11, 16, 15, 10 },
-      { 2, 9, 11, 5, 14, 16 },
-      // { 8, 2, 11, 13, 5, 16 },
-      { 5, 13, 16, 2, 8, 11 },
-      { 7, 11, 10, 12, 16, 15 }
-    };
-  HPRef_Struct refprism_2f_0e_0v =
-    {
-      HP_PRISM,
-      refprism_2f_0e_0v_splitedges, 
-      refprism_2f_0e_0v_splitfaces, 
-      0,
-      refprism_2f_0e_0v_newelstypes, 
-      refprism_2f_0e_0v_newels
-    };
-
-*/
diff --git a/contrib/Netgen/libsrc/meshing/hpref_pyramid.hpp b/contrib/Netgen/libsrc/meshing/hpref_pyramid.hpp
deleted file mode 100644
index 521daf5081e84bf11891b835a8af358cd2af5c84..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_pyramid.hpp
+++ /dev/null
@@ -1,118 +0,0 @@
-
-  // 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 }
-    };
-  HPRef_Struct refpyramid =
-    {
-      HP_PYRAMID,
-      refpyramid_splitedges, 
-      0, 0,
-      refpyramid_newelstypes, 
-      refpyramid_newels
-    };
-
-
-// singular point 1      
-  // 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
-    };
-
-
-// singular edges 1-2 1-4 singular point 1 
-  // 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
-    };
-
-
-
-// singular face 1-2-5 singular point 5
-  // 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
-    };
-
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/hpref_quad.hpp b/contrib/Netgen/libsrc/meshing/hpref_quad.hpp
deleted file mode 100644
index 2a23156d1c66e7bc1efeb637a60de8756e77946f..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_quad.hpp
+++ /dev/null
@@ -1,2082 +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 },
-};
-*/ 
-
-// SZ refine to 4 quads 
-HPREF_ELEMENT_TYPE refquad_2e_newelstypes[] =
-{
-  HP_QUAD_2E,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_NONE,
-};
-int refquad_2e_newels[][8] =
-{
-  { 1, 5, 9, 6 },
-  { 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 },
-};
-*/ 
-// SZ Quad_2e refinement 
-HPREF_ELEMENT_TYPE refquad_2e_1va_newelstypes[] =
-{
-  HP_QUAD_2E,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_QUAD,
-  HP_TRIG_SINGEDGECORNER2,
-  HP_NONE,
-};
-int refquad_2e_1va_newels[][8] =
-{
-  { 1, 5, 9, 6 },
-  { 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,
-  // SZ QUAD_2E 
-  HP_QUAD_2E,
-  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 },
-  { 1, 5, 9, 6 },
-  { 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_QUAD_2E, 
-  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 },
-  { 1, 5, 10, 6}, 
-  { 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_2VA
-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_2E,
-  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 },
-  { 1, 5, 9, 6 }, 
-  { 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_QUAD_2E, 
-  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 },
-  { 1, 5, 11, 6 }, 
-  { 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_2VC
-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_2E, 
-  HP_QUAD_SINGEDGE,
-  HP_QUAD_SINGEDGE,
-  HP_TRIG,
-  HP_QUAD,
-  HP_TRIG_SINGCORNER,
-  HP_TRIG_SINGEDGECORNER1, //SZ (vorher: 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_3V  
-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_2E, 
-  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 },
-  { 1, 5, 9, 6 }, 
-  { 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_segm.hpp b/contrib/Netgen/libsrc/meshing/hpref_segm.hpp
deleted file mode 100644
index 254458232106e82712d96084678bc4b95fc33b31..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_segm.hpp
+++ /dev/null
@@ -1,122 +0,0 @@
-  // 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
-    };
-
-
-
-
diff --git a/contrib/Netgen/libsrc/meshing/hpref_tet.hpp b/contrib/Netgen/libsrc/meshing/hpref_tet.hpp
deleted file mode 100644
index df0e2af890aec6de2c30a1821912e8ed79ca0a6b..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_tet.hpp
+++ /dev/null
@@ -1,3128 +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_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 },
-  { 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 },
-  { 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_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, 3, 4, 17 },
-    { 2, 3, 4, 18 },
-
-    { 3, 1, 4, 19 },
-    { 3, 2, 4, 20 },
-
-    { 4, 1, 3, 21 },
-    { 4, 2, 3, 22 },
-    { 0, 0, 0, 0 },
-  };
-
-HPREF_ELEMENT_TYPE reftet_1e_4v_newelstypes[] =
-{
-  HP_TET_1E_1VA,
-  HP_TET_1E_1VA,
-  //  HP_TET_1E_1VA,
-  //  HP_TET_1E_1VA,
-  HP_PRISM_SINGEDGE,
-  HP_PRISM,
-  HP_HEX, 
-  HP_HEX, 
-  HP_PRISM,
-  HP_PRISM,
-
-  HP_PYRAMID,
-  HP_TET_0E_1V,
-
-  HP_PYRAMID,
-  HP_TET_0E_1V,
-
-  HP_NONE,
-};
-
-int reftet_1e_4v_newels[][8] =
-{
-  { 1, 5, 6, 7 },
-  { 2, 8, 10, 9 },
-
-  { 5, 6, 7, 8, 9, 10 },
-  { 7, 6, 17, 10, 9, 18 },
-
-  { 7, 10, 18, 17, 14, 15, 22, 21 },
-  { 9, 6, 17, 18, 12, 11, 19, 20 },
-
-  { 17, 19, 21, 18, 20, 22 },
-  { 16, 22, 21, 13, 20, 19 },
-
-  { 14, 15, 22, 21, 16 },
-  { 4, 14, 16, 15 },
-  { 12, 11, 19, 20, 13 },
-  { 3, 11, 12, 13 },
-
-
-
-  { 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 },
-  { 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, 
-  0, 
-  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_1V,    // V1
-
-
-//  HP_TET_2EB_1V,  // 2 opposite edges, V1
-int reftet_2eb_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 }
-};
-
-HPREF_ELEMENT_TYPE reftet_2eb_1v_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_1v_newels[][8] =
-{
-  { 5, 6, 7, 2, 9, 10 },
-  { 4, 15, 14, 3, 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_1v =
-{
-  HP_TET,
-  reftet_2eb_1v_splitedges, 
-  0, 0,
-  reftet_2eb_1v_newelstypes, 
-  reftet_2eb_1v_newels
-};
-
-
-
-//  HP_TET_2EB_2VA,  // 2 opposite edges, V1,2
-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, 8, 9, 10 },
-  { 4, 15, 14, 3, 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_2VB,   // V1,3
-int reftet_2eb_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 }
-};
-
-HPREF_ELEMENT_TYPE reftet_2eb_2vb_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_2vb_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_2vb =
-{
-  HP_TET,
-  reftet_2eb_2vb_splitedges, 
-  0, 0,
-  reftet_2eb_2vb_newelstypes, 
-  reftet_2eb_2vb_newels
-};
-
-
-
-
-//  HP_TET_2EB_2VC,   // V1,4
-int reftet_2eb_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 }
-};
-
-HPREF_ELEMENT_TYPE reftet_2eb_2vc_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_2vc_newels[][8] =
-{
-  { 5, 6, 7, 2, 9, 10 },
-  { 16, 15, 14, 3, 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_2vc =
-{
-  HP_TET,
-  reftet_2eb_2vc_splitedges, 
-  0, 0,
-  reftet_2eb_2vc_newelstypes, 
-  reftet_2eb_2vc_newels
-};
-
-
-
-
-
-
-//  HP_TET_2EB_3V,    // V1,2,3
-int reftet_2eb_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 }
-};
-
-HPREF_ELEMENT_TYPE reftet_2eb_3v_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_3v_newels[][8] =
-{
-  { 5, 6, 7, 8, 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_3v =
-{
-  HP_TET,
-  reftet_2eb_3v_splitedges, 
-  0, 0,
-  reftet_2eb_3v_newelstypes, 
-  reftet_2eb_3v_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 3676ad0f33f5fdd5c1f0d9d428ec02f723155aba..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hpref_trig.hpp
+++ /dev/null
@@ -1,776 +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
-};
-
-
-// HP_TRIG_3SINGEDGES
-int reftrig_3singedges_splitedges[][3] =
-{
-  { 1, 2, 4 },
-  { 2, 1, 5 }, 
-  { 2, 3, 6 }, 
-  { 3, 2, 7 }, 
-  { 3, 1, 8 }, 
-  { 1, 3, 9 }, 
-  { 0, 0, 0 }
-};
-int reftrig_3singedges_splitfaces[][4] =
-{
-  { 1, 2, 3, 10 },
-  { 2, 3, 1, 11 },
-  { 3, 1, 2, 12 }, 
-  { 0, 0, 0, 0 }
-};
-
-HPREF_ELEMENT_TYPE reftrig_3singedges_newelstypes[] =
-{
-  HP_TRIG, 
-  HP_QUAD_SINGEDGE, 
-  HP_QUAD_SINGEDGE, 
-  HP_QUAD_SINGEDGE, 
-  HP_TRIG_SINGEDGECORNER1, 
-  HP_TRIG_SINGEDGECORNER2, 
-  HP_TRIG_SINGEDGECORNER1, 
-  HP_TRIG_SINGEDGECORNER2, 
-  HP_TRIG_SINGEDGECORNER1, 
-  HP_TRIG_SINGEDGECORNER2, 
-  HP_NONE, 
-};
-int reftrig_3singedges_newels[][8] =
-{
-  { 10, 11, 12 }, 
-  { 4, 5, 11, 10 }, 
-  { 6, 7, 12, 11 },
-  { 8, 9, 10, 12 }, 
-  { 1, 4, 10 }, 
-  { 9, 1, 10 }, 
-  { 2, 6, 11 }, 
-  { 5, 2, 11 }, 
-  { 3, 8, 12 }, 
-  { 7, 3, 12 }, 
-};
-HPRef_Struct reftrig_3singedges =
-{
-  HP_TRIG,
-  reftrig_3singedges_splitedges, 
-  reftrig_3singedges_splitfaces, 
-  0,
-  reftrig_3singedges_newelstypes, 
-  reftrig_3singedges_newels
-};
diff --git a/contrib/Netgen/libsrc/meshing/hprefinement.cpp b/contrib/Netgen/libsrc/meshing/hprefinement.cpp
deleted file mode 100644
index 0ba4238baf29e61fc5fe0462d6bed0b37523cf9a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hprefinement.cpp
+++ /dev/null
@@ -1,1955 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-#include "hprefinement.hpp" 
-
-namespace netgen
-{
-
-#include "hpref_segm.hpp"
-#include "hpref_trig.hpp"  
-#include "hpref_quad.hpp"
-#include "hpref_tet.hpp"  
-#include "hpref_prism.hpp"
-#include "hpref_hex.hpp" 
-#include "hpref_pyramid.hpp" 
-#include "classifyhpel.hpp"  
-
-
-  void HPRefElement :: Reset(void)
-  {
-    np = 8; 
-    for (int i = 0; i < 8; i++)
-      {
-	pnums[i] = -1;
-	param[i][0] = param[i][1] = param[i][2] = 0;
-        domin=-1; domout=-1; // he:
-      }
-  } 
-
-  HPRefElement :: HPRefElement () 
-  {
-    Reset();
-  }
-
-  HPRefElement :: HPRefElement(Element & el)
-  { 
-    //Reset();
-    np = el.GetNV(); 
-    for (int i=0; i<np ; i++) 
-      pnums[i] = el[i]; 
-    
-    index = el.GetIndex(); 
-    const Point3d * points = 
-      MeshTopology :: GetVertices (el.GetType());
-    for(int i=0;i<np;i++)
-      for(int l=0;l<3;l++) 
-	param[i][l] = points[i].X(l+1); 
-    type = HP_NONE; 
-    domin=-1; domout=-1; // he: needed for segments
-  }
-
-  
-  HPRefElement :: HPRefElement(Element2d & el)
-  { 
-    //Reset();
-    np = el.GetNV(); 
-    
-    for (int i=0; i<np ; i++) 
-      pnums[i] = el[i]; 
-    
-    index = el.GetIndex(); 
-    const Point3d * points = 
-      MeshTopology :: GetVertices (el.GetType());
-    for(int i=0;i<np;i++)
-      for(int l=0;l<3;l++) 
-	param[i][l] = points[i].X(l+1); 
-    type = HP_NONE; 
-    domin=-1; domout=-1; // he: needed for segments
-  }
-
-  HPRefElement :: HPRefElement(Segment & el)
-  { 
-    //Reset();
-    np = 2; 
-    for (int i=0; i<np ; i++) 
-      pnums[i] = el[i];
-    const Point3d * points = 
-      MeshTopology :: GetVertices (SEGMENT); 
-    for(int i=0;i<np;i++)
-      for(int l=0;l<3;l++) 
-        param[i][l] = points[i].X(l+1); 
-
-    /*
-    for (int i=0; i<np; i++)
-    {
-      param[i][0] = i;   
-      param[i][1] = -1; param[i][2] = -1;
-    }
-    */
-
-    singedge_left = el.singedge_left; 
-    singedge_right = el.singedge_right; 
-    type = HP_NONE; 
-    // he: needed for orientation!
-    domin = el.domin;
-    domout = el.domout;
-  }
-  
-  HPRefElement :: HPRefElement(HPRefElement & el)
-  {
-    //Reset();
-    np = el.np; 
-    for (int i=0; i<np ; i++) 
-      {
-	pnums[i] = el[i];
-	for(int l=0; l<3; l++) param[i][l] = el.param[i][l]; 
-      }
-    index = el.index; 
-    levelx = el.levelx; 
-    levely = el.levely; 
-    levelz = el.levelz; 
-    type = el.type; 
-    coarse_elnr = el.coarse_elnr; 
-    singedge_left = el.singedge_left; 
-    singedge_right = el.singedge_right; 
-    domin = el.domin; // he: needed for segments
-    domout=el.domout;
-          
-  }
-
-  void HPRefElement :: SetType( HPREF_ELEMENT_TYPE t) 
-  {
-    type = t; 
-    switch(type)
-      {
-      case HP_SEGM: np=2; break; 
-      case HP_TRIG: np=3; break; 
-      case HP_QUAD: np=4; break; 
-      case HP_TET: np=4; break; 
-      case HP_PRISM: np=6; break; 
-      case HP_PYRAMID: np=5; break; 
-      case HP_HEX: np=8; break;      
-      } 
-    for(int k=0;k<8;k++)
-      {
-	pnums[k]=0;
-	for(int l=0;l<3;l++) param[k][l]=0.;
-      }
-  }
-  
-
-  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_TRIG_3SINGEDGES:
-	hps = &reftrig_3singedges; 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_1V:
-	hps = &reftet_2eb_1v; break;
-      case HP_TET_2EB_2VA:
-	hps = &reftet_2eb_2va; break;
-      case HP_TET_2EB_2VB:
-	hps = &reftet_2eb_2vb; break;
-      case HP_TET_2EB_2VC:
-	hps = &reftet_2eb_2vc; break;
-      case HP_TET_2EB_3V:
-	hps = &reftet_2eb_3v; 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_2FA_0E_0V:
-	hps = &refprism_2fa_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_PRISM_1FA_1E_0V:
-	hps = &refprism_1fa_1e_0v; break;
-      case HP_PRISM_2FA_1E_0V:
-	hps = &refprism_2fa_1e_0v; break; 
-      case HP_PRISM_1FA_1FB_0E_0V: 
-	hps = &refprism_1fa_1fb_0e_0v; break;
-      case HP_PRISM_2FA_1FB_0E_0V: 
-	hps = &refprism_2fa_1fb_0e_0v; break; 
-      case HP_PRISM_1FA_1FB_1EA_0V: 
-	hps = &refprism_1fa_1fb_1ea_0v; break; 
-      case HP_PRISM_1FA_1FB_1EB_0V: 
-	hps = &refprism_1fa_1fb_1eb_0v; break; 
-      case HP_PRISM_2FA_1FB_1EA_0V:  
-	hps = &refprism_2fa_1fb_1ea_0v; break; 
-      case HP_PRISM_1FB_1EC_0V: 
-	hps = &refprism_1fb_1ec_0v; break; 
-      case HP_PRISM_1FA_1FB_1EC_0V: 
-	hps = &refprism_1fa_1fb_1ec_0v; break; 
-      case HP_PRISM_2FA_1FB_1EC_0V: 
-	hps = &refprism_2fa_1fb_1ec_0v; break;  
-      case HP_PRISM_1FB_2EA_0V: 
-	hps = &refprism_1fb_2ea_0v; break; 
-      case HP_PRISM_1FA_1FB_2EA_0V:   
-	hps = &refprism_1fa_1fb_2ea_0v; break; 
-      case HP_PRISM_2FA_1FB_2EA_0V:  
-	hps = &refprism_2fa_1fb_2ea_0v; break;   
-      case HP_PRISM_1FB_2EB_0V: 
-	hps = &refprism_1fb_2eb_0v; break; 
-      case HP_PRISM_1FA_1FB_2EB_0V:   
-	hps = &refprism_1fa_1fb_2eb_0v; break;  
-      case HP_PRISM_1FA_1FB_2EC_0V: 
-	hps = &refprism_1fa_1fb_2ec_0v; break; 
-      case HP_PRISM_2FA_1FB_2EB_0V: 
-	hps = &refprism_2fa_1fb_2eb_0v; break;  
-      case HP_PRISM_1FB_3E_0V: 
-	hps = &refprism_1fb_3e_0v; break; 
-      case HP_PRISM_1FA_1FB_3E_0V:  
-	hps = &refprism_1fa_1fb_3e_0v; break;  
-      case HP_PRISM_2FA_1FB_3E_0V:  
-        hps = &refprism_2fa_1fb_3e_0v; break; 
-      case HP_PRISM_2FB_0E_0V: 
-	hps = &refprism_2fb_0e_0v; break;  
-      case HP_PRISM_1FA_2FB_0E_0V: 
-	hps = &refprism_1fa_2fb_0e_0v; break; 
-      case HP_PRISM_2FA_2FB_0E_0V:    
-        hps = &refprism_2fa_2fb_0e_0v; break;  
-      case HP_PRISM_2FB_1EC_0V:  
-	hps = &refprism_2fb_1ec_0v; break;  
-      case HP_PRISM_1FA_2FB_1EC_0V: 
-        hps = &refprism_1fa_2fb_1ec_0v; break; 
-      case HP_PRISM_2FA_2FB_1EC_0V: 
-	hps = &refprism_2fa_2fb_1ec_0v; break; 
-      case HP_PRISM_1FA_2FB_1EB_0V: 
-	hps = &refprism_1fa_2fb_1eb_0v; break; 
-      case HP_PRISM_2FB_3E_0V:    
-	hps = &refprism_2fb_3e_0v; break;
-      case HP_PRISM_1FA_2FB_3E_0V: 
-	hps = &refprism_1fa_2fb_3e_0v; break;
-      case HP_PRISM_2FA_2FB_3E_0V:  
-	hps = &refprism_2fa_2fb_3e_0v; break;
-      case HP_PRISM_1FA_2E_0V:   
-	hps = &refprism_1fa_2e_0v; break; 
-      case HP_PRISM_2FA_2E_0V:  
-	hps = &refprism_2fa_2e_0v; break;   
-      case HP_PRISM_3E_0V:  
-	hps = &refprism_3e_0v; break;
-      case HP_PRISM_1FA_3E_0V:   
-	hps = &refprism_1fa_3e_0v; break; 
-      case HP_PRISM_2FA_3E_0V:  
-	hps = &refprism_2fa_3e_0v; break;   
-      case HP_PRISM_3FB_0V:  
-	hps = &refprism_3fb_0v; break;
-      case HP_PRISM_1FA_3FB_0V:   
-	hps = &refprism_1fa_3fb_0v; break; 
-      case HP_PRISM_2FA_3FB_0V:  
-	hps = &refprism_2fa_3fb_0v; break;   
-	//  case HP_PRISM_3E_4EH:
-	//  hps = &refprism_3e_4eh; break;   
-	
-	
-	/*case HP_PRISM_1FB_1EB_0V:
-	hps = &refprism_1fb_1eb_0v; break;
-      case HP_PRISM_2F_0E_0V:
-	hps = &refprism_2f_0e_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;
-      case HP_HEX_1FA_1FB_0E_0V: 
-	hps = &refhex_1fa_1fb_0e_0v; break; 
-      }
-
-    /*
-    if (type != HP_TET_1E_4V && type != HP_TET_1E_2VD)
-      {
-	if (hps->geom == HP_TET)
-	  hps = &reftet;
-	if (hps->geom == HP_TRIG)
-	  hps = &reftrig;
-      }
-    */
-
-    if (!hps)
-      {
-	cout << "Attention hps : hp-refinement not implemented for case " << type << endl;
-	PrintSysError ("hp-refinement not implemented for case ", type);
-      }
-
-    return hps;
-  }
-
-  bool CheckSingularities(Mesh & mesh, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoiclt_dom, 
-		       BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges, 
-			INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int & levels, int & act_ref); 
-
-  bool ClassifyHPElements (Mesh & mesh, ARRAY<HPRefElement> & elements, int & act_ref, int & levels);
-  
-  
-  void  InitHPElements(Mesh & mesh, ARRAY<HPRefElement> & elements) 
-  { 
-    for(ElementIndex i=0;i<mesh.GetNE();i++) 
-      {
-	HPRefElement hpel(mesh[i]); 
-	hpel.coarse_elnr=i; 
-	
-	switch (mesh[i].GetType()) 
-	  { 
-	  case PRISM:
-	    hpel.type = HP_PRISM; 
-	    break; 
-	  case HEX:
-	    hpel.type = HP_HEX; 
-	    break; 
-	  case TET: 
-	    hpel.type = HP_TET; 
-	    break; 
-	  case PYRAMID: 
-	    hpel.type = HP_PYRAMID; 
-	    break; 
-	  } 
-	elements.Append(hpel); 
-      }
-	    
-    for(SurfaceElementIndex i=0;i<mesh.GetNSE();i++)
-      {
-	HPRefElement hpel(mesh.SurfaceElement(i));
-	hpel.coarse_elnr = i; 
-	switch(mesh.SurfaceElement(i).GetType())
-	  { 
-	  case TRIG: 
-	    hpel.type = HP_TRIG;
-	    break; 
-	  case QUAD: 
-	    hpel.type = HP_QUAD; 
-	    break; 
-	  } 
-	elements.Append(hpel);
-      } 
-        
-    for(int i=1;i<=mesh.GetNSeg();i++) 
-      { 
-	Segment & seg = mesh.LineSegment(i); 
-	HPRefElement hpel(seg); 
-	hpel.coarse_elnr = i-1; 
-	hpel.type = HP_SEGM; 
-	hpel.index = seg.edgenr + 10000*seg.si; 
-	if(seg.edgenr >= 10000)
-	  {
-	    throw NgException("assumption that seg.edgenr < 10000 is wrong");
-	  }
-	elements.Append(hpel); 
-
-      }
-  }
-
- 
- 
-  /* *******************************  DoRefinement *************************************** */
-  void DoRefinement (Mesh & mesh, ARRAY<HPRefElement> & elements,
-		     Refinement * ref, double fac1) 
-  {
-    elements.SetAllocSize (5 * elements.Size());
-    INDEX_2_HASHTABLE<int> newpts(elements.Size()+1);
-    INDEX_3_HASHTABLE<int> newfacepts(elements.Size()+1);
-
-    // prepare new points  
-    
-    fac1 = max(0.001,min(0.33,fac1));
-    cout << " in HP-REFINEMENT with fac1 " << fac1 << endl; 
-    *testout << " in HP-REFINEMENT with fac1 " << fac1 <<  endl; 
-   
-
-    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))
-	      {
-		Point<3> np; 
-		for( int l=0;l<3;l++)
-		  np(l) = (1-fac1)*mesh.Point(i2.I1())(l) 
-		    + fac1 * mesh.Point(i2.I2())(l); 
-	
-		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))
-		{
-		  Point<3> np; 
-		  	for( int l=0;l<3;l++)
-			  np(l) = (1-2*fac1)*mesh.Point(i3.I1())(l) 
-			    + fac1*mesh.Point(i3.I2())(l)  + fac1*mesh.Point(i3.I3())(l);  
-		  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.levelx + 1;
-
-	int oldnp(0);
-	switch (hprs->geom)
-	  {
-	  case HP_SEGM: oldnp = 2; break;
-	  case HP_TRIG: oldnp = 3; break;
-	  case HP_QUAD: oldnp = 4; break;
-	  case HP_TET: oldnp = 4; break;
-	  case HP_PYRAMID: oldnp = 5; break;
-	  case HP_PRISM: oldnp = 6; break;
-	  case HP_HEX: oldnp = 8; break;
-	  }
-
-
-	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 || 
-	    el.type == HP_PYRAMID)
-	  newlevel = el.levelx;
-
-	if (!hprs) continue;
-
-	int newpnums[64];
-	double newparam[64][3];
-
-	int j;
-	for (j = 0; j < oldnp; 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;
-
-	    for (int l = 0; l < 3; l++)
-	      newparam[hprs->splitedges[j][2]-1][l] =
-		(1-fac1) * el.param[hprs->splitedges[j][0]-1][l] + 
-		fac1 * 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;
-	    
-
-	      for (int l = 0; l < 3; l++)
-		newparam[hprs->splitfaces[j][3]-1][l] =
-		  (1-2*fac1) * el.param[hprs->splitfaces[j][0]-1][l] + 
-		  fac1 * el.param[hprs->splitfaces[j][1]-1][l] + 
-		  fac1 * 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];
-	      Point<3> np; 
-	      	for( int l=0;l<3;l++)
-		  np(l) = (1-3*fac1)* mesh.Point(el.pnums[hprs->splitelements[j][0]-1])(l) 
-		    + fac1* mesh.Point(el.pnums[hprs->splitelements[j][1]-1])(l)
-		    + fac1* mesh.Point(el.pnums[hprs->splitelements[j][2]-1])(l)
-		    + fac1* mesh.Point(el.pnums[hprs->splitelements[j][3]-1])(l); 
-	      
-	      int npi = mesh.AddPoint (np);
-	      
-	      newpnums[hprs->splitelements[j][4]-1] = npi;
-	      
-	  	    
-	      for (int l = 0; l  < 3; l++)
-		newparam[hprs->splitelements[j][4]-1][l] =
-		  (1-3*fac1) * el.param[hprs->splitelements[j][0]-1][l] + 
-		  fac1 * el.param[hprs->splitelements[j][1]-1][l] + 
-		  fac1 * el.param[hprs->splitelements[j][2]-1][l] + 
-		  fac1 * el.param[hprs->splitelements[j][3]-1][l];
-
-	      j++;
-	    }
- 
-	j = 0;
-
-	/*
-	*testout << " newpnums = ";
-	for (int hi = 0; hi < 64; hi++)
-	  *testout << newpnums[hi] << " ";
-	*testout << endl;
-	*/
-
-	while (hprs->neweltypes[j])
-	  {
-	    HPRef_Struct * hprsnew = Get_HPRef_Struct (hprs->neweltypes[j]);
-	    HPRefElement newel(el);
-
-	    newel.type = hprs->neweltypes[j]; 
-            
-	    // newel.index = elements[i].index;
-	    // newel.coarse_elnr = elements[i].coarse_elnr;
-	    newel.levelx = newel.levely = newel.levelz = newlevel;
-            switch(hprsnew->geom) 
-	      {
-	      case HP_SEGM: newel.np=2; break; 
-	      case HP_QUAD: newel.np=4; break; 
-	      case HP_TRIG: newel.np=3; break; 
-	      case HP_HEX: newel.np=8; break; 
-	      case HP_PRISM: newel.np=6; break;
-	      case HP_TET: newel.np=4; break; 
-	      case HP_PYRAMID: newel.np=5; break; 
-	      }
-
-	    for (int k = 0; k < newel.np; k++)
-	      newel.pnums[k] = newpnums[hprs->newels[j][k]-1];
-	    
-	    /*
-	    *testout  << " newel pnums " ; 
-	    for (int k = 0; k < newel.np; k++)  
-	      *testout  << newel.pnums[k] << "\t"; 
-	    *testout << endl; 
-	    */
-
-	    for (int k = 0; k < newel.np; k++)  
-	      { 
-		for (int l = 0; l < 3; l++)
-		  { 
-		    newel.param[k][l] = newparam[hprs->newels[j][k]-1][l];
-		    //    *testout << newel.param[k][l] << " \t ";
-		  } 
-		// *testout << endl; 
-	      } 
-	    
-	    if (j == 0) 
-	      elements[i] = newel; // overwrite old element
-	    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.levelx;
-
-	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])
-	  {
-	    HPRef_Struct * hprsnew = Get_HPRef_Struct (hprs->neweltypes[j]);
-	    HPRefElement newel(el);
-	    switch(hprsnew->geom)
-	      {
-	      case HP_SEGM: newel.np=2; break; 
-	      case HP_QUAD: newel.np=4; break; 
-	      case HP_TRIG: newel.np=3; break; 
-	      case HP_HEX: newel.np=8; break; 
-	      case HP_PRISM: newel.np=6; break;
-	      case HP_TET: newel.np=4; break; 
-	      case HP_PYRAMID: newel.np=5; break; 
-	      }
-	    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.levelx = newel.levely = newel.levelz = 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, double fac1)
-  {
-    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)
-	    {
-
-               
-	      cout << " Degenerate Hex found " << endl; 
-              *testout << " Degenerate Hex found " << endl; 
-	      HPRefElement el = elements[i];
-	      HPRefElement newel = el;
-
-	      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]]); 
-		  // 0.125 originates form 8 points not from fac1;
-                  
-		  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);
-
-		    }
-		  
-		  
-		  if (pts.Size() == 3) // TrigFace -> TET 
-		    {
-		      
-		      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;
-		      newel.np = 4; 
-		    }
-		  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;
-		      newel.np = 5;
-		    }
-		  
-		  if (j == 0)
-		    elements[i] = newel;
-		  else
-		    elements.Append (newel); 
-
-		  
-		}
-
-	      /*     const ELEMENT_EDGE * edges = MeshTopology::GetEdges (HEX);
-	       
-		for(int k=0;k<12;k++) 
-		  { 
-		    int e[2];  
-		    for(int l=0;l<2;l++) e[l] = edges[k][l]-1; 
-		    if(el.PNum(e[0]+1)!=el.PNum(e[1]+1)) 
-		      { 
-			newel.SetType(HP_SEGM);
-			for(int l=0;l<2;l++) 
-			  { 
-			    newel.pnums[0] = el.PNum(e[l]+1); 
-			    newel.pnums[1] = npi; 
-			    for(int j=0;j<3;j++) 
-			      {
-				//	newel.param[0][j] = el.param[e[l]][j]; 
-				//	newel.param[1][j] = newparam[j]; 
-			      } 
-			    
-			    elements.Append(newel);
-			  }
-			newel.SetType(HP_TRIG);
-			newel.pnums[0] = el.PNum(e[0]+1); 			
-			newel.pnums[1] = el.PNum(e[1]+1); 			
-			newel.pnums[2] = npi; 
-			
-			*testout << "DEGHEX TRIG :: newpnums " << newel.pnums[0] << "\t"  << newel.pnums[1] << "\t"  << newel.pnums[2] << endl;  
-	cout << "DEGHEX TRIG :: newpnums " << newel.pnums[0] << "\t"  << newel.pnums[1] << "\t"  << newel.pnums[2] << endl;  
-			for(int j=0;j<3;j++) 
-			  {
-			    // newel.param[0][j] = el.param[e[0]][j]; 
-			    //   newel.param[1][j] = el.param[e[1]][j]; 
-			    //   newel.param[2][j] = newparam[j]; 
-			  } 
-			
-			elements.Append(newel);
-		      }
-			
-		      }*/
-	    }
-	}
-  }
-
-
-  void CalcStatistics (ARRAY<HPRefElement> & elements)
-  {
-    return;
-#ifdef ABC    
-    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;
-#endif
-  }
-
-
-
-  void ReorderPoints (Mesh & mesh, ARRAY<HPRefElement> & hpelements)
-  {
-    ARRAY<int, 1> map (mesh.GetNP());
-    
-    for (int i = 1; i <= mesh.GetNP(); i++)
-      map[i] = i;
-
-    int nwrong(0), nright(0);
-    for (int k = 0; k < 5; k++)
-      {
-        nwrong = nright = 0;
-        for (int i = 0; i < hpelements.Size(); i++)
-          {
-            const HPRefElement & hpel = hpelements[i];
-            
-            if (Get_HPRef_Struct (hpel.type) -> geom == HP_PRISM)
-              {
-                int minbot = 0, mintop = 0;
-                for (int j = 0; j < 3; j++)
-                  {
-                    if (map[hpel.pnums[j]] < map[hpel.pnums[minbot]]) minbot = j;
-                    if (map[hpel.pnums[j+3]] < map[hpel.pnums[mintop+3]]) mintop = j;
-                  }
-                if (minbot != mintop) 
-                  nwrong++;
-                else
-                  nright++;
-                
-                if (minbot != mintop)
-                  {
-                    if (map[hpel.pnums[minbot]] < map[hpel.pnums[mintop+3]])
-                      swap (map[hpel.pnums[3+minbot]], map[hpel.pnums[3+mintop]]);
-                    else
-                      swap (map[hpel.pnums[minbot]], map[hpel.pnums[mintop]]);
-                  }
-              }
-          }
-        // cout << nwrong << " wrong prisms, " << nright << " right prisms" << endl;
-      }
-
-    cout << nwrong << " wrong prisms, " << nright << " right prisms" << endl;
-
-
-    ARRAY<MeshPoint, 1> hpts(mesh.GetNP());
-
-    for (int i = 1; i <= mesh.GetNP(); i++)
-      hpts[map[i]] = mesh.Point(i);
-
-    for (int i = 1; i <= mesh.GetNP(); i++)
-      mesh.Point(i) = hpts[i];
-
-    for (int i = 0; i < hpelements.Size(); i++)
-      {
-        HPRefElement & hpel = hpelements[i];
-        for (int j = 0; j < hpel.np; j++)
-          hpel.pnums[j] = map[hpel.pnums[j]];
-      }
-  }
-
-
-
-  /* ***************************** HPRefinement ********************************** */
-
-  void HPRefinement (Mesh & mesh, Refinement * ref, int levels, double fac1, bool setorders, bool reflevels)
-  {
-    PrintMessage (1, "HP Refinement called, levels = ", levels);
-
- 
-    NgLock mem_lock (mem_mutex,1);
-
-    mesh.coarsemesh = new Mesh; 
-    *mesh.coarsemesh = mesh;
-    
-#ifdef CURVEDELEMS_NEW
-    const_cast<CurvedElements&> (mesh.coarsemesh->GetCurvedElements() ).
-      BuildCurvedElements (ref, mesh.GetCurvedElements().GetOrder());
-#endif
-
-
-    delete mesh.hpelements;
-    mesh.hpelements = new ARRAY<HPRefElement>;
-        
-    ARRAY<HPRefElement> & hpelements = *mesh.hpelements; 
-        
-    InitHPElements(mesh,hpelements); 
-    
-    ARRAY<int> nplevel;
-    nplevel.Append (mesh.GetNP());
-    
-    int act_ref=1;
-    bool sing = ClassifyHPElements(mesh,hpelements, act_ref, levels); 
-
-    sing = true; // iterate at least once
-    while(sing) 
-      {
-	cout << " Start new hp-refinement: step " <<  act_ref  << endl; 
-		
-	DoRefinement (mesh, hpelements, ref, fac1); 
-	DoRefineDummies (mesh, hpelements, ref);
-	
-	nplevel.Append (mesh.GetNP());
-	CalcStatistics (hpelements);
-	
-	SubdivideDegeneratedHexes (mesh, hpelements,fac1);
-
-        ReorderPoints (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]; // he: war hpel.param[0][0]
-                    seg.epgeominfo[1].dist = hpel.param[1][0]; // he: war hpel.param[1][0]
-                    */
-                    
-                    const Segment & coarseseg = mesh.coarsemesh->LineSegment(hpel.coarse_elnr+1);
-                    double d1 = coarseseg.epgeominfo[0].dist;
-                    double d2 = coarseseg.epgeominfo[1].dist;
-
-                    // seg.epgeominfo[0].dist = hpel.param[0][0]; // he: war hpel.param[0][0]
-                    // seg.epgeominfo[1].dist = hpel.param[1][0]; // he: war hpel.param[1][0]
-
-                    seg.epgeominfo[0].dist = d1 + hpel.param[0][0] * (d2-d1); // JS, June 08
-                    seg.epgeominfo[1].dist = d1 + hpel.param[1][0] * (d2-d1); 
-
-
-		    seg.epgeominfo[0].edgenr = seg.edgenr;
-		    seg.epgeominfo[1].edgenr = seg.edgenr;
-                    seg.domin = hpel.domin; seg.domout=hpel.domout; // he: needed for segments!
-		    seg.hp_elnr = i;
-		    seg.singedge_left = hpel.singedge_left; 
-		    seg.singedge_right = hpel.singedge_right; 
-		    mesh.AddSegment (seg); 
-		    break;
-		  }
-		  
-		case HP_TRIG: 
-		case HP_QUAD: 
-		  { 
-		    Element2d el(hpel.np); 
-		    for(int j=0;j<hpel.np;j++) 
-		      el.PNum(j+1) = hpel.pnums[j]; 
-		    el.hp_elnr = i; 
-		    el.SetIndex(hpel.index);
-		    if(setorders)
-		      el.SetOrder(act_ref+1,act_ref+1,0); 
-		    mesh.AddSurfaceElement(el);
-		    break; 
-		  } 
-		case HP_HEX:
-		case HP_TET:
-		case HP_PRISM:
-		case HP_PYRAMID:
-		  { 
-		    Element el(hpel.np); 
-		    for(int j=0;j<hpel.np;j++) 
-		      el.PNum(j+1) = hpel.pnums[j]; 
-		    el.SetIndex(hpel.index); 
-		    el.hp_elnr = i; 
-		    if(setorders)
-		      el.SetOrder(act_ref+1,act_ref+1,act_ref+1);
-		    mesh.AddVolumeElement(el); 
-		    break;
-		  } 
-		      
-		default:
-		  PrintSysError ("hpref, backconversion failed for element ", 
-				 int(Get_HPRef_Struct (hpel.type) -> geom));
-		}
-	  }
-	cout << " Start with Update Topology " << endl; 
-	mesh.UpdateTopology();
-	cout << " Mesh Update Topology done " << endl; 
-
-	act_ref++; 
-	
-	sing = ClassifyHPElements(mesh,hpelements, act_ref, levels); 
-      }
-
-    cout << " HP-Refinement done with " << --act_ref << " refinement steps." << endl; 
-
-    if(act_ref>=1)
-      { 
-	for(ElementIndex i=0;i<mesh.GetNE(); i++) 
-	  { 
-	    Element el = mesh[i] ;
-	    HPRefElement & hpel = hpelements[mesh[i].hp_elnr];
-	    const ELEMENT_EDGE * edges = MeshTopology::GetEdges (mesh[i].GetType());
-	    double dist[3] = {0,0,0}; 
-	    int ord_dir[3] = {0,0,0}; 
-	    int edge_dir[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; 
-	    int ned = 4; 
-	    
-	    switch (mesh[i].GetType())
-	      {
-	      case TET: 
-		/* cout << " TET " ; 
-		for(int k=0;k<4;k++) cout << el[k] << "\t" ; 
-		cout << endl; */ 
-		break; 
-	      case PRISM:
-		/* cout << " PRISM " ; 
-		for(int k=0;k<6;k++) cout << el[k] << "\t" ; 
-		cout << endl;  */ 
-		for(int l=6;l<9;l++) edge_dir[l] = 2; 
-		ord_dir[2] = 2; 
-		ned = 9; 
-		break; 
-	      case HEX: 
-		/* cout << " HEX " ; 
-		for(int k=0;k<8;k++) cout << el[k] << "\t" ; 
-		cout << endl; */
-		for(int l=8;l<12; l++) edge_dir[l] = 2; 
-		edge_dir[2] = edge_dir[3] = edge_dir[6] = edge_dir[7] = 1;
-		ord_dir[1] = 1; 
-		ord_dir[2] = 2; 
-		ned = 12; 
-		break;  
-	      case PYRAMID: 
-		/*	cout << " PYRAMID " ; 
-		for(int k=0;k<5;k++) cout << el[k] << "\t" ; 
-		cout << endl; */ 
-		for(int l=4;l<8;l++) edge_dir[l] = 2; 
-		edge_dir[2] = edge_dir[3] = 1; 
-		ord_dir[1] = 1; 
-		ord_dir[2] = 2; 
-		ned = 8;  
-		break; 
-	      }
-	
-	    for (int j=0;j<ned;j++) 
-	      { 
-			
-		Vec<3> v(hpel.param[edges[j][0]-1][0]-hpel.param[edges[j][1]-1][0],
-			    hpel.param[edges[j][0]-1][1]-hpel.param[edges[j][1]-1][1],
-			    hpel.param[edges[j][0]-1][2]-hpel.param[edges[j][1]-1][2]);
-		dist[edge_dir[j]] = max(v.Length(),dist[edge_dir[j]]);
-	      }
-	    
-	    int refi[3];  
-	    for(int j=0;j<3;j++) 
-	      refi[j] = int(max(double(floor(log(dist[ord_dir[j]]/sqrt(2.))/log(fac1))),0.)); 	
-	    
-	    // cout << " ref " << refi[0] << "\t" << refi[1] << "\t" << refi[2] << endl; 
-	    // cout << " order " << act_ref +1 - refi[0] << "\t" << act_ref +1 - refi[1] << "\t" << act_ref +1 - refi[2] << endl; 
-	   	      
-	    if(setorders)
-	      mesh[i].SetOrder(act_ref+1-refi[0],act_ref+1-refi[1],act_ref+1-refi[2]); 
-	  }
-	for(SurfaceElementIndex i=0;i<mesh.GetNSE(); i++) 
-	  { 
-	    Element2d el = mesh[i] ;
-	    HPRefElement & hpel = hpelements[mesh[i].hp_elnr];
-	    const ELEMENT_EDGE * edges = MeshTopology::GetEdges (mesh[i].GetType());
-	    double dist[3] = {0,0,0}; 
-	    int ord_dir[3] = {0,0,0}; 
-	    int  edge_dir[4] = {0,0,0,0} ; 
-	    int ned = 3; 
-	   
-	    if(mesh[i].GetType() == QUAD)
-	      {
-		/*	cout << " QUAD " ; 
-		for(int k=0;k<4;k++) cout << el[k] << "\t" ; 
-		cout << endl; 	*/ 
- 
-		edge_dir[2] = edge_dir[3] = 1; 
-		ord_dir[1] = 1; 
-		ned = 4; 
-	      }
-	    /*  else 
-	      { 
-		cout << " TRIG " ; 
-		for(int k=0;k<3;k++) cout << el[k] << "\t" ; 
-		cout << endl; 
-		} */ 
-	    
-	    for (int j=0;j<ned;j++) 
-	      { 
-		Vec<3> v(hpel.param[edges[j][0]-1][0]-hpel.param[edges[j][1]-1][0],
-			    hpel.param[edges[j][0]-1][1]-hpel.param[edges[j][1]-1][1],
-			    hpel.param[edges[j][0]-1][2]-hpel.param[edges[j][1]-1][2]);
-		dist[edge_dir[j]] = max(v.Length(),dist[edge_dir[j]]);
-	      }
-	    
-	    int refi[3]; 
-	    for(int j=0;j<3;j++) 
-	      refi[j] = int(max(double(floor(log(dist[ord_dir[j]]/sqrt(2.))/log(fac1))),0.)); 	
-	    
-	    if(setorders)
-	      mesh[i].SetOrder(act_ref+1-refi[0],act_ref+1-refi[1],act_ref+1-refi[2]); 
-
-	      // cout << " ref " << refi[0] << "\t" << refi[1] << endl; 
-	      // cout << " order " << act_ref +1 - refi[0] << "\t" << act_ref +1 - refi[1] << endl; 
-	  }
-      }
-  }
-
-bool CheckSingularities(Mesh & mesh, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom, 
-		       BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges, 
-			INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int & levels, int & act_ref)
-{ 
-  bool sing=0; 
-  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).Singularity() * levels >= act_ref)
-	      {
-		cornerpoint.Set(i);
-		sing = 1; 
-	      } 
-	  }
-	cout << endl; 
-
-	for (int i = 1; i <= mesh.GetNSeg(); i++)
-	  if (mesh.LineSegment(i).singedge_left * levels >= act_ref)
-	    {
-	      INDEX_2 i2 (mesh.LineSegment(i).p1, 
-			  mesh.LineSegment(i).p2);
-
-	      /*
-		// before
-	      edges.Set (i2, 1);
-	      i2.Sort();   
-	      INDEX_2 i2s(i2.I2(), i2.I1());
-	      edges.Set (i2s, 1);
-	      */
-
-	      edges.Set (i2, 1);
-	      INDEX_2 i2s(i2.I2(), i2.I1());
-	      edges.Set (i2s, 1);
-
-
-	      edgepoint.Set (i2.I1());
-	      edgepoint.Set (i2.I2());
-	      sing = 1; 
-	    }
-
-	// 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());
-	  
-	    int domnr = 0;
-	    if (fd.domin_singular * levels < act_ref && fd.domout_singular * levels < act_ref) 
-	      { domnr=0;  continue;}
-	    
-	    if (fd.domin_singular * levels >= act_ref) 
-	      {
-		domnr = fd.DomainIn();
-		sing = 1;
-	      }
-	    if (fd.domout_singular * levels >= act_ref)
-	      {
-		domnr = fd.DomainOut();
-		sing = 1; 
-	      } 
-	    if (fd.domin_singular * levels >= act_ref 
-		&& fd.domout_singular * levels >= act_ref) 
-	      {
-		domnr = -1;
-		sing = 1;
-	      } 
-  
-	    INDEX_3 i3;
-	    if (el.GetNP() == 3) 
-	      i3 = INDEX_3::Sort (el[0], el[1], el[2]);
-	    else
-	      {
-		INDEX_4 i4 (el[0], el[1], el[2], el[3]);
-		i4.Sort();
-		i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3());
-	      }
-	    faces.Set (i3, domnr);
-	
-	    for (int j = 0; j < el.GetNP(); j++)
-	      {
-		face_edges.Set (INDEX_2::Sort (el[j], el[(j+1)%el.GetNP()]), domnr);
-	
-		surf_edges.Set (INDEX_2::Sort (el[j], el[(j+1)%el.GetNP()]), fd.SurfNr()+1);
-		
-		facepoint[el[j]] = domnr;
-	      }
-	   
-	  }
-	(*testout) << "singular faces = " << faces << endl;
-	(*testout) << "singular faces_edges = " << face_edges << endl;
-      }
-    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 * levels >= act_ref)
-		  {
-		    INDEX_2 i2 (mesh.LineSegment(i).p1, 
-				mesh.LineSegment(i).p2);
-		    edges.Set(i2,1); 
-		    edgepoint.Set(i2.I1());
-		    edgepoint.Set(i2.I2());
-		    *testout << " singleft " << endl;  
-		    *testout << " mesh.LineSegment(i).domout " << mesh.LineSegment(i).domout << endl;      
-		    *testout << " mesh.LineSegment(i).domin " << mesh.LineSegment(i).domin << endl;      
-		    edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domin, i2.I1()), 1);
-		    edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domin, i2.I2()), 1);
-		    sing = 1; 
-		    
-		  }
-		
-		  if (seg.singedge_right * levels >= act_ref)
-		    {
-		      INDEX_2 i2 (mesh.LineSegment(i).p2, 
-				  mesh.LineSegment(i).p1);  
-		      edges.Set (i2, 1);
-		      edgepoint.Set(i2.I1());
-		      edgepoint.Set(i2.I2());
-
-		      *testout << " singright " << endl;  
-		      *testout << " mesh.LineSegment(i).domout " << mesh.LineSegment(i).domout << endl;      
-		      *testout << " mesh.LineSegment(i).domin " << mesh.LineSegment(i).domin << endl;      
-		      
-		      edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domout, i2.I1()), 1);
-		      edgepoint_dom.Set (INDEX_2(mesh.LineSegment(i).domout, i2.I2()), 1);
-		      sing = 1;
-		    }
-	
-	    // (*testout) << "seg = " << ind << ", " << seg.p1 << "-" << seg.p2 << endl;
-
-
-	    if (seg.singedge_left * levels >= act_ref
-		|| seg.singedge_right* levels >= act_ref)
-	      {
-		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).Singularity()*levels >= act_ref)
-	      {
-		cornerpoint.Set(i);
-		edgepoint.Set(i);
-		sing =  1; 
-	      }
-	  }
-
-	edgepoint.Or (cornerpoint);
-
-	(*testout) << "2d sing edges: " << endl << edges << endl;
-	(*testout) << "2d cornerpoints: " << endl << cornerpoint << endl
-		   << "2d edgepoints: " << endl << edgepoint << endl;
-	
-	facepoint = 0;
-      }
-
-    if (!sing)
-      {
-	cout << "PrepareElements no more to do for actual refinement " << act_ref << endl; 
-	return(sing);
-      } 
-    return(sing); 
-}
-
-
-
-  bool ClassifyHPElements (Mesh & mesh, ARRAY<HPRefElement> & elements, int & act_ref, int & levels)
-  {
-    
-    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);
-    INDEX_2_HASHTABLE<int> surf_edges(mesh.GetNSE()+1);
-    ARRAY<int, PointIndex::BASE> facepoint(mesh.GetNP());
-
-    bool sing = CheckSingularities(mesh, edges, edgepoint_dom, 
-			      cornerpoint, edgepoint, faces, face_edges, 
-			      surf_edges, facepoint, levels, act_ref); 
-  
-    if(sing==0) return(sing); 
-
-    int cnt_undef = 0, cnt_nonimplement = 0;
-    ARRAY<int> misses(10000);
-    misses = 0;
-
-    (*testout) << "edgepoint_dom = " << endl << edgepoint_dom << endl;
-
-    for( int i = 0; i<elements.Size(); i++) 
-      {
-	// *testout << "classify element " << i << endl;
-
-	HPRefElement & hpel = elements[i]; 
-	HPRef_Struct * hprs = Get_HPRef_Struct (hpel.type);
-	HPRefElement old_el = elements[i]; 
-	int dd=3; 
-
-
-	if(act_ref !=1 && (hpel.type == HP_HEX || hpel.type == HP_PRISM || hpel.type == HP_TET 
-			   || hpel.type == HP_PYRAMID || hpel.type == HP_QUAD || hpel.type == HP_TRIG || hpel.type == HP_SEGM)) 
-	  continue; 
-	
-	sing = 1; 
-	switch (hprs->geom)
-	  {
-	  case HP_TET:
-	    {
-	      hpel.type = ClassifyTet(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, faces,face_edges, surf_edges, facepoint); 
-	      break;
-	    }
-	  case HP_PRISM:
-	    {
-	      hpel.type = ClassifyPrism(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, faces,
-					face_edges, surf_edges, facepoint); 	    	    
-	 
-	    
-	      break;
-	    }
-	  case HP_HEX:
-	    { 
-	      hpel.type = hpel.type = ClassifyHex(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, faces,
-						  face_edges, surf_edges, facepoint); 	    	    
-	      break; 
-	    } 
-	  case HP_TRIG: 
-	    { 
-	      int dim = mesh.GetDimension(); 
-	      const FaceDescriptor & fd = mesh.GetFaceDescriptor (hpel.GetIndex());	
-	      
-	      hpel.type = ClassifyTrig(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, 
-				       faces, face_edges, surf_edges, facepoint, dim, fd);    
-	     
-	      dd = 2; 
-	      break; 
-	    } 
-	  case HP_QUAD: 
-	    { 
-	      int dim = mesh.GetDimension(); 
-	      const FaceDescriptor & fd = mesh.GetFaceDescriptor (hpel.GetIndex());	
-	      hpel.type = ClassifyQuad(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, 
-				  faces, face_edges, surf_edges, facepoint, dim, fd);    
-
-	      dd = 2; 
-	      break; 
-	    }
-	  case HP_SEGM: 
-	    {
-	      hpel.type = ClassifySegm(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, 
-				       faces, face_edges, surf_edges, facepoint);    
-	      dd = 1; 
-	      break; 
-	    }
-	  case HP_PYRAMID: 
-	    {
-	      hpel.type = ClassifyPyramid(hpel, edges, edgepoint_dom, cornerpoint, edgepoint, faces,
-						  face_edges, surf_edges, facepoint); 	    	    
-	      
-	      cout << " ** Pyramid classified  " << hpel.type << endl; 
-	      break; 
-	    }
-	  default:
-	    {
-	      cout << "illegal element type for hp-prepare elements " << hpel.type << endl;
-	      throw NgException ("hprefinement.cpp: don't know how to set parameters");
-	    }
-	  }
-	    
-	if(hpel.type == HP_NONE) 
-	  cnt_undef++; 
-
-	//else 
-	//cout << "elem " << i << " classified type " << hpel.type << endl; 
-
-	
-	
-	if (!Get_HPRef_Struct (hpel.type)) 
-	  {
-	    (*testout) << "hp-element-type " << hpel.type << " not implemented   " << endl;
-	    (*testout) << " elType " << hprs->geom << endl; 
- (cout) << " elType " << hprs->geom << endl;        
-	    cnt_nonimplement++;
-	    misses[hpel.type]++;
-	  }
-	
-  
-	for(int j=0; j<hpel.np; j++)
-	  {
-	    for( int k=0; k<hpel.np; k++) 
-	      if(hpel[j] == old_el.pnums[k]) 
-		{ 
-		  for(int l=0;l<dd;l++) 
-		    hpel.param[j][l] = old_el.param[k][l];
-		  break;
-		}
-	  } 
-
-      }
-    
-    
-    cout << "undefined elements update classification: " << cnt_undef << endl;
-    cout << "non-implemented in update classification: " << cnt_nonimplement << endl;
-
-    for (int i = 0; i < misses.Size(); i++)
-      if (misses[i])
-	cout << " in update classification missing case " << i << " occured " << misses[i] << " times" << endl;
-
-    return(sing); 
-  }
-}
-  
diff --git a/contrib/Netgen/libsrc/meshing/hprefinement.hpp b/contrib/Netgen/libsrc/meshing/hprefinement.hpp
deleted file mode 100644
index 05e4d7278085f4d9ac6dfddb21360823885b9a25..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/hprefinement.hpp
+++ /dev/null
@@ -1,319 +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_2FA_0E_0V,     // 2 singular trig faces
-  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_PRISM_1FA_1E_0V, 
-  HP_PRISM_2FA_1E_0V, 
-  HP_PRISM_1FA_1FB_0E_0V, 
-  HP_PRISM_2FA_1FB_0E_0V,
-  HP_PRISM_1FA_1FB_1EA_0V, 
-  HP_PRISM_1FA_1FB_1EB_0V, 
-  HP_PRISM_2FA_1FB_1EA_0V,
-  HP_PRISM_1FB_1EC_0V, 
-  HP_PRISM_1FA_1FB_1EC_0V, 
-  HP_PRISM_2FA_1FB_1EC_0V,
-  HP_PRISM_1FB_2EA_0V, 
-  HP_PRISM_1FA_1FB_2EA_0V, 
-  HP_PRISM_2FA_1FB_2EA_0V,
-  HP_PRISM_1FB_2EB_0V,
-  HP_PRISM_1FA_1FB_2EB_0V,  
-  HP_PRISM_1FA_1FB_2EC_0V, 
-  HP_PRISM_2FA_1FB_2EB_0V, 
-  HP_PRISM_1FB_3E_0V, 
-  HP_PRISM_1FA_1FB_3E_0V, 
-  HP_PRISM_2FA_1FB_3E_0V, 
-  HP_PRISM_2FB_0E_0V, 
-  HP_PRISM_1FA_2FB_0E_0V, 
-  HP_PRISM_2FA_2FB_0E_0V,
-  HP_PRISM_2FB_1EC_0V, 
-  HP_PRISM_1FA_2FB_1EC_0V,
-  HP_PRISM_1FA_2FB_1EB_0V,
-  HP_PRISM_2FA_2FB_1EC_0V,
-  HP_PRISM_2FB_3E_0V, 
-  HP_PRISM_1FA_2FB_3E_0V, 
-  HP_PRISM_2FA_2FB_3E_0V, 
-  HP_PRISM_1FA_2E_0V, 
-  HP_PRISM_2FA_2E_0V,
-  HP_PRISM_3E_0V, 
-  HP_PRISM_1FA_3E_0V, 
-  HP_PRISM_2FA_3E_0V,  
-  HP_PRISM_3FB_0V, 
-  HP_PRISM_1FA_3FB_0V, 
-  HP_PRISM_2FA_3FB_0V,  
-  HP_PRISM_3E_4EH,
-  
- 
-
-  /*  HP_PRISM_1FB_1EA_0V,     // 1 singular quad face, edge is 1-4
-  HP_PRISM_1FB_1EB_0V,     // 1 singular quad face, edge is 2-5
-  HP_PRISM_2F_0E_0V,      // 2 singular quad faces
-  */
-
-  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,
-  HP_HEX_1FA_1FB_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
-{
-private:
-  void Reset(void);
-
-public:
-  HPRefElement (); 
-  HPRefElement(Element & el);
-  HPRefElement(Element2d & el);
-  HPRefElement(Segment & el);	
-  HPRefElement(HPRefElement & el);
-
-  void SetType( HPREF_ELEMENT_TYPE t);
-  // HPRefElement(HPRefElement & el, HPREF_ELEMENT_TYPE t); 
-	       
-  /* HPRefElement(HPRefElement & el, HPREF_ELEMENT_TYPE t)
-  { 
-    type = t; 
-    HPRef_Struct * hprs = Get_HPRef_Struct(t);
-    for (int i=0; i<np ; i++) 
-      {
-	pnums[i] = el[i];
-	for(int l=0; l<np; l++) param[i][l] = el.param[i][l]; 
-      }
-    switch(hprs->geom)
-      {
-      case HP_SEGM: np=2; sing_edge_left=0; sing_edge_right=0; break; 
-      case HP_QUAD: np=4; break; 
-      case HP_TRIG: np=3; break; 
-      case HP_HEX: np=8; break; 
-      case HP_PRISM: np=6; break;
-      case HP_TET: np=4; break; 
-      case HP_PYRAMID: np=5; break; 
-      }
-    index = el.index; 
-    levelx = el.levelx; 
-    levely = el.levely; 
-    levelz = el.levelz; 
-    type = el.type; 
-    coarse_elnr = el.coarse_elnr;
-    singedge_left = el.singedge_left; 
-    singedge_right = el.singedge_left; 
-    } */ 
-  
-  HPREF_ELEMENT_TYPE type;
-  PointIndex pnums[8];
-  double param[8][3];
-  int index;
-  int levelx;
-  int levely;
-  int levelz;
-  int np; 
-  int coarse_elnr;
-  int domin, domout; // he: needed for segment!! in 3d there should be surf1, surf2!!
-  // int coarse_hpelnr; 
-  PointIndex & operator[](int i) { return(pnums[i]);}
-  PointIndex & PNumMod(int i) { return pnums[(i-1) % np]; };
-  PointIndex & PNum(int i) {return pnums[(i-1)]; };
-  int GetIndex () const { return index; }; 
-  double singedge_left, singedge_right; 
-  
-
-  //  EdgePointGeomInfo epgeominfo[2];
-  
-};
-
-
-
-extern void HPRefinement (Mesh & mesh, Refinement * ref, int levels, 
-			  double fac1=0.125, bool setorders=true, bool ref_level = false);
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/meshing/improve2.cpp b/contrib/Netgen/libsrc/meshing/improve2.cpp
deleted file mode 100644
index 4824d4eb31335a0161223dc5d78ae00c170b38f5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve2.cpp
+++ /dev/null
@@ -1,831 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#include <opti.hpp>
-
-#ifndef SMALLLIB
-//#ifndef NOTCL
-//#include <visual.hpp>
-//#endif
-#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;
-    }
-
-
-  static int timer = NgProfiler::CreateTimer ("EdgeSwapping 2D");
-  NgProfiler::RegionTimer reg1 (timer);
-
-
-  int i, i2, j, 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(-1);
-  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[sel[j]].Type();
-	  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[pi].Type() == INNERPOINT || mesh[pi].Type() == 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);
-	    
-	      bool allowswap = true;
-
-	      Vec3d auxvec1,auxvec2;
-
-	      auxvec1 = mesh.Point(pi3)-mesh.Point(pi4);
-	      auxvec2 = mesh.Point(pi1)-mesh.Point(pi4);
-	      allowswap = allowswap && fabs(1.-(auxvec1*auxvec2)/(auxvec1.Length()*auxvec2.Length())) > 1e-4;
-
-	      if(!allowswap)
-		continue;
-
-	      // normal of new
-	      nv1 = Cross (auxvec1, 
-			   auxvec2);
-
-	      auxvec1 = mesh.Point(pi4)-mesh.Point(pi3);
-	      auxvec2 = mesh.Point(pi2)-mesh.Point(pi3);
-	      allowswap = allowswap && fabs(1.-(auxvec1*auxvec2)/(auxvec1.Length()*auxvec2.Length())) > 1e-4;
-
-
-	      if(!allowswap)
-		continue;
-
-	      nv2 = Cross (auxvec1, 
-			   auxvec2);
-
-	      
-	      // normals of original
-	      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();
-	    
-	      Vec<3> 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
-	      allowswap = 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;
-    }
-
-
-  static int timer = NgProfiler::CreateTimer ("Combineimprove 2D");
-  NgProfiler::RegionTimer reg (timer);
-
-
-
-  int i, j, k, l;
-  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();
-
-
-  PointIndex pi1, pi2;
-  MeshPoint p1, p2, pnew;
-  double bad1, bad2;
-  Vec<3> 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<bool,PointIndex::BASE> fixed(np);
-  fixed = false;
-
-  SegmentIndex si;
-  for (si = 0; si < mesh.GetNSeg(); si++)
-    {
-      INDEX_2 i2(mesh[si].p1, mesh[si].p2);
-      fixed[i2.I1()] = true;
-      fixed[i2.I2()] = true;
-    }
-
-  for(i = 0; i<mesh.LockedPoints().Size(); i++)
-    fixed[mesh.LockedPoints()[i]] = true;
-
-
-  ARRAY<Vec<3>,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;
-
-	      Vec<3> 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(NULL);
-	      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]] = true;
-		    }
-		}
-
-	      /*
-	      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 4f25863d40857b5600af1bd2cb24bac3273785c5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve2.hpp
+++ /dev/null
@@ -1,102 +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 ImproveVolumeMesh (Mesh & mesh);
-  void ProjectBoundaryPoints(ARRAY<int> & surfaceindex, 
-			     const ARRAY<Point<3>* > & from, ARRAY<Point<3>* > & dest);
-
-  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 Point<3> & p,
-				     const PointGeomInfo & gi);
-  ///
-  virtual void ProjectPoint (INDEX /* surfind */, Point<3> & /* p */) const { };
-
-  /// project point, use gi as initial value, and compute new gi
-  virtual int ProjectPointGI (INDEX surfind, Point<3> & p, PointGeomInfo & gi) const 
-  { ProjectPoint (surfind, p); return CalcPointGeomInfo (surfind, gi, p); }
-
-  ///
-  virtual void ProjectPoint2 (INDEX /* surfind */, INDEX /* surfind2 */, Point<3> & /* 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 Point<3> & /*p3*/) const
-    { gi.trignum = 1; return 1;};
-
-  virtual int CalcPointGeomInfo(int /* surfind */, PointGeomInfo& gi, const Point<3> & p3) const
-    { return CalcPointGeomInfo (gi, p3); }
-
-  ///
-  virtual void GetNormalVector(INDEX surfind, const Point<3>  & p, PointGeomInfo & gi, Vec<3> & n) const;
-  virtual void GetNormalVector(INDEX surfind, const Point<3> & p, Vec<3> & 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 75ffc80183a18b9981f95c662ac7d5563391ff88..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve2gen.cpp
+++ /dev/null
@@ -1,455 +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;
-
-    
-//     for (SurfaceElementIndex sei = 0; sei < ne; sei++)
-//       {
-// 	const Element2d & el = mesh[sei];
-// 	(*testout) << "element " << sei << ": " <<flush;
-// 	for(int j=0; j<el.GetNP(); j++)
-// 	  (*testout) << el[j] << " " << flush;
-// 	(*testout) << "IsDeleted() " << el.IsDeleted()<< endl;
-//       }
-
-    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);
-	  }
-	if(!el.IsDeleted())
-	  {
-	    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];
-		    bool inuse = false;
-		    for (int l = 0; l < nbels[sei].Size(); l++)
-		      if (nbels[sei][l] == nbel)
-			inuse = true;
-		    if (!inuse)
-		      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;
-		Vec<3> 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 c2db1e8b49b14cca4304ab58da2193926eae6df2..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve3.cpp
+++ /dev/null
@@ -1,2820 +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 ();
-  const 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;
-      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();
-
-  const 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 (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,
-				    const BitArray * working_elements)
-{
-  int j, k, l;
-
-  ElementIndex ei;
-  SurfaceElementIndex sei;
-
-  PointIndex pi1(0), pi2(0), pi3(0), pi4(0), pi5(0), pi6(0);
-  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;
-
-  const 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(working_elements && 
-	 ei < working_elements->Size() &&
-	 !working_elements->Test(ei))
-	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 & elemk = mesh[hasbothpoints[k]];
-		  bool has1 = 0;
-		  for (l = 0; l < 4; l++)
-		    if (elemk[l] == pi4)
-		      has1 = 1;
-		  if (has1)
-		    {
-		      for (l = 0; l < 4; l++)
-			if (elemk[l] != pi1 && elemk[l] != pi2 && elemk[l] != pi4)
-			  pi5 = elemk[l];
-		    }
-		}
-
-	      if(pi5 == 0)
-                throw NgException("Illegal state observed in SwapImprove");
-
-
-	      
-	      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;
-			    }			
-		      }
-		}
-
-	      
-	      bad1 = 0;
-	      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;
-}
-  
-
-
-
-
-
-void MeshOptimize3d :: SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal,
-					   const BitArray * working_elements,
-					   const ARRAY< ARRAY<int,PointIndex::BASE>* > * idmaps)
-{
-  ARRAY< ARRAY<int,PointIndex::BASE>* > locidmaps;
-  const ARRAY< ARRAY<int,PointIndex::BASE>* > * used_idmaps;
-
-  if(idmaps)
-    used_idmaps = idmaps;
-  else
-    {
-      used_idmaps = &locidmaps;
-      
-      for(int i=1; i<=mesh.GetIdentifications().GetMaxNr(); i++)
-	{
-	  if(mesh.GetIdentifications().GetType(i) == Identifications::PERIODIC)
-	    {
-	      locidmaps.Append(new ARRAY<int,PointIndex::BASE>);
-	      mesh.GetIdentifications().GetMap(i,*locidmaps.Last(),true);
-	    }
-	}
-    }
-
-  ElementIndex ei;
-  SurfaceElementIndex sei;
-
-  PointIndex pi1, pi2, pi3, pi4, pi5, pi6;
-  PointIndex pi1other, pi2other;
-  int cnt = 0;
-
-  //double bad1, bad2, bad3, sbad;
-  double bad1, sbad;
-  double h;
-
-  int np = mesh.GetNP();
-  int ne = mesh.GetNE();
-  int nse = mesh.GetNSE();
-
-  int mattype, othermattype;
-
-  
-  // contains at least all elements at node
-  TABLE<ElementIndex,PointIndex::BASE> elementsonnode(np);
-  TABLE<SurfaceElementIndex,PointIndex::BASE> surfaceelementsonnode(np);
-  TABLE<int,PointIndex::BASE> surfaceindicesonnode(np);
-
-  ARRAY<ElementIndex> hasbothpoints;
-  ARRAY<ElementIndex> hasbothpointsother;
-
-  PrintMessage (3, "SwapImproveSurface ");
-  (*testout) << "\n" << "Start SwapImproveSurface" << endl;
-
-  const char * savetask = multithread.task;
-  multithread.task = "Swap Improve Surface";
-    
-      
-  
-  // find elements on node
-  for (ei = 0; ei < ne; ei++)
-    for (int j = 0; j < mesh[ei].GetNP(); j++)
-      elementsonnode.Add (mesh[ei][j], ei);
-
-  for (sei = 0; sei < nse; sei++)
-    for(int j=0; j<mesh[sei].GetNP(); j++)
-      {
-	surfaceelementsonnode.Add(mesh[sei][j], sei);
-	if(!surfaceindicesonnode[mesh[sei][j]].Contains(mesh[sei].GetIndex()))
-	  surfaceindicesonnode.Add(mesh[sei][j],mesh[sei].GetIndex());
-      }
-
-  bool periodic;
-  int idnum(-1);
-
-  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(working_elements && 
-	 ei < working_elements->Size() &&
-	 !working_elements->Test(ei))
-	continue;
-
-      if (mesh[ei].IsDeleted())
-	continue;
-
-      if ((goal == OPT_LEGAL) && 
-	  mesh.LegalTet (mesh[ei]) &&
-	  CalcBad (mesh.Points(), mesh[ei], 0) < 1e3)
-	continue;
-
-      const Element & elemi = mesh[ei];
-      //Element elemi = mesh[ei];
-      if (elemi.IsDeleted()) continue;
-
-
-      mattype = elemi.GetIndex();
-
-      bool swapped = false;
-
-      for (int j = 0; !swapped && j < 6; j++)
-	{
-	  // loop over edges
-
-	  
-	  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);
-	    	  
-	  
-	  bool found = false;
-	  for(int k=0; !found && k<used_idmaps->Size(); k++)
-	    {
-	      if(pi2 < (*used_idmaps)[k]->Size() + PointIndex::BASE)
-		{
-		  pi1other = (*(*used_idmaps)[k])[pi1];
-		  pi2other = (*(*used_idmaps)[k])[pi2];
-		  found = (pi1other != 0 && pi2other != 0 && pi1other != pi1 && pi2other != pi2);
-		  if(found)
-		    idnum = k;
-		}
-	    }
-	  if(found)
-	    periodic = true;
-	  else
-	    {
-	      periodic = false;
-	      pi1other = pi1; pi2other = pi2;
-	    }
-
-
-	 	  
-	  if (!mesh.BoundaryEdge (pi1, pi2) ||
-	      mesh.IsSegment(pi1, pi2)) continue;
-
-	  othermattype = -1;
-
-	  
-	  INDEX_2 i2 (pi1, pi2);
-	  i2.Sort();
-	  if (edgeused.Used(i2)) continue;
-	  edgeused.Set (i2, 1);
-	  if(periodic)
-	    {
-	      i2.I1() = pi1other;
-	      i2.I2() = pi2other;
-	      i2.Sort();
-	      edgeused.Set(i2,1);
-	    }
-	  
-	  
-	  hasbothpoints.SetSize (0);
-	  hasbothpointsother.SetSize (0);
-	  for (int k = 0; k < elementsonnode[pi1].Size(); k++)
-	    {
-	      bool has1 = false, has2 = false;
-	      ElementIndex elnr = elementsonnode[pi1][k];
-	      const Element & elem = mesh[elnr];
-	      
-	      if (elem.IsDeleted()) continue;
-	      
-	      for (int l = 0; l < elem.GetNP(); l++)
-		{
-		  if (elem[l] == pi1) has1 = true;
-		  if (elem[l] == pi2) has2 = true;
-		}
-
-	      if (has1 && has2) 
-		{ 
-		  if(othermattype == -1 && elem.GetIndex() != mattype)
-		    othermattype = elem.GetIndex();
-
-		  if(elem.GetIndex() == mattype)
-		    {
-		      // only once
-		      for (int l = 0; l < hasbothpoints.Size(); l++)
-			if (hasbothpoints[l] == elnr)
-			  has1 = 0;
-		      
-		      if (has1)
-			hasbothpoints.Append (elnr);
-		    }
-		  else if(elem.GetIndex() == othermattype)
-		    {
-		      // only once
-		      for (int l = 0; l < hasbothpointsother.Size(); l++)
-			if (hasbothpointsother[l] == elnr)
-			  has1 = 0;
-		      
-		      if (has1)
-			hasbothpointsother.Append (elnr);
-		    }
-		  else
-		    {
-		      cout << "problem with domain indices" << endl;
-		      (*testout) << "problem: mattype = " << mattype << ", othermattype = " << othermattype 
-				 << " elem " << elem << " mt " << elem.GetIndex() << endl
-				 << " pi1 " << pi1 << " pi2 " << pi2 << endl;
-		      (*testout) << "hasbothpoints:" << endl;
-		      for(int ii=0; ii < hasbothpoints.Size(); ii++)
-			(*testout) << mesh[hasbothpoints[ii]] << endl;
-		      (*testout) << "hasbothpointsother:" << endl;
-		      for(int ii=0; ii < hasbothpointsother.Size(); ii++)
-			(*testout) << mesh[hasbothpointsother[ii]] << endl;
-		    }
-		}
-	    }
-
-	  if(hasbothpointsother.Size() > 0 && periodic)
-	    throw NgException("SwapImproveSurface: Assumption about interface/periodicity wrong!");
-
-	  if(periodic)
-	    {
-	      for (int k = 0; k < elementsonnode[pi1other].Size(); k++)
-		{
-		  bool has1 = false, has2 = false;
-		  ElementIndex elnr = elementsonnode[pi1other][k];
-		  const Element & elem = mesh[elnr];
-	      
-		  if (elem.IsDeleted()) continue;
-	      
-		  for (int l = 0; l < elem.GetNP(); l++)
-		    {
-		      if (elem[l] == pi1other) has1 = true;
-		      if (elem[l] == pi2other) has2 = true;
-		    }
-		  
-		  if (has1 && has2) 
-		    { 
-		      if(othermattype == -1)
-			othermattype = elem.GetIndex();
-
-		      // only once
-		      for (int l = 0; l < hasbothpointsother.Size(); l++)
-			if (hasbothpointsother[l] == elnr)
-			  has1 = 0;
-		      
-		      if (has1)
-			hasbothpointsother.Append (elnr);
-		    }
-		}
-	    }
-
-
-	  //for(k=0; k<hasbothpoints.Size(); k++)
-	  //  (*testout) << "hasbothpoints["<<k<<"]: " << mesh[hasbothpoints[k]] << endl;
-
-	  
-	  SurfaceElementIndex sel1=-1,sel2=-1;
-	  SurfaceElementIndex sel1other=-1,sel2other=-1;
-	  for(int k = 0; k < surfaceelementsonnode[pi1].Size(); k++)
-	    {
-	      bool has1 = false, has2 = false;
-	      SurfaceElementIndex elnr = surfaceelementsonnode[pi1][k];
-	      const Element2d & elem = mesh[elnr];
-
-	      if (elem.IsDeleted()) continue;
-
-	      for (int l = 0; l < elem.GetNP(); l++)
-		{
-		  if (elem[l] == pi1) has1 = true;
-		  if (elem[l] == pi2) has2 = true;
-		}
-
-	      if(has1 && has2 && elnr != sel2)
-		{
-		  sel1 = sel2;
-		  sel2 = elnr;
-		}
-	    }
-
-	  if(periodic)
-	    {
-	      for(int k = 0; k < surfaceelementsonnode[pi1other].Size(); k++)
-		{
-		  bool has1 = false, has2 = false;
-		  SurfaceElementIndex elnr = surfaceelementsonnode[pi1other][k];
-		  const Element2d & elem = mesh[elnr];
-
-		  if (elem.IsDeleted()) continue;
-
-		  for (int l = 0; l < elem.GetNP(); l++)
-		    {
-		      if (elem[l] == pi1other) has1 = true;
-		      if (elem[l] == pi2other) has2 = true;
-		    }
-
-		  if(has1 && has2 && elnr != sel2other)
-		    {
-		      sel1other = sel2other;
-		      sel2other = elnr;
-		    }
-		}
-	    }
-	  else
-	    {
-	      sel1other = sel1; sel2other = sel2;
-	    }
-
-	  //(*testout) << "sel1 " << sel1 << " sel2 " << sel2 << " el " << mesh[sel1] << " resp. " << mesh[sel2] << endl;
-
-	  PointIndex sp1(0), sp2(0);
-	  PointIndex sp1other, sp2other;
-	  for(int l=0; l<mesh[sel1].GetNP(); l++)
-	    if(mesh[sel1][l] != pi1 && mesh[sel1][l] != pi2)
-	      sp1 = mesh[sel1][l];
-	  for(int l=0; l<mesh[sel2].GetNP(); l++)
-	    if(mesh[sel2][l] != pi1 && mesh[sel2][l] != pi2)
-	      sp2 = mesh[sel2][l];
-
-	  if(periodic)
-	    {
-	      sp1other = (*(*used_idmaps)[idnum])[sp1];
-	      sp2other = (*(*used_idmaps)[idnum])[sp2];
-
-	      bool change = false;
-	      for(int l=0; !change && l<mesh[sel1other].GetNP(); l++)
-		change = (sp2other == mesh[sel1other][l]);
-	      
-	      if(change)
-		{
-		  SurfaceElementIndex aux = sel1other;
-		  sel1other = sel2other;
-		  sel2other = aux;
-		}
-
-	    }
-	  else
-	    {
-	      sp1other = sp1; sp2other = sp2;
-	    }
-	  
-	  Vec<3> v1 = mesh[sp1]-mesh[pi1],
-	    v2 = mesh[sp2]-mesh[pi1],
-	    v3 = mesh[sp1]-mesh[pi2],
-	    v4 = mesh[sp2]-mesh[pi2];
-	  double vol = 0.5*(Cross(v1,v2).Length() + Cross(v3,v4).Length());
-	  h = sqrt(vol);
-	  h = 0;
-
-	  sbad = CalcTriangleBadness (mesh[pi1],mesh[pi2],mesh[sp1],0,0) + 
-	    CalcTriangleBadness (mesh[pi2],mesh[pi1],mesh[sp2],0,0);
-	  
-
-
-	  bool puretet = true;
-	  for (int k = 0; puretet && k < hasbothpoints.Size(); k++)
-	    if (mesh[hasbothpoints[k]].GetType () != TET)
-	      puretet = false;
-	  for (int k = 0; puretet && k < hasbothpointsother.Size(); k++)
-	    if (mesh[hasbothpointsother[k]].GetType () != TET)
-	      puretet = false;
-	  if (!puretet)
-	    continue;
-
-	  int nsuround = hasbothpoints.Size();
-	  int nsuroundother = hasbothpointsother.Size();
-
-	  ARRAY < int > outerpoints(nsuround+1);
-	  outerpoints[0] = sp1;
-
-	  for(int i=0; i<nsuround; i++)
-	    {
-	      bool done = false;
-	      for(int jj=i; !done && jj<hasbothpoints.Size(); jj++)
-		{
-		  for(int k=0; !done && k<4; k++)
-		    if(mesh[hasbothpoints[jj]][k] == outerpoints[i])
-		      {
-			done = true;
-			for(int l=0; l<4; l++)
-			  if(mesh[hasbothpoints[jj]][l] != pi1 &&
-			     mesh[hasbothpoints[jj]][l] != pi2 &&
-			     mesh[hasbothpoints[jj]][l] != outerpoints[i])
-			    outerpoints[i+1] = mesh[hasbothpoints[jj]][l];
-		      }
-		  if(done)
-		    {
-		      ElementIndex aux = hasbothpoints[i];
-		      hasbothpoints[i] = hasbothpoints[jj];
-		      hasbothpoints[jj] = aux;
-		    }
-		}
-	    }
-	  if(outerpoints[nsuround] != sp2)
-	    {
-	      cerr << "OJE OJE OJE" << endl;
-	      (*testout) << "OJE OJE OJE" << endl;
-	      (*testout) << "hasbothpoints: " << endl;
-	      for(int ii=0; ii < hasbothpoints.Size(); ii++)
-		{
-		  (*testout) << mesh[hasbothpoints[ii]] << endl;
-		  for(int jj=0; jj<mesh[hasbothpoints[ii]].GetNP(); jj++)
-		    if(mesh.mlbetweennodes[mesh[hasbothpoints[ii]][jj]][0] > 0)
-		      (*testout) << mesh[hasbothpoints[ii]][jj] << " between "
-				 << mesh.mlbetweennodes[mesh[hasbothpoints[ii]][jj]][0] << " and "
-				 << mesh.mlbetweennodes[mesh[hasbothpoints[ii]][jj]][1] << endl;
-		}
-	      (*testout) << "outerpoints: " << outerpoints << endl;
-	      (*testout) << "sel1 " << mesh[sel1] << endl
-			 << "sel2 " << mesh[sel2] << endl;
-	      for(int ii=0; ii<3; ii++)
-		{
-		  if(mesh.mlbetweennodes[mesh[sel1][ii]][0] > 0)
-		    (*testout) << mesh[sel1][ii] << " between "
-			       << mesh.mlbetweennodes[mesh[sel1][ii]][0] << " and "
-			       << mesh.mlbetweennodes[mesh[sel1][ii]][1] << endl;
-		  if(mesh.mlbetweennodes[mesh[sel2][ii]][0] > 0)
-		    (*testout) << mesh[sel2][ii] << " between "
-			       << mesh.mlbetweennodes[mesh[sel2][ii]][0] << " and "
-			       << mesh.mlbetweennodes[mesh[sel2][ii]][1] << endl;
-		}
-	    }
-
-	  
-	  ARRAY < int > outerpointsother;
-
-	  if(nsuroundother > 0)
-	    {
-	      outerpointsother.SetSize(nsuroundother+1);
-	      outerpointsother[0] = sp2other;
-	    }
-
-	  for(int i=0; i<nsuroundother; i++)
-	    {
-	      bool done = false;
-	      for(int jj=i; !done && jj<hasbothpointsother.Size(); jj++)
-		{
-		  for(int k=0; !done && k<4; k++)
-		    if(mesh[hasbothpointsother[jj]][k] == outerpointsother[i])
-		      {
-			done = true;
-			for(int l=0; l<4; l++)
-			  if(mesh[hasbothpointsother[jj]][l] != pi1other &&
-			     mesh[hasbothpointsother[jj]][l] != pi2other &&
-			     mesh[hasbothpointsother[jj]][l] != outerpointsother[i])
-			    outerpointsother[i+1] = mesh[hasbothpointsother[jj]][l];
-		      }
-		  if(done)
-		    {
-		      ElementIndex aux = hasbothpointsother[i];
-		      hasbothpointsother[i] = hasbothpointsother[jj];
-		      hasbothpointsother[jj] = aux;
-		    }
-		}
-	    }
-	  if(nsuroundother > 0 && outerpointsother[nsuroundother] != sp1other)
-	    {
-	      cerr << "OJE OJE OJE (other)" << endl;
-	      (*testout) << "OJE OJE OJE (other)" << endl;
-	      (*testout) << "pi1 " << pi1 << " pi2 " << pi2 << " sp1 " << sp1 << " sp2 " << sp2 << endl;
-	      (*testout) << "hasbothpoints: " << endl;
-	      for(int ii=0; ii < hasbothpoints.Size(); ii++)
-		{
-		  (*testout) << mesh[hasbothpoints[ii]] << endl;
-		  for(int jj=0; jj<mesh[hasbothpoints[ii]].GetNP(); jj++)
-		    if(mesh.mlbetweennodes[mesh[hasbothpoints[ii]][jj]][0] > 0)
-		      (*testout) << mesh[hasbothpoints[ii]][jj] << " between "
-				 << mesh.mlbetweennodes[mesh[hasbothpoints[ii]][jj]][0] << " and "
-				 << mesh.mlbetweennodes[mesh[hasbothpoints[ii]][jj]][1] << endl;
-		}
-	      (*testout) << "outerpoints: " << outerpoints << endl;
-	      (*testout) << "sel1 " << mesh[sel1] << endl
-			 << "sel2 " << mesh[sel2] << endl;
-	      for(int ii=0; ii<3; ii++)
-		{
-		  if(mesh.mlbetweennodes[mesh[sel1][ii]][0] > 0)
-		    (*testout) << mesh[sel1][ii] << " between "
-			       << mesh.mlbetweennodes[mesh[sel1][ii]][0] << " and "
-			       << mesh.mlbetweennodes[mesh[sel1][ii]][1] << endl;
-		  if(mesh.mlbetweennodes[mesh[sel2][ii]][0] > 0)
-		    (*testout) << mesh[sel2][ii] << " between "
-			       << mesh.mlbetweennodes[mesh[sel2][ii]][0] << " and "
-			       << mesh.mlbetweennodes[mesh[sel2][ii]][1] << endl;
-		}
-		  
-	      (*testout) << "pi1other " << pi1other << " pi2other " << pi2other << " sp1other " << sp1other << " sp2other " << sp2other << endl;
-	      (*testout) << "hasbothpointsother: " << endl;
-	      for(int ii=0; ii < hasbothpointsother.Size(); ii++)
-		{
-		  (*testout) << mesh[hasbothpointsother[ii]] << endl;
-		  for(int jj=0; jj<mesh[hasbothpointsother[ii]].GetNP(); jj++)
-		    if(mesh.mlbetweennodes[mesh[hasbothpointsother[ii]][jj]][0] > 0)
-		      (*testout) << mesh[hasbothpointsother[ii]][jj] << " between "
-				 << mesh.mlbetweennodes[mesh[hasbothpointsother[ii]][jj]][0] << " and "
-				 << mesh.mlbetweennodes[mesh[hasbothpointsother[ii]][jj]][1] << endl;
-		}
-	      (*testout) << "outerpoints: " << outerpointsother << endl;
-	      (*testout) << "sel1other " << mesh[sel1other] << endl
-			 << "sel2other " << mesh[sel2other] << endl;
-	      for(int ii=0; ii<3; ii++)
-		{
-		  if(mesh.mlbetweennodes[mesh[sel1other][ii]][0] > 0)
-		    (*testout) << mesh[sel1other][ii] << " between "
-			       << mesh.mlbetweennodes[mesh[sel1other][ii]][0] << " and "
-			       << mesh.mlbetweennodes[mesh[sel1other][ii]][1] << endl;
-		  if(mesh.mlbetweennodes[mesh[sel2other][ii]][0] > 0)
-		    (*testout) << mesh[sel2other][ii] << " between "
-			       << mesh.mlbetweennodes[mesh[sel2other][ii]][0] << " and "
-			       << mesh.mlbetweennodes[mesh[sel2other][ii]][1] << endl;
-		}
-	    }
-
-	  bad1=0;
-	  for(int i=0; i<hasbothpoints.Size(); i++)
-	    bad1 += CalcBad(mesh.Points(), mesh[hasbothpoints[i]],h);
-	  for(int i=0; i<hasbothpointsother.Size(); i++)
-	    bad1 += CalcBad(mesh.Points(), mesh[hasbothpointsother[i]],h);
-	  bad1 /= double(hasbothpoints.Size() + hasbothpointsother.Size());
-
-	  
-	  int startpoints,startpointsother;
-
-
-	  if(outerpoints.Size() == 3)
-	    startpoints = 1;
-	  else if(outerpoints.Size() == 4)
-	    startpoints = 2;
-	  else
-	    startpoints = outerpoints.Size();
-	  
-	  if(outerpointsother.Size() == 3)
-	    startpointsother = 1;
-	  else if(outerpointsother.Size() == 4)
-	    startpointsother = 2;
-	  else
-	    startpointsother = outerpointsother.Size();
-	  
-
-	  ARRAY < ARRAY < Element* > * > newelts(startpoints);
-	  ARRAY < ARRAY < Element* > * > neweltsother(startpointsother);
-
-	  double minbad = 1e50, minbadother = 1e50, currbad;
-	  int minpos = -1, minposother = -1;
-
-	  //(*testout) << "pi1 " << pi1 << " pi2 " << pi2 << " outerpoints " << outerpoints << endl;
-
-	  for(int i=0; i<startpoints; i++)
-	    {
-	      newelts[i] = new ARRAY <Element*>(2*(nsuround-1));
-	      
-	      for(int jj=0; jj<nsuround-1; jj++)
-		{
-		  (*newelts[i])[2*jj] = new Element(TET);
-		  (*newelts[i])[2*jj+1] = new Element(TET);
-		  Element & newel1 = *((*newelts[i])[2*jj]);
-		  Element & newel2 = *((*newelts[i])[2*jj+1]);
-
-		  newel1[0] = pi1;
-		  newel1[1] = outerpoints[i];
-		  newel1[2] = outerpoints[(i+jj+1)%outerpoints.Size()];
-		  newel1[3] = outerpoints[(i+jj+2)%outerpoints.Size()];
-
-		  newel2[0] = pi2;
-		  newel2[1] = outerpoints[i];
-		  newel2[2] = outerpoints[(i+jj+2)%outerpoints.Size()];
-		  newel2[3] = outerpoints[(i+jj+1)%outerpoints.Size()];
-		  
-
-		  //(*testout) << "j " << j << " newel1 " << newel1[0] << " "<< newel1[1] << " "<< newel1[2] << " "<< newel1[3] << endl
-		  //     << " newel2 " << newel2[0] << " "<< newel2[1] << " "<< newel2[2] << " "<< newel2[3] << endl;
-		  
-		  newel1.SetIndex(mattype);
-		  newel2.SetIndex(mattype);
-
-		}
-
-	      bool wrongorientation = true;
-	      for(int jj = 0; wrongorientation && jj<newelts[i]->Size(); jj++)
-		wrongorientation = wrongorientation && WrongOrientation(mesh.Points(), *(*newelts[i])[jj]);
-	      
-	      currbad = 0;
-
-	      for(int jj=0; jj<newelts[i]->Size(); jj++)
-		{
-		  if(wrongorientation)
-		    Swap((*(*newelts[i])[jj])[2],(*(*newelts[i])[jj])[3]);
-
-
-		  // not two new faces on same surface
-		  ARRAY<int> face_index;
-		  for(int k = 0; k<surfaceindicesonnode[(*(*newelts[i])[jj])[0]].Size(); k++)
-		    face_index.Append(surfaceindicesonnode[(*(*newelts[i])[jj])[0]][k]);
-
-		  for(int k=1; k<4; k++)
-		    {
-		      for(int l=0; l<face_index.Size(); l++)
-			{
-			  if(face_index[l] != -1 && 
-			     !(surfaceindicesonnode[(*(*newelts[i])[jj])[k]].Contains(face_index[l])))
-			    face_index[l] = -1;
-			}
-
-		    }
-		      
-		  for(int k=0; k<face_index.Size(); k++)
-		    if(face_index[k] != -1)
-		      currbad += 1e12;
-
-
-		  currbad += CalcBad(mesh.Points(),*(*newelts[i])[jj],h);
-
-
-		}  
-
-	      //currbad /= double(newelts[i]->Size());
-		    
-
-
-	      if(currbad < minbad)
-		{
-		  minbad = currbad;
-		  minpos = i;
-		}
-
-	    }
-
-	  if(startpointsother == 0)
-	    minbadother = 0;
-
-	  for(int i=0; i<startpointsother; i++)
-	    {
-	      neweltsother[i] = new ARRAY <Element*>(2*(nsuroundother));
-	      
-	      for(int jj=0; jj<nsuroundother; jj++)
-		{
-		  (*neweltsother[i])[2*jj] = new Element(TET);
-		  (*neweltsother[i])[2*jj+1] = new Element(TET);
-		  Element & newel1 = *((*neweltsother[i])[2*jj]);
-		  Element & newel2 = *((*neweltsother[i])[2*jj+1]);
-
-		  newel1[0] = pi1other;
-		  newel1[1] = outerpointsother[i];
-		  newel1[2] = outerpointsother[(i+jj+1)%outerpointsother.Size()];
-		  newel1[3] = outerpointsother[(i+jj+2)%outerpointsother.Size()];
-
-		  newel2[0] = pi2other;
-		  newel2[1] = outerpointsother[i];
-		  newel2[2] = outerpointsother[(i+jj+2)%outerpointsother.Size()];
-		  newel2[3] = outerpointsother[(i+jj+1)%outerpointsother.Size()];
-		  
-
-		  //(*testout) << "j " << j << " newel1 " << newel1[0] << " "<< newel1[1] << " "<< newel1[2] << " "<< newel1[3] << endl
-		  //	     << " newel2 " << newel2[0] << " "<< newel2[1] << " "<< newel2[2] << " "<< newel2[3] << endl;
-		  
-		  newel1.SetIndex(othermattype);
-		  newel2.SetIndex(othermattype);
-
-		}
-
-	      bool wrongorientation = true;
-	      for(int jj = 0; wrongorientation && jj<neweltsother[i]->Size(); jj++)
-		wrongorientation = wrongorientation && WrongOrientation(mesh.Points(), *(*neweltsother[i])[jj]);
-	      
-	      currbad = 0;
-
-	      for(int jj=0; jj<neweltsother[i]->Size(); jj++)
-		{
-		  if(wrongorientation)
-		    Swap((*(*neweltsother[i])[jj])[2],(*(*neweltsother[i])[jj])[3]);
-
-		  currbad += CalcBad(mesh.Points(),*(*neweltsother[i])[jj],h);
-		}  
-
-	      //currbad /= double(neweltsother[i]->Size());
-		    
-
-
-	      if(currbad < minbadother)
-		{
-		  minbadother = currbad;
-		  minposother = i;
-		}
-
-	    }
-
-	  //(*testout) << "minbad " << minbad << " bad1 " << bad1 << endl;
-
-	  
-	  double sbadnew = CalcTriangleBadness (mesh[pi1],mesh[sp2],mesh[sp1],0,0) + 
-	    CalcTriangleBadness (mesh[pi2],mesh[sp1],mesh[sp2],0,0);
-	  
-
-	  int denom = newelts[minpos]->Size();
-	  if(minposother >= 0)
-	    denom += neweltsother[minposother]->Size();
-	  
-
-	  if((minbad+minbadother)/double(denom) < bad1 && 
-	     sbadnew < sbad)
-	    {
-	      cnt++;
-
-	      swapped = true;
-
-
-	      int start1 = -1;
-	      for(int l=0; l<3; l++)
-		if(mesh[sel1][l] == pi1)
-		  start1 = l;
-	      if(mesh[sel1][(start1+1)%3] == pi2)
-		{
-		  mesh[sel1][0] = pi1;
-		  mesh[sel1][1] = sp2;
-		  mesh[sel1][2] = sp1;
-		  mesh[sel2][0] = pi2;
-		  mesh[sel2][1] = sp1;
-		  mesh[sel2][2] = sp2;
-		}
-	      else
-		{
-		  mesh[sel1][0] = pi2;
-		  mesh[sel1][1] = sp2;
-		  mesh[sel1][2] = sp1;
-		  mesh[sel2][0] = pi1;
-		  mesh[sel2][1] = sp1;
-		  mesh[sel2][2] = sp2;
-		}
-	      //(*testout) << "changed surface element " << sel1 << " to " << mesh[sel1] << ", " << sel2 << " to " << mesh[sel2] << endl;
-
-	      for(int l=0; l<3; l++)
-		{
-		  surfaceelementsonnode.Add(mesh[sel1][l],sel1);
-		  surfaceelementsonnode.Add(mesh[sel2][l],sel2);
-		}
-	      
-
-
-	      if(periodic)
-		{
-		  start1 = -1;
-		  for(int l=0; l<3; l++)
-		    if(mesh[sel1other][l] == pi1other)
-		      start1 = l;
-		  
-
-
-		  //(*testout) << "changed surface elements " << mesh[sel1other] << " and " << mesh[sel2other] << endl;
-		  if(mesh[sel1other][(start1+1)%3] == pi2other)
-		    {
-		      mesh[sel1other][0] = pi1other;
-		      mesh[sel1other][1] = sp2other;
-		      mesh[sel1other][2] = sp1other;
-		      mesh[sel2other][0] = pi2other;
-		      mesh[sel2other][1] = sp1other;
-		      mesh[sel2other][2] = sp2other;
-		      //(*testout) << "       with rule 1" << endl;
-		    }
-		  else
-		    {
-		      mesh[sel1other][0] = pi2other;
-		      mesh[sel1other][1] = sp2other;
-		      mesh[sel1other][2] = sp1other;
-		      mesh[sel2other][0] = pi1other;
-		      mesh[sel2other][1] = sp1other;
-		      mesh[sel2other][2] = sp2other;
-		      //(*testout) << "       with rule 2" << endl;
-		    }
-		  //(*testout) << "         to " << mesh[sel1other] << " and " << mesh[sel2other] << endl;
-		  
-		  //(*testout) << "  and surface element " << sel1other << " to " << mesh[sel1other] << ", " << sel2other << " to " << mesh[sel2other] << endl;
-
-		  for(int l=0; l<3; l++)
-		    {
-		      surfaceelementsonnode.Add(mesh[sel1other][l],sel1other);
-		      surfaceelementsonnode.Add(mesh[sel2other][l],sel2other);
-		    }
-		}
-
-
-
-
-	      for(int i=0; i<hasbothpoints.Size(); i++)
-		{
-		  mesh[hasbothpoints[i]] = *(*newelts[minpos])[i];
-
-		  for(int l=0; l<4; l++)
-		    elementsonnode.Add((*(*newelts[minpos])[i])[l],hasbothpoints[i]);
-		}
-
-	      for(int i=hasbothpoints.Size(); i<(*newelts[minpos]).Size(); i++)
-		{
-		  ElementIndex ni = mesh.AddVolumeElement(*(*newelts[minpos])[i]);
-		  
-		  for(int l=0; l<4; l++)
-		    elementsonnode.Add((*(*newelts[minpos])[i])[l],ni);
-		}
-
-	      if(hasbothpointsother.Size() > 0)
-		{
-		  for(int i=0; i<hasbothpointsother.Size(); i++)
-		    {
-		      mesh[hasbothpointsother[i]] = *(*neweltsother[minposother])[i];
-		      for(int l=0; l<4; l++)
-			elementsonnode.Add((*(*neweltsother[minposother])[i])[l],hasbothpointsother[i]);
-		    }
-		  
-		  for(int i=hasbothpointsother.Size(); i<(*neweltsother[minposother]).Size(); i++)
-		    {
-		      ElementIndex ni = mesh.AddVolumeElement(*(*neweltsother[minposother])[i]);
-		      for(int l=0; l<4; l++)
-			elementsonnode.Add((*(*neweltsother[minposother])[i])[l],ni);
-		    }
-		}
-
-	      
-
-	    }
-
-	  for(int i=0; i<newelts.Size(); i++)
-	    {
-	      for(int jj=0; jj<newelts[i]->Size(); jj++)
-		delete (*newelts[i])[jj];
-	      delete newelts[i];
-	    }
-
-	  for(int i=0; i<neweltsother.Size(); i++)
-	    {
-	      for(int jj=0; jj<neweltsother[i]->Size(); jj++)
-		delete (*neweltsother[i])[jj];
-	      delete neweltsother[i];
-	    }
-	
-	}
-    }
-
-  PrintMessage (5, cnt, " swaps performed");
-
-
-  for(int i=0; i<locidmaps.Size(); i++)
-    delete locidmaps[i];
-
-
-  mesh.Compress ();
-
-  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(0), pi2(0), pi3(0), pi4(0), pi5(0);
-
-  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 e82f37b028f86edd369620f52333b6d3120d5265..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/improve3.hpp
+++ /dev/null
@@ -1,99 +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,
-		    const BitArray * working_elements = NULL);
-  void SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY,
-			   const BitArray * working_elements = NULL,
-			   const ARRAY< ARRAY<int,PointIndex::BASE>* > * idmaps = NULL);
-  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 MinFunctionSum : public MinFunction
-{
-protected:
-  ARRAY<MinFunction*> functions;
- 
-public:
-  
-  virtual double Func (const Vector & x) const;
-  virtual void Grad (const Vector & x, Vector & g) 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;
-
-  void AddFunction(MinFunction & fun);
-  
-  const MinFunction & Function(int i) const;
-  MinFunction & Function(int i);  
-};
-  
-
-
-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;
-};
-
-
-class JacobianPointFunction : public MinFunction
-{
-public:
-  Mesh::T_POINTS & points;
-  const Mesh::T_VOLELEMENTS & elements;
-  TABLE<INDEX> elementsonpoint;
-  PointIndex actpind;
-
-  bool onplane;
-  Vec<3> nv;
-  
-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;
-
-  inline void SetNV(const Vec<3> & anv) {nv = anv; onplane = true;}
-  inline void UnSetNV(void) {onplane = false;}
-};
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/localh.cpp b/contrib/Netgen/libsrc/meshing/localh.cpp
deleted file mode 100644
index 1a9f3d340da7294cc8f709a214ecd6c44661da77..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/localh.cpp
+++ /dev/null
@@ -1,680 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-
-GradingBox :: GradingBox (const double * ax1, const double * ax2)
-{
-  h2 = 0.5 * (ax2[0] - ax1[0]);
-  for (int 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 (int 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;
-
-  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 c47ffa9d9c7002f50d7b3ba836d49150e68f02d4..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshclass.cpp
+++ /dev/null
@@ -1,5582 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-#ifdef PARALLEL
-#include <parallel.hpp>
-#endif
-
-namespace netgen
-{
-
-  Mesh :: Mesh ()
-  {
-    volelements.SetName ("vol elements");
-    surfelements.SetName ("surf elements");
-    points.SetName ("meshpoints");
-
-    boundaryedges = NULL;
-    surfelementht = NULL; 
-    segmentht = NULL;
-
-    lochfunc = NULL;
-    mglevels = 1;
-    elementsearchtree = NULL;
-    elementsearchtreets = NextTimeStamp();
-    majortimestamp = timestamp = NextTimeStamp();
-    hglob = 1e10;
-    hmin = 0;
-    numvertices = -1;
-    dimension = 3;
-
-    topology = new MeshTopology (*this);
-    curvedelems = new CurvedElements (*this);
-    clusters = new AnisotropicClusters (*this);
-    ident = new Identifications (*this);
-
-    hpelements = NULL;
-    coarsemesh = NULL;
-
-    ps_startelement = 0;
-
-    geomtype = NO_GEOM;
-
-    bcnames.SetSize(0);
-#ifdef PARALLEL
-    paralleltop = new ParallelMeshTopology (*this);
-#endif
-  }
-
-
-  Mesh :: ~Mesh()
-  {
-    delete lochfunc;
-    delete boundaryedges;
-    delete surfelementht;
-    delete segmentht;
-    delete curvedelems;
-    delete clusters;
-    delete topology;
-    delete ident;
-    delete elementsearchtree;
-
-    delete coarsemesh;
-    delete hpelements;
-    
-    for (int i = 0; i < materials.Size(); i++)
-      delete [] materials[i];
-
-    for(int i = 0; i < userdata_int.Size(); i++)
-      delete userdata_int[i];
-    for(int i = 0; i < userdata_double.Size(); i++)
-      delete userdata_double[i];
-
-    for (int i = 0; i < bcnames.Size(); i++ )
-      if ( bcnames[i] ) delete bcnames[i];
-
-#ifdef PARALLEL
-    delete paralleltop;
-#endif
-  }
-
-
-  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;
-
-    bcnames.SetSize( mesh2.bcnames.Size() );
-    for ( int i = 0; i < mesh2.bcnames.Size(); i++ )
-      if ( mesh2.bcnames[i] ) bcnames[i] = new string ( *mesh2.bcnames[i] );
-      else bcnames[i] = 0;
-
-    return *this;
-  }
-
-
-  void Mesh :: DeleteMesh()
-  {
-    points.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);
-
-    delete ident;
-    ident = new Identifications (*this);
-    delete topology;
-    topology = new MeshTopology (*this);
-    delete curvedelems;
-    curvedelems = new CurvedElements (*this);
-    delete clusters;
-    clusters = new AnisotropicClusters (*this);
-
-    for ( int i = 0; i < bcnames.Size(); i++ )
-      if ( bcnames[i] ) delete bcnames[i];
-
-#ifdef PARALLEL
-    delete paralleltop;
-    paralleltop = new ParallelMeshTopology (*this);
-#endif
-
-
-    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) ); 
-
-#ifdef PARALLEL
-    points.Last().SetGhost(0);
-#endif
-
-    lock.UnLock();
-
-    return pi;
-  }
-
-  PointIndex Mesh :: AddPoint (const Point3d & p, int layer, POINTTYPE type)
-  { 
-    NgLock lock(mutex);
-    lock.Lock();
-
-    timestamp = NextTimeStamp();
-
-    PointIndex pi = points.Size() + PointIndex::BASE;
-    points.Append ( MeshPoint (p, layer, type) ); 
-
-#ifdef PARALLEL
-    points.Last().SetGhost(0);
-#endif
-
-    lock.UnLock();
-
-    return pi;
-  }
-
-
-#ifdef PARALLEL
-  PointIndex Mesh :: AddPoint (const Point3d & p, bool isghost,  int layer)
-  { 
-    NgLock lock(mutex);
-    lock.Lock();
-
-    timestamp = NextTimeStamp();
-
-    PointIndex pi = points.Size() + PointIndex::BASE;
-    points.Append ( MeshPoint (p, layer, INNERPOINT) ); 
-
-    points.Last().SetGhost(isghost);
-
-    lock.UnLock();
-
-    return pi;
-  }
-
-  PointIndex Mesh :: AddPoint (const Point3d & p, bool isghost, int layer, POINTTYPE type)
-  { 
-    NgLock lock(mutex);
-    lock.Lock();
-
-    timestamp = NextTimeStamp();
-
-    PointIndex pi = points.Size() + PointIndex::BASE;
-    points.Append ( MeshPoint (p, layer, type) ); 
-
-    points.Last().SetGhost(isghost);
-
-    lock.UnLock();
-
-    return pi;
-  }
-
-#endif
-
-
-
-  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); 
-
-    if (el.index > facedecoding.Size())
-      cerr << "has no facedecoding: fd.size = " << facedecoding.Size() << ", ind = " << el.index << endl;
-
-    surfelements.Last().next = facedecoding[el.index-1].firstelement;
-    facedecoding[el.index-1].firstelement = si;
-
-#ifdef PARALLEL
-    surfelements.Last().SetGhost ( el.IsGhost() );
-#endif
-
-    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;
-
-#ifdef PARALLEL
-    volelements.Last().SetGhost ( el.IsGhost() );
-#endif
-
-    // while (volelements.Size() > eltyps.Size())
-    // eltyps.Append (FREEELEMENT);
-  
-    timestamp = NextTimeStamp();
-
-    lock.UnLock();
-    return ve;
-  }
-
-
-
-
-
-
-  void Mesh :: Save (const string & filename) const
-  {
-    
-    ofstream outfile(filename.c_str());
-
-    Save(outfile);
-  }
-
-
-
-  void Mesh :: Save (ostream & outfile) const
-  {
-    int i, j;
-
-    double scale = 1;  // globflags.GetNumFlag ("scale", 1);
-    int inverttets = 0;  // globflags.GetDefineFlag ("inverttets");
-    int invertsurf = 0;  // globflags.GetDefineFlag ("invertsurfacemesh");
-
-
-
-    outfile << "mesh3d" << "\n";
-
-    outfile << "dimension\n" << GetDimension() << "\n";
-
-    outfile << "geomtype\n" << int(geomtype) << "\n";
-
-
-    outfile << "\n";
-    outfile << "# surfnr    bcnr   domin  domout      np      p1      p2      p3"
-	    << "\n";
-
-    
-    switch (geomtype)
-      {
-      case GEOM_STL:
-        outfile << "surfaceelementsgi" << "\n";
-        break;
-      case GEOM_OCC: case GEOM_ACIS:
-        outfile << "surfaceelementsuv" << "\n";
-        break;
-      default:
-        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];
-	  }
-
-
-        switch (geomtype)
-          {
-          case GEOM_STL:
-            for (j = 1; j <= sel.GetNP(); j++)
-              {
-                outfile.width(7);	  
-                outfile << " " << sel.GeomInfoPi(j).trignum;
-              }
-            break;
-          case GEOM_OCC: case GEOM_ACIS:
-            for (j = 1; j <= sel.GetNP(); j++)
-              {
-                outfile.width(7);	  
-                outfile << " " << sel.GeomInfoPi(j).u;
-                outfile << " " << sel.GeomInfoPi(j).v;
-              }
-            break;
-          default:
-            outfile << "\n";
-          }
-
-
-	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++)
-	  for (int k = 0; k < el.GetNP()-1; k++)
-	  if (el[k] > el[k+1]) swap (el[k], el[k+1]);
-	*/
-
-	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 << "# surfid  0   p1   p2   trignum1    trignum2   domin/surfnr1    domout/surfnr2   ednr1   dist1   ednr2   dist2 \n";
-    outfile << "edgesegmentsgi2" << "\n";
-    outfile << GetNSeg() << "\n";
-
-    for (i = 1; i <= GetNSeg(); i++)
-      {
-	const Segment & seg = LineSegment (i);
-	outfile.width(8);
-	outfile << seg.si; // 2D: bc number, 3D: wievielte Kante
-	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;  // stl dreiecke
-	outfile << " ";
-	outfile.width(8);
-	outfile << seg.geominfo[1].trignum; // << endl;  // stl dreieck
-	
-	if (dimension == 3)
-	  {
-	    outfile << " ";
-	    outfile.width(8);
-	    outfile << seg.surfnr1+1;
-	    outfile << " ";
-	    outfile.width(8);
-	    outfile << seg.surfnr2+1;
-	  }
-	else
-	  {
-	    outfile << " ";
-	    outfile.width(8);
-	    outfile << seg.domin;
-	    outfile << " ";
-	    outfile.width(8);
-	    outfile << seg.domout;
-	  }
-
-	outfile << " ";
-	outfile.width(8);
-	outfile << seg.edgenr;
-	outfile << " ";
-	outfile.width(12);
-	outfile.precision(16);
-	outfile << seg.epgeominfo[0].dist;  // splineparameter (2D)
-	outfile << " ";
-	outfile.width(8);
-	outfile.precision(16);
-	outfile << seg.epgeominfo[1].edgenr;  // geometry dependent
-	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](0)/scale << "  ";
-	outfile.width(22);
-	outfile << (*this)[pi](1)/scale << "  ";
-	outfile.width(22);
-	outfile << (*this)[pi](2)/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";
-	      }
-	  }
-
-	outfile << "identificationtypes\n";
-	outfile << ident -> GetMaxNr() << "\n";
-	for (i = 1; i <= ident -> GetMaxNr(); i++)
-	  {
-	    int type = ident -> GetType(i);
-	    outfile << " " << type;
-	  }
-	outfile << "\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 cntbcnames = 0;
-    for ( int ii = 0; ii < bcnames.Size(); ii++ )
-      if ( bcnames[ii] ) cntbcnames++;
-
-    if ( cntbcnames )
-      {
-	outfile << "\n\nbcnames" << endl << bcnames.Size() << endl;
-	for ( i = 0; i < bcnames.Size(); i++ )
-	  outfile << i+1 << "\t" << GetBCName(i) << endl;
-	outfile << endl << endl;
-      }
-
-    /*
-    if ( GetDimension() == 2 )
-      {
-	for (i = 1; i <= GetNSeg(); i++)
-	  {
-	    const Segment & seg = LineSegment (i);
-	    if ( ! bcprops.Contains(seg.si) && seg.GetBCName() != "" )
-	      {
-		bcprops.Append(seg.si);
-		cntbcnames++;
-	      }
-	  }
-      }
-    else
-      {
-	for (sei = 0; sei < GetNSE(); sei++)
-	  {
-	    if ((*this)[sei].GetIndex())
-	      {
-		int bcp = GetFaceDescriptor((*this)[sei].GetIndex ()).BCProperty();
-		string name = GetFaceDescriptor((*this)[sei].GetIndex ()).BCName();
-		if ( !bcprops.Contains(bcp) &&
-		     name != "" )
-		  {
-		    bcprops.Append(bcp);
-		    cntbcnames++;
-		  }
-	      }
-	  }
-      }
-
-    bcprops.SetSize(0);
-    if ( cntbcnames )
-      {
-	outfile << "\nbcnames" << endl << cntbcnames << endl;
-	if ( GetDimension() == 2 )
-	  {
-	    for (i = 1; i <= GetNSeg(); i++)
-	      {
-		const Segment & seg = LineSegment (i);
-		if ( ! bcprops.Contains(seg.si) && seg.GetBCName() != "" )
-		  {
-		    bcprops.Append(seg.si);
-		    outfile << seg.si << "\t" << seg.GetBCName() << endl;
-		  }
-	      }
-	  }
-	else
-	  {
-	    for (sei = 0; sei < GetNSE(); sei++)
-	      {
-		if ((*this)[sei].GetIndex())
-		  {
-		    int bcp = GetFaceDescriptor((*this)[sei].GetIndex ()).BCProperty();
-		    string name = GetFaceDescriptor((*this)[sei].GetIndex ()).BCName();
-		    if ( !bcprops.Contains(bcp) &&
-			 name != "" )
-		      {
-			bcprops.Append(bcp);
-			outfile << bcp << "\t" << name << endl;
-		      }
-		  }
-	      }
-	  }
-	outfile << endl << endl;
-      }
-    */
-
-    int cnt_sing = 0;
-    for (PointIndex pi = PointIndex::BASE; pi < GetNP()+PointIndex::BASE; pi++)
-      if ((*this)[pi].Singularity()>=1.) 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].Singularity()>=1.) 
-	    outfile << int(pi) << "\t" << (*this)[pi].Singularity() << 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) << "\t" << segments[si].singedge_left << 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) << "\t" << segments[si].singedge_right << 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)  << "\t" << 
-	      GetFaceDescriptor ((*this)[sei].GetIndex()).domin_singular  << 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) << "\t" 
-		    << GetFaceDescriptor ((*this)[sei].GetIndex()).domout_singular << endl;
-      }
-
-
-  }
-
-
-  
-  void Mesh :: Load (const string & filename)
-  {
-    
-    ifstream infile(filename.c_str());
-    if (!infile.good())
-      throw NgException ("mesh file not found");
-
-    Load(infile);
-  }
-
-
-
- 
-  void Mesh :: Load (istream & infile)
-  {
-
-    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");
-
-
-    facedecoding.SetSize(0);
-
-    bool endmesh = false;
-
-    while (infile.good() && !endmesh)
-      {
-	infile >> str;
-
-	if (strcmp (str, "dimension") == 0)
-	  {
-	    infile >> dimension;
-	  }
-
-	if (strcmp (str, "geomtype") == 0)
-	  {
-            int hi;
-	    infile >> hi;
-            geomtype = GEOM_TYPE(hi);
-	  }
-
-
-	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, "surfaceelementsuv") == 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).u >> tri.GeomInfoPi(j).v;
-
-		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)
-	  {
-	    int a; 
-	    infile >> a;
-	    n=a; 
-
-	    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].dist
-		       >> seg.epgeominfo[1].edgenr
-		       >> seg.epgeominfo[1].dist;
-
-		seg.epgeominfo[0].edgenr = seg.epgeominfo[1].edgenr;
-
-		seg.domin = seg.surfnr1;
-		seg.domout = seg.surfnr2;
-
-		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, "identificationtypes") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		int type;
-		infile >> type;
-		ident -> SetType(i,Identifications::ID_TYPE(type));
-	      }
-	  }
-
-	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, "bcnames" ) == 0 )
-	  {
-	    infile >> n;
-	    ARRAY<int,0> bcnrs(n);
-
-	    SetNBCNames(n);
-	    for ( i = 1; i <= n; i++ )
-	      {
-		string nextbcname;
-		infile >> bcnrs[i-1] >> nextbcname;
-		bcnames[bcnrs[i-1]-1] = new string(nextbcname);
-	      }
-	    
-	    if ( GetDimension() == 2 )
-	      {
-		for (i = 1; i <= GetNSeg(); i++)
-		  {
-		    Segment & seg = LineSegment (i);
-		    if ( seg.si <= n )
-		      seg.SetBCName (bcnames[seg.si-1]);
-		    else
-		      seg.SetBCName(0);
-		  }
-	      }
-	    else
-	      {
-		for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++)
-		  {
-		    if ((*this)[sei].GetIndex())
-		      {
-			int bcp = GetFaceDescriptor((*this)[sei].GetIndex ()).BCProperty();
-			if ( bcp <= n )
-			  GetFaceDescriptor((*this)[sei].GetIndex ()).SetBCName(bcnames[bcp-1]);
-			else
-			  GetFaceDescriptor((*this)[sei].GetIndex ()).SetBCName(0);
-
-		      }
-		  }
-
-	      }
-	    
-
-	  }
-	
-	if (strcmp (str, "singular_points") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		PointIndex pi;
-		double s; 
-		infile >> pi;
-		infile >> s; 
-		(*this)[pi].Singularity (s);
-	      }
-	  }
-
-	if (strcmp (str, "singular_edge_left") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		SegmentIndex si;
-		double s; 
-		infile >> si;
-		infile >> s; 
-		(*this)[si].singedge_left = s;
-	      }
-	  }
-	if (strcmp (str, "singular_edge_right") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		SegmentIndex si;
-		double s; 
-		infile >> si;
-		infile >> s; 
-		(*this)[si].singedge_right = s;
-	      }
-	  }
-
-	if (strcmp (str, "singular_face_inside") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		SurfaceElementIndex sei;
-		double s; 
-		infile >> sei;
-		infile >> s; 
-		GetFaceDescriptor((*this)[sei].GetIndex()).domin_singular = s;
-	      }
-	  }
-
-	if (strcmp (str, "singular_face_outside") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		SurfaceElementIndex sei;
-		double s; 
-		infile >> sei;
-		infile >> s; 
-		GetFaceDescriptor((*this)[sei].GetIndex()).domout_singular = s;
-	      }
-	  }
-
-	if (strcmp (str, "endmesh") == 0)
-	  endmesh = true;
-	  
-
-
-	strcpy (str, "");
-      }
-  
-    CalcSurfacesOfNode ();
-    //  BuildConnectedNodes ();
-    topology -> Update();
-    clusters -> Update();
-  
-    SetNextMajorTimeStamp();
-    //  PrintMemInfo (cout);
-
-
-#ifdef PARALLEL
-    if ( ntasks > 1 )
-      {
-	// for parallel processing
-	Distribute ();
-	return;
-      }
-#endif
-
-  }
-  
-
-  
-
-
-  void Mesh :: Merge (const string & filename, const int surfindex_offset)
-  {
-    ifstream infile(filename.c_str());
-    if (!infile.good())
-      throw NgException ("mesh file not found");
-
-    Merge(infile,surfindex_offset);
-
-  }
-
-
-
-  void Mesh :: Merge (istream & infile, const int surfindex_offset)
-  {
-    char str[100];
-    int i, n;
-
-    
-    int inverttets = 0;  // globflags.GetDefineFlag ("inverttets");
-
-    int oldnp = GetNP();
-    int oldne = GetNSeg();
-    int oldnd = GetNDomains();
-    
-    for(SurfaceElementIndex si = 0; si < GetNSE(); si++)
-      for(int j=1; j<=(*this)[si].GetNP(); j++) (*this)[si].GeomInfoPi(j).trignum = -1;
-    
-    int max_surfnr = 0;
-    for (i = 1; i <= GetNFD(); i++)
-      max_surfnr = max2 (max_surfnr, GetFaceDescriptor(i).SurfNr());
-    max_surfnr++;
-
-    if(max_surfnr < surfindex_offset) max_surfnr = surfindex_offset;
-
-
-    bool endmesh = false;
-
-    while (infile.good() && !endmesh)
-      {
-	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--;
-
-		if(domin > 0) domin += oldnd;
-		if(domout > 0) domout += oldnd;
-		surfnr += max_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));
-		    if(GetDimension() == 2) bcp++;
-		    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;
-		    tri.GeomInfoPi(j).trignum = -1;
-		  }
-
-		AddSurfaceElement (tri);
-	      }
-	  }
-
-	
-	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;
-		seg.p1 = seg.p1 + oldnp;
-		seg.p2 = seg.p2 + oldnp;
-		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;
-		seg.p1 = seg.p1 + oldnp;
-		seg.p2 = seg.p2 + oldnp;
-		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].dist
-		       >> seg.epgeominfo[1].edgenr
-		       >> seg.epgeominfo[1].dist;
-		seg.epgeominfo[0].edgenr = seg.epgeominfo[1].edgenr;
-
-		seg.surfnr1--;
-		seg.surfnr2--;
-
-		if(seg.surfnr1 >= 0)  seg.surfnr1 = seg.surfnr1 + max_surfnr;
-		if(seg.surfnr2 >= 0)  seg.surfnr2 = seg.surfnr2 + max_surfnr;
-		seg.p1 = seg.p1 +oldnp;
-		seg.p2 = seg.p2 +oldnp;
-		seg.edgenr = seg.edgenr + oldne;
-		seg.epgeominfo[1].edgenr = seg.epgeominfo[1].edgenr + oldne;
-
-		AddSegment (seg);
-	      }
-	  }
- 
-	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+oldnd);
-		infile >> nep;
-		el.SetNP(nep);
-	      
-		for (int j = 0; j < nep; j++)
-		  {
-		    infile >> (int&)(el[j]);
-		    el[j] = el[j]+oldnp;
-		  }
-	      
-		if (inverttets)
-		  el.Invert();
-
-		AddVolumeElement (el);
-	      }
-	  }
-         
-
-	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);
-	      }
-	  }
-
-
-	if (strcmp (str, "endmesh") == 0)
-	  {
-	    endmesh = true;
-	  }
-
-
-	if (strcmp (str, "materials") == 0)
-	  {
-	    infile >> n;
-	    for (i = 1; i <= n; i++)
-	      {
-		int nr;
-		string mat;
-		infile >> nr >> mat;
-		SetMaterial (nr+oldnd, mat.c_str());
-	      }
-	  }
-
-
-	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 :: SetAllocSize(int nnodes, int nsegs, int nsel, int nel)
-  {
-    points.SetAllocSize(nnodes);
-    segments.SetAllocSize(nsegs);
-    surfelements.SetAllocSize(nsel);
-    volelements.SetAllocSize(nel);
-  }
-  
-
-  void Mesh :: BuildBoundaryEdges(void)
-  {
-    delete boundaryedges;
-
-    boundaryedges = new INDEX_2_CLOSED_HASHTABLE<int>
-      (3 * (GetNSE() + GetNOpenElements()) + GetNSeg() + 1);
-
-
-    for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++)
-      {
-	const Element2d & sel = surfelements[sei];
-	if (sel.IsDeleted()) continue;
-
-	int si = sel.GetIndex();
-      
-	for (int j = 0; j < sel.GetNP(); j++)
-	  {
-	    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 (int i = 0; i < openelements.Size(); i++)
-      {
-	const Element2d & sel = openelements[i];
-	for (int 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);
-	  }
-      }
-
-    for (int 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 :: CalcSurfacesOfNode ()
-  {
-    int i, j, k;
-    SurfaceElementIndex sei;
-
-    surfacesonnode.SetSize (GetNP());
-
-    delete boundaryedges;
-    boundaryedges = NULL;
-
-    delete surfelementht;
-    delete segmentht;
-
-    /*
-      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);
-
-	  }
-      }
-    /*
-      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, sei);   // war das wichtig ???    sel.GetIndex());
-      }
-
-    int np = GetNP();
-
-    if (dimension == 3)
-      {
-        for (PointIndex pi = PointIndex::BASE; 
-             pi < np+PointIndex::BASE; pi++)
-          points[pi].SetType (INNERPOINT);
-        
-        if (GetNFD() == 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)
-  {
-    static int timer = NgProfiler::CreateTimer ("Mesh::FindOpenElements");
-    static int timera = NgProfiler::CreateTimer ("Mesh::FindOpenElements A");
-    static int timerb = NgProfiler::CreateTimer ("Mesh::FindOpenElements B");
-    static int timerc = NgProfiler::CreateTimer ("Mesh::FindOpenElements C");
-    static int timerd = NgProfiler::CreateTimer ("Mesh::FindOpenElements D");
-    static int timere = NgProfiler::CreateTimer ("Mesh::FindOpenElements E");
-
-    NgProfiler::RegionTimer reg (timer);
-
-    int np = GetNP();
-    int ne = GetNE();
-    int nse = GetNSE();
-    
-    ARRAY<int,PointIndex::BASE> numonpoint(np);
-
-    numonpoint = 0;
-
-    NgProfiler::StartTimer (timera);
-    for (ElementIndex 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 (int j = 0; j < el.GetNP(); j++)
-		numonpoint[el[j]]++;
-	  }
-      }
-
-    TABLE<ElementIndex,PointIndex::BASE> elsonpoint(numonpoint);
-    for (ElementIndex 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 (int j = 0; j < el.GetNP(); j++)
-		elsonpoint.Add (el[j], ei);
-	  }
-      }
-    NgProfiler::StopTimer (timera);
-
-
-
-
-    NgProfiler::StartTimer (timerb);	
-
-
-
-    ARRAY<char, 1> hasface(GetNFD());
-
-    int i;
-    for (i = 1; i <= GetNFD(); i++)
-      {
-	int domin = GetFaceDescriptor(i).DomainIn();
-	int domout = GetFaceDescriptor(i).DomainOut();
-	hasface[i] = 
-	  dom == 0 && (domin != 0 || domout != 0) ||
-	  dom != 0 && (domin == dom || domout == dom);
-      }
-
-    numonpoint = 0;
-    for (SurfaceElementIndex sii = 0; sii < nse; sii++)
-      {
-	int ind = surfelements[sii].GetIndex();
-	/*
-	  if (
-	  GetFaceDescriptor(ind).DomainIn() && 
-	  (dom == 0 || dom == GetFaceDescriptor(ind).DomainIn())
-	  ||
-	  GetFaceDescriptor(ind).DomainOut() && 
-	  (dom == 0 || dom == GetFaceDescriptor(ind).DomainOut())
-	  )
-	*/
-	if (hasface[ind])
-	  {
-	    /*
-	      Element2d hel = surfelements[i];
-	      hel.NormalizeNumbering();	  
-	      numonpoint[hel[0]]++;
-	    */
-	    const Element2d & hel = surfelements[sii];
-	    int mini = 0;
-	    for (int j = 1; j < hel.GetNP(); j++)
-	      if (hel[j] < hel[mini])
-		mini = j;
-	    numonpoint[hel[mini]]++;
-	  }
-      }
-
-    TABLE<SurfaceElementIndex,PointIndex::BASE> selsonpoint(numonpoint);
-    for (SurfaceElementIndex sii = 0; sii < nse; sii++)
-      {
-	int ind = surfelements[sii].GetIndex();
-
-	/*
-	  if (
-	  GetFaceDescriptor(ind).DomainIn() && 
-	  (dom == 0 || dom == GetFaceDescriptor(ind).DomainIn())
-	  ||
-	  GetFaceDescriptor(ind).DomainOut() && 
-	  (dom == 0 || dom == GetFaceDescriptor(ind).DomainOut())
-	  )
-	*/
-	if (hasface[ind])
-	  {
-	    /*
-	      Element2d hel = surfelements[i];
-	      hel.NormalizeNumbering();	  
-	      selsonpoint.Add (hel[0], i);
-	    */
-	    const Element2d & hel = surfelements[sii];
-	    int mini = 0;
-	    for (int j = 1; j < hel.GetNP(); j++)
-	      if (hel[j] < hel[mini])
-		mini = j;
-	    selsonpoint.Add (hel[mini], sii);
-	  }
-      }
-
-
-    NgProfiler::StopTimer (timerb);
-
-    int ii, j, k, l;
-    PointIndex pi;
-    SurfaceElementIndex sei;
-    Element2d hel;
-
-    NgProfiler::RegionTimer regc (timerc);
-
-
-    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 = 0; 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);
-		  }
-	      }
-	}
-
-    int cnt3 = 0;
-    for (i = 0; i < openelements.Size(); i++)
-      if (openelements[i].GetNP() == 3)
-	cnt3++;
-
-    int cnt4 = openelements.Size() - cnt3;
-
-
-    MyStr treequad;
-    if (cnt4)
-      treequad = MyStr(" (") + MyStr(cnt3) + MyStr (" + ") + 
-	MyStr(cnt4) + MyStr(")");
-
-    PrintMessage (5, openelements.Size(), treequad, " open elements");
-
-    BuildBoundaryEdges();
-
-
-    NgProfiler::RegionTimer regd (timerd);
-
-    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);
-	  }
-      }
-
-
-    NgProfiler::RegionTimer rege (timere);
-
-    /*
-      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);
-      }
-    */
-  }
-
-  bool Mesh :: HasOpenQuads () const
-  {
-    int no = GetNOpenElements();
-    for (int i = 0; i < no; i++)
-      if (openelements[i].GetNP() == 4)
-	return true;
-    return false;
-  }
-
-
-
-
-
-  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();
-	  }
-      }
-
-    for (int i = 0; i < facedecoding.Size(); i++)
-      facedecoding[i].firstelement = -1;
-    for (int i = surfelements.Size()-1; i >= 0; i--)
-      {
-        int ind = surfelements[i].GetIndex();
-        surfelements[i].next = facedecoding[ind-1].firstelement;
-        facedecoding[ind-1].firstelement = i;
-      }
-
-
-    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 (int i = 1; i <= GetNOpenElements(); i++)
-      {
-	const Element2d & face = OpenElement(i);
-	for (j = 0; j < face.GetNP(); j++)
-	  dist[face[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++)
-      {
-	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]];
-      
-        el.flags.fixed = elmin > layers;
-	// 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)
-  {
-    if(hloc < hmin)
-      hloc = hmin;
-
-    //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)
-  {
-    if(hloc < hmin)
-      hloc = hmin;
-
-    // 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 :: SetMinimalH (double h)
-  {
-    hmin = h;
-  }
-
-
-  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 doesnt 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]];
-
-    for (int i = 0; i < facedecoding.Size(); i++)
-      facedecoding[i].firstelement = -1;
-    for (int i = surfelements.Size()-1; i >= 0; i--)
-      {
-        int ind = surfelements[i].GetIndex();
-        surfelements[i].next = facedecoding[ind-1].firstelement;
-        facedecoding[ind-1].firstelement = 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);
-    INDEX_2 i2, i2s, edge;
-    int err = 0;
-
-    for (int i = 1; i <= nf; i++)
-      {
-	const Element2d & sel = OpenElement(i);
-        
-	for (int 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);
-	  }
-      }
-
-    for (int i = 1; i <= edges.GetNBags(); i++)
-      for (int 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");
-
-	      (*testout) << "Edge " << i2 << " multiple times in surface mesh" << endl;
-	      i2s = i2;
-	      i2s.Sort();
-	      for (int k = 1; k <= nf; k++)
-		{
-		  const Element2d & sel = OpenElement(k);
-		  for (int l = 1; l <= sel.GetNP(); l++)
-		    {
-		      edge.I1() = sel.PNumMod(l);
-		      edge.I2() = sel.PNumMod(l+1);
-		      edge.Sort();
-
-		      if (edge == i2s) 
-			(*testout) << "edge of element " << sel << endl;
-		    }
-		}
-
-
-	      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 netgen::Point<3> *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;
-		PrintError ("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;
-		
-		(*testout) << "Face1 = " << GetFaceDescriptor(tri.GetIndex()) << endl;
-		(*testout) << "Face1 = " << GetFaceDescriptor(tri2.GetIndex()) << 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
-  {
-    // static int timer1 = NgProfiler::CreateTimer ("Legaltet2");
-
-
-    // Test, whether 4 points have a common surface plus
-    // at least 4 edges at the boundary
-
-    if(!boundaryedges)
-      const_cast<Mesh *>(this)->BuildBoundaryEdges();
-
-  
-    // non-tets are always legal
-    if (el.GetType() != TET)
-      {
-	el.SetLegal (1);
-	return 1;
-      }
-
-    POINTTYPE pointtype[4];
-    for(int i = 0; i < 4; i++)
-      pointtype[i] = (*this)[el[i]].Type();
-
-    
-
-    // element has at least 2 inner points ---> legal
-    int cnti = 0;
-    for (int j = 0; j < 4; j++)
-      if ( pointtype[j] == INNERPOINT)
-	{
-	  cnti++;
-	  if (cnti >= 2)
-	    {
-	      el.SetLegal (1);
-	      return 1;
-	    }
-	}
-
-
-
-    // which faces are boundary faces ?
-    int bface[4];
-    for (int i = 0; i < 4; i++)
-      {
-	bface[i] = surfelementht->Used (INDEX_3::Sort(el[gftetfacesa[i][0]],
-                                                      el[gftetfacesa[i][1]],
-                                                      el[gftetfacesa[i][2]]));
-      }
-
-    int bedge[4][4];
-    int segedge[4][4];
-    static const int pi3map[4][4] = { { -1,  2,  1,  1 },
-                                      {  2, -1,  0,  0 },
-                                      {  1,  0, -1,  0 },
-                                      {  1,  0,  0, -1 } };
-
-    static const int pi4map[4][4] = { { -1,  3,  3,  2 },
-                                      {  3, -1,  3,  2 },
-                                      {  3,  3, -1,  1 },
-                                      {  2,  2,  1, -1 } };
-
-    
-    for (int i = 0; i < 4; i++)
-      for (int j = 0; j < i; j++)
-	{
-	  bool sege = false, be = false;
-
-          int pos = boundaryedges -> Position(INDEX_2::Sort(el[i], el[j]));
-	  if (pos)
-	    {
-	      be = true;
-	      if (boundaryedges -> GetData(pos) == 2)
-		sege = true;
-	    }
-
-	  segedge[j][i] = segedge[i][j] = sege;
-	  bedge[j][i] = bedge[i][j] = be;
-	}
-
-    // two boundary faces and no edge is illegal
-    for (int i = 0; i < 3; i++)
-      for (int j = i+1; j < 4; j++)
-	{
-	  if (bface[i] && bface[j])
-            if (!segedge[pi3map[i][j]][pi4map[i][j]])
-              {
-                // 2 boundary faces withoud edge in between
-                el.SetLegal (0);
-                return 0;
-              }
-	}
-
-    // three boundary edges meeting in a Surface point
-    for (int i = 0; i < 4; i++)
-      {
-	bool alledges = 1;
-	if ( pointtype[i] == SURFACEPOINT)
-	  {
-            bool alledges = 1;
-	    for (int j = 0; j < 4; j++)
-	      if (j != i && !bedge[i][j])
-                {
-                  alledges = 0;
-                  break;
-                }
-	    if (alledges)
-	      {
-		// cout << "tet illegal due to unmarked node" << endl;
-		el.SetLegal (0);
-		return 0;
-	      }
-	  }
-      }
-
-
-
-    for (int fnr = 0; fnr < 4; fnr++)
-      if (!bface[fnr])
-        for (int i = 0; i < 4; i++)
-          if (i != fnr)
-            {
-              int pi1 = pi3map[i][fnr];
-              int pi2 = pi4map[i][fnr];
-
-              if ( pointtype[i] == SURFACEPOINT)
-                {
-                  // two connected edges on surface, but no face
-                  if (bedge[i][pi1] && bedge[i][pi2])
-                    {
-                      el.SetLegal (0);
-                      return 0;
-                    }
-                }
-
-              if ( pointtype[i] == EDGEPOINT)
-                {
-                  // connected surface edge and edge edge, but no face
-                  if (bedge[i][pi1] && segedge[i][pi2] ||
-                      bedge[i][pi2] && segedge[i][pi1])
-                    {
-                      el.SetLegal (0);
-                      return 0;
-                    }
-                }
-
-            }
-
-
-    el.SetLegal (1);
-    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()
-  {
-    PrintMessage (1, "Split To Tets");
-    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(TET);
-		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) cout << "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, 6, 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
-	  
-	    // cout << "pyramid: " << el << endl;
-	    
-	    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[0], el[2]) < min2 (el[1], el[3]))
-	      min2pi = &ntets[0][0];
-	    else
-	      min2pi = &ntets[1][0];
-
-	    bool firsttet = 1;
-	    for (int j = 0; j < 2; j++)
-	      {
-		Element nel(TET);
-		for (int k = 0; k < 4; k++)
-		  nel[k] = el[min2pi[4*j + k]-1];
-		nel.SetIndex (el.GetIndex());
-
-		// cout << "pyramid-tet: " << nel << endl;
-
-		bool legal = 1;
-		for (int k = 0; k < 3; k++)
-		  for (int l = k+1; l < 4; l++)
-		    if (nel[k] == nel[l])
-		      legal = 0;
-
-		if (legal)
-		  {
-		    (*testout) << nel << " ";
-		    if (firsttet)
-		      VolumeElement(i) = nel;
-		    else
-		      AddVolumeElement(nel);
-
-		    firsttet = 0;
-		  }
-	      }
-	    if (firsttet) cout << "no legal";
-	    (*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));
-	  }
-
-
-
-	UpdateTopology();
-	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();
-  }
-
-
-  
-  bool Mesh :: PointContainedIn2DElement(const Point3d & p,
-					 double lami[3],
-					 const int element,
-					 bool consider3D) const
-  {
-    static Vec3d col1, col2, col3;
-    static Vec3d rhs, sol;
-    const double eps = 1e-6;
-
-    static ARRAY<Element2d> loctrigs;
-
-
-    //SZ 
-    if(SurfaceElement(element).GetType()==QUAD)
-      {
-	const Element2d & el = SurfaceElement(element); 
-	      
-	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())-c.X()*(p.Y()-a.Y()))/
-	      (b.X()*c.Y() -b.Y()*c.X()); 
-	    lami[1]=(-b.Y()*(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.) return false; 
-		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 true;
-		  }
-		      
-		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)
-	  {
-	    if(consider3D)
-	      {
-		Vec3d n = Cross(b,c);
-		lami[2] = 0;
-		for(int i=1; i<=3; i++)
-		  lami[2] +=(p.X(i)-a.X(i)-lami[0]*b.X(i)-lami[1]*c.X(i)) * n.X(i);
-		if(lami[2] >= -eps && lami[2] <= eps)
-		  return true;
-	      }
-	    else
-	      return true;
-	  }
-		      
-	return false;
-	      
-      }
-    else
-      {
-	//	  SurfaceElement(element).GetTets (loctets);
-	loctrigs.SetSize(1);
-	loctrigs.Elem(1) = SurfaceElement(element);
-	      
-	      
-	      
-	for (int 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 = Cross(col1,col2);
-	    //col3 = Vec3d(0, 0, 1);
-	    rhs = p - p1;
-		  
-	    int retval = SolveLinearSystem (col1, col2, col3, rhs, sol);
-
-	    //(*testout) << "retval " << retval << endl;
-		  
-	    //(*testout) << "col1 " << col1 << " col2 " << col2 << " col3 " << col3 << " rhs " << rhs << endl;
-	    //(*testout) << "sol " << sol << endl;
-
-	    if (sol.X() >= -eps && sol.Y() >= -eps && 
-		sol.X() + sol.Y() <= 1+eps)
-	      {
-		if(!consider3D || (sol.Z() >= -eps && sol.Z() <= eps))
-		  {
-		    lami[0] = sol.X();
-		    lami[1] = sol.Y();
-		    lami[2] = sol.Z();
-		    
-		    return true;
-		  }
-	      }
-	  }
-      }
-
-    return false;
-
-  }
-
-
-
-
-  bool Mesh :: PointContainedIn3DElement(const Point3d & p,
-					 double lami[3],
-					 const int element) const
-  {
-    //bool oldresult = PointContainedIn3DElementOld(p,lami,element);
-    //(*testout) << "old result: " << oldresult
-    //       << " lam " << lami[0] << " " << lami[1] << " " << lami[2] << endl;
-
-    //if(!curvedelems->IsElementCurved(element-1))
-    //  return PointContainedIn3DElementOld(p,lami,element);
-
-
-    const double eps = 1.e-4;
-    const Element & el = VolumeElement(element);
-
-    netgen::Point<3> lam;
-
-    if (el.GetType() == TET)
-      {
-	lam = 0.25;
-      }
-    else if (el.GetType() == PRISM)
-      {
-	lam(0) = 0.33; lam(1) = 0.33; lam(2) = 0.5;
-      }
-    else if (el.GetType() == PYRAMID)
-      {
-	lam(0) = 0.4; lam(1) = 0.4; lam(2) = 0.2;
-      }
-    else if (el.GetType() == HEX)
-      {
-	lam = 0.5;
-      }
-    
-
-    Vec<3> deltalam,rhs;
-    netgen::Point<3> x;
-    Mat<3,3> Jac,Jact;
-
-    double delta=1;
-
-    bool retval;
-    
-    int i = 0;
-
-    const int maxits = 30;
-
-    while(delta > 1e-16 && i<maxits)
-      {
-	curvedelems->CalcElementTransformation(lam,element-1,x,Jac);
-
-	rhs = p-x;
-	Jac.Solve(rhs,deltalam);
-
-	lam += deltalam;
-
-	delta = deltalam.Length2();
-
-	i++;
-	//(*testout) << "pcie i " << i << " delta " << delta << " p " << p << " x " << x << " lam " << lam << endl;
-	//<< "Jac " << Jac << endl;
-      }
-
-    if(i==maxits)
-      return false;
-
-
-    for(i=0; i<3; i++)
-      lami[i] = lam(i);
-
-
-
-    if (el.GetType() == TET)
-      {
-	retval = (lam(0) > -eps && 
-		  lam(1) > -eps && 
-		  lam(2) > -eps && 
-		  lam(0) + lam(1) + lam(2) < 1+eps);
-      }
-    else if (el.GetType() == PRISM)
-      {
-	retval = (lam(0) > -eps &&
-		  lam(1) > -eps &&
-		  lam(2) > -eps &&
-		  lam(2) < 1+eps &&
-		  lam(0) + lam(1) < 1+eps);
-      }
-    else if (el.GetType() == PYRAMID)
-      {
-	retval = (lam(0) > -eps &&
-		  lam(1) > -eps &&
-		  lam(2) > -eps &&
-		  lam(0) + lam(2) < 1+eps &&
-		  lam(1) + lam(2) < 1+eps);
-      }
-    else if (el.GetType() == HEX)
-      {
-	retval = (lam(0) > -eps && lam(0) < 1+eps &&
-		  lam(1) > -eps && lam(1) < 1+eps &&
-		  lam(2) > -eps && lam(2) < 1+eps);
-      }
-    else
-      throw NgException("Da haun i wos vagessn");
-
-    return retval;
-  }
-  
-
-  
-  bool Mesh :: PointContainedIn3DElementOld(const Point3d & p,
-					    double lami[3],
-					    const int element) const
-  {
-
-    static Vec3d col1, col2, col3;
-    static Vec3d rhs, sol;
-    const double eps = 1.e-4;
-    
-    static ARRAY<Element> loctets;
-
-    VolumeElement(element).GetTets (loctets);
-    
-    for (int 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<netgen::Point<3> > pointsloc;
-	    
-	    VolumeElement(element).GetTetsLocal (loctetsloc);
-	    VolumeElement(element).GetNodesLocalNew (pointsloc);
-	    
-	    const Element & le = loctetsloc.Get(j);
-	   
-
-	    Point3d pp = 
-	      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] = pp.X();
-	    lami[1] = pp.Y();
-	    lami[2] = pp.Z();
-	    return true;
-	  }
-      }
-    return false;
-  }
- 
-
-  int Mesh :: GetElementOfPoint (const Point3d & p,
-				 double lami[3],
-				 bool build_searchtree,
-				 const int index,
-				 const bool allowindex) const
-  {
-    if(index != -1) 
-      {
-	ARRAY<int> dummy(1);
-	dummy[0] = index;
-	return GetElementOfPoint(p,lami,&dummy,build_searchtree,allowindex);
-      }
-    else
-      return GetElementOfPoint(p,lami,NULL,build_searchtree,allowindex);
-  }
-
-
-
-
-  int Mesh :: GetElementOfPoint (const Point3d & p,
-				 double lami[3],
-				 const ARRAY<int> * const indices,
-				 bool build_searchtree,
-				 const bool allowindex) const
-  {
-    if (dimension == 2)
-      {
-	int i, j;
-	int ne;
-      
-	
-	if(ps_startelement != 0 && ps_startelement <= GetNSE() && PointContainedIn2DElement(p,lami,ps_startelement))
-	  return ps_startelement;
-
-	ARRAY<int> locels;
-	if (0)
-	  {
-	    elementsearchtree->GetIntersecting (p, p, locels);
-	    ne = locels.Size();
-	  }
-	else
-	  ne = GetNSE();
-
-	for (i = 1; i <= ne; i++)
-	  {
-	    int ii;
-
-	    if (0)
-	      ii = locels.Get(i);
-	    else
-	      ii = i;
-	      
-	    if(ii == ps_startelement) continue;
-
-	    if(indices != NULL && indices->Size() > 0)
-	      {
-		bool contained = indices->Contains(SurfaceElement(ii).GetIndex());
-		if((allowindex && !contained) || (!allowindex && contained)) continue;
-	      }
-
-	    if(PointContainedIn2DElement(p,lami,ii)) return ii;
-
-	  }
-	return 0;
-      }
-    else
-      
-      {
-	int i, j;
-	int ne;
-      
-	if(ps_startelement != 0 && PointContainedIn3DElement(p,lami,ps_startelement))
-	  return ps_startelement;
-
-	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();
-      
-	for (i = 1; i <= ne; i++)
-	  {
-	    int ii;
-
-	    if (elementsearchtree)
-	      ii = locels.Get(i);
-	    else
-	      ii = i;
-	      
-	    if(ii == ps_startelement) continue;
-	    
-	    if(indices != NULL && indices->Size() > 0)
-	      {
-		bool contained = indices->Contains(VolumeElement(ii).GetIndex());
-		if((allowindex && !contained) || (!allowindex && contained)) continue;
-	      }
-	    
-	  
-	    if(PointContainedIn3DElement(p,lami,ii)) 
-	      {
-		ps_startelement = ii;
-		return ii;
-	      }
-	  }
-
-	// Not found, try uncurved variant:
-	for (i = 1; i <= ne; i++)
-	  {
-	    int ii;
-
-	    if (elementsearchtree)
-	      ii = locels.Get(i);
-	    else
-	      ii = i;
-	    
-	    if(indices != NULL && indices->Size() > 0)
-	      {
-		bool contained = indices->Contains(VolumeElement(ii).GetIndex());
-		if((allowindex && !contained) || (!allowindex && contained)) continue;
-	      }
-	    
-	  
-	    if(PointContainedIn3DElementOld(p,lami,ii)) 
-	      {
-		ps_startelement = ii;
-		(*testout) << "WARNING: found element of point " << p <<" only for uncurved mesh" << endl;
-		return ii;
-	      }
-	  }
-
-      
-	return 0;
-      }
-  }
-
-
-
-  int Mesh :: GetSurfaceElementOfPoint (const Point3d & p,
-					double lami[3],
-					bool build_searchtree,
-					const int index,
-					const bool allowindex) const
-  {
-    if(index != -1) 
-      {
-	ARRAY<int> dummy(1);
-	dummy[0] = index;
-	return GetSurfaceElementOfPoint(p,lami,&dummy,build_searchtree,allowindex);
-      }
-    else
-      return GetSurfaceElementOfPoint(p,lami,NULL,build_searchtree,allowindex);
-  }
-
-
-
-
-  int Mesh :: GetSurfaceElementOfPoint (const Point3d & p,
-					double lami[3],
-					const ARRAY<int> * const indices,
-					bool build_searchtree,
-					const bool allowindex) const
-  {
-    if (dimension == 2)
-      {
-	throw NgException("GetSurfaceElementOfPoint not yet implemented for 2D meshes");
-      }
-    else
-      {
-	double vlam[3];
-	int velement = GetElementOfPoint(p,vlam,NULL,build_searchtree,allowindex);
-
-	//(*testout) << "p " << p << endl;
-	//(*testout) << "velement " << velement << endl;
-
-	ARRAY<int> faces;
-	topology->GetElementFaces(velement,faces);
-
-	//(*testout) << "faces " << faces << endl;
-
-	for(int i=0; i<faces.Size(); i++)
-	  faces[i] = topology->GetFace2SurfaceElement(faces[i]);
-
-	//(*testout) << "surfel " << faces << endl;
-
-	for(int i=0; i<faces.Size(); i++)
-	  {
-	    if(faces[i] == 0)
-	      continue;
-
-	    if(indices && indices->Size() != 0)
-	      {
-		if(indices->Contains(SurfaceElement(faces[i]).GetIndex()) &&
-		   PointContainedIn2DElement(p,lami,faces[i],true))
-		  return faces[i];
-	      }
-	    else
-	      {
-		if(PointContainedIn2DElement(p,lami,faces[i],true))
-		  {
-		    //(*testout) << "found point " << p << " in sel " << faces[i]
-		    //	       << ", lam " << lami[0] << ", " << lami[1] << ", " << lami[2] << endl;
-		    return faces[i];
-		  }
-	      }
-	  }
-	     
-      }
-
-    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 ()
-  {
-    PrintMessage (3, "SplitSeparateFaces");
-    int fdi;
-    int np = GetNP();
-
-    BitArray usedp(np);
-    ARRAY<SurfaceElementIndex> els_of_face;
-
-    fdi = 1;
-    while (fdi <= GetNFD())
-      {
-	GetSurfaceElementsOfFace (fdi, els_of_face);
-
-	if (els_of_face.Size() == 0) continue;
-
-	SurfaceElementIndex firstel = els_of_face[0];
-
-	usedp.Clear();
-	for (int j = 1; j <= SurfaceElement(firstel).GetNP(); j++)
-	  usedp.Set (SurfaceElement(firstel).PNum(j));
-
-	bool changed;
-	do
-	  {
-	    changed = false;
-
-	    for (int i = 0; i < els_of_face.Size(); i++)
-	      {
-		const Element2d & el = SurfaceElement(els_of_face[i]);
-
-		bool has = 0;
-		bool hasno = 0;
-		for (int j = 0; j < el.GetNP(); j++)
-		  {
-		    if (usedp.Test(el[j]))
-		      has = true;
-		    else
-		      hasno = true;
-		  }
-
-		if (has && hasno)
-		  changed = true;
-
-		if (has)
-		  for (int j = 0; j < el.GetNP(); j++)
-		    usedp.Set (el[j]);
-	      }
-	  }
-	while (changed);
-
-	int nface = 0;
-	for (int i = 0; i < els_of_face.Size(); i++)
-	  {
-	    Element2d & el = SurfaceElement(els_of_face[i]);
-
-	    int hasno = 0;
-	    for (int 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);
-	      }
-	  }
-
-        // reconnect list
-        if (nface)
-          {
-            facedecoding[nface-1].firstelement = -1;
-            facedecoding[fdi-1].firstelement = -1;
-
-            for (int i = 0; i < els_of_face.Size(); i++)
-              {
-                int ind = SurfaceElement(els_of_face[i]).GetIndex();
-                SurfaceElement(els_of_face[i]).next = facedecoding[ind-1].firstelement;
-                facedecoding[ind-1].firstelement = els_of_face[i];
-              }
-          }
-
-	fdi++;
-      }
-
-
-    /*
-    fdi = 1;
-    while (fdi <= GetNFD())
-      {
-	int firstel = 0;
-	for (int i = 1; i <= GetNSE(); i++)
-	  if (SurfaceElement(i).GetIndex() == fdi)
-	    {
-	      firstel = i;
-	      break;
-	    }
-	if (!firstel) continue;
-
-	usedp.Clear();
-	for (int j = 1; j <= SurfaceElement(firstel).GetNP(); j++)
-	  usedp.Set (SurfaceElement(firstel).PNum(j));
-
-	int changed;
-	do
-	  {
-	    changed = 0;
-	    for (int i = 1; i <= GetNSE(); i++)
-	      {
-		const Element2d & el = SurfaceElement(i);
-		if (el.GetIndex() != fdi)
-		  continue;
-
-		int has = 0;
-		int hasno = 0;
-		for (int 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 (int j = 1; j <= el.GetNP(); j++)
-		    usedp.Set (el.PNum(j));
-	      }
-	  }
-	while (changed);
-
-	int nface = 0;
-	for (int i = 1; i <= GetNSE(); i++)
-	  {
-	    Element2d & el = SurfaceElement(i);
-	    if (el.GetIndex() != fdi)
-	      continue;	  
-
-	    int hasno = 0;
-	    for (int 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
-  {
-    static int timer = NgProfiler::CreateTimer ("GetSurfaceElementsOfFace");
-    NgProfiler::RegionTimer reg (timer);
-
-    /*
-    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);
-
-    int size1 = sei.Size();
-    */
-
-    sei.SetSize(0);
-
-    SurfaceElementIndex si = facedecoding[facenr-1].firstelement;
-    while (si != -1)
-      {
-        if ( (*this)[si].GetIndex () == facenr && (*this)[si][0] >= PointIndex::BASE &&
-             !(*this)[si].IsDeleted() )
-          {
-            sei.Append (si);
-          }
-
-        si = (*this)[si].next;
-      }
-
-    /*
-     // *testout << "with list = " << endl << sei << endl;
-
-    if (size1 != sei.Size()) 
-      {
-        cout << "size mismatch" << endl;
-        exit(1);
-      }
-    */
-  }
-
-
-
-
-  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 :: InitPointCurve(double red, double green, double blue) const
-  {
-    pointcurves_startpoint.Append(pointcurves.Size());
-    pointcurves_red.Append(red);
-    pointcurves_green.Append(green);
-    pointcurves_blue.Append(blue);
-  }
-  void Mesh :: AddPointCurvePoint(const Point3d & pt) const
-  {
-    pointcurves.Append(pt);
-  }
-  int Mesh :: GetNumPointCurves(void) const
-  {
-    return pointcurves_startpoint.Size();
-  }
-  int Mesh :: GetNumPointsOfPointCurve(int curve) const
-  {
-    if(curve == pointcurves_startpoint.Size()-1)
-      return (pointcurves.Size() - pointcurves_startpoint.Last());
-    else
-      return (pointcurves_startpoint[curve+1]-pointcurves_startpoint[curve]);
-  }
-
-  Point3d & Mesh :: GetPointCurvePoint(int curve, int n) const
-  {
-    return pointcurves[pointcurves_startpoint[curve]+n];
-  }
-
-  void Mesh :: GetPointCurveColor(int curve, double & red, double & green, double & blue) const
-  {
-    red = pointcurves_red[curve];
-    green = pointcurves_green[curve];
-    blue = pointcurves_blue[curve];
-  }
-  
-
-  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 ::SetNBCNames ( int nbcn )
-  {
-    if ( bcnames.Size() )
-      for ( int i = 0; i < bcnames.Size(); i++)
-	if ( bcnames[i] ) delete bcnames[i];
-    bcnames.SetSize(nbcn);
-    bcnames = 0;
-  }
-
-  void Mesh ::SetBCName ( int bcnr, const string & abcname )
-  {
-    if ( bcnames[bcnr] ) delete bcnames[bcnr];
-    if ( abcname != "default" )
-      bcnames[bcnr] = new string ( abcname );
-    else
-      bcnames[bcnr] = 0;
-  }
-
-  string Mesh ::GetBCName ( int bcnr ) const
-  {
-    if ( !bcnames.Size() )
-      return "default";
-    if ( bcnames[bcnr] )
-      return *bcnames[bcnr];
-    else
-      return "default";
-  }
-
-  void Mesh :: SetUserData(const char * id, ARRAY<int> & data)
-  {
-    if(userdata_int.Used(id))
-      delete userdata_int.Get(id);
-
-    ARRAY<int> * newdata = new ARRAY<int>(data);
-
-    userdata_int.Set(id,newdata);      
-  }
-  bool Mesh :: GetUserData(const char * id, ARRAY<int> & data, int shift) const
-  {
-    if(userdata_int.Used(id))
-      {
-	if(data.Size() < (*userdata_int.Get(id)).Size()+shift)
-	  data.SetSize((*userdata_int.Get(id)).Size()+shift);
-	for(int i=0; i<(*userdata_int.Get(id)).Size(); i++)
-	  data[i+shift] = (*userdata_int.Get(id))[i];
-	return true;
-      }
-    else
-      {
-	data.SetSize(0);
-	return false;
-      }
-  }
-  void Mesh :: SetUserData(const char * id, ARRAY<double> & data)
-  {
-    if(userdata_double.Used(id))
-      delete userdata_double.Get(id);
-
-    ARRAY<double> * newdata = new ARRAY<double>(data);
-
-    userdata_double.Set(id,newdata);      
-  }
-  bool Mesh :: GetUserData(const char * id, ARRAY<double> & data, int shift) const
-  {
-    if(userdata_double.Used(id))
-      {
-	if(data.Size() < (*userdata_double.Get(id)).Size()+shift)
-	  data.SetSize((*userdata_double.Get(id)).Size()+shift);
-	for(int i=0; i<(*userdata_double.Get(id)).Size(); i++)
-	  data[i+shift] = (*userdata_double.Get(id))[i];
-	return true;
-      }
-    else
-      {
-	data.SetSize(0);
-	return false;
-      }
-  }
-  
-
-
-  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 4dab869d3427a49f8470ef101a85c1583f39ae89..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshclass.hpp
+++ /dev/null
@@ -1,777 +0,0 @@
-#ifndef MESHCLASS
-#define MESHCLASS
-
-/**************************************************************************/
-/* File:   meshclass.hpp                                                  */
-/* 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,PointIndex::BASE> 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 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;
-  ///
-  double hmin;
-  ///
-  ARRAY<double> maxhdomain;
-  
-  /**
-     the face-index of the surface element maps into
-     this table.
-  */
-  ARRAY<FaceDescriptor> facedecoding;
-
-  /// sub-domain materials 
-  ARRAY<char*> materials;
-
-  ARRAY<string*, 0> bcnames;
-
-  /// 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 semaphors.
-  NgMutex mutex;
-  /// mesh access semaphors.
-  NgMutex majormutex;
-
-  SYMBOLTABLE< ARRAY<int>* > userdata_int;
-  SYMBOLTABLE< ARRAY<double>* > userdata_double; 
-
-
-  mutable ARRAY< Point3d > pointcurves;
-  mutable ARRAY<int> pointcurves_startpoint;
-  mutable ARRAY<double> pointcurves_red,pointcurves_green,pointcurves_blue;
-
-
-  /// start element for point search (GetElementOfPoint)
-  mutable int ps_startelement;
-
-
-#ifdef PARALLEL
-  /// connection to parallel meshes
-  class ParallelMeshTopology * paralleltop;
-
-#endif
-
-
-private:
-  void BuildBoundaryEdges(void);
-
-public:
-  bool PointContainedIn2DElement(const Point3d & p,
-				 double lami[3],
-				 const int element,
-				 bool consider3D = false) const;
-  bool PointContainedIn3DElement(const Point3d & p,
-				 double lami[3],
-				 const int element) const;
-  bool PointContainedIn3DElementOld(const Point3d & p,
-				    double lami[3],
-				    const int element) const;
-
-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;
-
-  void SetAllocSize(int nnodes, int nsegs, int nsel, int nel);
-
-
-  PointIndex AddPoint (const Point3d & p, int layer = 1);
-  PointIndex AddPoint (const Point3d & p, int layer, POINTTYPE type);
-#ifdef PARALLEL
-  PointIndex AddPoint (const Point3d & p, bool aisghost, int layer = 1);
-  PointIndex AddPoint (const Point3d & p, bool aisghost, int layer, POINTTYPE type);
-#endif
-  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]; }
-
-  const T_POINTS & Points() const { return points; }
-  T_POINTS & Points() { return points; }
-
-
-  SegmentIndex AddSegment (const Segment & s);
-  void DeleteSegment (int segnr)
-  {
-    segments.Elem(segnr).p1 = PointIndex::BASE-1;
-    segments.Elem(segnr).p2 = PointIndex::BASE-1;
-  }
-  void FullDeleteSegment (int segnr)
-  {
-    segments.Delete(segnr-PointIndex::BASE);
-  }
-
-  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 (int i) const 
-  // { return (volelements.Get(i).fixed) ? FIXEDELEMENT : FREEELEMENT; }
-
-  ELEMENTTYPE ElementType (ElementIndex i) const 
-  { return (volelements[i].flags.fixed) ? FIXEDELEMENT : FREEELEMENT; }
-
-  /*
-  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);
-  ///
-  void SetMinimalH (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; }
-  ///
-  bool LocalHFunctionGenerated(void) const { return (lochfunc != NULL); }
-
-  /// 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
-  bool 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
-  {
-    if(!boundaryedges)
-      const_cast<Mesh *>(this)->BuildBoundaryEdges();
-
-    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 (ostream & outfile) const;
-  ///
-  void Load (istream & infile);
-  ///
-  void Merge (istream & infile, const int surfindex_offset = 0);
-  ///
-  void Save (const string & filename) const;
-  ///
-  void Load (const string & filename);
-  ///
-  void Merge (const string & filename, const int surfindex_offset = 0);
-
-
-  ///
-  void ImproveMesh (OPTIMIZEGOAL goal = OPT_QUALITY);
-
-  ///
-  void ImproveMeshJacobian (OPTIMIZEGOAL goal = OPT_QUALITY, const BitArray * usepoint = NULL);
-  ///
-  void ImproveMeshJacobianOnSurface (const BitArray & usepoint, 
-				     const ARRAY< Vec<3>* > & nv,
-				     OPTIMIZEGOAL goal = OPT_QUALITY,
-				     const ARRAY< ARRAY<int,PointIndex::BASE>* > * idmaps = NULL);
-  /*
-#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 ();
-
-  void SetPointSearchStartElement(const int el) const {ps_startelement = el;}
-
-  /// gives element of point, barycentric coordinates
-  int GetElementOfPoint (const Point3d & p,
-			 double * lami,
-			 bool build_searchtree = 0,
-			 const int index = -1,
-			 const bool allowindex = true) const;
-  int GetElementOfPoint (const Point3d & p,
-			 double * lami,
-			 const ARRAY<int> * const indices,
-			 bool build_searchtree = 0,
-			 const bool allowindex = true) const;
-  int GetSurfaceElementOfPoint (const Point3d & p,
-				double * lami,
-				bool build_searchtree = 0,
-				const int index = -1,
-				const bool allowindex = true) const;
-  int GetSurfaceElementOfPoint (const Point3d & p,
-				double * lami,
-				const ARRAY<int> * const indices,
-				bool build_searchtree = 0,
-				const bool allowindex = true) 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 SetNBCNames ( int nbcn );
-
-  void SetBCName ( int bcnr, const string & abcname );
-
-  string GetBCName ( int bcnr ) const;
-
-  string * GetBCNamePtr ( int bcnr )
-  { return bcnames[bcnr]; }
-
-  ///
-  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; }
-
-
-  void InitPointCurve(double red = 1, double green = 0, double blue = 0) const;
-  void AddPointCurvePoint(const Point3d & pt) const;
-  int GetNumPointCurves(void) const;
-  int GetNumPointsOfPointCurve(int curve) const;
-  Point3d & GetPointCurvePoint(int curve, int n) const;
-  void GetPointCurveColor(int curve, double & red, double & green, double & blue) const;
-
-
-
-
-  /// 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; }
-  NgMutex & MajorMutex ()   { return majormutex; }
-
-
-  ///
-  void SetUserData(const char * id, ARRAY<int> & data);
-  ///
-  bool GetUserData(const char * id, ARRAY<int> & data, int shift = 0) const;
-  ///
-  void SetUserData(const char * id, ARRAY<double> & data);
-  ///
-  bool GetUserData(const char * id, ARRAY<double> & data, int shift = 0) const;
-
-  ///
-  friend void OptimizeRestart (Mesh & mesh3d);
-  ///
-  void PrintMemInfo (ostream & ost) const;
-  /// 
-  friend class Meshing3;
-
-
-  enum GEOM_TYPE { NO_GEOM = 0, GEOM_2D = 1, GEOM_CSG = 10, GEOM_STL = 11, GEOM_OCC = 12, GEOM_ACIS = 13 };
-  GEOM_TYPE geomtype;
-  
-
-
-#ifdef PARALLEL
-  /// returns parallel topology
-  class ParallelMeshTopology & GetParallelTopology () const
-  { return *paralleltop; }
-
-
-  /// distributes the master-mesh to local meshes
-  void Distribute ();
-
-  /// loads a mesh sent from master processor
-  void ReceiveParallelMesh ();
-
-  /// find connection to parallel meshes
-//   void FindExchangePoints () ;
-
-//   void FindExchangeEdges ();
-//   void FindExchangeFaces ();
-
-  /// use metis to decompose master mesh 
-  void ParallelMetis (); //  ARRAY<int> & neloc );
-  void PartHybridMesh (); //  ARRAY<int> & neloc );
-  void PartDualHybridMesh (); //  ARRAY<int> & neloc );
-  void PartDualHybridMesh2D ();  // ( ARRAY<int> & neloc );
-
-  /// send mesh to parallel machine, keep global mesh at master 
-  void SendMesh ( ) const;   // Mesh * mastermesh, ARRAY<int> & neloc) const;
-
-  void UpdateOverlap ();
- 
-#endif
-
-
-};
-
-inline ostream& operator<<(ostream& ost, const Mesh& mesh)
-{
-  ost << "mesh: " << endl;
-  mesh.Save(ost);
-  return ost;
-}
-
-
-#endif
-
-
diff --git a/contrib/Netgen/libsrc/meshing/meshfunc.cpp b/contrib/Netgen/libsrc/meshing/meshfunc.cpp
deleted file mode 100644
index 06fb451dd4c999e1447e2ee1fcd02a0b59aed086..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshfunc.cpp
+++ /dev/null
@@ -1,725 +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 (mp.checkoverlappingboundary)
-      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() != 0);
-	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());
-	(*testout) << "Meshing subdomain " << k << endl;
- 
-	mp.maxh = min2 (globmaxh, mesh3d.MaxHDomain(k));
-
-	mesh3d.CalcSurfacesOfNode();
-	mesh3d.FindOpenElements(k);
-
-	if (!mesh3d.GetNOpenElements())
-	  continue;
-
-
-	
-	Box<3> domain_bbox( Box<3>::EMPTY_BOX ); 
-        /*
-        Point<3> (1e10, 1e10, 1e10),
-        Point<3> (-1e10, -1e10, -1e10));
-        */
-
-	for (SurfaceElementIndex sei = 0; sei < mesh3d.GetNSE(); sei++)
-	  {
-	    const Element2d & el = mesh3d[sei];
-	    if (el.IsDeleted() ) continue;
-	    
-	    if (mesh3d.GetFaceDescriptor(el.GetIndex()).DomainIn() == k ||
-		mesh3d.GetFaceDescriptor(el.GetIndex()).DomainOut() == k)
-
-	      for (int j = 0; j < el.GetNP(); j++)
-		domain_bbox.Add (mesh3d[el[j]]);
-	  }
-	domain_bbox.Increase (0.01 * domain_bbox.Diam());
-
-
-	for (int 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 = 1000;
-		mpquad.check_impossible = qstep == 1;   // for prisms only (air domain in trafo)
-
-
-		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/pyramid 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, k, mp);
-
-	    for (i = oldne + 1; i <= mesh3d.GetNE(); i++)
-	      mesh3d.VolumeElement(i).SetIndex (k);
-
-	    PrintMessage (3, mesh3d.GetNP(), " points, ",
-			  mesh3d.GetNE(), " elements");
-	  }
-
-
-	cntsteps = 0;
-	if (mesh3d.GetNOpenElements())
-	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);
-      
-	    ARRAY<int, PointIndex::BASE> glob2loc(mesh3d.GetNP());
-	    glob2loc = -1;
-            
-	    for (pi = PointIndex::BASE; 
-		 pi < mesh3d.GetNP()+PointIndex::BASE; pi++)
-	      
-	      if (domain_bbox.IsIn (mesh3d[pi]))
-		glob2loc[pi] = 
-		  meshing.AddPoint (mesh3d[pi], pi);
-
-	    for (i = 1; i <= mesh3d.GetNOpenElements(); i++)
-	      {
-		Element2d hel = mesh3d.OpenElement(i);
-		for (int j = 0; j < hel.GetNP(); j++)
-		  hel[j] = glob2loc[hel[j]];
-		meshing.AddBoundaryElement (hel);
-	    // meshing.AddBoundaryElement (mesh3d.OpenElement(i));
-	      }
-
-	    oldne = mesh3d.GetNE();
-
-	    mp.giveuptol = 15 + 10 * cntsteps; 
-	    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";
-		size_t j;
-		for (j = 1; j <= strlen(optstr); j++)
-		  {
-		    mesh3d.CalcSurfacesOfNode();
-		    mesh3d.FreeOpenElementsEnvironment(2);
-		    mesh3d.CalcSurfacesOfNode();
-
-		    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, k);
-		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;
-
-    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 (size_t 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 'u': optmesh.SwapImproveSurface(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;
-	      }
-	  }
-	mesh3d.mglevels = 1;
-	MeshQuality3d (mesh3d);
-      }
-  
-    return MESHING3_OK;
-  }
-
-
-
-
-  void RemoveIllegalElements (Mesh & mesh3d)
-  {
-    int it = 10;
-    int nillegal, oldn;
-
-    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 ac4fbe8e928691ea24301a0e36f306379ca31dc8..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;
-
-    //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 (size_t 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 10b77f9e18d7129da0403919eea59d2e9520e7cb..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef FILE_MESHING
-#define FILE_MESHING
-
-
-
-#define CURVEDELEMS_NEW
-
-
-#include "../include/myadt.hpp"
-#include "../include/gprim.hpp"
-#include "../include/linalg.hpp"
-#include "../include/opti.hpp"
-
-
-
-
-namespace netgen
-{
-
-  extern int printmessage_importance;
-
-  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 "findip2.hpp"
-
-#include "topology.hpp"
-
-#ifdef CURVEDELEMS_NEW
-#include "curvedelems_new.hpp"
-#else
-#include "curvedelems.hpp"
-#endif
-#include "clusters.hpp"
-
-#ifdef _INCLUDE_MORE
-#include "meshfunc.hpp"
-#endif
-#include "bisect.hpp"
-#include "hprefinement.hpp"
-#include "boundarylayer.hpp"
-#include "specials.hpp"
-
-#include "validate.hpp"
-
-#ifdef PARALLEL
-#include "../parallel/paralleltop.hpp"
-// #include "../parallel/parallelmesh.hpp"
-#endif
-
-
-
-}
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/meshing2.cpp b/contrib/Netgen/libsrc/meshing/meshing2.cpp
deleted file mode 100644
index 7793ecbbfa383846485c3d8161a21ef39197909a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing2.cpp
+++ /dev/null
@@ -1,1890 +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 Box<3> & aboundingbox)
-  {
-    boundingbox = aboundingbox;
-
-    LoadRules (NULL);
-    // LoadRules ("rules/quad.rls");
-    // LoadRules ("rules/triangle.rls");
-
-    adfront = new AdFront2(boundingbox);
-    starttime = GetTime();
-
-    maxarea = -1;
-  }
-
-
-  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,
-			     bool pointonsurface)
-  {
-    //(*testout) << "add point " << globind << endl;
-    adfront ->AddPoint (p, globind, mgi, pointonsurface);
-  }
-
-  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-1, i2-1, 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;
-  }
-
-  
-  void Meshing2 :: SetMaxArea (double amaxarea)
-  {
-    maxarea = amaxarea;
-  }
-
-
-  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 (const Point3d & p1, const 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 z1, z2, oldnp(-1);
-    SurfaceElementIndex sei;
-    bool found;
-    int rulenr(-1);
-    int globind;
-    Point<3> 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(-1), maxlegalline(-1);
-    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)
-	  {
-	    Box<3> box;
-	    box.Set ( mesh[sel[0]] );
-	    box.Add ( mesh[sel[1]] );
-	    box.Add ( mesh[sel[2]] );
-	    surfeltree.Insert (box, sei);
-	  }
-      
-	double trigarea = Cross ( mesh[sel[1]]-mesh[sel[0]],
-				  mesh[sel[2]]-mesh[sel[0]] ).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;
-      }
-
-
-    const char * savetask = multithread.task;
-    multithread.task = "Surface meshing";
-
-    adfront ->SetStartFront ();
-
-
-    int plotnexttrial = 999;
-
-    double meshedarea_before = meshedarea;
-
-    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 (int 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";
-	  }
-
-
-	int baselineindex = adfront -> SelectBaseLine (p1, p2, blgeominfo1, blgeominfo2, qualclass);
-
-
-	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);
-	//(*testout) << "h for locals: " << 2*hinner << endl;
-	
-
-	//(*testout) << "locpoints " << locpoints << endl;
-
-	if (qualclass > mparam.giveuptol2d)
-	  {
-	    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 (int 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) << "transform " << locpoints.Get(i) << " to " << 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 (int 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 (-1);
-			    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 (int i = 1; i <= legalpoints.Size(); i++)
-	      legalpoints.Elem(i) = 1;
-
-	    double avy = 0;
-	    for (int i = 1; i <= plainpoints.Size(); i++)
-	      avy += plainpoints.Elem(i).Y();
-	    avy *= 1./plainpoints.Size();
-		
-
-	    for (int 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) == -1)
-		  {
-		    legalpoints.Elem(i) = 0;
-		  }
-		    
-
-		if (plainpoints.Elem(i).Y() < -1e-10*avy) // changed
-		  {
-		    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 (int i = 1; i <= chartboundpoints.Size(); i++)
-		  {
-		    plainpoints.Append (chartboundpoints.Get(i));
-		    locpoints.Append (chartboundpoints3d.Get(i));
-		    legalpoints.Append (0);
-		  }
-	      
-
-		for (int 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 (int i = 1; i <= locelements.Size() && found; i++)
-	  {
-	    const Element2d & el = locelements.Get(i);
-
-	    for (int j = 1; j <= el.GetNP(); j++)
-	      if (el.PNum(j) <= oldnp && pindex.Get(el.PNum(j)) == -1)
-		{
-		  found = 0;
-		  PrintSysError ("meshing2, index missing");
-		}
-	  }
-
-
-	if (found)
-	  {
-	    locpoints.SetSize (plainpoints.Size());
-	    upgeominfo.SetSize(locpoints.Size());
-
-	    for (int 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 (int i = oldnl+1; i <= loclines.Size(); i++)
-	      {
-		double eh = Dist (locpoints.Get(loclines.Get(i).I1()),
-				  locpoints.Get(loclines.Get(i).I2()));
-
-		// Markus (brute force method to avoid bad elements on geometries like \_/ )
-		//if(eh > 4.*mesh.GetH(locpoints.Get(loclines.Get(i).I1()))) found = 0;
-		//if(eh > 4.*mesh.GetH(locpoints.Get(loclines.Get(i).I2()))) found = 0;
-		// Markus end
-
-		if (eh > newedgemaxh)
-		  newedgemaxh = eh;
-	      }
-
-	    for (int i = 1; i <= locelements.Size(); i++)
-	      {
-		Point3d pmin = locpoints.Get(locelements.Get(i).PNum(1));
-		Point3d pmax = pmin;
-		for (int 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 (int i = 1; i <= locelements.Size(); i++)
-	      for (int 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 (int i = 1; i <= locelements.Size(); i++)
-	      for (int 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 (int i = 1; i <= locelements.Size(); i++)
-	      for (int 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 (int i = oldnp+1; i <= locpoints.Size(); i++)
-	      critpoints.Append (locpoints.Get(i));
-
-	    for (int 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 (int 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++)
-		  {
-		    int 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 (int 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 (int 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 (int i = oldnp+1; i <= locpoints.Size(); i++)
-	      {
-		globind = mesh.AddPoint (locpoints.Get(i));
-		pindex.Elem(i) = adfront -> AddPoint (locpoints.Get(i), globind);
-	      }
-	      
-	    for (int 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()) == -1 || 
-		    pindex.Get(loclines.Get(i).I2()) == -1)
-		  {
-		    (*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 (int 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 (int 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 (int 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;
-
-
-	      
-		Box<3> box;
-		box.Set (mesh[mtri[0]]);
-		box.Add (mesh[mtri[1]]);
-		box.Add (mesh[mtri[2]]);
-		surfeltree.Insert (box, mesh.GetNSE());
-
-		const Point3d & sep1 = mesh.Point (mtri.PNum(1));
-		const Point3d & sep2 = mesh.Point (mtri.PNum(2));
-		const Point3d & sep3 = mesh.Point (mtri.PNum(3));
-
-		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;
-
-		if(maxarea > 0 && meshedarea-meshedarea_before > maxarea)
-		  {
-		    cerr << "meshed area = " << meshedarea-meshedarea_before << endl
-			 << "maximal area = " << maxarea << endl
-			 << "GIVING UP" << endl;
-		    return MESHING2_GIVEUP;
-		  }
-	      
-
-
-		for (int 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 (int 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 (int 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 )
-	      {
-		// adfront -> PrintOpenSegments (*testout);
-		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) << "locpoints " << endl;
-		for (int i = 1; i <= pindex.Size(); i++)
-		  (*testout) << adfront->GetGlobalIndex (pindex.Get(i)) << endl;
-
-		(*testout) << "old number of lines = " << oldnl << endl;
-		for (int i = 1; i <= loclines.Size(); i++)
-		  {
-		    (*testout) << "line ";
-		    for (int 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 (int i = 1; i <= loclines.Size(); i++)
-		  {
-		    (*testout) << "line ";
-		    for (int 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);
-  glEnable (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 0912fa34c66325e01aa317be08d89a3b3a64c504..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing2.hpp
+++ /dev/null
@@ -1,156 +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;
-  /// 
-  Box<3> boundingbox;
-  ///
-  double starttime;
-  ///
-  double maxarea;
-
-public:
-  ///
-  Meshing2 (const Box<3> & 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,
-		 bool pointonsurface = true);
-
-  ///
-  void AddBoundaryElement (INDEX i1, INDEX i2,
-			   const PointGeomInfo & gi1, const PointGeomInfo & gi2);
-  
-  ///
-  void SetStartTime (double astarttime);
-
-  ///
-  void SetMaxArea (double amaxarea);
-
-protected:
-  ///
-  virtual void StartMesh ();
-  ///
-  virtual void EndMesh ();
-  ///
-  virtual double CalcLocalH (const Point3d & p, double gh) const;
-
-  ///
-  virtual void DefineTransformation (const Point3d & p1, const 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 075fd6b384b97db7ff7ff8cf1cfaec5f4933bdd5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing3.cpp
+++ /dev/null
@@ -1,1292 +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<MiniElement2d> & 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)
-{
-  MiniElement2d mini(elem.GetNP());
-  for (int j = 0; j < elem.GetNP(); j++)
-    mini[j] = elem[j];
-  adfront -> AddFace(mini);
-}  
-
-
-void Meshing3 :: AddBoundaryElement (const MiniElement2d & elem)
-{
-  adfront -> AddFace(elem);
-}
-
-int Meshing3 :: AddConnectedPair (const INDEX_2 & apair)
-{
-  return adfront -> AddConnectedPair (apair);
-}
-
-MESHING3_RESULT Meshing3 :: 
-GenerateMesh (Mesh & mesh, const MeshingParameters & mp)
-{
-  static int meshing3_timer = NgProfiler::CreateTimer ("Meshing3::GenerateMesh");
-  static int meshing3_timer_a = NgProfiler::CreateTimer ("Meshing3::GenerateMesh a");
-  static int meshing3_timer_b = NgProfiler::CreateTimer ("Meshing3::GenerateMesh b");
-  static int meshing3_timer_c = NgProfiler::CreateTimer ("Meshing3::GenerateMesh c");
-  static int meshing3_timer_d = NgProfiler::CreateTimer ("Meshing3::GenerateMesh d");
-  NgProfiler::RegionTimer reg (meshing3_timer);
-
-
-  ARRAY<Point3d > locpoints;      // local points
-  ARRAY<MiniElement2d> 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
-  
-  bool loktestmode = false;
-
-  int uselocalh = mp.uselocalh;
-
-  // int giveuptol = mp.giveuptol; // 
-  MeshingStat3d stat;      // statistics
-  int plotstat_oldne = -1;
-
-  
-  // for star-shaped domain meshing
-  ARRAY<MeshPoint> grouppoints;      
-  ARRAY<MiniElement2d> groupfaces;
-  ARRAY<PointIndex> grouppindex;
-  ARRAY<INDEX> groupfindex;
-  
-  
-  float minerr;
-  int hasfound;
-  double tetvol;
-  // int giveup = 0;
-
-  
-  ARRAY<Point3d> tempnewpoints;
-  ARRAY<MiniElement2d> 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");
-
-      // 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 MiniElement2d & 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);
-
-      NgProfiler::StartTimer (meshing3_timer_a);
-      stat.qualclass =
-        adfront -> GetLocals (baseelem, locpoints, locfaces, 
-			      pindex, findex, connectedpairs,
-			      houter, hinner,
-			      locfacesplit);
-      NgProfiler::StopTimer (meshing3_timer_a);
-
-      // (*testout) << "locfaces = " << endl << locfaces << endl;
-
-      int pi1 = pindex.Get(locfaces[0].PNum(1));
-      int pi2 = pindex.Get(locfaces[0].PNum(2));
-      int pi3 = pindex.Get(locfaces[0].PNum(3));
-
-      //loktestmode = 1;
-      testmode = loktestmode;  //changed 
-      // loktestmode = testmode =  (adfront->GetFace (baseelem).GetNP() == 4) && (rules.Size() == 5);
-
-      loktestmode = stat.qualclass > 5;
-      
-
-      if (loktestmode)
-	{
-	  (*testout) << "baseel = " << baseelem << ", ind = " << findex.Get(1) << endl;
-	  (*testout) << "pi = " << pi1 << ", " << pi2 << ", " << pi3 << endl;
-	}
-
-
-
-
-
-      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) ? 2 : 1;
-	  }
-      else
-	allowpoint = 2;
-
-
-      
-      if (stat.qualclass >= mp.starshapeclass &&
-	  mp.baseelnp != 4)   
-	{
-	  NgProfiler::RegionTimer reg1 (meshing3_timer_b);
-	  // star-shaped domain removing
-
-	  grouppoints.SetSize (0);
-	  groupfaces.SetSize (0);
-	  grouppindex.SetSize (0);
-	  groupfindex.SetSize (0);
-	  
-	  adfront -> GetGroup (findex[0], grouppoints, groupfaces, 
-			       grouppindex, groupfindex);
-
-	  bool onlytri = 1;
-	  for (i = 0; i < groupfaces.Size(); i++)
-	    if (groupfaces[i].GetNP() != 3) 
-	      onlytri = 0;
-	  
-	  if (onlytri && groupfaces.Size() <= 20 + 2*stat.qualclass &&
-	      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;
-
-      bool impossible = 1;
-
-      for (rotind = 1; rotind <= locfaces[0].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)
-		{
-		  //if(loktestmode)
-		  //  (*testout) << "plainpoints.Get(i).Z() = " << plainpoints.Get(i).Z() << " > 0" << endl;
-		  allowpoint.Elem(i) = 0;
-		}
-	    }
-
-	  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;
-	    }
-
-	  NgProfiler::StartTimer (meshing3_timer_c);	  
-
-	  found = ApplyRules (plainpoints, allowpoint, 
-			      locfaces, locfacesplit, connectedpairs,
-			      locelements, delfaces, 
-			      stat.qualclass, mp.sloppy, rotind, err);
-
-	  if (found >= 0) impossible = 0;
-	  if (found < 0) found = 0;
-
-
-	  NgProfiler::StopTimer (meshing3_timer_c);	  
-
-	  if (!found) loktestmode = 0;
-
-	  NgProfiler::RegionTimer reg2 (meshing3_timer_d);	  
-	  
-	  if (loktestmode)
-	    {
-	      (*testout) << "plainpoints = " << endl << plainpoints << endl;
-	      (*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)++;
-
-
-	  // 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) << "found is active, 3" << 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 (loktestmode)
-	    {
-	      (*testout) << "apply rule" << 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));
-	  if (impossible && mp.check_impossible)
-	    {
-	      (*testout) << "skip face since it is impossible" << endl;
-	      for (j = 0; j < 100; j++)
-		adfront->IncrementClass (findex.Get(1));
-	    }
-	}
-
-      locelements.SetSize (0);
-      delpoints.SetSize(0);
-      delfaces.SetSize(0);
-
-      if (stat.qualclass >= mp.giveuptol)
-	break;
-    }
-  
-  PrintMessage (5, "");  // line feed after statistics
-
-  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(0), i1, i2, i3, j1, j2, j3;
-  int n1, n2, n3, n, min1, min2, min3, max1, max2, max3;
-  int changed, filled;
-  double xmin(0), xmax(0), ymin(0), ymax(0), zmin(0), zmax(0);
-  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 MiniElement2d & 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(0), pi2(0), pi3(0), pi4(0);
-
-	      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)
-		    {
-		      MiniElement2d 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 MiniElement2d & 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;
-	      //(*testout) << "reducing maxh to " << maxh << " because of " << p1 << " and " << p2 << endl;
-	    }
-
-	  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;
-      //(*testout) << "reducing maxh to " << maxh << " because of mp.maxh" << endl;
-    }
-
-  int changed;
-  do 
-    {
-      mesh.LocalHFunction().ClearFlags();
-
-      for (i = 1; i <= adfront->GetNF(); i++)
-	{
-	  const MiniElement2d & 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 MiniElement2d & 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 MiniElement2d & 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 3a4732d1645da300533edf930114f377d820cda1..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshing3.hpp
+++ /dev/null
@@ -1,130 +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<MiniElement2d> & 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);
-  ///
-  void AddBoundaryElement (const MiniElement2d & 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, int domainnr, 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 386e2bec0523819539bd77e07487ebbcf05f2c50..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshtool.cpp
+++ /dev/null
@@ -1,999 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-//#include <csg.hpp> // MODIFIED FOR GMSH
-//#include <geometry2d.hpp>// MODIFIED FOR GMSH
-
-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 Point<3> *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;
-    
-    if (teterrpow == 2)
-      return err*err;
-    return pow (err, teterrpow);
-  }
-
-
-  double CalcTetBadnessGrad (const Point3d & p1, const Point3d & p2,
-			     const Point3d & p3, const Point3d & p4, double h,
-			     int pi, Vec<3> & 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;
-
-    /*
-    Vec3d gradll;
-    gradll = v1+v2+v3;
-    gradll *= -2;
-    */
-
-    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)
-      {
-	/*
-	Vec3d gradll1 (*pp2, *pp1);
-	Vec3d gradll2 (*pp3, *pp1);
-	Vec3d gradll3 (*pp4, *pp1);
-	gradll1 *= 2;
-	gradll2 *= 2;
-	gradll3 *= 2;
-	*/
-	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;
-    if (teterrpow == 2)
-      {
-        errpow = err*err;   
-        grad = (2 * err) * graderr;
-      }
-    else
-      {
-        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)(0) << " "
-	 << mesh.Point(i)(1) << " "
-	 << mesh.Point(i)(2) << "\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)(0) << " "
-	      << mesh.Point(i)(1) << " "
-	      << mesh.Point(i)(2) << 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)(0) << " "
-	      << mesh.Point(i)(1) << " "
-	      << mesh.Point(i)(2) << 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 (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 domainnr)
-  {
-    int i, j, k;
-  
-    mesh.FindOpenElements(domainnr);
-    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++)
-    k = domainnr;
-      {
-	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 9ffaad113cad58bf9f4c3f5926758b992b2f2376..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,
-				Vec<3> & 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, int domainnr);
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/meshtype.cpp b/contrib/Netgen/libsrc/meshing/meshtype.cpp
deleted file mode 100644
index 9c7baf22146a68f0bcd976dc514ca4af4dc1436d..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshtype.cpp
+++ /dev/null
@@ -1,2632 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"  
-
-namespace netgen
-{
-
-
-  ostream & operator<<(ostream  & s, const MeshPoint & pt)
-  {
-    s << Point<3> (pt);
-    return s;
-  }
-
-  /*
-  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;
-    */
-
-    bcname = 0;
-  }    
-
-  Segment::Segment (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(),
-      surfnr1(other.surfnr1),
-      surfnr2(other.surfnr2),
-      epgeominfo(),
-      pmid(other.pmid),
-      meshdocval(other.meshdocval),
-      hp_elnr(other.hp_elnr)
-  {
-    geominfo[0] = other.geominfo[0];
-    geominfo[1] = other.geominfo[1];
-    epgeominfo[0] = other.epgeominfo[0];
-    epgeominfo[1] = other.epgeominfo[1];
-    bcname = other.bcname;
-  }
-
-  Segment& Segment::operator=(const Segment & other)
-  {
-    if (&other != this)
-      {
-	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;
-	hp_elnr = other.hp_elnr;
-	bcname = other.bcname;
-      }
-    
-    return *this;
-  }
-
-
-  ostream & operator<<(ostream  & s, const Segment & seg)
-  {
-    s << seg.p1 << "(gi=" << seg.geominfo[0].trignum << ") - "
-      << seg.p2 << "(gi=" << seg.geominfo[1].trignum << ")"
-      << " domin = " << seg.domin << ", domout = " << seg.domout 
-      << " si = " << seg.si << ", edgenr = " << seg.edgenr;
-    return s;
-  }
-
-
-  Element2d :: Element2d ()
-  { 
-    for (int i = 0; i < ELEMENT2D_MAXPOINTS; i++)
-      {
-	pnum[i] = 0;
-	geominfo[i].trignum = 0;
-      }
-    np = 3;
-    index = 0;
-    badel = 0;
-    deleted = 0;
-    typ = TRIG;
-    orderx = ordery = 1;
-    refflag = 1;
-    strongrefflag = false;
-#ifdef PARALLEL
-    isghost = 0;
-#endif
-  } 
-
-
-  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;
-      }
-    orderx = ordery = 1;
-    refflag = 1;
-    strongrefflag = false;
-#ifdef PARALLEL
-    isghost = 0;
-#endif
-  } 
-
-  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;
-    orderx = ordery = 1;
-    refflag = 1;
-    strongrefflag = false;
-#ifdef PARALLEL
-  isghost = 0;
-#endif
-
-  } 
-
-
-
-  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;
-  strongrefflag = false;
-  deleted = 0;
-  orderx = ordery = 1;
-
-#ifdef PARALLEL
-  isghost = 0;
-#endif
-
-}
-
-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;
-  strongrefflag = false;
-  deleted = 0;
-  orderx = ordery = 1;
-
-#ifdef PARALLEL
-  isghost = 0;
-#endif
-}
-
-
-/*
-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]));
-}
-
-bool Element2d :: operator==(const Element2d & el2) const
-{
-  bool retval = (el2.GetNP() == np);
-  for(int i= 0; retval && i<np; i++)
-    retval = (el2[i] == (*this)[i]);
-
-  return retval;
-}
-
-
-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)
-    {
-      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
-    {
-      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 :: GetShapeNew (const Point<2> & p, FlatVector & shape) const
-{
-  switch (typ)
-    {
-    case TRIG:
-      {
-	shape(0) = p(0);
-	shape(1) = p(1);
-	shape(2) = 1-p(0)-p(1);
-	break;
-      }
-
-    case QUAD:
-      {
-	shape(0) = (1-p(0))*(1-p(1));
-	shape(1) =    p(0) *(1-p(1));
-	shape(2) =    p(0) *   p(1) ;
-	shape(3) = (1-p(0))*   p(1) ;
-	break;
-      }
-    }
-}
-
-
-
-
-
-
-
-
-
-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 :: 
-GetDShapeNew (const Point<2> & p, MatrixFixWidth<2> & dshape) const
-{
-  switch (typ)
-    {
-    case TRIG:
-      {
-	dshape = 0;
-	dshape(0,0) = 1;
-	dshape(1,1) = 1;
-	dshape(2,0) = -1;
-	dshape(2,1) = -1;
-	break;
-      }
-    case QUAD:
-      {
-	dshape(0,0) = -(1-p(1));
-	dshape(0,1) = -(1-p(0));
-
-	dshape(1,0) =  (1-p(1));
-	dshape(1,1) =  -p(0);
-
-	dshape(2,0) = p(1);
-	dshape(2,1) = p(0);
-
-	dshape(3,0) = -p(1);
-	dshape(3,1) = (1-p(0));
-	break;
-      }
-    }
-}
-
-
-
-
-
-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 Vec<3> & n) const
-{
-  int i, j;
-  int nip = GetNIP();
-  static DenseMatrix trans(2,2);
-  static DenseMatrix pmat;
-  
-  pmat.SetSize (2, GetNP());
-
-  Vec<3> t1, t2;
-  t1 = n.GetNormal();
-  t2 = Cross (n, t1);
-
-  for (i = 1; i <= GetNP(); i++)
-    {
-      Point3d p = points.Get(PNum(i));
-      pmat.Elem(1, i) = p.X() * t1(0) + p.Y() * t1(1) + p.Z() * t1(2);
-      pmat.Elem(2, i) = p.X() * t2(0) + p.Y() * t2(1) + p.Z() * t2(2);
-    }
-
-  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(0) = hp.X();
-      ipd->p(1) = hp.Y();
-      ipd->p(2) = 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.strongrefflag = false;
-  flags.deleted = 0;
-  flags.fixed = 0;
-  orderx = ordery = orderz = 1;
-
-#ifdef PARALLEL
-  partitionNumber = -1;
-  isghost = 0;
-#endif
-
-}
-
-
-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.strongrefflag = false;
-  flags.deleted = 0;
-  flags.fixed = 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;
-    }
-  orderx = ordery = orderz = 1;
-
-#ifdef PARALLEL
-  isghost = 0;
-#endif
-}
-
-void Element :: SetOrder (const int aorder) 
-  { 
-    orderx = aorder; 
-    ordery = aorder; 
-    orderz = aorder;
-  }
-
-
-void Element :: SetOrder (const int ox, const int oy, const int oz) 
-{ 
-  orderx = ox; 
-  ordery = oy;
-  orderz = oz; 
-}
-
-
-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.strongrefflag = false;
-  flags.deleted = 0;
-  flags.fixed = 0;
-  orderx = ordery = orderz = 1;
-
-#ifdef PARALLEL
-  isghost = 0;
-#endif
-}
-
-
-
-
-
-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;
-  orderx = el2.orderx;
-  ordery = el2.ordery;
-  orderz = el2.orderz;
-  hp_elnr = el2.hp_elnr;
-  flags = el2.flags;
-  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
-{
-  Vec<3> v1 = points.Get(PNum(2)) - points.Get(PNum(1));
-  Vec<3> v2 = points.Get(PNum(3)) - points.Get(PNum(1));
-  Vec<3> 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;
-      }
-    }
-}
-
-bool Element :: operator==(const Element & el2) const
-{
-  bool retval = (el2.GetNP() == np);
-  for(int i= 0; retval && i<np; i++)
-    retval = (el2[i] == (*this)[i]);
-
-  return retval;
-}
-
-
-#ifdef OLD
-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 },
-      { 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]));
-}
-#endif
-
-
-
-
-
-
-void Element :: GetNodesLocalNew (ARRAY<Point<3> > & 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 (Point<3> (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 } };
-
-  static int tet10trigs[][3] = 
-  { { 2, 8, 9 }, { 3, 10, 8}, { 4, 9, 10 }, { 9, 8, 10 },
-    { 3, 6, 10 }, { 1, 7, 6 }, { 4, 10, 7 }, { 6, 7, 10 },
-    { 1, 5, 7 }, { 2, 9, 5 }, { 4, 7, 9 }, { 5, 9, 7 },
-    { 1, 6, 5 }, { 2, 5, 8 }, { 3, 8, 6 }, { 5, 6, 8 }
-  };
-
-  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 = 16;
-	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(TRIG);
-      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< AutoPtr < IntegrationPointData > > ipdtet;
-ARRAY< AutoPtr < 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, Point<3> & 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(0) = pp[0];
-  p(1) = pp[1];
-  p(2) = 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);
-
-  Point<3> 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 Point<3> & hp, Vector & shape) const
-{
-  Point3d p = hp;
-
-  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 Point<3> & hp, DenseMatrix & dshape) const
-{
-  Point3d p = hp;
-
-  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, Vec<3> & 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(j-1);
-
-
-
-  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;
-}
-
-double Element :: 
-CalcJacobianBadnessGradient (const T_POINTS & points,
-			     int pi, Vec<3> & grad) 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) = 1.;
-
-
-  double err = 0;
-
-  double dfrob[3];
-
-  grad = 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);
-
-      for(k = 0; k<3; k++)
-	{
-	  dfrob[k] = 0;
-	  for (j = 1; j <= 3; j++)
-	    dfrob[k] += trans.Get(k+1,j) * dtrans.Get(k+1,j);
-	  dfrob[k] = dfrob[k] / (3.*frob);
-	}
-
-      frob /= 3;      
-
-      double det = trans.Det();
-      double ddet[3]; // = 0;
-      
-      for(k=1; k<=3; k++)
-	{
-	  int km1 = (k > 1) ? (k-1) : 3;
-	  int kp1 = (k < 3) ? (k+1) : 1;
-	  ddet[k-1] = 0;
-	  for(j=1; j<=3; j++)
-	    {
-	      int jm1 = (j > 1) ? (j-1) : 3;
-	      int jp1 = (j < 3) ? (j+1) : 1;
-	      
-	      ddet[k-1] += (-1.)* dtrans.Get(k,j) * ( trans.Get(km1,jm1)*trans.Get(kp1,jp1) - 
-						     trans.Get(km1,jp1)*trans.Get(kp1,jm1) );
-	    }
-	}
-
-      
-      det *= -1;
-      
-      if (det <= 0)
-	err += 1e12;
-      else
-	{
-	  err += frob * frob * frob / det;
-	  double fac = (frob * frob)/(det * det);
-	  for(j=0; j<3; j++)
-	    grad(j) += fac * (3 * dfrob[j] * det - frob * ddet[j]);
-	}
-    }
-
-  err /= nip;
-  grad *= 1./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));
-    }
-
-  switch (GetType())
-    {
-    case TET: ipdtet.SetSize(GetNIP()); break;
-    case TET10: ipdtet10.SetSize(GetNIP()); break;
-    }
-
-
-  for (int 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.Elem(i).Reset(ipd); break;
-	case TET10: ipdtet10.Elem(i).Reset(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; 
-  bcname = 0;
-  firstelement = -1;
-}
-
-FaceDescriptor ::  FaceDescriptor(const FaceDescriptor& other)
-  : surfnr(other.surfnr), domin(other.domin), domout(other.domout),
-    tlosurf(other.tlosurf), bcprop(other.bcprop), bcname(other.bcname),
-    domin_singular(other.domin_singular), domout_singular(other.domout_singular)
-{ 
-  firstelement = -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.;
-  bcname = 0;
-  firstelement = -1;
-}
-
-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.;
-  bcname = 0;
-  firstelement = -1;
-}
-
-int FaceDescriptor ::  SegmentFits (const Segment & seg)
-{
-  return
-    surfnr == seg.si &&
-    domin == seg.domin+1 &&
-    domout == seg.domout+1  &&
-    tlosurf == seg.tlosurf+1;
-}
-
-
-string FaceDescriptor :: GetBCName () const
-{
-  if ( bcname )
-    return *bcname;
-  else 
-    return "default";
-  
-}
-
-/*
-void FaceDescriptor :: SetBCName (string * bcn)
-{
-  bcname = bcn;
-}
-*/
-
-
-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);
-  identifiedpoints_nr = new INDEX_3_HASHTABLE<int>(100);
-  maxidentnr = 0;
-}
-
-Identifications :: ~Identifications ()
-{
-  delete identifiedpoints;
-  delete identifiedpoints_nr;
-}
-
-void Identifications :: Delete ()
-{
-  delete identifiedpoints;
-  identifiedpoints = new INDEX_2_HASHTABLE<int>(100);
-  delete identifiedpoints_nr;
-  identifiedpoints_nr = new INDEX_3_HASHTABLE<int>(100);
-  maxidentnr = 0;
-}
-
-void Identifications :: Add (PointIndex pi1, PointIndex pi2, int identnr)
-{
-  //  (*testout) << "Identification::Add, pi1 = " << pi1 << ", pi2 = " << pi2 << ", identnr = " << identnr << endl;
-  INDEX_2 pair (pi1, pi2);
-  identifiedpoints->Set (pair, identnr);
-
-  INDEX_3 tripl (pi1, pi2, identnr);
-  identifiedpoints_nr->Set (tripl, 1);
-
-  if (identnr > maxidentnr) maxidentnr = identnr;
-
-  if (identnr+1 > idpoints_table.Size())
-    idpoints_table.ChangeSize (identnr+1);
-  idpoints_table.Add (identnr, pair);
-  
-  //  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;
-}
-
-bool Identifications :: Get (PointIndex pi1, PointIndex pi2, int nr) const
-{
-  INDEX_3 tripl(pi1, pi2, nr);
-  if (identifiedpoints_nr->Used (tripl))
-    return 1;
-  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, bool symmetric) const
-{
-  identmap.SetSize (mesh.GetNP());
-  identmap = 0;
-
-  if (identnr)
-    for (int i = 0; i < idpoints_table[identnr].Size(); i++)
-      {
-	INDEX_2 pair = idpoints_table[identnr][i];
-	identmap[pair.I1()] = pair.I2();
-	if(symmetric)
-	  identmap[pair.I2()] = pair.I1();
-      }
-
-  else
-    {
-      cout << "getmap, identnr = " << identnr << endl;
-
-      for (int i = 1; i <= identifiedpoints_nr->GetNBags(); i++)
-	for (int j = 1; j <= identifiedpoints_nr->GetBagSize(i); j++)
-	  {
-	    INDEX_3 i3;
-	    int dummy;
-	    identifiedpoints_nr->GetData (i, j, i3, dummy);
-	    
-	    if (i3.I3() == identnr || !identnr)
-	      {
-		identmap.Elem(i3.I1()) = i3.I2();
-		if(symmetric)
-		  identmap.Elem(i3.I2()) = i3.I1();
-	      }
-	  }  
-    }
-
-}
-
-
-void Identifications :: GetPairs (int identnr, 
-				  ARRAY<INDEX_2> & identpairs) const
-{
-  identpairs.SetSize(0);
-  
-  if (identnr == 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);
-	  identpairs.Append (i2);
-	}  
-  else
-    for (int i = 1; i <= identifiedpoints_nr->GetNBags(); i++)
-      for (int j = 1; j <= identifiedpoints_nr->GetBagSize(i); j++)
-	{
-	  INDEX_3 i3;
-	  int dummy;
-	  identifiedpoints_nr->GetData (i, j, i3 , dummy);
-	  
-	  if (i3.I3() == identnr)
-	    identpairs.Append (INDEX_2(i3.I1(), i3.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);	    
-	  }
-      }
-}
-
-
-void Identifications :: Print (ostream & ost) const
-{
-  ost << "Identifications:" << endl;
-  ost << "pairs: " << endl << *identifiedpoints << endl;
-  ost << "pairs and nr: " << endl << *identifiedpoints_nr << endl;
-  ost << "table: " << endl << idpoints_table << endl;
-}
-
-
-MeshingParameters :: MeshingParameters ()
-{
-  optimize3d = "cmdmustm";
-  //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;
-  minh = 0;
-  meshsizefilename = NULL;
-  startinsurface = 0;
-  checkoverlap = 1;
-  checkoverlappingboundary = 1;
-  checkchartboundary = 1;
-  curvaturesafety = 2;
-  segmentsperedge = 1;
-  parthread = 0;
-
-  elsizeweight = 0.2;
-  giveuptol2d = 200;
-  giveuptol = 10;
-  maxoutersteps = 10;
-  starshapeclass = 5;
-  baseelnp = 0;
-  sloppy = 1;
-
-  badellimit = 175;
-  check_impossible = 0;
-  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
-      << " giveuptol2d = " <<  giveuptol2d << 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;
-  checkoverlappingboundary = other.checkoverlappingboundary;
-  checkchartboundary = other.checkchartboundary;
-  curvaturesafety = other.curvaturesafety;
-  segmentsperedge = other.segmentsperedge;
-  parthread = other.parthread;
-  elsizeweight = other.elsizeweight;
-  giveuptol2d = other.giveuptol2d;
-  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 fdae56b4546774e85ac67c666241e53c18979d08..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/meshtype.hpp
+++ /dev/null
@@ -1,1229 +0,0 @@
-#ifndef MESHTYPE
-#define MESHTYPE
-
-
-/**************************************************************************/
-/* 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 };
-
-
-
-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 << " " << gi.u << " " << gi.v);
-}
-
-inline istream & operator>> (istream & ist, PointGeomInfo & gi)
-{
-  return (ist >> gi.trignum >> gi.u >> gi.v);
-}
-
-
-
-#define MULTIPOINTGEOMINFO_MAX 100
-class MultiPointGeomInfo
-{
-  int cnt;
-  PointGeomInfo mgi[MULTIPOINTGEOMINFO_MAX];
-public:
-  MultiPointGeomInfo () { cnt = 0; }
-  int AddPointGeomInfo (const PointGeomInfo & gi);
-  void Init () { cnt = 0; }
-  void DeleteAll () { cnt = 0; }
-
-  int GetNPGI () const { return cnt; }
-  const PointGeomInfo & GetPGI (int i) const { return mgi[i-1]; }
-};
-
-
-class EdgePointGeomInfo
-{
-public:
-  int edgenr;
-  int body;    // for ACIS
-  double u, v; // for OCC Meshing
-  double dist; // for 2d meshing
-
-public:
-  EdgePointGeomInfo ()
-    : edgenr(0), body(0), dist(0.0), u(0.0), v(0.0) { ; }
-
-
-  EdgePointGeomInfo & operator= (const EdgePointGeomInfo & gi2)
-  {
-    edgenr = gi2.edgenr;  
-    body = gi2.body;
-    dist = gi2.dist;
-    u = gi2.u; v = gi2.v;
-    return *this;
-  }
-};
-
-inline ostream & operator<< (ostream & ost, const EdgePointGeomInfo & gi)
-{
-  ost << "epgi: edgnr=" << gi.edgenr << ", dist=" << gi.dist;
-  return ost;
-}
-
-
-
-
-
-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 PointIndex(hi); }
-  PointIndex operator-- (int) { int hi = i; i--; return PointIndex(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.
- */
-class MeshPoint : public Point<3>
-{
-  int layer;
-  double singular; // singular factor for hp-refinement
-  POINTTYPE type;
-
-#ifdef PARALLEL
-  bool isghost;
-#endif
-
-public:
-  MeshPoint () : layer(1), singular(0.), type(INNERPOINT) 
-{ 
-#ifdef PARALLEL
-  isghost = 0;
-#endif
-  ;
-}
-
-  MeshPoint (const Point<3> & ap, int alayer = 1, POINTTYPE apt = INNERPOINT)
-    : Point<3> (ap), layer(alayer), singular(0.),type(apt) 
-  { 
-#ifdef PARALLEL
-    isghost = 0;
-#endif  
-    ;
-  }
-  
-  void SetPoint (const Point<3> & ap)
-  { 
-    Point<3>::operator= (ap); 
-    layer = 0; 
-    singular = 0; 
-#ifdef PARALLEL
-    isghost = 0;
-#endif
-  }
-
-  int GetLayer() const { return layer; }
-
-  POINTTYPE Type() const { return type; }
-  void SetType(POINTTYPE at) { type = at; }
- 
-  double Singularity() const { return singular; }
-  void Singularity(double s) { singular = s; }
-  bool IsSingular() const { return (singular != 0.0); }
-
-#ifdef PARALLEL
-  bool IsGhost () const { return isghost; }
-  void SetGhost ( bool aisghost ) { isghost = aisghost; }
-#endif
-
-};
-
-ostream & operator<<(ostream  & s, const MeshPoint & pt);
-
-
-
-
-typedef MoveableArray<MeshPoint,PointIndex::BASE> 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 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 strongrefflag:1;
-  bool deleted:1;  // element is deleted
-
-  /// order for hp-FEM
-  unsigned int orderx:6;
-  unsigned int ordery:6;
-
-#ifdef PARALLEL
-  bool isghost;
-  int partitionNumber; 
-#endif
-
-  /// a linked list for all segments in the same face
-  SurfaceElementIndex next;
-
-public:
-  ///
-  Element2d ();
-  ///
-  Element2d (int anp);
-  ///
-  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 orderx; }
-  void SetOrder (int aorder) { orderx = ordery = aorder; }
-
-
-  void GetOrder (int & ox, int & oy) const { ox = orderx, oy =ordery;};
-  void GetOrder (int & ox, int & oy, int & oz) const { ox = orderx; oy = ordery; oz=0; }
-  void SetOrder (int ox, int oy, int  oz) { orderx = ox; ordery = oy;}
-  void SetOrder (int ox, int oy) { orderx = ox; ordery = oy;}
-
-
-  ///
-  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;
-  void GetShapeNew (const Point<2> & p, class FlatVector & shape) const;
-  /// matrix 2 * np
-  void GetDShape (const Point2d & p, class DenseMatrix & dshape) const;
-  void GetDShapeNew (const Point<2> & p, class MatrixFixWidth<2> & 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 Vec<3> & 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; }
-
-  void SetStrongRefinementFlag (bool rflag = 1) 
-  { strongrefflag = rflag; }
-  bool TestStrongRefinementFlag () const
-  { return strongrefflag; }
-
-  
-  bool operator==(const Element2d & el2) const;
-
-  int HasFace(const Element2d& el) const;
-  ///
-  int meshdocval;
-  ///
-  int hp_elnr;
-
-#ifdef PARALLEL
-  bool IsGhost () const { return isghost; }
-  void SetGhost ( bool aisghost ) { isghost = aisghost; }
-
-  // by JS, only for 2D meshes ????
-  int GetPartition () const { return partitionNumber; }
-  void SetPartition (int nr) { partitionNumber = nr; }; 
-#endif
-
-};
-
-
-
-
-class IntegrationPointData
-{
-public:
-  Point<3> 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 strongrefflag:1;
-    bool deleted:1;   // element is deleted, will be removed from array
-    bool fixed:1;     // don't change element in optimization
-  };
-
-  /// sub-domain index
-  short int index;
-  /// order for hp-FEM
-  unsigned int orderx:6;
-  unsigned int ordery:6;
-  unsigned int orderz:6;
-  /* unsigned int levelx:6;
-  unsigned int levely:6;
-  unsigned int levelz:6; */ 
-  /// stored shape-badness of element
-  float badness;
-  
-#ifdef PARALLEL
-  /// number of partition for parallel computation 
-  int partitionNumber;
-  bool isghost;
-#endif
-
-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: 
-      case TET10: 
-        return 4;
-      case PRISM12: 
-      case PRISM: 
-        return 6; 
-      case PYRAMID:
-        return 5;
-      case HEX:
-        return 8;
-      default:
-#ifdef DEBUG
-	PrintSysError ("Element3d::GetNV not implemented for typ ", typ)
-#endif
-	  ;
-      }
-    return np;
-  }
-
-  bool operator==(const Element & el2) const;
-
-  // 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 orderx; }
-  void SetOrder (const int aorder) ; 
-
-  void GetOrder (int & ox, int & oy, int & oz) const { ox = orderx; oy = ordery; oz = orderz; }
-  void SetOrder (const int ox, const int oy, const int oz);
-  // void GetLevel (int & ox, int & oy, int & oz) const { ox = levelx; oy = levely; oz = levelz; }
-  // void SetLevel (int ox, int oy, int oz) { levelx = ox; levely = oy; levelz = oz; }
-
-
-  ///
-  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<Point<3> > & points) const;
-  void GetNodesLocalNew (ARRAY<Point<3> > & 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, Point<3> & 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 Point<3> & p, class Vector & shape) const;
-  void GetShapeNew (const Point<3> & p, class FlatVector & shape) const;
-  /// matrix 2 * np
-  void GetDShape (const Point<3> & 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, Vec<3> & dir, double & dd) const;
-  double CalcJacobianBadnessGradient (const T_POINTS & points,
-				      int pi, Vec<3> & grad) const;
-
-  ///
-  friend ostream & operator<<(ostream  & s, const Element & el);
-
-  void SetRefinementFlag (bool rflag = 1) 
-  { flags.refflag = rflag; }
-  int TestRefinementFlag () const
-  { return flags.refflag; }
-
-  void SetStrongRefinementFlag (bool rflag = 1) 
-  { flags.strongrefflag = rflag; }
-  int TestStrongRefinementFlag () const
-  { return flags.strongrefflag; }
-
-  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; 
-  }
-
-#ifdef PARALLEL
-  int GetPartition () const { return partitionNumber; }
-  void SetPartition (int nr) { partitionNumber = nr; }; 
-#endif
-
-  int hp_elnr;
-
-#ifdef PARALLEL
-  bool IsGhost () const { return isghost; }
-
-  void SetGhost ( const bool aisghost ) { isghost = aisghost; }
-#endif
-
-  friend class Mesh;
-};
-
-
-class Segment;
-ostream & operator<<(ostream  & s, const Segment & seg);
-
-
-/**
-  Edge segment.
-  */
-class Segment
-{
-public:
-  ///
-  Segment();
-  Segment (const Segment& other);
-
-   ~Segment()
-  { ; }
-
-  friend ostream & operator<<(ostream  & s, const Segment & seg);
-
-  /// point index 1
-  PointIndex p1;
-  /// point index 2
-  PointIndex p2;    
-  /// edge nr
-  int edgenr;
-  ///
-  double singedge_left;
-  double singedge_right;
-
-  /// 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;
-
-private:
-  string* bcname;
-
-public:
-  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;
-
-  void SetBCName ( string * abcname )
-  {
-    bcname = abcname;
-  }
-
-  string * BCNamePtr () 
-  { return bcname; }
-
-  const string * BCNamePtr () const 
-  { return bcname; }
-
-  string GetBCName () const
-  {
-    if (! bcname )
-      {
-	return "default";
-      }
-    return *bcname;
-  }
-
-
-};
-
-
-// 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;
-
-  ///
-  string * bcname;
-  /// root of linked list 
-  SurfaceElementIndex firstelement;
-  
-public:
-  ///
-  double domin_singular;
-  double domout_singular;
-public:
-  FaceDescriptor();
-  FaceDescriptor(int surfnri, int domini, int domouti, int tlosurfi);
-  FaceDescriptor(const Segment & seg);
-  FaceDescriptor(const FaceDescriptor& other);
-  ~FaceDescriptor()  { ; }
-
-  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; }
-  string GetBCName () const; 
-  // string * BCNamePtr () { return bcname; }
-  // const string * BCNamePtr () const  { return bcname; }
-  void SetSurfNr (int sn) { surfnr = sn; }
-  void SetDomainIn (int di) { domin = di; }
-  void SetDomainOut (int dom) { domout = dom; }
-  void SetBCProperty (int bc) { bcprop = bc; }
-  void SetBCName (string * bcn) { bcname = bcn; }
-
-  friend ostream & operator<<(ostream  & s, const FaceDescriptor & fd);
-  friend class Mesh;
-};
-
- 
-
-
-
-
-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
-  */
-  const 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
-  **/
-  const 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;
-  /// minimal mesh size
-  double minh;
-  /// file for meshsize
-  const char * meshsizefilename;
-  /// start surfacemeshing from everywhere in surface
-  int startinsurface;
-  /// check overlapping surfaces (debug)
-  int checkoverlap;
-  /// check overlapping surface mesh before volume meshing
-  int checkoverlappingboundary;
-  /// 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, 2d meshing
-  int giveuptol2d;
-  /// give up quality class, 3d meshing
-  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;
-
-  bool check_impossible;
-  
-  ///
-  int secondorder;
-  /// high order element curvature
-  int elementorder;
-  /// quad-dominated surface meshing
-  int quad;
-  ///
-  int inverttets;
-  ///
-  int inverttrigs;
-  ///
-  int autozrefine;
-  ///
-  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
-{
-public:
-  enum ID_TYPE { UNDEFINED = 1, PERIODIC = 2, CLOSESURFACES = 3, CLOSEEDGES = 4};
-  
-
-private:
-  class Mesh & mesh;
-
-  /// identify points (thin layers, periodic b.c.)  
-  INDEX_2_HASHTABLE<int> * identifiedpoints;
-  
-  /// the same, with info about the id-nr
-  INDEX_3_HASHTABLE<int> * identifiedpoints_nr;
-
-  /// sorted by identification nr
-  TABLE<INDEX_2> idpoints_table;
-
-  ARRAY<ID_TYPE> type;
-
-  /// number of identifications (or, actually used identifications ?)
-  int maxidentnr;
-
-public:
-  ///
-  Identifications (class 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;
-
-  bool Get (PointIndex pi1, PointIndex pi2, int identnr) const;
-  bool GetSymmetric (PointIndex pi1, PointIndex pi2, int identnr) 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, bool symmetric = false) const;
-  ///
-  ID_TYPE GetType(int identnr) const
-  {
-    if(identnr <= type.Size())
-      return type[identnr-1];
-    else
-      return UNDEFINED;
-  }
-  void SetType(int identnr, ID_TYPE t)
-  {
-    while(type.Size() < identnr)
-      type.Append(UNDEFINED);
-    type[identnr-1] = t;
-  }
-    
-  ///
-  void GetPairs (int identnr, ARRAY<INDEX_2> & identpairs) const;
-  ///
-  int GetMaxNr () const { return maxidentnr; }  
-
-  /// remove secondorder
-  void SetMaxPointNr (int maxpnum);
-
-  void Print (ostream & ost) const;
-};
-
-
-
-
-
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/meshing/msghandler.cpp b/contrib/Netgen/libsrc/meshing/msghandler.cpp
deleted file mode 100644
index 88e30fb18ab02619299a2e3226945584b3a33fe5..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/msghandler.cpp
+++ /dev/null
@@ -1,226 +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 ARRAY<double> threadpercent_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);
-  threadpercent_stack.SetSize(0);
-
-  // multithread.task = "";
-  multithread.percent = 100.;
-}
-
-void PushStatus(const MyStr& s)
-{
-  msgstatus_stack.Append(new MyStr (s));  
-  SetStatMsg(s);
-  threadpercent_stack.Append(0);
-}
-
-void PushStatusF(const MyStr& s)
-{
-  msgstatus_stack.Append(new MyStr (s));
-  SetStatMsg(s);
-  threadpercent_stack.Append(0);
-  PrintFnStart(s);
-}
-
-void PopStatus()
-{
-  if (msgstatus_stack.Size())
-    {
-      if (msgstatus_stack.Size() > 1)
-	SetStatMsg (*msgstatus_stack.Last());
-      else
-	SetStatMsg ("");
-      delete msgstatus_stack.Last();
-      msgstatus_stack.DeleteLast();
-      threadpercent_stack.DeleteLast();
-      if(threadpercent_stack.Size() > 0)
-	multithread.percent = threadpercent_stack.Last();
-      else
-	multithread.percent = 100.;
-    }
-  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;
-  if(threadpercent_stack.Size() > 0)
-    threadpercent_stack.Last() = percent;
-}
-
-
-void GetStatus(MyStr & s, double & percentage)
-{
-  if(threadpercent_stack.Size() > 0)
-    percentage = threadpercent_stack.Last();
-  else
-    percentage = multithread.percent;
-  
-  if ( msgstatus_stack.Size() )
-    s = *msgstatus_stack.Last();
-  else
-    s = "idle";     
-}
-
-
-#ifdef SMALLLIB
-#define SMALLLIBORNOTCL
-#endif
-#ifdef NOTCL
-#define SMALLLIBORNOTCL
-#endif
-
-#ifdef SMALLLIBORNOTCL
-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 843cd1864934b75934d66109efb127ccb79bf949..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/msghandler.hpp
+++ /dev/null
@@ -1,53 +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);
-extern void GetStatus(MyStr & s, double & percentage);
-
-
-#endif
-
diff --git a/contrib/Netgen/libsrc/meshing/netrule2.cpp b/contrib/Netgen/libsrc/meshing/netrule2.cpp
deleted file mode 100644
index 42fe341a501e0d1be503eb3b53889a0a5792a819..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/netrule2.cpp
+++ /dev/null
@@ -1,229 +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 left, right, allleft, allright;
-
-  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 (int i = 1; i <= transfreezone.Size(); i++)
-    {
-      if (freesetinequ.Get(i, 1) * p1.X() + freesetinequ.Get(i, 2) * p1.Y() +
-	  freesetinequ.Get(i, 3) > -1e-8 &&    // -1e-6
-	  freesetinequ.Get(i, 1) * p2.X() + freesetinequ.Get(i, 2) * p2.Y() +
-	  freesetinequ.Get(i, 3) > -1e-8       // -1e-6
-	  ) return 0;
-    }
-
-  double nx =  (p2.Y() - p1.Y());
-  double ny = -(p2.X() - p1.X());
-  double nl = sqrt (nx * nx + ny * ny);
-  if (nl > 1e-8)
-    {
-      nx /= nl;
-      ny /= nl;
-      double c = - (p1.X() * nx + p1.Y() * ny);
-
-      allleft = 1;
-      allright = 1;
-
-      for (int 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++)
-    {
-      const bool counterclockwise = CCW (transfreezone.Get(i), 
-					 transfreezone.Get(i % n + 1),
-					 transfreezone.Get( (i+1) % n + 1 ),
-					 1e-7);
-      //(*testout) << "ccw " << counterclockwise << endl << " p1 " << transfreezone.Get(i) << " p2 " << transfreezone.Get(i % n + 1)
-      //		 << " p3 " << transfreezone.Get( (i+1) % n + 1 ) << endl;
-      if (!counterclockwise )
-	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 * ltf = &linetolerances.Get(li);
-  return ltf->f1 * dx * dx + ltf->f2 * dx * dy + ltf->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 2b7bdfd9c52110ac961e1f2dd38e5039839b2df3..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/netrule3.cpp
+++ /dev/null
@@ -1,1140 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-// #define MARK
-// #include <prof.h>
-
-
-namespace netgen
-{
-
-
-vnetrule :: vnetrule ()
-{
-  name = new char[1];
-  name[0] = char(0);
-  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 lambda1 = rs1 * vii22 - rs2 * vii12;
-	      double lambda2 = rs2 * vii11 - rs1 * vii12;
-
-	      if (fabs (lambda1) > fabs (lambda2))
-		{
-		  if (lambda1 < 0)
-		    an *= -1;
-		}
-	      else
-		{
-		  if (lambda2 < 0)
-		    an *= -1;
-		}
-
-
-	      if (lambda1 * lambda2 < 0 && 0)
-		{
-		  if (fabs (lambda1) > 1e-14 && fabs (lambda2) > 1e-14)
-		    {
-		      //		      (*mycout) << "lambda1 lambda2 < 0" << endl;
-		      (*testout) << "lambdai 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) << "lambdai = " << lambda1 << ", " << lambda2 << 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 lambda1 = rs1 * vii22 - rs2 * vii12;
-	      double lambda2 = rs2 * vii11 - rs1 * vii12;
-
-	      //	      (*testout) << "lambda1, lambda2 = " << lambda1 << ", " << lambda2 << endl;
-
-
-	      if (fabs (lambda1) > fabs (lambda2))
-		{
-		  if (lambda1 < 0)
-		    an *= -1;
-		}
-	      else
-		{
-		  if (lambda2 < 0)
-		    an *= -1;
-		}
-
-
-	      if (lambda1 * lambda2 < 0)
-		{
-		  if (fabs (lambda1) > 1e-14 && fabs (lambda2) > 1e-14)
-		    {
-		      //		      (*mycout) << "lambda1 lambda2 < 0" << endl;
-		      (*testout) << "lambdai 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) << "lambdai = " << lambda1 << ", " << lambda2 << 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 eb502cfee3a88f063fe0cf7169d26a400afd4b3a..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/parser2.cpp
+++ /dev/null
@@ -1,603 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-#ifdef WIN32
-#define COMMASIGN ':'
-#else
-#define COMMASIGN ','
-#endif
-
-
-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 == COMMASIGN)
-	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);
-  //(*testout) << "name " << name << endl;
-  //  (*mycout) << "Rule " << name << " found." << endl;
-
-  do
-    {
-      ist >> buf;
-
-      //(*testout) << "buf " << buf << endl;
-
-      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;    // ')'
-
-
-	      //(*testout) << "read line " << lin.I1() << " " << lin.I2() << endl;
-	      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;
-
-	      //(*testout) << "mapl1" << endl; 
-	      ist >> ch;
-	      while (ch != ';')
-		{
-		  //(*testout) << "working on character \""<<ch<<"\""<< endl;
-		  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'
-		      //(*testout) << "read del" << endl;
-		    }
-
-		  ist >> ch;
-		  //(*testout) << "read character \""<<ch<<"\""<< endl;
-		}
-
-	      ist >> ch;
-	      //(*testout) << "read next character \""<<ch<<"\""<< endl;
-	    }
-	  
-
-	  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 == COMMASIGN)
-		{
-		  ist >> elements.Last().PNum(2);
-		  ist >> ch;    // ','
-		}
-	      if (ch == COMMASIGN)
-		{
-		  ist >> elements.Last().PNum(3);
-		  ist >> ch;    // ','
-		}
-	      if (ch == COMMASIGN)
-		{
-		  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);
-
-  //(*testout) << "loadr1" << endl;
-
-  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());
-
-
-  //(*testout) << "loadr2" << endl;
-
-  {
-    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;
-
-    //(*testout) << "loadr3" << endl;
-    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);
-    //(*testout) << "loadr4" << endl;
-
-    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));
-      }
-  }
-  //(*testout) << "loadr5" << endl;
-
-  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 (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);
-    }
-
-  //(*testout) << "loadr6" << endl;
-}
-
-
-
-
-extern const char * triarules[];
-extern const char * quadrules[];
-
-void Meshing2 :: LoadRules (const char * filename)
-{
-  char buf[256];
-  istream * ist;
-  //char *tr1 = NULL;
-  string tr1;
-
-  /*
-  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");
-	}
-
-      size_t len = 0;
-      while (*hcp)
-	{
-	  //	  (*testout) << "POS2 *hcp " << *hcp << endl;
-	  len += strlen (*hcp);
-	  hcp++;
-	}
-      //tr1 = new char[len+1];
-      //tr1[0] = 0;
-      tr1.reserve(len+1);
-
-
-      if (!mparam.quad)
-	hcp = triarules;
-      else
-	hcp = quadrules;
-
-
-      //char * tt1 = tr1;
-      while (*hcp)
-	{
-	  //strcat (tt1, *hcp);
-	  //tt1 += strlen (*hcp);
-	  tr1.append(*hcp);
-	  hcp++;
-	}
-      
-#ifdef WIN32
-      // VC++ 2005 workaround
-	  for(string::size_type i=0; i<tr1.size(); i++)
-	if(tr1[i] == ',')
-	  tr1[i] = ':';
-#endif
-
-      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)
-	{
-	  //(*testout) << "found rule" << endl;
-	  netrule * rule = new netrule;
-	  //(*testout) << "fr1" << endl;
-	  rule -> LoadRule(*ist);
-	  //(*testout) << "fr2" << endl;
-	  
-	  rules.Append (rule);
-	}
-      //(*testout) << "loop" << endl;
-    }
-  //(*testout) << "POS3" << endl;
-
-  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 382ae9dfc145a3d2aa6d0e5a6c9ab44092a3022c..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/parser3.cpp
+++ /dev/null
@@ -1,1019 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-#ifdef WIN32
-#define COMMASIGN ':'
-#else
-#define COMMASIGN ','
-#endif
-
-
-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 == COMMASIGN)
-	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);
-
-  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, "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 == COMMASIGN)
-		{
-		  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 == COMMASIGN)
-		{
-		  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 k, nfp;
-
-	  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 k, nfp;
-	  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 == COMMASIGN)
-		{
-		  //		  elements.Last().SetNP(2);
-		  ist >> elements.Last().PNum(2);
-		  ist >> ch;    // ','
-		}
-	      if (ch == COMMASIGN)
-		{
-		  //		  elements.Last().SetNP(3);
-		  ist >> elements.Last().PNum(3);
-		  ist >> ch;    // ','
-		}
-	      if (ch == COMMASIGN)
-		{
-		  //		  elements.Last().SetNP(4);
-		  elements.Last().SetType(TET);
-		  ist >> elements.Last().PNum(4);
-		  ist >> ch;    // ','
-		}
-	      if (ch == COMMASIGN)
-		{
-		  //		  elements.Last().SetNP(5);
-		  elements.Last().SetType(PYRAMID);
-		  ist >> elements.Last().PNum(5);
-		  ist >> ch;    // ','
-		}
-	      if (ch == COMMASIGN)
-		{
-		  //		  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));
-    }
-
-
-  {
-    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 <= edges.Size(); i++)
-	  {
-	    int pi1 = edges.Get(i).i1;
-	    int pi2 = edges.Get(i).i2;
-
-	    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;
-	      }
-	  }
-	
-
-	for (i = 1; i <= elements.Size(); i++)
-	  if (elements.Get(i).GetNP() == 6)  // prism rule
-	    {
-	      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);
-
-    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));
-      }
-
-    // (*testout) << "rule " << name << ", pnear = " << pnearness << endl;
-  }
-
-  
-  //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 ed(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))
-			{
-			  ed.I(1) = f1.I(f11);
-			  ed.I(2) = f1.I(f12);
-			}
-	      //	      (*testout) << "ed = " << ed.I(1) << "-" << ed.I(2) << endl;
-	      //	      (*testout) << "ind = " << ind << " ed = " << ed << endl;
-	      for (int eli = 1; eli <= GetNOldF(); eli++)
-		{
-		  if (GetNP(eli) == 4)
-		    {
-		      for (int elr = 1; elr <= 4; elr++)
-			{
-			  if (GetPointNrMod (eli, elr) == ed.I(1) &&
-			      GetPointNrMod (eli, elr+2) == ed.I(2))
-			    {
-			      /*
-			      (*testout) << "ed is diagonal of rectangle" << endl;
-			      (*testout) << "ed = " << ed.I(1) << "-" << ed.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; 
-      size_t 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++;
-	}
-
-
-#ifdef WIN32
-      // VC++ 2005 workaround
-      for(size_t i=0; i<len; i++)
-	if(tr1[i] == ',')
-	  tr1[i] = ':';
-#endif
-
-      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/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 1c2cd23b778abf62d7f8dcc6a9bf23d53dd14a93..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/quadrls.cpp
+++ /dev/null
@@ -1,887 +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 P Right (150)\"\n",\
-"\n",\
-"quality 150\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",\
-"orientations\n",\
-"(1, 2, 3);\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",\
-"rule \"Left P Quad (150)\"\n",\
-"\n",\
-"quality 150\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",\
-"rule \"Triangle Vis A Vis (200)\"\n",\
-"\n",\
-"quality 200\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",\
-"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 3ed792cb262c0a1ec4b420ae26c0215eaf30db2d..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/refine.cpp
+++ /dev/null
@@ -1,732 +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
-	  {
-	    Point<3> 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();
-
-		  Point<3> 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 },
-		  { 5, 7, 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
-		    {
-		      Point<3> 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 bool reverse[8] =
-	   {
-	      false, false, false, false, false, true, false, true
-	   };
-
-	   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 = !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 },
-	       };
-
-// he: 15.jul 08, old version is wrong
-//                produces double points ad quad faces and inconsistent mesh
-// 	     static int fbetw[6][3] =
-// 	     { { 1, 6, 16 },
-// 	       { 3, 4, 16 },
-// 	       { 1, 5, 17 },
-//                { 2, 4, 17 },
-// 	       { 2, 6, 18 },
-// 	       { 3, 5, 18 },
-// 	       };
-           
-           static int fbetw[6][3] =
-           { { 7, 10, 16 },
-           { 14, 13, 16 },
-           { 11, 8, 17 },
-           { 13, 15, 17 },
-           { 12, 9, 18 },
-           { 14, 15, 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<Point<3> > should(np);
-	ARRAY<Point<3> > 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 = 0; j < 3; j++)
-			mesh.Point(i)(j) = 
-			  lam * should.Get(i)(j) +
-			  (1-lam) * can.Get(i)(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 6040ad2152724d9638ee76d80d4b24db8dd81293..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/ruler2.cpp
+++ /dev/null
@@ -1,641 +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, pmap, pfixed;
-  static ARRAY<int, 1> lmap, lused;
-  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;
-
-      lused[1] = 1;   // .Set (1, 1);
-      lmap[1] = 1;    // .Set (1, 1);
-
-      for (j = 0; j < 2; j++)
-	{
-          pmap.Elem(rule->GetLine(1)[j]) = llines[0][j];
-          pused.Elem(llines[0][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 = lpoints.Get(loclin.I2()) - lpoints.Get(loclin.I1());
-
-		      if (rule->CalcLineError (nlok, linevec) > maxerr)
-			{
-			  ok = 0;
-			  if(loctestmode)
-			    (*testout) << "not ok pos1" << endl;
-			}
-
-		      for (j = 0; j < 2 && ok; j++)
-			{
-			  // refpi = rule->GetPointNr (nlok, j);
-                          refpi = rule->GetLine(nlok)[j];
-
-			  if (pmap.Get(refpi) != 0)
-			    {
-			      if (pmap.Get(refpi) != loclin[j])
-				{
-				  ok = 0;
-				  if(loctestmode)
-				    (*testout) << "not ok pos2" << endl;
-				}
-			    }
-			  else
-			    {
-			      if (rule->CalcPointDist (refpi, lpoints.Get(loclin[j])) > maxerr
-				  || !legalpoints.Get(loclin[j])
-				  || pused.Get(loclin[j]))
-				{
-				  ok = 0;
-				  if(loctestmode)
-				    {
-				      (*testout) << "nok pos3" << endl;
-				      //if(rule->CalcPointDist (refpi, lpoints.Get(loclin[j])) > maxerr)
-				      //(*testout) << "r1" << endl;
-				      //if(!legalpoints.Get(loclin[j]))
-				      //(*testout) << "r2 legalpoints " << legalpoints << " loclin " << loclin << " j " << j << endl;
-				      //if(pused.Get(loclin[j]))
-				      //(*testout) << "r3" << endl;
-				    }
-				}
-			    }
-			}
-		    }
-		}
-
-	      if (ok)
-		{
-		  lused.Elem (locli) = 1;
-		  for (j = 0; j < 2; j++)
-		    {
-		      pmap.Set(rule->GetLine (nlok)[j], loclin[j]);
-		      pused.Elem(loclin[j])++;
-		    }
-
-		  nlok++;
-		}
-	      else
-		{
-		  lmap.Elem(nlok) = 0;
-		  nlok--;
-
-		  lused.Elem (lmap.Get(nlok)) = 0;
-		  for (j = 0; j < 2; j++)
-		    {
-		      pused.Elem(llines.Get(lmap.Get(nlok))[j]) --;
-		      if (! pused.Get (llines.Get (lmap.Get (nlok))[j]))
-			pmap.Set (rule->GetLine (nlok)[j], 0);
-		    }
-		}
-	    }
-
-	  else
-
-	    {
-
-	      // all lines are mapped !!
-
-	      // map also all points:
-
-	      npok = 1;
-	      incnpok = 1;
-
-	      pfixed.SetSize (pmap.Size());
-	      for (i = 0; i < pmap.Size(); i++)
-		pfixed[i] = (pmap[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->GetLine (i)[0]),
-						      pmap.Get(rule->GetLine (i)[1])));
-			    }
-
-
-			  // delete old lines:
-                          for (i = 1; i <= rule->GetNDelL(); i++)
-                            dellines.Append (lmap.Get(rule->GetDelLine(i)));
-
-                          // dellines.Append (lmap[rule->GetDelLines()]);
-                          // lmap[rule->GetDelLines()];
-
-
-			  // 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 < 0.99*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 = lpoints.Range (noldlp, lpoints.Size());
-                              tempnewlines = llines.Range (noldll, llines.Size());
-                              tempdellines = dellines;
-                              tempelements = elements;
-			    }
-
-			  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)
-    {
-      lpoints.Append (tempnewpoints);
-      llines.Append (tempnewlines);
-      dellines.Append (tempdellines);
-      elements.Append (tempelements);
-    }
-
-
-  return found;
-}
-
-
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/ruler2.hpp b/contrib/Netgen/libsrc/meshing/ruler2.hpp
deleted file mode 100644
index 696bafa94d8b2f6d476c4f8c1f1f3ca859c7696e..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/ruler2.hpp
+++ /dev/null
@@ -1,167 +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); }
-  ///
-  const ARRAY<int> & GetDelLines() const { return dellines; }
-  ///
-  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 * tfp = &tolerances.Get(pi);
-    return tfp->f1 * dx * dx + tfp->f2 * dx * dy + tfp->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 30a812bcca770edb1125ce34dcc9ec18a1139766..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/ruler3.cpp
+++ /dev/null
@@ -1,1137 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-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: 2 .. it is allowed to use pointi, 1..will be allowed later, 0..no means
- ARRAY<MiniElement2d> & 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 
- )
-
-{
-  NgProfiler::RegionTimer regtot(97);
-
-  int i, j, k, ri, nfok, npok, incnpok, refpi, locpi, locfi, locfr;
-  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 MiniElement2d * locface = NULL;
-  int loktestmode;
-
-
-  static ARRAY<int> pused;        // point is already mapped
-  static ARRAY<char> fused;       // face is already mapped
-  static ARRAY<int> pmap;         // map of reference point to local point
-  static ARRAY<char> pfixed;      // point mapped by face-map
-  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 int cnt = 0;
-  static INDEX_2_CLOSED_HASHTABLE<int> ledges(100); // edges in local environment
-  
-  static ARRAY<Point3d> tempnewpoints;
-  static ARRAY<MiniElement2d> tempnewfaces;
-  static ARRAY<int> tempdelfaces;
-  static ARRAY<Element> tempelements;
-  static ARRAY<Box3d> triboxes;         // bounding boxes of local faces
-
-
-  static ARRAY<int, PointIndex::BASE> 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);
-
-  pnearness = INT_MAX/10;
-  for (j = 0; j < lfaces[0].GetNP(); j++)
-    pnearness[lfaces[0][j]] = 0;
-
-  NgProfiler::RegionTimer reg2(98);
-  
-  NgProfiler::StartTimer (90);
-
-  for (int loop = 0; loop < 2; loop++)
-    {
-
-      for (i = 0; i < lfacesplit; i++)
-	{
-	  const MiniElement2d & hface = lfaces[i];
-
-	  int minn = INT_MAX-1;
-	  for (j = 0; j < hface.GetNP(); j++)
-	    {
-	      int hi = pnearness[hface[j]];
-	      if (hi < minn) minn = hi;
-	    }
-	  if (minn < INT_MAX/10)
-	    for (j = 0; j < hface.GetNP(); j++)
-	      if (pnearness[hface[j]] > minn+1)
-		pnearness[hface[j]] = 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 (pnearness[edge.I1()] > pnearness[edge.I2()] + 1)
-	      pnearness[edge.I1()] = pnearness[edge.I2()] + 1;
-
-	    if (pnearness[edge.I2()] > pnearness[edge.I1()] + 1)
-	      pnearness[edge.I2()] = pnearness[edge.I1()] + 1;
-	  }
-
-    }
-
-  for (i = 0; i < fnearness.Size(); i++)
-    {
-      int sum = 0;
-      for (j = 0; j < lfaces[i].GetNP(); j++)
-	sum += pnearness[lfaces[i][j]];
-      fnearness[i] = sum;
-    }
-
-  
-  NgProfiler::StopTimer (90);
-  NgProfiler::StartTimer (91);
-
-  // find bounding boxes of faces
-
-  triboxes.SetSize (lfaces.Size());
-  for (i = 0; i < lfaces.Size(); i++)
-    {
-      const MiniElement2d & face = lfaces[i];
-      triboxes[i].SetPoint (lpoints.Get(face[0]));
-      for (j = 1; j < face.GetNP(); j++)
-	triboxes[i].AddPoint (lpoints.Get(face[j]));
-    }
-
-  NgProfiler::StopTimer (91);
-  NgProfiler::StartTimer (92);
-
-  
-  bool useedges = 0;
-  for (ri = 0; ri < rules.Size(); ri++)
-    if (rules[ri]->GetNEd()) useedges = 1;
-
-  if (useedges)
-    {
-      ledges.SetSize (5 * lfacesplit);
-      
-      for (j = 0; j < lfacesplit; j++)
-	// if (fnearness[j] <= 5) 
-	  {
-	    const MiniElement2d & face = lfaces[j];
-	    int newp, oldp;
-	    
-	    newp = face[face.GetNP()-1];
-	    for (k = 0; k < face.GetNP(); k++)
-	      {
-		oldp = newp;
-		newp = face[k];
-		ledges.Set (INDEX_2::Sort(oldp, newp), 1);
-	      }
-	  }
-    }
-
-  NgProfiler::StopTimer (92);
-
-  NgProfiler::RegionTimer reg3(99);
-
-  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;
-
-
-
-  // impossible, if no rule can be applied at any tolerance class
-  bool impossible = 1;
-
-
-  // check each rule:
-
-  for (ri = 1; ri <= rules.Size(); ri++)
-    { 
-      int base = (lfaces[0].GetNP() == 3) ? 100 : 200;
-      NgProfiler::RegionTimer regx1(base);
-      NgProfiler::RegionTimer regx(base+ri);
-
-      sprintf (problems.Elem(ri), "");
-
-      rule = rules.Get(ri);
-      
-      if (rule->GetNP(1) != lfaces[0].GetNP())
-	continue;
-
-      if (rule->GetQuality() > tolerance)
-	{
-	  if (rule->GetQuality() < 100) impossible = 0;
-
-	  if (testmode)
-	    sprintf (problems.Elem(ri), "Quality not ok");
-	  continue;
-	}
-      
-      if (testmode)
-	sprintf (problems.Elem(ri), "no mapping found");
-      
-      loktestmode = testmode || rule->TestFlag ('t') || tolerance > 5;
-
-      if (loktestmode)
-	(*testout) << "Rule " << ri << " = " << rule->Name() << endl;
-      
-      pmap.SetSize (rule->GetNP());
-      fmapi.SetSize (rule->GetNF());
-      fmapr.SetSize (rule->GetNF());
-      
-      fused = 0;
-      pused = 0;
-      pmap = 0;
-      fmapi = 0;
-      for (i = 1; i <= fmapr.Size(); i++)
-	fmapr.Set(i, rule->GetNP(i));
-      
-      fused[0] = 1;
-      fmapi[0] = 1;
-      fmapr[0] = rotind1;
-
-      
-      for (j = 1; j <= lfaces.Get(1).GetNP(); j++)
-	{
-	  locpi = lfaces[0].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;
-      NgProfiler::RegionTimer regfa(300);
-      NgProfiler::RegionTimer regx2(base+50+ri);
-      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)
-				    {
-				      impossible = 0;
-				      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
-	    
-	    { 
-	      NgProfiler::RegionTimer regfb(301);
-
-	      // 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) || 
-				  pnearness.Get(locpi) > rule->GetPNearness(npok))
-				{
-				  ok = 0;
-				}
-			      else if (allowpoint.Get(locpi) != 2)
-				{
-				  ok = 0;
-				  if (allowpoint.Get(locpi) == 1)
-				    impossible = 0;
-				}
-			      else
-				{
-				  const Point3d & lp = lpoints.Get(locpi);
-				  const Point3d & rp = rule->GetPoint(npok);
-
-				  if ( Dist2 (lp, rp) * rule->PointDistFactor(npok) > minerr)
-				    {
-				      ok = 0;
-				      impossible = 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
-		    
-		    {
-		      NgProfiler::RegionTimer regfa2(302);		      
-
-		      // 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++)
-			{
-			  INDEX_2 in2(pmap.Get(rule->GetEdge(i).i1),
-				      pmap.Get(rule->GetEdge(i).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++)
-				{
-				  INDEX_2 in2(pmap.Get(el.PNum(j)),
-					      pmap.Get(el.PNum(j+3)));      
-				  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 MiniElement2d & 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);
-			    }
-
-
-			  //			  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))
-			      {
-				MiniElement2d 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*n.Length()*v3.Length()) // OR -1e-7???
-			      if (n * v3 >= -1e-9)
-				{
-				  if (loktestmode)
-				    {
-				      sprintf (problems.Elem(ri), "Orientation wrong");
-				      (*testout) << "Orientation wrong ("<< n*v3 << ")" << 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 (teterr > minteterr) impossible = 0;
-
-			  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;
-    }
-
-  if (found)
-    {
-      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;
-
-
-  if (impossible && found == 0)
-    return -1;
-
-  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 66c91cfea92c1aa01dabdb5e31c7da2591c077ae..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/secondorder.cpp
+++ /dev/null
@@ -1,486 +0,0 @@
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-
-
-
-  
-  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
-	  {
-	    Point<3> 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(0);
-      
-	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](NULL);
-      
-	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
-	      {
-		Point<3> 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++)
-      {
-	const Element & el = mesh.VolumeElement(i);
-	int onp(0);
-
-	Element newel;
-	newel.SetIndex (el.GetIndex());
-
-	static int betw_tet[6][3] =
-	  { { 0, 1, 4 },
-	    { 0, 2, 5 },
-	    { 0, 3, 6 },
-	    { 1, 2, 7 },
-	    { 1, 3, 8 },
-	    { 2, 3, 9 } };
-	static int betw_prism[6][3] =
-	  {
-	    { 0, 2, 6 },
-	    { 0, 1, 7 },
-	    { 1, 2, 8 },
-	    { 3, 5, 9 },
-	    { 3, 4, 10 },
-	    { 4, 5, 11 },
-	  };
-	int (*betw)[3](NULL);
-
-	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[betw[j][0]],
-		       newel[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<Point<3> > should(np);
-	ARRAY<Point<3> > 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 = 0; j < 3; j++)
-			mesh.Point(i)(j) = 
-			  lam * should.Get(i)(j) +
-			  (1-lam) * can.Get(i)(j);
-		    }
-		  else
-		    mesh.Point(i) = Point<3> (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.5.cpp b/contrib/Netgen/libsrc/meshing/smoothing2.5.cpp
deleted file mode 100644
index 2789b785bcf4ea82f07efc9cf4d4e5d0e5105e81..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/smoothing2.5.cpp
+++ /dev/null
@@ -1,265 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#include <opti.hpp>
-
-namespace netgen
-{
-
-
-  void MeshOptimize2d :: ProjectBoundaryPoints(ARRAY<int> & surfaceindex, 
-					       const ARRAY<Point<3>* > & from, ARRAY<Point<3>* > & dest)
-  {
-    for(int i=0; i<surfaceindex.Size(); i++)
-      {
-	if(surfaceindex[i] >= 0)
-	  {
-	    *dest[i] = *from[i];
-	    ProjectPoint(surfaceindex[i],*dest[i]);
-	  }
-      }
-      
-
-  }
-
-  void MeshOptimize2d :: ImproveVolumeMesh (Mesh & mesh)
-  {
-    
-    if (!faceindex)
-      {
-	PrintMessage (3, "Smoothing");
-
-	for (faceindex = 1; faceindex <= mesh.GetNFD(); faceindex++)
-	  {
-	    ImproveVolumeMesh (mesh);
-	    if (multithread.terminate)
-	      throw NgException ("Meshing stopped");
-	  }
-	faceindex = 0;
-	return;
-      }
-      
-
-
-    static int timer = NgProfiler::CreateTimer ("MeshSmoothing 2D");
-    NgProfiler::RegionTimer reg (timer);
-
-
-
-    CheckMeshApproximation (mesh);
-
-    int i, j, k;
-    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;
-    bool moveisok;
-
-    PointGeomInfo ngi;
-    Point<3> origp;
-
-    Vector x(3);
-
-    ARRAY<MeshPoint, PointIndex::BASE> savepoints(mesh.GetNP());
-
-    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]);
-      }
-    
-
-    JacobianPointFunction pf(mesh.Points(),mesh.VolumeElements());
-
-
-
-//     Opti2SurfaceMinFunction surfminf(mesh);
-//     Opti2EdgeMinFunction edgeminf(mesh);
-//     Opti2SurfaceMinFunctionJacobian surfminfj(mesh);
-
-    OptiParameters par;
-    par.maxit_linsearch = 8;
-    par.maxit_bfgs = 5;
-
-    int np = mesh.GetNP();
-    int ne = mesh.GetNE();
-
-    BitArray badnodes(np);
-    badnodes.Clear();
-
-    for (i = 1; i <= ne; i++)
-      {
-	const Element & el = mesh.VolumeElement(i);
-	double bad = el.CalcJacobianBadness (mesh.Points());
-	if (bad > 1)
-	  for (j = 1; j <= el.GetNP(); j++)
-	    badnodes.Set (el.PNum(j));
-      }
-
-
-    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;
-
-
-    ARRAY<SurfaceElementIndex> locelements(0);
-    ARRAY<int> locrots(0);
-
-    for (PointIndex pi = PointIndex::BASE; 
-	 pi < mesh.GetNP()+PointIndex::BASE; pi++)
-      {
-	if (mesh[pi].Type() != SURFACEPOINT)
-	  continue;
-
-	if (multithread.terminate)
-	  throw NgException ("Meshing stopped");
-	
-	int surfi(-1);
-
-	if(elementsonpoint[pi].Size() == 0)
-	  continue;
-
-	Element2d & hel = mesh[elementsonpoint[pi][0]];
-
-	if(hel.GetIndex() != faceindex)
-	  continue;
-
-	cnt++;
-	if (cnt % modplot == 0 && writestatus)
-	  {
-	    printeddot = 1;
-	    PrintDot (plotchar);
-	  }
-
-		
-	int hpi = 0;
-	for (j = 1; j <= hel.GetNP(); j++)
-	  if (hel.PNum(j) == pi)
-	    {
-	      hpi = j;
-	      break;
-	    }
-	PointGeomInfo gi1 = hel.GeomInfoPi(hpi);
-	
-	locelements.SetSize(0);
-	locrots.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;
-		}
-	  }
-	 
-
-	double lh = mesh.GetH(mesh.Point(pi));
-	par.typx = lh;
-
-	pf.SetPointIndex(pi);
-	
-	x = 0;
-	bool pok = (pf.Func (x) < 1e10); 
-	
-	if (pok)
-	  {
-	    BFGS (x, pf, par);
-	    
-	    origp = mesh[pi];
-	    loci = 1;
-	    fact = 1;
-	    moveisok = false;
-	
-	    
-	    //optimizer loop (if whole distance is not possible, move only a bit!!!!)
-	    while (loci <= 5 && !moveisok)
-	      {
-		loci ++;
-		mesh[pi](0) = origp(0) + x.Get(1)*fact;
-		mesh[pi](1) = origp(1) + x.Get(2)*fact;
-		mesh[pi](2) = origp(2) + x.Get(3)*fact;
-		fact = fact/2.;
-	    
-	    
-		//cout << "origp " << origp << " newp " << mesh[pi];
-	    
-		ngi = gi1;
-		moveisok = (ProjectPointGI (surfi, mesh[pi], ngi) != 0);
-
-		//cout << " projected " << mesh[pi] << endl;
-
-		// point lies on same chart in stlsurface
-		
-		if (moveisok)
-		  {
-		    for (j = 0; j < locelements.Size(); j++)
-		      mesh[locelements[j]].GeomInfoPi(locrots[j]) = ngi;
-
-		    //cout << "moved " << origp << " to " << mesh[pi] << endl;
-		  }
-		else
-		  {
-		    mesh[pi] = origp;
-		  }
-	    
-	      }
-	  }
-	else
-	  {
-	    cout << "el not ok (point " << pi << ": " << mesh[pi] << ")" << endl;
-	  }
-      }
-
-    if (printeddot)
-      PrintDot ('\n');
-  
-    CheckMeshApproximation (mesh);
-    mesh.SetNextTimeStamp();
-  }
-
-  
-}
diff --git a/contrib/Netgen/libsrc/meshing/smoothing2.cpp b/contrib/Netgen/libsrc/meshing/smoothing2.cpp
deleted file mode 100644
index e43352828bd31f843634e22b9545552a47460ade..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/smoothing2.cpp
+++ /dev/null
@@ -1,985 +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 = 0.14433756;      // sqrt(3.0) / 12
-  static const double c_trig4 = 0.57735026;     // sqrt(3.0) / 3
-
-  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)
-      
-	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 Vec<3> normal, 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 FuncDeriv (const Vector & x, const Vector & dir, double & deriv) 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
-  {
-    Vec<3> n, vgrad;
-    Point<3> pp1;
-    double g1x, g1y;
-    double badness, hbadness;
-
-    vgrad = 0;
-    badness = 0;
-
-    meshthis -> GetNormalVector (surfi, sp1, gi1, n);
-    pp1 = sp1 + x(0) * t1 + x(1) * 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]];
-
-	Vec<3> e1 = mesh[bel.PNumMod(roti + 1)] - pp1;
-	Vec<3> e2 = mesh[bel.PNumMod(roti + 2)] - pp1;
-
-	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 -= e1e2 * e1;
-	    double e2l = e2.Length();
-
-	    CalcTriangleBadness ( e1l, e1e2, e2l, locmetricweight, loch,
-				  hbadness, g1x, g1y);
-
-	    badness += hbadness;
-            vgrad += g1x * e1 + (g1y/e2l) * e2;
-	  }
-	else
-	  {
-	    (*testout) << "very very bad badness" << endl;
-	    badness += 1e8;
-	  }
-      }
-
-    vgrad -=  (vgrad * n) * n;
-
-    grad(0) = vgrad * t1;
-    grad(1) = vgrad * t2;
-    return badness;
-  }
-
-
-
-
-  double Opti2SurfaceMinFunction :: 
-  FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
-  {
-    Vec<3> n, vgrad;
-    Point<3> pp1;
-    double g1x, g1y;
-    double badness, hbadness;
-
-    vgrad = 0;
-    badness = 0;
-
-    meshthis -> GetNormalVector (surfi, sp1, gi1, n);
-
-    pp1 = sp1 + x(0) * t1 + x(1) * t2;
-
-    for (int j = 0; j < locelements.Size(); j++)
-      {
-	int roti = locrots[j];
-
-	const Element2d & bel = mesh[locelements[j]];
-
-	Vec<3> e1 = mesh[bel.PNumMod(roti + 1)] - pp1;
-	Vec<3> e2 = mesh[bel.PNumMod(roti + 2)] - pp1;
-
-	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 -= e1e2 * e1;
-	    double e2l = e2.Length();
-
-	    CalcTriangleBadness ( e1l, e1e2, e2l, locmetricweight, loch,
-				  hbadness, g1x, g1y);
-
-	    badness += hbadness;
-            vgrad += g1x * e1 + (g1y / e2l) * e2;
-	  }
-	else
-	  {
-	    (*testout) << "very very bad badness" << endl;
-	    badness += 1e8;
-	  }
-      }
-
-    vgrad -= (vgrad * n) * n;
-    deriv = dir(0) * (vgrad*t1) + dir(1) * (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;
-    Vec<3> n1, n2, v1, v2, e1, e2, vgrad;
-    Point<3> pp1;
-    Vec<2> g1;
-    double badness, hbadness;
-
-    vgrad = 0.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(0), g1(1));
-
-	badness += hbadness;
-        vgrad += g1(0) * e1 + g1(1) * e2;
-      }
-
-    meshthis -> GetNormalVector (surfi, pp1, n1);
-    meshthis -> GetNormalVector (surfi2, pp1, n2);
-
-    v1 = Cross (n1, n2);
-    v1.Normalize();
-
-    grad(0) = (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 lpi, gpi;
-    Vec<3> n, vgrad;
-    Point<3> pp1;
-    Vec2d g1, vdir;
-    double badness, hbad, hderiv;
-
-    vgrad = 0;
-    badness = 0;
-
-    meshthis -> GetNormalVector (surfi, sp1, gi1, n);
-
-    pp1 = sp1 + x(0) * t1 + x(1) * t2;
-
-    //  meshthis -> ProjectPoint (surfi, pp1);
-    //  meshthis -> GetNormalVector (surfi, pp1, n);
-
-    static ARRAY<Point2d> pts2d;
-    pts2d.SetSize(mesh.GetNP());
-
-    grad = 0;
-
-    for (int j = 1; j <= locelements.Size(); j++)
-      {
-	lpi = locrots.Get(j);
-	const Element2d & bel = 
-	  mesh[locelements.Get(j)];
-      
-	gpi = bel.PNum(lpi);
-
-	for (int 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 (int 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;
-    Vec<3> n, vgrad;
-    Point<3> pp1;
-    Vec2d g1, vdir;
-    double badness, hbad, hderiv;
-
-    vgrad = 0;
-    badness = 0;
-
-    meshthis -> GetNormalVector (surfi, sp1, gi1, n);
-
-    // pp1 = sp1;
-    //    pp1.Add2 (x.Get(1), t1, x.Get(2), t2);
-    pp1 = sp1 + 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 Point<3> & 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;
-      }
- 
-
-
-    static int timer = NgProfiler::CreateTimer ("MeshSmoothing 2D");
-    NgProfiler::RegionTimer reg (timer);
-
-
-    CheckMeshApproximation (mesh);
-
-    SurfaceElementIndex sei;
-
-    ARRAY<SurfaceElementIndex> seia;
-    mesh.GetSurfaceElementsOfFace (faceindex, seia);
-
-    bool mixed = 0;
-    for (int 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 (int i = 0; i < seia.Size(); i++)
-      {
-	const Element2d & el = mesh[seia[i]];
-	for (int j = 0; j < el.GetNP(); j++)
-	  nelementsonpoint[el[j]]++;
-      }
-
-    TABLE<SurfaceElementIndex,PointIndex::BASE> elementsonpoint(nelementsonpoint);
-    for (int i = 0; i < seia.Size(); i++)
-      {
-	const Element2d & el = mesh[seia[i]];
-	for (int 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;
-
-    /*
-    int i, j, k;
-
-      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[pi].Type() == SURFACEPOINT)
-	{
-	  if (multithread.terminate)
-	    throw NgException ("Meshing stopped");
-	
-	  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 (int 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 (int 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 (int 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, normal);
-	  t1 = normal.GetNormal ();
-	  t2 = Cross (normal, t1);
-	  
-	  // save points, and project to tangential plane
-	  for (int j = 0; j < locelements.Size(); j++)
-	    {
-	      const Element2d & el = mesh[locelements[j]];
-	      for (int k = 0; k < el.GetNP(); k++)
-		savepoints[el[k]] = mesh[el[k]];
-	    }
-
-	  for (int j = 0; j < locelements.Size(); j++)
-	    {
-	      const Element2d & el = mesh[locelements[j]];
-	      for (int k = 0; k < el.GetNP(); k++)
-		{
-		  PointIndex hhpi = el[k];
-		  double lam = normal * (mesh[hhpi] - sp1);
-		  mesh[hhpi] -= lam * normal;
-		}
-	    }
-	  
-	  x = 0;
-	  par.typx = lochs[0];
-
-	  if (mixed)
-	    {
-	      //	      (*testout) << "vorher : " << surfminfj.Func (x) << endl;
-	      BFGS (x, surfminfj, par, 1e-6);
-	      //	      (*testout) << "nachher: " << surfminfj.Func (x) << endl;
-	      //	      (*testout) << "x = " << x << endl;
-	    }
-	  else
-	    {
-	      //	      (*testout) << "vorher : " << surfminf.Func (x) << endl;
-	      BFGS (x, surfminf, par, 1e-6);
-	      //	      (*testout) << "nachher: " << surfminf.Func (x) << endl;
-	      //	      (*testout) << "x = " << x << endl;
-	    }
-
-	
-	  origp = mesh[pi];
-	  loci = 1;
-	  fact = 1;
-	  moveisok = 0;
-
-	  // restore other points
-	  for (int j = 0; j < locelements.Size(); j++)
-	    {
-	      const Element2d & el = mesh[locelements[j]];
-	      for (int k = 0; k < el.GetNP(); k++)
-		{
-		  PointIndex hhpi = el[k];
-		  if (hhpi != pi) mesh[hhpi] = savepoints[hhpi];
-		}
-	    }
-
-	  
-	  //optimizer loop (if 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;
-              */
-              Vec<3> hv = x(0) * t1 + x(1) * t2;
-              Point3d hnp = origp + Vec3d (hv);
-              mesh[pi](0) = hnp.X();
-              mesh[pi](1) = hnp.Y();
-              mesh[pi](2) = hnp.Z();
-
-	      fact = fact/2.;
-
-	      // ProjectPoint (surfi, mesh[pi]);
-	      // moveisok = CalcPointGeomInfo(surfi, ngi, mesh[pi]); 
-
-	      ngi = gi1;
-	      moveisok = ProjectPointGI (surfi, mesh[pi], ngi);
-	      // point lies on same chart in stlsurface
-	    
-	      if (moveisok)
-		{
-		  for (int j = 0; j < locelements.Size(); j++)
-		    mesh[locelements[j]].GeomInfoPi(locrots[j]) = ngi;
-		}
-	      else
-		{
-		  mesh[pi] = Point<3> (origp);
-		}
-	    
-	    }
-	}
-
-    if (printeddot)
-      PrintDot ('\n');
-  
-    CheckMeshApproximation (mesh);
-    mesh.SetNextTimeStamp();
-  }
-
-  void MeshOptimize2d :: GetNormalVector(INDEX /* surfind */, const Point<3> & p, Vec<3> & nv) const
-  {
-    nv = Vec<3> (0, 0, 1);
-  }
-
-  void MeshOptimize2d :: GetNormalVector(INDEX surfind, const Point<3> & p, PointGeomInfo & gi, Vec<3> & 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 55b3ad9ef4254afd2469758e1e9ac6226d2d72ff..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/smoothing3.cpp
+++ /dev/null
@@ -1,1878 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-#ifdef SOLIDGEOM
-#include <csg.hpp>
-#endif
-#include <opti.hpp>
-
-
-namespace netgen
-{
-  
-
-  double MinFunctionSum :: Func (const Vector & x) const
-  {
-    double retval = 0;
-    for(int i=0; i<functions.Size(); i++)
-      retval += functions[i]->Func(x);
-      
-    return retval;
-  }
-
-  void MinFunctionSum :: Grad (const Vector & x, Vector & g) const
-  {
-    g = 0.;
-    static Vector gi(3);
-    for(int i=0; i<functions.Size(); i++)
-      {
-	functions[i]->Grad(x,gi);
-	for(int j=0; j<g.Size(); j++)
-	  g[j] += gi[j];
-      }
-  }
-      
-
-  double MinFunctionSum :: FuncGrad (const Vector & x, Vector & g) const
-  {
-    double retval = 0;
-    g = 0.;
-    static Vector gi(3);
-    for(int i=0; i<functions.Size(); i++)
-      {
-	retval += functions[i]->FuncGrad(x,gi);
-	for(int j=0; j<g.Size(); j++)
-	  g[j] += gi[j];
-      }
-    return retval;
-  }
-
-  double MinFunctionSum :: FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
-  {
-    double retval = 0;
-    deriv = 0.;
-    double derivi;
-    for(int i=0; i<functions.Size(); i++)
-      {
-	retval += functions[i]->FuncDeriv(x,dir,derivi);
-	deriv += derivi;
-      }
-    return retval;
-  }
-
-  double MinFunctionSum :: GradStopping (const Vector & x) const
-  {
-    double minfs(0), mini;
-    for(int i=0; i<functions.Size(); i++)
-      {
-	mini = functions[i]->GradStopping(x);
-	if(i==0 || mini < minfs)
-	  minfs = mini;
-      }
-    return minfs;
-  }
-
-
-  void MinFunctionSum :: AddFunction(MinFunction & fun)
-  {
-    functions.Append(&fun);
-  }
-  
-  const MinFunction & MinFunctionSum :: Function(int i) const
-  {
-    return *functions[i];
-  }
-  MinFunction & MinFunctionSum :: Function(int i)
-  {
-    return *functions[i];
-  }
-
-
-  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
-  {
-    double badness = 0;
-    Point<3> pp(vp(0), vp(1), vp(2));
-
-    for (int 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 */
-
-  // is it used ????
-  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 nf = faces.Size();
-
-    m.SetSize (nf, 4);
-  
-    for (int 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 Point<3> & pp) const;
-    virtual double PointFunctionValueGrad (const Point<3> & pp, Vec<3> & grad) const;
-    virtual double PointFunctionValueDeriv (const Point<3> & pp, const Vec<3> & 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 Point<3> & pp) const
-  {
-    int j;
-    INDEX eli;
-    const Element * el;
-    double badness;
-    //  ARRAY<const Point3d*> p(4);
-    Point<3> hp;
-
-    badness = 0;
-
-    hp = points[actpind];
-    points[actpind] = Point<3> (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] = Point<3> (hp); 
-    return badness;
-  }
-
-
-  double PointFunction :: PointFunctionValueGrad (const Point<3> & pp, Vec<3> & grad) const
-  {
-    double f;//, delta = h * 1e-6;
-    // Point<3> 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
-    //  double badness;
-    Point<3> hp;
-    Vec<3> vgradi, vgrad(0,0,0);
-
-    //  badness = 0;
-
-    hp = points[actpind];
-    points[actpind] = Point<3> (pp);
-
-    for (int j = 0; j < elementsonpoint[actpind].Size(); j++)
-      {
-	INDEX eli = elementsonpoint[actpind][j];
-	const Element & el = elements.Get(eli);
-
-	for (int 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] = Point<3> (hp); 
-
-    grad = vgrad;
-    return f;
-  }
-
-
-  double PointFunction :: PointFunctionValueDeriv (const Point<3> & pp, const Vec<3> & dir,
-						   double & deriv) const
-  {
-    double f;
-    // Point<3> hpp;
-
-    Vec<3> dirn (dir);
-    //double ldir = dir.Length();
-
-    int j, k;
-    INDEX eli;
-    //  double badness;
-    Point<3> hp;
-    Vec<3> 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] = Point<3> (hp); 
-    deriv = dir * vgrad;
-    return f;
-  }
-
-  int PointFunction :: MovePointToInner ()
-  {
-    // try point movement 
-    ARRAY<Element2d> faces;
-  
-    for (int j = 0; j < elementsonpoint[actpind].Size(); j++)
-      {
-	const Element & el = 
-	  elements.Get(elementsonpoint[actpind][j]);
-      
-	for (int 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] = Point<3> (hp);
-      }
-    else
-      ;
-    //      cout << "no inner point found" << endl;
-
-    /*
-    Point3d hp2;
-    int hi2 = FindInnerPoint (points, faces, hp2);
-    if (hi2)
-      {
-	cout << "new: inner point found" << endl;
-      }
-    else
-      cout << "new: no inner point found" << endl;
-  
-    (*testout) << "hi(orig) = " << hi << ", hi(new) = " << hi2;
-    if (hi != hi2) (*testout) << "hi different" << 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 Point<3> & pp) const;
-    virtual double PointFunctionValueGrad (const Point<3> & pp, Vec<3> & grad) const;
-  };
-
-
-  CheapPointFunction :: CheapPointFunction (Mesh::T_POINTS & apoints, 
-					    const Mesh::T_VOLELEMENTS & aelements)
-    : PointFunction (apoints, aelements)
-  {
-    ;
-  }
-
-
-  void CheapPointFunction :: SetPointIndex (PointIndex aactpind)
-  {
-    actpind = aactpind; 
-
-    int ne = elementsonpoint[actpind].Size();
-    int i, j;
-    int pi1, pi2, pi3;
-
-    m.SetSize (ne, 4);
-
-    for (i = 0; i < ne; 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, 1) = n.X();
-	m.Elem(i+1, 2) = n.Y();
-	m.Elem(i+1, 3) = n.Z();
-	m.Elem(i+1, 4) = - (n.X() * p1.X() + n.Y() * p1.Y() + n.Z() * p1.Z());
-      }
-  }
-
-  double CheapPointFunction :: PointFunctionValue (const Point<3> & pp) const
-  {
-    static Vector p4(4);
-    static Vector di;
-    int n = m.Height();
-
-    p4.Elem(1) = pp(0);
-    p4.Elem(2) = pp(1);
-    p4.Elem(3) = pp(2);
-    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 Point<3> & pp, Vec<3> & grad) const
-  {
-    static Vector p4(4);
-    static Vector di;
-
-    int n = m.Height();
-
-    p4.Elem(1) = pp(0);
-    p4.Elem(2) = pp(1);
-    p4.Elem(3) = pp(2);
-    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(0) -= idi * idi * m.Get(i, 1);
-	    grad(1) -= idi * idi * m.Get(i, 2);
-	    grad(2) -= idi * idi * m.Get(i, 3);
-	  }
-	else
-	  {
-	    return 1e16;
-	  }
-      }
-    return sum;
-  }
-
-
-
-
-
-
-
-
-  class Opti3FreeMinFunction : public MinFunction
-  { 
-    const PointFunction & pf;
-    Point<3> sp1;
-  
-  public:
-    Opti3FreeMinFunction (const PointFunction & apf);
-    void SetPoint (const Point<3> & 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
-  {
-    Point<3> pp;
-    for (int j = 0; j < 3; j++)
-      pp(j) = sp1(j) + x(j);
-    return pf.PointFunctionValue (pp);
-  }
-  
-  double Opti3FreeMinFunction :: FuncGrad (const Vector & x, Vector & grad) const
-  {
-    Vec<3> vgrad;
-    Point<3> pp;
-
-    for (int j = 0; j < 3; j++)
-      pp(j) = sp1(j) + x(j);
-
-    double val = pf.PointFunctionValueGrad (pp, vgrad);
-
-    for (int j = 0; j < 3; j++)
-      grad(j) = vgrad(j);
-
-    return val;
-  }
-
-  double Opti3FreeMinFunction :: FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const
-  {
-    Point<3> pp;
-
-    for (int j = 0; j < 3; j++)
-      pp(j) = sp1(j) + x(j);
-
-    Vec<3> vdir;
-    for (int j = 0; j < 3; j++)
-      vdir(j) = dir(j);
-
-    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();
-
-    static Vector hx;
-    hx.SetSize(n);
-
-    double eps = 1e-8;
-    double f, f11, f22; //, f12, f21
-
-    f = Func(x);
-  
-    for (int i = 1; i <= n; i++)
-      {
-	for (int 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 (max2(CalcBad (points, elements.Get(i), 0),1e-10),
-		   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);  
-    }
-
-  onplane = false;
-}
-
-void JacobianPointFunction :: SetPointIndex (PointIndex aactpind)
-{
-  actpind = aactpind; 
-}  
-
-
-double JacobianPointFunction :: Func (const Vector & v) const
-{
-  int j;
-  double badness = 0;
-
-  Point<3> hp = points.Elem(actpind);
-
-  points.Elem(actpind) = hp + Vec<3> (v.Get(1), v.Get(2), v.Get(3));
-
-  if(onplane)
-    points.Elem(actpind) -= (v.Get(1)*nv(0)+v.Get(2)*nv(1)+v.Get(3)*nv(2)) * nv;
-
-
-  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;
-
-  Point<3> hp = points.Elem(actpind);
-  points.Elem(actpind) = hp + Vec<3> (x.Get(1), x.Get(2), x.Get(3));
-
-  if(onplane)
-    points.Elem(actpind) -= (x.Get(1)*nv(0)+x.Get(2)*nv(1)+x.Get(3)*nv(2)) * nv;
-
-  Vec<3> 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;
-
-      badness += elements.Get(eli).
-	CalcJacobianBadnessGradient (points, lpi, hderiv);
-
-      for(k=0; k<3; k++)
-	g.Elem(k+1) += hderiv(k);
-	
-      /*
-      for (k = 1; k <= 3; k++)
-	{
-	  vdir = Vec3d(0,0,0);
-	  vdir.X(k) = 1;
-
-	  hbad = elements.Get(eli).
-	    CalcJacobianBadnessDirDeriv (points, lpi, vdir, hderiv);
-	  //(*testout) << "hderiv " << k << ": " << hderiv << endl;
-	  g.Elem(k) += hderiv;
-	  if (k == 1)
-	    badness += hbad;
-	}
-      */
-    }
-
-  if(onplane)
-    {
-      double scal = nv(0)*g.Get(1) + nv(1)*g.Get(2) + nv(2)*g.Get(3);
-      g.Elem(1) -= scal*nv(0);
-      g.Elem(2) -= scal*nv(1);
-      g.Elem(3) -= scal*nv(2);
-    }
-
-  //(*testout) << "g = " << g << endl;
-
-  
-  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;
-
-  Point<3> hp = points.Elem(actpind);
-  points.Elem(actpind) = Point<3> (hp + Vec3d (x.Get(1), x.Get(2), x.Get(3)));
-
-  if(onplane)
-    points.Elem(actpind) -= (Vec3d (x.Get(1), x.Get(2), x.Get(3))*nv) * nv;
-
-  double hderiv;
-  deriv = 0;
-  Vec<3> vdir(dir.Get(1), dir.Get(2), dir.Get(3));
- 
-  if(onplane)
-    {
-      double scal = vdir * nv;
-      vdir -= scal*nv;
-    }
-
-  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;
-  
-}
-
-
-
-
-
-
-
-
-
-
-#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;
-    }
-
-  const 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;
-  
-  (*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 (int 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;
-
-  ARRAY<double, PointIndex::BASE> pointh (points.Size());
-
-  if(lochfunc)
-    {
-      for(int i=1; i<=points.Size(); i++)
-	pointh[i] = GetH(points.Get(i));
-    }
-  else
-    {
-      pointh = 0;
-      for(int i=0; i<GetNE(); i++)
-	{
-	  const Element & el = VolumeElement(i+1);
-	  double h = pow(el.Volume(points),1./3.);
-	  for(int j=1; j<=el.GetNV(); j++)
-	    if(h > pointh[el.PNum(j)])
-	      pointh[el.PNum(j)] = h;
-	}
-    }
- 
-
-  const char * savetask = multithread.task;
-  multithread.task = "Smooth Mesh";
-  
-  for (PointIndex i = PointIndex::BASE; 
-       i < points.Size()+PointIndex::BASE; i++)
-    if ( (*this)[i].Type() == 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 = pointh[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)
-	  {
-            //*testout << "start BFGS, pok" << endl;
-	    BFGS (x, freeminf, par);
-            //*testout << "BFGS complete, pok" << endl;
-	    points[i](0) += x.Get(1);
-	    points[i](1) += x.Get(2);
-	    points[i](2) += 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, const BitArray * usepoint)
-{
-  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));
-    }
-
-  ARRAY<double, PointIndex::BASE> pointh (points.Size());
-
-  if(lochfunc)
-    {
-      for(i = 1; i<=points.Size(); i++)
-	pointh[i] = GetH(points.Get(i));
-    }
-  else
-    {
-      pointh = 0;
-      for(i=0; i<GetNE(); i++)
-	{
-	  const Element & el = VolumeElement(i+1);
-	  double h = pow(el.Volume(points),1./3.);
-	  for(j=1; j<=el.GetNV(); j++)
-	    if(h > pointh[el.PNum(j)])
-	      pointh[el.PNum(j)] = h;
-	}
-    }
- 
-
-
-  const char * savetask = multithread.task;
-  multithread.task = "Smooth Mesh Jacobian";
-  
-  for (i = 1; i <= points.Size(); i++)
-    {
-      if ((*this)[PointIndex(i)].Type() != INNERPOINT)
-	continue;
-
-      if(usepoint && !usepoint->Test(i))
-	continue;
-
-      //(*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 = pointh[i];
-      par.typx = lh;
-
-      pf.SetPointIndex (i);
-
-      x = 0;
-      int pok = (pf.Func (x) < 1e10); 
-
-      if (pok)
-	{
-          //*testout << "start BFGS, Jacobian" << endl;
-	  BFGS (x, pf, par);
-          //*testout << "end BFGS, Jacobian" << endl;
-	  points.Elem(i)(0) += x.Get(1);
-	  points.Elem(i)(1) += x.Get(2);
-	  points.Elem(i)(2) += x.Get(3);
-	}
-      else
-	{
-	  cout << "el not ok" << endl;
-	}
-    }
-  PrintDot ('\n');
-  
-
-  multithread.task = savetask;
-}
-
-
-
-
-// Improve Condition number of Jacobian, any elements  
-void Mesh :: ImproveMeshJacobianOnSurface (const BitArray & usepoint, 
-					   const ARRAY< Vec<3>* > & nv,
-					   OPTIMIZEGOAL goal,
-					   const ARRAY< ARRAY<int,PointIndex::BASE>* > * idmaps)
-{
-  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);
-
-  ARRAY< ARRAY<int,PointIndex::BASE>* > locidmaps;
-  const ARRAY< ARRAY<int,PointIndex::BASE>* > * used_idmaps;
-
-  if(idmaps)
-    used_idmaps = idmaps;
-  else
-    {
-      used_idmaps = &locidmaps;
-      
-      for(i=1; i<=GetIdentifications().GetMaxNr(); i++)
-	{
-	  if(GetIdentifications().GetType(i) == Identifications::PERIODIC)
-	    {
-	      locidmaps.Append(new ARRAY<int,PointIndex::BASE>);
-	      GetIdentifications().GetMap(i,*locidmaps.Last(),true);
-	    }
-	}
-    }
-
-  
-  bool usesum = (used_idmaps->Size() > 0);
-  MinFunctionSum pf_sum;
-  
-  JacobianPointFunction * pf2ptr = NULL;
-  if(usesum)
-    {
-      pf2ptr = new JacobianPointFunction(points, volelements);
-      pf_sum.AddFunction(pf);
-      pf_sum.AddFunction(*pf2ptr);
-    }
-  
-
-  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));
-    }
-
-  ARRAY<double, PointIndex::BASE> pointh (points.Size());
- 
-  if(lochfunc)
-    {
-      for(i=1; i<=points.Size(); i++)
-	pointh[i] = GetH(points.Get(i));
-    }
-  else
-    {
-      pointh = 0;
-      for(i=0; i<GetNE(); i++)
-	{
-	  const Element & el = VolumeElement(i+1);
-	  double h = pow(el.Volume(points),1./3.);
-	  for(j=1; j<=el.GetNV(); j++)
-	    if(h > pointh[el.PNum(j)])
-	      pointh[el.PNum(j)] = h;
-	}
-    }
-
-
-  const char * savetask = multithread.task;
-  multithread.task = "Smooth Mesh Jacobian";
-  
-  for (i = 1; i <= points.Size(); i++)
-    if ( usepoint.Test(i) )
-      {
-	//(*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 = pointh[i];//GetH(points.Get(i));
-	par.typx = lh;
-
-	pf.SetPointIndex (i);
-
-	int brother = -1;
-	if(usesum)
-	  {
-	    for(j=0; brother == -1 && j<used_idmaps->Size(); j++)
-	      {
-		if(i < (*used_idmaps)[j]->Size() + PointIndex::BASE)
-		  {
-		    brother = (*(*used_idmaps)[j])[i];
-		    if(brother == i || brother == 0)
-		      brother = -1;
-		  }
-	      }
-	    if(brother >= i)
-	      {
-		pf2ptr->SetPointIndex(brother);
-		pf2ptr->SetNV(*nv[brother-1]);
-	      }
-	  }
-
-	if(usesum && brother < i)
-	  continue;
-
-	//pf.UnSetNV(); x = 0;
-	//(*testout) << "before " << pf.Func(x);
-
-	pf.SetNV(*nv[i-1]);
-
-	x = 0;
-	int pok = (brother == -1) ? (pf.Func (x) < 1e10) : (pf_sum.Func (x) < 1e10);
-
-	if (pok)
-	  {
-	    
-	    if(brother == -1)
-	      BFGS (x, pf, par);
-	    else
-	      BFGS (x, pf_sum, par);
-
-
-	    for(j=1; j<=3; j++)
-	      points.Elem(i)(j-1) += x.Get(j);// - scal*nv[i-1].X(j);
-
-	    if(brother != -1)
-	      for(j=1; j<=3; j++)
-		points.Elem(brother)(j-1) += x.Get(j);// - scal*nv[brother-1].X(j);
-
-
-	  }
-	else
-	  {
-	    cout << "el not ok" << endl;
-	    (*testout) << "el not ok" << endl
-		       << "   func " << ((brother == -1) ? pf.Func(x) : pf_sum.Func (x)) << endl;
-	    if(brother != -1)
-	      (*testout) << "   func1 " << pf.Func(x) << endl
-			 << "   func2 " << pf2ptr->Func(x) << endl;
-	  }
-      }
-  
-  PrintDot ('\n');
-
-  delete pf2ptr;
-  for(i=0; i<locidmaps.Size(); i++)
-    delete locidmaps[i];
-
-  multithread.task = savetask;
-}
-
-
-
-
-}
diff --git a/contrib/Netgen/libsrc/meshing/specials.cpp b/contrib/Netgen/libsrc/meshing/specials.cpp
deleted file mode 100644
index e224f4a7e98309164209350c6ebe8e347d6bd88c..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;
-  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++)
-    {
-      Point<3> & p = mesh.Point(i);
-      double rold = sqrt (sqr(p(0)) + sqr(p(1)) + sqr(p(2)));
-      if (rold < ri) continue;
-
-      double rnew = 1 / (a * rold - b);
-      double fac = rnew / rold;
-      p(0) *= fac;
-      p(1) *= fac;
-      p(2) *= 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 a5c860cdb249f77f71c9704a754e351c963ee145..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/topology.cpp
+++ /dev/null
@@ -1,1464 +0,0 @@
-#include <mystdlib.h>
-
-#include "meshing.hpp"
-
-#ifdef PARALLEL
-#include <parallel.hpp>
-#endif
-
-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()
-{
-  static int timer = NgProfiler::CreateTimer ("topology");
-  NgProfiler::RegionTimer reg (timer);
-
-#ifdef PARALLEL
-  ParallelMeshTopology & paralleltop = mesh.GetParallelTopology();
-
-  bool isparallel = 0;
-#endif
-
-  
-  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) << " UPDATE MESH TOPOLOGY " << endl; 
-   (*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;
-
-  /*
-    generate:
-    vertex to element 
-    vertex to surface element
-    vertex to segment 
-   */
-
-
-  cnt = 0;
-  for (ElementIndex ei = 0; ei < ne; ei++)
-    {
-      const Element & el = mesh[ei];
-      int nelv = el.GetNV();
-      for (int j = 0; j < nelv; j++)
-	cnt[el[j]]++;
-    }
-
-  vert2element = new TABLE<int,PointIndex::BASE> (cnt);
-  for (ElementIndex ei = 0; ei < ne; ei++)
-    {
-      const Element & el = mesh[ei];
-      int nelv = el.GetNV();
-      for (int j = 0; j < nelv; j++)
-	vert2element->AddSave (el[j], ei+1);
-    }
-
-  cnt = 0;
-  for (SurfaceElementIndex sei = 0; sei < nse; sei++)
-    {
-      const Element2d & el = mesh[sei];
-      int nelv = el.GetNV();
-      for (int 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 (int j = 0; j < nelv; j++)
-	vert2surfelement->AddSave (el[j], sei+1);
-    }
-
-  cnt = 0;
-  for (int 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 (int i = 1; i <= nseg; i++)
-    {
-      const Segment & seg = mesh.LineSegment(i);
-      vert2segment->AddSave (seg.p1, i);
-      vert2segment->AddSave (seg.p2, i);
-    }
-
-  if (buildedges)
-    {
-      static int timer1 = NgProfiler::CreateTimer ("topology::buildedges");
-      NgProfiler::RegionTimer reg1 (timer1);
-
-      PrintMessage (5, "Update edges ");
-      
-      edges.SetSize(ne);
-      surfedges.SetSize(nse); 
-      segedges.SetSize(nseg);
-
-      for (int i = 0; i < ne; i++)
-	for (int j = 0; j < 12; j++)
-	  edges[i][j] = 0;
-      for (int i = 0; i < nse; i++)
-	for (int j = 0; j < 4; j++)
-	  surfedges[i][j] = 0;
-
-      // keep existing edges
-      cnt = 0;
-      for (int i = 0; i < edge2vert.Size(); i++)
-	cnt[edge2vert[i][0]]++;
-      TABLE<int,PointIndex::BASE> vert2edge (cnt);
-      for (int i = 0; i < edge2vert.Size(); i++)
-	vert2edge.AddSave (edge2vert[i][0], i+1);
-
-      // ensure all coarse grid and intermediate level edges
-      cnt = 0;
-      for (int i = mesh.mlbetweennodes.Begin(); i < mesh.mlbetweennodes.End(); i++)
-	{
-	  int pa[2];
-	  pa[0] = mesh.mlbetweennodes[i].I1();
-	  pa[1] = mesh.mlbetweennodes[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 (int i = mesh.mlbetweennodes.Begin(); i < mesh.mlbetweennodes.End(); i++)
-	{
-	  int pa[2];
-	  pa[0] = mesh.mlbetweennodes[i].I1();
-	  pa[1] = mesh.mlbetweennodes[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);
-      ARRAY<int,PointIndex::BASE> edgeflag(nv);
-      edgeflag = 0;
-
-      ned = edge2vert.Size();
-      ARRAY<INDEX_3> missing;
-
-      for (int i = 1; i <= nv; i++)
-	{
-	  for (int j = 1; j <= vert2edge.EntrySize(i); j++)
-	    {
-	      int ednr = vert2edge.Get(i,j);
-	      int i2 = edge2vert.Get(ednr)[1];
-	      edgeflag[i2] = i;
-	      edgenr[i2] = ednr;
-	    }
-	  for (int j = 1; j <= vert2vertcoarse.EntrySize(i); j++)
-	    {
-	      int v2 = vert2vertcoarse.Get(i,j);
-	      if (edgeflag[v2] < i)
-		{
-		  ned++;
-		  edgenr[v2] = ned;
-		  edgeflag[v2] = i;
-		  missing.Append (INDEX_3(i,v2,ned));
-		}
-	    }
-
-	  for (int 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 (int 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[edge.I2()] < i)
-		    {
-		      ned++;
-		      edgenr[edge.I2()] = ned;
-		      edgeflag[edge.I2()] = i;
-		    }
-
-		  int edgenum = edgenr[edge.I2()];
-		  if (edgedir) edgenum *= -1;
-		  edges.Elem(elnr)[k] = edgenum;
-		}
-	    }
-
-	  for (int 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 (int 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[edge.I2()] < i)
-		    {
-		      ned++;
-		      edgenr[edge.I2()] = ned;
-		      edgeflag[edge.I2()] = i;
-		    }
-	      
-		  int edgenum = edgenr[edge.I2()];
-		  if (edgedir) edgenum *= -1;
-		  surfedges.Elem(elnr)[k] = edgenum;
-		}
-	    }
-
-	  for (int 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[edge.I2()] < i)
-		{
-		  ned++;
-		  edgenr[edge.I2()] = ned;
-		  edgeflag[edge.I2()] = i;
-		}   
- 	      int edgenum = edgenr[edge.I2()];
-
-	      if (edgedir) edgenum *= -1;
-	      segedges.Elem(elnr) = edgenum;
-	    }
-	}
-
-
-      edge2vert.SetSize (ned);
-      for (int i = 1; i <= ne; i++)
-	{
-	  const Element & el = mesh.VolumeElement (i);
-      
-	  int neledges = GetNEdges (el.GetType());
-	  const ELEMENT_EDGE * eledges = GetEdges (el.GetType());
-	  
-	  for (int 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 (int i = 1; i <= nse; i++)
-	{
-	  const Element2d & el = mesh.SurfaceElement (i);
-      
-	  int neledges = GetNEdges (el.GetType());
-	  const ELEMENT_EDGE * eledges = GetEdges (el.GetType());
-	  
-	  for (int 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 (int 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 (int 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 (int i = 1; i <= edge2vert.Size(); i++)
-	(*testout) << "edge " << i << ", v1,2 = " << edge2vert.Elem(i)[0] << ", " << edge2vert.Elem(i)[1] << endl;
-	(*testout) << "surfedges:" << endl;
-	for (int 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;
-
-  // generate faces
-  if (buildfaces) //  && mesh.GetDimension() == 3)
-    {
-      int i, j;
-
-      static int timer2 = NgProfiler::CreateTimer ("topology::buildfaces");
-      NgProfiler::RegionTimer reg2 (timer2);
-
-      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(face.I1(),face.I2(),face.I3(),0);
-		    face2vert.Append (hface);
-		    // face2vert.SetSize(face2vert.Size()+1);
-		  }
-		
-		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(face4.I1(),face4.I2(),face4.I3(),face4.I4());
-		    face2vert.Append (hface);
-		  }
-		
-		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(face.I1(),face.I2(),face.I3(),0);
-		  face2vert.Append (hface);
-		}
-	      
-	      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(face4.I1(),face4.I2(),face4.I3(),face4.I3());
-		  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]+7) / 8;
-	    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());
-
-      /*
-	*testout << "face2vert: ";
-	face2vert.PrintMemInfo(cout);
-	*testout  << "faces: ";
-	faces.PrintMemInfo(cout);
-	*testout << "hashtable: ";
-	vert2face.PrintMemInfo(cout);
-      */
-
-#ifdef PARALLEL
-  (*testout) << " RESET Paralleltop" << endl;
-
-      paralleltop.Reset ();
-#endif
-
-      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++;
-#ifdef PARALLEL
-		  if ( ntasks > 1 )
-		    {
-		  if ( !paralleltop.DoCoarseUpdate() ) continue;
-		  // "illegal" faces are exchange faces
-		  /*
-		  (*testout) << "exchange face : " << i << endl;
-		  (*testout) << "points = " << face2vert[i] << endl;
-		  */
-// 		  (*testout) << "global points = ";
-// 		  for ( int j = 0; j < 3; j++ )
-// // 		    (*testout) << face2vert[i].I(j+1) << " -> " 
-// // 			       << paralleltop.GetLoc2Glob_Vert( face2vert[i].I(j+1) ) << ",  ";
-// 		  (*testout) << endl;
-// 		  if ( !paralleltop.IsExchangeFace (i+1) )
-// 		    paralleltop.SetRefinementFace (i+1);
-
-		  paralleltop.SetExchangeFace (i+1);
-		  
-		  for (int j = 0; j < 4; j++)		    
-		    {
-		      if ( face2vert[i].I(j+1) > 0 )
-			paralleltop.SetExchangeVert(face2vert[i].I(j+1));
-		    }
-		  
-		  ARRAY<int> faceedges;
-		  GetFaceEdges (i+1, faceedges);
-		  for ( int j = 0; j < faceedges.Size(); j++)
-		    {
-		      paralleltop.SetExchangeEdge ( faceedges[j] );
-		      int v1, v2;
-		      GetEdgeVertices(faceedges[j], v1, v2 );
-		    }
-		  
-		  /*
-		  (*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;
-		  */
-		    }
-		  else
-		    {
-#endif
-		  (*testout) << "illegal face : " << i << endl;
-		  (*testout) << "points = " << face2vert[i] << endl;
-		  (*testout) << "pos = ";
-		  for (j = 0; j < 4; j++)
-		    if (face2vert[i].I(j+1) >= 1)
-		      (*testout) << mesh[(PointIndex)face2vert[i].I(j+1)] << " ";
-		  (*testout) << endl;
-
-		  FlatArray<int> vertels = GetVertexElements (face2vert[i].I(1));
-		  for (int k = 0; k < vertels.Size(); k++)
-		    {
-		      int elfaces[10], orient[10];
-		      int nf = GetElementFaces (vertels[k], elfaces, orient);
-		      for (int l = 0; l < nf; l++)
-			if (elfaces[l] == i)
-			  {
-			    (*testout) << "is face of element " << vertels[k] << endl;
-			    
-			    if (mesh.coarsemesh && mesh.hpelements->Size() == mesh.GetNE() )
-			      {
-				const HPRefElement & hpref_el =
-				  (*mesh.hpelements) [ mesh.VolumeElement (vertels[k]).hp_elnr];
-				(*testout) << "coarse eleme = " << hpref_el.coarse_elnr << endl;
-			      }
-
-			  }
-		    }
-#ifdef PARALLEL
-		    }
-#endif
-		}
-	    }
-
-#ifndef PARALLEL
-	  if (cnt_err)
-	    cout << cnt_err << " elements are not matching !!!" << endl;
-#else
-	  if (cnt_err && ntasks == 1)
-	    cout << cnt_err << " elements are not matching !!!" << endl;
-	  else if (cnt_err && ntasks > 1)
-	    {
-	      cout << "p" << id << ":  " << cnt_err << " elements are not local" << endl;
-	      isparallel = 1;
-	    }
-	  else if ( ntasks > 1 )
-	    cout << "p" << id << ":  " << "Partition " << id << " is totally local" << endl;
-#endif
-
-	}
-
-#ifdef PARALLEL
-     
-      if ( isparallel )
-	{
- 	  paralleltop.Update();
-	  if ( paralleltop.DoCoarseUpdate() )
-	    {
-	      paralleltop.UpdateCoarseGrid();
-	    }
-	  else
-	    {
-	      //  paralleltop.UpdateRefinement();
-	    }
-	  // paralleltop.Print();
-	}
-
- 
-#endif
-
-
-
-
-    }
- 
- 
-  
-  /* 
-for (i = 1; i <= ne; i++)
-    {
-    (*testout) << "Element " << i << endl;
-    (*testout) << "PNums " << endl; 
-    for( int l=1;l<=8;l++) *testout << mesh.VolumeElement(i).PNum(l) << "\t"; 
-    *testout << endl; 
-    (*testout) << "edges: " << endl;
-    for (j = 0; j < 9; j++)
-    (*testout) << edges.Elem(i)[j] << " ";
-    (*testout) << "faces: " << endl;
-    for (j = 0; j < 6; j++)m
-    (*testout) << faces.Elem(i)[j] << " ";
-    }
-
-    for (i = 1; i <= nse; i++)
-    {
-    (*testout) << "SElement " << i << endl;
-    (*testout) << "PNums " << endl; 
-    for( int l=1;l<=4;l++) *testout << mesh.SurfaceElement(i).PNum(l) << "\t"; 
-    *testout << endl; 
-    }
-  */
-  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;
-}
-
-
-
-
-
-
-
-
-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, bool withorientation) 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;
-      if(withorientation)
-	{
-	  int orient = (faces.Get(elnr)[i-1]-1) % 8;
-	  if(orient == 1 || orient == 2 || orient == 4 || orient == 7)
-	    elfaces.Elem(i) *= -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
-    {
-		throw NgException("rethink implementation");
-		/*
-      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> & fedges, bool withorientation) const
-{
-  ArrayMem<int,4> pi(4);
-  ArrayMem<int,12> eledges;
-  
-  fedges.SetSize (0);
-  GetFaceVertices(fnr, pi);
-
-  // Sort Edges according to global vertex numbers 
-  // e1 = fmax, f2 
-  // e2 = fmax, f1 
-  // e3 = op e1(f2,f3) 
-  // e4 = op e2(f1,f3) 
-
-  /*  ArrayMem<int,4> fp; 
-  fp[0] = pi[0]; 
-  for(int k=1;k<pi.Size();k++) 
-    if(fp[k]>fp[0]) swap(fp[k],fp[0]); 
-  
-    fp[1] = fp[0]+ */ 
-  
-
-  //  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 nref_faces = GetNFaces (el.GetType());
-      const ELEMENT_FACE * ref_faces = GetFaces (el.GetType());
-      int nfa_ref_edges = GetNEdges (GetFaceType(fnr));
-      
-      int cntv = 0,fa=-1; 
-      for(int m=0;m<nref_faces;m++)
-	{ 
-	  cntv=0;
-	  for(int j=0;j<nfa_ref_edges && ref_faces[m][j]>0;j++)
-	    for(int k=0;k<pi.Size();k++)
-	      {
-		if(el[ref_faces[m][j]-1] == pi[k])
-		  cntv++;
-	      }
-	  if (cntv == pi.Size())
-	    {
-	      fa=m;
-	      break;
-	    }
-	}
-     
-      if(fa>=0)
-	{
-	  const ELEMENT_EDGE * fa_ref_edges = GetEdges(GetFaceType(fnr)); 
-	  fedges.SetSize(nfa_ref_edges);
-	  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) // eledges[j] is on face 
-		{
-		  // fedges.Append (eledges[j]);
-		  for(int k=0;k<nfa_ref_edges;k++)
-		    {
-		      int w1 = el[ref_faces[fa][fa_ref_edges[k][0]-1]-1]; 
-		      int w2 = el[ref_faces[fa][fa_ref_edges[k][1]-1]-1]; 
-
-		      if(withorientation)
-			{
-			  if(w1==vi1 && w2==vi2)
-			    fedges[k] = eledges[j];
-			  if(w1==vi2 && w2==vi1)
-			    fedges[k] = -eledges[j];
-			}
-		      else
-			if((w1==vi1 && w2==vi2) || (w1==vi2 && w2==vi1))
-			  fedges[k] = eledges[j];
-		    }
-		}
-	    }
-	  
-	  // *testout << " Face " << fnr << endl; 
-	  // *testout << " GetFaceEdges " << fedges << endl;
-	  
-	  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);
-    }
-}
-
-
-int MeshTopology :: GetVerticesEdge ( int v1, int v2 ) const
-{
-  ARRAY<int> elements_v1, elementedges;
-  GetVertexElements ( v1, elements_v1);
-  int edv1, edv2;
-
-  for ( int i = 0; i < elements_v1.Size(); i++ )
-    {
-      GetElementEdges( elements_v1[i], elementedges );
-      for ( int ed = 0; ed < elementedges.Size(); ed ++)
-	{
-	  GetEdgeVertices( elementedges[ed], edv1, edv2 );
-	  if ( ( edv1 == v1 && edv2 == v2 ) || ( edv1 == v2 && edv2 == v1 ) )
-	    return elementedges[ed];
-	}
-    }
-
-  return -1;
-}
-
-
-
-void MeshTopology :: GetSegmentVolumeElements ( int segnr, ARRAY<int> & volels ) const
-{
-  int v1, v2;
-  GetEdgeVertices ( GetSegmentEdge (segnr), v1, v2 );
-  ARRAY<int> volels1, volels2;
-  GetVertexElements ( v1, volels1 );
-  GetVertexElements ( v2, volels2 );
-  volels.SetSize(0);
-
-  for ( int eli1=1; eli1 <= volels1.Size(); eli1++)
-    if ( volels2.Contains( volels1.Elem(eli1) ) )
-      volels.Append ( volels1.Elem(eli1) );
-
-}
-}
diff --git a/contrib/Netgen/libsrc/meshing/topology.hpp b/contrib/Netgen/libsrc/meshing/topology.hpp
deleted file mode 100644
index be1a3456dcfc099a441a4d3de907a9c724b404ac..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/topology.hpp
+++ /dev/null
@@ -1,325 +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;
-  bool buildedges;
-  bool 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:
-  int GetNSurfedges() const {return surfedges.Size();}
-
-  MeshTopology (const Mesh & amesh);
-  ~MeshTopology ();
-
-  void SetBuildEdges (bool be)
-  { buildedges = be; }
-  void SetBuildFaces (bool bf)
-  { buildfaces = bf; }
-
-  bool HasEdges () const
-  { return buildedges; }
-  bool HasFaces () const
-  { return buildfaces; }
-
-  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);
-  inline static const ELEMENT_EDGE * GetEdges (ELEMENT_TYPE et);
-  inline 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, bool withorientation = false) 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, bool withorientation = false) 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;
-
-
-  
-  int GetVerticesEdge ( int v1, int v2) const;
-  void GetSegmentVolumeElements ( int segnr, ARRAY<int> & surfels ) const;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-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 const int trig_faces[1][4] = 
-    { { 1, 2, 3, 0 } };
-  static const int quad_faces[1][4] = 
-    { { 1, 2, 3, 4 } };
-
-  static const int tet_faces[4][4] =
-    { { 4, 2, 3, 0 },
-      { 4, 3, 1, 0 },
-      { 4, 1, 2, 0 },
-      { 1, 3, 2, 0 } };
-  
-  static const 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 const 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 const 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;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#endif
diff --git a/contrib/Netgen/libsrc/meshing/triarls.cpp b/contrib/Netgen/libsrc/meshing/triarls.cpp
deleted file mode 100644
index d82806e9bcbd9cf9f5b8a90306e1cee23c0bf4bc..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 X2, 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/validate.cpp b/contrib/Netgen/libsrc/meshing/validate.cpp
deleted file mode 100644
index d519e27c25d58a8779a7e9a00b2784b5624f30f6..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/validate.cpp
+++ /dev/null
@@ -1,587 +0,0 @@
-
-#include <mystdlib.h>
-#include "meshing.hpp"
-
-
-namespace netgen
-{
-  void GetPureBadness(Mesh & mesh, ARRAY<double> & pure_badness,
-		      const BitArray & isnewpoint)
-  {
-    //const int ne = mesh.GetNE();
-    const int np = mesh.GetNP();
-
-    pure_badness.SetSize(np+PointIndex::BASE+1);
-    pure_badness = -1;
-
-    ARRAY< Point<3>* > backup(np);
-
-    for(int i=0; i<np; i++)
-      {
-	backup[i] = new Point<3>(mesh.Point(i+1));
-
-	if(isnewpoint.Test(i+PointIndex::BASE) &&
-	   mesh.mlbetweennodes[i+PointIndex::BASE][0] > 0)
-	  {
-	    mesh.Point(i+1) = Center(mesh.Point(mesh.mlbetweennodes[i+PointIndex::BASE][0]),
-				     mesh.Point(mesh.mlbetweennodes[i+PointIndex::BASE][1]));
-	  }
-      }
-    for (ElementIndex i = 0; i < mesh.GetNE(); i++)
-      {
-	double bad = mesh[i].CalcJacobianBadness (mesh.Points());
-	for(int j=0; j<mesh[i].GetNP(); j++)
-	  if(bad > pure_badness[mesh[i][j]])
-	    pure_badness[mesh[i][j]] = bad;
-
-	// save maximum
-	if(bad > pure_badness.Last())
-	  pure_badness.Last() = bad; 
-      }
-    
-    for(int i=0; i<np; i++)
-      {
-	mesh.Point(i+1) = *backup[i];
-	delete backup[i];
-      }
-  }
-
-
-  double Validate(const Mesh & mesh, ARRAY<ElementIndex> & bad_elements,
-		  const ARRAY<double> & pure_badness,
-		  double max_worsening, const bool uselocalworsening,
-		  ARRAY<double> * quality_loss)
-  {
-    PrintMessage(3,"!!!! Validating !!!!");
-    //if(max_worsening > 0)
-    //  (*testout) << "badness " << counter++ << endl;
-
-    bad_elements.SetSize(0);
-
-    double loc_pure_badness = -1;
-
-    if(!uselocalworsening)
-      loc_pure_badness = pure_badness.Last(); // maximum is saved at last position
-
-
-    double worsening = -1;
-    ElementIndex ind;
-
-    if(quality_loss != NULL)
-      quality_loss->SetSize(mesh.GetNE());
-
-    for (ElementIndex i = 0; i < mesh.GetNE(); i++)
-      {
-	if(uselocalworsening)
-	  {
-	    loc_pure_badness = -1;
-	    for(int j=0; j<mesh[i].GetNP(); j++)
-	      if(pure_badness[mesh[i][j]] > loc_pure_badness)
-		loc_pure_badness = pure_badness[mesh[i][j]];
-	  }
-
-
-	double bad = mesh[i].CalcJacobianBadness (mesh.Points());
-	if (bad > 1e10 || 
-	    (max_worsening > 0 && bad > loc_pure_badness*max_worsening))
-	  bad_elements.Append(i);
-	  
-
-	if(max_worsening > 0)
-	  {
-	    double actw = bad/loc_pure_badness;
-	    if(quality_loss != NULL)
-	      (*quality_loss)[i] = actw;
-
-	    if(actw > worsening)
-	      {
-		worsening = actw;
-		ind = i;
-	      }
-	  }
-      }
-    return worsening;
-  }
-
-
-  void GetWorkingArea(BitArray & working_elements, BitArray & working_points,
-		      const Mesh & mesh, const ARRAY<ElementIndex> & bad_elements,
-		      const int width)
-  {
-    working_elements.Clear();
-    working_points.Clear();
-
-    for(int i=0; i<bad_elements.Size(); i++)
-      {
-	working_elements.Set(bad_elements[i]);
-	const Element & el = mesh[bad_elements[i]];
-	for(int j=1; j<=el.GetNP(); j++)
-	  working_points.Set(el.PNum(j));
-      }
-    
-
-    for(int i=0; i<width; i++)
-      {
-	for(ElementIndex j=0; j<mesh.GetNE(); j++)
-	  {
-	    if(!working_elements.Test(j))
-	      {  
-		const Element & el = mesh[j];
-		bool set_active = false;
-		
-		for(int k=1; !set_active && k<=el.GetNP(); k++)
-		  set_active = working_points.Test(el.PNum(k));
-		
-		if(set_active)
-		  working_elements.Set(j);
-	      }
-	  }
-
-	for(ElementIndex j=0; j<mesh.GetNE(); j++)
-	  {
-	    if(working_elements.Test(j))
-	      {
-		const Element & el = mesh[j];
-		for(int k=1; k<=el.GetNP(); k++)
-		  working_points.Set(el.PNum(k));
-	      }
-	  }
-      }
-  }
-
-
-
-  void RepairBisection(Mesh & mesh, ARRAY<ElementIndex> & bad_elements, 
-		       const BitArray & isnewpoint, Refinement & refinement,
-		       const ARRAY<double> & pure_badness, 
-		       double max_worsening, const bool uselocalworsening,
-		       const ARRAY< ARRAY<int,PointIndex::BASE>* > & idmaps)
-  {
-    ostringstream ostrstr;
-
-    const int maxtrials = 100;
-
-    //bool doit;
-    //cout << "DOIT: " << flush;
-    //cin >> doit;
-
-    int ne = mesh.GetNE();
-    int np = mesh.GetNP();
-
-    int numbadneighbours = 3;
-    const int numtopimprove = 3;
-
-    PrintMessage(1,"repairing");
-
-    PushStatus("Repair Bisection");
-
-    ARRAY<Point<3>* > should(np);
-    ARRAY<Point<3>* > can(np);
-    ARRAY<Vec<3>* > nv(np);
-    for(int i=0; i<np; i++)
-      {
-	nv[i] = new Vec<3>;
-	should[i] = new Point<3>;
-	can[i] = new Point<3>;
-      }
-    
-    BitArray isboundarypoint(np),isedgepoint(np);
-    isboundarypoint.Clear();
-    isedgepoint.Clear();
-
-    for(int i = 1; i <= mesh.GetNSeg(); i++)
-      {
-	const Segment & seg = mesh.LineSegment(i);
-	isedgepoint.Set(seg.p1);
-	isedgepoint.Set(seg.p2);
-      }
-
-    ARRAY<int> surfaceindex(np);
-    surfaceindex = -1;
-    
-    for (int i = 1; i <= mesh.GetNSE(); i++)
-      {
-	const Element2d & sel = mesh.SurfaceElement(i);
-	for (int j = 1; j <= sel.GetNP(); j++)
-	  if(!isedgepoint.Test(sel.PNum(j)))
-	    {
-	      isboundarypoint.Set(sel.PNum(j));
-	      surfaceindex[sel.PNum(j) - PointIndex::BASE] = 
-		mesh.GetFaceDescriptor(sel.GetIndex()).SurfNr();
-	    }
-      }
-
-
-
-    Validate(mesh,bad_elements,pure_badness,
-	     ((uselocalworsening) ?  (0.8*(max_worsening-1.) + 1.) : (0.1*(max_worsening-1.) + 1.)),
-	     uselocalworsening); // -> larger working area
-    BitArray working_elements(ne);
-    BitArray working_points(np);
-
-    GetWorkingArea(working_elements,working_points,mesh,bad_elements,numbadneighbours);
-    //working_elements.Set();
-    //working_points.Set();
-
-    ostrstr.str("");
-    ostrstr << "worsening: " <<
-      Validate(mesh,bad_elements,pure_badness,max_worsening,uselocalworsening);
-    PrintMessage(4,ostrstr.str());
-
-    
-
-    int auxnum=0;
-    for(int i=1; i<=np; i++)
-      if(working_points.Test(i))
-	auxnum++;
-    
-    ostrstr.str("");
-    ostrstr << "Percentage working points: " << 100.*double(auxnum)/np;
-    PrintMessage(5,ostrstr.str());
-    
-
-    BitArray isworkingboundary(np);
-    for(int i=1; i<=np; i++)
-      if(working_points.Test(i) && isboundarypoint.Test(i))
-	isworkingboundary.Set(i);
-      else
-	isworkingboundary.Clear(i);
-
-
-    for(int i=0; i<np; i++)
-      *should[i] = mesh.Point(i+1);
-
-    
-    for(int i=0; i<np; i++)
-      {
-	if(isnewpoint.Test(i+PointIndex::BASE) && 
-	   //working_points.Test(i+PointIndex::BASE) && 
-	   mesh.mlbetweennodes[i+PointIndex::BASE][0] > 0)
-	  *can[i] = Center(*can[mesh.mlbetweennodes[i+PointIndex::BASE][0]-PointIndex::BASE],
-			   *can[mesh.mlbetweennodes[i+PointIndex::BASE][1]-PointIndex::BASE]);
-	else
-	  *can[i] = mesh.Point(i+1);
-      }
-
-
-    int cnttrials = 1;
-    
-    double lamedge = 0.5;
-    double lamface = 0.5;
-    
-    double facokedge = 0;
-    double facokface = 0;
-    double factryedge;
-    double factryface = 0;
-
-    double oldlamedge,oldlamface;
-
-    MeshOptimize2d * optimizer2d = refinement.Get2dOptimizer();
-    if(!optimizer2d)
-      {
-	cerr << "No 2D Optimizer!" << endl;
-	return;
-      }    
-
-    while ((facokedge < 1.-1e-8 || facokface < 1.-1e-8) && 
-	   cnttrials < maxtrials &&
-	   multithread.terminate != 1)
-      {
-	(*testout) << "   facokedge " << facokedge << " facokface " << facokface << " cnttrials " << cnttrials << endl
-		   << " perc. " << 95. * max2( min2(facokedge,facokface),
-					       double(cnttrials)/double(maxtrials)) << endl;
-
-	SetThreadPercent(95. * max2( min2(facokedge,facokface),
-				     double(cnttrials)/double(maxtrials)));
-
-	ostrstr.str("");
-	ostrstr << "max. worsening " << max_worsening;
-	PrintMessage(5,ostrstr.str());
-	oldlamedge = lamedge;
-	lamedge *= 6;
-	if (lamedge > 2)
-	  lamedge = 2;
-	   
-	if(1==1 || facokedge < 1.-1e-8)
-	  {
-	    for(int i=0; i<nv.Size(); i++)
-	      *nv[i] = Vec<3>(0,0,0);
-	    for (int i = 1; i <= mesh.GetNSE(); i++)
-	      {
-		const Element2d & sel = mesh.SurfaceElement(i);
-		Vec<3> auxvec = Cross(mesh.Point(sel.PNum(2))-mesh.Point(sel.PNum(1)),
-                                      mesh.Point(sel.PNum(3))-mesh.Point(sel.PNum(1)));
-		auxvec.Normalize();
-		for (int j = 1; j <= sel.GetNP(); j++)
-		  if(!isedgepoint.Test(sel.PNum(j)))
-		    *nv[sel.PNum(j) - PointIndex::BASE] += auxvec;
-	      }
-	    for(int i=0; i<nv.Size(); i++)
-	      nv[i]->Normalize();
-	    
-	    
-	    do  // move edges
-	      {
-		lamedge *= 0.5;
-		cnttrials++;
-		if(cnttrials % 10 == 0)
-		  max_worsening *= 1.1;
-		
-		
-		factryedge = lamedge + (1.-lamedge) * facokedge;
-
-		ostrstr.str("");
-		ostrstr << "lamedge = " << lamedge << ", trying: " << factryedge;
-		PrintMessage(5,ostrstr.str());
-		
-
-		for (int i = 1; i <= np; i++)
-		  {
-		    if (isedgepoint.Test(i))
-		      {
-			for (int j = 0; j < 3; j++)
-			  mesh.Point(i)(j) = 
-			    lamedge * (*should.Get(i))(j) +
-			    (1.-lamedge) * (*can.Get(i))(j);
-		      }
-		    else
-		      mesh.Point(i) = *can.Get(i);
-		  }
-		if(facokedge < 1.-1e-8)
-		  {
-		    ostrstr.str("");
-		    ostrstr << "worsening: " <<
-		      Validate(mesh,bad_elements,pure_badness,max_worsening,uselocalworsening);
-
-		    PrintMessage(5,ostrstr.str());
-		  }
-		else
-		  Validate(mesh,bad_elements,pure_badness,-1,uselocalworsening);
-
-
-		ostrstr.str("");
-		ostrstr << bad_elements.Size() << " bad elements";
-		PrintMessage(5,ostrstr.str());
-	      }
-	    while (bad_elements.Size() > 0 && 
-		   cnttrials < maxtrials &&
-		   multithread.terminate != 1);
-	  }
-
-	if(cnttrials < maxtrials &&
-	   multithread.terminate != 1)
-	  {
-	    facokedge = factryedge;
-	    
-	    // smooth faces
-	    mesh.CalcSurfacesOfNode();
-	    
-	    mesh.ImproveMeshJacobianOnSurface(isworkingboundary,nv,OPT_QUALITY,&idmaps);
-	    
-	    for (int i = 1; i <= np; i++)
-	      *can.Elem(i) = mesh.Point(i);
-	    
-	    if(optimizer2d)
-	      optimizer2d->ProjectBoundaryPoints(surfaceindex,can,should);
-	  }
-
-
-	oldlamface = lamface;
-	lamface *= 6;
-	if (lamface > 2)
-	  lamface = 2;
-
-
-	if(cnttrials < maxtrials &&
-	   multithread.terminate != 1)
-	  {
-
-	    do  // move faces
-	      {
-		lamface *= 0.5;
-		cnttrials++;
-		if(cnttrials % 10 == 0)
-		  max_worsening *= 1.1;
-		factryface = lamface + (1.-lamface) * facokface;
-
-		ostrstr.str("");
-		ostrstr << "lamface = " << lamface << ", trying: " << factryface;
-		PrintMessage(5,ostrstr.str());
-		
-		
-		for (int i = 1; i <= np; i++)
-		  {
-		    if (isboundarypoint.Test(i))
-		      {
-			for (int j = 0; j < 3; j++)
-			  mesh.Point(i)(j) = 
-			    lamface * (*should.Get(i))(j) +
-			    (1.-lamface) * (*can.Get(i))(j);
-		      }
-		    else
-		      mesh.Point(i) = *can.Get(i);
-		  }
-
-		ostrstr.str("");
-		ostrstr << "worsening: " <<
-		  Validate(mesh,bad_elements,pure_badness,max_worsening,uselocalworsening);
-		PrintMessage(5,ostrstr.str());
-	
-
-		ostrstr.str("");
-		ostrstr << bad_elements.Size() << " bad elements";
-		PrintMessage(5,ostrstr.str());
-	      }
-	    while (bad_elements.Size() > 0 && 
-		   cnttrials < maxtrials &&
-		   multithread.terminate != 1);
-	  }
-
-
-
-	if(cnttrials < maxtrials &&
-	   multithread.terminate != 1)
-	  {
-	    facokface = factryface;
-	    // smooth interior
-	    
-	    mesh.CalcSurfacesOfNode();
-	    
-	    mesh.ImproveMeshJacobian (OPT_QUALITY,&working_points);
-	    //mesh.ImproveMeshJacobian (OPT_WORSTCASE,&working_points);
-	  
-
-	    for (int i = 1; i <= np; i++)
-	      *can.Elem(i) = mesh.Point(i);
-	  }
-	  
-	//!
-	if((facokedge < 1.-1e-8 || facokface < 1.-1e-8) && 
-	   cnttrials < maxtrials &&
-	   multithread.terminate != 1)
-	  {
-	    MeshOptimize3d optmesh;
-	    for(int i=0; i<numtopimprove; i++)
-	      {
-		optmesh.SwapImproveSurface(mesh,OPT_QUALITY,&working_elements,&idmaps);
-		optmesh.SwapImprove(mesh,OPT_QUALITY,&working_elements);
-		
-	      }	    
-
-	    //	    mesh.mglevels = 1;
-	    
-		
-	    ne = mesh.GetNE();
-	    working_elements.SetSize(ne);
-	    
-	    
-	    for (int i = 1; i <= np; i++)
-	      mesh.Point(i) = *should.Elem(i);
-	    
-	    Validate(mesh,bad_elements,pure_badness,
-		     ((uselocalworsening) ?  (0.8*(max_worsening-1.) + 1.) : (0.1*(max_worsening-1.) + 1.)),
-		     uselocalworsening);
-	    
-	    if(lamedge < oldlamedge || lamface < oldlamface)
-	      numbadneighbours++;
-	    GetWorkingArea(working_elements,working_points,mesh,bad_elements,numbadneighbours);
-	    for(int i=1; i<=np; i++)
-	      if(working_points.Test(i) && isboundarypoint.Test(i))
-		isworkingboundary.Set(i);
-	      else
-		isworkingboundary.Clear(i);
-	    auxnum=0;
-	    for(int i=1; i<=np; i++)
-	      if(working_points.Test(i))
-		auxnum++;
-
-	    
-	    ostrstr.str("");
-	    ostrstr << "Percentage working points: " << 100.*double(auxnum)/np;
-	    PrintMessage(5,ostrstr.str());
-	    
-	    for (int i = 1; i <= np; i++)
-	      mesh.Point(i) = *can.Elem(i);
-	  }
-	//!
-
-      }
-
-    MeshOptimize3d optmesh;
-    for(int i=0; i<numtopimprove && multithread.terminate != 1; i++)
-      {
-	optmesh.SwapImproveSurface(mesh,OPT_QUALITY,NULL,&idmaps);
-	optmesh.SwapImprove(mesh,OPT_QUALITY);
-	//mesh.UpdateTopology();
-      }
-    mesh.UpdateTopology();
-    /*
-    if(cnttrials < 100)
-      {
-	nv = Vec3d(0,0,0);
-	for (int i = 1; i <= mesh.GetNSE(); i++)
-	  {
-	    const Element2d & sel = mesh.SurfaceElement(i);
-	    Vec3d auxvec = Cross(mesh.Point(sel.PNum(2))-mesh.Point(sel.PNum(1)),
-				 mesh.Point(sel.PNum(3))-mesh.Point(sel.PNum(1)));
-	    auxvec.Normalize();
-	    for (int j = 1; j <= sel.GetNP(); j++)
-	      if(!isedgepoint.Test(sel.PNum(j)))
-		nv[sel.PNum(j) - PointIndex::BASE] += auxvec;
-	  }
-	for(int i=0; i<nv.Size(); i++)
-	  nv[i].Normalize();
-	
-
-	mesh.ImproveMeshJacobianOnSurface(isboundarypoint,nv,OPT_QUALITY);
-	mesh.CalcSurfacesOfNode();
-	    // smooth interior
-	    
-	
-	for (int i = 1; i <= np; i++)
-	  if(isboundarypoint.Test(i))
-	    can.Elem(i) = mesh.Point(i);
-	    
-	if(optimizer2d)
-	  optimizer2d->ProjectBoundaryPoints(surfaceindex,can,should);
-
-	
-	for (int i = 1; i <= np; i++)
-	  if(isboundarypoint.Test(i))
-	    for(int j=1; j<=3; j++)
-	      mesh.Point(i).X(j) = should.Get(i).X(j);
-      }
-    */
-
-
-    if(cnttrials == maxtrials)
-      {
-	for (int i = 1; i <= np; i++)
-	  mesh.Point(i) = *should.Get(i);
-
-	Validate(mesh,bad_elements,pure_badness,max_worsening,uselocalworsening);
-	
-	for(int i=0; i<bad_elements.Size(); i++)
-	  {
-	    ostrstr.str("");
-	    ostrstr << "bad element:" << endl
-		    << mesh[bad_elements[i]][0] << ": " << mesh.Point(mesh[bad_elements[i]][0]) << endl
-		    << mesh[bad_elements[i]][1] << ": " << mesh.Point(mesh[bad_elements[i]][1]) << endl
-		    << mesh[bad_elements[i]][2] << ": " << mesh.Point(mesh[bad_elements[i]][2]) << endl
-		    << mesh[bad_elements[i]][3] << ": " << mesh.Point(mesh[bad_elements[i]][3]);
-	    PrintMessage(5,ostrstr.str());
-	  }
-	for (int i = 1; i <= np; i++)
-	  mesh.Point(i) = *can.Get(i);
-      }
-
-    for(int i=0; i<np; i++)
-      {
-	delete nv[i];
-	delete can[i];
-	delete should[i];
-      }
-
-    PopStatus();
-  }
-}
diff --git a/contrib/Netgen/libsrc/meshing/validate.hpp b/contrib/Netgen/libsrc/meshing/validate.hpp
deleted file mode 100644
index 5f898c179db6cb9105660b4cf637c8982eec9320..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/validate.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef VALIDATE_HPP
-#define VALIDATE_HPP
-
-
-
-void GetPureBadness(Mesh & mesh, ARRAY<double> & pure_badness,
-		    const BitArray & isnewpoint);
-double Validate(const Mesh & mesh, ARRAY<ElementIndex> & bad_elements,
-		const ARRAY<double> & pure_badness, 
-		double max_worsening, const bool uselocalworsening,
-		ARRAY<double> * quality_loss = NULL);
-void RepairBisection(Mesh & mesh, ARRAY<ElementIndex> & bad_elements, const BitArray & isnewpoint, Refinement & refinement,
-		     const ARRAY<double> & pure_badness, 
-		     double max_worsening, const bool uselocalworsening,
-		     const ARRAY< ARRAY<int,PointIndex::BASE>* > & idmaps);
-
-#endif // VALIDATE_HPP
diff --git a/contrib/Netgen/libsrc/meshing/zrefine.cpp b/contrib/Netgen/libsrc/meshing/zrefine.cpp
deleted file mode 100644
index 13e02bbaf955b4ce5a1b084a10f01d261c6435be..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/meshing/zrefine.cpp
+++ /dev/null
@@ -1,742 +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++)
-      {
-	//if(geom.singedges.Get(i)->maxhinit > 0)
-	//  continue; //!!!!
-
-	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;
-    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(0);
-	      
-		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();
-		    //(*testout) << "idnr " << idnr << " i " << i << endl;
-		    //(*testout) << "slices " << slices << endl;
-		    double slicefac = slices.Get(slicenr);
-		    double slicefaclast = 
-		      (slicenr == slices.Size()) ? 1 : slices.Get(slicenr+1);
-		    
-		    Point3d np = p1 + (slicefac / slicefaclast) * (p2-p1);
-		    //(*testout) << "slicenr " << slicenr << " slicefac " << slicefac << " quot " << (slicefac / slicefaclast) << " np " << np << endl;
-		    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/opti/bfgs.cpp b/contrib/Netgen/libsrc/opti/bfgs.cpp
deleted file mode 100644
index d106b6f1c0421d5fde9ae5068ee7468d22aafd24..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/opti/bfgs.cpp
+++ /dev/null
@@ -1,410 +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);
-    }
-  */
-
-
-
-  double val;
-
-  int n = l.Height();
-  p = g;
-  
-  for (int i = 0; i < n; i++)
-    {
-      val = 0;
-      for (int j = i; j < n; j++)
-	val += p(j) * l(j, i);
-      p(i) = val;
-    }
-
-  for (int i = 0; i < n; i++)
-    p(i) *= d(i);
-
-  for (int i = n-1; i >= 0; i--)
-    {
-      val = 0;
-      for (int j = 0; j <= i; j++)
-	val += p(j) * l(i, j);
-      p(i) = val;
-    }
-}
-
-void SolveLDLt (const DenseMatrix & l, const Vector & d, const Vector & g, Vector & p)
-{
-  double val;
-
-  int n = l.Height();
-  p = g;
-
-  for (int i = 0; i < n; i++)
-    {
-      val = 0;
-      for (int j = 0; j < i; j++)
-	val += p(j) * l(i,j);
-      p(i) -= val;
-    }
-
-  for (int i = 0; i < n; i++)
-    p(i) /= d(i);
-  
-  for (int i = n-1; i >= 0; i--)
-    {
-      val = 0;
-      for (int j = i+1; j < n; j++)
-	val += p(j) * l(j, i);
-      p(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) 
-	{
-	  (*testout) << "update err, t = " << t << endl;
-	  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);
-
- //      (*testout) << "l " << l << endl
-// 		 << "d " << d << endl
-// 		 << "g " << g << endl
-// 		 << "p " << p << endl;
-
-
-      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(ifail == 1)
-	(*testout) << "no success with linesearch" << endl;
-
-       /*
-      // 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 << "BFGS update error1" << endl;
-	      (*testout) << "BFGS update error1" << endl;
-	      (*testout) << "l " << endl << l << endl
-			 << "d " << d << endl;
-	      ifail = 1;
-	      break;
-	    }
-
-	  if (LDLtUpdate (l, d, -1 / a2, bs) != 0)
-	    {
-              cerr << "BFGS update error2" << endl;
-	      (*testout) << "BFGS update error2" << endl;
-	      (*testout) << "l " << endl << l << endl
-			 << "d " << d << 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 4c297fd92c8dc0b6b8007297c213a3a2dae5cf55..0000000000000000000000000000000000000000
--- a/contrib/Netgen/libsrc/opti/linsearch.cpp
+++ /dev/null
@@ -1,351 +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
-{
-  cerr << "Grad of MinFunction called" << endl;
-  return 0;
-  /*
-  int n = x.Size();
-
-  static Vector xr;
-  static Vector xl;
-  xr.SetSize(n);
-  xl.SetSize(n);
-
-  double eps = 1e-6;
-  double fl, fr;
-  
-  for (int i = 1; i <= n; i++)
-    {
-      xr.Set (1, x);
-      xl.Set (1, x);
-
-      xr.Elem(i) += eps;
-      fr = Func (xr);
-
-      xl.Elem(i) -= eps;
-      fl = Func (xl);
-
-      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;
-    }
-
-  ifail = 1;  // Markus
-
-  phi1prime = phi0prime;
-
-  //  (*testout) << "phi0prime = " << phi0prime << endl;
-
-  //  it = 100000l;
-  it = 0;
-
-  while (it++ <= par.maxit_linsearch)
-    {
-
-      xneu.Set2 (1, x, alphahat, p);
-
-
-      //    f = fun.FuncGrad (xneu, g);
-      //      f = fun.Func (xneu);
-      f = fun.FuncDeriv (xneu, p, phihatprime);
-
-      // (*testout) << "lines, 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 9875786900ea8cba360c04149ff4c57c5e0aa66e..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
-
-
-
-
-  /**  
-       Solver for 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/nglib/Makefile.am b/contrib/Netgen/nglib/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..8f8fb6e9cae3c440e7735a24a8409c6114313884
--- /dev/null
+++ b/contrib/Netgen/nglib/Makefile.am
@@ -0,0 +1,41 @@
+include_HEADERS = nglib.h
+
+dist_pkgdata_DATA = cube.surf
+
+AM_CPPFLAGS = -I$(top_srcdir)/libsrc/include  $(MPI_INCLUDES) $(OCCFLAGS)
+
+lib_LTLIBRARIES = libnglib.la
+libnglib_la_SOURCES = nglib.cpp
+
+libnglib_la_LIBADD = \
+	$(top_builddir)/libsrc/interface/libinterface.la \
+	$(top_builddir)/libsrc/geom2d/libgeom2d.la \
+	$(top_builddir)/libsrc/csg/libcsg.la \
+	$(top_builddir)/libsrc/stlgeom/libstl.la \
+	$(top_builddir)/libsrc/occ/libocc.la \
+	$(top_builddir)/libsrc/meshing/libmesh.la \
+	$(top_builddir)/libsrc/gprim/libgprim.la \
+	$(top_builddir)/libsrc/linalg/libla.la \
+	$(top_builddir)/libsrc/general/libgen.la \
+	$(OCCLIBS) $(MPI_LIBS)
+
+libnglib_la_LDFLAGS = -avoid-version
+#  -rdynamic
+
+
+bin_PROGRAMS = ng_vol ng_stl
+#  ng_occ
+
+ng_vol_SOURCES = ng_vol.cpp
+ng_vol_LDADD = \
+	libnglib.la 
+ng_stl_SOURCES = ng_stl.cpp
+ng_stl_LDADD = \
+	libnglib.la 
+
+
+# ng_occ_SOURCES = ng_occ.cpp
+# ng_occ_LDADD = \
+#	libnglib.la 
+
+
diff --git a/contrib/Netgen/nglib/cube.surf b/contrib/Netgen/nglib/cube.surf
new file mode 100644
index 0000000000000000000000000000000000000000..1fee858b7a4016b00796fb23eb96efd1e09876ec
--- /dev/null
+++ b/contrib/Netgen/nglib/cube.surf
@@ -0,0 +1,22 @@
+8
+         0         0         0
+         1         0         0
+         1         1         1
+         1         0         1
+         0         1         1
+         0         0         1
+         0         1         0
+         1         1         0
+12
+       2       1       7
+       8       2       7
+       6       1       2
+       4       6       2
+       4       3       5
+       5       6       4
+       8       3       4
+       8       4       2
+       5       3       8
+       7       5       8
+       1       6       5
+       7       1       5
diff --git a/contrib/Netgen/nglib/hinge.stl b/contrib/Netgen/nglib/hinge.stl
new file mode 100644
index 0000000000000000000000000000000000000000..9f5105938ee3dd93714dbbc402ec67401bfc0f65
--- /dev/null
+++ b/contrib/Netgen/nglib/hinge.stl
@@ -0,0 +1,8486 @@
+solid
+  facet normal 5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 3.832020e+001 1.706140e+001 5.000000e+000
+      vertex 3.837337e+001 1.645363e+001 5.000000e+000
+      vertex 3.932020e+001 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 3.935818e+001 1.749552e+001 4.399139e+000
+      vertex 3.832020e+001 1.706140e+001 5.000000e+000
+      vertex 3.932020e+001 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 3.935818e+001 1.749552e+001 4.399139e+000
+      vertex 3.837337e+001 1.766917e+001 5.000000e+000
+      vertex 3.832020e+001 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 3.935818e+001 1.749552e+001 4.399139e+000
+      vertex 3.853128e+001 1.825847e+001 5.000000e+000
+      vertex 3.837337e+001 1.766917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 3.935818e+001 1.749552e+001 4.399139e+000
+      vertex 3.947097e+001 1.791645e+001 4.399139e+000
+      vertex 3.853128e+001 1.825847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 3.853128e+001 1.825847e+001 5.000000e+000
+      vertex 3.947097e+001 1.791645e+001 4.399139e+000
+      vertex 3.878911e+001 1.881140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 3.878911e+001 1.881140e+001 5.000000e+000
+      vertex 3.947097e+001 1.791645e+001 4.399139e+000
+      vertex 3.965514e+001 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 3.913904e+001 1.931116e+001 5.000000e+000
+      vertex 3.965514e+001 1.831140e+001 4.399139e+000
+      vertex 3.990509e+001 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 4.399139e+000
+      vertex 3.913904e+001 1.931116e+001 5.000000e+000
+      vertex 3.990509e+001 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 4.399139e+000
+      vertex 3.957044e+001 1.974256e+001 5.000000e+000
+      vertex 3.913904e+001 1.931116e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 4.399139e+000
+      vertex 4.057020e+001 1.922646e+001 4.399139e+000
+      vertex 3.957044e+001 1.974256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 3.957044e+001 1.974256e+001 5.000000e+000
+      vertex 4.057020e+001 1.922646e+001 4.399139e+000
+      vertex 4.007020e+001 2.009249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 4.007020e+001 2.009249e+001 5.000000e+000
+      vertex 4.057020e+001 1.922646e+001 4.399139e+000
+      vertex 4.062313e+001 2.035032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 4.062313e+001 2.035032e+001 5.000000e+000
+      vertex 4.057020e+001 1.922646e+001 4.399139e+000
+      vertex 4.096515e+001 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 4.121243e+001 2.050823e+001 5.000000e+000
+      vertex 4.096515e+001 1.941063e+001 4.399139e+000
+      vertex 4.138608e+001 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 4.182020e+001 1.956140e+001 4.399139e+000
+      vertex 4.121243e+001 2.050823e+001 5.000000e+000
+      vertex 4.138608e+001 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 4.182020e+001 1.956140e+001 4.399139e+000
+      vertex 4.182020e+001 2.056140e+001 5.000000e+000
+      vertex 4.121243e+001 2.050823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 4.182020e+001 1.956140e+001 4.399139e+000
+      vertex 4.225432e+001 1.952342e+001 4.399139e+000
+      vertex 4.182020e+001 2.056140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 4.182020e+001 2.056140e+001 5.000000e+000
+      vertex 4.225432e+001 1.952342e+001 4.399139e+000
+      vertex 4.242797e+001 2.050823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 4.242797e+001 2.050823e+001 5.000000e+000
+      vertex 4.225432e+001 1.952342e+001 4.399139e+000
+      vertex 4.267525e+001 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 4.301727e+001 2.035032e+001 5.000000e+000
+      vertex 4.267525e+001 1.941063e+001 4.399139e+000
+      vertex 4.307020e+001 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 4.357020e+001 2.009249e+001 5.000000e+000
+      vertex 4.307020e+001 1.922646e+001 4.399139e+000
+      vertex 4.342717e+001 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 4.406996e+001 1.974256e+001 5.000000e+000
+      vertex 4.342717e+001 1.897651e+001 4.399139e+000
+      vertex 4.373531e+001 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 4.450136e+001 1.931116e+001 5.000000e+000
+      vertex 4.373531e+001 1.866837e+001 4.399139e+000
+      vertex 4.398526e+001 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 4.485129e+001 1.881140e+001 5.000000e+000
+      vertex 4.398526e+001 1.831140e+001 4.399139e+000
+      vertex 4.510912e+001 1.825847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 4.485129e+001 1.881140e+001 5.000000e+000
+      vertex 4.450136e+001 1.931116e+001 5.000000e+000
+      vertex 4.398526e+001 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 3.837337e+001 1.645363e+001 5.000000e+000
+      vertex 3.853128e+001 1.586433e+001 5.000000e+000
+      vertex 3.947097e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 3.935818e+001 1.662728e+001 4.399139e+000
+      vertex 3.837337e+001 1.645363e+001 5.000000e+000
+      vertex 3.947097e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 3.935818e+001 1.662728e+001 4.399139e+000
+      vertex 3.932020e+001 1.706140e+001 4.399139e+000
+      vertex 3.837337e+001 1.645363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 3.853128e+001 1.586433e+001 5.000000e+000
+      vertex 3.878911e+001 1.531140e+001 5.000000e+000
+      vertex 3.965514e+001 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 3.947097e+001 1.620635e+001 4.399139e+000
+      vertex 3.853128e+001 1.586433e+001 5.000000e+000
+      vertex 3.965514e+001 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 3.878911e+001 1.531140e+001 5.000000e+000
+      vertex 3.913904e+001 1.481164e+001 5.000000e+000
+      vertex 3.990509e+001 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 3.965514e+001 1.581140e+001 4.399139e+000
+      vertex 3.878911e+001 1.531140e+001 5.000000e+000
+      vertex 3.990509e+001 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 3.913904e+001 1.481164e+001 5.000000e+000
+      vertex 3.957044e+001 1.438024e+001 5.000000e+000
+      vertex 3.990509e+001 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 3.990509e+001 1.545443e+001 4.399139e+000
+      vertex 3.957044e+001 1.438024e+001 5.000000e+000
+      vertex 4.021323e+001 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 4.021323e+001 1.514629e+001 4.399139e+000
+      vertex 3.957044e+001 1.438024e+001 5.000000e+000
+      vertex 4.057020e+001 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 4.057020e+001 1.489634e+001 4.399139e+000
+      vertex 3.957044e+001 1.438024e+001 5.000000e+000
+      vertex 4.007020e+001 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 4.062313e+001 1.377248e+001 5.000000e+000
+      vertex 4.057020e+001 1.489634e+001 4.399139e+000
+      vertex 4.007020e+001 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 4.062313e+001 1.377248e+001 5.000000e+000
+      vertex 4.096515e+001 1.471217e+001 4.399139e+000
+      vertex 4.057020e+001 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 4.062313e+001 1.377248e+001 5.000000e+000
+      vertex 4.121243e+001 1.361457e+001 5.000000e+000
+      vertex 4.096515e+001 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 4.096515e+001 1.471217e+001 4.399139e+000
+      vertex 4.121243e+001 1.361457e+001 5.000000e+000
+      vertex 4.138608e+001 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 4.138608e+001 1.459938e+001 4.399139e+000
+      vertex 4.121243e+001 1.361457e+001 5.000000e+000
+      vertex 4.182020e+001 1.456140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 4.182020e+001 1.456140e+001 4.399139e+000
+      vertex 4.121243e+001 1.361457e+001 5.000000e+000
+      vertex 4.182020e+001 1.356140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 4.225432e+001 1.459938e+001 4.399139e+000
+      vertex 4.182020e+001 1.356140e+001 5.000000e+000
+      vertex 4.242797e+001 1.361457e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 4.267525e+001 1.471217e+001 4.399139e+000
+      vertex 4.242797e+001 1.361457e+001 5.000000e+000
+      vertex 4.301727e+001 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 4.357020e+001 1.403031e+001 5.000000e+000
+      vertex 4.267525e+001 1.471217e+001 4.399139e+000
+      vertex 4.301727e+001 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 4.357020e+001 1.403031e+001 5.000000e+000
+      vertex 4.307020e+001 1.489634e+001 4.399139e+000
+      vertex 4.267525e+001 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 4.357020e+001 1.403031e+001 5.000000e+000
+      vertex 4.406996e+001 1.438024e+001 5.000000e+000
+      vertex 4.307020e+001 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 4.307020e+001 1.489634e+001 4.399139e+000
+      vertex 4.406996e+001 1.438024e+001 5.000000e+000
+      vertex 4.342717e+001 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 4.342717e+001 1.514629e+001 4.399139e+000
+      vertex 4.406996e+001 1.438024e+001 5.000000e+000
+      vertex 4.450136e+001 1.481164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 4.373531e+001 1.545443e+001 4.399139e+000
+      vertex 4.450136e+001 1.481164e+001 5.000000e+000
+      vertex 4.485129e+001 1.531140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 4.398526e+001 1.581140e+001 4.399139e+000
+      vertex 4.485129e+001 1.531140e+001 5.000000e+000
+      vertex 4.510912e+001 1.586433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 4.416943e+001 1.620635e+001 4.399139e+000
+      vertex 4.510912e+001 1.586433e+001 5.000000e+000
+      vertex 4.428222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 4.416943e+001 1.620635e+001 4.399139e+000
+      vertex 4.398526e+001 1.581140e+001 4.399139e+000
+      vertex 4.510912e+001 1.586433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 4.510912e+001 1.586433e+001 5.000000e+000
+      vertex 4.526703e+001 1.645363e+001 5.000000e+000
+      vertex 4.428222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 4.428222e+001 1.662728e+001 4.399139e+000
+      vertex 4.526703e+001 1.645363e+001 5.000000e+000
+      vertex 4.432020e+001 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 4.432020e+001 1.706140e+001 4.399139e+000
+      vertex 4.526703e+001 1.645363e+001 5.000000e+000
+      vertex 4.532020e+001 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 4.428222e+001 1.749552e+001 4.399139e+000
+      vertex 4.532020e+001 1.706140e+001 5.000000e+000
+      vertex 4.526703e+001 1.766917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 4.416943e+001 1.791645e+001 4.399139e+000
+      vertex 4.526703e+001 1.766917e+001 5.000000e+000
+      vertex 4.510912e+001 1.825847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 4.398526e+001 1.831140e+001 4.399139e+000
+      vertex 4.416943e+001 1.791645e+001 4.399139e+000
+      vertex 4.510912e+001 1.825847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 4.450136e+001 1.931116e+001 5.000000e+000
+      vertex 4.406996e+001 1.974256e+001 5.000000e+000
+      vertex 4.373531e+001 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 4.406996e+001 1.974256e+001 5.000000e+000
+      vertex 4.357020e+001 2.009249e+001 5.000000e+000
+      vertex 4.342717e+001 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 4.357020e+001 2.009249e+001 5.000000e+000
+      vertex 4.301727e+001 2.035032e+001 5.000000e+000
+      vertex 4.307020e+001 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 4.301727e+001 2.035032e+001 5.000000e+000
+      vertex 4.242797e+001 2.050823e+001 5.000000e+000
+      vertex 4.267525e+001 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 4.121243e+001 2.050823e+001 5.000000e+000
+      vertex 4.062313e+001 2.035032e+001 5.000000e+000
+      vertex 4.096515e+001 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 3.913904e+001 1.931116e+001 5.000000e+000
+      vertex 3.878911e+001 1.881140e+001 5.000000e+000
+      vertex 3.965514e+001 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 4.416943e+001 1.791645e+001 4.399139e+000
+      vertex 4.428222e+001 1.749552e+001 4.399139e+000
+      vertex 4.526703e+001 1.766917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 4.428222e+001 1.749552e+001 4.399139e+000
+      vertex 4.432020e+001 1.706140e+001 4.399139e+000
+      vertex 4.532020e+001 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 4.398526e+001 1.581140e+001 4.399139e+000
+      vertex 4.373531e+001 1.545443e+001 4.399139e+000
+      vertex 4.485129e+001 1.531140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 4.342717e+001 1.514629e+001 4.399139e+000
+      vertex 4.450136e+001 1.481164e+001 5.000000e+000
+      vertex 4.373531e+001 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 4.267525e+001 1.471217e+001 4.399139e+000
+      vertex 4.225432e+001 1.459938e+001 4.399139e+000
+      vertex 4.242797e+001 1.361457e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 4.225432e+001 1.459938e+001 4.399139e+000
+      vertex 4.182020e+001 1.456140e+001 4.399139e+000
+      vertex 4.182020e+001 1.356140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 8.715574e-002 0.000000e+000
+    outer loop
+      vertex 4.432020e+001 1.706140e+001 -8.881784e-016
+      vertex 4.428222e+001 1.662728e+001 -8.881784e-016
+      vertex 4.428222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 8.715574e-002 0.000000e+000
+    outer loop
+      vertex 4.432020e+001 1.706140e+001 4.399139e+000
+      vertex 4.432020e+001 1.706140e+001 -8.881784e-016
+      vertex 4.428222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 -8.715574e-002 0.000000e+000
+    outer loop
+      vertex 4.432020e+001 1.706140e+001 4.399139e+000
+      vertex 4.428222e+001 1.749552e+001 -8.881784e-016
+      vertex 4.432020e+001 1.706140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -9.961947e-001 -8.715574e-002 -9.048915e-016
+    outer loop
+      vertex 4.432020e+001 1.706140e+001 4.399139e+000
+      vertex 4.428222e+001 1.749552e+001 4.399139e+000
+      vertex 4.428222e+001 1.749552e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -9.659258e-001 -2.588190e-001 5.300545e-016
+    outer loop
+      vertex 4.428222e+001 1.749552e+001 -8.881784e-016
+      vertex 4.428222e+001 1.749552e+001 4.399139e+000
+      vertex 4.416943e+001 1.791645e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -9.659258e-001 -2.588190e-001 -1.030095e-015
+    outer loop
+      vertex 4.416943e+001 1.791645e+001 -8.881784e-016
+      vertex 4.428222e+001 1.749552e+001 4.399139e+000
+      vertex 4.416943e+001 1.791645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 -4.226183e-001 1.440206e-016
+    outer loop
+      vertex 4.398526e+001 1.831140e+001 -8.881784e-016
+      vertex 4.416943e+001 1.791645e+001 4.399139e+000
+      vertex 4.398526e+001 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 -5.735764e-001 -1.586601e-015
+    outer loop
+      vertex 4.373531e+001 1.866837e+001 -8.881784e-016
+      vertex 4.398526e+001 1.831140e+001 4.399139e+000
+      vertex 4.373531e+001 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 -7.071068e-001 -1.142109e-015
+    outer loop
+      vertex 4.342717e+001 1.897651e+001 -8.881784e-016
+      vertex 4.373531e+001 1.866837e+001 4.399139e+000
+      vertex 4.342717e+001 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 -8.191520e-001 -1.324456e-015
+    outer loop
+      vertex 4.307020e+001 1.922646e+001 -8.881784e-016
+      vertex 4.342717e+001 1.897651e+001 4.399139e+000
+      vertex 4.307020e+001 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 -9.063078e-001 -1.217252e-015
+    outer loop
+      vertex 4.267525e+001 1.941063e+001 -8.881784e-016
+      vertex 4.307020e+001 1.922646e+001 4.399139e+000
+      vertex 4.267525e+001 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 -9.659258e-001 -1.310129e-015
+    outer loop
+      vertex 4.225432e+001 1.952342e+001 -8.881784e-016
+      vertex 4.267525e+001 1.941063e+001 4.399139e+000
+      vertex 4.225432e+001 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 -9.961947e-001 -7.038636e-016
+    outer loop
+      vertex 4.182020e+001 1.956140e+001 -8.881784e-016
+      vertex 4.225432e+001 1.952342e+001 4.399139e+000
+      vertex 4.182020e+001 1.956140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 -9.961947e-001 -9.051759e-016
+    outer loop
+      vertex 4.138608e+001 1.952342e+001 -8.881784e-016
+      vertex 4.182020e+001 1.956140e+001 4.399139e+000
+      vertex 4.138608e+001 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 -9.659258e-001 -2.500203e-016
+    outer loop
+      vertex 4.096515e+001 1.941063e+001 -8.881784e-016
+      vertex 4.138608e+001 1.952342e+001 4.399139e+000
+      vertex 4.096515e+001 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 -9.063078e-001 -9.292106e-016
+    outer loop
+      vertex 4.057020e+001 1.922646e+001 -8.881784e-016
+      vertex 4.096515e+001 1.941063e+001 4.399139e+000
+      vertex 4.057020e+001 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 -8.191520e-001 -9.250596e-016
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 -8.881784e-016
+      vertex 4.057020e+001 1.922646e+001 4.399139e+000
+      vertex 4.021323e+001 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 -7.071068e-001 -1.142109e-015
+    outer loop
+      vertex 3.990509e+001 1.866837e+001 -8.881784e-016
+      vertex 4.021323e+001 1.897651e+001 4.399139e+000
+      vertex 3.990509e+001 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 -5.735764e-001 -1.059565e-015
+    outer loop
+      vertex 3.965514e+001 1.831140e+001 -8.881784e-016
+      vertex 3.990509e+001 1.866837e+001 4.399139e+000
+      vertex 3.965514e+001 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 -4.226183e-001 -4.853241e-016
+    outer loop
+      vertex 3.947097e+001 1.791645e+001 -8.881784e-016
+      vertex 3.965514e+001 1.831140e+001 4.399139e+000
+      vertex 3.947097e+001 1.791645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 -2.588190e-001 -5.300545e-016
+    outer loop
+      vertex 3.935818e+001 1.749552e+001 -8.881784e-016
+      vertex 3.947097e+001 1.791645e+001 4.399139e+000
+      vertex 3.935818e+001 1.749552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 -8.715574e-002 -7.038636e-016
+    outer loop
+      vertex 3.932020e+001 1.706140e+001 -8.881784e-016
+      vertex 3.935818e+001 1.749552e+001 4.399139e+000
+      vertex 3.932020e+001 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 8.715574e-002 7.038636e-017
+    outer loop
+      vertex 3.935818e+001 1.662728e+001 -8.881784e-016
+      vertex 3.932020e+001 1.706140e+001 4.399139e+000
+      vertex 3.935818e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 2.588190e-001 0.000000e+000
+    outer loop
+      vertex 3.947097e+001 1.620635e+001 -8.881784e-016
+      vertex 3.935818e+001 1.662728e+001 4.399139e+000
+      vertex 3.947097e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 4.226183e-001 0.000000e+000
+    outer loop
+      vertex 3.965514e+001 1.581140e+001 -8.881784e-016
+      vertex 3.947097e+001 1.620635e+001 4.399139e+000
+      vertex 3.965514e+001 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 5.735764e-001 2.316081e-016
+    outer loop
+      vertex 3.990509e+001 1.545443e+001 -8.881784e-016
+      vertex 3.965514e+001 1.581140e+001 4.399139e+000
+      vertex 3.990509e+001 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 7.071068e-001 2.855272e-016
+    outer loop
+      vertex 4.021323e+001 1.514629e+001 -8.881784e-016
+      vertex 3.990509e+001 1.545443e+001 4.399139e+000
+      vertex 4.021323e+001 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 8.191520e-001 3.307707e-016
+    outer loop
+      vertex 4.057020e+001 1.489634e+001 -8.881784e-016
+      vertex 4.021323e+001 1.514629e+001 4.399139e+000
+      vertex 4.057020e+001 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 9.063078e-001 -6.826070e-016
+    outer loop
+      vertex 4.096515e+001 1.471217e+001 -8.881784e-016
+      vertex 4.057020e+001 1.489634e+001 4.399139e+000
+      vertex 4.096515e+001 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 9.659258e-001 -4.180408e-016
+    outer loop
+      vertex 4.138608e+001 1.459938e+001 -8.881784e-016
+      vertex 4.096515e+001 1.471217e+001 4.399139e+000
+      vertex 4.138608e+001 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 9.961947e-001 0.000000e+000
+    outer loop
+      vertex 4.182020e+001 1.456140e+001 -8.881784e-016
+      vertex 4.138608e+001 1.459938e+001 4.399139e+000
+      vertex 4.182020e+001 1.456140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 9.961947e-001 0.000000e+000
+    outer loop
+      vertex 4.225432e+001 1.459938e+001 -8.881784e-016
+      vertex 4.182020e+001 1.456140e+001 4.399139e+000
+      vertex 4.225432e+001 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 9.659258e-001 2.800343e-017
+    outer loop
+      vertex 4.267525e+001 1.471217e+001 -8.881784e-016
+      vertex 4.225432e+001 1.459938e+001 4.399139e+000
+      vertex 4.267525e+001 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 9.063078e-001 -3.659639e-016
+    outer loop
+      vertex 4.307020e+001 1.489634e+001 -8.881784e-016
+      vertex 4.267525e+001 1.471217e+001 4.399139e+000
+      vertex 4.307020e+001 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 8.191520e-001 5.956618e-016
+    outer loop
+      vertex 4.342717e+001 1.514629e+001 -8.881784e-016
+      vertex 4.307020e+001 1.489634e+001 4.399139e+000
+      vertex 4.342717e+001 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 7.071068e-001 0.000000e+000
+    outer loop
+      vertex 4.373531e+001 1.545443e+001 -8.881784e-016
+      vertex 4.342717e+001 1.514629e+001 4.399139e+000
+      vertex 4.373531e+001 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 5.735764e-001 0.000000e+000
+    outer loop
+      vertex 4.398526e+001 1.581140e+001 -8.881784e-016
+      vertex 4.373531e+001 1.545443e+001 4.399139e+000
+      vertex 4.398526e+001 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 4.226183e-001 0.000000e+000
+    outer loop
+      vertex 4.416943e+001 1.620635e+001 -8.881784e-016
+      vertex 4.398526e+001 1.581140e+001 4.399139e+000
+      vertex 4.416943e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.659258e-001 2.588190e-001 0.000000e+000
+    outer loop
+      vertex 4.428222e+001 1.662728e+001 -8.881784e-016
+      vertex 4.416943e+001 1.620635e+001 4.399139e+000
+      vertex 4.428222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.659258e-001 2.588190e-001 0.000000e+000
+    outer loop
+      vertex 4.428222e+001 1.662728e+001 -8.881784e-016
+      vertex 4.416943e+001 1.620635e+001 -8.881784e-016
+      vertex 4.416943e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 4.226183e-001 0.000000e+000
+    outer loop
+      vertex 4.416943e+001 1.620635e+001 -8.881784e-016
+      vertex 4.398526e+001 1.581140e+001 -8.881784e-016
+      vertex 4.398526e+001 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 5.735764e-001 0.000000e+000
+    outer loop
+      vertex 4.398526e+001 1.581140e+001 -8.881784e-016
+      vertex 4.373531e+001 1.545443e+001 -8.881784e-016
+      vertex 4.373531e+001 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 7.071068e-001 8.614567e-016
+    outer loop
+      vertex 4.373531e+001 1.545443e+001 -8.881784e-016
+      vertex 4.342717e+001 1.514629e+001 -8.881784e-016
+      vertex 4.342717e+001 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 8.191520e-001 -3.257609e-016
+    outer loop
+      vertex 4.342717e+001 1.514629e+001 -8.881784e-016
+      vertex 4.307020e+001 1.489634e+001 -8.881784e-016
+      vertex 4.307020e+001 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 9.063078e-001 3.166431e-016
+    outer loop
+      vertex 4.267525e+001 1.471217e+001 -8.881784e-016
+      vertex 4.267525e+001 1.471217e+001 4.399139e+000
+      vertex 4.307020e+001 1.489634e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -2.588190e-001 9.659258e-001 0.000000e+000
+    outer loop
+      vertex 4.267525e+001 1.471217e+001 -8.881784e-016
+      vertex 4.225432e+001 1.459938e+001 -8.881784e-016
+      vertex 4.225432e+001 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 9.961947e-001 0.000000e+000
+    outer loop
+      vertex 4.225432e+001 1.459938e+001 -8.881784e-016
+      vertex 4.182020e+001 1.456140e+001 -8.881784e-016
+      vertex 4.182020e+001 1.456140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 9.961947e-001 -1.411631e-016
+    outer loop
+      vertex 4.182020e+001 1.456140e+001 -8.881784e-016
+      vertex 4.138608e+001 1.459938e+001 -8.881784e-016
+      vertex 4.138608e+001 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 9.659258e-001 -4.198697e-016
+    outer loop
+      vertex 4.138608e+001 1.459938e+001 -8.881784e-016
+      vertex 4.096515e+001 1.471217e+001 -8.881784e-016
+      vertex 4.096515e+001 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 9.063078e-001 3.691957e-016
+    outer loop
+      vertex 4.096515e+001 1.471217e+001 -8.881784e-016
+      vertex 4.057020e+001 1.489634e+001 -8.881784e-016
+      vertex 4.057020e+001 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 8.191520e-001 3.330001e-016
+    outer loop
+      vertex 4.057020e+001 1.489634e+001 -8.881784e-016
+      vertex 4.021323e+001 1.514629e+001 -8.881784e-016
+      vertex 4.021323e+001 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 7.071068e-001 2.855272e-016
+    outer loop
+      vertex 3.990509e+001 1.545443e+001 -8.881784e-016
+      vertex 3.990509e+001 1.545443e+001 4.399139e+000
+      vertex 4.021323e+001 1.514629e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 8.191520e-001 5.735764e-001 0.000000e+000
+    outer loop
+      vertex 3.990509e+001 1.545443e+001 -8.881784e-016
+      vertex 3.965514e+001 1.581140e+001 -8.881784e-016
+      vertex 3.965514e+001 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 4.226183e-001 0.000000e+000
+    outer loop
+      vertex 3.965514e+001 1.581140e+001 -8.881784e-016
+      vertex 3.947097e+001 1.620635e+001 -8.881784e-016
+      vertex 3.947097e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 2.588190e-001 2.090204e-016
+    outer loop
+      vertex 3.935818e+001 1.662728e+001 -8.881784e-016
+      vertex 3.935818e+001 1.662728e+001 4.399139e+000
+      vertex 3.947097e+001 1.620635e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 9.961947e-001 8.715574e-002 7.040056e-016
+    outer loop
+      vertex 3.935818e+001 1.662728e+001 -8.881784e-016
+      vertex 3.932020e+001 1.706140e+001 -8.881784e-016
+      vertex 3.932020e+001 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 -8.715574e-002 9.048915e-016
+    outer loop
+      vertex 3.932020e+001 1.706140e+001 -8.881784e-016
+      vertex 3.935818e+001 1.749552e+001 -8.881784e-016
+      vertex 3.935818e+001 1.749552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 -2.588190e-001 1.030095e-015
+    outer loop
+      vertex 3.947097e+001 1.791645e+001 -8.881784e-016
+      vertex 3.947097e+001 1.791645e+001 4.399139e+000
+      vertex 3.935818e+001 1.749552e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 9.063078e-001 -4.226183e-001 1.954566e-016
+    outer loop
+      vertex 3.947097e+001 1.791645e+001 -8.881784e-016
+      vertex 3.965514e+001 1.831140e+001 -8.881784e-016
+      vertex 3.965514e+001 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 -5.735764e-001 2.606088e-016
+    outer loop
+      vertex 3.965514e+001 1.831140e+001 -8.881784e-016
+      vertex 3.990509e+001 1.866837e+001 -8.881784e-016
+      vertex 3.990509e+001 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 -7.071068e-001 5.710544e-016
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 -8.881784e-016
+      vertex 4.021323e+001 1.897651e+001 4.399139e+000
+      vertex 3.990509e+001 1.866837e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 5.735764e-001 -8.191520e-001 3.981523e-016
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 -8.881784e-016
+      vertex 4.057020e+001 1.922646e+001 -8.881784e-016
+      vertex 4.057020e+001 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 -9.063078e-001 1.216174e-015
+    outer loop
+      vertex 4.057020e+001 1.922646e+001 -8.881784e-016
+      vertex 4.096515e+001 1.941063e+001 -8.881784e-016
+      vertex 4.096515e+001 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 -9.659258e-001 5.284567e-016
+    outer loop
+      vertex 4.096515e+001 1.941063e+001 -8.881784e-016
+      vertex 4.138608e+001 1.952342e+001 -8.881784e-016
+      vertex 4.138608e+001 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 -9.961947e-001 7.040056e-016
+    outer loop
+      vertex 4.138608e+001 1.952342e+001 -8.881784e-016
+      vertex 4.182020e+001 1.956140e+001 -8.881784e-016
+      vertex 4.182020e+001 1.956140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 -9.961947e-001 1.013479e-016
+    outer loop
+      vertex 4.182020e+001 1.956140e+001 -8.881784e-016
+      vertex 4.225432e+001 1.952342e+001 -8.881784e-016
+      vertex 4.225432e+001 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 -9.659258e-001 2.497501e-016
+    outer loop
+      vertex 4.225432e+001 1.952342e+001 -8.881784e-016
+      vertex 4.267525e+001 1.941063e+001 -8.881784e-016
+      vertex 4.267525e+001 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 -9.063078e-001 2.461305e-016
+    outer loop
+      vertex 4.267525e+001 1.941063e+001 -8.881784e-016
+      vertex 4.307020e+001 1.922646e+001 -8.881784e-016
+      vertex 4.307020e+001 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 -8.191520e-001 2.678479e-016
+    outer loop
+      vertex 4.307020e+001 1.922646e+001 -8.881784e-016
+      vertex 4.342717e+001 1.897651e+001 -8.881784e-016
+      vertex 4.342717e+001 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 -7.071068e-001 0.000000e+000
+    outer loop
+      vertex 4.342717e+001 1.897651e+001 -8.881784e-016
+      vertex 4.373531e+001 1.866837e+001 -8.881784e-016
+      vertex 4.373531e+001 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 -5.735764e-001 1.520218e-015
+    outer loop
+      vertex 4.373531e+001 1.866837e+001 -8.881784e-016
+      vertex 4.398526e+001 1.831140e+001 -8.881784e-016
+      vertex 4.398526e+001 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 -4.226183e-001 4.850219e-016
+    outer loop
+      vertex 4.398526e+001 1.831140e+001 -8.881784e-016
+      vertex 4.416943e+001 1.791645e+001 -8.881784e-016
+      vertex 4.416943e+001 1.791645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 2.137337e+001 1.245363e+001 5.000000e+000
+      vertex 2.232020e+001 1.306140e+001 4.399139e+000
+      vertex 2.132020e+001 1.306140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 2.137337e+001 1.245363e+001 5.000000e+000
+      vertex 2.235818e+001 1.262728e+001 4.399139e+000
+      vertex 2.232020e+001 1.306140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 2.137337e+001 1.245363e+001 5.000000e+000
+      vertex 2.153128e+001 1.186433e+001 5.000000e+000
+      vertex 2.235818e+001 1.262728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 2.235818e+001 1.262728e+001 4.399139e+000
+      vertex 2.153128e+001 1.186433e+001 5.000000e+000
+      vertex 2.247097e+001 1.220635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 2.247097e+001 1.220635e+001 4.399139e+000
+      vertex 2.153128e+001 1.186433e+001 5.000000e+000
+      vertex 2.178911e+001 1.131140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 2.265514e+001 1.181140e+001 4.399139e+000
+      vertex 2.178911e+001 1.131140e+001 5.000000e+000
+      vertex 2.213904e+001 1.081164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 2.290509e+001 1.145443e+001 4.399139e+000
+      vertex 2.213904e+001 1.081164e+001 5.000000e+000
+      vertex 2.257044e+001 1.038024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 2.321323e+001 1.114629e+001 4.399139e+000
+      vertex 2.257044e+001 1.038024e+001 5.000000e+000
+      vertex 2.307020e+001 1.003031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 2.357020e+001 1.089634e+001 4.399139e+000
+      vertex 2.307020e+001 1.003031e+001 5.000000e+000
+      vertex 2.362313e+001 9.772476e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 2.396515e+001 1.071217e+001 4.399139e+000
+      vertex 2.362313e+001 9.772476e+000 5.000000e+000
+      vertex 2.421243e+001 9.614573e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 2.438608e+001 1.059938e+001 4.399139e+000
+      vertex 2.421243e+001 9.614573e+000 5.000000e+000
+      vertex 2.482020e+001 1.056140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 2.438608e+001 1.059938e+001 4.399139e+000
+      vertex 2.396515e+001 1.071217e+001 4.399139e+000
+      vertex 2.421243e+001 9.614573e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 2.421243e+001 9.614573e+000 5.000000e+000
+      vertex 2.482020e+001 9.561400e+000 5.000000e+000
+      vertex 2.482020e+001 1.056140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 2.482020e+001 1.056140e+001 4.399139e+000
+      vertex 2.482020e+001 9.561400e+000 5.000000e+000
+      vertex 2.542797e+001 9.614573e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 2.525432e+001 1.059938e+001 4.399139e+000
+      vertex 2.542797e+001 9.614573e+000 5.000000e+000
+      vertex 2.601727e+001 9.772476e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 2.567525e+001 1.071217e+001 4.399139e+000
+      vertex 2.601727e+001 9.772476e+000 5.000000e+000
+      vertex 2.657020e+001 1.003031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 2.607020e+001 1.089634e+001 4.399139e+000
+      vertex 2.657020e+001 1.003031e+001 5.000000e+000
+      vertex 2.642717e+001 1.114629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 2.607020e+001 1.089634e+001 4.399139e+000
+      vertex 2.567525e+001 1.071217e+001 4.399139e+000
+      vertex 2.657020e+001 1.003031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 2.657020e+001 1.003031e+001 5.000000e+000
+      vertex 2.706996e+001 1.038024e+001 5.000000e+000
+      vertex 2.642717e+001 1.114629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 2.642717e+001 1.114629e+001 4.399139e+000
+      vertex 2.706996e+001 1.038024e+001 5.000000e+000
+      vertex 2.750136e+001 1.081164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 2.673531e+001 1.145443e+001 4.399139e+000
+      vertex 2.750136e+001 1.081164e+001 5.000000e+000
+      vertex 2.785129e+001 1.131140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 2.698526e+001 1.181140e+001 4.399139e+000
+      vertex 2.785129e+001 1.131140e+001 5.000000e+000
+      vertex 2.810912e+001 1.186433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 2.716943e+001 1.220635e+001 4.399139e+000
+      vertex 2.810912e+001 1.186433e+001 5.000000e+000
+      vertex 2.826703e+001 1.245363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 2.728222e+001 1.262728e+001 4.399139e+000
+      vertex 2.826703e+001 1.245363e+001 5.000000e+000
+      vertex 2.832020e+001 1.306140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 4.399139e+000
+      vertex 2.832020e+001 1.306140e+001 5.000000e+000
+      vertex 2.728222e+001 1.349552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 4.399139e+000
+      vertex 2.728222e+001 1.262728e+001 4.399139e+000
+      vertex 2.832020e+001 1.306140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 2.832020e+001 1.306140e+001 5.000000e+000
+      vertex 2.826703e+001 1.366917e+001 5.000000e+000
+      vertex 2.728222e+001 1.349552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 2.728222e+001 1.349552e+001 4.399139e+000
+      vertex 2.826703e+001 1.366917e+001 5.000000e+000
+      vertex 2.716943e+001 1.391645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 2.716943e+001 1.391645e+001 4.399139e+000
+      vertex 2.826703e+001 1.366917e+001 5.000000e+000
+      vertex 2.810912e+001 1.425847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 2.698526e+001 1.431140e+001 4.399139e+000
+      vertex 2.810912e+001 1.425847e+001 5.000000e+000
+      vertex 2.785129e+001 1.481140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 2.750136e+001 1.531116e+001 5.000000e+000
+      vertex 2.698526e+001 1.431140e+001 4.399139e+000
+      vertex 2.785129e+001 1.481140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 2.750136e+001 1.531116e+001 5.000000e+000
+      vertex 2.673531e+001 1.466837e+001 4.399139e+000
+      vertex 2.698526e+001 1.431140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 2.750136e+001 1.531116e+001 5.000000e+000
+      vertex 2.706996e+001 1.574256e+001 5.000000e+000
+      vertex 2.673531e+001 1.466837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 2.673531e+001 1.466837e+001 4.399139e+000
+      vertex 2.706996e+001 1.574256e+001 5.000000e+000
+      vertex 2.642717e+001 1.497651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 2.642717e+001 1.497651e+001 4.399139e+000
+      vertex 2.706996e+001 1.574256e+001 5.000000e+000
+      vertex 2.607020e+001 1.522646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 2.607020e+001 1.522646e+001 4.399139e+000
+      vertex 2.706996e+001 1.574256e+001 5.000000e+000
+      vertex 2.657020e+001 1.609249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 2.567525e+001 1.541063e+001 4.399139e+000
+      vertex 2.657020e+001 1.609249e+001 5.000000e+000
+      vertex 2.601727e+001 1.635032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 2.525432e+001 1.552342e+001 4.399139e+000
+      vertex 2.601727e+001 1.635032e+001 5.000000e+000
+      vertex 2.542797e+001 1.650823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 2.482020e+001 1.656140e+001 5.000000e+000
+      vertex 2.525432e+001 1.552342e+001 4.399139e+000
+      vertex 2.542797e+001 1.650823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 2.482020e+001 1.656140e+001 5.000000e+000
+      vertex 2.482020e+001 1.556140e+001 4.399139e+000
+      vertex 2.525432e+001 1.552342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 2.482020e+001 1.656140e+001 5.000000e+000
+      vertex 2.421243e+001 1.650823e+001 5.000000e+000
+      vertex 2.482020e+001 1.556140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 2.482020e+001 1.556140e+001 4.399139e+000
+      vertex 2.421243e+001 1.650823e+001 5.000000e+000
+      vertex 2.438608e+001 1.552342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 2.438608e+001 1.552342e+001 4.399139e+000
+      vertex 2.421243e+001 1.650823e+001 5.000000e+000
+      vertex 2.362313e+001 1.635032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 2.396515e+001 1.541063e+001 4.399139e+000
+      vertex 2.362313e+001 1.635032e+001 5.000000e+000
+      vertex 2.307020e+001 1.609249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 2.357020e+001 1.522646e+001 4.399139e+000
+      vertex 2.307020e+001 1.609249e+001 5.000000e+000
+      vertex 2.321323e+001 1.497651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 2.357020e+001 1.522646e+001 4.399139e+000
+      vertex 2.396515e+001 1.541063e+001 4.399139e+000
+      vertex 2.307020e+001 1.609249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 2.321323e+001 1.497651e+001 4.399139e+000
+      vertex 2.307020e+001 1.609249e+001 5.000000e+000
+      vertex 2.257044e+001 1.574256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 2.213904e+001 1.531116e+001 5.000000e+000
+      vertex 2.321323e+001 1.497651e+001 4.399139e+000
+      vertex 2.257044e+001 1.574256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 2.213904e+001 1.531116e+001 5.000000e+000
+      vertex 2.290509e+001 1.466837e+001 4.399139e+000
+      vertex 2.321323e+001 1.497651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 2.213904e+001 1.531116e+001 5.000000e+000
+      vertex 2.178911e+001 1.481140e+001 5.000000e+000
+      vertex 2.290509e+001 1.466837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 2.290509e+001 1.466837e+001 4.399139e+000
+      vertex 2.178911e+001 1.481140e+001 5.000000e+000
+      vertex 2.265514e+001 1.431140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 2.265514e+001 1.431140e+001 4.399139e+000
+      vertex 2.178911e+001 1.481140e+001 5.000000e+000
+      vertex 2.153128e+001 1.425847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 2.247097e+001 1.391645e+001 4.399139e+000
+      vertex 2.153128e+001 1.425847e+001 5.000000e+000
+      vertex 2.137337e+001 1.366917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 2.235818e+001 1.349552e+001 4.399139e+000
+      vertex 2.137337e+001 1.366917e+001 5.000000e+000
+      vertex 2.132020e+001 1.306140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 2.232020e+001 1.306140e+001 4.399139e+000
+      vertex 2.235818e+001 1.349552e+001 4.399139e+000
+      vertex 2.132020e+001 1.306140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 2.235818e+001 1.349552e+001 4.399139e+000
+      vertex 2.247097e+001 1.391645e+001 4.399139e+000
+      vertex 2.137337e+001 1.366917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 2.247097e+001 1.391645e+001 4.399139e+000
+      vertex 2.265514e+001 1.431140e+001 4.399139e+000
+      vertex 2.153128e+001 1.425847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 2.396515e+001 1.541063e+001 4.399139e+000
+      vertex 2.438608e+001 1.552342e+001 4.399139e+000
+      vertex 2.362313e+001 1.635032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 2.525432e+001 1.552342e+001 4.399139e+000
+      vertex 2.567525e+001 1.541063e+001 4.399139e+000
+      vertex 2.601727e+001 1.635032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 2.567525e+001 1.541063e+001 4.399139e+000
+      vertex 2.607020e+001 1.522646e+001 4.399139e+000
+      vertex 2.657020e+001 1.609249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 2.698526e+001 1.431140e+001 4.399139e+000
+      vertex 2.716943e+001 1.391645e+001 4.399139e+000
+      vertex 2.810912e+001 1.425847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 2.728222e+001 1.262728e+001 4.399139e+000
+      vertex 2.716943e+001 1.220635e+001 4.399139e+000
+      vertex 2.826703e+001 1.245363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 2.716943e+001 1.220635e+001 4.399139e+000
+      vertex 2.698526e+001 1.181140e+001 4.399139e+000
+      vertex 2.810912e+001 1.186433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 2.698526e+001 1.181140e+001 4.399139e+000
+      vertex 2.673531e+001 1.145443e+001 4.399139e+000
+      vertex 2.785129e+001 1.131140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 2.673531e+001 1.145443e+001 4.399139e+000
+      vertex 2.642717e+001 1.114629e+001 4.399139e+000
+      vertex 2.750136e+001 1.081164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 2.567525e+001 1.071217e+001 4.399139e+000
+      vertex 2.525432e+001 1.059938e+001 4.399139e+000
+      vertex 2.601727e+001 9.772476e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 2.525432e+001 1.059938e+001 4.399139e+000
+      vertex 2.482020e+001 1.056140e+001 4.399139e+000
+      vertex 2.542797e+001 9.614573e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 2.396515e+001 1.071217e+001 4.399139e+000
+      vertex 2.357020e+001 1.089634e+001 4.399139e+000
+      vertex 2.362313e+001 9.772476e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 2.357020e+001 1.089634e+001 4.399139e+000
+      vertex 2.321323e+001 1.114629e+001 4.399139e+000
+      vertex 2.307020e+001 1.003031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 2.321323e+001 1.114629e+001 4.399139e+000
+      vertex 2.290509e+001 1.145443e+001 4.399139e+000
+      vertex 2.257044e+001 1.038024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 2.290509e+001 1.145443e+001 4.399139e+000
+      vertex 2.265514e+001 1.181140e+001 4.399139e+000
+      vertex 2.213904e+001 1.081164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 2.265514e+001 1.181140e+001 4.399139e+000
+      vertex 2.247097e+001 1.220635e+001 4.399139e+000
+      vertex 2.178911e+001 1.131140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 8.715574e-002 -3.438588e-017
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 0.000000e+000
+      vertex 2.728222e+001 1.262728e+001 0.000000e+000
+      vertex 2.728222e+001 1.262728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 8.715574e-002 0.000000e+000
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 4.399139e+000
+      vertex 2.732020e+001 1.306140e+001 0.000000e+000
+      vertex 2.728222e+001 1.262728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 -8.715574e-002 0.000000e+000
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 4.399139e+000
+      vertex 2.728222e+001 1.349552e+001 0.000000e+000
+      vertex 2.732020e+001 1.306140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 -8.715574e-002 -6.515219e-017
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 4.399139e+000
+      vertex 2.728222e+001 1.349552e+001 4.399139e+000
+      vertex 2.728222e+001 1.349552e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -9.659258e-001 -2.588190e-001 1.414640e-015
+    outer loop
+      vertex 2.728222e+001 1.349552e+001 0.000000e+000
+      vertex 2.728222e+001 1.349552e+001 4.399139e+000
+      vertex 2.716943e+001 1.391645e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -9.659258e-001 -2.588190e-001 -3.545305e-016
+    outer loop
+      vertex 2.716943e+001 1.391645e+001 0.000000e+000
+      vertex 2.728222e+001 1.349552e+001 4.399139e+000
+      vertex 2.716943e+001 1.391645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 -4.226183e-001 -7.585588e-016
+    outer loop
+      vertex 2.698526e+001 1.431140e+001 0.000000e+000
+      vertex 2.716943e+001 1.391645e+001 4.399139e+000
+      vertex 2.698526e+001 1.431140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 -5.735764e-001 -2.635182e-016
+    outer loop
+      vertex 2.673531e+001 1.466837e+001 0.000000e+000
+      vertex 2.698526e+001 1.431140e+001 4.399139e+000
+      vertex 2.673531e+001 1.466837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 -7.071068e-001 -5.710544e-016
+    outer loop
+      vertex 2.642717e+001 1.497651e+001 0.000000e+000
+      vertex 2.673531e+001 1.466837e+001 4.399139e+000
+      vertex 2.642717e+001 1.497651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 -8.191520e-001 -8.612394e-016
+    outer loop
+      vertex 2.607020e+001 1.522646e+001 0.000000e+000
+      vertex 2.642717e+001 1.497651e+001 4.399139e+000
+      vertex 2.607020e+001 1.522646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 -9.063078e-001 -4.853241e-016
+    outer loop
+      vertex 2.567525e+001 1.541063e+001 0.000000e+000
+      vertex 2.607020e+001 1.522646e+001 4.399139e+000
+      vertex 2.567525e+001 1.541063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 -9.659258e-001 -5.300545e-016
+    outer loop
+      vertex 2.525432e+001 1.552342e+001 0.000000e+000
+      vertex 2.567525e+001 1.541063e+001 4.399139e+000
+      vertex 2.525432e+001 1.552342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 -9.961947e-001 -7.038636e-016
+    outer loop
+      vertex 2.482020e+001 1.556140e+001 0.000000e+000
+      vertex 2.525432e+001 1.552342e+001 4.399139e+000
+      vertex 2.482020e+001 1.556140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 -9.961947e-001 -5.029161e-016
+    outer loop
+      vertex 2.438608e+001 1.552342e+001 0.000000e+000
+      vertex 2.482020e+001 1.556140e+001 4.399139e+000
+      vertex 2.438608e+001 1.552342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 -9.659258e-001 -6.400577e-016
+    outer loop
+      vertex 2.396515e+001 1.541063e+001 0.000000e+000
+      vertex 2.438608e+001 1.552342e+001 4.399139e+000
+      vertex 2.396515e+001 1.541063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 -9.063078e-001 -5.879071e-016
+    outer loop
+      vertex 2.357020e+001 1.522646e+001 0.000000e+000
+      vertex 2.396515e+001 1.541063e+001 4.399139e+000
+      vertex 2.357020e+001 1.522646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 -8.191520e-001 -5.942889e-016
+    outer loop
+      vertex 2.321323e+001 1.497651e+001 0.000000e+000
+      vertex 2.357020e+001 1.522646e+001 4.399139e+000
+      vertex 2.321323e+001 1.497651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 -7.071068e-001 -5.710544e-016
+    outer loop
+      vertex 2.290509e+001 1.466837e+001 0.000000e+000
+      vertex 2.321323e+001 1.497651e+001 4.399139e+000
+      vertex 2.290509e+001 1.466837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 -5.735764e-001 -8.612394e-016
+    outer loop
+      vertex 2.265514e+001 1.431140e+001 0.000000e+000
+      vertex 2.290509e+001 1.466837e+001 4.399139e+000
+      vertex 2.265514e+001 1.431140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 -4.226183e-001 -3.146724e-016
+    outer loop
+      vertex 2.247097e+001 1.391645e+001 0.000000e+000
+      vertex 2.265514e+001 1.431140e+001 4.399139e+000
+      vertex 2.247097e+001 1.391645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 -2.588190e-001 -5.300545e-016
+    outer loop
+      vertex 2.235818e+001 1.349552e+001 0.000000e+000
+      vertex 2.247097e+001 1.391645e+001 4.399139e+000
+      vertex 2.235818e+001 1.349552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 -8.715574e-002 -7.038636e-016
+    outer loop
+      vertex 2.232020e+001 1.306140e+001 0.000000e+000
+      vertex 2.235818e+001 1.349552e+001 4.399139e+000
+      vertex 2.232020e+001 1.306140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 8.715574e-002 3.519318e-017
+    outer loop
+      vertex 2.235818e+001 1.262728e+001 0.000000e+000
+      vertex 2.232020e+001 1.306140e+001 4.399139e+000
+      vertex 2.235818e+001 1.262728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 2.588190e-001 -5.710544e-016
+    outer loop
+      vertex 2.247097e+001 1.220635e+001 0.000000e+000
+      vertex 2.235818e+001 1.262728e+001 4.399139e+000
+      vertex 2.247097e+001 1.220635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 4.226183e-001 1.706518e-016
+    outer loop
+      vertex 2.265514e+001 1.181140e+001 0.000000e+000
+      vertex 2.247097e+001 1.220635e+001 4.399139e+000
+      vertex 2.265514e+001 1.181140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 5.735764e-001 2.316081e-016
+    outer loop
+      vertex 2.290509e+001 1.145443e+001 0.000000e+000
+      vertex 2.265514e+001 1.181140e+001 4.399139e+000
+      vertex 2.290509e+001 1.145443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 7.071068e-001 -2.855272e-016
+    outer loop
+      vertex 2.321323e+001 1.114629e+001 0.000000e+000
+      vertex 2.290509e+001 1.145443e+001 4.399139e+000
+      vertex 2.321323e+001 1.114629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 8.191520e-001 0.000000e+000
+    outer loop
+      vertex 2.357020e+001 1.089634e+001 0.000000e+000
+      vertex 2.321323e+001 1.114629e+001 4.399139e+000
+      vertex 2.357020e+001 1.089634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 9.063078e-001 -3.413035e-016
+    outer loop
+      vertex 2.396515e+001 1.071217e+001 0.000000e+000
+      vertex 2.357020e+001 1.089634e+001 4.399139e+000
+      vertex 2.396515e+001 1.071217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 9.659258e-001 -2.090204e-016
+    outer loop
+      vertex 2.438608e+001 1.059938e+001 0.000000e+000
+      vertex 2.396515e+001 1.071217e+001 4.399139e+000
+      vertex 2.438608e+001 1.059938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 9.961947e-001 -7.038636e-017
+    outer loop
+      vertex 2.482020e+001 1.056140e+001 0.000000e+000
+      vertex 2.438608e+001 1.059938e+001 4.399139e+000
+      vertex 2.482020e+001 1.056140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 9.961947e-001 -3.318735e-016
+    outer loop
+      vertex 2.525432e+001 1.059938e+001 0.000000e+000
+      vertex 2.482020e+001 1.056140e+001 4.399139e+000
+      vertex 2.525432e+001 1.059938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 9.659258e-001 2.090204e-016
+    outer loop
+      vertex 2.567525e+001 1.071217e+001 0.000000e+000
+      vertex 2.525432e+001 1.059938e+001 4.399139e+000
+      vertex 2.567525e+001 1.071217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 9.063078e-001 0.000000e+000
+    outer loop
+      vertex 2.607020e+001 1.089634e+001 0.000000e+000
+      vertex 2.567525e+001 1.071217e+001 4.399139e+000
+      vertex 2.607020e+001 1.089634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 8.191520e-001 1.324456e-016
+    outer loop
+      vertex 2.642717e+001 1.114629e+001 0.000000e+000
+      vertex 2.607020e+001 1.089634e+001 4.399139e+000
+      vertex 2.642717e+001 1.114629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 7.071068e-001 5.710544e-016
+    outer loop
+      vertex 2.673531e+001 1.145443e+001 0.000000e+000
+      vertex 2.642717e+001 1.114629e+001 4.399139e+000
+      vertex 2.673531e+001 1.145443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 5.735764e-001 0.000000e+000
+    outer loop
+      vertex 2.698526e+001 1.181140e+001 0.000000e+000
+      vertex 2.673531e+001 1.145443e+001 4.399139e+000
+      vertex 2.698526e+001 1.181140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 4.226183e-001 -3.413035e-016
+    outer loop
+      vertex 2.716943e+001 1.220635e+001 0.000000e+000
+      vertex 2.698526e+001 1.181140e+001 4.399139e+000
+      vertex 2.716943e+001 1.220635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.659258e-001 2.588190e-001 -1.045102e-016
+    outer loop
+      vertex 2.728222e+001 1.262728e+001 0.000000e+000
+      vertex 2.716943e+001 1.220635e+001 4.399139e+000
+      vertex 2.728222e+001 1.262728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.659258e-001 2.588190e-001 -2.063153e-016
+    outer loop
+      vertex 2.728222e+001 1.262728e+001 0.000000e+000
+      vertex 2.716943e+001 1.220635e+001 0.000000e+000
+      vertex 2.716943e+001 1.220635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 4.226183e-001 0.000000e+000
+    outer loop
+      vertex 2.716943e+001 1.220635e+001 0.000000e+000
+      vertex 2.698526e+001 1.181140e+001 0.000000e+000
+      vertex 2.698526e+001 1.181140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 5.735764e-001 6.587610e-016
+    outer loop
+      vertex 2.698526e+001 1.181140e+001 0.000000e+000
+      vertex 2.673531e+001 1.145443e+001 0.000000e+000
+      vertex 2.673531e+001 1.145443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 7.071068e-001 2.895653e-016
+    outer loop
+      vertex 2.673531e+001 1.145443e+001 0.000000e+000
+      vertex 2.642717e+001 1.114629e+001 0.000000e+000
+      vertex 2.642717e+001 1.114629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 8.191520e-001 0.000000e+000
+    outer loop
+      vertex 2.642717e+001 1.114629e+001 0.000000e+000
+      vertex 2.607020e+001 1.089634e+001 0.000000e+000
+      vertex 2.607020e+001 1.089634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 9.063078e-001 3.402392e-016
+    outer loop
+      vertex 2.607020e+001 1.089634e+001 0.000000e+000
+      vertex 2.567525e+001 1.071217e+001 0.000000e+000
+      vertex 2.567525e+001 1.071217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 9.659258e-001 -1.845979e-016
+    outer loop
+      vertex 2.567525e+001 1.071217e+001 0.000000e+000
+      vertex 2.525432e+001 1.059938e+001 0.000000e+000
+      vertex 2.525432e+001 1.059938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 9.961947e-001 7.058154e-017
+    outer loop
+      vertex 2.525432e+001 1.059938e+001 0.000000e+000
+      vertex 2.482020e+001 1.056140e+001 0.000000e+000
+      vertex 2.482020e+001 1.056140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 9.961947e-001 -7.058154e-017
+    outer loop
+      vertex 2.482020e+001 1.056140e+001 0.000000e+000
+      vertex 2.438608e+001 1.059938e+001 0.000000e+000
+      vertex 2.438608e+001 1.059938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 9.659258e-001 -2.099348e-016
+    outer loop
+      vertex 2.438608e+001 1.059938e+001 0.000000e+000
+      vertex 2.396515e+001 1.071217e+001 0.000000e+000
+      vertex 2.396515e+001 1.071217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 9.063078e-001 0.000000e+000
+    outer loop
+      vertex 2.396515e+001 1.071217e+001 0.000000e+000
+      vertex 2.357020e+001 1.089634e+001 0.000000e+000
+      vertex 2.357020e+001 1.089634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 8.191520e-001 -1.303044e-016
+    outer loop
+      vertex 2.357020e+001 1.089634e+001 0.000000e+000
+      vertex 2.321323e+001 1.114629e+001 0.000000e+000
+      vertex 2.321323e+001 1.114629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 7.071068e-001 2.895653e-016
+    outer loop
+      vertex 2.321323e+001 1.114629e+001 0.000000e+000
+      vertex 2.290509e+001 1.145443e+001 0.000000e+000
+      vertex 2.290509e+001 1.145443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 5.735764e-001 2.316522e-016
+    outer loop
+      vertex 2.290509e+001 1.145443e+001 0.000000e+000
+      vertex 2.265514e+001 1.181140e+001 0.000000e+000
+      vertex 2.265514e+001 1.181140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 4.226183e-001 -3.909131e-016
+    outer loop
+      vertex 2.265514e+001 1.181140e+001 0.000000e+000
+      vertex 2.247097e+001 1.220635e+001 0.000000e+000
+      vertex 2.247097e+001 1.220635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 2.588190e-001 1.049674e-016
+    outer loop
+      vertex 2.247097e+001 1.220635e+001 0.000000e+000
+      vertex 2.235818e+001 1.262728e+001 0.000000e+000
+      vertex 2.235818e+001 1.262728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 8.715574e-002 7.040056e-016
+    outer loop
+      vertex 2.235818e+001 1.262728e+001 0.000000e+000
+      vertex 2.232020e+001 1.306140e+001 0.000000e+000
+      vertex 2.232020e+001 1.306140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 -8.715574e-002 9.048915e-016
+    outer loop
+      vertex 2.232020e+001 1.306140e+001 0.000000e+000
+      vertex 2.235818e+001 1.349552e+001 0.000000e+000
+      vertex 2.235818e+001 1.349552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 -2.588190e-001 1.134605e-015
+    outer loop
+      vertex 2.247097e+001 1.391645e+001 0.000000e+000
+      vertex 2.247097e+001 1.391645e+001 4.399139e+000
+      vertex 2.235818e+001 1.349552e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 -4.226183e-001 5.863697e-016
+    outer loop
+      vertex 2.247097e+001 1.391645e+001 0.000000e+000
+      vertex 2.265514e+001 1.431140e+001 0.000000e+000
+      vertex 2.265514e+001 1.431140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 -5.735764e-001 9.266089e-016
+    outer loop
+      vertex 2.265514e+001 1.431140e+001 0.000000e+000
+      vertex 2.290509e+001 1.466837e+001 0.000000e+000
+      vertex 2.290509e+001 1.466837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 -7.071068e-001 8.542176e-016
+    outer loop
+      vertex 2.290509e+001 1.466837e+001 0.000000e+000
+      vertex 2.321323e+001 1.497651e+001 0.000000e+000
+      vertex 2.321323e+001 1.497651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 -8.191520e-001 8.612394e-016
+    outer loop
+      vertex 2.357020e+001 1.522646e+001 0.000000e+000
+      vertex 2.357020e+001 1.522646e+001 4.399139e+000
+      vertex 2.321323e+001 1.497651e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 -9.063078e-001 8.542176e-016
+    outer loop
+      vertex 2.357020e+001 1.522646e+001 0.000000e+000
+      vertex 2.396515e+001 1.541063e+001 0.000000e+000
+      vertex 2.396515e+001 1.541063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 -9.659258e-001 9.193698e-016
+    outer loop
+      vertex 2.396515e+001 1.541063e+001 0.000000e+000
+      vertex 2.438608e+001 1.552342e+001 0.000000e+000
+      vertex 2.438608e+001 1.552342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 -9.961947e-001 7.040056e-016
+    outer loop
+      vertex 2.438608e+001 1.552342e+001 0.000000e+000
+      vertex 2.482020e+001 1.556140e+001 0.000000e+000
+      vertex 2.482020e+001 1.556140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 -9.961947e-001 9.051759e-016
+    outer loop
+      vertex 2.525432e+001 1.552342e+001 0.000000e+000
+      vertex 2.525432e+001 1.552342e+001 4.399139e+000
+      vertex 2.482020e+001 1.556140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 -9.659258e-001 1.031576e-015
+    outer loop
+      vertex 2.525432e+001 1.552342e+001 0.000000e+000
+      vertex 2.567525e+001 1.541063e+001 0.000000e+000
+      vertex 2.567525e+001 1.541063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 -9.063078e-001 5.863697e-016
+    outer loop
+      vertex 2.567525e+001 1.541063e+001 0.000000e+000
+      vertex 2.607020e+001 1.522646e+001 0.000000e+000
+      vertex 2.607020e+001 1.522646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 -8.191520e-001 9.266089e-016
+    outer loop
+      vertex 2.607020e+001 1.522646e+001 0.000000e+000
+      vertex 2.642717e+001 1.497651e+001 0.000000e+000
+      vertex 2.642717e+001 1.497651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 -7.071068e-001 1.143783e-015
+    outer loop
+      vertex 2.642717e+001 1.497651e+001 0.000000e+000
+      vertex 2.673531e+001 1.466837e+001 0.000000e+000
+      vertex 2.673531e+001 1.466837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 -5.735764e-001 6.298045e-016
+    outer loop
+      vertex 2.673531e+001 1.466837e+001 0.000000e+000
+      vertex 2.698526e+001 1.431140e+001 0.000000e+000
+      vertex 2.698526e+001 1.431140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 -4.226183e-001 1.049674e-015
+    outer loop
+      vertex 2.698526e+001 1.431140e+001 0.000000e+000
+      vertex 2.716943e+001 1.391645e+001 0.000000e+000
+      vertex 2.716943e+001 1.391645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 4.320200e+000 1.706140e+001 5.000000e+000
+      vertex 4.373373e+000 1.645363e+001 5.000000e+000
+      vertex 5.320200e+000 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 5.358181e+000 1.749552e+001 4.399139e+000
+      vertex 4.320200e+000 1.706140e+001 5.000000e+000
+      vertex 5.320200e+000 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 5.358181e+000 1.749552e+001 4.399139e+000
+      vertex 4.373373e+000 1.766917e+001 5.000000e+000
+      vertex 4.320200e+000 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 5.358181e+000 1.749552e+001 4.399139e+000
+      vertex 4.531276e+000 1.825847e+001 5.000000e+000
+      vertex 4.373373e+000 1.766917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 5.358181e+000 1.749552e+001 4.399139e+000
+      vertex 5.470968e+000 1.791645e+001 4.399139e+000
+      vertex 4.531276e+000 1.825847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 4.531276e+000 1.825847e+001 5.000000e+000
+      vertex 5.470968e+000 1.791645e+001 4.399139e+000
+      vertex 4.789111e+000 1.881140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 4.789111e+000 1.881140e+001 5.000000e+000
+      vertex 5.470968e+000 1.791645e+001 4.399139e+000
+      vertex 5.655136e+000 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 5.139044e+000 1.931116e+001 5.000000e+000
+      vertex 5.655136e+000 1.831140e+001 4.399139e+000
+      vertex 5.905089e+000 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 5.570443e+000 1.974256e+001 5.000000e+000
+      vertex 5.905089e+000 1.866837e+001 4.399139e+000
+      vertex 6.213231e+000 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 6.570200e+000 1.922646e+001 4.399139e+000
+      vertex 5.570443e+000 1.974256e+001 5.000000e+000
+      vertex 6.213231e+000 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 6.570200e+000 1.922646e+001 4.399139e+000
+      vertex 6.070200e+000 2.009249e+001 5.000000e+000
+      vertex 5.570443e+000 1.974256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 6.570200e+000 1.922646e+001 4.399139e+000
+      vertex 6.965150e+000 1.941063e+001 4.399139e+000
+      vertex 6.070200e+000 2.009249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 6.070200e+000 2.009249e+001 5.000000e+000
+      vertex 6.965150e+000 1.941063e+001 4.399139e+000
+      vertex 6.623129e+000 2.035032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 6.623129e+000 2.035032e+001 5.000000e+000
+      vertex 6.965150e+000 1.941063e+001 4.399139e+000
+      vertex 7.212431e+000 2.050823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 7.212431e+000 2.050823e+001 5.000000e+000
+      vertex 6.965150e+000 1.941063e+001 4.399139e+000
+      vertex 7.386080e+000 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 7.820200e+000 2.056140e+001 5.000000e+000
+      vertex 7.386080e+000 1.952342e+001 4.399139e+000
+      vertex 7.820200e+000 1.956140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 8.427969e+000 2.050823e+001 5.000000e+000
+      vertex 7.820200e+000 1.956140e+001 4.399139e+000
+      vertex 8.254320e+000 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 9.017271e+000 2.035032e+001 5.000000e+000
+      vertex 8.254320e+000 1.952342e+001 4.399139e+000
+      vertex 8.675250e+000 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 9.570200e+000 2.009249e+001 5.000000e+000
+      vertex 8.675250e+000 1.941063e+001 4.399139e+000
+      vertex 9.070200e+000 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 1.006996e+001 1.974256e+001 5.000000e+000
+      vertex 9.070200e+000 1.922646e+001 4.399139e+000
+      vertex 9.427169e+000 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 9.735311e+000 1.866837e+001 4.399139e+000
+      vertex 1.006996e+001 1.974256e+001 5.000000e+000
+      vertex 9.427169e+000 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 9.735311e+000 1.866837e+001 4.399139e+000
+      vertex 1.050136e+001 1.931116e+001 5.000000e+000
+      vertex 1.006996e+001 1.974256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 9.735311e+000 1.866837e+001 4.399139e+000
+      vertex 9.985264e+000 1.831140e+001 4.399139e+000
+      vertex 1.050136e+001 1.931116e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 1.050136e+001 1.931116e+001 5.000000e+000
+      vertex 9.985264e+000 1.831140e+001 4.399139e+000
+      vertex 1.085129e+001 1.881140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 1.085129e+001 1.881140e+001 5.000000e+000
+      vertex 9.985264e+000 1.831140e+001 4.399139e+000
+      vertex 1.016943e+001 1.791645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 1.110912e+001 1.825847e+001 5.000000e+000
+      vertex 1.016943e+001 1.791645e+001 4.399139e+000
+      vertex 1.028222e+001 1.749552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 1.126703e+001 1.766917e+001 5.000000e+000
+      vertex 1.028222e+001 1.749552e+001 4.399139e+000
+      vertex 1.132020e+001 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 -1.336752e-001 8.562984e-001
+    outer loop
+      vertex 1.126703e+001 1.766917e+001 5.000000e+000
+      vertex 1.110912e+001 1.825847e+001 5.000000e+000
+      vertex 1.028222e+001 1.749552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 4.531276e+000 1.586433e+001 5.000000e+000
+      vertex 5.470968e+000 1.620635e+001 4.399139e+000
+      vertex 4.373373e+000 1.645363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 4.531276e+000 1.586433e+001 5.000000e+000
+      vertex 5.655136e+000 1.581140e+001 4.399139e+000
+      vertex 5.470968e+000 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 4.531276e+000 1.586433e+001 5.000000e+000
+      vertex 4.789111e+000 1.531140e+001 5.000000e+000
+      vertex 5.655136e+000 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 5.655136e+000 1.581140e+001 4.399139e+000
+      vertex 4.789111e+000 1.531140e+001 5.000000e+000
+      vertex 5.905089e+000 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 5.905089e+000 1.545443e+001 4.399139e+000
+      vertex 4.789111e+000 1.531140e+001 5.000000e+000
+      vertex 5.139044e+000 1.481164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 6.213231e+000 1.514629e+001 4.399139e+000
+      vertex 5.139044e+000 1.481164e+001 5.000000e+000
+      vertex 5.570443e+000 1.438024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 6.570200e+000 1.489634e+001 4.399139e+000
+      vertex 5.570443e+000 1.438024e+001 5.000000e+000
+      vertex 6.070200e+000 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 6.623129e+000 1.377248e+001 5.000000e+000
+      vertex 6.570200e+000 1.489634e+001 4.399139e+000
+      vertex 6.070200e+000 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 6.623129e+000 1.377248e+001 5.000000e+000
+      vertex 6.965150e+000 1.471217e+001 4.399139e+000
+      vertex 6.570200e+000 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 6.623129e+000 1.377248e+001 5.000000e+000
+      vertex 7.386080e+000 1.459938e+001 4.399139e+000
+      vertex 6.965150e+000 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 6.623129e+000 1.377248e+001 5.000000e+000
+      vertex 7.212431e+000 1.361457e+001 5.000000e+000
+      vertex 7.386080e+000 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 7.386080e+000 1.459938e+001 4.399139e+000
+      vertex 7.212431e+000 1.361457e+001 5.000000e+000
+      vertex 7.820200e+000 1.356140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 7.820200e+000 1.456140e+001 4.399139e+000
+      vertex 7.820200e+000 1.356140e+001 5.000000e+000
+      vertex 8.427969e+000 1.361457e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 8.254320e+000 1.459938e+001 4.399139e+000
+      vertex 8.427969e+000 1.361457e+001 5.000000e+000
+      vertex 9.017271e+000 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 8.675250e+000 1.471217e+001 4.399139e+000
+      vertex 9.017271e+000 1.377248e+001 5.000000e+000
+      vertex 9.570200e+000 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 9.070200e+000 1.489634e+001 4.399139e+000
+      vertex 9.570200e+000 1.403031e+001 5.000000e+000
+      vertex 1.006996e+001 1.438024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 9.427169e+000 1.514629e+001 4.399139e+000
+      vertex 1.006996e+001 1.438024e+001 5.000000e+000
+      vertex 1.050136e+001 1.481164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 9.735311e+000 1.545443e+001 4.399139e+000
+      vertex 1.050136e+001 1.481164e+001 5.000000e+000
+      vertex 9.985264e+000 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 9.735311e+000 1.545443e+001 4.399139e+000
+      vertex 9.427169e+000 1.514629e+001 4.399139e+000
+      vertex 1.050136e+001 1.481164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.230768e-001 2.962415e-001 8.562984e-001
+    outer loop
+      vertex 1.050136e+001 1.481164e+001 5.000000e+000
+      vertex 1.085129e+001 1.531140e+001 5.000000e+000
+      vertex 9.985264e+000 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 9.985264e+000 1.581140e+001 4.399139e+000
+      vertex 1.085129e+001 1.531140e+001 5.000000e+000
+      vertex 1.016943e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 2.182745e-001 8.562984e-001
+    outer loop
+      vertex 1.016943e+001 1.620635e+001 4.399139e+000
+      vertex 1.085129e+001 1.531140e+001 5.000000e+000
+      vertex 1.110912e+001 1.586433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 1.126703e+001 1.645363e+001 5.000000e+000
+      vertex 1.016943e+001 1.620635e+001 4.399139e+000
+      vertex 1.110912e+001 1.586433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 1.126703e+001 1.645363e+001 5.000000e+000
+      vertex 1.028222e+001 1.662728e+001 4.399139e+000
+      vertex 1.016943e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 1.126703e+001 1.645363e+001 5.000000e+000
+      vertex 1.132020e+001 1.706140e+001 5.000000e+000
+      vertex 1.028222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 1.028222e+001 1.662728e+001 4.399139e+000
+      vertex 1.132020e+001 1.706140e+001 5.000000e+000
+      vertex 1.032020e+001 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.145160e-001 -4.501432e-002 8.562984e-001
+    outer loop
+      vertex 1.032020e+001 1.706140e+001 4.399139e+000
+      vertex 1.132020e+001 1.706140e+001 5.000000e+000
+      vertex 1.028222e+001 1.749552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.680911e-001 -2.182745e-001 8.562984e-001
+    outer loop
+      vertex 1.110912e+001 1.825847e+001 5.000000e+000
+      vertex 1.085129e+001 1.881140e+001 5.000000e+000
+      vertex 1.016943e+001 1.791645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 -4.230768e-001 8.562984e-001
+    outer loop
+      vertex 9.070200e+000 1.922646e+001 4.399139e+000
+      vertex 1.006996e+001 1.974256e+001 5.000000e+000
+      vertex 9.570200e+000 2.009249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 -4.680911e-001 8.562984e-001
+    outer loop
+      vertex 9.017271e+000 2.035032e+001 5.000000e+000
+      vertex 8.675250e+000 1.941063e+001 4.399139e+000
+      vertex 9.570200e+000 2.009249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 -4.988827e-001 8.562984e-001
+    outer loop
+      vertex 9.017271e+000 2.035032e+001 5.000000e+000
+      vertex 8.427969e+000 2.050823e+001 5.000000e+000
+      vertex 8.254320e+000 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 8.427969e+000 2.050823e+001 5.000000e+000
+      vertex 7.820200e+000 2.056140e+001 5.000000e+000
+      vertex 7.820200e+000 1.956140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 -5.145160e-001 8.562984e-001
+    outer loop
+      vertex 7.386080e+000 1.952342e+001 4.399139e+000
+      vertex 7.820200e+000 2.056140e+001 5.000000e+000
+      vertex 7.212431e+000 2.050823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 -3.652075e-001 8.562984e-001
+    outer loop
+      vertex 5.139044e+000 1.931116e+001 5.000000e+000
+      vertex 5.905089e+000 1.866837e+001 4.399139e+000
+      vertex 5.570443e+000 1.974256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.230768e-001 -2.962415e-001 8.562984e-001
+    outer loop
+      vertex 5.139044e+000 1.931116e+001 5.000000e+000
+      vertex 4.789111e+000 1.881140e+001 5.000000e+000
+      vertex 5.655136e+000 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 1.006996e+001 1.438024e+001 5.000000e+000
+      vertex 9.427169e+000 1.514629e+001 4.399139e+000
+      vertex 9.070200e+000 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.182745e-001 4.680911e-001 8.562984e-001
+    outer loop
+      vertex 9.070200e+000 1.489634e+001 4.399139e+000
+      vertex 8.675250e+000 1.471217e+001 4.399139e+000
+      vertex 9.570200e+000 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.336752e-001 4.988827e-001 8.562984e-001
+    outer loop
+      vertex 8.675250e+000 1.471217e+001 4.399139e+000
+      vertex 8.254320e+000 1.459938e+001 4.399139e+000
+      vertex 9.017271e+000 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 8.254320e+000 1.459938e+001 4.399139e+000
+      vertex 7.820200e+000 1.456140e+001 4.399139e+000
+      vertex 8.427969e+000 1.361457e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.501432e-002 5.145160e-001 8.562984e-001
+    outer loop
+      vertex 7.820200e+000 1.456140e+001 4.399139e+000
+      vertex 7.386080e+000 1.459938e+001 4.399139e+000
+      vertex 7.820200e+000 1.356140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.962415e-001 4.230768e-001 8.562984e-001
+    outer loop
+      vertex 6.570200e+000 1.489634e+001 4.399139e+000
+      vertex 6.213231e+000 1.514629e+001 4.399139e+000
+      vertex 5.570443e+000 1.438024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 3.652075e-001 3.652075e-001 8.562984e-001
+    outer loop
+      vertex 5.139044e+000 1.481164e+001 5.000000e+000
+      vertex 6.213231e+000 1.514629e+001 4.399139e+000
+      vertex 5.905089e+000 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.988827e-001 1.336752e-001 8.562984e-001
+    outer loop
+      vertex 5.358181e+000 1.662728e+001 4.399139e+000
+      vertex 4.373373e+000 1.645363e+001 5.000000e+000
+      vertex 5.470968e+000 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.145160e-001 4.501432e-002 8.562984e-001
+    outer loop
+      vertex 5.358181e+000 1.662728e+001 4.399139e+000
+      vertex 5.320200e+000 1.706140e+001 4.399139e+000
+      vertex 4.373373e+000 1.645363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 8.715574e-002 0.000000e+000
+    outer loop
+      vertex 1.032020e+001 1.706140e+001 -8.881784e-016
+      vertex 1.028222e+001 1.662728e+001 -8.881784e-016
+      vertex 1.028222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 8.715574e-002 0.000000e+000
+    outer loop
+      vertex 1.032020e+001 1.706140e+001 4.399139e+000
+      vertex 1.032020e+001 1.706140e+001 -8.881784e-016
+      vertex 1.028222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.961947e-001 -8.715574e-002 0.000000e+000
+    outer loop
+      vertex 1.032020e+001 1.706140e+001 4.399139e+000
+      vertex 1.028222e+001 1.749552e+001 -8.881784e-016
+      vertex 1.032020e+001 1.706140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -9.961947e-001 -8.715574e-002 -9.067013e-016
+    outer loop
+      vertex 1.032020e+001 1.706140e+001 4.399139e+000
+      vertex 1.028222e+001 1.749552e+001 4.399139e+000
+      vertex 1.028222e+001 1.749552e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -9.659258e-001 -2.588190e-001 5.300545e-016
+    outer loop
+      vertex 1.028222e+001 1.749552e+001 -8.881784e-016
+      vertex 1.028222e+001 1.749552e+001 4.399139e+000
+      vertex 1.016943e+001 1.791645e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -9.659258e-001 -2.588190e-001 -6.400577e-016
+    outer loop
+      vertex 1.016943e+001 1.791645e+001 -8.881784e-016
+      vertex 1.028222e+001 1.749552e+001 4.399139e+000
+      vertex 1.016943e+001 1.791645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 -4.226183e-001 -5.879071e-016
+    outer loop
+      vertex 9.985264e+000 1.831140e+001 -8.881784e-016
+      vertex 1.016943e+001 1.791645e+001 4.399139e+000
+      vertex 9.985264e+000 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 -5.735764e-001 -5.942889e-016
+    outer loop
+      vertex 9.735311e+000 1.866837e+001 -8.881784e-016
+      vertex 9.985264e+000 1.831140e+001 4.399139e+000
+      vertex 9.735311e+000 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 -7.071068e-001 -1.142109e-015
+    outer loop
+      vertex 9.427169e+000 1.897651e+001 -8.881784e-016
+      vertex 9.735311e+000 1.866837e+001 4.399139e+000
+      vertex 9.427169e+000 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 -8.191520e-001 -6.296313e-016
+    outer loop
+      vertex 9.070200e+000 1.922646e+001 -8.881784e-016
+      vertex 9.427169e+000 1.897651e+001 4.399139e+000
+      vertex 9.070200e+000 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 -9.063078e-001 -1.046600e-015
+    outer loop
+      vertex 8.675250e+000 1.941063e+001 -8.881784e-016
+      vertex 9.070200e+000 1.922646e+001 4.399139e+000
+      vertex 8.675250e+000 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 -9.659258e-001 -1.310129e-015
+    outer loop
+      vertex 8.254320e+000 1.952342e+001 -8.881784e-016
+      vertex 8.675250e+000 1.941063e+001 4.399139e+000
+      vertex 8.254320e+000 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 -9.961947e-001 -7.038636e-016
+    outer loop
+      vertex 7.820200e+000 1.956140e+001 -8.881784e-016
+      vertex 8.254320e+000 1.952342e+001 4.399139e+000
+      vertex 7.820200e+000 1.956140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 -9.961947e-001 -9.051759e-016
+    outer loop
+      vertex 7.386080e+000 1.952342e+001 -8.881784e-016
+      vertex 7.820200e+000 1.956140e+001 4.399139e+000
+      vertex 7.386080e+000 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 -9.659258e-001 -3.545305e-016
+    outer loop
+      vertex 6.965150e+000 1.941063e+001 -8.881784e-016
+      vertex 7.386080e+000 1.952342e+001 4.399139e+000
+      vertex 6.965150e+000 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 -9.063078e-001 -7.585588e-016
+    outer loop
+      vertex 6.570200e+000 1.922646e+001 -8.881784e-016
+      vertex 6.965150e+000 1.941063e+001 4.399139e+000
+      vertex 6.570200e+000 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 -8.191520e-001 -1.040864e-015
+    outer loop
+      vertex 6.213231e+000 1.897651e+001 -8.881784e-016
+      vertex 6.570200e+000 1.922646e+001 4.399139e+000
+      vertex 6.213231e+000 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 -7.071068e-001 -8.565816e-016
+    outer loop
+      vertex 5.905089e+000 1.866837e+001 -8.881784e-016
+      vertex 6.213231e+000 1.897651e+001 4.399139e+000
+      vertex 5.905089e+000 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 -5.735764e-001 -3.980232e-016
+    outer loop
+      vertex 5.655136e+000 1.831140e+001 -8.881784e-016
+      vertex 5.905089e+000 1.866837e+001 4.399139e+000
+      vertex 5.655136e+000 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 -4.226183e-001 -8.512880e-016
+    outer loop
+      vertex 5.470968e+000 1.791645e+001 -8.881784e-016
+      vertex 5.655136e+000 1.831140e+001 4.399139e+000
+      vertex 5.470968e+000 1.791645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 -2.588190e-001 -7.250733e-016
+    outer loop
+      vertex 5.358181e+000 1.749552e+001 -8.881784e-016
+      vertex 5.470968e+000 1.791645e+001 4.399139e+000
+      vertex 5.358181e+000 1.749552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 -8.715574e-002 -7.038636e-016
+    outer loop
+      vertex 5.320200e+000 1.706140e+001 -8.881784e-016
+      vertex 5.358181e+000 1.749552e+001 4.399139e+000
+      vertex 5.320200e+000 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 8.715574e-002 7.038636e-017
+    outer loop
+      vertex 5.358181e+000 1.662728e+001 -8.881784e-016
+      vertex 5.320200e+000 1.706140e+001 4.399139e+000
+      vertex 5.358181e+000 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 2.588190e-001 -3.900374e-016
+    outer loop
+      vertex 5.470968e+000 1.620635e+001 -8.881784e-016
+      vertex 5.358181e+000 1.662728e+001 4.399139e+000
+      vertex 5.470968e+000 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 4.226183e-001 -1.829819e-016
+    outer loop
+      vertex 5.655136e+000 1.581140e+001 -8.881784e-016
+      vertex 5.470968e+000 1.620635e+001 4.399139e+000
+      vertex 5.655136e+000 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 5.735764e-001 6.622278e-017
+    outer loop
+      vertex 5.905089e+000 1.545443e+001 -8.881784e-016
+      vertex 5.655136e+000 1.581140e+001 4.399139e+000
+      vertex 5.905089e+000 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 7.071068e-001 7.071068e-001 -6.583952e-030
+    outer loop
+      vertex 6.213231e+000 1.514629e+001 -8.881784e-016
+      vertex 5.905089e+000 1.545443e+001 4.399139e+000
+      vertex 6.213231e+000 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 8.191520e-001 2.149666e-016
+    outer loop
+      vertex 6.570200e+000 1.489634e+001 -8.881784e-016
+      vertex 6.213231e+000 1.514629e+001 4.399139e+000
+      vertex 6.570200e+000 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 9.063078e-001 -2.559776e-016
+    outer loop
+      vertex 6.965150e+000 1.471217e+001 -8.881784e-016
+      vertex 6.570200e+000 1.489634e+001 4.399139e+000
+      vertex 6.965150e+000 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 9.659258e-001 -1.567653e-016
+    outer loop
+      vertex 7.386080e+000 1.459938e+001 -8.881784e-016
+      vertex 6.965150e+000 1.471217e+001 4.399139e+000
+      vertex 7.386080e+000 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 9.961947e-001 -1.759659e-017
+    outer loop
+      vertex 7.820200e+000 1.456140e+001 -8.881784e-016
+      vertex 7.386080e+000 1.459938e+001 4.399139e+000
+      vertex 7.820200e+000 1.456140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 9.961947e-001 7.038636e-017
+    outer loop
+      vertex 8.254320e+000 1.459938e+001 -8.881784e-016
+      vertex 7.820200e+000 1.456140e+001 4.399139e+000
+      vertex 8.254320e+000 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 9.659258e-001 -2.855272e-016
+    outer loop
+      vertex 8.675250e+000 1.471217e+001 -8.881784e-016
+      vertex 8.254320e+000 1.459938e+001 4.399139e+000
+      vertex 8.675250e+000 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 9.063078e-001 -1.953121e-016
+    outer loop
+      vertex 9.070200e+000 1.489634e+001 -8.881784e-016
+      vertex 8.675250e+000 1.471217e+001 4.399139e+000
+      vertex 9.070200e+000 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 8.191520e-001 -9.916256e-017
+    outer loop
+      vertex 9.427169e+000 1.514629e+001 -8.881784e-016
+      vertex 9.070200e+000 1.489634e+001 4.399139e+000
+      vertex 9.427169e+000 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 7.071068e-001 0.000000e+000
+    outer loop
+      vertex 9.735311e+000 1.545443e+001 -8.881784e-016
+      vertex 9.427169e+000 1.514629e+001 4.399139e+000
+      vertex 9.735311e+000 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 5.735764e-001 0.000000e+000
+    outer loop
+      vertex 9.985264e+000 1.581140e+001 -8.881784e-016
+      vertex 9.735311e+000 1.545443e+001 4.399139e+000
+      vertex 9.985264e+000 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 4.226183e-001 3.659639e-016
+    outer loop
+      vertex 1.016943e+001 1.620635e+001 -8.881784e-016
+      vertex 9.985264e+000 1.581140e+001 4.399139e+000
+      vertex 1.016943e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.659258e-001 2.588190e-001 0.000000e+000
+    outer loop
+      vertex 1.028222e+001 1.662728e+001 -8.881784e-016
+      vertex 1.016943e+001 1.620635e+001 4.399139e+000
+      vertex 1.028222e+001 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.659258e-001 2.588190e-001 3.909131e-016
+    outer loop
+      vertex 1.028222e+001 1.662728e+001 -8.881784e-016
+      vertex 1.016943e+001 1.620635e+001 -8.881784e-016
+      vertex 1.016943e+001 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 4.226183e-001 0.000000e+000
+    outer loop
+      vertex 1.016943e+001 1.620635e+001 -8.881784e-016
+      vertex 9.985264e+000 1.581140e+001 -8.881784e-016
+      vertex 9.985264e+000 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 5.735764e-001 0.000000e+000
+    outer loop
+      vertex 9.985264e+000 1.581140e+001 -8.881784e-016
+      vertex 9.735311e+000 1.545443e+001 -8.881784e-016
+      vertex 9.735311e+000 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 7.071068e-001 0.000000e+000
+    outer loop
+      vertex 9.735311e+000 1.545443e+001 -8.881784e-016
+      vertex 9.427169e+000 1.514629e+001 -8.881784e-016
+      vertex 9.427169e+000 1.514629e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 8.191520e-001 -9.410872e-017
+    outer loop
+      vertex 9.427169e+000 1.514629e+001 -8.881784e-016
+      vertex 9.070200e+000 1.489634e+001 -8.881784e-016
+      vertex 9.070200e+000 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 9.063078e-001 -1.954566e-016
+    outer loop
+      vertex 9.070200e+000 1.489634e+001 -8.881784e-016
+      vertex 8.675250e+000 1.471217e+001 -8.881784e-016
+      vertex 8.675250e+000 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 9.659258e-001 2.099348e-016
+    outer loop
+      vertex 8.675250e+000 1.471217e+001 -8.881784e-016
+      vertex 8.254320e+000 1.459938e+001 -8.881784e-016
+      vertex 8.254320e+000 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 9.961947e-001 1.809783e-017
+    outer loop
+      vertex 8.254320e+000 1.459938e+001 -8.881784e-016
+      vertex 7.820200e+000 1.456140e+001 -8.881784e-016
+      vertex 7.820200e+000 1.456140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.715574e-002 9.961947e-001 -5.429349e-017
+    outer loop
+      vertex 7.820200e+000 1.456140e+001 -8.881784e-016
+      vertex 7.386080e+000 1.459938e+001 -8.881784e-016
+      vertex 7.386080e+000 1.459938e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 9.659258e-001 -1.592609e-016
+    outer loop
+      vertex 7.386080e+000 1.459938e+001 -8.881784e-016
+      vertex 6.965150e+000 1.471217e+001 -8.881784e-016
+      vertex 6.965150e+000 1.471217e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 9.063078e-001 2.750870e-016
+    outer loop
+      vertex 6.965150e+000 1.471217e+001 -8.881784e-016
+      vertex 6.570200e+000 1.489634e+001 -8.881784e-016
+      vertex 6.570200e+000 1.489634e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 8.191520e-001 9.916256e-017
+    outer loop
+      vertex 6.213231e+000 1.514629e+001 -8.881784e-016
+      vertex 6.213231e+000 1.514629e+001 4.399139e+000
+      vertex 6.570200e+000 1.489634e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.071068e-001 7.071068e-001 1.447826e-016
+    outer loop
+      vertex 6.213231e+000 1.514629e+001 -8.881784e-016
+      vertex 5.905089e+000 1.545443e+001 -8.881784e-016
+      vertex 5.905089e+000 1.545443e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 5.735764e-001 -1.592609e-016
+    outer loop
+      vertex 5.905089e+000 1.545443e+001 -8.881784e-016
+      vertex 5.655136e+000 1.581140e+001 -8.881784e-016
+      vertex 5.655136e+000 1.581140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.063078e-001 4.226183e-001 -3.691957e-016
+    outer loop
+      vertex 5.655136e+000 1.581140e+001 -8.881784e-016
+      vertex 5.470968e+000 1.620635e+001 -8.881784e-016
+      vertex 5.470968e+000 1.620635e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 2.588190e-001 2.099348e-016
+    outer loop
+      vertex 5.470968e+000 1.620635e+001 -8.881784e-016
+      vertex 5.358181e+000 1.662728e+001 -8.881784e-016
+      vertex 5.358181e+000 1.662728e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 8.715574e-002 7.040056e-016
+    outer loop
+      vertex 5.358181e+000 1.662728e+001 -8.881784e-016
+      vertex 5.320200e+000 1.706140e+001 -8.881784e-016
+      vertex 5.320200e+000 1.706140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.961947e-001 -8.715574e-002 7.040056e-016
+    outer loop
+      vertex 5.320200e+000 1.706140e+001 -8.881784e-016
+      vertex 5.358181e+000 1.749552e+001 -8.881784e-016
+      vertex 5.358181e+000 1.749552e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 9.659258e-001 -2.588190e-001 6.400577e-016
+    outer loop
+      vertex 5.470968e+000 1.791645e+001 -8.881784e-016
+      vertex 5.470968e+000 1.791645e+001 4.399139e+000
+      vertex 5.358181e+000 1.749552e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 9.063078e-001 -4.226183e-001 9.338481e-016
+    outer loop
+      vertex 5.470968e+000 1.791645e+001 -8.881784e-016
+      vertex 5.655136e+000 1.831140e+001 -8.881784e-016
+      vertex 5.655136e+000 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 8.191520e-001 -5.735764e-001 5.942889e-016
+    outer loop
+      vertex 5.905089e+000 1.866837e+001 -8.881784e-016
+      vertex 5.905089e+000 1.866837e+001 4.399139e+000
+      vertex 5.655136e+000 1.831140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.071068e-001 -7.071068e-001 4.271088e-016
+    outer loop
+      vertex 5.905089e+000 1.866837e+001 -8.881784e-016
+      vertex 6.213231e+000 1.897651e+001 -8.881784e-016
+      vertex 6.213231e+000 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 5.735764e-001 -8.191520e-001 6.298045e-016
+    outer loop
+      vertex 6.213231e+000 1.897651e+001 -8.881784e-016
+      vertex 6.570200e+000 1.922646e+001 -8.881784e-016
+      vertex 6.570200e+000 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.226183e-001 -9.063078e-001 1.049674e-015
+    outer loop
+      vertex 6.570200e+000 1.922646e+001 -8.881784e-016
+      vertex 6.965150e+000 1.941063e+001 -8.881784e-016
+      vertex 6.965150e+000 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 2.588190e-001 -9.659258e-001 5.300545e-016
+    outer loop
+      vertex 7.386080e+000 1.952342e+001 -8.881784e-016
+      vertex 7.386080e+000 1.952342e+001 4.399139e+000
+      vertex 6.965150e+000 1.941063e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 8.715574e-002 -9.961947e-001 7.040056e-016
+    outer loop
+      vertex 7.386080e+000 1.952342e+001 -8.881784e-016
+      vertex 7.820200e+000 1.956140e+001 -8.881784e-016
+      vertex 7.820200e+000 1.956140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.715574e-002 -9.961947e-001 1.013479e-016
+    outer loop
+      vertex 7.820200e+000 1.956140e+001 -8.881784e-016
+      vertex 8.254320e+000 1.952342e+001 -8.881784e-016
+      vertex 8.254320e+000 1.952342e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -2.588190e-001 -9.659258e-001 3.547175e-016
+    outer loop
+      vertex 8.254320e+000 1.952342e+001 -8.881784e-016
+      vertex 8.675250e+000 1.941063e+001 -8.881784e-016
+      vertex 8.675250e+000 1.941063e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -4.226183e-001 -9.063078e-001 7.601089e-016
+    outer loop
+      vertex 8.675250e+000 1.941063e+001 -8.881784e-016
+      vertex 9.070200e+000 1.922646e+001 -8.881784e-016
+      vertex 9.070200e+000 1.922646e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -5.735764e-001 -8.191520e-001 2.678479e-016
+    outer loop
+      vertex 9.070200e+000 1.922646e+001 -8.881784e-016
+      vertex 9.427169e+000 1.897651e+001 -8.881784e-016
+      vertex 9.427169e+000 1.897651e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -7.071068e-001 -7.071068e-001 8.542176e-016
+    outer loop
+      vertex 9.427169e+000 1.897651e+001 -8.881784e-016
+      vertex 9.735311e+000 1.866837e+001 -8.881784e-016
+      vertex 9.735311e+000 1.866837e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -8.191520e-001 -5.735764e-001 8.614567e-016
+    outer loop
+      vertex 9.735311e+000 1.866837e+001 -8.881784e-016
+      vertex 9.985264e+000 1.831140e+001 -8.881784e-016
+      vertex 9.985264e+000 1.831140e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal -9.063078e-001 -4.226183e-001 8.542176e-016
+    outer loop
+      vertex 9.985264e+000 1.831140e+001 -8.881784e-016
+      vertex 1.016943e+001 1.791645e+001 -8.881784e-016
+      vertex 1.016943e+001 1.791645e+001 4.399139e+000
+    endloop
+  endfacet
+  facet normal 4.639778e-016 9.961947e-001 -8.715574e-002
+    outer loop
+      vertex -1.798000e-001 -2.938600e+000 5.000000e+000
+      vertex -1.798000e-001 -2.893023e+000 5.520945e+000
+      vertex 1.482020e+001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -2.425509e-016 9.961947e-001 -8.715574e-002
+    outer loop
+      vertex 1.482020e+001 -2.938600e+000 5.000000e+000
+      vertex -1.798000e-001 -2.938600e+000 5.000000e+000
+      vertex 1.482020e+001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 2.425509e-016 9.961947e-001 8.715574e-002
+    outer loop
+      vertex 1.482020e+001 -2.938600e+000 5.000000e+000
+      vertex -1.798000e-001 -2.893023e+000 4.479055e+000
+      vertex -1.798000e-001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.635355e-016 9.961947e-001 8.715574e-002
+    outer loop
+      vertex 1.482020e+001 -2.938600e+000 5.000000e+000
+      vertex 1.482020e+001 -2.893023e+000 4.479055e+000
+      vertex -1.798000e-001 -2.893023e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal 5.101317e-016 9.659258e-001 2.588190e-001
+    outer loop
+      vertex -1.798000e-001 -2.893023e+000 4.479055e+000
+      vertex 1.482020e+001 -2.893023e+000 4.479055e+000
+      vertex -1.798000e-001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -5.234721e-016 9.659258e-001 2.588190e-001
+    outer loop
+      vertex -1.798000e-001 -2.757678e+000 3.973940e+000
+      vertex 1.482020e+001 -2.893023e+000 4.479055e+000
+      vertex 1.482020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -4.809511e-016 9.063078e-001 4.226183e-001
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 3.500000e+000
+      vertex 1.482020e+001 -2.757678e+000 3.973940e+000
+      vertex 1.482020e+001 -2.536676e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal -5.134128e-016 8.191520e-001 5.735764e-001
+    outer loop
+      vertex -1.798000e-001 -2.236733e+000 3.071637e+000
+      vertex 1.482020e+001 -2.536676e+000 3.500000e+000
+      vertex 1.482020e+001 -2.236733e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal -5.024296e-016 7.071068e-001 7.071068e-001
+    outer loop
+      vertex -1.798000e-001 -1.866963e+000 2.701867e+000
+      vertex 1.482020e+001 -2.236733e+000 3.071637e+000
+      vertex 1.482020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -4.870609e-016 5.735764e-001 8.191520e-001
+    outer loop
+      vertex -1.798000e-001 -1.438600e+000 2.401924e+000
+      vertex 1.482020e+001 -1.866963e+000 2.701867e+000
+      vertex 1.482020e+001 -1.438600e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal -4.973720e-016 4.226183e-001 9.063078e-001
+    outer loop
+      vertex -1.798000e-001 -9.646604e-001 2.180922e+000
+      vertex 1.482020e+001 -1.438600e+000 2.401924e+000
+      vertex 1.482020e+001 -9.646604e-001 2.180922e+000
+    endloop
+  endfacet
+  facet normal -4.930284e-016 2.588190e-001 9.659258e-001
+    outer loop
+      vertex -1.798000e-001 -4.595445e-001 2.045577e+000
+      vertex 1.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 1.482020e+001 -4.595445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal -4.799411e-016 8.715574e-002 9.961947e-001
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 2.000000e+000
+      vertex 1.482020e+001 -4.595445e-001 2.045577e+000
+      vertex 1.482020e+001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal -4.933374e-016 -8.715574e-002 9.961947e-001
+    outer loop
+      vertex -1.798000e-001 5.823445e-001 2.045577e+000
+      vertex 1.482020e+001 6.140000e-002 2.000000e+000
+      vertex 1.482020e+001 5.823445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal -4.872123e-016 -2.588190e-001 9.659258e-001
+    outer loop
+      vertex -1.798000e-001 1.087460e+000 2.180922e+000
+      vertex 1.482020e+001 5.823445e-001 2.045577e+000
+      vertex 1.482020e+001 1.087460e+000 2.180922e+000
+    endloop
+  endfacet
+  facet normal -4.809511e-016 -4.226183e-001 9.063078e-001
+    outer loop
+      vertex -1.798000e-001 1.561400e+000 2.401924e+000
+      vertex 1.482020e+001 1.087460e+000 2.180922e+000
+      vertex 1.482020e+001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal -5.049222e-016 -5.735764e-001 8.191520e-001
+    outer loop
+      vertex -1.798000e-001 1.989763e+000 2.701867e+000
+      vertex 1.482020e+001 1.561400e+000 2.401924e+000
+      vertex 1.482020e+001 1.989763e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -4.605605e-016 -7.071068e-001 7.071068e-001
+    outer loop
+      vertex -1.798000e-001 2.359533e+000 3.071637e+000
+      vertex 1.482020e+001 1.989763e+000 2.701867e+000
+      vertex 1.482020e+001 2.359533e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal -4.955515e-016 -8.191520e-001 5.735764e-001
+    outer loop
+      vertex -1.798000e-001 2.659476e+000 3.500000e+000
+      vertex 1.482020e+001 2.359533e+000 3.071637e+000
+      vertex 1.482020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal -4.562199e-016 -9.063078e-001 4.226183e-001
+    outer loop
+      vertex -1.798000e-001 2.880478e+000 3.973940e+000
+      vertex 1.482020e+001 2.659476e+000 3.500000e+000
+      vertex 1.482020e+001 2.880478e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -4.815345e-016 -9.659258e-001 2.588190e-001
+    outer loop
+      vertex -1.798000e-001 3.015823e+000 4.479055e+000
+      vertex 1.482020e+001 2.880478e+000 3.973940e+000
+      vertex 1.482020e+001 3.015823e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal -4.851017e-016 -9.961947e-001 8.715574e-002
+    outer loop
+      vertex -1.798000e-001 3.061400e+000 5.000000e+000
+      vertex 1.482020e+001 3.015823e+000 4.479055e+000
+      vertex 1.482020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.933374e-016 -9.961947e-001 -8.715574e-002
+    outer loop
+      vertex -1.798000e-001 3.015823e+000 5.520945e+000
+      vertex 1.482020e+001 3.061400e+000 5.000000e+000
+      vertex 1.482020e+001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -5.234721e-016 -9.659258e-001 -2.588190e-001
+    outer loop
+      vertex -1.798000e-001 2.880478e+000 6.026060e+000
+      vertex 1.482020e+001 3.015823e+000 5.520945e+000
+      vertex 1.482020e+001 2.880478e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -4.684391e-016 -9.063078e-001 -4.226183e-001
+    outer loop
+      vertex -1.798000e-001 2.659476e+000 6.500000e+000
+      vertex 1.482020e+001 2.880478e+000 6.026060e+000
+      vertex 1.482020e+001 2.659476e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal -5.134128e-016 -8.191520e-001 -5.735764e-001
+    outer loop
+      vertex -1.798000e-001 2.359533e+000 6.928363e+000
+      vertex 1.482020e+001 2.659476e+000 6.500000e+000
+      vertex 1.482020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal -5.128969e-016 -7.071068e-001 -7.071068e-001
+    outer loop
+      vertex -1.798000e-001 1.989763e+000 7.298133e+000
+      vertex 1.482020e+001 2.359533e+000 6.928363e+000
+      vertex 1.482020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -4.543185e-016 -5.735764e-001 -8.191520e-001
+    outer loop
+      vertex -1.798000e-001 1.561400e+000 7.598076e+000
+      vertex 1.482020e+001 1.989763e+000 7.298133e+000
+      vertex 1.482020e+001 1.561400e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -5.223961e-016 -4.226183e-001 -9.063078e-001
+    outer loop
+      vertex -1.798000e-001 1.087460e+000 7.819078e+000
+      vertex 1.482020e+001 1.561400e+000 7.598076e+000
+      vertex 1.482020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal -4.529374e-016 -2.588190e-001 -9.659258e-001
+    outer loop
+      vertex -1.798000e-001 5.823445e-001 7.954423e+000
+      vertex 1.482020e+001 1.087460e+000 7.819078e+000
+      vertex 1.482020e+001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -4.799411e-016 -8.715574e-002 -9.961947e-001
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 8.000000e+000
+      vertex 1.482020e+001 5.823445e-001 7.954423e+000
+      vertex 1.482020e+001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal -5.189602e-016 8.715574e-002 -9.961947e-001
+    outer loop
+      vertex -1.798000e-001 -4.595445e-001 7.954423e+000
+      vertex 1.482020e+001 6.140000e-002 8.000000e+000
+      vertex 1.482020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -4.739404e-016 2.588190e-001 -9.659258e-001
+    outer loop
+      vertex -1.798000e-001 -9.646604e-001 7.819078e+000
+      vertex 1.482020e+001 -4.595445e-001 7.954423e+000
+      vertex 1.482020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal -5.015272e-016 4.226183e-001 -9.063078e-001
+    outer loop
+      vertex -1.798000e-001 -1.438600e+000 7.598076e+000
+      vertex 1.482020e+001 -9.646604e-001 7.819078e+000
+      vertex 1.482020e+001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -4.479280e-016 5.735764e-001 -8.191520e-001
+    outer loop
+      vertex -1.798000e-001 -1.866963e+000 7.298133e+000
+      vertex 1.482020e+001 -1.438600e+000 7.598076e+000
+      vertex 1.482020e+001 -1.866963e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -4.605605e-016 7.071068e-001 -7.071068e-001
+    outer loop
+      vertex -1.798000e-001 -2.236733e+000 6.928363e+000
+      vertex 1.482020e+001 -1.866963e+000 7.298133e+000
+      vertex 1.482020e+001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal -4.955515e-016 8.191520e-001 -5.735764e-001
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 6.500000e+000
+      vertex 1.482020e+001 -2.236733e+000 6.928363e+000
+      vertex 1.482020e+001 -2.536676e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal -4.562199e-016 9.063078e-001 -4.226183e-001
+    outer loop
+      vertex -1.798000e-001 -2.757678e+000 6.026060e+000
+      vertex 1.482020e+001 -2.536676e+000 6.500000e+000
+      vertex 1.482020e+001 -2.757678e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -5.101317e-016 9.659258e-001 -2.588190e-001
+    outer loop
+      vertex -1.798000e-001 -2.893023e+000 5.520945e+000
+      vertex 1.482020e+001 -2.757678e+000 6.026060e+000
+      vertex 1.482020e+001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 5.236890e-016 9.659258e-001 -2.588190e-001
+    outer loop
+      vertex -1.798000e-001 -2.893023e+000 5.520945e+000
+      vertex -1.798000e-001 -2.757678e+000 6.026060e+000
+      vertex 1.482020e+001 -2.757678e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal 4.688432e-016 9.063078e-001 -4.226183e-001
+    outer loop
+      vertex -1.798000e-001 -2.757678e+000 6.026060e+000
+      vertex -1.798000e-001 -2.536676e+000 6.500000e+000
+      vertex 1.482020e+001 -2.536676e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal 5.130737e-016 8.191520e-001 -5.735764e-001
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 6.500000e+000
+      vertex -1.798000e-001 -2.236733e+000 6.928363e+000
+      vertex 1.482020e+001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 5.236890e-016 7.071068e-001 -7.071068e-001
+    outer loop
+      vertex -1.798000e-001 -2.236733e+000 6.928363e+000
+      vertex -1.798000e-001 -1.866963e+000 7.298133e+000
+      vertex 1.482020e+001 -1.866963e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal 4.635355e-016 5.735764e-001 -8.191520e-001
+    outer loop
+      vertex -1.798000e-001 -1.866963e+000 7.298133e+000
+      vertex -1.798000e-001 -1.438600e+000 7.598076e+000
+      vertex 1.482020e+001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal 4.971507e-016 4.226183e-001 -9.063078e-001
+    outer loop
+      vertex -1.798000e-001 -1.438600e+000 7.598076e+000
+      vertex -1.798000e-001 -9.646604e-001 7.819078e+000
+      vertex 1.482020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal 4.635355e-016 2.588190e-001 -9.659258e-001
+    outer loop
+      vertex -1.798000e-001 -9.646604e-001 7.819078e+000
+      vertex -1.798000e-001 -4.595445e-001 7.954423e+000
+      vertex 1.482020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 4.799008e-016 8.715574e-002 -9.961947e-001
+    outer loop
+      vertex -1.798000e-001 -4.595445e-001 7.954423e+000
+      vertex -1.798000e-001 6.140000e-002 8.000000e+000
+      vertex 1.482020e+001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal 5.228044e-016 -8.715574e-002 -9.961947e-001
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 8.000000e+000
+      vertex -1.798000e-001 5.823445e-001 7.954423e+000
+      vertex 1.482020e+001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 4.582279e-016 -2.588190e-001 -9.659258e-001
+    outer loop
+      vertex -1.798000e-001 5.823445e-001 7.954423e+000
+      vertex -1.798000e-001 1.087460e+000 7.819078e+000
+      vertex 1.482020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal 5.077660e-016 -4.226183e-001 -9.063078e-001
+    outer loop
+      vertex -1.798000e-001 1.087460e+000 7.819078e+000
+      vertex -1.798000e-001 1.561400e+000 7.598076e+000
+      vertex 1.482020e+001 1.561400e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal 4.564586e-016 -5.735764e-001 -8.191520e-001
+    outer loop
+      vertex -1.798000e-001 1.561400e+000 7.598076e+000
+      vertex -1.798000e-001 1.989763e+000 7.298133e+000
+      vertex 1.482020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal 4.599971e-016 -7.071068e-001 -7.071068e-001
+    outer loop
+      vertex -1.798000e-001 1.989763e+000 7.298133e+000
+      vertex -1.798000e-001 2.359533e+000 6.928363e+000
+      vertex 1.482020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 4.953815e-016 -8.191520e-001 -5.735764e-001
+    outer loop
+      vertex -1.798000e-001 2.359533e+000 6.928363e+000
+      vertex -1.798000e-001 2.659476e+000 6.500000e+000
+      vertex 1.482020e+001 2.659476e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal 4.564586e-016 -9.063078e-001 -4.226183e-001
+    outer loop
+      vertex -1.798000e-001 2.659476e+000 6.500000e+000
+      vertex -1.798000e-001 2.880478e+000 6.026060e+000
+      vertex 1.482020e+001 2.880478e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal 4.829969e-016 -9.659258e-001 -2.588190e-001
+    outer loop
+      vertex -1.798000e-001 2.880478e+000 6.026060e+000
+      vertex -1.798000e-001 3.015823e+000 5.520945e+000
+      vertex 1.482020e+001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 4.852085e-016 -9.961947e-001 -8.715574e-002
+    outer loop
+      vertex -1.798000e-001 3.015823e+000 5.520945e+000
+      vertex -1.798000e-001 3.061400e+000 5.000000e+000
+      vertex 1.482020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.936122e-016 -9.961947e-001 8.715574e-002
+    outer loop
+      vertex -1.798000e-001 3.061400e+000 5.000000e+000
+      vertex -1.798000e-001 3.015823e+000 4.479055e+000
+      vertex 1.482020e+001 3.015823e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal 5.236890e-016 -9.659258e-001 2.588190e-001
+    outer loop
+      vertex -1.798000e-001 3.015823e+000 4.479055e+000
+      vertex -1.798000e-001 2.880478e+000 3.973940e+000
+      vertex 1.482020e+001 2.880478e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal 4.670740e-016 -9.063078e-001 4.226183e-001
+    outer loop
+      vertex -1.798000e-001 2.880478e+000 3.973940e+000
+      vertex -1.798000e-001 2.659476e+000 3.500000e+000
+      vertex 1.482020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 5.130737e-016 -8.191520e-001 5.735764e-001
+    outer loop
+      vertex -1.798000e-001 2.659476e+000 3.500000e+000
+      vertex -1.798000e-001 2.359533e+000 3.071637e+000
+      vertex 1.482020e+001 2.359533e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal 4.706124e-016 -7.071068e-001 7.071068e-001
+    outer loop
+      vertex -1.798000e-001 2.359533e+000 3.071637e+000
+      vertex -1.798000e-001 1.989763e+000 2.701867e+000
+      vertex 1.482020e+001 1.989763e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 4.776893e-016 -5.735764e-001 8.191520e-001
+    outer loop
+      vertex -1.798000e-001 1.989763e+000 2.701867e+000
+      vertex -1.798000e-001 1.561400e+000 2.401924e+000
+      vertex 1.482020e+001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 4.953815e-016 -4.226183e-001 9.063078e-001
+    outer loop
+      vertex -1.798000e-001 1.561400e+000 2.401924e+000
+      vertex -1.798000e-001 1.087460e+000 2.180922e+000
+      vertex 1.482020e+001 1.087460e+000 2.180922e+000
+    endloop
+  endfacet
+  facet normal 4.812277e-016 -2.588190e-001 9.659258e-001
+    outer loop
+      vertex -1.798000e-001 1.087460e+000 2.180922e+000
+      vertex -1.798000e-001 5.823445e-001 2.045577e+000
+      vertex 1.482020e+001 5.823445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal 4.799008e-016 -8.715574e-002 9.961947e-001
+    outer loop
+      vertex -1.798000e-001 5.823445e-001 2.045577e+000
+      vertex -1.798000e-001 6.140000e-002 2.000000e+000
+      vertex 1.482020e+001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal 4.891892e-016 8.715574e-002 9.961947e-001
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 2.000000e+000
+      vertex -1.798000e-001 -4.595445e-001 2.045577e+000
+      vertex 1.482020e+001 -4.595445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal 4.741508e-016 2.588190e-001 9.659258e-001
+    outer loop
+      vertex -1.798000e-001 -4.595445e-001 2.045577e+000
+      vertex -1.798000e-001 -9.646604e-001 2.180922e+000
+      vertex 1.482020e+001 -9.646604e-001 2.180922e+000
+    endloop
+  endfacet
+  facet normal 4.759201e-016 4.226183e-001 9.063078e-001
+    outer loop
+      vertex -1.798000e-001 -9.646604e-001 2.180922e+000
+      vertex -1.798000e-001 -1.438600e+000 2.401924e+000
+      vertex 1.482020e+001 -1.438600e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 4.706124e-016 5.735764e-001 8.191520e-001
+    outer loop
+      vertex -1.798000e-001 -1.438600e+000 2.401924e+000
+      vertex -1.798000e-001 -1.866963e+000 2.701867e+000
+      vertex 1.482020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 4.599971e-016 7.071068e-001 7.071068e-001
+    outer loop
+      vertex -1.798000e-001 -1.866963e+000 2.701867e+000
+      vertex -1.798000e-001 -2.236733e+000 3.071637e+000
+      vertex 1.482020e+001 -2.236733e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal 4.812277e-016 8.191520e-001 5.735764e-001
+    outer loop
+      vertex -1.798000e-001 -2.236733e+000 3.071637e+000
+      vertex -1.798000e-001 -2.536676e+000 3.500000e+000
+      vertex 1.482020e+001 -2.536676e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 4.546894e-016 9.063078e-001 4.226183e-001
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 3.500000e+000
+      vertex -1.798000e-001 -2.757678e+000 3.973940e+000
+      vertex 1.482020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal 4.639778e-016 9.961947e-001 -8.715574e-002
+    outer loop
+      vertex 3.482020e+001 -2.938600e+000 5.000000e+000
+      vertex 3.482020e+001 -2.893023e+000 5.520945e+000
+      vertex 4.982020e+001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -2.425509e-016 9.961947e-001 -8.715574e-002
+    outer loop
+      vertex 4.982020e+001 -2.938600e+000 5.000000e+000
+      vertex 3.482020e+001 -2.938600e+000 5.000000e+000
+      vertex 4.982020e+001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 2.425509e-016 9.961947e-001 8.715574e-002
+    outer loop
+      vertex 4.982020e+001 -2.938600e+000 5.000000e+000
+      vertex 3.482020e+001 -2.893023e+000 4.479055e+000
+      vertex 3.482020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.635355e-016 9.961947e-001 8.715574e-002
+    outer loop
+      vertex 4.982020e+001 -2.938600e+000 5.000000e+000
+      vertex 4.982020e+001 -2.893023e+000 4.479055e+000
+      vertex 3.482020e+001 -2.893023e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal 5.101317e-016 9.659258e-001 2.588190e-001
+    outer loop
+      vertex 3.482020e+001 -2.893023e+000 4.479055e+000
+      vertex 4.982020e+001 -2.893023e+000 4.479055e+000
+      vertex 3.482020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -5.234721e-016 9.659258e-001 2.588190e-001
+    outer loop
+      vertex 3.482020e+001 -2.757678e+000 3.973940e+000
+      vertex 4.982020e+001 -2.893023e+000 4.479055e+000
+      vertex 4.982020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -4.809511e-016 9.063078e-001 4.226183e-001
+    outer loop
+      vertex 3.482020e+001 -2.536676e+000 3.500000e+000
+      vertex 4.982020e+001 -2.757678e+000 3.973940e+000
+      vertex 4.982020e+001 -2.536676e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal -5.134128e-016 8.191520e-001 5.735764e-001
+    outer loop
+      vertex 3.482020e+001 -2.236733e+000 3.071637e+000
+      vertex 4.982020e+001 -2.536676e+000 3.500000e+000
+      vertex 4.982020e+001 -2.236733e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal -5.024296e-016 7.071068e-001 7.071068e-001
+    outer loop
+      vertex 3.482020e+001 -1.866963e+000 2.701867e+000
+      vertex 4.982020e+001 -2.236733e+000 3.071637e+000
+      vertex 4.982020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -4.870609e-016 5.735764e-001 8.191520e-001
+    outer loop
+      vertex 3.482020e+001 -1.438600e+000 2.401924e+000
+      vertex 4.982020e+001 -1.866963e+000 2.701867e+000
+      vertex 4.982020e+001 -1.438600e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal -4.973720e-016 4.226183e-001 9.063078e-001
+    outer loop
+      vertex 3.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 4.982020e+001 -1.438600e+000 2.401924e+000
+      vertex 4.982020e+001 -9.646604e-001 2.180922e+000
+    endloop
+  endfacet
+  facet normal -4.930284e-016 2.588190e-001 9.659258e-001
+    outer loop
+      vertex 3.482020e+001 -4.595445e-001 2.045577e+000
+      vertex 4.982020e+001 -9.646604e-001 2.180922e+000
+      vertex 4.982020e+001 -4.595445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal -4.799411e-016 8.715574e-002 9.961947e-001
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 2.000000e+000
+      vertex 4.982020e+001 -4.595445e-001 2.045577e+000
+      vertex 4.982020e+001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal -4.933374e-016 -8.715574e-002 9.961947e-001
+    outer loop
+      vertex 3.482020e+001 5.823445e-001 2.045577e+000
+      vertex 4.982020e+001 6.140000e-002 2.000000e+000
+      vertex 4.982020e+001 5.823445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal -4.872123e-016 -2.588190e-001 9.659258e-001
+    outer loop
+      vertex 3.482020e+001 1.087460e+000 2.180922e+000
+      vertex 4.982020e+001 5.823445e-001 2.045577e+000
+      vertex 4.982020e+001 1.087460e+000 2.180922e+000
+    endloop
+  endfacet
+  facet normal -4.809511e-016 -4.226183e-001 9.063078e-001
+    outer loop
+      vertex 3.482020e+001 1.561400e+000 2.401924e+000
+      vertex 4.982020e+001 1.087460e+000 2.180922e+000
+      vertex 4.982020e+001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal -5.049222e-016 -5.735764e-001 8.191520e-001
+    outer loop
+      vertex 3.482020e+001 1.989763e+000 2.701867e+000
+      vertex 4.982020e+001 1.561400e+000 2.401924e+000
+      vertex 4.982020e+001 1.989763e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -4.605605e-016 -7.071068e-001 7.071068e-001
+    outer loop
+      vertex 3.482020e+001 2.359533e+000 3.071637e+000
+      vertex 4.982020e+001 1.989763e+000 2.701867e+000
+      vertex 4.982020e+001 2.359533e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal -4.955515e-016 -8.191520e-001 5.735764e-001
+    outer loop
+      vertex 3.482020e+001 2.659476e+000 3.500000e+000
+      vertex 4.982020e+001 2.359533e+000 3.071637e+000
+      vertex 4.982020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal -4.562199e-016 -9.063078e-001 4.226183e-001
+    outer loop
+      vertex 3.482020e+001 2.880478e+000 3.973940e+000
+      vertex 4.982020e+001 2.659476e+000 3.500000e+000
+      vertex 4.982020e+001 2.880478e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -4.815345e-016 -9.659258e-001 2.588190e-001
+    outer loop
+      vertex 3.482020e+001 3.015823e+000 4.479055e+000
+      vertex 4.982020e+001 2.880478e+000 3.973940e+000
+      vertex 4.982020e+001 3.015823e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal -4.851017e-016 -9.961947e-001 8.715574e-002
+    outer loop
+      vertex 3.482020e+001 3.061400e+000 5.000000e+000
+      vertex 4.982020e+001 3.015823e+000 4.479055e+000
+      vertex 4.982020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -4.933374e-016 -9.961947e-001 -8.715574e-002
+    outer loop
+      vertex 3.482020e+001 3.015823e+000 5.520945e+000
+      vertex 4.982020e+001 3.061400e+000 5.000000e+000
+      vertex 4.982020e+001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -5.234721e-016 -9.659258e-001 -2.588190e-001
+    outer loop
+      vertex 3.482020e+001 2.880478e+000 6.026060e+000
+      vertex 4.982020e+001 3.015823e+000 5.520945e+000
+      vertex 4.982020e+001 2.880478e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -4.684391e-016 -9.063078e-001 -4.226183e-001
+    outer loop
+      vertex 3.482020e+001 2.659476e+000 6.500000e+000
+      vertex 4.982020e+001 2.880478e+000 6.026060e+000
+      vertex 4.982020e+001 2.659476e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal -5.134128e-016 -8.191520e-001 -5.735764e-001
+    outer loop
+      vertex 3.482020e+001 2.359533e+000 6.928363e+000
+      vertex 4.982020e+001 2.659476e+000 6.500000e+000
+      vertex 4.982020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal -5.128969e-016 -7.071068e-001 -7.071068e-001
+    outer loop
+      vertex 3.482020e+001 1.989763e+000 7.298133e+000
+      vertex 4.982020e+001 2.359533e+000 6.928363e+000
+      vertex 4.982020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -4.543185e-016 -5.735764e-001 -8.191520e-001
+    outer loop
+      vertex 3.482020e+001 1.561400e+000 7.598076e+000
+      vertex 4.982020e+001 1.989763e+000 7.298133e+000
+      vertex 4.982020e+001 1.561400e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -5.223961e-016 -4.226183e-001 -9.063078e-001
+    outer loop
+      vertex 3.482020e+001 1.087460e+000 7.819078e+000
+      vertex 4.982020e+001 1.561400e+000 7.598076e+000
+      vertex 4.982020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal -4.529374e-016 -2.588190e-001 -9.659258e-001
+    outer loop
+      vertex 3.482020e+001 5.823445e-001 7.954423e+000
+      vertex 4.982020e+001 1.087460e+000 7.819078e+000
+      vertex 4.982020e+001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -4.799411e-016 -8.715574e-002 -9.961947e-001
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 8.000000e+000
+      vertex 4.982020e+001 5.823445e-001 7.954423e+000
+      vertex 4.982020e+001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal -5.189602e-016 8.715574e-002 -9.961947e-001
+    outer loop
+      vertex 3.482020e+001 -4.595445e-001 7.954423e+000
+      vertex 4.982020e+001 6.140000e-002 8.000000e+000
+      vertex 4.982020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -4.739404e-016 2.588190e-001 -9.659258e-001
+    outer loop
+      vertex 3.482020e+001 -9.646604e-001 7.819078e+000
+      vertex 4.982020e+001 -4.595445e-001 7.954423e+000
+      vertex 4.982020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal -5.015272e-016 4.226183e-001 -9.063078e-001
+    outer loop
+      vertex 3.482020e+001 -1.438600e+000 7.598076e+000
+      vertex 4.982020e+001 -9.646604e-001 7.819078e+000
+      vertex 4.982020e+001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -4.479280e-016 5.735764e-001 -8.191520e-001
+    outer loop
+      vertex 3.482020e+001 -1.866963e+000 7.298133e+000
+      vertex 4.982020e+001 -1.438600e+000 7.598076e+000
+      vertex 4.982020e+001 -1.866963e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -4.605605e-016 7.071068e-001 -7.071068e-001
+    outer loop
+      vertex 3.482020e+001 -2.236733e+000 6.928363e+000
+      vertex 4.982020e+001 -1.866963e+000 7.298133e+000
+      vertex 4.982020e+001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal -4.955515e-016 8.191520e-001 -5.735764e-001
+    outer loop
+      vertex 3.482020e+001 -2.536676e+000 6.500000e+000
+      vertex 4.982020e+001 -2.236733e+000 6.928363e+000
+      vertex 4.982020e+001 -2.536676e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal -4.562199e-016 9.063078e-001 -4.226183e-001
+    outer loop
+      vertex 3.482020e+001 -2.757678e+000 6.026060e+000
+      vertex 4.982020e+001 -2.536676e+000 6.500000e+000
+      vertex 4.982020e+001 -2.757678e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -5.101317e-016 9.659258e-001 -2.588190e-001
+    outer loop
+      vertex 3.482020e+001 -2.893023e+000 5.520945e+000
+      vertex 4.982020e+001 -2.757678e+000 6.026060e+000
+      vertex 4.982020e+001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 5.236890e-016 9.659258e-001 -2.588190e-001
+    outer loop
+      vertex 3.482020e+001 -2.893023e+000 5.520945e+000
+      vertex 3.482020e+001 -2.757678e+000 6.026060e+000
+      vertex 4.982020e+001 -2.757678e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal 4.688432e-016 9.063078e-001 -4.226183e-001
+    outer loop
+      vertex 3.482020e+001 -2.757678e+000 6.026060e+000
+      vertex 3.482020e+001 -2.536676e+000 6.500000e+000
+      vertex 4.982020e+001 -2.536676e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal 5.130737e-016 8.191520e-001 -5.735764e-001
+    outer loop
+      vertex 3.482020e+001 -2.536676e+000 6.500000e+000
+      vertex 3.482020e+001 -2.236733e+000 6.928363e+000
+      vertex 4.982020e+001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 5.236890e-016 7.071068e-001 -7.071068e-001
+    outer loop
+      vertex 3.482020e+001 -2.236733e+000 6.928363e+000
+      vertex 3.482020e+001 -1.866963e+000 7.298133e+000
+      vertex 4.982020e+001 -1.866963e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal 4.635355e-016 5.735764e-001 -8.191520e-001
+    outer loop
+      vertex 3.482020e+001 -1.866963e+000 7.298133e+000
+      vertex 3.482020e+001 -1.438600e+000 7.598076e+000
+      vertex 4.982020e+001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal 4.971507e-016 4.226183e-001 -9.063078e-001
+    outer loop
+      vertex 3.482020e+001 -1.438600e+000 7.598076e+000
+      vertex 3.482020e+001 -9.646604e-001 7.819078e+000
+      vertex 4.982020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal 4.635355e-016 2.588190e-001 -9.659258e-001
+    outer loop
+      vertex 3.482020e+001 -9.646604e-001 7.819078e+000
+      vertex 3.482020e+001 -4.595445e-001 7.954423e+000
+      vertex 4.982020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 4.799008e-016 8.715574e-002 -9.961947e-001
+    outer loop
+      vertex 3.482020e+001 -4.595445e-001 7.954423e+000
+      vertex 3.482020e+001 6.140000e-002 8.000000e+000
+      vertex 4.982020e+001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal 5.228044e-016 -8.715574e-002 -9.961947e-001
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 8.000000e+000
+      vertex 3.482020e+001 5.823445e-001 7.954423e+000
+      vertex 4.982020e+001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 4.582279e-016 -2.588190e-001 -9.659258e-001
+    outer loop
+      vertex 3.482020e+001 5.823445e-001 7.954423e+000
+      vertex 3.482020e+001 1.087460e+000 7.819078e+000
+      vertex 4.982020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal 5.077660e-016 -4.226183e-001 -9.063078e-001
+    outer loop
+      vertex 3.482020e+001 1.087460e+000 7.819078e+000
+      vertex 3.482020e+001 1.561400e+000 7.598076e+000
+      vertex 4.982020e+001 1.561400e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal 4.564586e-016 -5.735764e-001 -8.191520e-001
+    outer loop
+      vertex 3.482020e+001 1.561400e+000 7.598076e+000
+      vertex 3.482020e+001 1.989763e+000 7.298133e+000
+      vertex 4.982020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal 4.599971e-016 -7.071068e-001 -7.071068e-001
+    outer loop
+      vertex 3.482020e+001 1.989763e+000 7.298133e+000
+      vertex 3.482020e+001 2.359533e+000 6.928363e+000
+      vertex 4.982020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 4.953815e-016 -8.191520e-001 -5.735764e-001
+    outer loop
+      vertex 3.482020e+001 2.359533e+000 6.928363e+000
+      vertex 3.482020e+001 2.659476e+000 6.500000e+000
+      vertex 4.982020e+001 2.659476e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal 4.564586e-016 -9.063078e-001 -4.226183e-001
+    outer loop
+      vertex 3.482020e+001 2.659476e+000 6.500000e+000
+      vertex 3.482020e+001 2.880478e+000 6.026060e+000
+      vertex 4.982020e+001 2.880478e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal 4.829969e-016 -9.659258e-001 -2.588190e-001
+    outer loop
+      vertex 3.482020e+001 2.880478e+000 6.026060e+000
+      vertex 3.482020e+001 3.015823e+000 5.520945e+000
+      vertex 4.982020e+001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 4.852085e-016 -9.961947e-001 -8.715574e-002
+    outer loop
+      vertex 3.482020e+001 3.015823e+000 5.520945e+000
+      vertex 3.482020e+001 3.061400e+000 5.000000e+000
+      vertex 4.982020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 4.936122e-016 -9.961947e-001 8.715574e-002
+    outer loop
+      vertex 3.482020e+001 3.061400e+000 5.000000e+000
+      vertex 3.482020e+001 3.015823e+000 4.479055e+000
+      vertex 4.982020e+001 3.015823e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal 5.236890e-016 -9.659258e-001 2.588190e-001
+    outer loop
+      vertex 3.482020e+001 3.015823e+000 4.479055e+000
+      vertex 3.482020e+001 2.880478e+000 3.973940e+000
+      vertex 4.982020e+001 2.880478e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal 4.670740e-016 -9.063078e-001 4.226183e-001
+    outer loop
+      vertex 3.482020e+001 2.880478e+000 3.973940e+000
+      vertex 3.482020e+001 2.659476e+000 3.500000e+000
+      vertex 4.982020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 5.130737e-016 -8.191520e-001 5.735764e-001
+    outer loop
+      vertex 3.482020e+001 2.659476e+000 3.500000e+000
+      vertex 3.482020e+001 2.359533e+000 3.071637e+000
+      vertex 4.982020e+001 2.359533e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal 4.706124e-016 -7.071068e-001 7.071068e-001
+    outer loop
+      vertex 3.482020e+001 2.359533e+000 3.071637e+000
+      vertex 3.482020e+001 1.989763e+000 2.701867e+000
+      vertex 4.982020e+001 1.989763e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 4.776893e-016 -5.735764e-001 8.191520e-001
+    outer loop
+      vertex 3.482020e+001 1.989763e+000 2.701867e+000
+      vertex 3.482020e+001 1.561400e+000 2.401924e+000
+      vertex 4.982020e+001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 4.953815e-016 -4.226183e-001 9.063078e-001
+    outer loop
+      vertex 3.482020e+001 1.561400e+000 2.401924e+000
+      vertex 3.482020e+001 1.087460e+000 2.180922e+000
+      vertex 4.982020e+001 1.087460e+000 2.180922e+000
+    endloop
+  endfacet
+  facet normal 4.812277e-016 -2.588190e-001 9.659258e-001
+    outer loop
+      vertex 3.482020e+001 1.087460e+000 2.180922e+000
+      vertex 3.482020e+001 5.823445e-001 2.045577e+000
+      vertex 4.982020e+001 5.823445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal 4.799008e-016 -8.715574e-002 9.961947e-001
+    outer loop
+      vertex 3.482020e+001 5.823445e-001 2.045577e+000
+      vertex 3.482020e+001 6.140000e-002 2.000000e+000
+      vertex 4.982020e+001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal 4.891892e-016 8.715574e-002 9.961947e-001
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 2.000000e+000
+      vertex 3.482020e+001 -4.595445e-001 2.045577e+000
+      vertex 4.982020e+001 -4.595445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal 4.741508e-016 2.588190e-001 9.659258e-001
+    outer loop
+      vertex 3.482020e+001 -4.595445e-001 2.045577e+000
+      vertex 3.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 4.982020e+001 -9.646604e-001 2.180922e+000
+    endloop
+  endfacet
+  facet normal 4.759201e-016 4.226183e-001 9.063078e-001
+    outer loop
+      vertex 3.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 3.482020e+001 -1.438600e+000 2.401924e+000
+      vertex 4.982020e+001 -1.438600e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 4.706124e-016 5.735764e-001 8.191520e-001
+    outer loop
+      vertex 3.482020e+001 -1.438600e+000 2.401924e+000
+      vertex 3.482020e+001 -1.866963e+000 2.701867e+000
+      vertex 4.982020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 4.599971e-016 7.071068e-001 7.071068e-001
+    outer loop
+      vertex 3.482020e+001 -1.866963e+000 2.701867e+000
+      vertex 3.482020e+001 -2.236733e+000 3.071637e+000
+      vertex 4.982020e+001 -2.236733e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal 4.812277e-016 8.191520e-001 5.735764e-001
+    outer loop
+      vertex 3.482020e+001 -2.236733e+000 3.071637e+000
+      vertex 3.482020e+001 -2.536676e+000 3.500000e+000
+      vertex 4.982020e+001 -2.536676e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 4.546894e-016 9.063078e-001 4.226183e-001
+    outer loop
+      vertex 3.482020e+001 -2.536676e+000 3.500000e+000
+      vertex 3.482020e+001 -2.757678e+000 3.973940e+000
+      vertex 4.982020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.893023e+000 4.479055e+000
+      vertex 3.482020e+001 -4.938600e+000 5.000000e+000
+      vertex 3.482020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.893023e+000 4.479055e+000
+      vertex 3.482020e+001 -4.862639e+000 4.131759e+000
+      vertex 3.482020e+001 -4.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.893023e+000 4.479055e+000
+      vertex 3.482020e+001 -2.757678e+000 3.973940e+000
+      vertex 3.482020e+001 -4.862639e+000 4.131759e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.862639e+000 4.131759e+000
+      vertex 3.482020e+001 -2.757678e+000 3.973940e+000
+      vertex 3.482020e+001 -4.637063e+000 3.289899e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.637063e+000 3.289899e+000
+      vertex 3.482020e+001 -2.757678e+000 3.973940e+000
+      vertex 3.482020e+001 -2.536676e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.268727e+000 2.500000e+000
+      vertex 3.482020e+001 -2.536676e+000 3.500000e+000
+      vertex 3.482020e+001 -2.236733e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -3.768822e+000 1.786062e+000
+      vertex 3.482020e+001 -2.236733e+000 3.071637e+000
+      vertex 3.482020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -3.152538e+000 1.169778e+000
+      vertex 3.482020e+001 -1.866963e+000 2.701867e+000
+      vertex 3.482020e+001 -2.438600e+000 6.698730e-001
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -3.152538e+000 1.169778e+000
+      vertex 3.482020e+001 -3.768822e+000 1.786062e+000
+      vertex 3.482020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -1.866963e+000 2.701867e+000
+      vertex 3.482020e+001 -1.438600e+000 2.401924e+000
+      vertex 3.482020e+001 -2.438600e+000 6.698730e-001
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.438600e+000 6.698730e-001
+      vertex 3.482020e+001 -1.438600e+000 2.401924e+000
+      vertex 3.482020e+001 -1.648701e+000 3.015369e-001
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -1.648701e+000 3.015369e-001
+      vertex 3.482020e+001 -1.438600e+000 2.401924e+000
+      vertex 3.482020e+001 -9.646604e-001 2.180922e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -8.068409e-001 7.596123e-002
+      vertex 3.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 3.482020e+001 -4.595445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 0.000000e+000
+      vertex 3.482020e+001 -4.595445e-001 2.045577e+000
+      vertex 3.482020e+001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.823445e-001 2.045577e+000
+      vertex 3.482020e+001 6.140000e-002 0.000000e+000
+      vertex 3.482020e+001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.823445e-001 2.045577e+000
+      vertex 3.482020e+001 1.087460e+000 2.180922e+000
+      vertex 3.482020e+001 6.140000e-002 0.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 0.000000e+000
+      vertex 3.482020e+001 1.087460e+000 2.180922e+000
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 3.482020e+001 1.087460e+000 2.180922e+000
+      vertex 3.482020e+001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 1.989763e+000 2.701867e+000
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 3.482020e+001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 1.989763e+000 2.701867e+000
+      vertex 3.482020e+001 4.150665e+000 6.093379e-001
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 1.989763e+000 2.701867e+000
+      vertex 3.482020e+001 2.359533e+000 3.071637e+000
+      vertex 3.482020e+001 4.150665e+000 6.093379e-001
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 4.150665e+000 6.093379e-001
+      vertex 3.482020e+001 2.359533e+000 3.071637e+000
+      vertex 3.482020e+001 4.813319e+000 1.336768e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 4.813319e+000 1.336768e+000
+      vertex 3.482020e+001 2.359533e+000 3.071637e+000
+      vertex 3.482020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.348164e+000 2.162726e+000
+      vertex 3.482020e+001 2.659476e+000 3.500000e+000
+      vertex 3.482020e+001 2.880478e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.740815e+000 3.064995e+000
+      vertex 3.482020e+001 2.880478e+000 3.973940e+000
+      vertex 3.482020e+001 3.015823e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.061400e+000 5.000000e+000
+      vertex 3.482020e+001 3.015823e+000 4.479055e+000
+      vertex 3.482020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.015823e+000 5.520945e+000
+      vertex 3.482020e+001 5.061400e+000 5.000000e+000
+      vertex 3.482020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.015823e+000 5.520945e+000
+      vertex 3.482020e+001 4.985439e+000 5.868241e+000
+      vertex 3.482020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.015823e+000 5.520945e+000
+      vertex 3.482020e+001 2.880478e+000 6.026060e+000
+      vertex 3.482020e+001 4.985439e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 4.985439e+000 5.868241e+000
+      vertex 3.482020e+001 2.880478e+000 6.026060e+000
+      vertex 3.482020e+001 4.759863e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 4.759863e+000 6.710101e+000
+      vertex 3.482020e+001 2.880478e+000 6.026060e+000
+      vertex 3.482020e+001 2.659476e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 4.391527e+000 7.500000e+000
+      vertex 3.482020e+001 2.659476e+000 6.500000e+000
+      vertex 3.482020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.891622e+000 8.213938e+000
+      vertex 3.482020e+001 2.359533e+000 6.928363e+000
+      vertex 3.482020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.275338e+000 8.830222e+000
+      vertex 3.482020e+001 1.989763e+000 7.298133e+000
+      vertex 3.482020e+001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.275338e+000 8.830222e+000
+      vertex 3.482020e+001 3.891622e+000 8.213938e+000
+      vertex 3.482020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 1.989763e+000 7.298133e+000
+      vertex 3.482020e+001 1.561400e+000 7.598076e+000
+      vertex 3.482020e+001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 2.561400e+000 9.330127e+000
+      vertex 3.482020e+001 1.561400e+000 7.598076e+000
+      vertex 3.482020e+001 1.771501e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 1.771501e+000 9.698463e+000
+      vertex 3.482020e+001 1.561400e+000 7.598076e+000
+      vertex 3.482020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 9.296409e-001 9.924039e+000
+      vertex 3.482020e+001 1.087460e+000 7.819078e+000
+      vertex 3.482020e+001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 1.000000e+001
+      vertex 3.482020e+001 5.823445e-001 7.954423e+000
+      vertex 3.482020e+001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -8.068409e-001 9.924039e+000
+      vertex 3.482020e+001 6.140000e-002 8.000000e+000
+      vertex 3.482020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -1.648701e+000 9.698463e+000
+      vertex 3.482020e+001 -4.595445e-001 7.954423e+000
+      vertex 3.482020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.438600e+000 9.330127e+000
+      vertex 3.482020e+001 -9.646604e-001 7.819078e+000
+      vertex 3.482020e+001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -3.152538e+000 8.830222e+000
+      vertex 3.482020e+001 -1.438600e+000 7.598076e+000
+      vertex 3.482020e+001 -1.866963e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.236733e+000 6.928363e+000
+      vertex 3.482020e+001 -3.152538e+000 8.830222e+000
+      vertex 3.482020e+001 -1.866963e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.236733e+000 6.928363e+000
+      vertex 3.482020e+001 -3.768822e+000 8.213938e+000
+      vertex 3.482020e+001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.236733e+000 6.928363e+000
+      vertex 3.482020e+001 -2.536676e+000 6.500000e+000
+      vertex 3.482020e+001 -3.768822e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -3.768822e+000 8.213938e+000
+      vertex 3.482020e+001 -2.536676e+000 6.500000e+000
+      vertex 3.482020e+001 -4.268727e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.268727e+000 7.500000e+000
+      vertex 3.482020e+001 -2.536676e+000 6.500000e+000
+      vertex 3.482020e+001 -2.757678e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.637063e+000 6.710101e+000
+      vertex 3.482020e+001 -2.757678e+000 6.026060e+000
+      vertex 3.482020e+001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.862639e+000 5.868241e+000
+      vertex 3.482020e+001 -2.893023e+000 5.520945e+000
+      vertex 3.482020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.938600e+000 5.000000e+000
+      vertex 3.482020e+001 -4.862639e+000 5.868241e+000
+      vertex 3.482020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.061400e+000 5.000000e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 3.482020e+001 5.980711e+000 4.019309e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.740815e+000 3.064995e+000
+      vertex 3.482020e+001 5.061400e+000 5.000000e+000
+      vertex 3.482020e+001 5.980711e+000 4.019309e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.740815e+000 3.064995e+000
+      vertex 3.482020e+001 3.015823e+000 4.479055e+000
+      vertex 3.482020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.740815e+000 3.064995e+000
+      vertex 3.482020e+001 5.348164e+000 2.162726e+000
+      vertex 3.482020e+001 2.880478e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 5.348164e+000 2.162726e+000
+      vertex 3.482020e+001 4.813319e+000 1.336768e+000
+      vertex 3.482020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 0.000000e+000
+      vertex 3.482020e+001 -8.068409e-001 7.596123e-002
+      vertex 3.482020e+001 -4.595445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -1.648701e+000 3.015369e-001
+      vertex 3.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 3.482020e+001 -8.068409e-001 7.596123e-002
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -3.768822e+000 1.786062e+000
+      vertex 3.482020e+001 -4.268727e+000 2.500000e+000
+      vertex 3.482020e+001 -2.236733e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.268727e+000 2.500000e+000
+      vertex 3.482020e+001 -4.637063e+000 3.289899e+000
+      vertex 3.482020e+001 -2.536676e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.862639e+000 5.868241e+000
+      vertex 3.482020e+001 -4.637063e+000 6.710101e+000
+      vertex 3.482020e+001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -4.637063e+000 6.710101e+000
+      vertex 3.482020e+001 -4.268727e+000 7.500000e+000
+      vertex 3.482020e+001 -2.757678e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -3.152538e+000 8.830222e+000
+      vertex 3.482020e+001 -2.438600e+000 9.330127e+000
+      vertex 3.482020e+001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -2.438600e+000 9.330127e+000
+      vertex 3.482020e+001 -1.648701e+000 9.698463e+000
+      vertex 3.482020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 -1.648701e+000 9.698463e+000
+      vertex 3.482020e+001 -8.068409e-001 9.924039e+000
+      vertex 3.482020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 1.000000e+001
+      vertex 3.482020e+001 6.140000e-002 8.000000e+000
+      vertex 3.482020e+001 -8.068409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 9.296409e-001 9.924039e+000
+      vertex 3.482020e+001 5.823445e-001 7.954423e+000
+      vertex 3.482020e+001 6.140000e-002 1.000000e+001
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 1.771501e+000 9.698463e+000
+      vertex 3.482020e+001 1.087460e+000 7.819078e+000
+      vertex 3.482020e+001 9.296409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 2.359533e+000 6.928363e+000
+      vertex 3.482020e+001 3.891622e+000 8.213938e+000
+      vertex 3.482020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 3.482020e+001 4.759863e+000 6.710101e+000
+      vertex 3.482020e+001 2.659476e+000 6.500000e+000
+      vertex 3.482020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.966323e-001 8.200039e-002
+    outer loop
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex 1.482020e+001 5.980711e+000 4.019309e+000
+    endloop
+  endfacet
+  facet normal -4.306895e-017 -9.698266e-001 2.437957e-001
+    outer loop
+      vertex 3.482020e+001 5.980711e+000 4.019309e+000
+      vertex 1.482020e+001 5.980711e+000 4.019309e+000
+      vertex 3.482020e+001 5.740815e+000 3.064995e+000
+    endloop
+  endfacet
+  facet normal -4.425936e-017 -9.966323e-001 8.200039e-002
+    outer loop
+      vertex 3.482020e+001 5.980711e+000 4.019309e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 1.482020e+001 5.980711e+000 4.019309e+000
+    endloop
+  endfacet
+  facet normal 1.692405e-017 -9.698266e-001 2.437957e-001
+    outer loop
+      vertex 1.482020e+001 5.980711e+000 4.019309e+000
+      vertex 1.482020e+001 5.740815e+000 3.064995e+000
+      vertex 3.482020e+001 5.740815e+000 3.064995e+000
+    endloop
+  endfacet
+  facet normal -3.581497e-018 -9.169362e-001 3.990338e-001
+    outer loop
+      vertex 3.482020e+001 5.740815e+000 3.064995e+000
+      vertex 1.482020e+001 5.740815e+000 3.064995e+000
+      vertex 3.482020e+001 5.348164e+000 2.162726e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.169362e-001 3.990338e-001
+    outer loop
+      vertex 3.482020e+001 5.348164e+000 2.162726e+000
+      vertex 1.482020e+001 5.740815e+000 3.064995e+000
+      vertex 1.482020e+001 5.348164e+000 2.162726e+000
+    endloop
+  endfacet
+  facet normal 1.313813e-017 -8.393837e-001 5.435393e-001
+    outer loop
+      vertex 3.482020e+001 4.813319e+000 1.336768e+000
+      vertex 1.482020e+001 5.348164e+000 2.162726e+000
+      vertex 1.482020e+001 4.813319e+000 1.336768e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -7.392549e-001 6.734257e-001
+    outer loop
+      vertex 3.482020e+001 4.150665e+000 6.093379e-001
+      vertex 1.482020e+001 4.813319e+000 1.336768e+000
+      vertex 1.482020e+001 4.150665e+000 6.093379e-001
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -6.192429e-001 7.851995e-001
+    outer loop
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 1.482020e+001 4.150665e+000 6.093379e-001
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -6.192429e-001 7.851995e-001
+    outer loop
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 3.482020e+001 4.150665e+000 6.093379e-001
+      vertex 1.482020e+001 4.150665e+000 6.093379e-001
+    endloop
+  endfacet
+  facet normal 2.820675e-018 -7.392549e-001 6.734257e-001
+    outer loop
+      vertex 3.482020e+001 4.150665e+000 6.093379e-001
+      vertex 3.482020e+001 4.813319e+000 1.336768e+000
+      vertex 1.482020e+001 4.813319e+000 1.336768e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.393837e-001 5.435393e-001
+    outer loop
+      vertex 3.482020e+001 4.813319e+000 1.336768e+000
+      vertex 3.482020e+001 5.348164e+000 2.162726e+000
+      vertex 1.482020e+001 5.348164e+000 2.162726e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -2.893023e+000 5.520945e+000
+      vertex 1.482020e+001 -4.862639e+000 5.868241e+000
+      vertex 1.482020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -2.893023e+000 5.520945e+000
+      vertex 1.482020e+001 -4.637063e+000 6.710101e+000
+      vertex 1.482020e+001 -4.862639e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -2.893023e+000 5.520945e+000
+      vertex 1.482020e+001 -2.757678e+000 6.026060e+000
+      vertex 1.482020e+001 -4.637063e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.637063e+000 6.710101e+000
+      vertex 1.482020e+001 -2.757678e+000 6.026060e+000
+      vertex 1.482020e+001 -4.268727e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.268727e+000 7.500000e+000
+      vertex 1.482020e+001 -2.757678e+000 6.026060e+000
+      vertex 1.482020e+001 -2.536676e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -3.768822e+000 8.213938e+000
+      vertex 1.482020e+001 -2.536676e+000 6.500000e+000
+      vertex 1.482020e+001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -1.866963e+000 7.298133e+000
+      vertex 1.482020e+001 -3.768822e+000 8.213938e+000
+      vertex 1.482020e+001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -1.866963e+000 7.298133e+000
+      vertex 1.482020e+001 -3.152538e+000 8.830222e+000
+      vertex 1.482020e+001 -3.768822e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -1.866963e+000 7.298133e+000
+      vertex 1.482020e+001 -1.438600e+000 7.598076e+000
+      vertex 1.482020e+001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -3.152538e+000 8.830222e+000
+      vertex 1.482020e+001 -1.438600e+000 7.598076e+000
+      vertex 1.482020e+001 -2.438600e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -2.438600e+000 9.330127e+000
+      vertex 1.482020e+001 -1.438600e+000 7.598076e+000
+      vertex 1.482020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -1.648701e+000 9.698463e+000
+      vertex 1.482020e+001 -9.646604e-001 7.819078e+000
+      vertex 1.482020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -8.068409e-001 9.924039e+000
+      vertex 1.482020e+001 -4.595445e-001 7.954423e+000
+      vertex 1.482020e+001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 6.140000e-002 1.000000e+001
+      vertex 1.482020e+001 6.140000e-002 8.000000e+000
+      vertex 1.482020e+001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 9.296409e-001 9.924039e+000
+      vertex 1.482020e+001 5.823445e-001 7.954423e+000
+      vertex 1.482020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 1.771501e+000 9.698463e+000
+      vertex 1.482020e+001 1.087460e+000 7.819078e+000
+      vertex 1.482020e+001 1.561400e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 2.561400e+000 9.330127e+000
+      vertex 1.482020e+001 1.561400e+000 7.598076e+000
+      vertex 1.482020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.275338e+000 8.830222e+000
+      vertex 1.482020e+001 1.989763e+000 7.298133e+000
+      vertex 1.482020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.891622e+000 8.213938e+000
+      vertex 1.482020e+001 2.359533e+000 6.928363e+000
+      vertex 1.482020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.891622e+000 8.213938e+000
+      vertex 1.482020e+001 3.275338e+000 8.830222e+000
+      vertex 1.482020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 2.659476e+000 6.500000e+000
+      vertex 1.482020e+001 4.391527e+000 7.500000e+000
+      vertex 1.482020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 2.659476e+000 6.500000e+000
+      vertex 1.482020e+001 4.759863e+000 6.710101e+000
+      vertex 1.482020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 2.659476e+000 6.500000e+000
+      vertex 1.482020e+001 2.880478e+000 6.026060e+000
+      vertex 1.482020e+001 4.759863e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 4.759863e+000 6.710101e+000
+      vertex 1.482020e+001 2.880478e+000 6.026060e+000
+      vertex 1.482020e+001 4.985439e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 4.985439e+000 5.868241e+000
+      vertex 1.482020e+001 2.880478e+000 6.026060e+000
+      vertex 1.482020e+001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+      vertex 1.482020e+001 3.015823e+000 5.520945e+000
+      vertex 1.482020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.015823e+000 4.479055e+000
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+      vertex 1.482020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.015823e+000 4.479055e+000
+      vertex 1.482020e+001 5.740815e+000 3.064995e+000
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.015823e+000 4.479055e+000
+      vertex 1.482020e+001 2.880478e+000 3.973940e+000
+      vertex 1.482020e+001 5.740815e+000 3.064995e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 5.740815e+000 3.064995e+000
+      vertex 1.482020e+001 2.880478e+000 3.973940e+000
+      vertex 1.482020e+001 5.348164e+000 2.162726e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 5.348164e+000 2.162726e+000
+      vertex 1.482020e+001 2.880478e+000 3.973940e+000
+      vertex 1.482020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 4.813319e+000 1.336768e+000
+      vertex 1.482020e+001 2.659476e+000 3.500000e+000
+      vertex 1.482020e+001 2.359533e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 4.150665e+000 6.093379e-001
+      vertex 1.482020e+001 2.359533e+000 3.071637e+000
+      vertex 1.482020e+001 1.989763e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 1.482020e+001 1.989763e+000 2.701867e+000
+      vertex 1.482020e+001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 1.087460e+000 2.180922e+000
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 1.482020e+001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 1.087460e+000 2.180922e+000
+      vertex 1.482020e+001 6.140000e-002 0.000000e+000
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 1.087460e+000 2.180922e+000
+      vertex 1.482020e+001 5.823445e-001 2.045577e+000
+      vertex 1.482020e+001 6.140000e-002 0.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 6.140000e-002 0.000000e+000
+      vertex 1.482020e+001 5.823445e-001 2.045577e+000
+      vertex 1.482020e+001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.595445e-001 2.045577e+000
+      vertex 1.482020e+001 6.140000e-002 0.000000e+000
+      vertex 1.482020e+001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.595445e-001 2.045577e+000
+      vertex 1.482020e+001 -8.068409e-001 7.596123e-002
+      vertex 1.482020e+001 6.140000e-002 0.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.595445e-001 2.045577e+000
+      vertex 1.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 1.482020e+001 -8.068409e-001 7.596123e-002
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -8.068409e-001 7.596123e-002
+      vertex 1.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 1.482020e+001 -1.648701e+000 3.015369e-001
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -1.648701e+000 3.015369e-001
+      vertex 1.482020e+001 -9.646604e-001 2.180922e+000
+      vertex 1.482020e+001 -1.438600e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -2.438600e+000 6.698730e-001
+      vertex 1.482020e+001 -1.438600e+000 2.401924e+000
+      vertex 1.482020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -3.152538e+000 1.169778e+000
+      vertex 1.482020e+001 -1.866963e+000 2.701867e+000
+      vertex 1.482020e+001 -2.236733e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -3.768822e+000 1.786062e+000
+      vertex 1.482020e+001 -2.236733e+000 3.071637e+000
+      vertex 1.482020e+001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -3.768822e+000 1.786062e+000
+      vertex 1.482020e+001 -3.152538e+000 1.169778e+000
+      vertex 1.482020e+001 -2.236733e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -2.236733e+000 3.071637e+000
+      vertex 1.482020e+001 -2.536676e+000 3.500000e+000
+      vertex 1.482020e+001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.268727e+000 2.500000e+000
+      vertex 1.482020e+001 -2.536676e+000 3.500000e+000
+      vertex 1.482020e+001 -4.637063e+000 3.289899e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.637063e+000 3.289899e+000
+      vertex 1.482020e+001 -2.536676e+000 3.500000e+000
+      vertex 1.482020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.862639e+000 4.131759e+000
+      vertex 1.482020e+001 -2.757678e+000 3.973940e+000
+      vertex 1.482020e+001 -2.893023e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.938600e+000 5.000000e+000
+      vertex 1.482020e+001 -2.893023e+000 4.479055e+000
+      vertex 1.482020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.862639e+000 5.868241e+000
+      vertex 1.482020e+001 -4.938600e+000 5.000000e+000
+      vertex 1.482020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+      vertex 1.482020e+001 5.980711e+000 4.019309e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 5.980711e+000 4.019309e+000
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+      vertex 1.482020e+001 5.740815e+000 3.064995e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+      vertex 1.482020e+001 4.985439e+000 5.868241e+000
+      vertex 1.482020e+001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 2.561400e+000 9.330127e+000
+      vertex 1.482020e+001 1.989763e+000 7.298133e+000
+      vertex 1.482020e+001 3.275338e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 2.561400e+000 9.330127e+000
+      vertex 1.482020e+001 1.771501e+000 9.698463e+000
+      vertex 1.482020e+001 1.561400e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 1.771501e+000 9.698463e+000
+      vertex 1.482020e+001 9.296409e-001 9.924039e+000
+      vertex 1.482020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 6.140000e-002 1.000000e+001
+      vertex 1.482020e+001 5.823445e-001 7.954423e+000
+      vertex 1.482020e+001 9.296409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -8.068409e-001 9.924039e+000
+      vertex 1.482020e+001 6.140000e-002 8.000000e+000
+      vertex 1.482020e+001 6.140000e-002 1.000000e+001
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -8.068409e-001 9.924039e+000
+      vertex 1.482020e+001 -1.648701e+000 9.698463e+000
+      vertex 1.482020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -1.648701e+000 9.698463e+000
+      vertex 1.482020e+001 -2.438600e+000 9.330127e+000
+      vertex 1.482020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -3.768822e+000 8.213938e+000
+      vertex 1.482020e+001 -4.268727e+000 7.500000e+000
+      vertex 1.482020e+001 -2.536676e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.938600e+000 5.000000e+000
+      vertex 1.482020e+001 -4.862639e+000 4.131759e+000
+      vertex 1.482020e+001 -2.893023e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -4.862639e+000 4.131759e+000
+      vertex 1.482020e+001 -4.637063e+000 3.289899e+000
+      vertex 1.482020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -2.438600e+000 6.698730e-001
+      vertex 1.482020e+001 -1.866963e+000 2.701867e+000
+      vertex 1.482020e+001 -3.152538e+000 1.169778e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 -2.438600e+000 6.698730e-001
+      vertex 1.482020e+001 -1.648701e+000 3.015369e-001
+      vertex 1.482020e+001 -1.438600e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 1.482020e+001 4.150665e+000 6.093379e-001
+      vertex 1.482020e+001 1.989763e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 4.150665e+000 6.093379e-001
+      vertex 1.482020e+001 4.813319e+000 1.336768e+000
+      vertex 1.482020e+001 2.359533e+000 3.071637e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 1.482020e+001 4.813319e+000 1.336768e+000
+      vertex 1.482020e+001 5.348164e+000 2.162726e+000
+      vertex 1.482020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.832020e+001 1.706140e+001 5.000000e+000
+      vertex 3.837337e+001 1.766917e+001 5.000000e+000
+      vertex 2.657020e+001 1.609249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.706996e+001 1.574256e+001 5.000000e+000
+      vertex 3.832020e+001 1.706140e+001 5.000000e+000
+      vertex 2.657020e+001 1.609249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.706996e+001 1.574256e+001 5.000000e+000
+      vertex 3.837337e+001 1.645363e+001 5.000000e+000
+      vertex 3.832020e+001 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.706996e+001 1.574256e+001 5.000000e+000
+      vertex 2.750136e+001 1.531116e+001 5.000000e+000
+      vertex 3.837337e+001 1.645363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.837337e+001 1.645363e+001 5.000000e+000
+      vertex 2.750136e+001 1.531116e+001 5.000000e+000
+      vertex 3.853128e+001 1.586433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.853128e+001 1.586433e+001 5.000000e+000
+      vertex 2.750136e+001 1.531116e+001 5.000000e+000
+      vertex 2.785129e+001 1.481140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.878911e+001 1.531140e+001 5.000000e+000
+      vertex 2.785129e+001 1.481140e+001 5.000000e+000
+      vertex 2.810912e+001 1.425847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.913904e+001 1.481164e+001 5.000000e+000
+      vertex 2.810912e+001 1.425847e+001 5.000000e+000
+      vertex 2.826703e+001 1.366917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.957044e+001 1.438024e+001 5.000000e+000
+      vertex 2.826703e+001 1.366917e+001 5.000000e+000
+      vertex 2.832020e+001 1.306140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.007020e+001 1.403031e+001 5.000000e+000
+      vertex 2.832020e+001 1.306140e+001 5.000000e+000
+      vertex 2.826703e+001 1.245363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.062313e+001 1.377248e+001 5.000000e+000
+      vertex 2.826703e+001 1.245363e+001 5.000000e+000
+      vertex 2.810912e+001 1.186433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.785129e+001 1.131140e+001 5.000000e+000
+      vertex 4.062313e+001 1.377248e+001 5.000000e+000
+      vertex 2.810912e+001 1.186433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.785129e+001 1.131140e+001 5.000000e+000
+      vertex 4.121243e+001 1.361457e+001 5.000000e+000
+      vertex 4.062313e+001 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.785129e+001 1.131140e+001 5.000000e+000
+      vertex 2.750136e+001 1.081164e+001 5.000000e+000
+      vertex 4.121243e+001 1.361457e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.121243e+001 1.361457e+001 5.000000e+000
+      vertex 2.750136e+001 1.081164e+001 5.000000e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.182020e+001 1.356140e+001 5.000000e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.242797e+001 1.361457e+001 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.301727e+001 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.242797e+001 1.361457e+001 5.000000e+000
+      vertex 4.182020e+001 1.356140e+001 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.837337e+001 1.766917e+001 5.000000e+000
+      vertex 3.853128e+001 1.825847e+001 5.000000e+000
+      vertex 2.601727e+001 1.635032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.657020e+001 1.609249e+001 5.000000e+000
+      vertex 3.837337e+001 1.766917e+001 5.000000e+000
+      vertex 2.601727e+001 1.635032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.878911e+001 1.881140e+001 5.000000e+000
+      vertex 2.601727e+001 1.635032e+001 5.000000e+000
+      vertex 3.853128e+001 1.825847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.878911e+001 1.881140e+001 5.000000e+000
+      vertex 2.542797e+001 1.650823e+001 5.000000e+000
+      vertex 2.601727e+001 1.635032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.878911e+001 1.881140e+001 5.000000e+000
+      vertex 3.913904e+001 1.931116e+001 5.000000e+000
+      vertex 2.542797e+001 1.650823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.542797e+001 1.650823e+001 5.000000e+000
+      vertex 3.913904e+001 1.931116e+001 5.000000e+000
+      vertex 3.957044e+001 1.974256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.482020e+001 1.656140e+001 5.000000e+000
+      vertex 3.957044e+001 1.974256e+001 5.000000e+000
+      vertex 4.007020e+001 2.009249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 9.570200e+000 2.009249e+001 5.000000e+000
+      vertex 4.007020e+001 2.009249e+001 5.000000e+000
+      vertex 9.017271e+000 2.035032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 9.570200e+000 2.009249e+001 5.000000e+000
+      vertex 2.482020e+001 1.656140e+001 5.000000e+000
+      vertex 4.007020e+001 2.009249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 9.570200e+000 2.009249e+001 5.000000e+000
+      vertex 1.006996e+001 1.974256e+001 5.000000e+000
+      vertex 2.482020e+001 1.656140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.482020e+001 1.656140e+001 5.000000e+000
+      vertex 1.006996e+001 1.974256e+001 5.000000e+000
+      vertex 2.421243e+001 1.650823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.421243e+001 1.650823e+001 5.000000e+000
+      vertex 1.006996e+001 1.974256e+001 5.000000e+000
+      vertex 1.050136e+001 1.931116e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 1.085129e+001 1.881140e+001 5.000000e+000
+      vertex 2.421243e+001 1.650823e+001 5.000000e+000
+      vertex 1.050136e+001 1.931116e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 1.085129e+001 1.881140e+001 5.000000e+000
+      vertex 2.362313e+001 1.635032e+001 5.000000e+000
+      vertex 2.421243e+001 1.650823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 1.085129e+001 1.881140e+001 5.000000e+000
+      vertex 1.110912e+001 1.825847e+001 5.000000e+000
+      vertex 2.362313e+001 1.635032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.362313e+001 1.635032e+001 5.000000e+000
+      vertex 1.110912e+001 1.825847e+001 5.000000e+000
+      vertex 1.126703e+001 1.766917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.307020e+001 1.609249e+001 5.000000e+000
+      vertex 1.126703e+001 1.766917e+001 5.000000e+000
+      vertex 1.132020e+001 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.257044e+001 1.574256e+001 5.000000e+000
+      vertex 1.132020e+001 1.706140e+001 5.000000e+000
+      vertex 1.126703e+001 1.645363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.213904e+001 1.531116e+001 5.000000e+000
+      vertex 1.126703e+001 1.645363e+001 5.000000e+000
+      vertex 1.110912e+001 1.586433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.178911e+001 1.481140e+001 5.000000e+000
+      vertex 1.110912e+001 1.586433e+001 5.000000e+000
+      vertex 1.085129e+001 1.531140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.153128e+001 1.425847e+001 5.000000e+000
+      vertex 1.085129e+001 1.531140e+001 5.000000e+000
+      vertex 1.050136e+001 1.481164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.137337e+001 1.366917e+001 5.000000e+000
+      vertex 1.050136e+001 1.481164e+001 5.000000e+000
+      vertex 1.006996e+001 1.438024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.132020e+001 1.306140e+001 5.000000e+000
+      vertex 1.006996e+001 1.438024e+001 5.000000e+000
+      vertex 9.570200e+000 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.137337e+001 1.245363e+001 5.000000e+000
+      vertex 9.570200e+000 1.403031e+001 5.000000e+000
+      vertex 9.017271e+000 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.153128e+001 1.186433e+001 5.000000e+000
+      vertex 9.017271e+000 1.377248e+001 5.000000e+000
+      vertex 2.178911e+001 1.131140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.153128e+001 1.186433e+001 5.000000e+000
+      vertex 2.137337e+001 1.245363e+001 5.000000e+000
+      vertex 9.017271e+000 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.007020e+001 2.009249e+001 5.000000e+000
+      vertex 4.062313e+001 2.035032e+001 5.000000e+000
+      vertex 9.017271e+000 2.035032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 9.017271e+000 2.035032e+001 5.000000e+000
+      vertex 4.062313e+001 2.035032e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 8.427969e+000 2.050823e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 7.820200e+000 2.056140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 8.427969e+000 2.050823e+001 5.000000e+000
+      vertex 9.017271e+000 2.035032e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.121243e+001 2.050823e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.062313e+001 2.035032e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.121243e+001 2.050823e+001 5.000000e+000
+      vertex 4.182020e+001 2.056140e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.182020e+001 2.056140e+001 5.000000e+000
+      vertex 4.242797e+001 2.050823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.301727e+001 2.035032e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.242797e+001 2.050823e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.301727e+001 2.035032e+001 5.000000e+000
+      vertex 4.357020e+001 2.009249e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.357020e+001 2.009249e+001 5.000000e+000
+      vertex 4.406996e+001 1.974256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.450136e+001 1.931116e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.406996e+001 1.974256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.450136e+001 1.931116e+001 5.000000e+000
+      vertex 4.485129e+001 1.881140e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.485129e+001 1.881140e+001 5.000000e+000
+      vertex 4.510912e+001 1.825847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.526703e+001 1.766917e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.510912e+001 1.825847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.526703e+001 1.766917e+001 5.000000e+000
+      vertex 4.532020e+001 1.706140e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.532020e+001 1.706140e+001 5.000000e+000
+      vertex 4.526703e+001 1.645363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.526703e+001 1.645363e+001 5.000000e+000
+      vertex 4.510912e+001 1.586433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.485129e+001 1.531140e+001 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.510912e+001 1.586433e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.485129e+001 1.531140e+001 5.000000e+000
+      vertex 4.450136e+001 1.481164e+001 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.450136e+001 1.481164e+001 5.000000e+000
+      vertex 4.406996e+001 1.438024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.357020e+001 1.403031e+001 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.406996e+001 1.438024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.357020e+001 1.403031e+001 5.000000e+000
+      vertex 4.301727e+001 1.377248e+001 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.121243e+001 1.361457e+001 5.000000e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 4.182020e+001 1.356140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.062313e+001 1.377248e+001 5.000000e+000
+      vertex 4.007020e+001 1.403031e+001 5.000000e+000
+      vertex 2.826703e+001 1.245363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.957044e+001 1.438024e+001 5.000000e+000
+      vertex 2.832020e+001 1.306140e+001 5.000000e+000
+      vertex 4.007020e+001 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.957044e+001 1.438024e+001 5.000000e+000
+      vertex 3.913904e+001 1.481164e+001 5.000000e+000
+      vertex 2.826703e+001 1.366917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.878911e+001 1.531140e+001 5.000000e+000
+      vertex 2.810912e+001 1.425847e+001 5.000000e+000
+      vertex 3.913904e+001 1.481164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.878911e+001 1.531140e+001 5.000000e+000
+      vertex 3.853128e+001 1.586433e+001 5.000000e+000
+      vertex 2.785129e+001 1.481140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.137337e+001 1.366917e+001 5.000000e+000
+      vertex 1.006996e+001 1.438024e+001 5.000000e+000
+      vertex 2.132020e+001 1.306140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.137337e+001 1.366917e+001 5.000000e+000
+      vertex 2.153128e+001 1.425847e+001 5.000000e+000
+      vertex 1.050136e+001 1.481164e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.178911e+001 1.481140e+001 5.000000e+000
+      vertex 1.085129e+001 1.531140e+001 5.000000e+000
+      vertex 2.153128e+001 1.425847e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.213904e+001 1.531116e+001 5.000000e+000
+      vertex 1.110912e+001 1.586433e+001 5.000000e+000
+      vertex 2.178911e+001 1.481140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.213904e+001 1.531116e+001 5.000000e+000
+      vertex 2.257044e+001 1.574256e+001 5.000000e+000
+      vertex 1.126703e+001 1.645363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.257044e+001 1.574256e+001 5.000000e+000
+      vertex 2.307020e+001 1.609249e+001 5.000000e+000
+      vertex 1.132020e+001 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.307020e+001 1.609249e+001 5.000000e+000
+      vertex 2.362313e+001 1.635032e+001 5.000000e+000
+      vertex 1.126703e+001 1.766917e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.482020e+001 1.656140e+001 5.000000e+000
+      vertex 2.542797e+001 1.650823e+001 5.000000e+000
+      vertex 3.957044e+001 1.974256e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.750136e+001 1.081164e+001 5.000000e+000
+      vertex 2.706996e+001 1.038024e+001 5.000000e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 2.706996e+001 1.038024e+001 5.000000e+000
+      vertex 2.657020e+001 1.003031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.601727e+001 9.772476e+000 5.000000e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 2.657020e+001 1.003031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.601727e+001 9.772476e+000 5.000000e+000
+      vertex 2.542797e+001 9.614573e+000 5.000000e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 2.542797e+001 9.614573e+000 5.000000e+000
+      vertex 2.482020e+001 9.561400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex 2.482020e+001 9.561400e+000 5.000000e+000
+      vertex 2.421243e+001 9.614573e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.362313e+001 9.772476e+000 5.000000e+000
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex 2.421243e+001 9.614573e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.362313e+001 9.772476e+000 5.000000e+000
+      vertex 2.307020e+001 1.003031e+001 5.000000e+000
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex 2.307020e+001 1.003031e+001 5.000000e+000
+      vertex 2.257044e+001 1.038024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.213904e+001 1.081164e+001 5.000000e+000
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex 2.257044e+001 1.038024e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.213904e+001 1.081164e+001 5.000000e+000
+      vertex 8.427969e+000 1.361457e+001 5.000000e+000
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.213904e+001 1.081164e+001 5.000000e+000
+      vertex 2.178911e+001 1.131140e+001 5.000000e+000
+      vertex 8.427969e+000 1.361457e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 8.427969e+000 1.361457e+001 5.000000e+000
+      vertex 2.178911e+001 1.131140e+001 5.000000e+000
+      vertex 9.017271e+000 1.377248e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 2.132020e+001 1.306140e+001 5.000000e+000
+      vertex 9.570200e+000 1.403031e+001 5.000000e+000
+      vertex 2.137337e+001 1.245363e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.373373e+000 1.766917e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 4.320200e+000 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.373373e+000 1.766917e+001 5.000000e+000
+      vertex 4.531276e+000 1.825847e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 4.531276e+000 1.825847e+001 5.000000e+000
+      vertex 4.789111e+000 1.881140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 5.139044e+000 1.931116e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 4.789111e+000 1.881140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 5.139044e+000 1.931116e+001 5.000000e+000
+      vertex 5.570443e+000 1.974256e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 5.570443e+000 1.974256e+001 5.000000e+000
+      vertex 6.070200e+000 2.009249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 6.623129e+000 2.035032e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 6.070200e+000 2.009249e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 6.623129e+000 2.035032e+001 5.000000e+000
+      vertex 7.212431e+000 2.050823e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 7.212431e+000 2.050823e+001 5.000000e+000
+      vertex 7.820200e+000 2.056140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 8.427969e+000 1.361457e+001 5.000000e+000
+      vertex 7.820200e+000 1.356140e+001 5.000000e+000
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex 7.820200e+000 1.356140e+001 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 7.212431e+000 1.361457e+001 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex 7.820200e+000 1.356140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 7.212431e+000 1.361457e+001 5.000000e+000
+      vertex 6.623129e+000 1.377248e+001 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex 6.623129e+000 1.377248e+001 5.000000e+000
+      vertex 6.070200e+000 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 5.570443e+000 1.438024e+001 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex 6.070200e+000 1.403031e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 5.570443e+000 1.438024e+001 5.000000e+000
+      vertex 5.139044e+000 1.481164e+001 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex 5.139044e+000 1.481164e+001 5.000000e+000
+      vertex 4.789111e+000 1.531140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.531276e+000 1.586433e+001 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex 4.789111e+000 1.531140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.531276e+000 1.586433e+001 5.000000e+000
+      vertex 4.373373e+000 1.645363e+001 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex 4.373373e+000 1.645363e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 4.373373e+000 1.645363e+001 5.000000e+000
+      vertex 4.320200e+000 1.706140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 1.482020e+001 6.061400e+000 5.000000e+000
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 2.482020e+001 9.561400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.061400e+000 5.000000e+000
+      vertex 3.482020e+001 5.061400e+000 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.526703e+001 1.645363e+001 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 4.062313e+001 2.035032e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.961947e-001 8.715574e-002
+    outer loop
+      vertex 3.482020e+001 5.061400e+000 5.000000e+000
+      vertex 3.482020e+001 4.985439e+000 5.868241e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.961947e-001 8.715574e-002
+    outer loop
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 3.482020e+001 4.985439e+000 5.868241e+000
+      vertex 4.982020e+001 4.985439e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.659258e-001 2.588190e-001
+    outer loop
+      vertex 4.982020e+001 4.985439e+000 5.868241e+000
+      vertex 3.482020e+001 4.985439e+000 5.868241e+000
+      vertex 3.482020e+001 4.759863e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.063078e-001 4.226183e-001
+    outer loop
+      vertex 4.982020e+001 4.759863e+000 6.710101e+000
+      vertex 3.482020e+001 4.759863e+000 6.710101e+000
+      vertex 3.482020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 8.191520e-001 5.735764e-001
+    outer loop
+      vertex 4.982020e+001 4.391527e+000 7.500000e+000
+      vertex 3.482020e+001 4.391527e+000 7.500000e+000
+      vertex 3.482020e+001 3.891622e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 7.071068e-001 7.071068e-001
+    outer loop
+      vertex 4.982020e+001 3.891622e+000 8.213938e+000
+      vertex 3.482020e+001 3.891622e+000 8.213938e+000
+      vertex 3.482020e+001 3.275338e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 5.735764e-001 8.191520e-001
+    outer loop
+      vertex 4.982020e+001 3.275338e+000 8.830222e+000
+      vertex 3.482020e+001 3.275338e+000 8.830222e+000
+      vertex 3.482020e+001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 4.226183e-001 9.063078e-001
+    outer loop
+      vertex 4.982020e+001 2.561400e+000 9.330127e+000
+      vertex 3.482020e+001 2.561400e+000 9.330127e+000
+      vertex 3.482020e+001 1.771501e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 2.588190e-001 9.659258e-001
+    outer loop
+      vertex 4.982020e+001 1.771501e+000 9.698463e+000
+      vertex 3.482020e+001 1.771501e+000 9.698463e+000
+      vertex 3.482020e+001 9.296409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 8.715574e-002 9.961947e-001
+    outer loop
+      vertex 4.982020e+001 9.296409e-001 9.924039e+000
+      vertex 3.482020e+001 9.296409e-001 9.924039e+000
+      vertex 3.482020e+001 6.140000e-002 1.000000e+001
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.715574e-002 9.961947e-001
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 1.000000e+001
+      vertex 3.482020e+001 6.140000e-002 1.000000e+001
+      vertex 3.482020e+001 -8.068409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -2.588190e-001 9.659258e-001
+    outer loop
+      vertex 4.982020e+001 -8.068409e-001 9.924039e+000
+      vertex 3.482020e+001 -8.068409e-001 9.924039e+000
+      vertex 3.482020e+001 -1.648701e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -4.226183e-001 9.063078e-001
+    outer loop
+      vertex 4.982020e+001 -1.648701e+000 9.698463e+000
+      vertex 3.482020e+001 -1.648701e+000 9.698463e+000
+      vertex 3.482020e+001 -2.438600e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -5.735764e-001 8.191520e-001
+    outer loop
+      vertex 4.982020e+001 -2.438600e+000 9.330127e+000
+      vertex 3.482020e+001 -2.438600e+000 9.330127e+000
+      vertex 3.482020e+001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -7.071068e-001 7.071068e-001
+    outer loop
+      vertex 4.982020e+001 -3.152538e+000 8.830222e+000
+      vertex 3.482020e+001 -3.152538e+000 8.830222e+000
+      vertex 3.482020e+001 -3.768822e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.191520e-001 5.735764e-001
+    outer loop
+      vertex 4.982020e+001 -3.768822e+000 8.213938e+000
+      vertex 3.482020e+001 -3.768822e+000 8.213938e+000
+      vertex 3.482020e+001 -4.268727e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.063078e-001 4.226183e-001
+    outer loop
+      vertex 4.982020e+001 -4.268727e+000 7.500000e+000
+      vertex 3.482020e+001 -4.268727e+000 7.500000e+000
+      vertex 3.482020e+001 -4.637063e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.659258e-001 2.588190e-001
+    outer loop
+      vertex 4.982020e+001 -4.637063e+000 6.710101e+000
+      vertex 3.482020e+001 -4.637063e+000 6.710101e+000
+      vertex 3.482020e+001 -4.862639e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.961947e-001 8.715574e-002
+    outer loop
+      vertex 4.982020e+001 -4.862639e+000 5.868241e+000
+      vertex 3.482020e+001 -4.862639e+000 5.868241e+000
+      vertex 3.482020e+001 -4.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.961947e-001 -8.715574e-002
+    outer loop
+      vertex 4.982020e+001 -4.938600e+000 5.000000e+000
+      vertex 3.482020e+001 -4.938600e+000 5.000000e+000
+      vertex 3.482020e+001 -4.862639e+000 4.131759e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.659258e-001 -2.588190e-001
+    outer loop
+      vertex 4.982020e+001 -4.862639e+000 4.131759e+000
+      vertex 3.482020e+001 -4.862639e+000 4.131759e+000
+      vertex 3.482020e+001 -4.637063e+000 3.289899e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.063078e-001 -4.226183e-001
+    outer loop
+      vertex 4.982020e+001 -4.637063e+000 3.289899e+000
+      vertex 3.482020e+001 -4.637063e+000 3.289899e+000
+      vertex 3.482020e+001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.191520e-001 -5.735764e-001
+    outer loop
+      vertex 4.982020e+001 -4.268727e+000 2.500000e+000
+      vertex 3.482020e+001 -4.268727e+000 2.500000e+000
+      vertex 3.482020e+001 -3.768822e+000 1.786062e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -7.071068e-001 -7.071068e-001
+    outer loop
+      vertex 4.982020e+001 -3.768822e+000 1.786062e+000
+      vertex 3.482020e+001 -3.768822e+000 1.786062e+000
+      vertex 3.482020e+001 -3.152538e+000 1.169778e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -5.735764e-001 -8.191520e-001
+    outer loop
+      vertex 4.982020e+001 -3.152538e+000 1.169778e+000
+      vertex 3.482020e+001 -3.152538e+000 1.169778e+000
+      vertex 3.482020e+001 -2.438600e+000 6.698730e-001
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -4.226183e-001 -9.063078e-001
+    outer loop
+      vertex 4.982020e+001 -2.438600e+000 6.698730e-001
+      vertex 3.482020e+001 -2.438600e+000 6.698730e-001
+      vertex 3.482020e+001 -1.648701e+000 3.015369e-001
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -2.588190e-001 -9.659258e-001
+    outer loop
+      vertex 4.982020e+001 -1.648701e+000 3.015369e-001
+      vertex 3.482020e+001 -1.648701e+000 3.015369e-001
+      vertex 3.482020e+001 -8.068409e-001 7.596123e-002
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.715574e-002 -9.961947e-001
+    outer loop
+      vertex 4.982020e+001 -8.068409e-001 7.596123e-002
+      vertex 3.482020e+001 -8.068409e-001 7.596123e-002
+      vertex 3.482020e+001 6.140000e-002 0.000000e+000
+    endloop
+  endfacet
+  facet normal -5.124559e-017 -8.715574e-002 -9.961947e-001
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.982020e+001 -8.068409e-001 7.596123e-002
+      vertex 3.482020e+001 6.140000e-002 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -2.588190e-001 -9.659258e-001
+    outer loop
+      vertex 4.982020e+001 -8.068409e-001 7.596123e-002
+      vertex 4.982020e+001 -1.648701e+000 3.015369e-001
+      vertex 3.482020e+001 -8.068409e-001 7.596123e-002
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -4.226183e-001 -9.063078e-001
+    outer loop
+      vertex 4.982020e+001 -1.648701e+000 3.015369e-001
+      vertex 4.982020e+001 -2.438600e+000 6.698730e-001
+      vertex 3.482020e+001 -1.648701e+000 3.015369e-001
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -5.735764e-001 -8.191520e-001
+    outer loop
+      vertex 4.982020e+001 -2.438600e+000 6.698730e-001
+      vertex 4.982020e+001 -3.152538e+000 1.169778e+000
+      vertex 3.482020e+001 -2.438600e+000 6.698730e-001
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -7.071068e-001 -7.071068e-001
+    outer loop
+      vertex 4.982020e+001 -3.152538e+000 1.169778e+000
+      vertex 4.982020e+001 -3.768822e+000 1.786062e+000
+      vertex 3.482020e+001 -3.152538e+000 1.169778e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.191520e-001 -5.735764e-001
+    outer loop
+      vertex 4.982020e+001 -3.768822e+000 1.786062e+000
+      vertex 4.982020e+001 -4.268727e+000 2.500000e+000
+      vertex 3.482020e+001 -3.768822e+000 1.786062e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.063078e-001 -4.226183e-001
+    outer loop
+      vertex 4.982020e+001 -4.268727e+000 2.500000e+000
+      vertex 4.982020e+001 -4.637063e+000 3.289899e+000
+      vertex 3.482020e+001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.659258e-001 -2.588190e-001
+    outer loop
+      vertex 4.982020e+001 -4.637063e+000 3.289899e+000
+      vertex 4.982020e+001 -4.862639e+000 4.131759e+000
+      vertex 3.482020e+001 -4.637063e+000 3.289899e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.961947e-001 -8.715574e-002
+    outer loop
+      vertex 4.982020e+001 -4.862639e+000 4.131759e+000
+      vertex 4.982020e+001 -4.938600e+000 5.000000e+000
+      vertex 3.482020e+001 -4.862639e+000 4.131759e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.961947e-001 8.715574e-002
+    outer loop
+      vertex 4.982020e+001 -4.938600e+000 5.000000e+000
+      vertex 4.982020e+001 -4.862639e+000 5.868241e+000
+      vertex 3.482020e+001 -4.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.659258e-001 2.588190e-001
+    outer loop
+      vertex 4.982020e+001 -4.862639e+000 5.868241e+000
+      vertex 4.982020e+001 -4.637063e+000 6.710101e+000
+      vertex 3.482020e+001 -4.862639e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.063078e-001 4.226183e-001
+    outer loop
+      vertex 4.982020e+001 -4.637063e+000 6.710101e+000
+      vertex 4.982020e+001 -4.268727e+000 7.500000e+000
+      vertex 3.482020e+001 -4.637063e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.191520e-001 5.735764e-001
+    outer loop
+      vertex 4.982020e+001 -4.268727e+000 7.500000e+000
+      vertex 4.982020e+001 -3.768822e+000 8.213938e+000
+      vertex 3.482020e+001 -4.268727e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -7.071068e-001 7.071068e-001
+    outer loop
+      vertex 4.982020e+001 -3.768822e+000 8.213938e+000
+      vertex 4.982020e+001 -3.152538e+000 8.830222e+000
+      vertex 3.482020e+001 -3.768822e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -5.735764e-001 8.191520e-001
+    outer loop
+      vertex 4.982020e+001 -3.152538e+000 8.830222e+000
+      vertex 4.982020e+001 -2.438600e+000 9.330127e+000
+      vertex 3.482020e+001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -4.226183e-001 9.063078e-001
+    outer loop
+      vertex 4.982020e+001 -2.438600e+000 9.330127e+000
+      vertex 4.982020e+001 -1.648701e+000 9.698463e+000
+      vertex 3.482020e+001 -2.438600e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -2.588190e-001 9.659258e-001
+    outer loop
+      vertex 4.982020e+001 -1.648701e+000 9.698463e+000
+      vertex 4.982020e+001 -8.068409e-001 9.924039e+000
+      vertex 3.482020e+001 -1.648701e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.715574e-002 9.961947e-001
+    outer loop
+      vertex 4.982020e+001 -8.068409e-001 9.924039e+000
+      vertex 4.982020e+001 6.140000e-002 1.000000e+001
+      vertex 3.482020e+001 -8.068409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 8.715574e-002 9.961947e-001
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 1.000000e+001
+      vertex 4.982020e+001 9.296409e-001 9.924039e+000
+      vertex 3.482020e+001 6.140000e-002 1.000000e+001
+    endloop
+  endfacet
+  facet normal 0.000000e+000 2.588190e-001 9.659258e-001
+    outer loop
+      vertex 4.982020e+001 9.296409e-001 9.924039e+000
+      vertex 4.982020e+001 1.771501e+000 9.698463e+000
+      vertex 3.482020e+001 9.296409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 4.226183e-001 9.063078e-001
+    outer loop
+      vertex 4.982020e+001 1.771501e+000 9.698463e+000
+      vertex 4.982020e+001 2.561400e+000 9.330127e+000
+      vertex 3.482020e+001 1.771501e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 5.735764e-001 8.191520e-001
+    outer loop
+      vertex 4.982020e+001 2.561400e+000 9.330127e+000
+      vertex 4.982020e+001 3.275338e+000 8.830222e+000
+      vertex 3.482020e+001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 7.071068e-001 7.071068e-001
+    outer loop
+      vertex 4.982020e+001 3.275338e+000 8.830222e+000
+      vertex 4.982020e+001 3.891622e+000 8.213938e+000
+      vertex 3.482020e+001 3.275338e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 8.191520e-001 5.735764e-001
+    outer loop
+      vertex 4.982020e+001 3.891622e+000 8.213938e+000
+      vertex 4.982020e+001 4.391527e+000 7.500000e+000
+      vertex 3.482020e+001 3.891622e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.063078e-001 4.226183e-001
+    outer loop
+      vertex 4.982020e+001 4.391527e+000 7.500000e+000
+      vertex 4.982020e+001 4.759863e+000 6.710101e+000
+      vertex 3.482020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.659258e-001 2.588190e-001
+    outer loop
+      vertex 4.982020e+001 4.759863e+000 6.710101e+000
+      vertex 4.982020e+001 4.985439e+000 5.868241e+000
+      vertex 3.482020e+001 4.759863e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 1.432567e-016 1.253334e-017 -1.000000e+000
+    outer loop
+      vertex 4.428222e+001 1.749552e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.432020e+001 1.706140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 1.174024e-016 3.145787e-017 -1.000000e+000
+    outer loop
+      vertex 4.428222e+001 1.749552e+001 -8.881784e-016
+      vertex 4.416943e+001 1.791645e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 9.887861e-017 4.610785e-017 -1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.416943e+001 1.791645e+001 -8.881784e-016
+      vertex 4.398526e+001 1.831140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 8.409715e-017 5.888546e-017 -1.000000e+000
+    outer loop
+      vertex 4.373531e+001 1.866837e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.398526e+001 1.831140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.118001e-017 7.118001e-017 -1.000000e+000
+    outer loop
+      vertex 4.373531e+001 1.866837e+001 -8.881784e-016
+      vertex 4.342717e+001 1.897651e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 5.888546e-017 8.409715e-017 -1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.342717e+001 1.897651e+001 -8.881784e-016
+      vertex 4.307020e+001 1.922646e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 4.610785e-017 9.887861e-017 -1.000000e+000
+    outer loop
+      vertex 4.267525e+001 1.941063e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.307020e+001 1.922646e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 3.145787e-017 1.174024e-016 -1.000000e+000
+    outer loop
+      vertex 4.267525e+001 1.941063e+001 -8.881784e-016
+      vertex 4.225432e+001 1.952342e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 1.253334e-017 1.432567e-016 -1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.225432e+001 1.952342e+001 -8.881784e-016
+      vertex 4.182020e+001 1.956140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -1.618835e-017 1.850337e-016 -1.000000e+000
+    outer loop
+      vertex 4.138608e+001 1.952342e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.182020e+001 1.956140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -7.259975e-017 2.709460e-016 -1.000000e+000
+    outer loop
+      vertex 4.138608e+001 1.952342e+001 -8.881784e-016
+      vertex 4.096515e+001 1.941063e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 1.571783e-016 -1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.096515e+001 1.941063e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -1.383491e-031 1.571783e-016 -1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 4.096515e+001 1.941063e+001 -8.881784e-016
+      vertex 8.675250e+000 1.941063e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.259975e-017 2.709460e-016 -1.000000e+000
+    outer loop
+      vertex 8.254320e+000 1.952342e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 8.675250e+000 1.941063e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 1.618835e-017 1.850337e-016 -1.000000e+000
+    outer loop
+      vertex 8.254320e+000 1.952342e+001 -8.881784e-016
+      vertex 7.820200e+000 1.956140e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -1.253334e-017 1.432567e-016 -1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 7.820200e+000 1.956140e+001 -8.881784e-016
+      vertex 7.386080e+000 1.952342e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -3.145787e-017 1.174024e-016 -1.000000e+000
+    outer loop
+      vertex 6.965150e+000 1.941063e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 7.386080e+000 1.952342e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -4.610785e-017 9.887861e-017 -1.000000e+000
+    outer loop
+      vertex 6.965150e+000 1.941063e+001 -8.881784e-016
+      vertex 6.570200e+000 1.922646e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -5.888546e-017 8.409715e-017 -1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 6.570200e+000 1.922646e+001 -8.881784e-016
+      vertex 6.213231e+000 1.897651e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -7.118001e-017 7.118001e-017 -1.000000e+000
+    outer loop
+      vertex 5.905089e+000 1.866837e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 6.213231e+000 1.897651e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -8.409715e-017 5.888546e-017 -1.000000e+000
+    outer loop
+      vertex 5.905089e+000 1.866837e+001 -8.881784e-016
+      vertex 5.655136e+000 1.831140e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -9.887861e-017 4.610785e-017 -1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 5.655136e+000 1.831140e+001 -8.881784e-016
+      vertex 5.470968e+000 1.791645e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -1.174024e-016 3.145787e-017 -1.000000e+000
+    outer loop
+      vertex 5.358181e+000 1.749552e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 5.470968e+000 1.791645e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -1.432567e-016 1.253334e-017 -1.000000e+000
+    outer loop
+      vertex 5.358181e+000 1.749552e+001 -8.881784e-016
+      vertex 5.320200e+000 1.706140e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -1.850337e-016 -1.618835e-017 -1.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 5.320200e+000 1.706140e+001 -8.881784e-016
+      vertex 5.358181e+000 1.662728e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -2.709460e-016 -7.259975e-017 -1.000000e+000
+    outer loop
+      vertex 5.470968e+000 1.620635e+001 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex 5.358181e+000 1.662728e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -1.015055e-016 3.552714e-017 -1.000000e+000
+    outer loop
+      vertex 5.470968e+000 1.620635e+001 -8.881784e-016
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 5.470968e+000 1.620635e+001 -8.881784e-016
+      vertex 5.655136e+000 1.581140e+001 -8.881784e-016
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex 5.655136e+000 1.581140e+001 -8.881784e-016
+      vertex 5.905089e+000 1.545443e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 6.213231e+000 1.514629e+001 -8.881784e-016
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex 5.905089e+000 1.545443e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 6.213231e+000 1.514629e+001 -8.881784e-016
+      vertex 6.570200e+000 1.489634e+001 -8.881784e-016
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex 6.570200e+000 1.489634e+001 -8.881784e-016
+      vertex 6.965150e+000 1.471217e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 7.386080e+000 1.459938e+001 -8.881784e-016
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex 6.965150e+000 1.471217e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 6.691135e-017 -3.482212e-017 -1.000000e+000
+    outer loop
+      vertex 7.386080e+000 1.459938e+001 -8.881784e-016
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -7.350854e-018 -8.402064e-017 -1.000000e+000
+    outer loop
+      vertex 7.386080e+000 1.459938e+001 -8.881784e-016
+      vertex 7.820200e+000 1.456140e+001 -8.881784e-016
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.587563e-018 -7.529618e-017 -1.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 7.820200e+000 1.456140e+001 -8.881784e-016
+      vertex 8.254320e+000 1.459938e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.134736e-017 4.995796e-017 -1.000000e+000
+    outer loop
+      vertex 2.290509e+001 1.145443e+001 0.000000e+000
+      vertex 8.254320e+000 1.459938e+001 -8.881784e-016
+      vertex 2.265514e+001 1.181140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 4.990041e-017 -4.995282e-017 -1.000000e+000
+    outer loop
+      vertex 2.290509e+001 1.145443e+001 0.000000e+000
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 8.254320e+000 1.459938e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 2.290509e+001 1.145443e+001 0.000000e+000
+      vertex 2.321323e+001 1.114629e+001 0.000000e+000
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 2.321323e+001 1.114629e+001 0.000000e+000
+      vertex 2.357020e+001 1.089634e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 2.396515e+001 1.071217e+001 0.000000e+000
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 2.357020e+001 1.089634e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 2.396515e+001 1.071217e+001 0.000000e+000
+      vertex 2.438608e+001 1.059938e+001 0.000000e+000
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 2.438608e+001 1.059938e+001 0.000000e+000
+      vertex 2.482020e+001 1.056140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 2.482020e+001 1.056140e+001 0.000000e+000
+      vertex 2.525432e+001 1.059938e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 2.567525e+001 1.071217e+001 0.000000e+000
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 2.525432e+001 1.059938e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 2.567525e+001 1.071217e+001 0.000000e+000
+      vertex 2.607020e+001 1.089634e+001 0.000000e+000
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 2.607020e+001 1.089634e+001 0.000000e+000
+      vertex 2.642717e+001 1.114629e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 2.673531e+001 1.145443e+001 0.000000e+000
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 2.642717e+001 1.114629e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -4.990041e-017 -4.995282e-017 -1.000000e+000
+    outer loop
+      vertex 2.673531e+001 1.145443e+001 0.000000e+000
+      vertex 4.138608e+001 1.459938e+001 -8.881784e-016
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal -7.134736e-017 4.995796e-017 -1.000000e+000
+    outer loop
+      vertex 2.673531e+001 1.145443e+001 0.000000e+000
+      vertex 2.698526e+001 1.181140e+001 0.000000e+000
+      vertex 4.138608e+001 1.459938e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -3.580541e-017 -1.336276e-016 -1.000000e+000
+    outer loop
+      vertex 4.138608e+001 1.459938e+001 -8.881784e-016
+      vertex 2.698526e+001 1.181140e+001 0.000000e+000
+      vertex 4.096515e+001 1.471217e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -7.033831e-017 3.279929e-017 -1.000000e+000
+    outer loop
+      vertex 4.096515e+001 1.471217e+001 -8.881784e-016
+      vertex 2.698526e+001 1.181140e+001 0.000000e+000
+      vertex 2.716943e+001 1.220635e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -7.004568e-017 1.876868e-017 -1.000000e+000
+    outer loop
+      vertex 4.057020e+001 1.489634e+001 -8.881784e-016
+      vertex 2.716943e+001 1.220635e+001 0.000000e+000
+      vertex 2.728222e+001 1.262728e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -6.785445e-017 5.936495e-018 -1.000000e+000
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 0.000000e+000
+      vertex 4.057020e+001 1.489634e+001 -8.881784e-016
+      vertex 2.728222e+001 1.262728e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -5.596390e-017 -7.992473e-017 -1.000000e+000
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 0.000000e+000
+      vertex 4.021323e+001 1.514629e+001 -8.881784e-016
+      vertex 4.057020e+001 1.489634e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -6.792726e-017 -5.942865e-018 -1.000000e+000
+    outer loop
+      vertex 2.732020e+001 1.306140e+001 0.000000e+000
+      vertex 2.728222e+001 1.349552e+001 0.000000e+000
+      vertex 4.021323e+001 1.514629e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -6.091015e-017 -6.091015e-017 -1.000000e+000
+    outer loop
+      vertex 4.021323e+001 1.514629e+001 -8.881784e-016
+      vertex 2.728222e+001 1.349552e+001 0.000000e+000
+      vertex 3.990509e+001 1.545443e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -6.755360e-017 -1.810093e-017 -1.000000e+000
+    outer loop
+      vertex 3.990509e+001 1.545443e+001 -8.881784e-016
+      vertex 2.728222e+001 1.349552e+001 0.000000e+000
+      vertex 2.716943e+001 1.391645e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -6.643400e-017 -3.097868e-017 -1.000000e+000
+    outer loop
+      vertex 3.965514e+001 1.581140e+001 -8.881784e-016
+      vertex 2.716943e+001 1.391645e+001 0.000000e+000
+      vertex 2.698526e+001 1.431140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -6.430222e-017 -4.502490e-017 -1.000000e+000
+    outer loop
+      vertex 3.947097e+001 1.620635e+001 -8.881784e-016
+      vertex 2.698526e+001 1.431140e+001 0.000000e+000
+      vertex 2.673531e+001 1.466837e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -6.091015e-017 -6.091015e-017 -1.000000e+000
+    outer loop
+      vertex 3.935818e+001 1.662728e+001 -8.881784e-016
+      vertex 2.673531e+001 1.466837e+001 0.000000e+000
+      vertex 2.642717e+001 1.497651e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -5.596390e-017 -7.992473e-017 -1.000000e+000
+    outer loop
+      vertex 3.932020e+001 1.706140e+001 -8.881784e-016
+      vertex 2.642717e+001 1.497651e+001 0.000000e+000
+      vertex 2.607020e+001 1.522646e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -7.004568e-017 1.876868e-017 -1.000000e+000
+    outer loop
+      vertex 3.935818e+001 1.749552e+001 -8.881784e-016
+      vertex 2.607020e+001 1.522646e+001 0.000000e+000
+      vertex 3.947097e+001 1.791645e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -6.785445e-017 5.936495e-018 -1.000000e+000
+    outer loop
+      vertex 3.935818e+001 1.749552e+001 -8.881784e-016
+      vertex 3.932020e+001 1.706140e+001 -8.881784e-016
+      vertex 2.607020e+001 1.522646e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 4.096515e+001 1.941063e+001 -8.881784e-016
+      vertex 4.057020e+001 1.922646e+001 -8.881784e-016
+      vertex 8.675250e+000 1.941063e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 8.675250e+000 1.941063e+001 -8.881784e-016
+      vertex 4.057020e+001 1.922646e+001 -8.881784e-016
+      vertex 9.070200e+000 1.922646e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 3.279817e-031 -2.423364e-016 -1.000000e+000
+    outer loop
+      vertex 9.070200e+000 1.922646e+001 -8.881784e-016
+      vertex 4.057020e+001 1.922646e+001 -8.881784e-016
+      vertex 2.482020e+001 1.556140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 1.631843e-017 -1.865205e-016 -1.000000e+000
+    outer loop
+      vertex 9.427169e+000 1.897651e+001 -8.881784e-016
+      vertex 2.482020e+001 1.556140e+001 0.000000e+000
+      vertex 2.438608e+001 1.552342e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 7.134736e-017 4.995796e-017 -1.000000e+000
+    outer loop
+      vertex 9.735311e+000 1.866837e+001 -8.881784e-016
+      vertex 2.438608e+001 1.552342e+001 0.000000e+000
+      vertex 9.985264e+000 1.831140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.719385e-017 7.719385e-017 -1.000000e+000
+    outer loop
+      vertex 9.735311e+000 1.866837e+001 -8.881784e-016
+      vertex 9.427169e+000 1.897651e+001 -8.881784e-016
+      vertex 2.438608e+001 1.552342e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -8.446175e-017 1.206239e-016 -1.000000e+000
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 -8.881784e-016
+      vertex 2.482020e+001 1.556140e+001 0.000000e+000
+      vertex 4.057020e+001 1.922646e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -1.631843e-017 -1.865205e-016 -1.000000e+000
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 -8.881784e-016
+      vertex 2.525432e+001 1.552342e+001 0.000000e+000
+      vertex 2.482020e+001 1.556140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -7.719385e-017 7.719385e-017 -1.000000e+000
+    outer loop
+      vertex 4.021323e+001 1.897651e+001 -8.881784e-016
+      vertex 3.990509e+001 1.866837e+001 -8.881784e-016
+      vertex 2.525432e+001 1.552342e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -7.134736e-017 4.995796e-017 -1.000000e+000
+    outer loop
+      vertex 2.525432e+001 1.552342e+001 0.000000e+000
+      vertex 3.990509e+001 1.866837e+001 -8.881784e-016
+      vertex 3.965514e+001 1.831140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -7.033831e-017 3.279929e-017 -1.000000e+000
+    outer loop
+      vertex 2.567525e+001 1.541063e+001 0.000000e+000
+      vertex 3.965514e+001 1.831140e+001 -8.881784e-016
+      vertex 3.947097e+001 1.791645e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -4.633298e-017 -9.936140e-017 -1.000000e+000
+    outer loop
+      vertex 2.607020e+001 1.522646e+001 0.000000e+000
+      vertex 2.567525e+001 1.541063e+001 0.000000e+000
+      vertex 3.947097e+001 1.791645e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -6.792726e-017 -5.942865e-018 -1.000000e+000
+    outer loop
+      vertex 3.932020e+001 1.706140e+001 -8.881784e-016
+      vertex 3.935818e+001 1.662728e+001 -8.881784e-016
+      vertex 2.642717e+001 1.497651e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -6.755360e-017 -1.810093e-017 -1.000000e+000
+    outer loop
+      vertex 3.947097e+001 1.620635e+001 -8.881784e-016
+      vertex 2.673531e+001 1.466837e+001 0.000000e+000
+      vertex 3.935818e+001 1.662728e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -6.643400e-017 -3.097868e-017 -1.000000e+000
+    outer loop
+      vertex 3.947097e+001 1.620635e+001 -8.881784e-016
+      vertex 3.965514e+001 1.581140e+001 -8.881784e-016
+      vertex 2.698526e+001 1.431140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -6.430222e-017 -4.502490e-017 -1.000000e+000
+    outer loop
+      vertex 3.965514e+001 1.581140e+001 -8.881784e-016
+      vertex 3.990509e+001 1.545443e+001 -8.881784e-016
+      vertex 2.716943e+001 1.391645e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -4.633298e-017 -9.936140e-017 -1.000000e+000
+    outer loop
+      vertex 4.096515e+001 1.471217e+001 -8.881784e-016
+      vertex 2.716943e+001 1.220635e+001 0.000000e+000
+      vertex 4.057020e+001 1.489634e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -6.587563e-018 -7.529618e-017 -1.000000e+000
+    outer loop
+      vertex 4.182020e+001 1.456140e+001 -8.881784e-016
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 4.138608e+001 1.459938e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.350854e-018 -8.402064e-017 -1.000000e+000
+    outer loop
+      vertex 4.182020e+001 1.456140e+001 -8.881784e-016
+      vertex 4.225432e+001 1.459938e+001 -8.881784e-016
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+    endloop
+  endfacet
+  facet normal -6.691135e-017 -3.482212e-017 -1.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 4.225432e+001 1.459938e+001 -8.881784e-016
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -5.921189e-017 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 3.482020e+001 6.140000e-002 0.000000e+000
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 4.267525e+001 1.471217e+001 -8.881784e-016
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.225432e+001 1.459938e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 4.267525e+001 1.471217e+001 -8.881784e-016
+      vertex 4.307020e+001 1.489634e+001 -8.881784e-016
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.307020e+001 1.489634e+001 -8.881784e-016
+      vertex 4.342717e+001 1.514629e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 4.373531e+001 1.545443e+001 -8.881784e-016
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.342717e+001 1.514629e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 4.373531e+001 1.545443e+001 -8.881784e-016
+      vertex 4.398526e+001 1.581140e+001 -8.881784e-016
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.398526e+001 1.581140e+001 -8.881784e-016
+      vertex 4.416943e+001 1.620635e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 2.709460e-016 -7.259975e-017 -1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.416943e+001 1.620635e+001 -8.881784e-016
+      vertex 4.428222e+001 1.662728e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 1.850337e-016 -1.618835e-017 -1.000000e+000
+    outer loop
+      vertex 4.432020e+001 1.706140e+001 -8.881784e-016
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.428222e+001 1.662728e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -3.580541e-017 -1.336276e-016 -1.000000e+000
+    outer loop
+      vertex 2.567525e+001 1.541063e+001 0.000000e+000
+      vertex 2.525432e+001 1.552342e+001 0.000000e+000
+      vertex 3.965514e+001 1.831140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 3.580541e-017 -1.336276e-016 -1.000000e+000
+    outer loop
+      vertex 2.438608e+001 1.552342e+001 0.000000e+000
+      vertex 2.396515e+001 1.541063e+001 0.000000e+000
+      vertex 9.985264e+000 1.831140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.033831e-017 3.279929e-017 -1.000000e+000
+    outer loop
+      vertex 9.985264e+000 1.831140e+001 -8.881784e-016
+      vertex 2.396515e+001 1.541063e+001 0.000000e+000
+      vertex 1.016943e+001 1.791645e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 4.633298e-017 -9.936140e-017 -1.000000e+000
+    outer loop
+      vertex 1.016943e+001 1.791645e+001 -8.881784e-016
+      vertex 2.396515e+001 1.541063e+001 0.000000e+000
+      vertex 2.357020e+001 1.522646e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.785445e-017 5.936495e-018 -1.000000e+000
+    outer loop
+      vertex 1.028222e+001 1.749552e+001 -8.881784e-016
+      vertex 2.357020e+001 1.522646e+001 0.000000e+000
+      vertex 1.032020e+001 1.706140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.004568e-017 1.876868e-017 -1.000000e+000
+    outer loop
+      vertex 1.028222e+001 1.749552e+001 -8.881784e-016
+      vertex 1.016943e+001 1.791645e+001 -8.881784e-016
+      vertex 2.357020e+001 1.522646e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 5.596390e-017 -7.992473e-017 -1.000000e+000
+    outer loop
+      vertex 2.357020e+001 1.522646e+001 0.000000e+000
+      vertex 2.321323e+001 1.497651e+001 0.000000e+000
+      vertex 1.032020e+001 1.706140e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 6.792726e-017 -5.942865e-018 -1.000000e+000
+    outer loop
+      vertex 1.032020e+001 1.706140e+001 -8.881784e-016
+      vertex 2.321323e+001 1.497651e+001 0.000000e+000
+      vertex 1.028222e+001 1.662728e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 6.091015e-017 -6.091015e-017 -1.000000e+000
+    outer loop
+      vertex 1.028222e+001 1.662728e+001 -8.881784e-016
+      vertex 2.321323e+001 1.497651e+001 0.000000e+000
+      vertex 2.290509e+001 1.466837e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.430222e-017 -4.502490e-017 -1.000000e+000
+    outer loop
+      vertex 1.016943e+001 1.620635e+001 -8.881784e-016
+      vertex 2.290509e+001 1.466837e+001 0.000000e+000
+      vertex 2.265514e+001 1.431140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.643400e-017 -3.097868e-017 -1.000000e+000
+    outer loop
+      vertex 9.985264e+000 1.581140e+001 -8.881784e-016
+      vertex 2.265514e+001 1.431140e+001 0.000000e+000
+      vertex 2.247097e+001 1.391645e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.755360e-017 -1.810093e-017 -1.000000e+000
+    outer loop
+      vertex 9.735311e+000 1.545443e+001 -8.881784e-016
+      vertex 2.247097e+001 1.391645e+001 0.000000e+000
+      vertex 2.235818e+001 1.349552e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.792726e-017 -5.942865e-018 -1.000000e+000
+    outer loop
+      vertex 9.427169e+000 1.514629e+001 -8.881784e-016
+      vertex 2.235818e+001 1.349552e+001 0.000000e+000
+      vertex 2.232020e+001 1.306140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.785445e-017 5.936495e-018 -1.000000e+000
+    outer loop
+      vertex 9.070200e+000 1.489634e+001 -8.881784e-016
+      vertex 2.232020e+001 1.306140e+001 0.000000e+000
+      vertex 2.235818e+001 1.262728e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 7.004568e-017 1.876868e-017 -1.000000e+000
+    outer loop
+      vertex 2.247097e+001 1.220635e+001 0.000000e+000
+      vertex 9.070200e+000 1.489634e+001 -8.881784e-016
+      vertex 2.235818e+001 1.262728e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 4.633298e-017 -9.936140e-017 -1.000000e+000
+    outer loop
+      vertex 2.247097e+001 1.220635e+001 0.000000e+000
+      vertex 8.675250e+000 1.471217e+001 -8.881784e-016
+      vertex 9.070200e+000 1.489634e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 7.033831e-017 3.279929e-017 -1.000000e+000
+    outer loop
+      vertex 2.247097e+001 1.220635e+001 0.000000e+000
+      vertex 2.265514e+001 1.181140e+001 0.000000e+000
+      vertex 8.675250e+000 1.471217e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 3.580541e-017 -1.336276e-016 -1.000000e+000
+    outer loop
+      vertex 8.675250e+000 1.471217e+001 -8.881784e-016
+      vertex 2.265514e+001 1.181140e+001 0.000000e+000
+      vertex 8.254320e+000 1.459938e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 8.446175e-017 1.206239e-016 -1.000000e+000
+    outer loop
+      vertex 9.427169e+000 1.897651e+001 -8.881784e-016
+      vertex 9.070200e+000 1.922646e+001 -8.881784e-016
+      vertex 2.482020e+001 1.556140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 5.596390e-017 -7.992473e-017 -1.000000e+000
+    outer loop
+      vertex 9.427169e+000 1.514629e+001 -8.881784e-016
+      vertex 2.232020e+001 1.306140e+001 0.000000e+000
+      vertex 9.070200e+000 1.489634e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 6.091015e-017 -6.091015e-017 -1.000000e+000
+    outer loop
+      vertex 9.427169e+000 1.514629e+001 -8.881784e-016
+      vertex 9.735311e+000 1.545443e+001 -8.881784e-016
+      vertex 2.235818e+001 1.349552e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.430222e-017 -4.502490e-017 -1.000000e+000
+    outer loop
+      vertex 9.985264e+000 1.581140e+001 -8.881784e-016
+      vertex 2.247097e+001 1.391645e+001 0.000000e+000
+      vertex 9.735311e+000 1.545443e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 6.643400e-017 -3.097868e-017 -1.000000e+000
+    outer loop
+      vertex 9.985264e+000 1.581140e+001 -8.881784e-016
+      vertex 1.016943e+001 1.620635e+001 -8.881784e-016
+      vertex 2.265514e+001 1.431140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 6.755360e-017 -1.810093e-017 -1.000000e+000
+    outer loop
+      vertex 1.028222e+001 1.662728e+001 -8.881784e-016
+      vertex 2.290509e+001 1.466837e+001 0.000000e+000
+      vertex 1.016943e+001 1.620635e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 5.921189e-017 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 1.482020e+001 6.140000e-002 0.000000e+000
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 1.015055e-016 3.552714e-017 -1.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.416943e+001 1.620635e+001 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
+    outer loop
+      vertex 3.482020e+001 3.378025e+000 0.000000e+000
+      vertex 1.482020e+001 3.378025e+000 0.000000e+000
+      vertex 2.482020e+001 1.056140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 1.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 1.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.938600e+000 5.000000e+000
+      vertex -1.798000e-001 -2.893023e+000 4.479055e+000
+      vertex -1.798000e-001 -4.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -4.862639e+000 5.868241e+000
+      vertex -1.798000e-001 -2.938600e+000 5.000000e+000
+      vertex -1.798000e-001 -4.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -4.862639e+000 5.868241e+000
+      vertex -1.798000e-001 -2.893023e+000 5.520945e+000
+      vertex -1.798000e-001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -4.862639e+000 5.868241e+000
+      vertex -1.798000e-001 -4.637063e+000 6.710101e+000
+      vertex -1.798000e-001 -2.893023e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.893023e+000 5.520945e+000
+      vertex -1.798000e-001 -4.637063e+000 6.710101e+000
+      vertex -1.798000e-001 -2.757678e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.757678e+000 6.026060e+000
+      vertex -1.798000e-001 -4.637063e+000 6.710101e+000
+      vertex -1.798000e-001 -4.268727e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 6.500000e+000
+      vertex -1.798000e-001 -4.268727e+000 7.500000e+000
+      vertex -1.798000e-001 -3.768822e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.236733e+000 6.928363e+000
+      vertex -1.798000e-001 -3.768822e+000 8.213938e+000
+      vertex -1.798000e-001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -1.866963e+000 7.298133e+000
+      vertex -1.798000e-001 -3.152538e+000 8.830222e+000
+      vertex -1.798000e-001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -1.866963e+000 7.298133e+000
+      vertex -1.798000e-001 -2.236733e+000 6.928363e+000
+      vertex -1.798000e-001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.893023e+000 4.479055e+000
+      vertex -1.798000e-001 -2.757678e+000 3.973940e+000
+      vertex -1.798000e-001 -4.862639e+000 4.131759e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -4.938600e+000 5.000000e+000
+      vertex -1.798000e-001 -2.893023e+000 4.479055e+000
+      vertex -1.798000e-001 -4.862639e+000 4.131759e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 3.500000e+000
+      vertex -1.798000e-001 -4.637063e+000 3.289899e+000
+      vertex -1.798000e-001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 3.500000e+000
+      vertex -1.798000e-001 -4.268727e+000 2.500000e+000
+      vertex -1.798000e-001 -4.637063e+000 3.289899e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 3.500000e+000
+      vertex -1.798000e-001 -2.236733e+000 3.071637e+000
+      vertex -1.798000e-001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -4.268727e+000 2.500000e+000
+      vertex -1.798000e-001 -2.236733e+000 3.071637e+000
+      vertex -1.798000e-001 -3.768822e+000 1.786062e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -3.768822e+000 1.786062e+000
+      vertex -1.798000e-001 -2.236733e+000 3.071637e+000
+      vertex -1.798000e-001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -3.152538e+000 1.169778e+000
+      vertex -1.798000e-001 -1.866963e+000 2.701867e+000
+      vertex -1.798000e-001 -2.438600e+000 6.698730e-001
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -3.152538e+000 1.169778e+000
+      vertex -1.798000e-001 -3.768822e+000 1.786062e+000
+      vertex -1.798000e-001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -1.438600e+000 2.401924e+000
+      vertex -1.798000e-001 -2.438600e+000 6.698730e-001
+      vertex -1.798000e-001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -1.438600e+000 2.401924e+000
+      vertex -1.798000e-001 -1.648701e+000 3.015369e-001
+      vertex -1.798000e-001 -2.438600e+000 6.698730e-001
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -1.438600e+000 2.401924e+000
+      vertex -1.798000e-001 -9.646604e-001 2.180922e+000
+      vertex -1.798000e-001 -1.648701e+000 3.015369e-001
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -1.648701e+000 3.015369e-001
+      vertex -1.798000e-001 -9.646604e-001 2.180922e+000
+      vertex -1.798000e-001 -8.068409e-001 7.596123e-002
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -8.068409e-001 7.596123e-002
+      vertex -1.798000e-001 -9.646604e-001 2.180922e+000
+      vertex -1.798000e-001 -4.595445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex -1.798000e-001 -4.595445e-001 2.045577e+000
+      vertex -1.798000e-001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 5.823445e-001 2.045577e+000
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex -1.798000e-001 6.140000e-002 2.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 5.823445e-001 2.045577e+000
+      vertex -1.798000e-001 1.087460e+000 2.180922e+000
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex -1.798000e-001 1.087460e+000 2.180922e+000
+      vertex -1.798000e-001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 1.989763e+000 2.701867e+000
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex -1.798000e-001 1.561400e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 1.989763e+000 2.701867e+000
+      vertex -1.798000e-001 2.359533e+000 3.071637e+000
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex -1.798000e-001 2.359533e+000 3.071637e+000
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 -2.095500e-016 -1.548743e-015
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex -1.798000e-001 2.359533e+000 3.071637e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 1.776357e-016 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.506140e+001 5.000000e+000
+      vertex -1.798000e-001 2.506140e+001 0.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 -2.628500e-015 1.840496e-015
+    outer loop
+      vertex -1.798000e-001 2.359533e+000 3.071637e+000
+      vertex -1.798000e-001 2.659476e+000 3.500000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 -2.086809e-015 9.730950e-016
+    outer loop
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex -1.798000e-001 2.659476e+000 3.500000e+000
+      vertex -1.798000e-001 2.880478e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 -1.863973e-015 4.994500e-016
+    outer loop
+      vertex -1.798000e-001 3.015823e+000 4.479055e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex -1.798000e-001 2.880478e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 -1.776357e-015 1.554111e-016
+    outer loop
+      vertex -1.798000e-001 3.015823e+000 4.479055e+000
+      vertex -1.798000e-001 3.061400e+000 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 -1.776357e-015 -1.554111e-016
+    outer loop
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex -1.798000e-001 3.061400e+000 5.000000e+000
+      vertex -1.798000e-001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 4.985439e+000 5.868241e+000
+      vertex -1.798000e-001 3.015823e+000 5.520945e+000
+      vertex -1.798000e-001 2.880478e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 4.759863e+000 6.710101e+000
+      vertex -1.798000e-001 2.880478e+000 6.026060e+000
+      vertex -1.798000e-001 2.659476e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 4.391527e+000 7.500000e+000
+      vertex -1.798000e-001 2.659476e+000 6.500000e+000
+      vertex -1.798000e-001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 3.891622e+000 8.213938e+000
+      vertex -1.798000e-001 2.359533e+000 6.928363e+000
+      vertex -1.798000e-001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 3.275338e+000 8.830222e+000
+      vertex -1.798000e-001 1.989763e+000 7.298133e+000
+      vertex -1.798000e-001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 3.275338e+000 8.830222e+000
+      vertex -1.798000e-001 3.891622e+000 8.213938e+000
+      vertex -1.798000e-001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 1.989763e+000 7.298133e+000
+      vertex -1.798000e-001 1.561400e+000 7.598076e+000
+      vertex -1.798000e-001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.561400e+000 9.330127e+000
+      vertex -1.798000e-001 1.561400e+000 7.598076e+000
+      vertex -1.798000e-001 1.771501e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 1.771501e+000 9.698463e+000
+      vertex -1.798000e-001 1.561400e+000 7.598076e+000
+      vertex -1.798000e-001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 9.296409e-001 9.924039e+000
+      vertex -1.798000e-001 1.087460e+000 7.819078e+000
+      vertex -1.798000e-001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 1.000000e+001
+      vertex -1.798000e-001 5.823445e-001 7.954423e+000
+      vertex -1.798000e-001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -8.068409e-001 9.924039e+000
+      vertex -1.798000e-001 6.140000e-002 8.000000e+000
+      vertex -1.798000e-001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -1.648701e+000 9.698463e+000
+      vertex -1.798000e-001 -4.595445e-001 7.954423e+000
+      vertex -1.798000e-001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.438600e+000 9.330127e+000
+      vertex -1.798000e-001 -9.646604e-001 7.819078e+000
+      vertex -1.798000e-001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -3.152538e+000 8.830222e+000
+      vertex -1.798000e-001 -2.438600e+000 9.330127e+000
+      vertex -1.798000e-001 -1.438600e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.536676e+000 6.500000e+000
+      vertex -1.798000e-001 -3.768822e+000 8.213938e+000
+      vertex -1.798000e-001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -4.268727e+000 7.500000e+000
+      vertex -1.798000e-001 -2.536676e+000 6.500000e+000
+      vertex -1.798000e-001 -2.757678e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex -1.798000e-001 -8.068409e-001 7.596123e-002
+      vertex -1.798000e-001 -4.595445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -4.637063e+000 3.289899e+000
+      vertex -1.798000e-001 -4.862639e+000 4.131759e+000
+      vertex -1.798000e-001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -2.438600e+000 9.330127e+000
+      vertex -1.798000e-001 -1.648701e+000 9.698463e+000
+      vertex -1.798000e-001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 -1.648701e+000 9.698463e+000
+      vertex -1.798000e-001 -8.068409e-001 9.924039e+000
+      vertex -1.798000e-001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 1.000000e+001
+      vertex -1.798000e-001 6.140000e-002 8.000000e+000
+      vertex -1.798000e-001 -8.068409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 1.000000e+001
+      vertex -1.798000e-001 9.296409e-001 9.924039e+000
+      vertex -1.798000e-001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 9.296409e-001 9.924039e+000
+      vertex -1.798000e-001 1.771501e+000 9.698463e+000
+      vertex -1.798000e-001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 2.359533e+000 6.928363e+000
+      vertex -1.798000e-001 3.891622e+000 8.213938e+000
+      vertex -1.798000e-001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 4.391527e+000 7.500000e+000
+      vertex -1.798000e-001 4.759863e+000 6.710101e+000
+      vertex -1.798000e-001 2.659476e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex -1.798000e-001 4.759863e+000 6.710101e+000
+      vertex -1.798000e-001 4.985439e+000 5.868241e+000
+      vertex -1.798000e-001 2.880478e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal -1.000000e+000 -7.105427e-016 4.029688e-015
+    outer loop
+      vertex -1.798000e-001 4.985439e+000 5.868241e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex -1.798000e-001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal -1.061532e-017 -8.715574e-002 -9.961947e-001
+    outer loop
+      vertex 1.482020e+001 6.140000e-002 0.000000e+000
+      vertex 1.482020e+001 -8.068409e-001 7.596123e-002
+      vertex -1.798000e-001 -8.068409e-001 7.596123e-002
+    endloop
+  endfacet
+  facet normal 5.124559e-017 -8.715574e-002 -9.961947e-001
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 -8.881784e-016
+      vertex 1.482020e+001 6.140000e-002 0.000000e+000
+      vertex -1.798000e-001 -8.068409e-001 7.596123e-002
+    endloop
+  endfacet
+  facet normal 2.547676e-017 -2.588190e-001 -9.659258e-001
+    outer loop
+      vertex 1.482020e+001 -8.068409e-001 7.596123e-002
+      vertex 1.482020e+001 -1.648701e+000 3.015369e-001
+      vertex -1.798000e-001 -1.648701e+000 3.015369e-001
+    endloop
+  endfacet
+  facet normal -3.065033e-017 -2.588190e-001 -9.659258e-001
+    outer loop
+      vertex -1.798000e-001 -8.068409e-001 7.596123e-002
+      vertex 1.482020e+001 -8.068409e-001 7.596123e-002
+      vertex -1.798000e-001 -1.648701e+000 3.015369e-001
+    endloop
+  endfacet
+  facet normal 4.246127e-018 -4.226183e-001 -9.063078e-001
+    outer loop
+      vertex 1.482020e+001 -1.648701e+000 3.015369e-001
+      vertex 1.482020e+001 -2.438600e+000 6.698730e-001
+      vertex -1.798000e-001 -2.438600e+000 6.698730e-001
+    endloop
+  endfacet
+  facet normal 3.616145e-018 -4.226183e-001 -9.063078e-001
+    outer loop
+      vertex -1.798000e-001 -1.648701e+000 3.015369e-001
+      vertex 1.482020e+001 -1.648701e+000 3.015369e-001
+      vertex -1.798000e-001 -2.438600e+000 6.698730e-001
+    endloop
+  endfacet
+  facet normal 8.492254e-018 -5.735764e-001 -8.191520e-001
+    outer loop
+      vertex 1.482020e+001 -2.438600e+000 6.698730e-001
+      vertex 1.482020e+001 -3.152538e+000 1.169778e+000
+      vertex -1.798000e-001 -3.152538e+000 1.169778e+000
+    endloop
+  endfacet
+  facet normal -2.427694e-017 -5.735764e-001 -8.191520e-001
+    outer loop
+      vertex -1.798000e-001 -2.438600e+000 6.698730e-001
+      vertex 1.482020e+001 -2.438600e+000 6.698730e-001
+      vertex -1.798000e-001 -3.152538e+000 1.169778e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -7.071068e-001 -7.071068e-001
+    outer loop
+      vertex 1.482020e+001 -3.152538e+000 1.169778e+000
+      vertex 1.482020e+001 -3.768822e+000 1.786062e+000
+      vertex -1.798000e-001 -3.768822e+000 1.786062e+000
+    endloop
+  endfacet
+  facet normal -4.186913e-017 -7.071068e-001 -7.071068e-001
+    outer loop
+      vertex -1.798000e-001 -3.152538e+000 1.169778e+000
+      vertex 1.482020e+001 -3.152538e+000 1.169778e+000
+      vertex -1.798000e-001 -3.768822e+000 1.786062e+000
+    endloop
+  endfacet
+  facet normal 2.123063e-017 -8.191520e-001 -5.735764e-001
+    outer loop
+      vertex 1.482020e+001 -3.768822e+000 1.786062e+000
+      vertex 1.482020e+001 -4.268727e+000 2.500000e+000
+      vertex -1.798000e-001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal -2.908199e-017 -8.191520e-001 -5.735764e-001
+    outer loop
+      vertex -1.798000e-001 -3.768822e+000 1.786062e+000
+      vertex 1.482020e+001 -3.768822e+000 1.786062e+000
+      vertex -1.798000e-001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal -3.616145e-018 -9.063078e-001 -4.226183e-001
+    outer loop
+      vertex 1.482020e+001 -4.268727e+000 2.500000e+000
+      vertex 1.482020e+001 -4.637063e+000 3.289899e+000
+      vertex -1.798000e-001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.063078e-001 -4.226183e-001
+    outer loop
+      vertex -1.798000e-001 -4.268727e+000 2.500000e+000
+      vertex 1.482020e+001 -4.637063e+000 3.289899e+000
+      vertex -1.798000e-001 -4.637063e+000 3.289899e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.659258e-001 -2.588190e-001
+    outer loop
+      vertex -1.798000e-001 -4.637063e+000 3.289899e+000
+      vertex 1.482020e+001 -4.637063e+000 3.289899e+000
+      vertex -1.798000e-001 -4.862639e+000 4.131759e+000
+    endloop
+  endfacet
+  facet normal 6.130066e-017 -9.659258e-001 -2.588190e-001
+    outer loop
+      vertex -1.798000e-001 -4.862639e+000 4.131759e+000
+      vertex 1.482020e+001 -4.637063e+000 3.289899e+000
+      vertex 1.482020e+001 -4.862639e+000 4.131759e+000
+    endloop
+  endfacet
+  facet normal -2.802264e-017 -9.961947e-001 -8.715574e-002
+    outer loop
+      vertex -1.798000e-001 -4.938600e+000 5.000000e+000
+      vertex 1.482020e+001 -4.862639e+000 4.131759e+000
+      vertex 1.482020e+001 -4.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 3.318329e-017 -9.961947e-001 8.715574e-002
+    outer loop
+      vertex -1.798000e-001 -4.862639e+000 5.868241e+000
+      vertex 1.482020e+001 -4.938600e+000 5.000000e+000
+      vertex 1.482020e+001 -4.862639e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.659258e-001 2.588190e-001
+    outer loop
+      vertex -1.798000e-001 -4.637063e+000 6.710101e+000
+      vertex 1.482020e+001 -4.862639e+000 5.868241e+000
+      vertex 1.482020e+001 -4.637063e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 7.232290e-018 -9.063078e-001 4.226183e-001
+    outer loop
+      vertex -1.798000e-001 -4.268727e+000 7.500000e+000
+      vertex 1.482020e+001 -4.637063e+000 6.710101e+000
+      vertex 1.482020e+001 -4.268727e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.191520e-001 5.735764e-001
+    outer loop
+      vertex -1.798000e-001 -3.768822e+000 8.213938e+000
+      vertex 1.482020e+001 -4.268727e+000 7.500000e+000
+      vertex 1.482020e+001 -3.768822e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal -2.172279e-030 -7.071068e-001 7.071068e-001
+    outer loop
+      vertex -1.798000e-001 -3.152538e+000 8.830222e+000
+      vertex 1.482020e+001 -3.768822e+000 8.213938e+000
+      vertex 1.482020e+001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 3.884310e-017 -5.735764e-001 8.191520e-001
+    outer loop
+      vertex -1.798000e-001 -2.438600e+000 9.330127e+000
+      vertex 1.482020e+001 -3.152538e+000 8.830222e+000
+      vertex 1.482020e+001 -2.438600e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -4.226183e-001 9.063078e-001
+    outer loop
+      vertex -1.798000e-001 -1.648701e+000 9.698463e+000
+      vertex 1.482020e+001 -2.438600e+000 9.330127e+000
+      vertex 1.482020e+001 -1.648701e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal 8.428841e-017 -2.588190e-001 9.659258e-001
+    outer loop
+      vertex -1.798000e-001 -8.068409e-001 9.924039e+000
+      vertex 1.482020e+001 -1.648701e+000 9.698463e+000
+      vertex 1.482020e+001 -8.068409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -8.715574e-002 9.961947e-001
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 1.000000e+001
+      vertex 1.482020e+001 -8.068409e-001 9.924039e+000
+      vertex 1.482020e+001 6.140000e-002 1.000000e+001
+    endloop
+  endfacet
+  facet normal -2.322295e-017 8.715574e-002 9.961947e-001
+    outer loop
+      vertex -1.798000e-001 9.296409e-001 9.924039e+000
+      vertex 1.482020e+001 6.140000e-002 1.000000e+001
+      vertex 1.482020e+001 9.296409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 4.159406e-017 2.588190e-001 9.659258e-001
+    outer loop
+      vertex -1.798000e-001 1.771501e+000 9.698463e+000
+      vertex 1.482020e+001 9.296409e-001 9.924039e+000
+      vertex 1.482020e+001 1.771501e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 4.226183e-001 9.063078e-001
+    outer loop
+      vertex -1.798000e-001 2.561400e+000 9.330127e+000
+      vertex 1.482020e+001 1.771501e+000 9.698463e+000
+      vertex 1.482020e+001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal 5.816399e-017 5.735764e-001 8.191520e-001
+    outer loop
+      vertex -1.798000e-001 3.275338e+000 8.830222e+000
+      vertex 1.482020e+001 2.561400e+000 9.330127e+000
+      vertex 1.482020e+001 3.275338e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 7.071068e-001 7.071068e-001
+    outer loop
+      vertex -1.798000e-001 3.891622e+000 8.213938e+000
+      vertex 1.482020e+001 3.275338e+000 8.830222e+000
+      vertex 1.482020e+001 3.891622e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal 3.884310e-017 8.191520e-001 5.735764e-001
+    outer loop
+      vertex -1.798000e-001 4.391527e+000 7.500000e+000
+      vertex 1.482020e+001 3.891622e+000 8.213938e+000
+      vertex 1.482020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 7.145594e-017 9.063078e-001 4.226183e-001
+    outer loop
+      vertex -1.798000e-001 4.759863e+000 6.710101e+000
+      vertex 1.482020e+001 4.391527e+000 7.500000e+000
+      vertex 1.482020e+001 4.759863e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.659258e-001 2.588190e-001
+    outer loop
+      vertex -1.798000e-001 4.985439e+000 5.868241e+000
+      vertex 1.482020e+001 4.759863e+000 6.710101e+000
+      vertex 1.482020e+001 4.985439e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.961947e-001 8.715574e-002
+    outer loop
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+      vertex -1.798000e-001 4.985439e+000 5.868241e+000
+      vertex 1.482020e+001 4.985439e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 9.961947e-001 8.715574e-002
+    outer loop
+      vertex 1.482020e+001 5.061400e+000 5.000000e+000
+      vertex -1.798000e-001 5.061400e+000 5.000000e+000
+      vertex -1.798000e-001 4.985439e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 1.910757e-017 9.659258e-001 2.588190e-001
+    outer loop
+      vertex -1.798000e-001 4.985439e+000 5.868241e+000
+      vertex -1.798000e-001 4.759863e+000 6.710101e+000
+      vertex 1.482020e+001 4.759863e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal -8.492254e-018 9.063078e-001 4.226183e-001
+    outer loop
+      vertex -1.798000e-001 4.759863e+000 6.710101e+000
+      vertex -1.798000e-001 4.391527e+000 7.500000e+000
+      vertex 1.482020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 8.191520e-001 5.735764e-001
+    outer loop
+      vertex -1.798000e-001 4.391527e+000 7.500000e+000
+      vertex -1.798000e-001 3.891622e+000 8.213938e+000
+      vertex 1.482020e+001 3.891622e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal -4.344559e-030 7.071068e-001 7.071068e-001
+    outer loop
+      vertex -1.798000e-001 3.275338e+000 8.830222e+000
+      vertex 1.482020e+001 3.275338e+000 8.830222e+000
+      vertex -1.798000e-001 3.891622e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 5.735764e-001 8.191520e-001
+    outer loop
+      vertex -1.798000e-001 3.275338e+000 8.830222e+000
+      vertex -1.798000e-001 2.561400e+000 9.330127e+000
+      vertex 1.482020e+001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal -1.153573e-017 4.226183e-001 9.063078e-001
+    outer loop
+      vertex -1.798000e-001 1.771501e+000 9.698463e+000
+      vertex 1.482020e+001 1.771501e+000 9.698463e+000
+      vertex -1.798000e-001 2.561400e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal -6.793803e-017 2.588190e-001 9.659258e-001
+    outer loop
+      vertex -1.798000e-001 1.771501e+000 9.698463e+000
+      vertex -1.798000e-001 9.296409e-001 9.924039e+000
+      vertex 1.482020e+001 9.296409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 8.715574e-002 9.961947e-001
+    outer loop
+      vertex -1.798000e-001 9.296409e-001 9.924039e+000
+      vertex -1.798000e-001 6.140000e-002 1.000000e+001
+      vertex 1.482020e+001 6.140000e-002 1.000000e+001
+    endloop
+  endfacet
+  facet normal 2.866136e-017 -8.715574e-002 9.961947e-001
+    outer loop
+      vertex -1.798000e-001 6.140000e-002 1.000000e+001
+      vertex -1.798000e-001 -8.068409e-001 9.924039e+000
+      vertex 1.482020e+001 -8.068409e-001 9.924039e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -2.588190e-001 9.659258e-001
+    outer loop
+      vertex -1.798000e-001 -8.068409e-001 9.924039e+000
+      vertex -1.798000e-001 -1.648701e+000 9.698463e+000
+      vertex 1.482020e+001 -1.648701e+000 9.698463e+000
+    endloop
+  endfacet
+  facet normal -8.492254e-018 -4.226183e-001 9.063078e-001
+    outer loop
+      vertex -1.798000e-001 -1.648701e+000 9.698463e+000
+      vertex -1.798000e-001 -2.438600e+000 9.330127e+000
+      vertex 1.482020e+001 -2.438600e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal -5.944578e-017 -5.735764e-001 8.191520e-001
+    outer loop
+      vertex -1.798000e-001 -2.438600e+000 9.330127e+000
+      vertex -1.798000e-001 -3.152538e+000 8.830222e+000
+      vertex 1.482020e+001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -7.071068e-001 7.071068e-001
+    outer loop
+      vertex -1.798000e-001 -3.152538e+000 8.830222e+000
+      vertex -1.798000e-001 -3.768822e+000 8.213938e+000
+      vertex 1.482020e+001 -3.768822e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal -3.821514e-017 -8.191520e-001 5.735764e-001
+    outer loop
+      vertex -1.798000e-001 -3.768822e+000 8.213938e+000
+      vertex -1.798000e-001 -4.268727e+000 7.500000e+000
+      vertex 1.482020e+001 -4.268727e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 0.000000e+000 -9.063078e-001 4.226183e-001
+    outer loop
+      vertex -1.798000e-001 -4.268727e+000 7.500000e+000
+      vertex -1.798000e-001 -4.637063e+000 6.710101e+000
+      vertex 1.482020e+001 -4.637063e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal -1.910757e-017 -9.659258e-001 2.588190e-001
+    outer loop
+      vertex -1.798000e-001 -4.637063e+000 6.710101e+000
+      vertex -1.798000e-001 -4.862639e+000 5.868241e+000
+      vertex 1.482020e+001 -4.862639e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal -9.023020e-017 -9.961947e-001 8.715574e-002
+    outer loop
+      vertex -1.798000e-001 -4.862639e+000 5.868241e+000
+      vertex -1.798000e-001 -4.938600e+000 5.000000e+000
+      vertex 1.482020e+001 -4.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 2.016910e-017 -9.961947e-001 -8.715574e-002
+    outer loop
+      vertex -1.798000e-001 -4.938600e+000 5.000000e+000
+      vertex -1.798000e-001 -4.862639e+000 4.131759e+000
+      vertex 1.482020e+001 -4.862639e+000 4.131759e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -2.893023e+000 5.520945e+000
+      vertex 4.982020e+001 -4.862639e+000 5.868241e+000
+      vertex 4.982020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -2.893023e+000 5.520945e+000
+      vertex 4.982020e+001 -4.637063e+000 6.710101e+000
+      vertex 4.982020e+001 -4.862639e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -2.893023e+000 5.520945e+000
+      vertex 4.982020e+001 -2.757678e+000 6.026060e+000
+      vertex 4.982020e+001 -4.637063e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.637063e+000 6.710101e+000
+      vertex 4.982020e+001 -2.757678e+000 6.026060e+000
+      vertex 4.982020e+001 -4.268727e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.268727e+000 7.500000e+000
+      vertex 4.982020e+001 -2.757678e+000 6.026060e+000
+      vertex 4.982020e+001 -2.536676e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -3.768822e+000 8.213938e+000
+      vertex 4.982020e+001 -2.536676e+000 6.500000e+000
+      vertex 4.982020e+001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -1.866963e+000 7.298133e+000
+      vertex 4.982020e+001 -3.768822e+000 8.213938e+000
+      vertex 4.982020e+001 -2.236733e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -1.866963e+000 7.298133e+000
+      vertex 4.982020e+001 -3.152538e+000 8.830222e+000
+      vertex 4.982020e+001 -3.768822e+000 8.213938e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -1.866963e+000 7.298133e+000
+      vertex 4.982020e+001 -1.438600e+000 7.598076e+000
+      vertex 4.982020e+001 -3.152538e+000 8.830222e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -3.152538e+000 8.830222e+000
+      vertex 4.982020e+001 -1.438600e+000 7.598076e+000
+      vertex 4.982020e+001 -2.438600e+000 9.330127e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -2.438600e+000 9.330127e+000
+      vertex 4.982020e+001 -1.438600e+000 7.598076e+000
+      vertex 4.982020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -1.648701e+000 9.698463e+000
+      vertex 4.982020e+001 -9.646604e-001 7.819078e+000
+      vertex 4.982020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -8.068409e-001 9.924039e+000
+      vertex 4.982020e+001 -4.595445e-001 7.954423e+000
+      vertex 4.982020e+001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 1.000000e+001
+      vertex 4.982020e+001 6.140000e-002 8.000000e+000
+      vertex 4.982020e+001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 9.296409e-001 9.924039e+000
+      vertex 4.982020e+001 5.823445e-001 7.954423e+000
+      vertex 4.982020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 1.771501e+000 9.698463e+000
+      vertex 4.982020e+001 1.087460e+000 7.819078e+000
+      vertex 4.982020e+001 1.561400e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.561400e+000 9.330127e+000
+      vertex 4.982020e+001 1.561400e+000 7.598076e+000
+      vertex 4.982020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 3.275338e+000 8.830222e+000
+      vertex 4.982020e+001 1.989763e+000 7.298133e+000
+      vertex 4.982020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 3.891622e+000 8.213938e+000
+      vertex 4.982020e+001 2.359533e+000 6.928363e+000
+      vertex 4.982020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 3.891622e+000 8.213938e+000
+      vertex 4.982020e+001 3.275338e+000 8.830222e+000
+      vertex 4.982020e+001 2.359533e+000 6.928363e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.359533e+000 6.928363e+000
+      vertex 4.982020e+001 2.659476e+000 6.500000e+000
+      vertex 4.982020e+001 4.391527e+000 7.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 4.391527e+000 7.500000e+000
+      vertex 4.982020e+001 2.659476e+000 6.500000e+000
+      vertex 4.982020e+001 4.759863e+000 6.710101e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 4.759863e+000 6.710101e+000
+      vertex 4.982020e+001 2.659476e+000 6.500000e+000
+      vertex 4.982020e+001 2.880478e+000 6.026060e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 4.985439e+000 5.868241e+000
+      vertex 4.982020e+001 2.880478e+000 6.026060e+000
+      vertex 4.982020e+001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.982020e+001 3.015823e+000 5.520945e+000
+      vertex 4.982020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 3.015823e+000 4.479055e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.982020e+001 3.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 3.015823e+000 4.479055e+000
+      vertex 4.982020e+001 2.880478e+000 3.973940e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.982020e+001 2.880478e+000 3.973940e+000
+      vertex 4.982020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.359533e+000 3.071637e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.982020e+001 2.659476e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.359533e+000 3.071637e+000
+      vertex 4.982020e+001 1.989763e+000 2.701867e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.982020e+001 1.989763e+000 2.701867e+000
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 5.000000e+000
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 1.989763e+000 2.701867e+000
+      vertex 4.982020e+001 1.561400e+000 2.401924e+000
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.506140e+001 0.000000e+000
+      vertex 4.982020e+001 1.989763e+000 2.701867e+000
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 1.561400e+000 2.401924e+000
+      vertex 4.982020e+001 1.087460e+000 2.180922e+000
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.982020e+001 1.087460e+000 2.180922e+000
+      vertex 4.982020e+001 5.823445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 2.000000e+000
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.982020e+001 5.823445e-001 2.045577e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 2.000000e+000
+      vertex 4.982020e+001 -4.595445e-001 2.045577e+000
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 -8.881784e-016
+      vertex 4.982020e+001 -4.595445e-001 2.045577e+000
+      vertex 4.982020e+001 -8.068409e-001 7.596123e-002
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -8.068409e-001 7.596123e-002
+      vertex 4.982020e+001 -4.595445e-001 2.045577e+000
+      vertex 4.982020e+001 -9.646604e-001 2.180922e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -1.648701e+000 3.015369e-001
+      vertex 4.982020e+001 -9.646604e-001 2.180922e+000
+      vertex 4.982020e+001 -1.438600e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -2.438600e+000 6.698730e-001
+      vertex 4.982020e+001 -1.438600e+000 2.401924e+000
+      vertex 4.982020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -3.152538e+000 1.169778e+000
+      vertex 4.982020e+001 -1.866963e+000 2.701867e+000
+      vertex 4.982020e+001 -3.768822e+000 1.786062e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -3.152538e+000 1.169778e+000
+      vertex 4.982020e+001 -2.438600e+000 6.698730e-001
+      vertex 4.982020e+001 -1.866963e+000 2.701867e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -1.866963e+000 2.701867e+000
+      vertex 4.982020e+001 -2.236733e+000 3.071637e+000
+      vertex 4.982020e+001 -3.768822e+000 1.786062e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -3.768822e+000 1.786062e+000
+      vertex 4.982020e+001 -2.236733e+000 3.071637e+000
+      vertex 4.982020e+001 -4.268727e+000 2.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.268727e+000 2.500000e+000
+      vertex 4.982020e+001 -2.236733e+000 3.071637e+000
+      vertex 4.982020e+001 -2.536676e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.637063e+000 3.289899e+000
+      vertex 4.982020e+001 -2.536676e+000 3.500000e+000
+      vertex 4.982020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.862639e+000 4.131759e+000
+      vertex 4.982020e+001 -2.757678e+000 3.973940e+000
+      vertex 4.982020e+001 -2.893023e+000 4.479055e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.938600e+000 5.000000e+000
+      vertex 4.982020e+001 -2.893023e+000 4.479055e+000
+      vertex 4.982020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.862639e+000 5.868241e+000
+      vertex 4.982020e+001 -4.938600e+000 5.000000e+000
+      vertex 4.982020e+001 -2.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 5.061400e+000 5.000000e+000
+      vertex 4.982020e+001 4.985439e+000 5.868241e+000
+      vertex 4.982020e+001 3.015823e+000 5.520945e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 4.759863e+000 6.710101e+000
+      vertex 4.982020e+001 2.880478e+000 6.026060e+000
+      vertex 4.982020e+001 4.985439e+000 5.868241e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 3.275338e+000 8.830222e+000
+      vertex 4.982020e+001 2.561400e+000 9.330127e+000
+      vertex 4.982020e+001 1.989763e+000 7.298133e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 2.561400e+000 9.330127e+000
+      vertex 4.982020e+001 1.771501e+000 9.698463e+000
+      vertex 4.982020e+001 1.561400e+000 7.598076e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 1.771501e+000 9.698463e+000
+      vertex 4.982020e+001 9.296409e-001 9.924039e+000
+      vertex 4.982020e+001 1.087460e+000 7.819078e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 9.296409e-001 9.924039e+000
+      vertex 4.982020e+001 6.140000e-002 1.000000e+001
+      vertex 4.982020e+001 5.823445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 6.140000e-002 1.000000e+001
+      vertex 4.982020e+001 -8.068409e-001 9.924039e+000
+      vertex 4.982020e+001 6.140000e-002 8.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -8.068409e-001 9.924039e+000
+      vertex 4.982020e+001 -1.648701e+000 9.698463e+000
+      vertex 4.982020e+001 -4.595445e-001 7.954423e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -1.648701e+000 9.698463e+000
+      vertex 4.982020e+001 -2.438600e+000 9.330127e+000
+      vertex 4.982020e+001 -9.646604e-001 7.819078e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -3.768822e+000 8.213938e+000
+      vertex 4.982020e+001 -4.268727e+000 7.500000e+000
+      vertex 4.982020e+001 -2.536676e+000 6.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.862639e+000 4.131759e+000
+      vertex 4.982020e+001 -2.893023e+000 4.479055e+000
+      vertex 4.982020e+001 -4.938600e+000 5.000000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.862639e+000 4.131759e+000
+      vertex 4.982020e+001 -4.637063e+000 3.289899e+000
+      vertex 4.982020e+001 -2.757678e+000 3.973940e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -4.637063e+000 3.289899e+000
+      vertex 4.982020e+001 -4.268727e+000 2.500000e+000
+      vertex 4.982020e+001 -2.536676e+000 3.500000e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -2.438600e+000 6.698730e-001
+      vertex 4.982020e+001 -1.648701e+000 3.015369e-001
+      vertex 4.982020e+001 -1.438600e+000 2.401924e+000
+    endloop
+  endfacet
+  facet normal 1.000000e+000 0.000000e+000 0.000000e+000
+    outer loop
+      vertex 4.982020e+001 -8.068409e-001 7.596123e-002
+      vertex 4.982020e+001 -9.646604e-001 2.180922e+000
+      vertex 4.982020e+001 -1.648701e+000 3.015369e-001
+    endloop
+  endfacet
+endsolid
diff --git a/contrib/Netgen/nglib/ng_occ.cpp b/contrib/Netgen/nglib/ng_occ.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..78898baaf64c1f51ff9ab2cdc75db97cff2cfd05
--- /dev/null
+++ b/contrib/Netgen/nglib/ng_occ.cpp
@@ -0,0 +1,142 @@
+#include <iostream>
+#include <climits>
+
+#include "TopTools_IndexedMapOfShape.hxx"
+#include "TopoDS.hxx"
+#include "TopoDS_Face.hxx"
+#include "TopoDS_Shape.hxx"
+#include "GProp_GProps.hxx"
+#include "BRepGProp.hxx"
+
+using namespace std;
+
+namespace nglib {
+#include <nglib.h>
+}
+
+int main (int argc, char ** argv)
+{
+   using namespace nglib;
+   
+   cout << "Netgen NgLib - OpenCascade Test Case" << endl;
+   
+   if (argc != 2)
+   {
+      cerr << "use: ng_occ <src_step>" << endl;
+      return 1;
+   }
+   
+   // Define pointer to OCC Geometry
+   Ng_OCC_Geometry *occ_geom;
+   
+   Ng_Mesh *occ_mesh;
+   
+   Ng_Meshing_Parameters mp;
+   
+   TopTools_IndexedMapOfShape FMap;
+   
+   Ng_OCC_TopTools_IndexedMapOfShape *occ_fmap = (Ng_OCC_TopTools_IndexedMapOfShape*)&FMap;
+   
+   // Result of Netgen Operations
+   Ng_Result ng_res;
+
+   // Initialise the Netgen Core library
+   Ng_Init();
+
+   // Read in the OCC File
+   occ_geom = Ng_OCC_Load_STEP(argv[1]);
+   if(!occ_geom)
+   {
+      cout << "Error reading in STEP File: " << argv[1] << endl;
+	  return 1;
+   }
+   cout << "Successfully loaded STEP File: " << argv[1] << endl;
+
+   occ_mesh = Ng_NewMesh();
+   
+   ng_res = Ng_OCC_GetFMap(occ_geom,occ_fmap);
+
+   cout << "ng_res = " << ng_res << endl;
+	  
+   if(!FMap.Extent())
+   {
+      cout << "Error retrieving Face map...." << endl;
+	  return 1;
+   }
+
+   cout << "Successfully extracted the Face Map....:" << FMap.Extent() << endl;
+   
+   for(int i = 1; i <= FMap.Extent(); i++)
+   {
+      TopoDS_Face OCCface;
+	  OCCface = TopoDS::Face(FMap.FindKey(i));
+	  
+	  GProp_GProps faceProps;
+	  BRepGProp::SurfaceProperties(OCCface,faceProps);
+	  
+      cout << "Index: " << i 
+	       << " :: Area: " << faceProps.Mass() 
+		   << " :: Hash: " << OCCface.HashCode(1e+6) 
+		   << endl;
+   }	 
+   
+   mp.uselocalh = 1;
+   mp.elementsperedge = 2.0;
+   mp.elementspercurve = 2.0;
+   mp.maxh = 10.0;
+   mp.grading = 0.2;   
+   mp.closeedgeenable = 0;
+   mp.closeedgefact = 1.0;
+   mp.optsurfmeshenable = 1;
+   
+   
+   cout << "Setting Local Mesh size....." << endl;
+   cout << "OCC Mesh Pointer before call = " << occ_mesh << endl;
+   Ng_OCC_SetLocalMeshSize(occ_geom, occ_mesh, &mp);
+   cout << "Local Mesh size successfully set....." << endl;
+      cout << "OCC Mesh Pointer after call = " << occ_mesh << endl;
+   
+   cout << "Creating Edge Mesh....." << endl;
+   ng_res = Ng_OCC_GenerateEdgeMesh(occ_geom, occ_mesh, &mp);
+   if(ng_res != NG_OK)
+   {
+      Ng_DeleteMesh(occ_mesh);
+	  cout << "Error creating Edge Mesh.... Aborting!!" << endl;
+	  return 1;
+   }
+   else
+   {
+      cout << "Edge Mesh successfully created....." << endl;
+	  cout << "Number of points = " << Ng_GetNP(occ_mesh) << endl;
+   }
+
+   cout << "Creating Surface Mesh....." << endl;
+ 
+   ng_res = Ng_OCC_GenerateSurfaceMesh(occ_geom, occ_mesh, &mp);
+   if(ng_res != NG_OK)
+   {
+      Ng_DeleteMesh(occ_mesh);
+	  cout << "Error creating Surface Mesh..... Aborting!!" << endl;
+	  return 1;
+   }
+   else
+   {
+      cout << "Surface Mesh successfully created....." << endl;
+	  cout << "Number of points = " << Ng_GetNP(occ_mesh) << endl;
+	  cout << "Number of surface elements = " << Ng_GetNSE(occ_mesh) << endl;
+   }
+
+   cout << "Creating Volume Mesh....." << endl;
+   
+   ng_res = Ng_GenerateVolumeMesh(occ_mesh, &mp);
+   
+   cout << "Volume Mesh successfully created....." << endl;
+   cout << "Number of points = " << Ng_GetNP(occ_mesh) << endl;
+   cout << "Number of volume elements = " << Ng_GetNE(occ_mesh) << endl;
+   
+   cout << "Saving Mesh as VOL file....." << endl;
+   Ng_SaveMesh(occ_mesh,"test_occ.vol");
+      
+   return 0;
+}
+   
diff --git a/contrib/Netgen/nglib/ng_stl.cpp b/contrib/Netgen/nglib/ng_stl.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..af8a2ed8092e83e12cec85951ac6646ab3767a17
--- /dev/null
+++ b/contrib/Netgen/nglib/ng_stl.cpp
@@ -0,0 +1,128 @@
+/*!
+   \file ng_stl.cpp
+   \author Philippose Rajan
+   \date 14 Feb 2009 (Created)
+
+   This sample utility demonstrates the use of the Netgen 
+   nglib library for reading, and meshing an STL geometry. 
+
+   The Program takes as input the name of an STL file 
+   saved in the STL ASCII Format, and generates a 3D Volume 
+   mesh which is saved into the file "test.vol".
+
+   test.vol can be viewed using the usual Netgen Mesher GUI
+*/
+
+
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+namespace nglib {
+#include <nglib.h>
+}
+
+int main (int argc, char ** argv)
+{
+   using namespace nglib;
+
+   cout << "Netgen (nglib) STL Testing" << endl;
+
+   if (argc < 2)
+   {
+      cerr << "use: ng_stl STL_filename" << endl;
+      return 1;
+   }
+
+   // Define pointer to a new Netgen Mesh
+   Ng_Mesh *mesh;
+   
+   // Define pointer to STL Geometry
+   Ng_STL_Geometry *stl_geom;
+
+   // Result of Netgen Operations
+   Ng_Result ng_res;
+   
+   // Initialise the Netgen Core library
+   Ng_Init();
+
+   // Actually create the mesh structure
+   mesh = Ng_NewMesh();
+
+   int np, ne;
+
+   // Read in the STL File
+   stl_geom = Ng_STL_LoadGeometry(argv[1]);
+   if(!stl_geom)
+   {
+      cout << "Error reading in STL File: " << argv[1] << endl;
+	  return 1;
+   }
+   cout << "Successfully loaded STL File: " << argv[1] << endl;
+
+
+   // Set the Meshing Parameters to be used
+   Ng_Meshing_Parameters mp;
+   mp.maxh = 1.0e+6;
+   mp.fineness = 0.4;
+   mp.second_order = 0;
+
+   cout << "Initialise the STL Geometry structure...." << endl;
+   ng_res = Ng_STL_InitSTLGeometry(stl_geom);
+   if(ng_res != NG_OK)
+   {
+      cout << "Error Initialising the STL Geometry....Aborting!!" << endl;
+	   return 1;
+   }
+
+   cout << "Start Edge Meshing...." << endl;
+   ng_res = Ng_STL_MakeEdges(stl_geom, mesh, &mp);
+   if(ng_res != NG_OK)
+   {
+      cout << "Error in Edge Meshing....Aborting!!" << endl;
+	   return 1;
+   }
+
+   cout << "Start Surface Meshing...." << endl;
+   ng_res = Ng_STL_GenerateSurfaceMesh(stl_geom, mesh, &mp);
+   if(ng_res != NG_OK)
+   {
+      cout << "Error in Surface Meshing....Aborting!!" << endl;
+	   return 1;
+   }
+   
+   cout << "Start Volume Meshing...." << endl;
+   ng_res = Ng_GenerateVolumeMesh (mesh, &mp);
+   if(ng_res != NG_OK)
+   {
+      cout << "Error in Volume Meshing....Aborting!!" << endl;
+	  return 1;
+   }
+   
+   cout << "Meshing successfully completed....!!" << endl;
+
+   // volume mesh output
+   np = Ng_GetNP(mesh);
+   cout << "Points: " << np << endl;
+
+   ne = Ng_GetNE(mesh);
+   cout << "Elements: " << ne << endl;
+
+   cout << "Saving Mesh in VOL Format...." << endl;
+   Ng_SaveMesh(mesh,"test.vol");
+
+
+   // refinement without geomety adaption:
+   // Ng_Uniform_Refinement (mesh);
+
+   // refinement with geomety adaption:   
+   Ng_STL_Uniform_Refinement (stl_geom, mesh);
+
+   cout << "elements after refinement: " << Ng_GetNE(mesh) << endl;
+   cout << "points   after refinement: " << Ng_GetNP(mesh) << endl;
+
+   Ng_SaveMesh(mesh,"test_ref.vol");
+
+   return 0;
+}
diff --git a/contrib/Netgen/nglib/ng_vol.cpp b/contrib/Netgen/nglib/ng_vol.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8ccb3f81bd9125ada690696ff0eb0a1b45e8ddd2
--- /dev/null
+++ b/contrib/Netgen/nglib/ng_vol.cpp
@@ -0,0 +1,95 @@
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+namespace nglib {
+#include <nglib.h>
+}
+
+int main (int argc, char ** argv)
+{
+  using namespace nglib;
+
+  cout << "Netgen Testing" << endl;
+
+  if (argc < 2)
+    {
+      cerr << "use: ng_vol filename" << endl;
+      return 1;
+    }
+
+
+
+  Ng_Mesh * mesh;
+
+  Ng_Init();
+
+  // creates mesh structure
+  mesh = Ng_NewMesh ();
+
+
+
+
+
+  int i, np, nse, ne;
+  double point[3];
+  int trig[3], tet[4];
+
+
+  // reads surface mesh from file
+  ifstream in(argv[1]);
+
+  in >> np;
+  cout << "Reading " << np  << " points..."; cout.flush();
+  for (i = 1; i <= np; i++)
+    {
+      in >> point[0] >> point[1] >> point[2];
+      Ng_AddPoint (mesh, point);
+    }
+  cout << "done" << endl;
+
+  in >> nse;
+  cout << "Reading " << nse  << " faces..."; cout.flush();
+  for (i = 1; i <= nse; i++)
+    {
+      in >> trig[0] >> trig[1] >> trig[2];
+      Ng_AddSurfaceElement (mesh, NG_TRIG, trig);
+    }
+  cout << "done" << endl;
+
+
+  // generate volume mesh
+  Ng_Meshing_Parameters mp;
+  mp.maxh = 1e6;
+  mp.fineness = 1;
+  mp.second_order = 0;
+
+  cout << "start meshing" << endl;
+  Ng_GenerateVolumeMesh (mesh, &mp);
+  cout << "meshing done" << endl;
+
+  // volume mesh output
+  np = Ng_GetNP(mesh);
+  cout << "Points: " << np << endl;
+
+  for (i = 1; i <= np; i++)
+    {
+      Ng_GetPoint (mesh, i, point);
+      cout << i << ": " << point[0] << " " << point[1] << " " << point[2] << endl;
+    }
+
+  ne = Ng_GetNE(mesh);
+  cout << "Elements: " << ne << endl;
+  for (i = 1; i <= ne; i++)
+    {
+      Ng_GetVolumeElement (mesh, i, tet);
+      cout << i << ": " << tet[0] << " " << tet[1] 
+	   << " " << tet[2] << " " << tet[3] << endl;
+    }
+
+  Ng_SaveMesh(mesh,"test.vol");
+
+
+  return 0;
+}
diff --git a/contrib/Netgen/nglib/nglib.cpp b/contrib/Netgen/nglib/nglib.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..57a5c172d74cc1abf4c45287bc5a49de57328756
--- /dev/null
+++ b/contrib/Netgen/nglib/nglib.cpp
@@ -0,0 +1,1225 @@
+/**************************************************************************/
+/* File:   nglib.cpp                                                      */
+/* 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>
+
+#ifdef OCCGEOMETRY
+#include <occgeom.hpp>
+#endif
+
+#include <nginterface.h>
+
+
+namespace netgen {
+   extern void MeshFromSpline2D (SplineGeometry2d & geometry,
+                                 Mesh *& mesh, 
+                                 MeshingParameters & mp);
+}
+
+namespace netgen
+{
+   int id, ntasks;
+}
+
+
+#ifdef PARALLEL
+#include <mpi.h>
+
+namespace netgen
+{
+  // MPI_Group MPI_HIGHORDER_WORLD;
+  // MPI_Comm MPI_HIGHORDER_COMM;
+  MPI_Comm mesh_comm;
+}
+#endif
+
+
+/*
+// should not be needed (occ currently requires it)
+namespace netgen {
+#include "../libsrc/visualization/vispar.hpp"
+  VisualizationParameters vispar;
+  VisualizationParameters :: VisualizationParameters() { ; }
+}
+*/
+
+
+namespace nglib {
+#include "nglib.h"
+}
+
+using namespace netgen;
+
+// constants and types:
+
+namespace nglib
+{
+   // initialize, deconstruct Netgen library:
+   DLL_HEADER void Ng_Init ()
+   {
+      mycout = &cout;
+      myerr = &cerr;
+      // netgen::testout->SetOutStream (new ofstream ("test.out"));
+      testout = new ofstream ("test.out");
+   }
+
+
+
+
+   // Clean-up functions before ending usage of nglib
+   DLL_HEADER void Ng_Exit ()
+   {
+      ;
+   }
+
+
+
+
+   // Create a new netgen mesh object
+   DLL_HEADER Ng_Mesh * Ng_NewMesh ()
+   {
+      Mesh * mesh = new Mesh;  
+      mesh->AddFaceDescriptor (FaceDescriptor (1, 1, 0, 1));
+      return (Ng_Mesh*)(void*)mesh;
+   }
+
+
+
+
+   // Delete an existing netgen mesh object
+   DLL_HEADER void Ng_DeleteMesh (Ng_Mesh * mesh)
+   {
+      if(mesh != NULL)
+      {
+         // Delete the Mesh structures
+         ((Mesh*)mesh)->DeleteMesh();
+
+         // Now delete the Mesh class itself
+         delete (Mesh*)mesh;
+
+         // Set the Ng_Mesh pointer to NULL
+         mesh = NULL;
+      }
+   }
+
+
+
+
+   // Save a netgen mesh in the native VOL format 
+   DLL_HEADER void Ng_SaveMesh(Ng_Mesh * mesh, const char* filename)
+   {
+      ((Mesh*)mesh)->Save(filename);
+   }
+
+
+
+
+   // Load a netgen native VOL mesh from a given file
+   DLL_HEADER Ng_Mesh * Ng_LoadMesh(const char* filename)
+   {
+      Mesh * mesh = new Mesh;
+      mesh->Load(filename);
+      return ( (Ng_Mesh*)mesh );
+   }
+
+
+
+
+   // Merge another mesh file into the currently loaded one
+   DLL_HEADER Ng_Result Ng_MergeMesh( Ng_Mesh* mesh, const char* filename)
+   {
+      Ng_Result status = NG_OK;
+
+      ifstream infile(filename);
+      Mesh * m = (Mesh*)mesh;
+
+      if(!infile.good())
+      {
+         status = NG_FILE_NOT_FOUND;
+      }
+
+      if(!m)
+      {
+         status = NG_ERROR;
+      }
+
+      if(status == NG_OK)
+      {
+         const int num_pts = m->GetNP();
+         const int face_offset = m->GetNFD();
+
+         m->Merge(infile, face_offset);
+
+         if(m->GetNP() > num_pts)
+         {
+            status = NG_OK;
+         }
+         else
+         {
+            status = NG_ERROR;
+         }
+      }
+
+      return status;
+   }
+
+
+
+
+   // Merge another mesh file into the currently loaded one
+   DLL_HEADER Ng_Result Ng_MergeMesh( Ng_Mesh* mesh1, Ng_Mesh* mesh2)
+   {
+      return NG_ERROR;
+   }
+
+
+
+
+   // Manually add a point to an existing mesh object
+   DLL_HEADER void Ng_AddPoint (Ng_Mesh * mesh, double * x)
+   {
+      Mesh * m = (Mesh*)mesh;
+      m->AddPoint (Point3d (x[0], x[1], x[2]));
+   }
+
+
+
+
+   // Manually add a surface element of a given type to an existing mesh object
+   DLL_HEADER 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);
+   }
+
+
+
+
+   // Manually add a volume element of a given type to an existing mesh object
+   DLL_HEADER 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);
+   }
+
+
+
+
+   // Obtain the number of points in the mesh
+   DLL_HEADER int Ng_GetNP (Ng_Mesh * mesh)
+   {
+      return ((Mesh*)mesh) -> GetNP();
+   }
+
+
+
+
+   // Obtain the number of surface elements in the mesh
+   DLL_HEADER int Ng_GetNSE (Ng_Mesh * mesh)
+   {
+      return ((Mesh*)mesh) -> GetNSE();
+   }
+
+
+
+
+   // Obtain the number of volume elements in the mesh
+   DLL_HEADER int Ng_GetNE (Ng_Mesh * mesh)
+   {
+      return ((Mesh*)mesh) -> GetNE();
+   }
+
+
+
+
+   //  Return point coordinates of a given point index in the mesh
+   DLL_HEADER 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 the surface element at a given index "pi"
+   DLL_HEADER 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: 
+         switch (el.GetNV())
+         {
+         case 3: et = NG_TRIG6; break;
+         case 4: et = NG_QUAD6; break;
+         default:
+            et = NG_TRIG6; break;
+         }
+         break;
+      case 8: et = NG_QUAD8; break;
+      default:
+         et = NG_TRIG; break; // for the compiler
+      }
+      return et;
+   }
+
+
+
+
+   // Return the volume element at a given index "pi"
+   DLL_HEADER 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;
+      default:
+         et = NG_TET; break; // for the compiler
+      }
+      return et;
+   }
+
+
+
+
+   // Set a global limit on the maximum mesh size allowed
+   DLL_HEADER void Ng_RestrictMeshSizeGlobal (Ng_Mesh * mesh, double h)
+   {
+      ((Mesh*)mesh) -> SetGlobalH (h);
+   }
+
+
+
+
+   // Set a local limit on the maximum mesh size allowed around the given point
+   DLL_HEADER void Ng_RestrictMeshSizePoint (Ng_Mesh * mesh, double * p, double h)
+   {
+      ((Mesh*)mesh) -> RestrictLocalH (Point3d (p[0], p[1], p[2]), h);
+   }
+
+
+
+
+   // Set a local limit on the maximum mesh size allowed within a given box region
+   DLL_HEADER void Ng_RestrictMeshSizeBox (Ng_Mesh * mesh, double * pmin, double * pmax, double h)
+   {
+      for (double x = pmin[0]; x < pmax[0]; x += h)
+         for (double y = pmin[1]; y < pmax[1]; y += h)
+            for (double z = pmin[2]; z < pmax[2]; z += h)
+               ((Mesh*)mesh) -> RestrictLocalH (Point3d (x, y, z), h);
+   }
+
+
+
+
+   // Generates volume mesh from an existing surface mesh
+   DLL_HEADER Ng_Result Ng_GenerateVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp)
+   {
+      Mesh * m = (Mesh*)mesh;
+
+      // Philippose - 30/08/2009
+      // Do not locally re-define "mparam" here... "mparam" is a global 
+      // object 
+      //MeshingParameters mparam;
+      mp->Transfer_Parameters();
+
+      m->CalcLocalH(mparam.grading);
+
+      MeshVolume (mparam, *m);
+      RemoveIllegalElements (*m);
+      OptimizeVolume (mparam, *m);
+
+      return NG_OK;
+   }
+
+
+
+
+   /* ------------------ 2D Meshing Functions ------------------------- */
+   DLL_HEADER void Ng_AddPoint_2D (Ng_Mesh * mesh, double * x)
+   {
+      Mesh * m = (Mesh*)mesh;
+
+      m->AddPoint (Point3d (x[0], x[1], 0));
+   }
+
+
+
+
+   DLL_HEADER void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2)
+   {
+      Mesh * m = (Mesh*)mesh;
+
+      Segment seg;
+      seg[0] = pi1;
+      seg[1] = pi2;
+      m->AddSegment (seg);
+   }
+
+
+
+
+   DLL_HEADER int Ng_GetNP_2D (Ng_Mesh * mesh)
+   {
+      Mesh * m = (Mesh*)mesh;
+      return m->GetNP();
+   }
+
+
+
+
+   DLL_HEADER int Ng_GetNE_2D (Ng_Mesh * mesh)
+   {
+      Mesh * m = (Mesh*)mesh;
+      return m->GetNSE();
+   }
+
+
+
+
+   DLL_HEADER int Ng_GetNSeg_2D (Ng_Mesh * mesh)
+   {
+      Mesh * m = (Mesh*)mesh;
+      return m->GetNSeg();
+   }
+
+
+
+
+   DLL_HEADER void Ng_GetPoint_2D (Ng_Mesh * mesh, int num, double * x)
+   {
+      Mesh * m = (Mesh*)mesh;
+
+      Point<3> & p = m->Point(num);
+      x[0] = p(0);
+      x[1] = p(1);
+   }
+
+
+
+
+   DLL_HEADER Ng_Surface_Element_Type
+      Ng_GetElement_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum)
+   {
+      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: 
+         switch (el.GetNV())
+         {
+         case 3: et = NG_TRIG6; break;
+         case 4: et = NG_QUAD6; break;
+         default:
+            et = NG_TRIG6; break;
+         }
+         break;
+      case 8: et = NG_QUAD8; break;
+      default:
+         et = NG_TRIG; break; // for the compiler
+      }
+
+      if (matnum)
+         *matnum = el.GetIndex();
+
+      return et;
+   }
+
+
+
+
+   DLL_HEADER void Ng_GetSegment_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum)
+   {
+      const Segment & seg = ((Mesh*)mesh)->LineSegment(num);
+      pi[0] = seg[0];
+      pi[1] = seg[1];
+
+      if (matnum)
+         *matnum = seg.edgenr;
+   }
+
+
+
+
+   DLL_HEADER Ng_Geometry_2D * Ng_LoadGeometry_2D (const char * filename)
+   {
+      SplineGeometry2d * geom = new SplineGeometry2d();
+      geom -> Load (filename);
+      return (Ng_Geometry_2D *)geom;
+   }
+
+
+
+
+   DLL_HEADER Ng_Result Ng_GenerateMesh_2D (Ng_Geometry_2D * geom,
+                                            Ng_Mesh ** mesh,
+                                            Ng_Meshing_Parameters * mp)
+   {
+      // use global variable mparam
+      //  MeshingParameters mparam;  
+      mp->Transfer_Parameters();
+
+      Mesh * m;
+      MeshFromSpline2D (*(SplineGeometry2d*)geom, m, mparam);
+
+      cout << m->GetNSE() << " elements, " << m->GetNP() << " points" << endl;
+
+      *mesh = (Ng_Mesh*)m;
+      return NG_OK;
+   }
+
+
+
+
+   DLL_HEADER void Ng_HP_Refinement (Ng_Geometry_2D * geom,
+      Ng_Mesh * mesh,
+      int levels)
+   {
+      Refinement2d ref(*(SplineGeometry2d*)geom);
+      HPRefinement (*(Mesh*)mesh, &ref, levels);
+   }
+
+
+
+
+   DLL_HEADER void Ng_HP_Refinement (Ng_Geometry_2D * geom,
+      Ng_Mesh * mesh,
+      int levels, double parameter)
+   {
+      Refinement2d ref(*(SplineGeometry2d*)geom);
+      HPRefinement (*(Mesh*)mesh, &ref, levels, parameter);
+   }
+
+
+
+
+   Array<STLReadTriangle> readtrias; //only before initstlgeometry
+   Array<Point<3> > readedges; //only before init stlgeometry
+
+   // loads geometry from STL file
+   DLL_HEADER 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
+   DLL_HEADER Ng_STL_Geometry * Ng_STL_NewGeometry ()
+   {
+      return (Ng_STL_Geometry*)(void*)new STLGeometry;
+   } 
+
+
+
+
+   // after adding triangles (and edges) initialize
+   DLL_HEADER Ng_Result Ng_STL_InitSTLGeometry (Ng_STL_Geometry * geom)
+   {
+      STLGeometry* geo = (STLGeometry*)geom;
+      geo->InitSTLGeometry(readtrias);
+      readtrias.SetSize(0);
+
+      if (readedges.Size() != 0)
+      {
+         /*
+         for (int 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:
+   DLL_HEADER Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom,
+                                          Ng_Mesh* mesh,
+                                          Ng_Meshing_Parameters * mp)
+   {
+      STLGeometry* stlgeometry = (STLGeometry*)geom;
+      Mesh* me = (Mesh*)mesh;
+
+      // Philippose - 27/07/2009
+      // Do not locally re-define "mparam" here... "mparam" is a global 
+      // object 
+      //MeshingParameters mparam;
+      mp->Transfer_Parameters();
+
+      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.
+   DLL_HEADER Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom,
+                                                    Ng_Mesh* mesh,
+                                                    Ng_Meshing_Parameters * mp)
+   {
+      STLGeometry* stlgeometry = (STLGeometry*)geom;
+      Mesh* me = (Mesh*)mesh;
+
+      // Philippose - 27/07/2009
+      // Do not locally re-define "mparam" here... "mparam" is a global 
+      // object
+      //MeshingParameters mparam;
+      mp->Transfer_Parameters();
+
+
+      /*
+      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
+   DLL_HEADER 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:
+   DLL_HEADER 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]));
+   }
+
+
+
+
+#ifdef OCCGEOMETRY
+   // --------------------- OCC Geometry / Meshing Utility Functions -------------------
+   // Create new OCC Geometry Object
+   DLL_HEADER Ng_OCC_Geometry * Ng_OCC_NewGeometry ()
+   {
+      return (Ng_OCC_Geometry*)(void*)new OCCGeometry;
+   } 
+
+
+
+
+   // Delete the OCC Geometry Object
+   DLL_HEADER Ng_Result Ng_OCC_DeleteGeometry(Ng_OCC_Geometry * geom)
+   {
+      if (geom != NULL)
+      {
+         delete (OCCGeometry*)geom;
+         geom = NULL;
+         return NG_OK;
+      }
+      
+      return NG_ERROR;
+   }
+
+
+
+   
+   // Loads geometry from STEP File
+   DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_STEP (const char * filename)
+   {
+      // Call the STEP File Load function. Note.. the geometry class 
+      // is created and instantiated within the load function
+      OCCGeometry * occgeo = LoadOCC_STEP(filename);
+
+      return ((Ng_OCC_Geometry *)occgeo);
+   }
+
+
+
+   
+   // Loads geometry from IGES File
+   DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_IGES (const char * filename)
+   {
+      // Call the IGES File Load function. Note.. the geometry class 
+      // is created and instantiated within the load function
+      OCCGeometry * occgeo = LoadOCC_IGES(filename);
+
+      return ((Ng_OCC_Geometry *)occgeo);
+   }
+
+
+
+   
+   // Loads geometry from BREP File
+   DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_BREP (const char * filename)
+   {
+      // Call the BREP File Load function. Note.. the geometry class 
+      // is created and instantiated within the load function
+      OCCGeometry * occgeo = LoadOCC_BREP(filename);
+
+      return ((Ng_OCC_Geometry *)occgeo);
+   }
+
+
+
+
+   // Locally limit the size of the mesh to be generated at various points 
+   // based on the topology of the geometry
+   DLL_HEADER Ng_Result Ng_OCC_SetLocalMeshSize (Ng_OCC_Geometry * geom,
+                                                 Ng_Mesh * mesh,
+                                                 Ng_Meshing_Parameters * mp)
+   {
+      OCCGeometry * occgeom = (OCCGeometry*)geom;
+      Mesh * me = (Mesh*)mesh;
+
+      me->geomtype = Mesh::GEOM_OCC;
+
+      mp->Transfer_Parameters();
+      
+      occparam.resthcloseedgeenable = mp->closeedgeenable;
+      occparam.resthcloseedgefac = mp->closeedgefact;
+
+      // Delete the mesh structures in order to start with a clean 
+      // slate
+      me->DeleteMesh();
+
+      OCCSetLocalMeshSize(*occgeom, *me);
+
+      return(NG_OK);
+   }
+
+
+
+   
+   // Mesh the edges and add Face descriptors to prepare for surface meshing
+   DLL_HEADER Ng_Result Ng_OCC_GenerateEdgeMesh (Ng_OCC_Geometry * geom,
+                                                 Ng_Mesh * mesh,
+                                                 Ng_Meshing_Parameters * mp)
+   {
+      OCCGeometry * occgeom = (OCCGeometry*)geom;
+      Mesh * me = (Mesh*)mesh;
+
+      mp->Transfer_Parameters();
+
+      OCCFindEdges(*occgeom, *me);
+
+      if((me->GetNP()) && (me->GetNFD()))
+      {
+         return NG_OK;
+      }
+      else
+      {
+         return NG_ERROR;
+      }
+   }
+
+
+
+   
+   // Mesh the edges and add Face descriptors to prepare for surface meshing
+   DLL_HEADER Ng_Result Ng_OCC_GenerateSurfaceMesh (Ng_OCC_Geometry * geom,
+                                                    Ng_Mesh * mesh,
+                                                    Ng_Meshing_Parameters * mp)
+   {
+      int numpoints = 0;
+
+      OCCGeometry * occgeom = (OCCGeometry*)geom;
+      Mesh * me = (Mesh*)mesh;
+
+      // Set the internal meshing parameters structure from the nglib meshing 
+      // parameters structure
+      mp->Transfer_Parameters();
+
+
+      // Only go into surface meshing if the face descriptors have already been added
+      if(!me->GetNFD())
+         return NG_ERROR;
+
+      numpoints = me->GetNP();
+
+      // Initially set up only for surface meshing without any optimisation
+      int perfstepsend = MESHCONST_MESHSURFACE;
+
+      // Check and if required, enable surface mesh optimisation step
+      if(mp->optsurfmeshenable)
+      {
+         perfstepsend = MESHCONST_OPTSURFACE;
+      }
+
+      OCCMeshSurface(*occgeom, *me, perfstepsend);
+
+      me->CalcSurfacesOfNode();
+      
+      if(me->GetNP() <= numpoints)
+         return NG_ERROR;
+
+      if(me->GetNSE() <= 0)
+         return NG_ERROR;
+
+      return NG_OK;
+   }
+
+
+
+
+   // Extract the face map from the OCC geometry
+   // The face map basically gives an index to each face in the geometry, 
+   // which can be used to access a specific face
+   DLL_HEADER Ng_Result Ng_OCC_GetFMap(Ng_OCC_Geometry * geom, 
+                                       Ng_OCC_TopTools_IndexedMapOfShape * FMap)
+   {
+      OCCGeometry* occgeom = (OCCGeometry*)geom;
+      TopTools_IndexedMapOfShape *occfmap = (TopTools_IndexedMapOfShape *)FMap;
+
+      // Copy the face map from the geometry to the given variable
+      occfmap->Assign(occgeom->fmap);
+
+      if(occfmap->Extent())
+      {
+         return NG_OK;
+      }
+      else
+      {
+         return NG_ERROR;
+      }
+   }
+
+   // ------------------ End - OCC Geometry / Meshing Utility Functions ----------------
+#endif
+
+
+
+
+   // ------------------ Begin - Meshing Parameters related functions ------------------
+   // Constructor for the local nglib meshing parameters class
+   DLL_HEADER Ng_Meshing_Parameters :: Ng_Meshing_Parameters()
+   {
+      uselocalh = 1;
+
+      maxh = 1000;
+      minh = 0.0;
+
+      fineness = 0.5;
+      grading = 0.3;
+
+      elementsperedge = 2.0;
+      elementspercurve = 2.0;
+
+      closeedgeenable = 0;
+      closeedgefact = 2.0;
+
+      second_order = 0;
+      quad_dominated = 0;
+
+      meshsize_filename = 0;
+
+      optsurfmeshenable = 1;
+      optvolmeshenable = 1;
+
+      optsteps_2d = 3;
+      optsteps_3d = 3;
+
+      invert_tets = 0;
+      invert_trigs = 0;
+
+      check_overlap = 1;
+      check_overlapping_boundary = 1;
+   }
+
+
+
+
+   // Reset the local meshing parameters to the default values
+   DLL_HEADER void Ng_Meshing_Parameters :: Reset_Parameters()
+   {
+      uselocalh = 1;
+
+      maxh = 1000;
+      minh = 0;
+
+      fineness = 0.5;
+      grading = 0.3;
+
+      elementsperedge = 2.0;
+      elementspercurve = 2.0;
+
+      closeedgeenable = 0;
+      closeedgefact = 2.0;
+
+      second_order = 0;
+      quad_dominated = 0;
+
+      meshsize_filename = 0;
+
+      optsurfmeshenable = 1;
+      optvolmeshenable = 1;
+
+      optsteps_2d = 3;
+      optsteps_3d = 3;
+
+      invert_tets = 0;
+      invert_trigs = 0;
+
+      check_overlap = 1;
+      check_overlapping_boundary = 1;
+   }
+
+
+
+
+   // 
+   DLL_HEADER void Ng_Meshing_Parameters :: Transfer_Parameters()
+   {
+      mparam.uselocalh = uselocalh;
+      
+      mparam.maxh = maxh;
+      mparam.minh = minh;
+
+      mparam.grading = grading;
+      mparam.curvaturesafety = elementspercurve;
+      mparam.segmentsperedge = elementsperedge;
+
+      mparam.secondorder = second_order;
+      mparam.quad = quad_dominated;
+
+      mparam.meshsizefilename = meshsize_filename;
+
+      mparam.optsteps2d = optsteps_2d;
+      mparam.optsteps3d = optsteps_3d;
+
+      mparam.inverttets = invert_tets;
+      mparam.inverttrigs = invert_trigs;
+
+      mparam.checkoverlap = check_overlap;
+      mparam.checkoverlappingboundary = check_overlapping_boundary;
+   }
+   // ------------------ End - Meshing Parameters related functions --------------------
+
+
+
+
+   // ------------------ Begin - Second Order Mesh generation functions ----------------
+   DLL_HEADER void Ng_Generate_SecondOrder(Ng_Mesh * mesh)
+   {
+      Refinement ref;
+      ref.MakeSecondOrder(*(Mesh*) mesh);
+   }
+
+
+
+
+   DLL_HEADER void Ng_2D_Generate_SecondOrder(Ng_Geometry_2D * geom,
+					  Ng_Mesh * mesh)
+   {
+      ( (SplineGeometry2d*)geom ) -> GetRefinement().MakeSecondOrder( * (Mesh*) mesh );
+   }
+
+
+
+
+   DLL_HEADER void Ng_STL_Generate_SecondOrder(Ng_STL_Geometry * geom,
+					   Ng_Mesh * mesh)
+   {
+      ((STLGeometry*)geom)->GetRefinement().MakeSecondOrder(*(Mesh*) mesh);
+   }
+
+
+
+
+   DLL_HEADER void Ng_CSG_Generate_SecondOrder (Ng_CSG_Geometry * geom,
+					   Ng_Mesh * mesh)
+   {
+      ((CSGeometry*)geom)->GetRefinement().MakeSecondOrder(*(Mesh*) mesh);
+   }
+
+
+
+
+#ifdef OCCGEOMETRY
+   DLL_HEADER void Ng_OCC_Generate_SecondOrder (Ng_OCC_Geometry * geom,
+                  Ng_Mesh * mesh)
+   {
+      ((OCCGeometry*)geom )->GetRefinement().MakeSecondOrder(*(Mesh*) mesh);
+   }
+#endif
+   // ------------------ End - Second Order Mesh generation functions ------------------
+
+
+
+
+   // ------------------ Begin - Uniform Mesh Refinement functions ---------------------
+   DLL_HEADER void Ng_Uniform_Refinement (Ng_Mesh * mesh)
+   {
+      Refinement ref;
+      ref.Refine ( * (Mesh*) mesh );
+   }
+
+
+
+
+   DLL_HEADER void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom,
+      Ng_Mesh * mesh)
+   {
+      ( (SplineGeometry2d*)geom ) -> GetRefinement().Refine ( * (Mesh*) mesh );
+   }
+
+
+
+
+   DLL_HEADER void Ng_STL_Uniform_Refinement (Ng_STL_Geometry * geom,
+      Ng_Mesh * mesh)
+   {
+      ( (STLGeometry*)geom ) -> GetRefinement().Refine ( * (Mesh*) mesh );
+   }
+
+
+
+
+   DLL_HEADER void Ng_CSG_Uniform_Refinement (Ng_CSG_Geometry * geom,
+      Ng_Mesh * mesh)
+   {
+      ( (CSGeometry*)geom ) -> GetRefinement().Refine ( * (Mesh*) mesh );
+   }
+
+
+
+
+#ifdef OCCGEOMETRY
+   DLL_HEADER void Ng_OCC_Uniform_Refinement (Ng_OCC_Geometry * geom,
+      Ng_Mesh * mesh)
+   {
+      ( (OCCGeometry*)geom ) -> GetRefinement().Refine ( * (Mesh*) mesh );
+   }
+#endif
+   // ------------------ End - Uniform Mesh Refinement functions -----------------------
+} // End of namespace nglib
+
+
+
+
+// compatibility functions:
+namespace netgen 
+{
+   char geomfilename[255];
+
+   DLL_HEADER void MyError (const char * ch)
+   {
+      cerr << ch;
+   }
+
+
+
+
+   //Destination for messages, errors, ...
+   DLL_HEADER void Ng_PrintDest(const char * s)
+   {
+      (*mycout) << s << flush;
+   }
+
+
+
+
+   DLL_HEADER double GetTime ()
+   {
+      return 0;
+   }
+
+
+
+
+   void ResetTime ()
+   {
+      ;
+   }
+
+
+
+
+   void MyBeep (int i)
+   {
+      ;
+   }
+
+
+
+
+   void Render()
+   {
+      ; 
+   }
+} // End of namespace netgen
+
+
+
+
+void Ng_Redraw () { ; }
+void Ng_ClearSolutionData () { ; }
+void Ng_SetSolutionData (Ng_SolutionData * soldata) { ; }
+void Ng_InitSolutionData (Ng_SolutionData * soldata) { ; }
+
+
diff --git a/contrib/Netgen/nglib/nglib.h b/contrib/Netgen/nglib/nglib.h
new file mode 100644
index 0000000000000000000000000000000000000000..be9edb7b7adb74fb9aac731ae484c6dea1dc4429
--- /dev/null
+++ b/contrib/Netgen/nglib/nglib.h
@@ -0,0 +1,744 @@
+#ifndef NGLIB
+#define NGLIB
+
+/**************************************************************************/
+/* File:   nglib.h                                                        */
+/* Author: Joachim Schoeberl                                              */
+/* Date:   7. May. 2000                                                   */
+/**************************************************************************/
+
+/*!
+   \file nglib.h
+   \brief Library interface to the netgen meshing kernel
+   \author Joachim Schoeberl
+   \date 7. May 2000
+
+   This header file provides access to the core functionality of the Netgen 
+   Mesher via a library interface, without an interactive User Interface.
+
+   The intention of providing these set of functions is to allow system 
+   developers to integrate Netgen into top-level code, to act as the low 
+   level mesh generation / optimisation kernel.  
+*/
+
+// Philippose - 14.02.2009
+// Modifications for creating a DLL in Windows
+#ifdef WIN32
+   #ifdef NGLIB_EXPORTS || nglib_EXPORTS
+      #define DLL_HEADER   __declspec(dllexport)
+   #else
+      #define DLL_HEADER   __declspec(dllimport)
+   #endif
+#else
+   #define DLL_HEADER 
+#endif
+
+
+
+// ** Constants used within Netgen *********************
+/// Maximum allowed number of nodes per volume element
+#define NG_VOLUME_ELEMENT_MAXPOINTS 10
+
+/// Maximum allowed number of nodes per surface element
+#define NG_SURFACE_ELEMENT_MAXPOINTS 8
+
+
+
+// *** Data-types for accessing Netgen functionality ***
+/// Data type for NETGEN mesh
+typedef void * Ng_Mesh;
+
+/// Data type for NETGEN CSG geometry
+typedef void * Ng_CSG_Geometry;
+
+/// Data type for NETGEN 2D geometry
+typedef void * Ng_Geometry_2D;
+
+/// Data type for NETGEN STL geometry
+typedef void * Ng_STL_Geometry;
+
+#ifdef OCCGEOMETRY
+/// Data type for NETGEN OpenCascade geometry
+typedef void * Ng_OCC_Geometry;
+typedef void * Ng_OCC_TopTools_IndexedMapOfShape;
+#endif
+
+
+// *** Special Enum types used within Netgen ***********
+/// Currently implemented surface element types
+enum Ng_Surface_Element_Type 
+   { NG_TRIG = 1, NG_QUAD = 2, NG_TRIG6 = 3, NG_QUAD6 = 4, NG_QUAD8 = 5 };
+
+/// Currently implemented volume element types
+enum Ng_Volume_Element_Type 
+   { NG_TET = 1, NG_PYRAMID = 2, NG_PRISM = 3, NG_TET10 = 4 };
+
+/// Values returned by Netgen functions
+enum Ng_Result 
+   { 
+     NG_ERROR               = -1,   
+     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 
+   };
+
+
+
+// *** Classes required for use within Netgen **********
+/// Netgen Meshing Parameters class
+class Ng_Meshing_Parameters 
+{
+public:
+   int uselocalh;                      //!< Switch to enable / disable usage of local mesh size modifiers
+
+   double maxh;                        //!< Maximum global mesh size allowed
+   double minh;                        //!< Minimum global mesh size allowed
+
+   double fineness;                    //!< Mesh density: 0...1 (0 => coarse; 1 => fine)
+   double grading;                     //!< Mesh grading: 0...1 (0 => uniform mesh; 1 => aggressive local grading)
+
+   double elementsperedge;             //!< Number of elements to generate per edge of the geometry
+   double elementspercurve;            //!< Elements to generate per curvature radius
+
+   int closeedgeenable;                //!< Enable / Disable mesh refinement at close edges
+   double closeedgefact;               //!< Factor to use for refinement at close edges (larger => finer)
+
+   int second_order;                   //!< Generate second-order surface and volume elements
+   int quad_dominated;                 //!< Creates a Quad-dominated mesh 
+
+   char * meshsize_filename;           //!< Optional external mesh size file 
+
+   int optsurfmeshenable;              //!< Enable / Disable automatic surface mesh optimization
+   int optvolmeshenable;               //!< Enable / Disable automatic volume mesh optimization
+
+   int optsteps_3d;                     //!< Number of optimize steps to use for 3-D mesh optimization
+   int optsteps_2d;                     //!< Number of optimize steps to use for 2-D mesh optimization
+
+   // Philippose - 13/09/2010
+   // Added a couple more parameters into the meshing parameters list 
+   // from Netgen into Nglib
+   int invert_tets;                    //!< Invert all the volume elements
+   int invert_trigs;                   //!< Invert all the surface triangle elements
+
+   int check_overlap;                  //!< Check for overlapping surfaces during Surface meshing
+   int check_overlapping_boundary;     //!< Check for overlapping surface elements before volume meshing
+
+
+   /*!
+      Default constructor for the Mesh Parameters class
+
+      Note: This constructor initialises the variables in the 
+      class with the following default values
+      - #uselocalh: 1
+      - #maxh: 1000.0
+      - #fineness: 0.5
+      - #grading: 0.3
+      - #elementsperedge: 2.0
+      - #elementspercurve: 2.0
+      - #closeedgeenable: 0
+      - #closeedgefact: 2.0
+      - #secondorder: 0
+      - #meshsize_filename: null
+      - #quad_dominated: 0
+      - #optsurfmeshenable: 1
+      - #optvolmeshenable: 1
+      - #optsteps_2d: 3
+      - #optsteps_3d: 3
+      - #invert_tets: 0
+      - #invert_trigs:0 
+      - #check_overlap: 1
+      - #check_overlapping_boundary: 1
+   */
+   DLL_HEADER Ng_Meshing_Parameters();
+
+
+
+   /*!
+       Reset the meshing parameters to their defaults
+
+       This member function resets all the meshing parameters 
+       of the object to the default values
+   */
+   DLL_HEADER void Reset_Parameters();
+
+
+
+   /*!
+       Transfer local meshing parameters to internal meshing parameters
+
+       This member function transfers all the meshing parameters 
+       defined in the local meshing parameters structure of nglib into 
+       the internal meshing parameters structure used by the Netgen core
+   */
+   DLL_HEADER void Transfer_Parameters();
+};
+
+
+
+
+// *** Functions Exported by this Library *************
+
+// ------------------------------------------------------------------
+// Netgen library initialisation / destruction functions
+
+/*! \brief Initialise the Netgen library and prepare for use
+
+    This function needs to be called by the third-party 
+    program before beginning to use the other Netgen 
+    specific functions.
+*/
+DLL_HEADER void Ng_Init ();
+
+
+/*! \brief Exit the Netgen meshing kernel in a clean manner
+
+    Use this function to exit the meshing sub-system in 
+    a clean and orderly manner.
+*/
+DLL_HEADER void Ng_Exit ();
+  
+
+/*! \brief Create a new (and empty) Netgen Mesh Structure
+
+    This function creates a new Netgen Mesh, initialises 
+    it, and returns a pointer to the created mesh structure. 
+
+    Use the returned pointer for subsequent operations 
+    which involve mesh operations.
+
+    \return Ng_Mesh Pointer to a Netgen Mesh type #Ng_Mesh
+*/
+DLL_HEADER  Ng_Mesh * Ng_NewMesh ();
+
+
+/*! \brief Delete an existing Netgen Mesh Structure
+
+    Use this function to delete an existing Netgen mesh 
+    structure and release the used memory. 
+
+    \param mesh Pointer to an existing Netgen Mesh structure 
+                of type #Ng_Mesh
+*/
+DLL_HEADER void Ng_DeleteMesh (Ng_Mesh * mesh);
+
+
+/*! \brief Save a Netgen Mesh to disk
+
+    This function allows a generated mesh structure to be saved 
+    to disk.
+
+    A Mesh saved using this function, will be written to disk 
+    in the Netgen VOL file format.
+
+    \param mesh    Pointer to an existing Netgen Mesh structure 
+                   of type #Ng_Mesh
+    \param filename Pointer to a character array containing the 
+                    name of the file to which the mesh should 
+                    be saved
+*/
+DLL_HEADER void Ng_SaveMesh(Ng_Mesh * mesh, const char* filename);
+
+
+/*! \brief Load a Netgen VOL Mesh from disk into memory
+
+    A Netgen mesh saved in the internal VOL format can be loaded 
+    into a Netgen Mesh structure using this function. 
+
+    \param filename Pointer to a character array containing the 
+                    name of the file to load
+    \return Ng_Mesh Pointer to a Netgen Mesh type #Ng_Mesh containing 
+                    the mesh loaded from disk
+*/
+DLL_HEADER Ng_Mesh * Ng_LoadMesh(const char* filename);
+
+
+/*! \brief Merge a Netgen VOL Mesh from disk into an existing mesh in memory
+
+    A Netgen mesh saved in the internal VOL format can be merged 
+    into an existing Netgen Mesh structure using this function. 
+
+    \param mesh       Name of the Mesh structure already existent in memory
+    \param filename   Pointer to a character array containing the 
+                      name of the file to load
+    \return Ng_Result Status of the merge operation
+*/
+DLL_HEADER Ng_Result Ng_MergeMesh(Ng_Mesh * mesh, const char* filename);
+
+
+/*! \brief Merge one Netgen Mesh into another Netgen Mesh in the case 
+    when both are already in memory
+
+    (NOTE: FUNCTION STILL WORK IN PROGRESS!!!)
+
+    This function can be used to merge two Netgen meshes already present 
+    in memory.
+
+    \param mesh1      Parent Mesh structure into which the second mesh 
+                      will be merged
+    \param mesh2      Child mesh structure which will get merged into 
+                      the parent mesh
+    \return Ng_Result Status of the merge operation
+*/
+DLL_HEADER Ng_Result Ng_MergeMesh(Ng_Mesh * mesh1, Ng_Mesh * mesh2);
+// ------------------------------------------------------------------
+
+
+
+// ------------------------------------------------------------------
+// Basic Meshing functions for manually adding points, surface elements 
+// and volume elements to a Netgen Mesh structure
+
+/*! \brief Add a point to a given Netgen Mesh Structure
+
+    This function allows points to be directly added to a Netgen 
+    mesh structure by providing the co-ordinates.
+
+    Each call to the function allows only one point to be added.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \param x    Pointer to an array of type double containing the co-ordinates 
+                of the point to be added in the form: \n
+                - x[0] = X co-ordinate
+                - x[1] = Y co-ordinate
+                - x[2] = Z co-ordinate
+*/
+DLL_HEADER void Ng_AddPoint (Ng_Mesh * mesh, double * x);
+
+
+/*! \brief Add a surface element to a given Netgen Mesh Structure
+
+    This function allows the top-level code to directly add individual 
+    Surface Elements to a Netgen Mesh Structure by providing the type of 
+    element to be added and the indices of the points which constitute the 
+    element.
+
+    <i>Note:</i> 
+    - The points referred to by the surface elements must have been
+      added prior to calling this function. 
+    - Currently only triangular elements are supported, and the Surface Element 
+      Type argument is not used.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \param et   Surface Element type provided via the enumerated type 
+                #Ng_Surface_Element_Type 
+    \param pi   Pointer to an array of integers containing the indices of the 
+                points which constitute the surface element being added
+*/
+DLL_HEADER void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et, int * pi);
+
+
+/*! \brief Add a volume element to a given Netgen Mesh Structure
+
+    This function allows the top-level code to directly add individual 
+    Volume Elements to a Netgen Mesh Structure by providing the type of 
+    element to be added and the indices of the points which constitute the 
+    element.
+
+    <i>Note:</i> 
+    - The points referred to by the volume elements must have been
+      added prior to calling this function. 
+    - Currently only tetrahedral elements are supported, and the Volume Element 
+      Type argument is not used.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \param et   Volume Element type provided via the enumerated type 
+                #Ng_Volume_Element_Type 
+    \param pi   Pointer to an array of integers containing the indices of the 
+                points which constitute the volume element being added
+
+*/
+DLL_HEADER void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et, int * pi);
+  
+// ------------------------------------------------------------------
+
+
+
+// ------------------------------------------------------------------
+// Local Mesh Size restriction / limiting utilities
+
+/*! \brief Apply a global restriction on mesh element size
+
+    This utility allows the user to apply a global mesh element 
+    size limitation. 
+
+    During mesh creation, in the absence of an explicit local 
+    size restriction around the neighbourhood of a point within 
+    the meshing domain, this global size restriction will be 
+    utilised.
+
+    <b>Note</b>: This function only limits the <b>Maximum</b> 
+    size of an element within the mesh.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \param h    Variable of type <i>double</i>, specifying the maximum
+                allowable mesh size
+*/
+DLL_HEADER void Ng_RestrictMeshSizeGlobal (Ng_Mesh * mesh, double h);
+
+
+/*! \brief Locally restrict the mesh element size at the given point
+
+    Unlike the function #Ng_RestrictMeshSizeGlobal, this function 
+    allows the user to locally restrict the maximum allowable mesh 
+    size at a given point.
+
+    The point is specified via its three cartesian co-ordinates.
+
+    <b>Note</b>: This function only limits the <b>Maximum</b> size 
+    of the elements around the specified point.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \param p    Pointer to an Array of type <i>double</i>, containing 
+                the three co-ordinates of the point in the form: \n
+                - p[0] = X co-ordinate
+                - p[1] = Y co-ordinate
+                - p[2] = Z co-ordinate
+    \param h    Variable of type <i>double</i>, specifying the maximum
+                allowable mesh size at that point
+*/
+DLL_HEADER void Ng_RestrictMeshSizePoint (Ng_Mesh * mesh, double * p, double h);
+
+
+/*! \brief Locally restrict the mesh element size within a specified box
+
+    Similar to the function #Ng_RestrictMeshSizePoint, this function 
+    allows the size of elements within a mesh to be locally limited.
+
+    However, rather than limit the mesh size at a single point, this 
+    utility restricts the local mesh size within a 3D Box region, specified 
+    via the co-ordinates of the two diagonally opposite points of a cuboid.
+
+    <b>Note</b>: This function only limits the <b>Maximum</b> size 
+    of the elements within the specified region.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \param pmin Pointer to an Array of type <i>double</i>, containing 
+                the three co-ordinates of the first point of the cuboid: \n
+                - pmin[0] = X co-ordinate
+                - pmin[1] = Y co-ordinate
+                - pmin[2] = Z co-ordinate
+    \param pmax Pointer to an Array of type <i>double</i>, containing 
+                the three co-ordinates of the opposite point of the 
+                cuboid: \n
+                - pmax[0] = X co-ordinate
+                - pmax[1] = Y co-ordinate
+                - pmax[2] = Z co-ordinate
+    \param h    Variable of type <i>double</i>, specifying the maximum
+                allowable mesh size at that point
+*/
+DLL_HEADER void Ng_RestrictMeshSizeBox (Ng_Mesh * mesh, double * pmin, double * pmax, double h);
+
+// ------------------------------------------------------------------
+
+
+
+// ------------------------------------------------------------------
+// 3D Mesh Generation functions
+
+/*! \brief Create a 3D Volume Mesh given a Surface Mesh
+
+    After creating a surface mesh, this function can be utilised 
+    to automatically generate the corresponding 3D Volume Mesh.
+
+    Mesh generation parameters (such as grading, maximum element size, 
+    etc.) are specified via the meshing parameters class which also 
+    needs to be passed to this function.
+
+    <b>Note</b>: Currently, Netgen generates pure tetrahedral volume 
+    meshes.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \param mp   Pointer to a copy of the Meshing Parameters class
+                (#Ng_Meshing_Parameters), filled up with the 
+                required values
+
+    \return Ng_Result Status of the Mesh Generation routine. More 
+                      details regarding the return value can be 
+                      found in the description of #Ng_Result
+*/
+DLL_HEADER Ng_Result Ng_GenerateVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp);
+
+// ------------------------------------------------------------------
+
+
+
+// ------------------------------------------------------------------
+// Basic Mesh information functions
+
+/*! \brief Returns the Number of Points present in the specified Mesh
+
+    Given an already existent Netgen Mesh Structure, this function 
+    returns the number of points currently present within the Mesh.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \return 
+                Integer Data-type with the number of points in the Mesh
+*/
+DLL_HEADER int Ng_GetNP (Ng_Mesh * mesh);
+
+
+/*! \brief Returns the Number of Surface Elements present in the specified Mesh
+
+    Given an already existent Netgen Mesh Structure, this function 
+    returns the number of surface elements currently present within 
+    the Mesh.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \return 
+                Integer Data-type with the number of surface elements in the Mesh
+*/
+DLL_HEADER int Ng_GetNSE (Ng_Mesh * mesh);
+
+
+/*! \brief Returns the Number of Volume Elements present in the specified Mesh
+
+    Given an already existent Netgen Mesh Structure, this function 
+    returns the number of volume elements currently present within 
+    the Mesh.
+
+    \param mesh Pointer to an existing Netgen Mesh structure of 
+                type #Ng_Mesh
+    \return 
+                Integer Data-type with the number of volume elements in the Mesh
+*/
+DLL_HEADER int Ng_GetNE (Ng_Mesh * mesh);
+
+// ------------------------------------------------------------------
+
+
+
+// ------------------------------------------------------------------
+// Mesh Topology functions
+// Use these functions to extract points, surface / volume elements, 
+// perform topological searches, etc..etc...
+  
+//  Return the Point Coordinates of a specified Point
+// The x, y and z co-ordinates are returned in the array pointer as 
+// x[0] = x ; x[1] = y ; x[2] = z
+DLL_HEADER void Ng_GetPoint (Ng_Mesh * mesh, int num, double * x);
+
+
+
+// return surface and volume element in pi
+DLL_HEADER Ng_Surface_Element_Type 
+Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi);
+
+DLL_HEADER Ng_Volume_Element_Type
+Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi);
+
+// ------------------------------------------------------------------
+
+
+
+
+// **********************************************************
+// **   2D Meshing                                         **
+// **********************************************************
+
+
+// feeds points and boundary to mesh
+
+DLL_HEADER void Ng_AddPoint_2D (Ng_Mesh * mesh, double * x);
+DLL_HEADER void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2);
+  
+// ask for number of points, elements and boundary segments
+DLL_HEADER int Ng_GetNP_2D (Ng_Mesh * mesh);
+DLL_HEADER int Ng_GetNE_2D (Ng_Mesh * mesh);
+DLL_HEADER int Ng_GetNSeg_2D (Ng_Mesh * mesh);
+  
+//  return point coordinates
+DLL_HEADER void Ng_GetPoint_2D (Ng_Mesh * mesh, int num, double * x);
+
+// return 2d elements
+DLL_HEADER Ng_Surface_Element_Type 
+Ng_GetElement_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = NULL);
+
+// return 2d boundary segment
+DLL_HEADER void Ng_GetSegment_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = NULL);
+
+
+// load 2d netgen spline geometry
+DLL_HEADER Ng_Geometry_2D * Ng_LoadGeometry_2D (const char * filename);
+
+// generate 2d mesh, mesh is allocated by function
+DLL_HEADER Ng_Result Ng_GenerateMesh_2D (Ng_Geometry_2D * geom,
+                                         Ng_Mesh ** mesh,
+                                         Ng_Meshing_Parameters * mp);
+  
+DLL_HEADER void Ng_HP_Refinement (Ng_Geometry_2D * geom,
+                                  Ng_Mesh * mesh,
+                                  int levels);
+  
+
+
+
+
+// **********************************************************
+// **   STL Meshing                                        **
+// **********************************************************
+
+
+// loads geometry from STL file
+DLL_HEADER Ng_STL_Geometry * Ng_STL_LoadGeometry (const char * filename, int binary = 0);
+
+
+// generate new STL Geometry
+DLL_HEADER Ng_STL_Geometry * Ng_STL_NewGeometry ();
+  
+
+// fills STL Geometry
+// positive orientation
+// normal vector may be null-pointer
+DLL_HEADER void Ng_STL_AddTriangle (Ng_STL_Geometry * geom, 
+                         double * p1, double * p2, double * p3, 
+                         double * nv = NULL);
+
+// add (optional) edges :
+DLL_HEADER void Ng_STL_AddEdge (Ng_STL_Geometry * geom, 
+                     double * p1, double * p2);
+
+// after adding triangles (and edges) initialize
+DLL_HEADER Ng_Result Ng_STL_InitSTLGeometry (Ng_STL_Geometry * geom);
+
+// automatically generates edges:
+DLL_HEADER Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom,
+                            Ng_Mesh* mesh,
+                            Ng_Meshing_Parameters * mp);
+
+
+// generates mesh, empty mesh must be already created.
+DLL_HEADER Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom,
+                                                 Ng_Mesh * mesh,
+                                                 Ng_Meshing_Parameters * mp);
+
+
+#ifdef ACIS
+
+// **********************************************************
+// **   ACIS Meshing                                       **
+// **********************************************************
+
+/// Data type for NETGEN STL geomty
+typedef void * Ng_ACIS_Geometry;
+
+// loads geometry from STL file
+DLL_HEADER Ng_ACIS_Geometry * Ng_ACIS_LoadGeometry (const char * filename);
+  
+// generates mesh, empty mesh must be already created.
+DLL_HEADER Ng_Result Ng_ACIS_GenerateSurfaceMesh (Ng_ACIS_Geometry * geom,
+                                                  Ng_Mesh * mesh,
+                                                  Ng_Meshing_Parameters * mp);
+
+
+#endif
+
+
+
+#ifdef OCCGEOMETRY
+
+// **********************************************************
+// **   OpenCascade Geometry / Meshing Utilities           **
+// **********************************************************
+
+// Create new OCC Geometry Object
+DLL_HEADER Ng_OCC_Geometry * Ng_OCC_NewGeometry ();
+
+// Delete an OCC Geometry Object
+DLL_HEADER Ng_Result Ng_OCC_DeleteGeometry (Ng_OCC_Geometry * geom);
+
+// Loads geometry from STEP file
+DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_STEP (const char * filename);
+
+// Loads geometry from IGES file
+DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_IGES (const char * filename);
+
+// Loads geometry from BREP file
+DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_BREP (const char * filename);
+
+// Set the local mesh size based on geometry / topology
+DLL_HEADER Ng_Result Ng_OCC_SetLocalMeshSize (Ng_OCC_Geometry * geom,
+                                              Ng_Mesh * mesh,
+                                              Ng_Meshing_Parameters * mp);
+
+// Mesh the edges and add Face descriptors to prepare for surface meshing
+DLL_HEADER Ng_Result Ng_OCC_GenerateEdgeMesh (Ng_OCC_Geometry * geom,
+                                              Ng_Mesh * mesh,
+                                              Ng_Meshing_Parameters * mp);
+
+// Mesh the surfaces of an OCC geometry
+DLL_HEADER Ng_Result Ng_OCC_GenerateSurfaceMesh (Ng_OCC_Geometry * geom,
+                                                 Ng_Mesh * mesh,
+                                                 Ng_Meshing_Parameters * mp); 
+
+// Get the face map of an already loaded OCC geometry
+DLL_HEADER Ng_Result Ng_OCC_GetFMap(Ng_OCC_Geometry * geom, 
+                                    Ng_OCC_TopTools_IndexedMapOfShape * FMap);
+
+#endif // OCCGEOMETRY
+
+
+
+// **********************************************************
+// **   Mesh refinement algorithms                         **
+// **********************************************************
+
+// uniform mesh refinement
+DLL_HEADER void Ng_Uniform_Refinement (Ng_Mesh * mesh);
+
+
+// uniform mesh refinement with geometry adaption:
+
+DLL_HEADER void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom,
+					  Ng_Mesh * mesh);
+
+DLL_HEADER void Ng_STL_Uniform_Refinement (Ng_STL_Geometry * geom,
+					   Ng_Mesh * mesh);
+
+DLL_HEADER void Ng_CSG_Uniform_Refinement (Ng_CSG_Geometry * geom,
+					   Ng_Mesh * mesh);
+
+#ifdef OCCGEOMETRY
+DLL_HEADER void Ng_OCC_Uniform_Refinement (Ng_OCC_Geometry * geom,
+					   Ng_Mesh * mesh);
+#endif
+
+
+
+// **********************************************************
+// **   Second Order mesh algorithms                       **
+// **********************************************************
+
+// convert mesh to second order
+DLL_HEADER void Ng_Generate_SecondOrder (Ng_Mesh * mesh);
+
+
+// convert mesh to second order with geometry adaption:
+
+DLL_HEADER void Ng_2D_Generate_SecondOrder (Ng_Geometry_2D * geom,
+					  Ng_Mesh * mesh);
+
+DLL_HEADER void Ng_STL_Generate_SecondOrder (Ng_STL_Geometry * geom,
+					   Ng_Mesh * mesh);
+
+DLL_HEADER void Ng_CSG_Generate_SecondOrder (Ng_CSG_Geometry * geom,
+					   Ng_Mesh * mesh);
+
+#ifdef OCCGEOMETRY
+DLL_HEADER void Ng_OCC_Generate_SecondOrder (Ng_OCC_Geometry * geom,
+					   Ng_Mesh * mesh);
+#endif
+
+
+#endif // NGLIB
diff --git a/contrib/Netgen/nglib_addon.cpp b/contrib/Netgen/nglib_addon.cpp
deleted file mode 100644
index 2cca9971f9483c71d937a55f7c1c55196b8c4713..0000000000000000000000000000000000000000
--- a/contrib/Netgen/nglib_addon.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-// small additions to the netgen interface library for Gmsh
-
-#include "meshing.hpp"
-#include "mystdlib.h"
-
-namespace nglib {
-#include "nglib.h"
-}
-
-using namespace netgen;
-
-#include <iostream>
-#include "GmshMessage.h"
-
-namespace nglib
-{
-
-class mystreambuf : public streambuf {
-  int index;
-  char txt[1024];
- public:
-  mystreambuf() : index(0) {} 
-  int sync()
-  { 
-    txt[index] = '\0';
-    if(!index || (index == 1 && (txt[0] == '.' || txt[0] == '+' || txt[0] == ' '))){
-      // ignore these messages
-    }
-    else{
-      if(!strncmp(txt, "ERROR", 5))
-	Msg::Error(txt);
-      else
-	Msg::Info(txt);
-    }
-    index = 0; 
-    return 0; 
-  }
-  int overflow(int ch)
-  {
-    if(index < 1023){
-      txt[index] = ch;
-      if(txt[index] == '\n' || txt[index] == '\r') txt[index] = ' ';
-      if(!index && txt[0] == ' '){
-	// skip initial spaces
-      }
-      else{
-	index++;
-      }
-    }
-    return 0; 
-  }
-};
-
-// replaces the standard Ng_Init
-void NgAddOn_Init()
-{
-  //mycout = &cout;
-  //myerr = &cerr;
-  //testout = new ofstream ("test.out");
-  static bool first = true;
-  if(first){
-    first = false;
-    mycout = new ostream(new mystreambuf());
-    myerr = new ostream(new mystreambuf());
-    testout = new ofstream("/dev/null");
-  }
-}
-
-// generates volume mesh from surface mesh, without optimization
-Ng_Result NgAddOn_GenerateVolumeMesh(Ng_Mesh *mesh, double maxh)
-{
-  Mesh *m = (Mesh*)mesh;
-
-  MeshingParameters mparam;
-  mparam.uselocalh = 1;
-  mparam.maxh = maxh;
-  
-  try{
-    m->CalcLocalH();
-    MeshVolume(mparam, *m);
-    //RemoveIllegalElements(*m);
-    //OptimizeVolume(mparam, *m);
-  }
-  catch(netgen::NgException error){
-    return NG_VOLUME_FAILURE;
-  }
-  return NG_OK;
-}
-
-// optimizes an existing 3D mesh
-Ng_Result NgAddOn_OptimizeVolumeMesh(Ng_Mesh *mesh, double maxh)
-{
-  Mesh *m = (Mesh*)mesh;
-
-  MeshingParameters mparam;
-  mparam.uselocalh = 1;
-  mparam.maxh = maxh;
-
-  try{
-    m->CalcLocalH();
-    //MeshVolume(mparam, *m);
-    RemoveIllegalElements(*m);
-    OptimizeVolume(mparam, *m);
-  }
-  catch(netgen::NgException error){
-    return NG_VOLUME_FAILURE;
-  }
-  return NG_OK;
-}
-
-}
diff --git a/contrib/Netgen/nglib_addon.h b/contrib/Netgen/nglib_addon.h
deleted file mode 100644
index b587bdd004c71e03bd7a64981e36e290635b8544..0000000000000000000000000000000000000000
--- a/contrib/Netgen/nglib_addon.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef _NGLIB_ADDON_H_
-#define _NGLIB_ADDON_H_
-
-void NgAddOn_Init();
-Ng_Result NgAddOn_GenerateVolumeMesh(Ng_Mesh *mesh, double maxh);
-Ng_Result NgAddOn_OptimizeVolumeMesh(Ng_Mesh *mesh, double maxh);
-
-#endif