← Back to team overview

dolfin team mailing list archive

Merge request for some sandbox stuff

 

Hi!

While I am working on a implementation of Nitsche methods for overlapping 
meshes in DOLFIN I produce some sand, which might be nice to be added to the 
sandbox :) It contains among other things some prototypes for building a 
complete intersection map for two overlapping meshes (which cells/facets are 
covered by which cells/facest) and for barycenter quadrature formulas on 
arbitrary  polyhedrons and polygons (unfortunately just for the 3D case, up to 
now).

Kind regards, 
Andre
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: massing@xxxxxxxxx-20100406091417-ogh30d38n95eh5cq
# target_branch: bzr+ssh://bazaar.launchpad.net/~dolfin-\
#   core/dolfin/sandbox/
# testament_sha1: 74c2e1fd30a903bacbd8c50606cb683173e73813
# timestamp: 2010-04-06 11:15:17 +0200
# base_revision_id: logg@xxxxxxxxx-20100226124738-bk9jlyb9voycqbwa
# 
# Begin patch
=== renamed directory 'cgal' => 'nitsche_method'
=== added directory 'nitsche_method/data'
=== added directory 'nitsche_method/data/meshes'
=== added file 'nitsche_method/data/meshes/rotator.xml'
--- nitsche_method/data/meshes/rotator.xml	1970-01-01 00:00:00 +0000
+++ nitsche_method/data/meshes/rotator.xml	2010-03-16 14:39:09 +0000
@@ -0,0 +1,402 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<dolfin xmlns:dolfin="http://www.fenics.org/dolfin/";>
+  <mesh celltype="triangle" dim="2">
+    <vertices size="117">
+      <vertex index="0" x="-0.1" y="-1"/>
+      <vertex index="1" x="0" y="-1"/>
+      <vertex index="2" x="0" y="-0.9"/>
+      <vertex index="3" x="-0.1" y="-0.9"/>
+      <vertex index="4" x="0.1" y="-1"/>
+      <vertex index="5" x="0.1" y="-0.9"/>
+      <vertex index="6" x="0" y="-0.8"/>
+      <vertex index="7" x="-0.1" y="-0.8"/>
+      <vertex index="8" x="0.1" y="-0.8"/>
+      <vertex index="9" x="0" y="-0.7"/>
+      <vertex index="10" x="-0.1" y="-0.7"/>
+      <vertex index="11" x="0.1" y="-0.7"/>
+      <vertex index="12" x="0" y="-0.6"/>
+      <vertex index="13" x="-0.1" y="-0.6"/>
+      <vertex index="14" x="0.1" y="-0.6"/>
+      <vertex index="15" x="0" y="-0.5"/>
+      <vertex index="16" x="-0.1" y="-0.5"/>
+      <vertex index="17" x="0.1" y="-0.5"/>
+      <vertex index="18" x="0" y="-0.4"/>
+      <vertex index="19" x="-0.1" y="-0.4"/>
+      <vertex index="20" x="0.1" y="-0.4"/>
+      <vertex index="21" x="0" y="-0.3"/>
+      <vertex index="22" x="-0.1" y="-0.3"/>
+      <vertex index="23" x="0.1" y="-0.3"/>
+      <vertex index="24" x="0" y="-0.2"/>
+      <vertex index="25" x="-0.1" y="-0.2"/>
+      <vertex index="26" x="0.1" y="-0.2"/>
+      <vertex index="27" x="0" y="-0.1"/>
+      <vertex index="28" x="-0.1" y="-0.1"/>
+      <vertex index="29" x="0.1" y="-0.1"/>
+      <vertex index="30" x="-1" y="-0.1"/>
+      <vertex index="31" x="-0.9" y="-0.1"/>
+      <vertex index="32" x="-0.9" y="0"/>
+      <vertex index="33" x="-1" y="0"/>
+      <vertex index="34" x="-0.8" y="-0.1"/>
+      <vertex index="35" x="-0.8" y="0"/>
+      <vertex index="36" x="-0.7" y="-0.1"/>
+      <vertex index="37" x="-0.7" y="0"/>
+      <vertex index="38" x="-0.6" y="-0.1"/>
+      <vertex index="39" x="-0.6" y="0"/>
+      <vertex index="40" x="-0.5" y="-0.1"/>
+      <vertex index="41" x="-0.5" y="0"/>
+      <vertex index="42" x="-0.4" y="-0.1"/>
+      <vertex index="43" x="-0.4" y="0"/>
+      <vertex index="44" x="-0.3" y="-0.1"/>
+      <vertex index="45" x="-0.3" y="0"/>
+      <vertex index="46" x="-0.2" y="-0.1"/>
+      <vertex index="47" x="-0.2" y="0"/>
+      <vertex index="48" x="-0.1" y="0"/>
+      <vertex index="49" x="0" y="0"/>
+      <vertex index="50" x="0.1" y="0"/>
+      <vertex index="51" x="0.2" y="-0.1"/>
+      <vertex index="52" x="0.2" y="0"/>
+      <vertex index="53" x="0.3" y="-0.1"/>
+      <vertex index="54" x="0.3" y="0"/>
+      <vertex index="55" x="0.4" y="-0.1"/>
+      <vertex index="56" x="0.4" y="0"/>
+      <vertex index="57" x="0.5" y="-0.1"/>
+      <vertex index="58" x="0.5" y="0"/>
+      <vertex index="59" x="0.6" y="-0.1"/>
+      <vertex index="60" x="0.6" y="0"/>
+      <vertex index="61" x="0.7" y="-0.1"/>
+      <vertex index="62" x="0.7" y="0"/>
+      <vertex index="63" x="0.8" y="-0.1"/>
+      <vertex index="64" x="0.8" y="0"/>
+      <vertex index="65" x="0.9" y="-0.1"/>
+      <vertex index="66" x="0.9" y="0"/>
+      <vertex index="67" x="1" y="-0.1"/>
+      <vertex index="68" x="1" y="0"/>
+      <vertex index="69" x="-0.9" y="0.1"/>
+      <vertex index="70" x="-1" y="0.1"/>
+      <vertex index="71" x="-0.8" y="0.1"/>
+      <vertex index="72" x="-0.7" y="0.1"/>
+      <vertex index="73" x="-0.6" y="0.1"/>
+      <vertex index="74" x="-0.5" y="0.1"/>
+      <vertex index="75" x="-0.4" y="0.1"/>
+      <vertex index="76" x="-0.3" y="0.1"/>
+      <vertex index="77" x="-0.2" y="0.1"/>
+      <vertex index="78" x="-0.1" y="0.1"/>
+      <vertex index="79" x="0" y="0.1"/>
+      <vertex index="80" x="0.1" y="0.1"/>
+      <vertex index="81" x="0.2" y="0.1"/>
+      <vertex index="82" x="0.3" y="0.1"/>
+      <vertex index="83" x="0.4" y="0.1"/>
+      <vertex index="84" x="0.5" y="0.1"/>
+      <vertex index="85" x="0.6" y="0.1"/>
+      <vertex index="86" x="0.7" y="0.1"/>
+      <vertex index="87" x="0.8" y="0.1"/>
+      <vertex index="88" x="0.9" y="0.1"/>
+      <vertex index="89" x="1" y="0.1"/>
+      <vertex index="90" x="0" y="0.2"/>
+      <vertex index="91" x="-0.1" y="0.2"/>
+      <vertex index="92" x="0.1" y="0.2"/>
+      <vertex index="93" x="0" y="0.3"/>
+      <vertex index="94" x="-0.1" y="0.3"/>
+      <vertex index="95" x="0.1" y="0.3"/>
+      <vertex index="96" x="0" y="0.4"/>
+      <vertex index="97" x="-0.1" y="0.4"/>
+      <vertex index="98" x="0.1" y="0.4"/>
+      <vertex index="99" x="0" y="0.5"/>
+      <vertex index="100" x="-0.1" y="0.5"/>
+      <vertex index="101" x="0.1" y="0.5"/>
+      <vertex index="102" x="0" y="0.6"/>
+      <vertex index="103" x="-0.1" y="0.6"/>
+      <vertex index="104" x="0.1" y="0.6"/>
+      <vertex index="105" x="0" y="0.7"/>
+      <vertex index="106" x="-0.1" y="0.7"/>
+      <vertex index="107" x="0.1" y="0.7"/>
+      <vertex index="108" x="0" y="0.8"/>
+      <vertex index="109" x="-0.1" y="0.8"/>
+      <vertex index="110" x="0.1" y="0.8"/>
+      <vertex index="111" x="0" y="0.9"/>
+      <vertex index="112" x="-0.1" y="0.9"/>
+      <vertex index="113" x="0.1" y="0.9"/>
+      <vertex index="114" x="0" y="1"/>
+      <vertex index="115" x="-0.1" y="1"/>
+      <vertex index="116" x="0.1" y="1"/>
+    </vertices>
+    <cells size="152">
+      <triangle index="0" v0="0" v1="1" v2="2"/>
+      <triangle index="1" v0="0" v1="2" v2="3"/>
+      <triangle index="2" v0="1" v1="4" v2="5"/>
+      <triangle index="3" v0="1" v1="2" v2="5"/>
+      <triangle index="4" v0="2" v1="3" v2="6"/>
+      <triangle index="5" v0="3" v1="6" v2="7"/>
+      <triangle index="6" v0="2" v1="5" v2="8"/>
+      <triangle index="7" v0="2" v1="6" v2="8"/>
+      <triangle index="8" v0="6" v1="7" v2="9"/>
+      <triangle index="9" v0="7" v1="9" v2="10"/>
+      <triangle index="10" v0="6" v1="8" v2="11"/>
+      <triangle index="11" v0="6" v1="9" v2="11"/>
+      <triangle index="12" v0="9" v1="10" v2="12"/>
+      <triangle index="13" v0="10" v1="12" v2="13"/>
+      <triangle index="14" v0="9" v1="11" v2="14"/>
+      <triangle index="15" v0="9" v1="12" v2="14"/>
+      <triangle index="16" v0="12" v1="13" v2="15"/>
+      <triangle index="17" v0="13" v1="15" v2="16"/>
+      <triangle index="18" v0="12" v1="14" v2="17"/>
+      <triangle index="19" v0="12" v1="15" v2="17"/>
+      <triangle index="20" v0="15" v1="16" v2="18"/>
+      <triangle index="21" v0="16" v1="18" v2="19"/>
+      <triangle index="22" v0="15" v1="17" v2="20"/>
+      <triangle index="23" v0="15" v1="18" v2="20"/>
+      <triangle index="24" v0="18" v1="19" v2="21"/>
+      <triangle index="25" v0="19" v1="21" v2="22"/>
+      <triangle index="26" v0="18" v1="20" v2="23"/>
+      <triangle index="27" v0="18" v1="21" v2="23"/>
+      <triangle index="28" v0="21" v1="22" v2="24"/>
+      <triangle index="29" v0="22" v1="24" v2="25"/>
+      <triangle index="30" v0="21" v1="23" v2="26"/>
+      <triangle index="31" v0="21" v1="24" v2="26"/>
+      <triangle index="32" v0="24" v1="25" v2="27"/>
+      <triangle index="33" v0="25" v1="27" v2="28"/>
+      <triangle index="34" v0="24" v1="26" v2="29"/>
+      <triangle index="35" v0="24" v1="27" v2="29"/>
+      <triangle index="36" v0="30" v1="31" v2="32"/>
+      <triangle index="37" v0="30" v1="32" v2="33"/>
+      <triangle index="38" v0="31" v1="34" v2="35"/>
+      <triangle index="39" v0="31" v1="32" v2="35"/>
+      <triangle index="40" v0="34" v1="36" v2="37"/>
+      <triangle index="41" v0="34" v1="35" v2="37"/>
+      <triangle index="42" v0="36" v1="38" v2="39"/>
+      <triangle index="43" v0="36" v1="37" v2="39"/>
+      <triangle index="44" v0="38" v1="40" v2="41"/>
+      <triangle index="45" v0="38" v1="39" v2="41"/>
+      <triangle index="46" v0="40" v1="42" v2="43"/>
+      <triangle index="47" v0="40" v1="41" v2="43"/>
+      <triangle index="48" v0="42" v1="44" v2="45"/>
+      <triangle index="49" v0="42" v1="43" v2="45"/>
+      <triangle index="50" v0="44" v1="46" v2="47"/>
+      <triangle index="51" v0="44" v1="45" v2="47"/>
+      <triangle index="52" v0="28" v1="46" v2="48"/>
+      <triangle index="53" v0="46" v1="47" v2="48"/>
+      <triangle index="54" v0="27" v1="28" v2="49"/>
+      <triangle index="55" v0="28" v1="48" v2="49"/>
+      <triangle index="56" v0="27" v1="29" v2="50"/>
+      <triangle index="57" v0="27" v1="49" v2="50"/>
+      <triangle index="58" v0="29" v1="51" v2="52"/>
+      <triangle index="59" v0="29" v1="50" v2="52"/>
+      <triangle index="60" v0="51" v1="53" v2="54"/>
+      <triangle index="61" v0="51" v1="52" v2="54"/>
+      <triangle index="62" v0="53" v1="55" v2="56"/>
+      <triangle index="63" v0="53" v1="54" v2="56"/>
+      <triangle index="64" v0="55" v1="57" v2="58"/>
+      <triangle index="65" v0="55" v1="56" v2="58"/>
+      <triangle index="66" v0="57" v1="59" v2="60"/>
+      <triangle index="67" v0="57" v1="58" v2="60"/>
+      <triangle index="68" v0="59" v1="61" v2="62"/>
+      <triangle index="69" v0="59" v1="60" v2="62"/>
+      <triangle index="70" v0="61" v1="63" v2="64"/>
+      <triangle index="71" v0="61" v1="62" v2="64"/>
+      <triangle index="72" v0="63" v1="65" v2="66"/>
+      <triangle index="73" v0="63" v1="64" v2="66"/>
+      <triangle index="74" v0="65" v1="67" v2="68"/>
+      <triangle index="75" v0="65" v1="66" v2="68"/>
+      <triangle index="76" v0="32" v1="33" v2="69"/>
+      <triangle index="77" v0="33" v1="69" v2="70"/>
+      <triangle index="78" v0="32" v1="35" v2="71"/>
+      <triangle index="79" v0="32" v1="69" v2="71"/>
+      <triangle index="80" v0="35" v1="37" v2="72"/>
+      <triangle index="81" v0="35" v1="71" v2="72"/>
+      <triangle index="82" v0="37" v1="39" v2="73"/>
+      <triangle index="83" v0="37" v1="72" v2="73"/>
+      <triangle index="84" v0="39" v1="41" v2="74"/>
+      <triangle index="85" v0="39" v1="73" v2="74"/>
+      <triangle index="86" v0="41" v1="43" v2="75"/>
+      <triangle index="87" v0="41" v1="74" v2="75"/>
+      <triangle index="88" v0="43" v1="45" v2="76"/>
+      <triangle index="89" v0="43" v1="75" v2="76"/>
+      <triangle index="90" v0="45" v1="47" v2="77"/>
+      <triangle index="91" v0="45" v1="76" v2="77"/>
+      <triangle index="92" v0="47" v1="48" v2="78"/>
+      <triangle index="93" v0="47" v1="77" v2="78"/>
+      <triangle index="94" v0="48" v1="49" v2="79"/>
+      <triangle index="95" v0="48" v1="78" v2="79"/>
+      <triangle index="96" v0="49" v1="50" v2="80"/>
+      <triangle index="97" v0="49" v1="79" v2="80"/>
+      <triangle index="98" v0="50" v1="52" v2="81"/>
+      <triangle index="99" v0="50" v1="80" v2="81"/>
+      <triangle index="100" v0="52" v1="54" v2="82"/>
+      <triangle index="101" v0="52" v1="81" v2="82"/>
+      <triangle index="102" v0="54" v1="56" v2="83"/>
+      <triangle index="103" v0="54" v1="82" v2="83"/>
+      <triangle index="104" v0="56" v1="58" v2="84"/>
+      <triangle index="105" v0="56" v1="83" v2="84"/>
+      <triangle index="106" v0="58" v1="60" v2="85"/>
+      <triangle index="107" v0="58" v1="84" v2="85"/>
+      <triangle index="108" v0="60" v1="62" v2="86"/>
+      <triangle index="109" v0="60" v1="85" v2="86"/>
+      <triangle index="110" v0="62" v1="64" v2="87"/>
+      <triangle index="111" v0="62" v1="86" v2="87"/>
+      <triangle index="112" v0="64" v1="66" v2="88"/>
+      <triangle index="113" v0="64" v1="87" v2="88"/>
+      <triangle index="114" v0="66" v1="68" v2="89"/>
+      <triangle index="115" v0="66" v1="88" v2="89"/>
+      <triangle index="116" v0="78" v1="79" v2="90"/>
+      <triangle index="117" v0="78" v1="90" v2="91"/>
+      <triangle index="118" v0="79" v1="80" v2="92"/>
+      <triangle index="119" v0="79" v1="90" v2="92"/>
+      <triangle index="120" v0="90" v1="91" v2="93"/>
+      <triangle index="121" v0="91" v1="93" v2="94"/>
+      <triangle index="122" v0="90" v1="92" v2="95"/>
+      <triangle index="123" v0="90" v1="93" v2="95"/>
+      <triangle index="124" v0="93" v1="94" v2="96"/>
+      <triangle index="125" v0="94" v1="96" v2="97"/>
+      <triangle index="126" v0="93" v1="95" v2="98"/>
+      <triangle index="127" v0="93" v1="96" v2="98"/>
+      <triangle index="128" v0="96" v1="97" v2="99"/>
+      <triangle index="129" v0="97" v1="99" v2="100"/>
+      <triangle index="130" v0="96" v1="98" v2="101"/>
+      <triangle index="131" v0="96" v1="99" v2="101"/>
+      <triangle index="132" v0="99" v1="100" v2="102"/>
+      <triangle index="133" v0="100" v1="102" v2="103"/>
+      <triangle index="134" v0="99" v1="101" v2="104"/>
+      <triangle index="135" v0="99" v1="102" v2="104"/>
+      <triangle index="136" v0="102" v1="103" v2="105"/>
+      <triangle index="137" v0="103" v1="105" v2="106"/>
+      <triangle index="138" v0="102" v1="104" v2="107"/>
+      <triangle index="139" v0="102" v1="105" v2="107"/>
+      <triangle index="140" v0="105" v1="106" v2="108"/>
+      <triangle index="141" v0="106" v1="108" v2="109"/>
+      <triangle index="142" v0="105" v1="107" v2="110"/>
+      <triangle index="143" v0="105" v1="108" v2="110"/>
+      <triangle index="144" v0="108" v1="109" v2="111"/>
+      <triangle index="145" v0="109" v1="111" v2="112"/>
+      <triangle index="146" v0="108" v1="110" v2="113"/>
+      <triangle index="147" v0="108" v1="111" v2="113"/>
+      <triangle index="148" v0="111" v1="112" v2="114"/>
+      <triangle index="149" v0="112" v1="114" v2="115"/>
+      <triangle index="150" v0="111" v1="113" v2="116"/>
+      <triangle index="151" v0="111" v1="114" v2="116"/>
+    </cells>
+      <data>
+        <data_entry name="global vertex indices">
+          <meshfunction type="uint" dim="0" size="117">
+            <entity index="0" value="429"/>
+            <entity index="1" value="430"/>
+            <entity index="2" value="471"/>
+            <entity index="3" value="470"/>
+            <entity index="4" value="431"/>
+            <entity index="5" value="472"/>
+            <entity index="6" value="512"/>
+            <entity index="7" value="511"/>
+            <entity index="8" value="513"/>
+            <entity index="9" value="553"/>
+            <entity index="10" value="552"/>
+            <entity index="11" value="554"/>
+            <entity index="12" value="594"/>
+            <entity index="13" value="593"/>
+            <entity index="14" value="595"/>
+            <entity index="15" value="635"/>
+            <entity index="16" value="634"/>
+            <entity index="17" value="636"/>
+            <entity index="18" value="676"/>
+            <entity index="19" value="675"/>
+            <entity index="20" value="677"/>
+            <entity index="21" value="717"/>
+            <entity index="22" value="716"/>
+            <entity index="23" value="718"/>
+            <entity index="24" value="758"/>
+            <entity index="25" value="757"/>
+            <entity index="26" value="759"/>
+            <entity index="27" value="799"/>
+            <entity index="28" value="798"/>
+            <entity index="29" value="800"/>
+            <entity index="30" value="789"/>
+            <entity index="31" value="790"/>
+            <entity index="32" value="831"/>
+            <entity index="33" value="830"/>
+            <entity index="34" value="791"/>
+            <entity index="35" value="832"/>
+            <entity index="36" value="792"/>
+            <entity index="37" value="833"/>
+            <entity index="38" value="793"/>
+            <entity index="39" value="834"/>
+            <entity index="40" value="794"/>
+            <entity index="41" value="835"/>
+            <entity index="42" value="795"/>
+            <entity index="43" value="836"/>
+            <entity index="44" value="796"/>
+            <entity index="45" value="837"/>
+            <entity index="46" value="797"/>
+            <entity index="47" value="838"/>
+            <entity index="48" value="839"/>
+            <entity index="49" value="840"/>
+            <entity index="50" value="841"/>
+            <entity index="51" value="801"/>
+            <entity index="52" value="842"/>
+            <entity index="53" value="802"/>
+            <entity index="54" value="843"/>
+            <entity index="55" value="803"/>
+            <entity index="56" value="844"/>
+            <entity index="57" value="804"/>
+            <entity index="58" value="845"/>
+            <entity index="59" value="805"/>
+            <entity index="60" value="846"/>
+            <entity index="61" value="806"/>
+            <entity index="62" value="847"/>
+            <entity index="63" value="807"/>
+            <entity index="64" value="848"/>
+            <entity index="65" value="808"/>
+            <entity index="66" value="849"/>
+            <entity index="67" value="809"/>
+            <entity index="68" value="850"/>
+            <entity index="69" value="872"/>
+            <entity index="70" value="871"/>
+            <entity index="71" value="873"/>
+            <entity index="72" value="874"/>
+            <entity index="73" value="875"/>
+            <entity index="74" value="876"/>
+            <entity index="75" value="877"/>
+            <entity index="76" value="878"/>
+            <entity index="77" value="879"/>
+            <entity index="78" value="880"/>
+            <entity index="79" value="881"/>
+            <entity index="80" value="882"/>
+            <entity index="81" value="883"/>
+            <entity index="82" value="884"/>
+            <entity index="83" value="885"/>
+            <entity index="84" value="886"/>
+            <entity index="85" value="887"/>
+            <entity index="86" value="888"/>
+            <entity index="87" value="889"/>
+            <entity index="88" value="890"/>
+            <entity index="89" value="891"/>
+            <entity index="90" value="922"/>
+            <entity index="91" value="921"/>
+            <entity index="92" value="923"/>
+            <entity index="93" value="963"/>
+            <entity index="94" value="962"/>
+            <entity index="95" value="964"/>
+            <entity index="96" value="1004"/>
+            <entity index="97" value="1003"/>
+            <entity index="98" value="1005"/>
+            <entity index="99" value="1045"/>
+            <entity index="100" value="1044"/>
+            <entity index="101" value="1046"/>
+            <entity index="102" value="1086"/>
+            <entity index="103" value="1085"/>
+            <entity index="104" value="1087"/>
+            <entity index="105" value="1127"/>
+            <entity index="106" value="1126"/>
+            <entity index="107" value="1128"/>
+            <entity index="108" value="1168"/>
+            <entity index="109" value="1167"/>
+            <entity index="110" value="1169"/>
+            <entity index="111" value="1209"/>
+            <entity index="112" value="1208"/>
+            <entity index="113" value="1210"/>
+            <entity index="114" value="1250"/>
+            <entity index="115" value="1249"/>
+            <entity index="116" value="1251"/>
+          </meshfunction>
+        </data_entry>
+      </data>
+  </mesh>
+</dolfin>

=== added file 'nitsche_method/data/meshes/rotor_cavity.geo'
--- nitsche_method/data/meshes/rotor_cavity.geo	1970-01-01 00:00:00 +0000
+++ nitsche_method/data/meshes/rotor_cavity.geo	2010-03-16 14:39:09 +0000
@@ -0,0 +1,82 @@
+//This file defines start geometry for the driven rotor in the cavity problem.
+
+lb = 0.5;
+lc = 0.3;
+
+// This variable can then be used in the definition of Gmsh's simplest
+// `elementary entity', a `Point'. A Point is defined by a list of
+// four numbers: three coordinates (X, Y and Z), and a characteristic
+// length (lc) that sets the target element size at the point:
+
+//Cavity geometry
+H = 2.0;
+
+Point(1) = {-H, -H, 0, lb};
+Point(2) = {H, -H, 0, lb};
+Point(3) = {H, H, 0, lb};
+Point(4) = {-H, H, 0, lb};
+
+Line(1) = {1, 2};
+Line(2) = {2, 3};
+Line(3) = {3, 4};
+Line(4) = {4, 1};
+
+Line Loop(5) = {1,2,3,4};
+
+//Physical Point(1) = {1,2,3,4};
+//Physical Line(1) = {5};
+
+
+//Rotor geometry
+h = 0.1;
+l = 1.0;
+
+//Point(5) = {-h,-h,0,lc};
+//Point(6) = {h,-h,0,lc};
+//Point(7) = {h,h,0,lc};
+//Point(8) = {-h,h,0,lc};
+//
+//Line(6) = {5,6};
+//Line(7) = {6,7};
+//Line(8) = {7,8};
+//Line(9) = {8,5};
+//
+//Line Loop(10) = {6,7,8,9};
+//Plane Surface(101) = {10};
+//Plane Surface(100) = {10};
+//Plane Surface(200) = {5,10};
+
+Point(5) = {h,h,0,lc};
+Point(6) = {h,l,0,lc};
+Point(7) = {-h,l,0,lc};
+Point(8) = {-h,h,0,lc};
+Point(9) = {-l,h,0,lc};
+Point(10) = {-l,-h,0,lc};
+Point(11) = {-h,-h,0,lc};
+Point(12) = {-h,-l,0,lc};
+Point(13) = {h,-l,0,lc};
+Point(14) = {h,-h,0,lc};
+Point(15) = {l,-h,0,lc};
+Point(16) = {l,h,0,lc};
+
+Line(6) = {5,6};
+Line(7) = {6,7};
+Line(8) = {7,8};
+Line(9) = {8,9};
+Line(10) = {9,10};
+Line(11) = {10,11};
+Line(12) = {11,12};
+Line(13) = {12,13};
+Line(14) = {13,14};
+Line(15) = {14,15};
+Line(16) = {14,15};
+Line(17) = {15,16};
+Line(18) = {16,5};
+
+Line Loop(19) = {6,7,8,9,10,11,12,13,14,15,16,17,18};
+
+//Physical Point(2) = {6,7,8,9,10,11,12,13,14,15,16,17,18};
+//Physical Line(2) = {19};
+
+Plane Surface(100) = {19};
+Plane Surface(101) = {5,19};

=== added directory 'nitsche_method/entity_intersection'
=== added file 'nitsche_method/entity_intersection/SConstruct'
--- nitsche_method/entity_intersection/SConstruct	1970-01-01 00:00:00 +0000
+++ nitsche_method/entity_intersection/SConstruct	2010-02-10 03:14:09 +0000
@@ -0,0 +1,16 @@
+# This is an example of a simple SConstruct file for building
+# programs against DOLFIN. To build this demo, just type 'scons'.
+
+import os, commands
+
+# Get compiler from pkg-config
+compiler = commands.getoutput('pkg-config --variable=compiler dolfin')
+
+# Create a SCons Environment based on the main os environment
+env = Environment(ENV=os.environ, CXX=compiler)
+
+# Get compiler flags from pkg-config
+env.ParseConfig('pkg-config --cflags --libs dolfin')
+
+#env.Program(['tetrahedron_triangle_intersection_test.cpp'])
+env.Program(['primitive_intersector_test.cpp'])

=== added file 'nitsche_method/entity_intersection/primitive_intersector_test.cpp'
--- nitsche_method/entity_intersection/primitive_intersector_test.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/entity_intersection/primitive_intersector_test.cpp	2010-03-05 23:36:16 +0000
@@ -0,0 +1,40 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-02-10  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-02-10
+// Last changed: 2010-02-22
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+// =====================================================================================
+
+#include <dolfin/mesh/dolfin_mesh.h> 
+#include <iostream>
+
+using namespace dolfin;
+
+int main ()
+{
+  UnitCube cube(3,3,2);
+  cout <<"Total number of cells in Cube:" << cube.num_cells() <<endl;
+
+  UnitSphere sphere(3);
+  cout <<"Total number of cells in Sphere:" << sphere.num_cells() <<endl;
+
+  for (CellIterator cube_cell(cube); !cube_cell.end(); ++cube_cell)
+  {
+    for (CellIterator sphere_cell(cube); !sphere_cell.end(); ++sphere_cell)
+    {
+      if (PrimitiveIntersector::do_intersect(*cube_cell, *sphere_cell))
+	std::cout <<"Cell number " << cube_cell->index() << " intersects with "
+		  <<"Cell number " << sphere_cell->index() << std::endl;
+    }
+  }
+		
+  return 0;
+}

=== added directory 'nitsche_method/integration_on_complex_domains'
=== added directory 'nitsche_method/integration_on_complex_domains/gauss_projection_green'
=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/BaryCenterQuadrature.cpp'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/BaryCenterQuadrature.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/BaryCenterQuadrature.cpp	2010-04-01 10:43:19 +0000
@@ -0,0 +1,270 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-03-17  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-03-17
+// Last changed: 2010-04-01
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//Remark: This is an adapted version of Brian Mirtichs original C code for
+//computin polyhedral mass properties, which can be found at <web-address>
+// =====================================================================================
+
+#include "BaryCenterQuadrature.h"
+#include <math.h>
+
+#define X 0
+#define Y 1
+#define Z 2
+#define SQR(x) ((x)*(x))
+#define CUBE(x) ((x)*(x)*(x))
+
+
+using std::sqrt;
+using namespace dolfin;
+
+
+void BaryCenterQuadrature::compute_quadrature_rule(const Nef_polyhedron_3 & polyhedron)
+{
+  //coordinates of the bary center
+  double bary_center [3] = {0,0,0};
+
+  _weight = 0;
+  
+  //determine if polyhedron has a non vanishing 3d measure.
+  //This requires to have volumes marked with one.
+  bool has_volume = false;
+  Nef_polyhedron_3::Volume_const_iterator vi;
+  CGAL_forall_volumes(vi,polyhedron)
+  {
+    std::cout <<"vi->mark: " << vi->mark() <<std::endl;
+    if(vi->mark())
+    {
+      has_volume = true;
+      break;
+    }
+  }
+
+  //variables needing during the computation
+  //components of surface normal
+  double nx, ny, nz;
+  double normal [3] = {0,0,0};
+
+  //start and end point of the edge
+  double source[3] = {0,0,0};
+  double target[3] = {0,0,0};
+
+  //permutation of the coordinates X,Y,Z
+  int A,B,C;
+    
+  std::cout <<" Number of volumes :" << polyhedron.number_of_volumes() << std::endl;
+  std::cout << "Outer iteration along faces, next f \n";
+  std::cout <<"++++++++++++++++++++++++++++++++++++++++" << std::endl;
+
+  std::cout << "Polyhedron is 2d Manifold: "  << const_cast<Nef_polyhedron_3 &>(polyhedron).is_simple() << std::endl;
+
+  for(Nef_polyhedron_3::Halffacet_const_iterator f = polyhedron.halffacets_begin (),
+	end = polyhedron.halffacets_end();
+      f != end; ++f)
+  {
+    if (f->incident_volume()->mark() || (!has_volume && f->is_twin()))
+    {
+      //compute best projection direction.
+      //get normal of the surface and the offset
+      //FIXME: check right orientation
+      Plane_3 face_plane  = f->plane();  
+      Vector_3 test_normal = face_plane.orthogonal_vector();
+      nx = CGAL::to_double(face_plane.a());
+      ny = CGAL::to_double(face_plane.b());
+      nz = CGAL::to_double(face_plane.c());
+
+      double normal_length = sqrt(nx*nx + ny*ny + nz*nz);
+      normal[0] = nx/normal_length;
+      normal[1] = ny/normal_length;
+      normal[2] = nz/normal_length;
+
+      nx = fabs(nx);
+      ny = fabs(ny);
+      nz = fabs(nz);
+
+      //Choose  permutation to get best conditioned projection direction.
+      if (nx > ny && nx > nz) 
+	C = X;
+      else 
+	C = (ny > nz) ? Y : Z;
+      A = (C + 1) % 3;
+      B = (A + 1) % 3;
+
+      //begin compute the face integrals
+      //begin compute the projection integrals
+      double a0, a1, da;
+      double b0, b1, db;
+      double a0_2, b0_2;
+      double a0_3, b0_3;
+      double a0_4, b0_4;
+      double a1_2, b1_2;
+      double C1, Ca, Caa, Cb, Cbb, Cab;
+      double Kab;
+      double P1, Pa, Pb, Paa, Pbb, Pab;
+      P1 = Pa = Pb = Paa = Pab = Pbb = 0.0;
+      double Fa, Fb, Fc, Faa, Fbb, Fcc;
+
+      for(Nef_polyhedron_3::Halffacet_cycle_const_iterator fc = f->facet_cycles_begin();
+	  fc != f->facet_cycles_end(); ++fc)
+      {
+	//exclude a SHalfloops  (whatever this is)
+	if ( fc.is_shalfedge() ) 
+	{
+	  Nef_polyhedron_3::SHalfedge_const_handle h = fc;
+	  Nef_polyhedron_3::SHalfedge_around_facet_const_circulator hc(h);
+	  Nef_polyhedron_3::SHalfedge_around_facet_const_circulator he(hc);
+	  CGAL_For_all(hc,he)
+	  {
+	    std::cout <<"----------------------------------------" << std::endl;
+
+	    Nef_polyhedron_3::SVertex_const_handle v = hc->source();
+
+	    const Point_3 & source_point(v->source()->point());
+	    const Point_3 & target_point(v->target()->point());
+	    std::cout <<"Source point " << source_point << std::endl;
+	    std::cout <<"Target point " << target_point <<std::endl;
+
+	    source[0] = CGAL::to_double(source_point.x());
+	    source[1] = CGAL::to_double(source_point.y());
+	    source[2] = CGAL::to_double(source_point.z());
+
+	    target[0] = CGAL::to_double(target_point.x());
+	    target[1] = CGAL::to_double(target_point.y());
+	    target[2] = CGAL::to_double(target_point.z());
+
+	    a0 = source[A];
+	    b0 = source[B];
+	    a1 = target[A];
+	    b1 = target[B];
+
+	    da = a1 - a0;
+	    db = b1 - b0;
+
+	    a0_2 = a0 * a0; 
+	    a0_3 = a0_2 * a0; 
+	    a0_4 = a0_3 * a0;
+	    a1_2 = a1 * a1;  
+	    b0_2 = b0 * b0;
+	    b0_3 = b0_2 * b0; 
+	    b0_4 = b0_3 * b0;
+	    b1_2 = b1 * b1; 
+
+	    C1 = a1 + a0;
+	    Ca = a1*C1 + a0_2; 
+	    Caa = a1*Ca + a0_3; 
+	    Cb = b1*(b1 + b0) + b0_2; 
+	    Cbb = b1*Cb + b0_3; 
+	    Cab = 3*a1_2 + 2*a1*a0 + a0_2; 
+	    Kab = a1_2 + 2*a1*a0 + 3*a0_2;
+
+	    P1 += db*C1;
+	    Pa += db*Ca;
+	    Paa += db*Caa;
+	    Pb += da*Cb;
+	    Pbb += da*Cbb;
+	    Pab += db*(b1*Cab + b0*Kab);
+	  }    
+	  std::cout <<"----------------------------------------" << std::endl;
+	}
+      }
+
+      P1 /= 2.0;
+      Pa /= 6.0;
+      Paa /= 12.0;
+      Pb /= -6.0;
+      Pbb /= -12.0;
+      Pab /= 24.0;
+
+      info("P1 : %e",P1);
+      info("Pa : %e",Pa);
+      info("Paa : %e",Paa);
+      info("Pb : %e",Pb);
+      info("Pbb : %e",Pbb);
+      info("Pab : %e",Pab);
+
+      double k1, k2, k3;
+      k1 = 1 / normal[C]; k2 = k1 * k1; k3 = k2 * k1; 
+      double w =  CGAL::to_double(face_plane.d())/normal_length ; 
+      info("Normal[0] : %e ", normal[0]);
+      info("Normal[1] : %e ", normal[1]);
+      info("Normal[2] : %e ", normal[2]);
+      info("w : %e ", w);
+
+      Fa = k1 * Pa;
+      Fb = k1 * Pb;
+      Fc = -k2 * (normal[A]*Pa + normal[B]*Pb + w*P1);
+
+      //debug
+      Faa = k1 * Paa;
+      Fbb = k1 * Pbb;
+      Fcc = k3 * (SQR(normal[A])*Paa + 2*normal[A]*normal[B]*Pab + SQR(normal[B])*Pbb
+		  + w*(2*(normal[A]*Pa + normal[B]*Pb) + w*P1));
+
+      info("Fa : %e",Fa);
+      info("Fb : %e",Fb);
+      info("Fc : %e",Fc);
+      info("Faa : %e",Faa);
+      info("Fbb : %e",Fbb);
+      info("Fcc : %e",Fcc);
+      //end computation face integrals
+
+      if (has_volume)
+      {
+	double contribution = (normal[X] * ((A == X) ? Fa : ((B == X) ? Fb : Fc)));
+	info("Contribution: %e", contribution);
+	info("Normal[X]: %e", normal[X]);
+	info("A: %d", A);
+	info("B: %d", B);
+	info("C: %d", C);
+	_weight += normal[X] * ((A == X) ? Fa : ((B == X) ? Fb : Fc));
+	info("Volume: %e", _weight);
+
+	bary_center[A] += normal[A] * Faa;
+	bary_center[B] += normal[B] * Fbb; 
+	bary_center[C] += normal[C] * Fcc; 
+      }
+      else
+      {
+	info("No volume: P1 is %e",P1);
+	info("No volume: normal[C] is %e", normal[C]);
+	//does not work yet
+	//@todo does not work yet.
+	_weight += -P1/normal[C];
+	info("No volume: weight is %e", _weight);
+	info("Fa : %e",Fa);
+	info("Fb : %e",Fb);
+	info("Fc : %e",Fc);
+	bary_center[A] += -Fa;
+	bary_center[B] += -Fb; 
+	bary_center[C] += -Fc; 
+      }
+    }
+  }
+
+  //applies also if polyhedron has no no volume, since
+  //we no iterating two times (each halffacet).
+  if (has_volume)
+  {
+    bary_center[X] /= (2*_weight); 
+    bary_center[Y] /= (2*_weight);
+    bary_center[Z] /= (2*_weight);
+  }
+  else
+  {
+    bary_center[X] /= _weight; 
+    bary_center[Y] /= _weight;
+    bary_center[Z] /= _weight;
+  }
+
+  //use these later directly.
+  _point = Point(3,bary_center);
+}

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/BaryCenterQuadrature.h'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/BaryCenterQuadrature.h	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/BaryCenterQuadrature.h	2010-04-01 10:43:19 +0000
@@ -0,0 +1,69 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-03-17  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-03-17
+// Last changed: 2010-03-30
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+// =====================================================================================
+
+#ifndef  __BARYCENTERQUADRATURE_H
+#define  __BARYCENTERQUADRATURE_H
+
+#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
+
+#include <CGAL/Nef_polyhedron_3.h>
+#include <CGAL/Polyhedron_3.h>
+
+#include <dolfin/mesh/Point.h>
+
+namespace dolfin {
+
+  typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
+  typedef CGAL::Polyhedron_3<Kernel>  Polyhedron_3;
+  typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron_3;
+  typedef Nef_polyhedron_3::Point_3 Point_3;
+  typedef Nef_polyhedron_3::Plane_3 Plane_3;
+  typedef Nef_polyhedron_3::Vector_3 Vector_3;
+
+  ///This class computes the barycenter of an arbitrary polyhedron or
+  ///polygon and therefore allows for bary center quadrature on complex
+  ///polyhedrons. Note: barycenter quadrature is exact for polynom deg <= 1.
+  class BaryCenterQuadrature {
+
+  public: 
+
+    BaryCenterQuadrature() : _weight(0), _point(0,0,0), _length(1) {}
+
+    ///@todo split the ugly implementation up into some subroutines and removes
+    //all the macro etc stuff. Make also working polyhedrons which are
+    //degenerated.
+    void compute_quadrature_rule(const Nef_polyhedron_3 & polyhedron);
+
+    //return pointer
+    ///Gives the points for the last computed Polyhedron.
+    Point * points() {return &_point;}
+    ///Gives the weights for the last computed Polyhedron.
+    double * weights() {return &_weight; }
+    
+    ///Number of quadrature points/weights.
+    uint length() {return _length;}
+
+  private:
+
+    double _weight;
+    Point  _point;
+    uint _length;
+
+
+  };
+
+}
+  
+#endif   // ----- #ifndef __BARYCENTERQUADRATURE_H  -----

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/README'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/README	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/README	2010-03-18 18:15:26 +0000
@@ -0,0 +1,146 @@
+1.  OVERVIEW
+
+	This code accompanies the paper:
+
+	Brian Mirtich, "Fast and Accurate Computation of
+	Polyhedral Mass Properties," journal of graphics
+	tools, volume 1, number 2, 1996.
+
+	It computes the ten volume integrals needed for
+	determining the center of mass, moments of
+	inertia, and products of inertia for a uniform
+	density polyhedron.  From this information, a
+	body frame can be computed.
+
+	To compile the program, use an ANSI compiler, and
+	type something like
+  
+		% cc volInt.c -O2 -lm -o volInt
+
+
+	Revision history
+
+	26 Jan 1996	Program creation.
+
+	 3 Aug 1996	Corrected bug arising when polyhedron density
+			is not 1.0.  Changes confined to function main().
+			Thanks to Zoran Popovic for catching this one.
+
+
+
+2.  POLYHEDRON GEOMETRY FILES
+
+	The program reads a data file specified on the
+	command line.  This data file describes the
+	geometry of a polyhedron, and has the following
+	format:
+
+	N	
+
+	x_0	y_0	z_0
+	x_1	y_1	z_1
+	.
+	.
+	.
+	x_{N-1}	y_{N-1}	z_{N-1}
+
+	M
+
+	k1	v_{1,1} v_{1,2} ... v_{1,k1}
+	k2	v_{2,1} v_{2,2} ... v_{2,k2}
+	.
+	.
+	.
+	kM	v_{M,1} v_{M,2} ... v_{M,kM}
+
+
+	where:
+		N		number of vertices on polyhedron
+		x_i y_i z_i	x, y, and z coordinates of ith vertex
+		M		number of faces on polyhedron
+		ki		number of vertices on ith face
+		v_{i,j}		jth vertex on ith face
+
+	In English:
+
+		First the number of vertices are specified.  Next
+		the vertices are defined by listing the 3
+		coordinates of each one.  Next the number of faces
+		are specified.  Finally, the faces themselves are
+		specified.  A face is specified by first giving
+		the number of vertices around the polygonal face,
+		followed by the (integer) indices of these
+		vertices.  When specifying indices, note that
+		they must be given in counter-clockwise order
+		(when looking at the face from outside the
+		polyhedron), and the vertices are indexed from 0
+		to N-1 for a polyhedron with N faces.
+
+	White space can be inserted (or not) as desired.
+	Three example polyhedron geometry files are included:
+
+	cube	A cube, 20 units on a side, centered at 
+		the origin and aligned with the coordinate axes.
+
+	tetra	A tetrahedron formed by taking the convex 
+		hull of the origin, and	the points (5,0,0), 
+		(0,4,0), and (0,0,3).
+
+	icosa	An icosahedron with vertices lying on the unit 
+		sphere, centered at the origin.
+
+
+
+3.  RUNNING THE PROGRAM
+
+	Simply type,
+	
+		% volInt <polyhedron geometry filename>
+
+	The program will read in the geometry of the
+	polyhedron, and the print out the ten volume
+	integrals.
+
+	The program also computes some of the mass
+	properties which may be inferred from the volume
+	integrals.  A density of 1.0 is assumed, although
+	this may be changed in function main().  The
+	center of mass is computed as well as the inertia
+	tensor relative to a frame with origin at the
+	center of mass.  Note, however, that this matrix
+	may not be diagonal.  If not, a diagonalization
+	routine must be performed, to determine the
+	orientation of the true body frame relative to
+	the original model frame.  The Jacobi method
+	works quite well (see Numerical Recipes in C by
+	Press, et. al.).
+
+
+
+4.  DISCLAIMERS
+
+	1.  The volume integration code has been written
+	to match the development and algorithms presented
+	in the paper, and not with maximum optimization
+	in mind.  While inherently very efficient, a few
+	more cycles can be squeezed out of the algorithm.
+	This is left as an exercise. :)
+
+	2.  Don't like global variables?  The three
+	procedures which evaluate the volume integrals
+	can be combined into a single procedure with two
+	nested loops.  In addition to providing some
+	speedup, all of the global variables can then be
+	made local.
+
+	3.  The polyhedron data structure used by the
+	program is admittedly lame; much better schemes
+	are possible.  The idea here is just to give the
+	basic integral evaluation code, which will have
+	to be adjusted for other polyhedron data
+	structures.
+
+	4.  There is no error checking for the input
+	files.  Be careful.  Note the hard limits
+	#defined for the number of vertices, number of
+	faces, and number of vertices per faces.

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/SConstruct'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/SConstruct	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/SConstruct	2010-04-02 18:46:57 +0000
@@ -0,0 +1,22 @@
+import os, commands
+
+# Import("cppunitCfg")
+
+# Get compiler from pkg-config
+compiler = commands.getoutput('pkg-config --variable=compiler dolfin')
+
+# Create a SCons Environment based on the main os environment
+env = Environment(ENV=os.environ, CXX=compiler)
+
+env.Append(CXXFLAGS = '-ggdb')	
+
+# Get compiler flags from pkg-config
+env.ParseConfig('pkg-config --cflags --libs dolfin')
+
+#Program
+env.Program('quadrature_test',['BaryCenterQuadrature.cpp','main.cpp'])
+env.Program('iteration_tetrahedron.cpp')
+env.Program('iteration_tetrahedron_2.cpp')
+
+env.Append(LIBS='-lcppunit')
+env.Program('unittest',['BaryCenterQuadrature.cpp','test.cpp'])

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/alut_snippet.cpp'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/alut_snippet.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/alut_snippet.cpp	2010-03-18 18:15:26 +0000
@@ -0,0 +1,96 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-02-17  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-02-17
+// Last changed: 2010-02-17
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+// =====================================================================================
+
+
+struct
+{
+  Point_3 p1, p2, p3;
+}triangle;
+
+class Shell_explorer
+{
+  bool first;
+  const Nef_polyhedron& N;
+  vector<triangle> m_triangle_list;
+
+public:
+  Shell_explorer(const Nef_polyhedron& N_)
+    : first(true), N(N_) {}
+
+  void visit(Vertex_const_handle v){}		
+  void visit(Halfedge_const_handle ){}
+  void visit(Halffacet_const_handle facet)
+  {	
+	 for (Halffacet_cycle_const_iterator it =
+facet->facet_cycles_begin(); it != facet->facet_cycles_end(); it++)
+	 {
+		SHalfedge_const_handle se = SHalfedge_const_handle(it);
+		CGAL_assertion(se!=0);
+		SHalfedge_around_facet_const_circulator hc_start(se);
+		SHalfedge_around_facet_const_circulator hc_end(hc_start);
+		vector <Point_3> vertices;	
+		int count = 0;
+		CGAL_For_all(hc_start,hc_end)
+		{ 		
+			SVertex_const_handle  svert = hc_start->source();
+			Point_3 vpoint = svert->center_vertex()->point(); 				
+			vertices.push_back(vpoint);			
+		}
+		for (int i=0; i<vertices.size()-2; i++)
+		{
+			triangle t;
+			t.p1 = vertices[0];
+			t.p3 = vertices[i+1];
+			t.p2 = vertices[i+2];	
+			m_triangle_list.push_back(t);
+		}
+		
+	 }
+  }
+  void visit(SHalfedge_const_handle ) {}
+  void visit(SHalfloop_const_handle ) {}
+  void visit(SFace_const_handle sf) {}
+
+  vector<triangle>getTriangleList()
+  {
+	  vector<triangle> templist;
+	  for (int i=0; i<m_triangle_list.size(); i++)
+		  templist.push_back(m_triangle_list[i]);
+	  m_triangle_list.clear();
+	  return templist;
+  }		
+  void reset_minimal_vertex() { first = true; }
+};
+
+Usage:
+void main()
+{
+       Nef_polyhedron nPoly;
+	Volume_const_iterator c;
+	Shell_explorer SE(nPoly);
+	
+	CGAL_forall_volumes(c,nPoly)
+	{		
+		Shell_entry_const_iterator it;
+		int shellcount = 0;
+		vector <triangle> temp;
+		CGAL_forall_shells_of(it,c)
+		{
+		   SE.reset_minimal_vertex();			
+		   entrypaths.visit_shell_objects(SFace_const_handle(it),SE);
+		   vector<triangle> tris = SE.getTriangleList(); 		
+		}		
+	}
+}

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/cube'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/cube	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/cube	2010-03-18 18:15:26 +0000
@@ -0,0 +1,21 @@
+8
+
+-10	-10	-10
++10	-10	-10
++10	+10	-10
+-10	+10	-10
+-10	-10	+10
++10	-10	+10
++10	+10	+10
+-10	+10	+10
+
+6
+
+4	0 3 2 1
+4	4 5 6 7
+4	0 1 5 4
+4	6 2 3 7
+4	1 2 6 5
+4 	0 4 7 3
+
+

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/icosa'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/icosa	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/icosa	2010-03-18 18:15:26 +0000
@@ -0,0 +1,38 @@
+12
+
++0.00000000 +0.00000000 +1.00000000
++0.00000000 +0.00000000 -1.00000000
++0.89442719 +0.00000000 +0.44721360
++0.27639320 +0.85065081 +0.44721360
+-0.72360680 +0.52573111 +0.44721360
+-0.72360680 -0.52573111 +0.44721360
++0.27639320 -0.85065081 +0.44721360
++0.72360680 +0.52573111 -0.44721360
+-0.27639320 +0.85065081 -0.44721360
+-0.89442719 +0.00000000 -0.44721360
+-0.27639320 -0.85065081 -0.44721360
++0.72360680 -0.52573111 -0.44721360
+
+20
+
+3       6      11     2
+3       3      2      7
+3       7      2      11
+3       0      2      3
+3       0      6      2
+3       10     1      11
+3       1      7      11
+3       10     11     6
+3       8      7      1
+3       8      3      7
+3       5      10     6
+3       5      6      0
+3       4      3      8
+3       4      0      3
+3       9      8      1
+3       9      1      10
+3       4      5      0
+3       9      10     5
+3       9      5      4
+3       9      4      8
+

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/iteration_tetrahedron.cpp'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/iteration_tetrahedron.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/iteration_tetrahedron.cpp	2010-03-25 23:33:08 +0000
@@ -0,0 +1,58 @@
+#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
+#include <CGAL/Nef_polyhedron_3.h>
+#include <CGAL/Polyhedron_3.h>
+
+typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
+typedef CGAL::Polyhedron_3<Kernel>  Polyhedron_3;
+typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron_3;
+typedef Nef_polyhedron_3::Point_3 Point_3;
+
+int main()
+{
+
+  Point_3 a(1.0, 0.0, 0.0);
+  Point_3 b(0.0, 1.0, 0.0);
+  Point_3 c(0.0, 0.0, 1.0);
+  Point_3 d(0.0, 0.0, 0.0);
+
+  //Build a tetrahedron
+  Polyhedron_3 P;
+  P.make_tetrahedron(a,b,c,d);
+  Nef_polyhedron_3 NP(P);
+
+  std::cout << "Iteration along face ...\n";
+  int face_counter = 0;
+  for(Nef_polyhedron_3::Halffacet_const_iterator f = NP.halffacets_begin (),
+      end = NP.halffacets_end();
+      f != end;
+      ++f)
+  {
+    if(f->is_twin()) 
+      continue;
+    std::cout <<"########################################" << std::endl;
+    std::cout << "Face number " << face_counter++  << std::endl; 
+    for(Nef_polyhedron_3::Halffacet_cycle_const_iterator fc = f->facet_cycles_begin(),
+	cycles_end = f->facet_cycles_end();
+	fc != cycles_end;
+	++fc)
+    {
+      if ( fc.is_shalfedge() )
+      {
+	std::cout <<"Edge consist of points: " << std::endl;
+	Nef_polyhedron_3::SHalfedge_const_handle se = fc;
+	Nef_polyhedron_3::SHalfedge_around_facet_const_circulator hc(se);
+	Nef_polyhedron_3::SHalfedge_around_facet_const_circulator he(hc);
+	CGAL_For_all(hc,he)
+	{
+	  Nef_polyhedron_3::SVertex_const_handle v = hc->source();
+//          Nef_polyhedron_3::Halfedge_const_handle v = hc->source();
+	  const Point_3 &  source_point(v->source()->point());
+	  const Point_3 & target_point(v->target()->point());
+	  std::cout <<"Source point " << source_point << std::endl;
+	  std::cout <<"Target point " << target_point <<std::endl;
+	}
+      }
+    }
+  }
+  return 0;
+}

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/iteration_tetrahedron_2.cpp'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/iteration_tetrahedron_2.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/iteration_tetrahedron_2.cpp	2010-04-01 10:43:19 +0000
@@ -0,0 +1,140 @@
+#include<vector>
+
+#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
+#include <CGAL/Nef_polyhedron_3.h>
+#include <CGAL/Polyhedron_3.h>
+#include <CGAL/Gmpz.h>
+#include <CGAL/Homogeneous.h>
+
+typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
+typedef CGAL::Polyhedron_3<Kernel>  Polyhedron_3;
+typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron_3;
+  typedef Nef_polyhedron_3::Vector_3 Vector_3;
+typedef Nef_polyhedron_3::Point_3 Point_3;
+typedef Nef_polyhedron_3::Vertex_const_handle Vertex_const_handle;
+typedef Nef_polyhedron_3::Halfedge_const_handle Halfedge_const_handle;
+typedef Nef_polyhedron_3::Halffacet_const_handle Halffacet_const_handle;
+typedef Nef_polyhedron_3::Halffacet_cycle_const_iterator Halffacet_cycle_const_iterator;
+typedef Nef_polyhedron_3::SHalfedge_const_handle SHalfedge_const_handle;
+typedef Nef_polyhedron_3::SHalfedge_around_facet_const_circulator SHalfedge_around_facet_const_circulator;
+typedef Nef_polyhedron_3::SHalfloop_const_handle SHalfloop_const_handle;
+typedef Nef_polyhedron_3::SFace_const_handle SFace_const_handle;
+typedef Nef_polyhedron_3::Volume_const_iterator Volume_const_iterator;
+typedef Nef_polyhedron_3::Shell_entry_const_iterator Shell_entry_const_iterator;
+
+typedef std::vector<Nef_polyhedron_3> PolyhedronList;
+typedef PolyhedronList::const_iterator PolyhedronListIterator;
+
+class Shell_explorer
+{
+  const Nef_polyhedron_3 & N;
+
+public:
+  Shell_explorer(const Nef_polyhedron_3 & N_)
+  : N(N_) {}
+
+  void visit(Vertex_const_handle v) {}		
+  void visit(Halfedge_const_handle ){}
+  void visit(Halffacet_const_handle facet)
+  {	
+    std::cout << "Visting faces ..." << std::endl;
+    std::cout <<"++++++++++++++++++++++++++++++++++++++++" << std::endl;
+    Vector_3 test_normal = facet->plane().orthogonal_vector();
+    std::cout <<"Normal vector of the plane is " << test_normal <<std::endl;
+
+    for (Halffacet_cycle_const_iterator it =
+	 facet->facet_cycles_begin(); it != facet->facet_cycles_end(); it++)
+    {
+      std::cout << "Visting Edges ..." << std::endl;
+      std::cout <<"----------------------------------------" << std::endl;
+      Nef_polyhedron_3::SHalfedge_const_handle h = it;
+      Nef_polyhedron_3::SHalfedge_around_facet_const_circulator hc(h), he(hc);
+      CGAL_For_all(hc,he)
+      { 
+	Nef_polyhedron_3::SVertex_const_handle v = hc->source();
+	const Nef_polyhedron_3::Point_3& source = v->source()->point();
+	const Nef_polyhedron_3::Point_3& target = v->target()->point();
+	std::cout <<"Source :" <<source <<std::endl;
+	std::cout <<"Target :" <<target <<std::endl;
+      }
+    }
+  }
+  void visit(SHalfedge_const_handle ) {}
+  void visit(SHalfloop_const_handle ) {}
+  void visit(SFace_const_handle sf) {}
+
+};
+
+int main()
+{
+  Point_3 a1(1.0, 0.0, 0.0);
+  Point_3 b1(0.0, 1.0, 0.0);
+  Point_3 c1(0.0, 0.0, 1.0);
+  Point_3 d1(0.0, 0.0, 0.0);
+
+  Point_3 a2(-1.0, 0.0, 0.0);
+  Point_3 b2(0.0, 1.0, 0.0);
+  Point_3 c2(0.0, 0.0, 1.0);
+  Point_3 d2(0.0, 0.0, 0.0);
+
+  Point_3 a3(1.0, 0.0, 0.0);
+  Point_3 b3(0.0, -1.0, 0.0);
+  Point_3 c3(0.0, 0.0, 1.0);
+  Point_3 d3(0.0, 0.0, 0.0);
+
+  Point_3 a4(-1.0, 0.0, 0.0);
+  Point_3 b4(0.0, -1.0, 0.0);
+  Point_3 c4(0.0, 0.0, 1.0);
+  Point_3 d4(0.0, 0.0, 0.0);
+
+  Point_3 A(2.0, 1.0, 1.0);
+  Point_3 B(1.0, 2.0, 1.0);
+  Point_3 C(1.0, 1.0, 2.0);
+  Point_3 D(1.0, 1.0, 1.0);
+
+  //Build a point tetrahedron
+  Polyhedron_3 P1;
+  P1.make_triangle(a1,b1,c1);
+  Nef_polyhedron_3 N1(P1);
+  
+  Polyhedron_3 P2;
+  P2.make_tetrahedron(a2,b2,c2,d2);
+  Nef_polyhedron_3 N2(P2);
+  
+  Polyhedron_3 P3;
+  P3.make_tetrahedron(a3,b3,c3,d3);
+  Nef_polyhedron_3 N3(P3);
+  
+  Polyhedron_3 P4;
+  P4.make_tetrahedron(a4,b4,c4,d4);
+  Nef_polyhedron_3 N4(P4);
+  
+  PolyhedronList polyhedrons;
+  
+  polyhedrons.push_back(N1);
+  polyhedrons.push_back(N2);
+
+  //Build a point tetrahedron
+  for (PolyhedronListIterator pi = polyhedrons.begin(), end = polyhedrons.end();
+       pi != end; ++pi)
+  {
+    Volume_const_iterator vi;
+    Shell_explorer SE(*pi);
+
+    std::cout <<"Next polyhedron:\n" 
+    << "##############################" <<std::endl;
+    int ic = 0;
+    CGAL_forall_volumes(vi,*pi)
+    {		
+      std::cout << "Volume " << ic++ << " has mark " << vi->mark()<< std::endl;
+      
+      Shell_entry_const_iterator it;
+      CGAL_forall_shells_of(it,vi)
+      {
+	pi->visit_shell_objects(SFace_const_handle(it),SE);
+      }		
+      std::cout << "\n\n";
+    }
+  }
+  return 0;
+}

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/main.cpp'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/main.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/main.cpp	2010-04-01 10:43:19 +0000
@@ -0,0 +1,190 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-03-19  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-03-19
+// Last changed: 2010-03-31
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+// =====================================================================================
+
+#include "BaryCenterQuadrature.h"
+#include <dolfin.h>
+
+#include <iostream>
+#include<vector>
+
+using namespace dolfin;
+
+typedef std::vector<Nef_polyhedron_3> PolyhedronList;
+typedef PolyhedronList::const_iterator PolyhedronListIterator;
+
+
+using namespace dolfin;
+
+int main()
+{
+  
+  Point_3 e0(0.0, 0.0, 0.0);
+
+  Point_3 e1(1.0, 0.0, 0.0);
+  Point_3 e2(0.0, 1.0, 0.0);
+  Point_3 e3(0.0, 0.0, 1.0);
+
+  Point_3 _e1(-1.0, 0.0, 0.0);
+  Point_3 _e2(0.0, -1.0, 0.0);
+  Point_3 _e3(0.0, 0.0, -1.0);
+
+  Point_3 A(2.0, 1.0, 1.0);
+  Point_3 B(1.0, 2.0, 1.0);
+  Point_3 C(1.0, 1.0, 2.0);
+  Point_3 D(1.0, 1.0, 1.0);
+
+  //Create tetrahedrons with unit vectors
+  Polyhedron_3 P1;
+  P1.make_tetrahedron(e0,e1,e2,e3);
+  Nef_polyhedron_3 N1(P1);
+  
+  Polyhedron_3 P2;
+  P2.make_tetrahedron(e0,_e1,e2,e3);
+  Nef_polyhedron_3 N2(P2);
+  
+  Polyhedron_3 P3;
+  P3.make_tetrahedron(e0,e1,_e2,e3);
+  Nef_polyhedron_3 N3(P3);
+  
+  Polyhedron_3 P4;
+  P4.make_tetrahedron(e0,_e1,_e2,e3);
+  Nef_polyhedron_3 N4(P4);
+
+  Polyhedron_3 P5;
+  P5.make_tetrahedron(e0,e1,e2,_e3);
+  Nef_polyhedron_3 N5(P5);
+
+  Polyhedron_3 P6;
+  P6.make_tetrahedron(e0,_e1,e2,_e3);
+  Nef_polyhedron_3 N6(P6);
+
+  Polyhedron_3 P7;
+  P7.make_tetrahedron(e0,e1,_e2,_e3);
+  Nef_polyhedron_3 N7(P7);
+
+  Polyhedron_3 P8;
+  P8.make_tetrahedron(e0,_e1,_e2,_e3);
+  Nef_polyhedron_3 N8(P8);
+
+  //Create triangles
+  Polyhedron_3 P9;
+  P9.make_triangle(e0,e1,e2);
+  Nef_polyhedron_3 N9(P9);
+
+  Polyhedron_3 P10;
+  P10.make_triangle(e0,e1,e3);
+  Nef_polyhedron_3 N10(P10);
+
+  Polyhedron_3 P11;
+  P11.make_triangle(e0,e2,e3);
+  Nef_polyhedron_3 N11(P11);
+
+  Polyhedron_3 P12;
+  P12.make_triangle(e1,e2,e3);
+  Nef_polyhedron_3 N12(P12);
+
+  Polyhedron_3 P13;
+  P13.make_triangle(e0,_e1,e2);
+  Nef_polyhedron_3 N13(P13);
+
+  Polyhedron_3 P14;
+  P14.make_triangle(e0,_e1,e3);
+  Nef_polyhedron_3 N14(P14);
+
+  Polyhedron_3 P15;
+  P15.make_triangle(e0,e2,e3);
+  Nef_polyhedron_3 N15(P15);
+
+  Polyhedron_3 P16;
+  P16.make_triangle(_e1,e2,e3);
+  Nef_polyhedron_3 N16(P16);
+
+  PolyhedronList polyhedrons;
+  PolyhedronList polygons;
+  
+  //single polyhedrons
+  polyhedrons.push_back(N1);
+  polyhedrons.push_back(N2);
+  polyhedrons.push_back(N3);
+  polyhedrons.push_back(N4);
+  polyhedrons.push_back(N5);
+  polyhedrons.push_back(N6);
+  polyhedrons.push_back(N7);
+  polyhedrons.push_back(N8);
+  
+  //combined tetrehedrons
+  polyhedrons.push_back(N1 + N2);
+  polyhedrons.push_back(N1 + N2 + N3);
+  polyhedrons.push_back(N1 + N2 + N3 + N4);
+
+  polyhedrons.push_back(N5 + N6);
+  polyhedrons.push_back(N5 + N6 + N7);
+  polyhedrons.push_back(N5 + N6 + N7 + N9);
+
+  polyhedrons.push_back(N1 + N2 + N3 + N4 + N5 + N6 + N7 + N4);
+  
+  //polygons
+  polygons.push_back(N9);
+  polygons.push_back(N10);
+  polygons.push_back(N11);
+  polygons.push_back(N12);
+  polygons.push_back(N13);
+  polygons.push_back(N14);
+  polygons.push_back(N15);
+  polygons.push_back(N16);
+
+  //combined polygons
+  polygons.push_back(N9 + N10);
+  polygons.push_back(N9 + N10 + N11);
+  polygons.push_back(N9 + N10 + N11 + N12);
+  
+  polygons.push_back(N13 + N14);
+  polygons.push_back(N13 + N14 + N15);
+  polygons.push_back(N13 + N14 + N15 + N16);
+
+  polygons.push_back(N9 + N10 + N11 + N12 + N13 + N14 + N15 + N12);
+
+  BaryCenterQuadrature quadrature_rule;
+ 
+  int counter = 0;
+  std::cout << "Quadrature rule for Polyhdrons\n" ;
+  std::cout <<"------------------------------\n";
+  for (PolyhedronListIterator pi = polyhedrons.begin(), end = polyhedrons.end();
+       pi != end; ++pi)
+  {
+    cout <<"Next polyhedron: " << ++counter << endl
+    << "##############################" <<endl;
+    quadrature_rule.compute_quadrature_rule(*pi);
+    cout <<"Volume: " << *(quadrature_rule.weights()) <<endl;
+    cout <<"Barycenter: "
+    << quadrature_rule.points()[0] << endl <<endl;
+  }
+
+  counter = 0;
+  std::cout << "Quadrature rule for Polygons\n" ;
+  std::cout <<"------------------------------\n";
+  for (PolyhedronListIterator pi = polygons.begin(), end = polygons.end();
+       pi != end; ++pi)
+  {
+    cout <<"Next polygons: " << ++counter << endl
+    << "##############################" <<endl;
+    quadrature_rule.compute_quadrature_rule(*pi);
+    cout <<"Volume: " << *(quadrature_rule.weights()) <<endl;
+    cout <<"Barycenter: "
+    << quadrature_rule.points()[0] << endl <<endl;
+  }
+
+  return 0;
+}

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/martin_baeker_snippet.cpp'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/martin_baeker_snippet.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/martin_baeker_snippet.cpp	2010-03-18 18:15:26 +0000
@@ -0,0 +1,93 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-02-17  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-02-17
+// Last changed: 2010-02-17
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+// =====================================================================================
+
+  for(Nef_polyhedron::Halffacet_const_iterator
+	f = Cube.halffacets_begin (),
+	end = Cube.halffacets_end();
+      f != end; ++f)
+  {
+   if(f->is_twin()) continue;
+    std::cout << "Outer iteration, next f \n";
+    for(Nef_polyhedron::Halffacet_cycle_const_iterator 
+	  fc = f->facet_cycles_begin(),
+	  end = f->facet_cycles_end();
+	fc != end; ++fc)
+      {
+	std::cout << "Inner iteration, next fc \n";
+	if ( fc.is_shalfedge() )
+	  {
+	    std::cout << "Halfedge consists of points \n";
+	    
+	    Nef_polyhedron::SHalfedge_const_handle h = fc;
+	    Nef_polyhedron::SHalfedge_around_facet_const_circulator hc(h), he(hc);
+	    CGAL_For_all(hc,he)
+	      { // all vertex coordinates in facet cycle
+		Nef_polyhedron::SVertex_const_handle v = hc->source();
+		const Nef_polyhedron::Point_3& point = v->source()->point();
+		std::cout << "p: " << CGAL::to_double(point.x()) << " " <<
+                    CGAL::to_double(point.y()) << " " <<
+                    CGAL::to_double(point.z()) << std::endl;
+
+	      }
+	    
+	  }    
+      }
+    
+  }
+
+  // Alternative to iterating over halfedges:
+//   Nef_polyhedron::Halfedge_const_iterator  e = Cube.halfedges_begin();
+//   CGAL_forall_halfedges(e,Cube) {
+  
+  
+  for(Nef_polyhedron::Halfedge_const_iterator 
+	e = Cube.halfedges_begin(),
+	end = Cube.halfedges_end();
+      e != end; ++e)
+  {
+    const Nef_polyhedron::Vertex_const_handle& s = e->source();
+    const Nef_polyhedron::Vertex_const_handle& t = e->twin()->source();
+    const Nef_polyhedron::Point_3& a = s->point();
+    const Nef_polyhedron::Point_3& b = t->point();
+    std::cout << "From a: " << CGAL::to_double(a.x()) << " " <<
+      CGAL::to_double(a.y()) << " " <<
+      CGAL::to_double(a.z()) << " to b: " <<
+      CGAL::to_double(b.x()) << " " <<
+      CGAL::to_double(b.y()) << " " <<
+      CGAL::to_double(b.z()) <<std::endl;
+    typedef Nef_polyhedron::Object_handle Object_handle;
+    typedef Nef_polyhedron::Vertex_const_handle Vertex_const_handle;
+    Vertex_const_handle v;
+    Object_handle o = Cube.locate(a);
+    if(CGAL::assign(v,o))
+      std::cout << " a is a vertex" << std::endl;
+    else
+      std::cout << " a is not a vertex" << std::endl;
+  }
+
+//   Nef_polyhedron::Vertex_const_iterator v;
+  
+//     CGAL_forall_vertices(v, Cube.sncp())
+  for(Nef_polyhedron::Vertex_const_iterator 
+	v = Cube.vertices_begin(),
+	end = Cube.vertices_end();
+      v != end; ++v)
+    {
+    const Nef_polyhedron::Point_3& a = v->point();
+    std::cout << "Vertex: " << CGAL::to_double(a.x()) << " " <<
+      CGAL::to_double(a.y()) << " " <<
+      CGAL::to_double(a.z()) << std::endl;
+      
+    }

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/test.cpp'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/test.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/test.cpp	2010-04-02 22:47:40 +0000
@@ -0,0 +1,598 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-04-01  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-04-01
+// Last changed: 2010-04-03
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+//Description: Unittest for BaryCenterQuadrature. =====================================================================================
+
+#include<vector>
+#include <iostream>
+
+#include <dolfin.h>
+#include <dolfin/common/unittest.h>
+
+#include <CGAL/Nef_polyhedron_3.h>
+#include "BaryCenterQuadrature.h"
+
+using namespace dolfin;
+
+typedef Nef_polyhedron_3::Aff_transformation_3 Aff_transformation_3;
+
+typedef std::vector<Nef_polyhedron_3> PolyhedronList;
+typedef PolyhedronList::const_iterator PolyhedronListIterator;
+
+typedef std::vector<int> IntList;
+typedef std::vector<int>::const_iterator IntListIterator;
+typedef std::vector<double> DoubleList;
+typedef std::vector<double>::const_iterator DoubleListIterator;
+typedef std::vector<Point> PointList;
+typedef std::vector<Point>::const_iterator PointListIterator;
+
+class BaryCenter : public CppUnit::TestFixture
+{
+  CPPUNIT_TEST_SUITE(BaryCenter);
+  CPPUNIT_TEST(testSimplePolyhedrons);
+  CPPUNIT_TEST(testSimplePolygons);
+  CPPUNIT_TEST(testComplexPolyhedrons);
+  CPPUNIT_TEST(testComplexPolygons);
+  CPPUNIT_TEST_SUITE_END();
+
+
+  void almost_equal_points(const Point & p1, const Point & p2, double delta)
+  {
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(p1.x(),p2.x(),delta);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(p1.y(),p2.y(),delta);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(p1.z(),p2.z(),delta);
+  }
+
+  //Helper function to create reference polyhedrons.
+  void add_test_polyhedron(const Point_3 & p1,
+			   const Point_3 & p2, 
+			   const Point_3 & p3, 
+			   const Point_3 & p4,
+			   PolyhedronList & polyhedrons
+			  )
+  {
+    Polyhedron_3 P;
+    P.make_tetrahedron(p1,p2,p3,p4);
+    Nef_polyhedron_3 N(P);
+    polyhedrons.push_back(N);
+  }
+
+  void add_test_polyhedron(const Point_3 & p1,
+			   const Point_3 & p2, 
+			   const Point_3 & p3, 
+			   PolyhedronList & polyhedrons
+			  )
+  {
+    Polyhedron_3 P;
+    P.make_triangle(p1,p2,p3);
+    Nef_polyhedron_3 N(P);
+    polyhedrons.push_back(N);
+  }
+
+  //Helper function to union disjoint polyhedrons and to compute the volume and barycenter.
+  //Indices indicate which polyhedrons should be unioned. No checks at all (index, disjointness etc)
+  //Computed polyhedrons, volumes and barycenters will be append to the given list.
+  void add_disjoint_polyhedrons(const IntList indices, 
+				PolyhedronList & polyhedrons, 
+				DoubleList & volumes,
+				PointList & points)
+  {
+    double volume = 0;
+    Point point(0,0,0);
+    Nef_polyhedron_3 polyhedron;
+
+    for (IntListIterator i = indices.begin(); i != indices.end(); ++i)
+    {
+      polyhedron += polyhedrons[*i];
+      point += volumes[*i] * points[*i]  ;
+      volume += volumes[*i];
+    }
+    point /= volume;
+
+    polyhedrons.push_back(polyhedron);
+    volumes.push_back(volume);
+    points.push_back(point);
+  }
+
+
+  void testSimplePolyhedrons()
+  {
+    //Create origin and unit vectors.
+    Point_3 e0(0.0, 0.0, 0.0);
+
+    Point_3 e1(1.0, 0.0, 0.0);
+    Point_3 e2(0.0, 1.0, 0.0);
+    Point_3 e3(0.0, 0.0, 1.0);
+
+    Point_3 _e1(-1.0, 0.0, 0.0);
+    Point_3 _e2(0.0, -1.0, 0.0);
+    Point_3 _e3(0.0, 0.0, -1.0);
+
+    //Create tetrahedrons with unit vectors and reference results.
+    DoubleList reference_volumes;
+    PointList reference_bary_centers;
+    PolyhedronList reference_polyhedrons;
+
+    add_test_polyhedron(e0,e1,e2,e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(0.25,0.25,0.25));
+
+    add_test_polyhedron(e0,_e1,e2,e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(-0.25,0.25,0.25));
+
+    add_test_polyhedron(e0,e1,_e2,e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(0.25,-0.25,0.25));
+
+    add_test_polyhedron(e0,_e1,_e2,e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(-0.25,-0.25,0.25));
+
+    add_test_polyhedron(e0,e1,e2,_e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(0.25,0.25,-0.25));
+
+    add_test_polyhedron(e0,_e1,e2,_e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(-0.25,0.25,-0.25));
+
+    add_test_polyhedron(e0,e1,_e2,_e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(0.25,-0.25,-0.25));
+
+    add_test_polyhedron(e0,_e1,_e2,_e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(-0.25,-0.25,-0.25));
+
+    //Add sum of polyhedrons
+    IntList add_indices;
+    add_indices.push_back(0);
+
+    add_indices.push_back(1);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(2);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(3);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(4);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(5);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(6);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(7);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    //Add translated version 
+    //Upper halfspace
+    Nef_polyhedron_3 polyhedron = reference_polyhedrons[0];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(1, 1, 1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(1.25,1.25,1.25));
+
+    polyhedron = reference_polyhedrons[1];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(-1, 1, 1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(-1.25,1.25,1.25));
+
+    polyhedron = reference_polyhedrons[2];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(1, -1, 1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(1.25,-1.25,1.25));
+
+    polyhedron = reference_polyhedrons[3];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(-1, -1, 1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(-1.25,-1.25,1.25));
+
+    polyhedron = reference_polyhedrons[4];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(1, 1, -1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(1.25,1.25,-1.25));
+
+    polyhedron = reference_polyhedrons[5];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(-1, 1, -1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(-1.25,1.25,-1.25));
+
+    polyhedron = reference_polyhedrons[6];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(1, -1, -1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(1.25,-1.25,-1.25));
+
+    polyhedron = reference_polyhedrons[7];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(-1, -1, -1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(1.0/6.0);
+    reference_bary_centers.push_back(Point(-1.25,-1.25,-1.25));
+
+    //Add the disjoint union of the translated polyhedrons.
+    add_indices.clear();
+    add_indices.push_back(15);
+
+    add_indices.push_back(16);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(17);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(18);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(19);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(20);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(21);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(22);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    //Instantiate quadrature rule
+    BaryCenterQuadrature quadrature_rule;
+
+    //Check volume and barycenter for polyhedrons
+    for (dolfin::uint i = 0; i < reference_polyhedrons.size(); ++i)
+    {
+      quadrature_rule.compute_quadrature_rule(reference_polyhedrons[i]);
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(reference_volumes[i],
+				   quadrature_rule.weights()[0], 1.0e-12);
+      almost_equal_points(reference_bary_centers[i], 
+			  quadrature_rule.points()[0], 1.0e-12);
+    }
+  }
+
+  void testSimplePolygons()
+  {
+    //Create origin and unit vectors.
+    Point_3 e0(0.0, 0.0, 0.0);
+
+    Point_3 e1(1.0, 0.0, 0.0);
+    Point_3 e2(0.0, 1.0, 0.0);
+    Point_3 e3(0.0, 0.0, 1.0);
+
+    Point_3 _e1(-1.0, 0.0, 0.0);
+    Point_3 _e2(0.0, -1.0, 0.0);
+    Point_3 _e3(0.0, 0.0, -1.0);
+
+    //Create tetrahedrons with unit vectors and reference results.
+    DoubleList reference_volumes;
+    PointList reference_bary_centers;
+    PolyhedronList reference_polyhedrons;
+
+    //skew plane upper e3 plane
+    add_test_polyhedron(e1,e2,e3,reference_polyhedrons);
+    //todo find exact values
+    reference_volumes.push_back(8.660254e-01);
+    reference_bary_centers.push_back(Point(1.0/3.0,1.0/3.0,1.0/3.0));
+
+    add_test_polyhedron(_e1,e2,e3,reference_polyhedrons);
+    //todo find exact values
+    reference_volumes.push_back(8.660254e-01);
+    reference_bary_centers.push_back(Point(-1.0/3.0,1.0/3.0,1.0/3.0));
+
+    add_test_polyhedron(_e1,_e2,e3,reference_polyhedrons);
+    //todo find exact values
+    reference_volumes.push_back(8.660254e-01);
+    reference_bary_centers.push_back(Point(-1.0/3.0,-1.0/3.0,1.0/3.0));
+
+    add_test_polyhedron(e1,_e2,e3,reference_polyhedrons);
+    //todo find exact values
+    reference_volumes.push_back(8.660254e-01);
+    reference_bary_centers.push_back(Point(1.0/3.0,-1.0/3.0,1.0/3.0));
+
+    //skew plane lower -e3 plane
+    add_test_polyhedron(e1,e2,_e3,reference_polyhedrons);
+    //todo find exact values
+    reference_volumes.push_back(8.660254e-01);
+    reference_bary_centers.push_back(Point(1.0/3.0,1.0/3.0,-1.0/3.0));
+
+    add_test_polyhedron(_e1,e2,_e3,reference_polyhedrons);
+    //todo find exact values
+    reference_volumes.push_back(8.660254e-01);
+    reference_bary_centers.push_back(Point(-1.0/3.0,1.0/3.0,-1.0/3.0));
+
+    add_test_polyhedron(_e1,_e2,_e3,reference_polyhedrons);
+    //todo find exact values
+    reference_volumes.push_back(8.660254e-01);
+    reference_bary_centers.push_back(Point(-1.0/3.0,-1.0/3.0,-1.0/3.0));
+
+    add_test_polyhedron(e1,_e2,_e3,reference_polyhedrons);
+    //todo find exact values
+    reference_volumes.push_back(8.660254e-01);
+    reference_bary_centers.push_back(Point(1.0/3.0,-1.0/3.0,-1.0/3.0));
+
+    //e1-e2 plane
+    add_test_polyhedron(e0,e1,e2,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(1.0/3.0,1.0/3.0,0.0));
+
+    add_test_polyhedron(e0,_e1,e2,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(-1.0/3.0,1.0/3.0,0.0));
+
+    add_test_polyhedron(e0,_e1,_e2,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(-1.0/3.0,-1.0/3.0,0.0));
+
+    add_test_polyhedron(e0,e1,_e2,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(1.0/3.0,-1.0/3.0,0.0));
+
+    //e1-e3 plane
+    add_test_polyhedron(e0,e1,e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(1.0/3.0,0.0,1.0/3.0));
+
+    add_test_polyhedron(e0,_e1,e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(-1.0/3.0,0.0,1.0/3.0));
+
+    add_test_polyhedron(e0,_e1,_e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(-1.0/3.0,0.0,-1.0/3.0));
+
+    add_test_polyhedron(e0,e1,_e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(1.0/3.0,0.0,-1.0/3.0));
+
+    //e2-e3 plane
+    add_test_polyhedron(e0,e2,e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(0.0,1.0/3.0,1.0/3.0));
+
+    add_test_polyhedron(e0,_e2,e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(0.0,-1.0/3.0,1.0/3.0));
+
+    add_test_polyhedron(e0,_e2,_e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(0.0,-1.0/3.0,-1.0/3.0));
+
+    add_test_polyhedron(e0,e2,_e3,reference_polyhedrons);
+    reference_volumes.push_back(1.0/2.0);
+    reference_bary_centers.push_back(Point(0.0,1.0/3.0,-1.0/3.0));
+
+    //Test sum of polyhedrons
+    IntList add_indices;
+    add_indices.push_back(0);
+
+
+    add_indices.push_back(1);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(2);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(3);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(4);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(5);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(6);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(7);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(8);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(9);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+
+    add_indices.push_back(10);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(11);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(12);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(13);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(14);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    add_indices.push_back(15);
+    add_disjoint_polyhedrons(add_indices, 
+			     reference_polyhedrons, 
+			     reference_volumes, 
+			     reference_bary_centers);
+
+    Nef_polyhedron_3 polyhedron = reference_polyhedrons[0];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(1, 1, 1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(reference_volumes[0]); 
+    reference_bary_centers.push_back(reference_bary_centers[0] + Point(1,1,1));  
+
+    polyhedron = reference_polyhedrons[1];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(-1, 1, 1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(reference_volumes[1]); 
+    reference_bary_centers.push_back(reference_bary_centers[1] + Point(-1,1,1));  
+
+    polyhedron = reference_polyhedrons[2];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(1, -1, 1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(reference_volumes[2]); 
+    reference_bary_centers.push_back(reference_bary_centers[2] + Point(1,-1,1));  
+
+    polyhedron = reference_polyhedrons[3];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(-1, -1, 1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(reference_volumes[3]); 
+    reference_bary_centers.push_back(reference_bary_centers[3] + Point(-1,-1,1));  
+
+    polyhedron = reference_polyhedrons[4];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(1, 1, -1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(reference_volumes[4]); 
+    reference_bary_centers.push_back(reference_bary_centers[4] + Point(1,1,-1));  
+
+    polyhedron = reference_polyhedrons[5];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(-1, 1, -1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(reference_volumes[5]); 
+    reference_bary_centers.push_back(reference_bary_centers[5] + Point(-1,1,-1));  
+
+    polyhedron = reference_polyhedrons[6];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(1, -1, -1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(reference_volumes[6]); 
+    reference_bary_centers.push_back(reference_bary_centers[6] + Point(1,-1,-1));  
+
+    polyhedron = reference_polyhedrons[7];
+    polyhedron.transform(Aff_transformation_3(CGAL::TRANSLATION, Vector_3(-1, -1, -1)));
+    reference_polyhedrons.push_back(polyhedron);
+    reference_volumes.push_back(reference_volumes[7]); 
+    reference_bary_centers.push_back(reference_bary_centers[7] + Point(-1,-1,-1));  
+
+    //Instantiate quadrature rule
+    BaryCenterQuadrature quadrature_rule;
+
+    //Check volume and barycenter for polyhedrons
+    for (dolfin::uint i = 0; i < reference_polyhedrons.size(); ++i)
+    {
+      quadrature_rule.compute_quadrature_rule(reference_polyhedrons[i]);
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(reference_volumes[i],
+				   quadrature_rule.weights()[0], 1.0e-5);
+      almost_equal_points(reference_bary_centers[i], 
+			  quadrature_rule.points()[0], 1.0e-5);
+    }
+  }
+
+  void testComplexPolyhedrons()
+  {
+  }
+
+  void testComplexPolygons()
+  {
+  }
+
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(BaryCenter);
+
+int main()
+{
+  DOLFIN_TEST;
+}

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/tetra'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/tetra	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/tetra	2010-03-18 18:15:26 +0000
@@ -0,0 +1,16 @@
+4
+
+0	0	0
+5	0	0
+0	4	0
+0	0	3
+
+4
+
+3	0 3 2
+3	3 0 1
+3	2 1 0
+3	1 2 3
+
+
+

=== added file 'nitsche_method/integration_on_complex_domains/gauss_projection_green/volInt.c'
--- nitsche_method/integration_on_complex_domains/gauss_projection_green/volInt.c	1970-01-01 00:00:00 +0000
+++ nitsche_method/integration_on_complex_domains/gauss_projection_green/volInt.c	2010-03-26 13:05:51 +0000
@@ -0,0 +1,383 @@
+
+
+	/*******************************************************
+        *                                                      *
+	*  volInt.c                                            *
+	*                                                      *
+	*  This code computes volume integrals needed for      *
+	*  determining mass properties of polyhedral bodies.   *
+	*                                                      *
+	*  For more information, see the accompanying README   *
+	*  file, and the paper                                 *
+	*                                                      *
+	*  Brian Mirtich, "Fast and Accurate Computation of    *
+	*  Polyhedral Mass Properties," journal of graphics    *
+	*  tools, volume 1, number 1, 1996.                    *
+	*                                                      *
+	*  This source code is public domain, and may be used  *
+	*  in any way, shape or form, free of charge.          *
+	*                                                      *
+	*  Copyright 1995 by Brian Mirtich                     *
+	*                                                      *
+	*  mirtich@xxxxxxxxxxxxxxx                             *
+	*  http://www.cs.berkeley.edu/~mirtich                 *
+        *                                                      *
+	*******************************************************/
+
+/*
+	Revision history
+
+	26 Jan 1996	Program creation.
+
+	 3 Aug 1996	Corrected bug arising when polyhedron density
+			is not 1.0.  Changes confined to function main().
+			Thanks to Zoran Popovic for catching this one.
+
+	27 May 1997     Corrected sign error in translation of inertia
+	                product terms to center of mass frame.  Changes 
+			confined to function main().  Thanks to 
+			Chris Hecker.
+*/
+
+
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+using namespace std;
+
+/*
+   ============================================================================
+   constants
+   ============================================================================
+*/
+
+#define MAX_VERTS 100     /* maximum number of polyhedral vertices */
+#define MAX_FACES 100     /* maximum number of polyhedral faces */
+#define MAX_POLYGON_SZ 10 /* maximum number of verts per polygonal face */
+
+#define X 0
+#define Y 1
+#define Z 2
+
+/*
+   ============================================================================
+   macros
+   ============================================================================
+*/
+
+#define SQR(x) ((x)*(x))
+#define CUBE(x) ((x)*(x)*(x))
+
+/*
+   ============================================================================
+   data structures
+   ============================================================================
+*/
+
+typedef struct {
+  int numVerts;
+  double norm[3];
+  double w;
+  int verts[MAX_POLYGON_SZ];
+  struct polyhedron *poly;
+} FACE;
+
+typedef struct polyhedron {
+  int numVerts, numFaces;
+  double verts[MAX_VERTS][3];
+  FACE faces[MAX_FACES];
+} POLYHEDRON;
+
+
+/*
+   ============================================================================
+   globals
+   ============================================================================
+*/
+
+static int A;   /* alpha */
+static int B;   /* beta */
+static int C;   /* gamma */
+
+/* projection integrals */
+static double P1, Pa, Pb, Paa, Pab, Pbb, Paaa, Paab, Pabb, Pbbb;
+
+/* face integrals */
+static double Fa, Fb, Fc, Faa, Fbb, Fcc, Faaa, Fbbb, Fccc, Faab, Fbbc, Fcca;
+
+/* volume integrals */
+static double T0, T1[3], T2[3], TP[3];
+
+
+/*
+   ============================================================================
+   read in a polyhedron
+   ============================================================================
+*/
+
+void readPolyhedron(char *name, POLYHEDRON *p)
+{
+  FILE *fp;
+  char line[200], *c;
+  int i, j, n;
+  double dx1, dy1, dz1, dx2, dy2, dz2, nx, ny, nz, len;
+  FACE *f;
+
+  
+/*  if (!(fp = fopen(name, "r"))) {*/
+/*    printf("i/o error\n");*/
+/*    exit(1);*/
+  }
+  
+  fscanf(fp, "%d", &p->numVerts);
+  printf("Reading in %d vertices\n", p->numVerts);
+  for (i = 0; i < p->numVerts; i++)
+    fscanf(fp, "%lf %lf %lf", 
+	   &p->verts[i][X], &p->verts[i][Y], &p->verts[i][Z]);
+
+  fscanf(fp, "%d", &p->numFaces);
+  printf("Reading in %d faces\n", p->numFaces);
+  for (i = 0; i < p->numFaces; i++) {
+    f = &p->faces[i];
+    f->poly = p;
+    fscanf(fp, "%d", &f->numVerts);
+    for (j = 0; j < f->numVerts; j++) fscanf(fp, "%d", &f->verts[j]);
+
+    /* compute face normal and offset w from first 3 vertices */
+    dx1 = p->verts[f->verts[1]][X] - p->verts[f->verts[0]][X];
+    dy1 = p->verts[f->verts[1]][Y] - p->verts[f->verts[0]][Y];
+    dz1 = p->verts[f->verts[1]][Z] - p->verts[f->verts[0]][Z];
+    dx2 = p->verts[f->verts[2]][X] - p->verts[f->verts[1]][X];
+    dy2 = p->verts[f->verts[2]][Y] - p->verts[f->verts[1]][Y];
+    dz2 = p->verts[f->verts[2]][Z] - p->verts[f->verts[1]][Z];
+    nx = dy1 * dz2 - dy2 * dz1;
+    ny = dz1 * dx2 - dz2 * dx1;
+    nz = dx1 * dy2 - dx2 * dy1;
+    len = sqrt(nx * nx + ny * ny + nz * nz);
+    f->norm[X] = nx / len;
+    f->norm[Y] = ny / len;
+    f->norm[Z] = nz / len;
+    f->w = - f->norm[X] * p->verts[f->verts[0]][X]
+           - f->norm[Y] * p->verts[f->verts[0]][Y]
+           - f->norm[Z] * p->verts[f->verts[0]][Z];
+
+  }
+
+  fclose(fp);
+
+}
+
+/*
+   ============================================================================
+   compute mass properties
+   ============================================================================
+*/
+
+
+/* compute various integrations over projection of face */
+void compProjectionIntegrals(FACE *f)
+{
+  double a0, a1, da;
+  double b0, b1, db;
+  double a0_2, a0_3, a0_4, b0_2, b0_3, b0_4;
+  double a1_2, a1_3, b1_2, b1_3;
+  double C1, Ca, Caa, Caaa, Cb, Cbb, Cbbb;
+  double Cab, Kab, Caab, Kaab, Cabb, Kabb;
+  int i;
+
+  P1 = Pa = Pb = Paa = Pab = Pbb = Paaa = Paab = Pabb = Pbbb = 0.0;
+
+  for (i = 0; i < f->numVerts; i++) {
+    a0 = f->poly->verts[f->verts[i]][A];
+    b0 = f->poly->verts[f->verts[i]][B];
+    a1 = f->poly->verts[f->verts[(i+1) % f->numVerts]][A];
+    b1 = f->poly->verts[f->verts[(i+1) % f->numVerts]][B];
+    da = a1 - a0;
+    db = b1 - b0;
+    a0_2 = a0 * a0; a0_3 = a0_2 * a0; a0_4 = a0_3 * a0;
+    b0_2 = b0 * b0; b0_3 = b0_2 * b0; b0_4 = b0_3 * b0;
+    a1_2 = a1 * a1; a1_3 = a1_2 * a1; 
+    b1_2 = b1 * b1; b1_3 = b1_2 * b1;
+
+    C1 = a1 + a0;
+    Ca = a1*C1 + a0_2; Caa = a1*Ca + a0_3; Caaa = a1*Caa + a0_4;
+    Cb = b1*(b1 + b0) + b0_2; Cbb = b1*Cb + b0_3; Cbbb = b1*Cbb + b0_4;
+    Cab = 3*a1_2 + 2*a1*a0 + a0_2; Kab = a1_2 + 2*a1*a0 + 3*a0_2;
+    Caab = a0*Cab + 4*a1_3; Kaab = a1*Kab + 4*a0_3;
+    Cabb = 4*b1_3 + 3*b1_2*b0 + 2*b1*b0_2 + b0_3;
+    Kabb = b1_3 + 2*b1_2*b0 + 3*b1*b0_2 + 4*b0_3;
+
+    P1 += db*C1;
+    Pa += db*Ca;
+    Paa += db*Caa;
+    Paaa += db*Caaa;
+    Pb += da*Cb;
+    Pbb += da*Cbb;
+    Pbbb += da*Cbbb;
+    Pab += db*(b1*Cab + b0*Kab);
+    Paab += db*(b1*Caab + b0*Kaab);
+    Pabb += da*(a1*Cabb + a0*Kabb);
+  }
+
+  P1 /= 2.0;
+  Pa /= 6.0;
+  Paa /= 12.0;
+  Paaa /= 20.0;
+  Pb /= -6.0;
+  Pbb /= -12.0;
+  Pbbb /= -20.0;
+  Pab /= 24.0;
+  Paab /= 60.0;
+  Pabb /= -60.0;
+}
+
+compFaceIntegrals(FACE *f)
+{
+  double *n, w;
+  double k1, k2, k3, k4;
+
+  compProjectionIntegrals(f);
+
+  w = f->w;
+  n = f->norm;
+  k1 = 1 / n[C]; k2 = k1 * k1; k3 = k2 * k1; k4 = k3 * k1;
+
+  Fa = k1 * Pa;
+  Fb = k1 * Pb;
+  Fc = -k2 * (n[A]*Pa + n[B]*Pb + w*P1);
+
+  Faa = k1 * Paa;
+  Fbb = k1 * Pbb;
+  Fcc = k3 * (SQR(n[A])*Paa + 2*n[A]*n[B]*Pab + SQR(n[B])*Pbb
+	 + w*(2*(n[A]*Pa + n[B]*Pb) + w*P1));
+
+  Faaa = k1 * Paaa;
+  Fbbb = k1 * Pbbb;
+  Fccc = -k4 * (CUBE(n[A])*Paaa + 3*SQR(n[A])*n[B]*Paab 
+	   + 3*n[A]*SQR(n[B])*Pabb + CUBE(n[B])*Pbbb
+	   + 3*w*(SQR(n[A])*Paa + 2*n[A]*n[B]*Pab + SQR(n[B])*Pbb)
+	   + w*w*(3*(n[A]*Pa + n[B]*Pb) + w*P1));
+
+  Faab = k1 * Paab;
+  Fbbc = -k2 * (n[A]*Pabb + n[B]*Pbbb + w*Pbb);
+  Fcca = k3 * (SQR(n[A])*Paaa + 2*n[A]*n[B]*Paab + SQR(n[B])*Pabb
+	 + w*(2*(n[A]*Paa + n[B]*Pab) + w*Pa));
+}
+
+void compVolumeIntegrals(POLYHEDRON *p)
+{
+  FACE *f;
+  double nx, ny, nz;
+  int i;
+
+  T0 = T1[X] = T1[Y] = T1[Z] 
+     = T2[X] = T2[Y] = T2[Z] 
+     = TP[X] = TP[Y] = TP[Z] = 0;
+
+  for (i = 0; i < p->numFaces; i++) {
+
+    f = &p->faces[i];
+
+    nx = fabs(f->norm[X]);
+    ny = fabs(f->norm[Y]);
+    nz = fabs(f->norm[Z]);
+    if (nx > ny && nx > nz) C = X;
+    else C = (ny > nz) ? Y : Z;
+    A = (C + 1) % 3;
+    B = (A + 1) % 3;
+
+    compFaceIntegrals(f);
+
+    T0 += f->norm[X] * ((A == X) ? Fa : ((B == X) ? Fb : Fc));
+
+    T1[A] += f->norm[A] * Faa;
+    T1[B] += f->norm[B] * Fbb;
+    T1[C] += f->norm[C] * Fcc;
+    T2[A] += f->norm[A] * Faaa;
+    T2[B] += f->norm[B] * Fbbb;
+    T2[C] += f->norm[C] * Fccc;
+    TP[A] += f->norm[A] * Faab;
+    TP[B] += f->norm[B] * Fbbc;
+    TP[C] += f->norm[C] * Fcca;
+  }
+
+  T1[X] /= 2; T1[Y] /= 2; T1[Z] /= 2;
+  T2[X] /= 3; T2[Y] /= 3; T2[Z] /= 3;
+  TP[X] /= 2; TP[Y] /= 2; TP[Z] /= 2;
+}
+
+
+/*
+   ============================================================================
+   main
+   ============================================================================
+*/
+
+
+int main(int argc, char *argv[])
+{
+  POLYHEDRON p;
+  double density, mass;
+  double r[3];            /* center of mass */
+  double J[3][3];         /* inertia tensor */
+
+  if (argc != 2) {
+    printf("usage:  %s <polyhedron geometry filename>\n", argv[0]);
+/*    exit(0);*/
+    return 0;
+  }
+
+  readPolyhedron(argv[1], &p);
+
+  compVolumeIntegrals(&p);
+
+
+  printf("\nT1 =   %+20.6f\n\n", T0);
+
+  printf("Tx =   %+20.6f\n", T1[X]);
+  printf("Ty =   %+20.6f\n", T1[Y]);
+  printf("Tz =   %+20.6f\n\n", T1[Z]);
+  
+  printf("Txx =  %+20.6f\n", T2[X]);
+  printf("Tyy =  %+20.6f\n", T2[Y]);
+  printf("Tzz =  %+20.6f\n\n", T2[Z]);
+
+  printf("Txy =  %+20.6f\n", TP[X]);
+  printf("Tyz =  %+20.6f\n", TP[Y]);
+  printf("Tzx =  %+20.6f\n\n", TP[Z]);
+
+  density = 1.0;  /* assume unit density */
+
+  mass = density * T0;
+
+  /* compute center of mass */
+  r[X] = T1[X] / T0;
+  r[Y] = T1[Y] / T0;
+  r[Z] = T1[Z] / T0;
+
+  /* compute inertia tensor */
+  J[X][X] = density * (T2[Y] + T2[Z]);
+  J[Y][Y] = density * (T2[Z] + T2[X]);
+  J[Z][Z] = density * (T2[X] + T2[Y]);
+  J[X][Y] = J[Y][X] = - density * TP[X];
+  J[Y][Z] = J[Z][Y] = - density * TP[Y];
+  J[Z][X] = J[X][Z] = - density * TP[Z];
+
+  /* translate inertia tensor to center of mass */
+  J[X][X] -= mass * (r[Y]*r[Y] + r[Z]*r[Z]);
+  J[Y][Y] -= mass * (r[Z]*r[Z] + r[X]*r[X]);
+  J[Z][Z] -= mass * (r[X]*r[X] + r[Y]*r[Y]);
+  J[X][Y] = J[Y][X] += mass * r[X] * r[Y]; 
+  J[Y][Z] = J[Z][Y] += mass * r[Y] * r[Z]; 
+  J[Z][X] = J[X][Z] += mass * r[Z] * r[X]; 
+
+  printf("center of mass:  (%+12.6f,%+12.6f,%+12.6f)\n\n", r[X], r[Y], r[Z]);
+
+  printf("inertia tensor with origin at c.o.m. :\n");
+  printf("%+15.6f  %+15.6f  %+15.6f\n", J[X][X], J[X][Y], J[X][Z]);
+  printf("%+15.6f  %+15.6f  %+15.6f\n", J[Y][X], J[Y][Y], J[Y][Z]);
+  printf("%+15.6f  %+15.6f  %+15.6f\n\n", J[Z][X], J[Z][Y], J[Z][Z]);
+  
+}

=== added directory 'nitsche_method/integration_on_complex_domains/monte_carlo'
=== added directory 'nitsche_method/integration_on_complex_domains/triangulation'
=== added directory 'nitsche_method/overlapping_meshes'
=== added file 'nitsche_method/overlapping_meshes/MeshIntersector.cpp'
--- nitsche_method/overlapping_meshes/MeshIntersector.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/overlapping_meshes/MeshIntersector.cpp	2010-03-16 14:39:09 +0000
@@ -0,0 +1,175 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-01-16  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-01-16
+// back changed: 2010-01-27
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+// =====================================================================================
+
+#include "OverlappingMeshes.h"
+
+#include <dolfin/mesh/BoundaryMesh.h>
+#include <dolfin/mesh/Vertex.h>
+#include <dolfin/mesh/Cell.h>
+
+#include <dolfin/log/dolfin_log.h>
+#include <dolfin/common/NoDeleter.h>
+
+#include <iostream>
+
+using namespace dolfin;
+using dolfin::uint;
+
+
+  MeshIntersection::OverlapData::OverlapData(boost::shared_ptr<const Mesh> mesh) 
+: mesh(mesh)
+{
+  intersected_domain = MeshFunction<uint>(*mesh,mesh->topology().dim());
+  intersected_domain = 0;
+}
+
+MeshIntersection::MeshIntersection(const Mesh & mesh_1, const Mesh & mesh_2)
+  :
+  _overlapped_domain(new OverlapData(reference_to_no_delete_pointer(mesh_1)))
+  ,_overlapping_domain(new OverlapData(reference_to_no_delete_pointer(mesh_2)))
+  ,_overlapped_boundary(new OverlapData(boost::shared_ptr<const Mesh>(new BoundaryMesh(mesh_1))))
+  ,_overlapping_boundary(new OverlapData(boost::shared_ptr<const Mesh>(new BoundaryMesh(mesh_2))))
+{}
+
+//MeshIntersection::MeshIntersection(boost::shared_ptr<const Mesh> mesh_1, boost::shared_ptr<const Mesh> mesh_2)
+//  :
+//     _overlapped_domain(mesh_1)
+//    ,_overlapping_domain(mesh_2)
+//    _overlapped_boundary(boost::shared_ptr<const Mesh>(new BoundaryMesh(mesh_1)))
+//    ,_overlapping_boundary(boost::shared_ptr<const Mesh>(new BoundaryMesh(mesh_2)))
+//{}
+
+
+void MeshIntersection::compute_overlap_map()
+{
+
+  const Mesh & mesh_1 = *(_overlapped_domain->mesh);
+  const Mesh & mesh_2 = *(_overlapping_domain->mesh);  
+
+  const Mesh & boundary_1 = *(_overlapped_boundary->mesh);
+  const Mesh & boundary_2 = *(_overlapping_boundary->mesh);  
+
+  EntityEntitiesMap & cell_cell_map = _overlapped_domain->entity_entities_map;
+  EntityEntitiesMap & facet_1_cell_2_map = _overlapped_boundary->entity_entities_map;
+  EntityEntitiesMap & facet_2_cell_1_map = _overlapping_boundary->entity_entities_map;
+
+  CellIterator cut_cell(mesh_1);
+  CellIterator cut_facet(boundary_2);
+
+  //Step 1: 
+  //Intersect boundary of mesh_2 with mesh_1.
+  //to get the *partially*
+  //intersected cells of mesh_1. 
+  //This calculates:
+  // a) *partially* intersected cells of mesh1
+  // b) the exterior facets of mesh_2 which are (part) of the artificial interface.
+  // c) *partially* intersected exterior facets of mesh1 and mesh2.
+
+  for (CellIterator cell(boundary_2); !cell.end(); ++cell)
+  {
+    mesh_1.all_intersected_entities(*cell, facet_2_cell_1_map[cell->index()]);
+
+    if (facet_2_cell_1_map[cell->index()].empty())
+      facet_2_cell_1_map.erase(cell->index());
+    //If not empty add cell index and intersecting cell index to the map.
+    else
+    {
+      //Iterate of intersected cell of mesh1, find the overlapping cells of
+      //mesh 2 and mark cells in mesh1 as partially overlapped.
+      for (EntityListIter cell_iter = facet_2_cell_1_map[cell->index()].begin(); cell_iter != facet_2_cell_1_map[cell->index()].end(); ++cell_iter)
+      {
+        mesh_2.all_intersected_entities(cut_cell[*cell_iter], cell_cell_map[*cell_iter]);
+        _overlapped_domain->intersected_domain[*cell_iter] = 1;
+      }
+
+      //Compute partially overlapped boundary cells of mesh1 and mesh2.
+      //
+      //@remark: Clarify whether it is faster to check first if any and then
+      //if compute indeces or just try to compute immediately and erase if the cell
+      //index container is empty. Rational: We want to avoid a copy operator
+      //(linear). A "any intersection" test should have the same complexity as
+      //a "compute all intersection" if no intersection occurs. If a
+      //intersection occurrs, we want to compute all intersection anyway.
+      //1. Version Compute right away and deleting (delete operation is amortized constant) if empty
+      //2. Version Check first and compute if intersected.
+      //3. Compute and assign if not empty
+      //@remark What is faster? Recompute intersecting cells from mesh2 for the
+      //exterior facets in mesh1 or map facet index to cell index, and assign
+      //their cell set (which might be bigger as the set, which really only
+      //intersects the facet).
+
+      EntityList cut_faces;
+      boundary_1.all_intersected_entities(*cell,cut_faces);
+
+      if (!cut_faces.empty())
+      {
+        _overlapping_boundary->intersected_domain[cell->index()] = 1;
+
+        //Compute for each cut exterior facet in mesh1 the cutting cells in
+        //mesh2, mark facet as partially overlapped.
+        for (EntityListIter face_iter = cut_faces.begin(); face_iter != cut_faces.end(); ++face_iter)
+        {
+          mesh_2.all_intersected_entities(cut_facet[*face_iter],facet_1_cell_2_map[*face_iter]);
+          _overlapped_boundary->intersected_domain[*face_iter] = 1;
+        }
+      }
+      else
+      {
+        _overlapping_boundary->intersected_domain[cell->index()] = 2;
+      }
+    }
+  }
+
+  //Step 2:
+  //Determine all cells of Mesh 1, which are fully overlapped. This is done by
+  //going through the cells, check if they are not partially overlapped and
+  //therefore  must then be fully overlapped if  any vertex is intersecting
+  //mesh2.
+  for (CellIterator cell(mesh_1); !cell.end(); ++cell)
+  {
+    if (_overlapped_domain->intersected_domain[cell->index()] != 1 && mesh_2.any_intersected_entity(VertexIterator(*cell)->point()) != -1)
+      _overlapped_domain->intersected_domain[cell->index()] = 2;
+  }
+
+  //Step 3:
+  //Determine all cells of the boundary of mesh 1, which are fully overlapped.
+  //Same method as in Step 2.
+  for (CellIterator cell(boundary_1); !cell.end(); ++cell)
+  {
+    if (_overlapped_boundary->intersected_domain[cell->index()] != 1 
+        && mesh_2.any_intersected_entity(VertexIterator(*cell)->point()) != -1)
+      _overlapped_boundary->intersected_domain[cell->index()] = 2;
+  }
+}
+
+const MeshFunction<uint> & MeshIntersection::overlapped_domain() const
+{
+  return _overlapped_domain->intersected_domain;
+}
+
+const MeshFunction<uint> & MeshIntersection::overlapping_domain() const
+{
+  return _overlapping_domain->intersected_domain;
+}
+
+const MeshFunction<uint> & MeshIntersection::overlapped_boundary() const
+{
+  return _overlapped_boundary->intersected_domain;
+}
+
+const MeshFunction<uint> & MeshIntersection::overlapping_boundary() const
+{
+  return _overlapping_boundary->intersected_domain;
+}

=== added file 'nitsche_method/overlapping_meshes/MeshIntersector.h'
--- nitsche_method/overlapping_meshes/MeshIntersector.h	1970-01-01 00:00:00 +0000
+++ nitsche_method/overlapping_meshes/MeshIntersector.h	2010-03-16 14:39:09 +0000
@@ -0,0 +1,227 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-01-15  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-01-15
+// Last changed: 2010-03-08
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+//Description:  =====================================================================================
+
+#ifndef  __MESHINTERSECTOR_H
+#define  __MESHINTERSECTOR_H
+
+#include <vector>
+#include <map>
+#include <utility>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/shared_array.hpp>
+
+#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
+
+#include <CGAL/Nef_polyhedron_3.h>
+#include <CGAL/Polyhedron_3.h>
+#include <CGAL/Gmpz.h>
+#include <CGAL/Homogeneous.h>
+
+#include <CGAL/IO/Polyhedron_iostream.h>
+#include <CGAL/IO/Nef_polyhedron_iostream_3.h>
+
+#include <dolfin/common/Array.h>
+#include <dolfin/common/types.h>
+#include <dolfin/mesh/Mesh.h>
+#include <dolfin/mesh/MeshFunction.h>
+#include <dolfin/mesh/Point.h>
+
+#include "PrimitiveTraits.h"
+
+namespace dolfin
+{
+  class Mesh;
+
+  typedef std::vector<uint> EntityList;
+  typedef std::vector<uint>::const_iterator EntityListIter;
+  typedef std::map<uint, EntityList> EntityEntitiesMap;
+  typedef std::map<uint, EntityList>::const_iterator EntityEntitiesMapIter;
+//  typedef std::map<const Mesh *,EntityEntitiesMap> MeshCutEntitiesMap;
+
+
+//  typedef CGAL::Homogeneous<CGAL::Gmpz> Kernel;
+  typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
+  typedef CGAL::Polyhedron_3<Kernel>  Polyhedron_3;
+  typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron_3;
+  typedef Nef_polyhedron_3 Polyhedron;
+
+  ///Defines a quadrature rule by a pair of points and weights.
+  typedef std::pair<std::vector<Point>,std::vector<double> > QuadratureRule;  
+
+  class MeshIntersection;
+
+
+  ///@todo:
+  ///@todo Need a function which indicates the end of the iteration.
+  ///Think about a better design after the first version is running.
+  template <int dim> 
+  class MeshIntersectionIterator
+  {
+    typedef Primitive_Converter<3,CGAL::Exact_predicates_exact_constructions_kernel> PT;
+    typedef PT::Polyhedron Polyhedron;
+
+  public:
+    MeshIntersectionIterator(const MeshIntersection & overlapping_mesh);
+    
+    /// Step to the next cut cell and computes the relevant quantities aferwards.
+    MeshIntersectionIterator<dim> & operator++();
+
+    ///Check if we haved reached the end.
+    bool end() { return _map_pos == _map_end_pos; }
+    
+    ///Return a quadrature rule, meaning a list of points and weights.
+//    Quadrature_Rule quadrature_rule();
+
+    ///Returns a presentation of the cut cell.
+    Polyhedron polyhedron() { return _polyhedron ; }
+
+    ///Returns a polyhedron as the presentation of the union of the overlapping cells.
+    Polyhedron overlapping_polyhedron() { return _overlapping_polyhedron; }
+
+    ///Returns a polyhedron as the presentation of the intersected part.
+    Polyhedron overlapped_polyhedron();
+
+  private:
+
+    void compute_polyhedrons();
+
+    const MeshIntersection &  _overlapping_mesh;
+
+    EntityEntitiesMapIter _map_pos;
+    EntityEntitiesMapIter _map_end_pos;
+
+    //Intersected MeshEntity
+    MeshEntityIterator _entity_iter;
+
+    //MeshIterator to iterate over the intersecting cells of the other mesh.
+    MeshEntityIterator _overlapping_entity_iter;
+   
+    //Polydreon, which decodes the intersected part of the cell.
+    Polyhedron _polyhedron;
+
+    //Polydreon, which decodes the the polyhedron, which is built up by the
+    //overlapping cells belonging to the other mesh.
+    Polyhedron _overlapping_polyhedron;
+
+  };
+
+  ///This class present a collection of overlapping meshes and provides
+  ///functionality to compute cell-cell, cell-facet overlaps.
+  ///@todo Improve design, it is very unflexible concerning extension to more than 2 meshes.
+  ///e.g. OverlapData should contain a map, which maps the entity_entities_map to the corresponding
+  ///mesh, which the entitylist is refering to.
+  class MeshIntersection {
+    
+    ///Helper class to store mesh and corresponding data like intersection maps
+    ///and meshfunctions.
+    struct OverlapData {
+      OverlapData(boost::shared_ptr<const Mesh> mesh);
+      boost::shared_ptr<const Mesh> mesh;
+      MeshFunction<uint> intersected_domain;
+
+      EntityEntitiesMap entity_entities_map;
+
+//      MeshCutEntitiesMap entity_entities_map;
+    };
+
+  public:
+
+    ///Constructor takes a list/vector of meshes. The order of meshes defines
+    ///also the "overlapp" priority, i.e. if 2 meshes overlap, the one who
+    //appears later in the list actually covers the later one.
+    MeshIntersection(const Mesh & mesh_1, const Mesh & mesh_2);
+//    MeshIntersection(boost::shared_ptr<const Mesh> mesh_1, boost::shared_ptr<const Mesh> mesh_2);
+
+    ///Computes the overlap mapping. Mesh2  overlaps mesh1. Computes (for
+    ///efficient reasons) in addition the boundary overlaps and the artificial
+    ///interface.
+    void compute_overlap_map();
+
+    //Return meshfunctions. Only first test, think about better design, for
+    //example class like OverlapData or suchlike.
+    const MeshFunction<uint> & overlapped_domain() const;
+    const MeshFunction<uint> & overlapping_domain() const;
+    const MeshFunction<uint> & overlapped_boundary() const;
+    const MeshFunction<uint> & overlapping_boundary() const;
+
+  private:
+    template<int dim>
+    friend class MeshIntersectionIterator;
+    
+    const boost::shared_ptr<OverlapData> _overlapped_domain;
+    const boost::shared_ptr<OverlapData> _overlapping_domain;
+
+    const boost::shared_ptr<OverlapData> _overlapped_boundary;
+    const boost::shared_ptr<OverlapData> _overlapping_boundary;
+
+  };
+
+template <int dim> 
+MeshIntersectionIterator<dim>::MeshIntersectionIterator(const MeshIntersection& overlapping_mesh) 
+  : _overlapping_mesh(overlapping_mesh)
+  
+{
+  _map_pos = overlapping_mesh._overlapped_domain->entity_entities_map.begin(); 
+  _map_end_pos = overlapping_mesh._overlapped_domain->entity_entities_map.end(); 
+
+  ///Oh herregud, please simplify datastructures!!!!
+  _entity_iter = MeshEntityIterator(*(overlapping_mesh._overlapped_domain->mesh),
+				    overlapping_mesh._overlapped_domain->mesh->topology().dim());
+  _entity_iter[_map_pos->first];
+
+  _overlapping_entity_iter = MeshEntityIterator(*(overlapping_mesh._overlapping_domain->mesh),
+						overlapping_mesh._overlapping_domain->mesh->topology().dim());
+  _overlapping_entity_iter[_map_pos->second.front()];
+
+}
+
+template <int dim>
+MeshIntersectionIterator<dim> & MeshIntersectionIterator<dim>::operator++()
+{
+  //Update the entity entities mapping.
+  ++_map_pos;
+  //Bit clumsy, abusing operator[] to set 
+  _entity_iter[_map_pos->first];
+  _overlapping_entity_iter[_map_pos->second.front()];
+
+  ///@todo Change this. Use lazy initialization.
+  compute_polyhedrons();
+  return *this;
+}
+
+template <int dim>
+void MeshIntersectionIterator<dim>::compute_polyhedrons()
+{
+  Polyhedron cell_polyhedron(PT::datum(_entity_iter[_map_pos->first]));
+  _overlapping_polyhedron.clear(); 
+  for (EntityListIter index = _map_pos->second.begin(); index != _map_pos->second.end() ; ++index)
+  {
+    _overlapping_polyhedron += PT::datum(_overlapping_entity_iter[*index]);
+  }
+  cell_polyhedron -= _overlapping_polyhedron;
+}
+
+template <int dim>
+typename MeshIntersectionIterator<dim>::Polyhedron MeshIntersectionIterator<dim>::overlapped_polyhedron()
+{
+  Polyhedron cell_polyhedron(PT::datum(_entity_iter[_map_pos->first]));
+  return cell_polyhedron * _overlapping_polyhedron;  
+}
+
+
+} //end namespace dolfin    
+
+#endif   // ----- #ifndef __MESHINTERSECTOR_H  -----

=== added file 'nitsche_method/overlapping_meshes/PrimitiveTraits.h'
--- nitsche_method/overlapping_meshes/PrimitiveTraits.h	1970-01-01 00:00:00 +0000
+++ nitsche_method/overlapping_meshes/PrimitiveTraits.h	2010-02-10 03:14:09 +0000
@@ -0,0 +1,69 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-02-02  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-02-02
+// Last changed: 2010-02-03
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+// =====================================================================================
+
+#include <dolfin/mesh/Vertex.h>
+#include <dolfin/mesh/Point.h>
+
+#include <CGAL/Nef_polyhedron_3.h>
+#include <CGAL/Point_3.h>
+#include <CGAL/Nef_polyhedron_2.h>
+#include <CGAL/Polyhedron_3.h>
+
+namespace dolfin
+{
+
+  template <int dim, typename Kernel > struct Primitive_Converter ;
+
+  template<typename Kernel> struct Primitive_Converter<2,Kernel>
+  {
+    typedef CGAL::Polyhedron_3<Kernel>  Polyhedron;
+    typedef CGAL::Nef_polyhedron_2<Kernel>  Nef_polyhedron;
+    typedef Nef_polyhedron Datum;
+    typedef typename Kernel::Point_3 Point_3;
+
+    static const int dim = 2;
+
+//    static Datum datum(const MeshEntity & entity) {
+
+//            return Datum(point);
+//    }
+  };
+
+  template<typename Kernel> struct Primitive_Converter<3,Kernel>
+  {
+    typedef CGAL::Polyhedron_3<Kernel>  Polyhedron_3;
+    typedef CGAL::Nef_polyhedron_3<Kernel>  Polyhedron;
+    typedef Polyhedron Datum;
+    typedef typename Kernel::Point_3 Point_3;
+
+    static const int dim = 3;
+    static Datum datum(const MeshEntity & entity) {
+      VertexIterator v(entity);
+      Point_3 p1(v->point());
+      ++v;
+      Point_3 p2(v->point());
+      ++v;
+      Point_3 p3(v->point());
+      ++v;
+      Point_3 p4(v->point());
+
+      Polyhedron_3 Q;
+      Q.make_tetrahedron(p1,p2,p3,p4);
+
+      return Datum(Q);
+    }
+  };
+
+} //end namespace dolfin.

=== added file 'nitsche_method/overlapping_meshes/SConstruct'
--- nitsche_method/overlapping_meshes/SConstruct	1970-01-01 00:00:00 +0000
+++ nitsche_method/overlapping_meshes/SConstruct	2010-03-16 14:39:09 +0000
@@ -0,0 +1,13 @@
+import os, commands
+
+# Get compiler from pkg-config
+compiler = commands.getoutput('pkg-config --variable=compiler dolfin')
+
+# Create a SCons Environment based on the main os environment
+env = Environment(ENV=os.environ, CXX=compiler)
+
+# Get compiler flags from pkg-config
+env.ParseConfig('pkg-config --cflags --libs dolfin')
+
+#Program
+env.Program('overlapping_meshes',['MeshIntersector.cpp','main.cpp'])

=== added file 'nitsche_method/overlapping_meshes/demo.py'
--- nitsche_method/overlapping_meshes/demo.py	1970-01-01 00:00:00 +0000
+++ nitsche_method/overlapping_meshes/demo.py	2010-02-10 03:14:09 +0000
@@ -0,0 +1,35 @@
+
+__author__ = "Andre Massing (massing@xxxxxxxxx)"
+__date__ = "2010-01-27 "
+__copyright__ = "Copyright (C) 2010 Andre Massing"
+__license__  = "GNU LGPL Version 2.1"
+
+from dolfin import *
+from numpy import *
+
+if not has_cgal():
+    print "DOLFIN must be compiled with CGAL to run this demo."
+    exit(0)
+
+# Create meshes (omega0 overlapped by omega1)
+#mesh_1 = UnitCircle(20)
+mesh_1 = UnitSquare(10, 10)
+
+mesh_2 = UnitSquare(10, 10)
+
+# Access mesh geometry
+x = mesh_2.coordinates()
+
+# Move and scale second mesh
+#x *= 0.5
+x += 0.5
+
+overlap = OverlappingMeshes(mesh_1,mesh_2)
+overlap.compute_overlap_map()
+
+overlapped_domain = overlap.overlapped_domain();
+print overlapped_domain
+
+p = plot(overlapped_domain, rescale=False)
+
+interactive()

=== added file 'nitsche_method/overlapping_meshes/main.cpp'
--- nitsche_method/overlapping_meshes/main.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/overlapping_meshes/main.cpp	2010-03-05 23:36:16 +0000
@@ -0,0 +1,108 @@
+// =====================================================================================
+//
+// Copyright (C) 2010-01-28  André Massing
+// Licensed under the GNU LGPL Version 2.1.
+//
+// Modified by André Massing, 2010
+//
+// First added:  2010-01-28
+// Last changed: 2010-02-15
+// 
+//Author:  André Massing (am), massing@xxxxxxxxx
+//Company:  Simula Research Laboratory, Fornebu, Norway
+//
+// =====================================================================================
+
+#include <dolfin/mesh/dolfin_mesh.h>
+#include <dolfin/common/types.h>
+#include <dolfin/plot/dolfin_plot.h>
+
+//#include <CGAL/IO/Qt_widget_Nef_3.h>
+//#include <qapplication.h>
+
+//#include <dolfin.h>
+
+#include "OverlappingMeshes.h"
+
+using namespace dolfin;
+using dolfin::uint;
+
+int main ()
+{
+//  UnitSquare mesh_1(10,10); 
+//  UnitCube mesh_1(10,10,10); 
+  UnitCube mesh_1(10,10,10); 
+
+//  UnitSquare mesh_2(10,10,10); 
+//  UnitCube mesh_2(10,10,10); 
+  UnitSphere mesh_2(10); 
+
+  MeshGeometry& geometry = mesh_2.geometry();
+//  double w = 1;
+  for (VertexIterator v(mesh_2); !v.end(); ++v)
+  {
+    double* x = geometry.x(v->index());
+//    x[0] = cos(w)*(x[0]-0.5) - sin(w)*(x[1]-0.5);
+//    x[1] = sin(w)*(x[0]-0.5) +  cos(w)*(x[1]-0.5);
+    x[0] *= 0.5;
+    x[1] *= 0.5; 
+    x[2] *= 0.5;
+
+    x[0] += 0.4;
+    x[1] += 0.4;
+    x[2] += 0.4;
+  }
+
+  MeshIntersection overlap(mesh_1,mesh_2);
+  overlap.compute_overlap_map();
+
+  MeshIntersectionIterator<3> cell(overlap);
+//  Nef_polyhedron_3  cut_polyhedron = 
+  cell.polyhedron();
+  cell.overlapped_polyhedron();
+  cell.overlapping_polyhedron();
+
+//  Nef_polyhedron_3  overlapped_polyhedron = cell.overlapped_polyhedron();
+//  Nef_polyhedron_3  overlapping_polyhedron = cell.overlapping_polyhedron();
+
+
+//  uint_set cells;
+//  mesh_1.all_intersected_entities(BoundaryMesh(mesh_2),cells);
+
+//  MeshFunction<uint> intersection(mesh_1, mesh_1.topology().dim());
+//  intersection = 0;
+
+//  for (uint_set::const_iterator i = cells.begin(); i != cells.end(); i++)
+//    intersection[*i] = 1;
+//  plot(intersection);
+
+//  BoundaryMesh boundary_1(mesh_1);
+//  BoundaryMesh boundary_2(mesh_2);
+
+//  cells.clear();
+//  boundary_1.all_intersected_entities(boundary_2,cells);
+
+//  MeshFunction<uint> intersection(boundary_1, boundary_1.topology().dim());
+//  intersection = 0;
+
+//  for (uint_set::const_iterator i = cells.begin(); i != cells.end(); i++)
+//    intersection[*i] = 1;
+//  plot(intersection);
+
+  std::cout <<"overlapped_domain:" << std::endl << overlap.overlapped_domain().str(true);
+  plot(overlap.overlapped_domain()); 
+
+  std::cout <<"overlapped_boundary:" << std::endl << overlap.overlapped_boundary().str(true);
+  plot(overlap.overlapped_boundary());
+
+  std::cout <<"overlapping_boundary :" << std::endl << overlap.overlapping_boundary().str(true);
+  plot(overlap.overlapping_boundary());
+  
+  return 0;
+//  QApplication a(argc, argv);
+//  CGAL::Qt_widget_Nef_3<Nef_polyhedron_3>* w = new CGAL::Qt_widget_Nef_3<Nef_polyhedron_3>(cut_polyhedron);
+//  a.setMainWidget(w);
+//  w->show();
+//  return a.exec();
+
+}

=== added directory 'nitsche_method/polyhedrons'
=== added file 'nitsche_method/polyhedrons/SConstruct'
--- nitsche_method/polyhedrons/SConstruct	1970-01-01 00:00:00 +0000
+++ nitsche_method/polyhedrons/SConstruct	2010-03-25 23:33:08 +0000
@@ -0,0 +1,17 @@
+import os, commands
+
+# Get compiler from pkg-config
+compiler = commands.getoutput('pkg-config --variable=compiler dolfin')
+
+# Create a SCons Environment based on the main os environment
+env = Environment(ENV=os.environ, CXX=compiler)
+env.Append(CPPPATH = '/usr/include/qt4/')
+env.Append(CPPPATH = '/usr/include/qt4/Qt')
+env.Append(CPPPATH = '/usr/include/qt4/QtGui')
+
+env.Append(CXXFLAGS = '-ggdb')	
+
+# Get compiler flags from pkg-config
+env.ParseConfig('pkg-config --cflags --libs dolfin')
+
+env.Program(['intersect_polyhedrons.cpp'])

=== added file 'nitsche_method/polyhedrons/intersect_polyhedrons.cpp'
--- nitsche_method/polyhedrons/intersect_polyhedrons.cpp	1970-01-01 00:00:00 +0000
+++ nitsche_method/polyhedrons/intersect_polyhedrons.cpp	2010-02-10 03:14:09 +0000
@@ -0,0 +1,118 @@
+#include <CGAL/Simple_cartesian.h> 
+#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
+#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
+
+#include <CGAL/Nef_polyhedron_3.h>
+#include <CGAL/Nef_polyhedron_2.h>
+#include <CGAL/Polyhedron_3.h>
+#include <CGAL/Gmpz.h>
+#include <CGAL/Homogeneous.h>
+
+#include <CGAL/IO/Polyhedron_iostream.h>
+#include <CGAL/IO/Nef_polyhedron_iostream_3.h>
+
+//#include <CGAL/IO/Qt_widget_Nef_3.h>
+//#include <qapplication.h>
+
+#include <iostream>
+
+#include <vector>
+#include <list>
+
+//typedef CGAL::Simple_cartesian<double> K;
+//typedef CGAL::Simple_cartesian<double> K;
+//typedef CGAL::Exact_predicates_inexact_constructions_kernel<CGAL::Gmpz> K;
+
+//typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
+typedef CGAL::Exact_predicates_exact_constructions_kernel K;
+typedef CGAL::Polyhedron_3<K>  Polyhedron;
+typedef CGAL::Nef_polyhedron_3<K>  Nef_polyhedron;
+
+//typedef CGAL::Homogeneous<CGAL::Gmpz>  K;
+//typedef CGAL::Nef_polyhedron_3<K> Nef_polyhedron_3;
+
+typedef K::Tetrahedron_3 Tetrahedron;
+typedef K::Triangle_3 Triangle;
+typedef K::Segment_3 Segment;
+typedef K::Point_3 Point;
+
+typedef Polyhedron::Vertex_iterator Vertex_iterator;
+typedef std::list<Triangle>::iterator Tri_iterator;
+
+int main()
+{
+  
+  Point a(1.0, 0.0, 0.0);
+  Point b(0.0, 1.0, 0.0);
+  Point c(0.0, 0.0, 1.0);
+  Point d(0.0, 0.0, 0.0);
+
+  Point A(0.1, 0.0, 0.0);
+  Point B(0.0, 0.1, 0.0);
+  Point C(0.0, 0.0, 2.0);
+  Point D(0.0, 0.0, 0.0);
+
+  //Build a point tetrahedron
+  Polyhedron P;
+  P.make_tetrahedron();
+
+  Polyhedron Q;
+  Q.make_tetrahedron(a, b, c, d);
+  Nef_polyhedron NQ(Q);
+
+  Polyhedron R;
+  R.make_tetrahedron(A, B, C, D);
+  Nef_polyhedron NR(R);
+
+  Nef_polyhedron NQ_NR = NQ * NR;
+
+  Polyhedron F;
+  F.make_triangle(A,B,C);
+  Nef_polyhedron NF(F);
+  
+  std::cout << "Exact_predicates_exact_constructions_kernel + SNC_indexed_items"
+	    << std::endl
+	    << "  allows efficient handling of input "
+		 "using floating point coordinates"
+	    << std::endl;
+
+  Nef_polyhedron N = NF * NQ;
+//  Nef_polyhedron N = NF;
+  std ::cout <<"Nef_Polyhedron Tetraeder: " <<std::endl;
+  std::cout <<	NQ ;
+  std ::cout <<"Nef_Polyhedron Triangle: " <<std::endl;
+  std::cout <<	NF ;
+  std ::cout <<"Nef_Polyhedron Intersection: " <<std::endl;
+  std::cout <<	N ;
+
+
+//  if(N.is_simple()) {
+//    N.convert_to_polyhedron(P);
+//    std::cout << P;
+//  } 
+//  else {
+//    std::cout << N;
+//  }
+
+  
+//  CGAL::set_ascii_mode( std::cout);
+//  for (Vertex_iterator v = P.vertices_begin(); v != P.vertices_end(); ++v)
+//    std::cout << v->point() << std::endl;
+//  for (Vertex_iterator v = Q.vertices_begin(); v != Q.vertices_end(); ++v)
+//    std::cout << v->point() << std::endl;
+
+//  if (Q.is_closed())
+
+//  Nef_polyhedron_3 NF(F.vertices_begin(),F.vertices_end());
+
+//  Nef_polyhedron_3 N = NF * NQ;
+//  std::cout << N;
+
+  return 0;
+
+//  QApplication a(argc, argv);
+//  CGAL::Qt_widget_Nef_3<Nef_polyhedron_3>* w = new CGAL::Qt_widget_Nef_3<Nef_polyhedron_3>(NQ_NR);
+//  a.setMainWidget(w);
+//  w->show();
+//  return a.exec();
+}

# Begin bundle
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
2eGDXlbGGtRn1VO0Mi2F1SEo2dWFeMuszjRFrMxwuYla/tbpbNr3zDQJ5Bg33F3DjUqgf9NhzRrR
6Dt4eoDD5MKnJ4edu2iIPPfA2HqAsSwPEQPc6VfBTg4EEF+mzTWVWtk2bJ1xy9pV88t2rjfG0i9k
oJo96g2bIM4BHTj17+T6nvoehEKTgvdVNeGcsgPwptfiDsmfZhY5ZPvIOiZzA4507bViGgVzIvkt
wakIKthBGWT8s2nFngzwZ4M8yIbILGTc8q7C7eNZNyOlpJMirHte8EcUWwbvH8xq7Qr34MXMR534
wnQQ1bZyjHQggyEssXSN1A8iAKLeTMNgYb33YMzcet54X+WXNXi4DF9V72OffV+bf0zUeqpfsuXA
63Jx9h2hk8A/3E2k1+rd2c6EnwGKLERRQgqCERWCkBSCgx2+BDp+r+o7uHi6WQf2nIsyDjPIpfB8
UashZ7yPjDDWUJeZEHr0rwJU+WuUSqgilUxK2z3fCJhZtpd/BGu4HCPwwJLDgsai7zwh6dk1vZzs
Q5Bi7wHSrK2lCpo+6GUth7KVJWgMNsOmMrbCF/mguKJwHiw4wehOy6pH5p7yyo+LblQPsM0uHUXO
JrKSiosWzyiMRrWMNqMRt+Lttttttttttttttttttttttttt22222hbZC2yFtkLbLbbbbbbbW222
2222222222222222222222222222222222222222222222222222222222222222222222222222
2222222222222222222222222222222222222222222227bbbbeO/s1x1ek8eT5Wc06Ont98eYgX
J3IqwZ1Y1WEh6j3TpIiUfZ7qG9I+hQw/i8HWMVwXQ9I5H3fM+i46QXsKrkV6PiayvznQs3PbmiZ5
vIDwzeZuxM/Aa5W0EN2jzrZzcGlppk58AzhYK8iy8/LDePgcS52tu+Wjn4uNhaRwUHU0C1WZ+GvW
BVg+zUzFsr2IZdUFUhVVbK12tkxOuXposySxTS51E/CtODhbTK6MCaebMmDMhnLzGsv/VMuhXdrf
lrz9/O2rZqvhd9BdOwQlWwhLQ3AytXAvuQso7xfaPSJkx2FQqwyBjrhmQTqZaGd6hlE4Rm7WmVGm
IfsiOietv2u3mOeCHtHq7jNYxqhYWiNHlznuO08KI9TWOyHcOd+noDbzaHDcHwNndier6Zj2Lh+r
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

Follow ups