diff --git a/CutOffBoundaryFunsNoise/Gamma5/NoiseLevel10/main.py b/CutOffBoundaryFunsNoise/Gamma5/NoiseLevel10/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..16d3a86a55c41bf58db47ac65ea28487f647f40d
--- /dev/null
+++ b/CutOffBoundaryFunsNoise/Gamma5/NoiseLevel10/main.py
@@ -0,0 +1,887 @@
+from numpy import array, linspace, sqrt, linalg, where
+from numpy import logical_not, logical_or, logical_and
+import scipy.signal as signal
+import scipy.io
+import ufl
+
+
+
+def sig(Vs):
+    """ Conductivity function """
+    # Initialization
+    xy = Vs.tabulate_dof_coordinates().reshape((-1,2))
+    
+    N = xy[:,0].size
+    
+    #Test case 1:
+    #a = 2.0
+    #R = 0.8
+    #sig = 1 + np.where(np.power(xy[:,0],2)+np.power(xy[:,1],2) <= np.power(R,2),np.exp(a-np.divide(a,1-np.divide(np.power(xy[:,0],2)+np.power(xy[:,1],2),np.power(R,2)))),0)
+    
+    #Test case 2:
+    sig = 1 + np.where(np.power(xy[:,0]+1/2,2)+np.power(xy[:,1],2) <= np.power(0.3,2),1,0)  + np.where(np.power(xy[:,0],2)+np.power(xy[:,1]+1/2,2) <= np.power(0.1,2),1,0) + np.where(np.power(xy[:,0]-1/2,2)+np.power(xy[:,1]-1/2,2) <= np.power(0.1,2),1,0)
+
+    
+    sigsqrt = np.sqrt(sig)
+    
+    return sig,sigsqrt
+
+   
+
+
+if __name__ == '__main__':
+    import sys
+    # Initialize numpy, IO, matplotlib
+    import numpy as np
+    import scipy.io as io
+    #import matplotlib
+    #matplotlib.use('Agg')
+    import matplotlib.pyplot as plt
+    from matplotlib import ticker
+    #import matplotlib
+    
+    plt.ion()
+    
+    # Load 
+    #import cmap as cmap
+    from dolfin import __version__ as DOLFINversion
+    from dolfin import TrialFunction, TestFunction, FunctionSpace, MeshFunction
+    from dolfin import project, Point, triangle, MixedElement, SubDomain, Measure
+    from dolfin import inner, dot, grad, dx, ds, VectorFunctionSpace, PETScLUSolver, as_backend_type
+    from dolfin import Function, assemble, Expression, parameters, VectorFunctionSpace
+    from dolfin import DirichletBC, as_matrix, interpolate, as_vector, UserExpression, errornorm, norm
+    from dolfin import MeshFunction, cells, solve, DOLFIN_EPS, near, Constant, FiniteElement
+    from mshr import generate_mesh, Circle
+    
+    # Load dolfin plotting
+    from dolfin import plot as dolfinplot, File as dolfinFile
+
+    def plotVs(vec,**kwargs):
+        """ dolfin.plot-wrapper """
+        fn = Function(Vs,vec)
+        return dolfinplot(fn,**kwargs)
+        
+    def plotVs1(vec,**kwargs):
+        """ dolfin.plot-wrapper """
+        fn = Function(Vs1,vec)
+        return dolfinplot(fn,**kwargs)
+        
+        
+    # Define Function spaces
+    
+    def VSpace(mesh, degree=1): # endeligt underrum af H¹_{\diamond} funktioner i H¹ der integrerer til 0 på randen - det svarer til H¹(\Omega) x \mathbb{R}
+        E1 = FiniteElement('P', triangle, degree)
+        E0 = FiniteElement('R', triangle, 0)
+
+        return FunctionSpace(mesh, MixedElement(E1,E0))
+
+    def VsSpace(mesh, degree=1): # Corresponding to H^1
+        E1 = FiniteElement('CG', triangle, degree)
+        return FunctionSpace(mesh, E1)
+    
+    def VqSpace(mesh, degree=1): # Used for the gradients
+        return VectorFunctionSpace(mesh, 'CG', degree)
+        
+    def Vector(V):
+        return Function(V).vector()
+    
+    
+    # Define how to calculate the gradients
+    def Solver(Op):
+        s = PETScLUSolver(as_backend_type(Op),'mumps') # Constructs the linear operator Ks for the  linear system Ks u = f using LU factorization, where the method 'numps' is used
+        return s
+    
+    def GradientSolver(Vq,Vs): #Calculate derivatives on the quadrature points
+        """
+        Based on:
+        https://fenicsproject.org/qa/1425/derivatives-at-the-quadrature-points/
+        """
+        uq = TrialFunction(Vq)
+        vq = TestFunction(Vq)
+        M = assemble(inner(uq,vq)*dx)
+        femSolver = Solver(M)
+    
+        u = TrialFunction(Vs)
+        P = assemble(inner(vq,grad(u))*dx)
+
+        def GradSolver(uvec):
+            gv = Vector(Vq)
+            g = P*uvec
+            femSolver.solve(gv, g)
+            dx = Vector(Vs)
+            dy = Vector(Vs)
+            dx[:] = gv[0::2].copy()
+            dy[:] = gv[1::2].copy()
+            return dx,dy
+
+        return GradSolver
+    
+    # Define the mesh for the unit disk:
+    
+    def UnitCircleMesh(n):
+        C = Circle(Point(0,0),1)
+        return generate_mesh(C,n)
+        
+    #cmaps = cmap.twilights()
+
+    # ------------------------------    
+    # Setup mesh and FEM-spaces
+    
+    parameters['allow_extrapolation'] = True
+    
+    #Mesh to generate the power density data:
+    #Ms = 150
+    Ms = 200 #For N_{medium} as in Table 2
+    #Ms = 250 #For N_{large} as in Table 2
+    
+    m = UnitCircleMesh(Ms)
+    V = VSpace(m,1) 
+    Vs = VsSpace(m,1) 
+    Vq = VqSpace(m,1)
+    
+    #Mesh to solve the inverse problem:
+    #Ms2 = 100
+    Ms2 = 160 #For N_{medium} as in Table 2
+    #Ms2 = 200 #For N_{large} as in Table 2
+    
+    m2 = UnitCircleMesh(Ms2)
+    #V1 = VSpace(m2,1) 
+    Vs1 = VsSpace(m2,1)
+    Vq1 = VqSpace(m2,1)
+    
+    # Gradient solver
+    GradSolver = GradientSolver(Vq,Vs)
+    GradSolver2 = GradientSolver(Vq1,Vs1)
+    
+    xy = Vs.tabulate_dof_coordinates().reshape((-1,2))
+    xy2 = Vs1.tabulate_dof_coordinates().reshape((-1,2))
+    
+    N = xy[:,0].size
+    print(N)
+    N2 = xy2[:,0].size
+    print(N2)
+      
+    # ------------------------------
+    # Conductivity
+    sigt = Function(Vs1)
+    sigsqrtt = Vector(Vs1)
+    
+    sig1 = Function(Vs)
+    sigsqrt1 = Function(Vs)
+    
+    sigt1,sigsqrtt1  = sig(Vs)
+    sigt.vector()[:],sigsqrtt[:] = sig(Vs1)
+    
+    sig1.vector().set_local(sigt1)
+    sigsqrt1.vector().set_local(sigsqrtt1)
+    
+    # Plot
+    
+    plot_settings = {
+        #'levels': np.linspace(-1,2,120),
+        #'levels': np.linspace(0,5,120),
+        'cmap': plt.get_cmap('inferno'),
+    }
+
+    
+    
+    # ------------------------------    
+    # Boundary conditions
+    
+    #Gamma_Mini:
+    #f1 = Expression('cos(std::atan2(x[1],x[0]))-(2.0*sqrt(2.0))/pi', degree=2)
+    #f2 = Expression('sin(std::atan2(x[1],x[0]))+(2.0*sqrt(2.0)-4.0)/pi', degree=1)
+    
+    #Gamma_Sma:
+    #f1 = Expression('cos(std::atan2(x[1],x[0]))-2.0/pi', degree=2)
+    #f2 = Expression('sin(std::atan2(x[1],x[0]))-2.0/pi', degree=1)
+    
+    #Gamma_SmaMed:
+    #f1 = Expression('cos(std::atan2(x[1],x[0]))-(2.0*sqrt(2.0))/(3.0*pi)', degree=2)
+    #f2 = Expression('sin(std::atan2(x[1],x[0]))-(2.0*sqrt(2.0)+4.0)/(3.0*pi)', degree=1)
+    
+    #Gamma_Med:
+    #f1 = Expression('cos(std::atan2(x[1],x[0]))', degree=2)
+    #f2 = Expression('sin(std::atan2(x[1],x[0]))-2.0/pi', degree=1)
+    
+    #Gamma_MedLar:
+    f1 = Expression('cos(std::atan2(x[1],x[0]))+(2.0*sqrt(2.0))/(5.0*pi)', degree=2)
+    f2 = Expression('sin(std::atan2(x[1],x[0]))-(2.0*sqrt(2.0)+4.0)/(5.0*pi)', degree=1)
+    
+    #Gamma_Lar:
+    #f1 = Expression('cos(std::atan2(x[1],x[0]))+2.0/(3.0*pi)', degree=2)
+    #f2 = Expression('sin(std::atan2(x[1],x[0]))-2.0/(3.0*pi)', degree=1)
+    
+    #Gamma_Huge:
+    #f1 = Expression('cos(std::atan2(x[1],x[0]))+(2.0*sqrt(2.0))/(7.0*pi)', degree=2)
+    #f2 = Expression('sin(std::atan2(x[1],x[0]))+(2.0*sqrt(2.0)-4.0)/(7.0*pi)', degree=1)
+    
+    
+    
+    #Gamma_MedLar:
+    #class MyExpression1(UserExpression):
+    #    def eval(self, value, x):
+    #        if (0 < ufl.atan_2(x[1],x[0]) and ufl.atan_2(x[1],x[0]) <= ufl.atan(1)*4.0):
+    #            value[0] = ufl.cos(ufl.atan_2(x[1],x[0]))+(2.0*sqrt(2.0))/(5.0*ufl.atan(1)*4.0)
+    #        elif (-ufl.atan(1)*4.0 < ufl.atan_2(x[1],x[0]) and ufl.atan_2(x[1],x[0]) < -(3.0/4.0)*ufl.atan(1)*4.0):
+    #            value[0] = ufl.cos(ufl.atan_2(x[1],x[0])+2.0*ufl.atan(1)*4.0)+(2.0*sqrt(2.0))/(5.0*ufl.atan(1)*4.0)
+    
+    #class MyExpression2(UserExpression):
+    #    def eval(self, value, x):
+    #        if (0 < ufl.atan_2(x[1],x[0]) and ufl.atan_2(x[1],x[0]) <= ufl.atan(1)*4.0):
+    #            value[0] = ufl.sin(ufl.atan_2(x[1],x[0]))-(2.0*sqrt(2.0)+4.0)/(5.0*ufl.atan(1)*4.0)
+    #        elif (-ufl.atan(1)*4.0 < ufl.atan_2(x[1],x[0]) and ufl.atan_2(x[1],x[0]) < -(3.0/4.0)*ufl.atan(1)*4.0):
+    #            value[0] = ufl.sin(ufl.atan_2(x[1],x[0])+2.0*ufl.atan(1)*4.0)-(2.0*sqrt(2.0)+4.0)/(5.0*ufl.atan(1)*4.0)
+                
+    #f1 = MyExpression1(degree=2)
+    #f2 = MyExpression2(degree=2)
+
+    # Defining \Gamma    
+    class boundaryN(SubDomain):
+    
+        #\Gamma_{small}:
+        #def inside(self, x, on_boundary):
+        #    return (on_boundary and (ufl.atan_2(x[1],x[0])<(1.0/4.0)*np.pi and ufl.atan_2(x[1],x[0])>0) )
+    
+        #\Gamma_{small}:
+        #def inside(self, x, on_boundary):
+        #    return (on_boundary and (ufl.atan_2(x[1],x[0])<(1.0/2.0)*np.pi and ufl.atan_2(x[1],x[0])>0) )
+            
+        #\Gamma_{small}:
+        #def inside(self, x, on_boundary):
+        #    return (on_boundary and (ufl.atan_2(x[1],x[0])<(3.0/4.0)*np.pi and ufl.atan_2(x[1],x[0])>0) )
+        
+        #\Gamma_{medium}:
+        #def inside(self, x, on_boundary):
+        #    return (on_boundary and (ufl.atan_2(x[1],x[0])<np.pi and ufl.atan_2(x[1],x[0])>0) )
+        
+        #\Gamma_{medlar}:    
+        def inside(self, x, on_boundary):
+            return (on_boundary and ((ufl.atan_2(x[1],x[0])<-3.0/4.0*np.pi and ufl.atan_2(x[1],x[0])>-np.pi)  or (ufl.atan_2(x[1],x[0])<np.pi and ufl.atan_2(x[1],x[0])>0)))
+        
+        #\Gamma_{large}:
+        #def inside(self, x, on_boundary):
+        #    return (on_boundary and ((ufl.atan_2(x[1],x[0])<-1.0/2.0*np.pi and ufl.atan_2(x[1],x[0])>-np.pi)  or (ufl.atan_2(x[1],x[0])<np.pi and ufl.atan_2(x[1],x[0])>0)))
+        
+        #\Gamma_{huge}:
+        #def inside(self, x, on_boundary):
+        #    return (on_boundary and ((ufl.atan_2(x[1],x[0])<-1.0/4.0*np.pi and ufl.atan_2(x[1],x[0])>-np.pi)  or (ufl.atan_2(x[1],x[0])<np.pi and ufl.atan_2(x[1],x[0])>0)))
+        
+        #Full:
+        #def inside(self, x, on_boundary):
+        #    return on_boundary
+        
+    
+        
+    bN = boundaryN()
+    
+    boundary_markers = MeshFunction("size_t",m,m.topology().dim()-1,0)
+    boundary_markers.set_all(9999)
+    bN.mark(boundary_markers,0)
+    
+    ds = Measure('ds', domain=m,subdomain_data=boundary_markers)
+   
+        
+        
+    def boundary2(x, on_boundary):
+        return on_boundary
+
+    
+    
+    
+    (u1,c1) = TrialFunction(V)
+    (v1,d1) = TestFunction(V)
+    (u2,c2) = TrialFunction(V)
+    (v2,d2) = TestFunction(V)
+    
+    
+    #Defining and solving the variational equations
+    a1 = (inner(sig1*grad(u1),grad(v1))+c1*v1+u1*d1)*dx
+    a2 = (inner(sig1*grad(u2),grad(v2))+c2*v2+u2*d2)*dx 
+    
+    L1 = f1*v1*ds(0)
+    L2 = f2*v2*ds(0)
+    
+    #L1 = f1*v1*ds
+    #L2 = f2*v2*ds
+    
+    w1 = Function(V)
+    w2 = Function(V)
+    
+    solve(a1 == L1,w1)
+    solve(a2 == L2,w2)
+    
+    (u1,c1) = w1.split()
+    (u2,c2) = w2.split()
+    
+    u1new = interpolate(u1,Vs)
+    u2new = interpolate(u2,Vs)
+    
+    #Defining the gradients
+    dU1 = GradSolver(u1new.vector())
+    dU2 = GradSolver(u2new.vector())
+
+    H11tmp = Vector(Vs)
+    H12tmp = Vector(Vs)
+    H22tmp = Vector(Vs)
+    
+    #Compute the noise free power density data
+    H11tmp[:]  = sig1.vector()*(dU1[0]*dU1[0]+dU1[1]*dU1[1])
+    H12tmp[:]  = sig1.vector()*(dU1[0]*dU2[0]+dU1[1]*dU2[1])
+    H22tmp[:]  = sig1.vector()*(dU2[0]*dU2[0]+dU2[1]*dU2[1])
+ 
+    
+    H11t = Function(Vs)
+    H12t = Function(Vs)
+    H21t = Function(Vs)
+    H22t = Function(Vs)
+    
+    
+    #Add noise to the data by following the approach in section 5.4
+    np.random.seed(50) 
+    
+    e1 = Vector(Vs)
+    e2 = Vector(Vs)
+    e3 = Vector(Vs)
+    e4 = Vector(Vs)
+    
+    e1[:]= np.random.randn(N)
+    e2[:]= np.random.randn(N)
+    e3[:]= np.random.randn(N)
+    e4[:]= np.random.randn(N)
+    
+    #Define the noise level
+    alpha = 10
+    
+    H11t.vector()[:] = H11tmp + alpha/100.0*(e1/norm(e1))*H11tmp
+    H12t.vector()[:] = H12tmp + alpha/100.0*(e2/norm(e2))*H12tmp
+    H21t.vector()[:] = H12tmp + alpha/100.0*(e3/norm(e3))*H12tmp
+    H22t.vector()[:] = H22tmp + alpha/100.0*(e4/norm(e4))*H22tmp
+    
+    S11 = Function(Vs)
+    S12 = Function(Vs)
+    S21 = Function(Vs)
+    S22 = Function(Vs)
+    
+    S11.vector()[:] = sigsqrt1.vector()*dU1[0]
+    S21.vector()[:] = sigsqrt1.vector()*dU1[1]
+    S12.vector()[:] = sigsqrt1.vector()*dU2[0]
+    S22.vector()[:] = sigsqrt1.vector()*dU2[1]
+    
+    #Project the noisy data to the mesh for solving the inverse problem
+    H11tmp = project(H11t,Vs1)
+    H12tmp = project(H12t,Vs1)
+    H21tmp = project(H21t,Vs1)
+    H22tmp = project(H22t,Vs1)
+    
+    H11 = Function(Vs1)
+    H12 = Function(Vs1)
+    H22 = Function(Vs1)
+    
+    #Define a lower bound for the eigenvalues of \tilde{H}
+    lb = 1e-6
+    
+    lbvec = Vector(Vs1)
+    
+    for i in range(N2):
+        H11mat = H11tmp.vector()[i]
+        H12mat = (1/2)*(H12tmp.vector()[i] + H21tmp.vector()[i])
+        H22mat = H22tmp.vector()[i]
+        Hmat = np.array([[H11mat,H12mat],[H12mat,H22mat]])
+        wh,vh = np.linalg.eig(Hmat)
+        H11.vector()[i] = np.maximum(wh[0],lb)*vh[0,0]*vh[0,0] + np.maximum(wh[1],lb)*vh[0,1]*vh[0,1]
+        H12.vector()[i] = np.maximum(wh[0],lb)*vh[0,0]*vh[1,0] + np.maximum(wh[1],lb)*vh[0,1]*vh[1,1]
+        H22.vector()[i] = np.maximum(wh[0],lb)*vh[1,0]*vh[1,0] + np.maximum(wh[1],lb)*vh[1,1]*vh[1,1]
+        if (np.maximum(wh[1],lb)==lb or np.maximum(wh[0],lb)==lb):
+            lbvec[i] = 1
+    
+    plot_settingslb = {
+        'levels': np.linspace(0,1.01,250),
+        #'levels': np.linspace(0,5,120),
+        'cmap': plt.get_cmap('cool'),
+    }
+    
+    plt.figure(20).clear()
+    h = plotVs1(lbvec,**plot_settingslb) # dolfinplot
+    plt.gca().axis('off')
+    cb=plt.colorbar(h)
+    cb.ax.tick_params(labelsize=20)
+    tick_locator = ticker.MaxNLocator(nbins=6)
+    cb.locator = tick_locator
+    cb.update_ticks()
+    
+    for h1 in h.collections:
+        h1.set_edgecolor("face")
+      
+        
+    plt.savefig('lb1e6.pdf',format='pdf')
+    
+    
+    
+    
+    H11tlog = Vector(Vs1)
+    H11tlog[:] = np.log(H11tmp.vector())
+    
+    H11log = Vector(Vs1)
+    H11log[:] = np.log(H11.vector())
+
+    
+    plt.figure(31).clear()
+    h = plotVs1(H11log,**plot_settings) # dolfinplot
+    plt.gca().axis('off')
+    cb=plt.colorbar(h)
+    cb.ax.tick_params(labelsize=20)
+    tick_locator = ticker.MaxNLocator(nbins=6)
+    cb.locator = tick_locator
+    cb.update_ticks()
+    
+    for h1 in h.collections:
+        h1.set_edgecolor("face")
+        
+    plt.savefig('H11_1noiselb1e6cont.pdf',format='pdf')
+    
+    
+    S11_1 = project(S11,Vs1)
+    S12_1 = project(S12,Vs1)
+    S21_1 = project(S21,Vs1)
+    S22_1 = project(S22,Vs1)
+    
+
+    
+    H11log = Vector(Vs1)
+    H11log[:] = np.log(H11.vector())
+    
+    H12log = Vector(Vs1)
+    H12log[:] = np.sign(H12.vector())*np.log(1.0+np.abs(H12.vector())/(5e-3))
+    #H12log[:] = np.sign(H12.vector())*np.log(np.abs(H12.vector()))
+    
+    H22log = Vector(Vs1)
+    H22log[:] = np.log(H22.vector())
+    
+    miH11 = np.amin(H11log.get_local())
+    maH11 = np.amax(H11log.get_local())
+    
+    plot_settingsH11 = {
+        'levels': np.linspace(miH11,maH11,250),
+        #'levels': np.linspace(0,5,120),
+        #'cmap': plt.set_cmap('RdBu'),
+        'cmap': plt.get_cmap('inferno'),
+    }
+    
+    miH12 = np.amin(H12log.get_local())
+    maH12 = np.amax(H12log.get_local())
+    
+    plot_settingsH12 = {
+        'levels': np.linspace(miH12,maH12,250),
+        #'levels': np.linspace(0,5,120),
+        #'cmap': plt.set_cmap('RdBu'),
+        'cmap': plt.get_cmap('inferno'),
+    }
+    
+    miH22 = np.amin(H22log.get_local())
+    maH22 = np.amax(H22log.get_local())
+    
+    plot_settingsH22 = {
+        'levels': np.linspace(miH22,maH22,250),
+        #'levels': np.linspace(0,5,120),
+        #'cmap': plt.set_cmap('RdBu'),
+        'cmap': plt.get_cmap('inferno'),
+    }
+        
+    
+    plt.figure(30)
+    h = plotVs1(H11log,**plot_settingsH11) # dolfinplot
+    plt.gca().axis('off')
+    cb=plt.colorbar(h)
+    cb.ax.tick_params(labelsize=20)
+    tick_locator = ticker.MaxNLocator(nbins=6)
+    cb.locator = tick_locator
+    cb.update_ticks()
+    
+    for h1 in h.collections:
+        h1.set_edgecolor("face")
+        
+    plt.savefig('H11medlog.pdf',format='pdf')
+    
+    plt.figure(31)
+    h = plotVs1(H12log,**plot_settingsH12) # dolfinplot
+    plt.gca().axis('off')
+    cb=plt.colorbar(h)
+    cb.ax.tick_params(labelsize=20)
+    tick_locator = ticker.MaxNLocator(nbins=6)
+    cb.locator = tick_locator
+    cb.update_ticks()
+    
+    for h1 in h.collections:
+        h1.set_edgecolor("face")
+        
+    plt.savefig('H12medlog.pdf',format='pdf')
+    
+    #plt.figure(32).clear()
+    h = plotVs1(H22log,**plot_settingsH22) # dolfinplot
+    plt.gca().axis('off')
+    cb=plt.colorbar(h)
+    cb.ax.tick_params(labelsize=20)
+    tick_locator = ticker.MaxNLocator(nbins=6)
+    cb.locator = tick_locator
+    cb.update_ticks()
+    
+    for h1 in h.collections:
+        h1.set_edgecolor("face")
+        
+    plt.savefig('H22medlog.pdf',format='pdf')
+    
+    
+    
+    #sys.exit()
+    
+    S11_1 = project(S11,Vs1)
+    S12_1 = project(S12,Vs1)
+    S21_1 = project(S21,Vs1)
+    S22_1 = project(S22,Vs1)
+    
+    dt = H11.vector()*H22.vector()-H12.vector()*H12.vector()
+
+    lJac = Vector(Vs1)
+    lJac[:] = np.log(dt)
+    
+    #lJacold = Vector(Vs1)
+    #lJacold[:] = np.log(dtold)
+    
+    midet = np.amin(dt.get_local())
+    madet = np.amax(dt.get_local())
+    
+    plot_settingsdet = {
+        'levels': np.linspace(midet,madet,250),
+        #'levels': np.linspace(0,5,120),
+        'cmap': plt.get_cmap('inferno'),
+    }
+    
+    mildet = np.amin(lJac.get_local())
+    maldet = np.amax(lJac.get_local())
+    
+    plot_settingslJac = {
+        'levels': np.linspace(mildet,maldet,250),
+        #'levels': np.linspace(0,5,120),
+        'cmap': plt.get_cmap('inferno'),
+    }
+    
+
+    
+    #Illustrating log(det(H)):
+    plt.figure(3)
+    h = plotVs1(lJac,**plot_settingslJac) # dolfinplot
+    plt.gca().axis('off')
+    cb=plt.colorbar(h)
+    cb.ax.tick_params(labelsize=20)
+    tick_locator = ticker.MaxNLocator(nbins=6)
+    cb.locator = tick_locator
+    cb.update_ticks()
+    
+    for h1 in h.collections:
+        h1.set_edgecolor("face")
+    
+        
+    plt.savefig('logDetCoordMed.pdf',format='pdf') 
+    
+    #sys.exit()
+
+    dtest = H11.vector()*H22.vector()-H12.vector()*H12.vector()
+    
+    print(min(dtest))
+    
+    d = Vector(Vs1)
+    d[:] = np.sqrt(dtest)
+    
+    #Compute the T matrix as in section 4.3 
+    T11 = np.divide(1,np.sqrt(H11.vector()))
+    T12 = np.zeros(N2)
+    T21 = -np.divide(H12.vector(),np.multiply(np.sqrt(H11.vector()),d))
+    T22 = np.divide(np.sqrt(H11.vector()),d)
+
+    H1211 = Vector(Vs1)
+    H1211[:] = np.divide(H12.vector(),H11.vector())
+    dH1211 = GradSolver2(H1211)
+    
+    #Compute the vector field V21 as in equation (4.7)
+    V210 = Vector(Vs1)
+    V211 = Vector(Vs1)
+
+    V210[:] = -np.multiply(np.divide(H11.vector(),d),dH1211[0])
+    V211[:] = -np.multiply(np.divide(H11.vector(),d),dH1211[1])
+    
+    ld1 = Vector(Vs1)
+    ld1[:] = np.log(np.power(d,2))
+    dld1 = GradSolver2(ld1)
+    
+    #Compute the right hand side \mathbf{F} for the Poisson equation (4.3)
+    dtheta0 = Function(Vs1)
+    dtheta1 = Function(Vs1)
+    dtheta0.vector()[:] = (1/2)*(-V210 + (1/2)*dld1[1])
+    dtheta1.vector()[:] = (1/2)*(-V211 - (1/2)*dld1[0])
+    
+    #Compute the true R and theta
+    R11_1 = np.multiply(S11_1.vector(),T11) + np.multiply(S12_1.vector(),T12)
+    R21_1 = np.multiply(S21_1.vector(),T11) + np.multiply(S22_1.vector(),T12)
+    
+    theta1t = Function(Vs1)
+    theta1t.vector()[:] = np.angle(R11_1+np.multiply(1j,R21_1))
+    
+    theta1testfun = Function(Vs1)
+    theta1testfun.vector()[:] = theta1t.vector()
+    
+    ##The modification of \theta defined in equation (5.1) when using \Gamma_{small}:
+    
+    
+    #Gamma_mini:
+    #indBdr1tmp = np.where((np.arctan2(xy2[:,1],xy2[:,0])< np.pi/2.0) & (np.arctan2(xy2[:,1],xy2[:,0])>0.7688187211))
+    
+    
+    #indBdr1 = np.asarray(indBdr1tmp)
+
+    #indBdr1 = np.reshape(indBdr1,indBdr1.shape[1])
+
+    
+    ##theta1testfun.vector()[indBdr1] = theta1testfun.vector()[indBdr1] + 2*np.pi
+    #theta1testfun.vector()[indBdr1] = theta1testfun.vector()[indBdr1] - 2*np.pi
+    
+    
+    ThetFun = Function(Vs1,theta1t.vector())
+    ThetFunMod = Function(Vs1,theta1testfun.vector())
+    
+    ##Illustration of the modification of \theta at the boundary:
+    
+    #plt.figure(4)
+    #ax = plt.gca()
+    #Nt = 100
+    #ang = np.linspace(-np.pi,np.pi,Nt)
+    #r = 1
+    #bdryTf = [ThetFun(r*np.cos(t),r*np.sin(t)) for t in ang]
+    #bdryTfmod = [ThetFunMod(r*np.cos(t),r*np.sin(t)) for t in ang]
+    #ax.plot(ang, bdryTf,'b-',label=r'$\theta^c\vert_{\partial \Omega}(t)$')
+    #ax.plot(ang, bdryTfmod,'r--',label=r'$\tilde{\theta}^c\vert_{\partial \Omega}(t)$')
+    #ax.legend(loc=2,prop={'size': 16})
+    ##plt.yticks([-3*np.pi/2,-np.pi,-np.pi/2,0,np.pi/2, np.pi],[r'-$\frac{3\pi}{2}$',r'-$\pi$',r'-$\frac{\pi}{2}$',0,r'$\frac{\pi}{2}$',r'$\pi$'])
+    #plt.xticks([-np.pi,-np.pi/2,0,np.pi/2, np.pi],[r'-$\pi$',r'-$\frac{\pi}{2}$',0,r'$\frac{\pi}{2}$',r'$\pi$'])
+    #plt.xlabel(r'$t$',fontsize=20)
+    #ax.tick_params(axis='both', which='major', labelsize=20)
+    #plt.grid(True)
+    ##plt.savefig('ThetaBdrycSma2', bbox_inches="tight")
+    
+    #for h1 in ax.collections:
+    #    h1.set_edgecolor("face")
+    
+        
+    #plt.savefig('ThetaAdapt.pdf',format='pdf') 
+    
+    #sys.exit()
+    
+    #plot_settingsT = {
+    #    'levels': np.linspace(-np.pi,np.pi,250),
+    #    #'levels': np.linspace(0,5,120),
+    #    'cmap': cmaps['twilight_shifted']
+    #}
+    
+    #plt.figure(5)
+    #h = plotVs1(theta1t.vector(),**plot_settings) # dolfinplot
+    #plt.gca().axis('off')
+    #cb=plt.colorbar(h)
+    #cb.ax.tick_params(labelsize=20)
+    #tick_locator = ticker.MaxNLocator(nbins=6)
+    #cb.locator = tick_locator
+    #cb.update_ticks()
+    ##plt.savefig('TrueThetaSmaMod')
+ 
+    bctheta1 = DirichletBC(Vs1, theta1testfun, boundary2)
+
+    theta1 = TrialFunction(Vs1)
+    vt1 = TestFunction(Vs1)
+    
+    #Defining and solving the variational equation for the Poisson problem in (13)
+    a = inner(grad(theta1),grad(vt1))*dx 
+    L = inner(as_vector([dtheta0,dtheta1]),grad(vt1))*dx
+    
+    theta1 = Function(Vs1)
+    solve(a == L,theta1,bctheta1)
+    
+    print((errornorm(theta1,theta1t,'L2')/norm(theta1t,'L2'))*100)
+    
+    #theta1.vector()[:] = theta1testfun.vector()
+
+    
+    cos2 = Function(Vs1)
+    sin2 = Function(Vs1)
+    cos2t = Function(Vs1)
+    sin2t = Function(Vs1)
+    cos2.vector()[:] = np.cos(2*theta1.vector())
+    sin2.vector()[:] = np.sin(2*theta1.vector())
+    cos2t.vector()[:] = np.cos(2*theta1t.vector())
+    sin2t.vector()[:] = np.sin(2*theta1t.vector())
+    
+    mis2 = np.amin(cos2.vector().get_local())
+    mas2 = np.amax(cos2.vector().get_local())
+    
+    plot_settingssin2 = {
+        'levels': np.linspace(mis2,mas2,250),
+        'cmap': plt.get_cmap('inferno'),
+    }
+    
+    #plt.figure(6)
+    #h = plotVs1(theta1.vector(),**plot_settings) # dolfinplot
+    #plt.gca().axis('off')
+    #cb=plt.colorbar(h)
+    #cb.ax.tick_params(labelsize=20)
+    #tick_locator = ticker.MaxNLocator(nbins=6)
+    #cb.locator = tick_locator
+    #cb.update_ticks()
+    
+    #Illustrations of sin(2\theta) and its reconstructed version
+    #plt.figure(6).clear()
+    #h = plotVs1(sin2t.vector(),**plot_settingssin2) # dolfinplot
+    #plt.gca().axis('off')
+    #cb=plt.colorbar(h)
+    #cb.ax.tick_params(labelsize=20)
+    #tick_locator = ticker.MaxNLocator(nbins=6)
+    #cb.locator = tick_locator
+    #cb.update_ticks()
+    
+    #for h1 in h.collections:
+    #    h1.set_edgecolor("face")
+    #    
+    #plt.savefig('TrueThetaLarSin.pdf',format='pdf')
+    
+    #plt.figure(7).clear()
+    #h = plotVs1(sin2.vector(),**plot_settingssin2) # dolfinplot
+    #plt.gca().axis('off')
+    #cb=plt.colorbar(h)
+    #cb.ax.tick_params(labelsize=20)
+    #tick_locator = ticker.MaxNLocator(nbins=6)
+    #cb.locator = tick_locator
+    #cb.update_ticks()
+    
+    #for h1 in h.collections:
+    #    h1.set_edgecolor("face")
+        
+    #plt.savefig('RecThetaLarSin.pdf',format='pdf')
+    
+    #print((errornorm(cos2,cos2t,'L2')/norm(cos2t,'L2'))*100)
+    #print((errornorm(sin2,sin2t,'L2')/norm(sin2t,'L2'))*100)
+    
+    #Defining the vector fields V11 and V22 defined in equation (4.7)
+    V11in = Vector(Vs1)
+    V11in[:] = np.log(np.divide(1,np.sqrt(H11.vector())))
+    V11 = GradSolver2(V11in)
+    V22in = Vector(Vs1)
+    V22in[:] = np.log(np.divide(np.sqrt(H11.vector()),d))
+    V22 = GradSolver2(V22in)
+    
+    V22min = np.amin(V22in.get_local())
+    V22max = np.amax(V22in.get_local())
+    
+    plot_settingsV22 = {
+        'levels': np.linspace(V22min,V22max,250),
+        'cmap': plt.set_cmap('inferno'),
+    }
+    
+    #Illustration of \log(\sqrt(H11)/D) as in figure 8
+    #plt.figure(11).clear()
+    #h = plotVs1(V22in,**plot_settingsV22) # dolfinplot
+    #plt.gca().axis('off')
+    #cb=plt.colorbar(h)
+    #cb.ax.tick_params(labelsize=20)
+    #tick_locator = ticker.MaxNLocator(nbins=6)
+    #cb.locator = tick_locator
+    #cb.update_ticks()
+    
+    #Computing the vector field \mathbf{K} for the right hand side in equation (4.4)
+    Fc0 = V11[0] - V22[0] + V211
+    Fc1 = -V11[1] + V22[1] + V210
+        
+    #Computing \mathbf{G} for the right hand side in (4.4)
+    dlogA0 = Function(Vs1)
+    dlogA1 = Function(Vs1)
+    
+    dlogA0.vector()[:] = np.multiply(np.cos(2*theta1.vector()),Fc0) - np.multiply(np.sin(2*theta1.vector()),Fc1)
+    dlogA1.vector()[:] = np.multiply(np.cos(2*theta1.vector()),Fc1) + np.multiply(np.sin(2*theta1.vector()),Fc0)
+    
+    logAt = Function(Vs1)
+    logAt.vector()[:] = np.log(sigt.vector())
+    
+    
+    bclogA = DirichletBC(Vs1, logAt, boundary2)
+    
+    
+    logA = TrialFunction(Vs1)
+    vA = TestFunction(Vs1)
+    
+    #Defining and solving the variational formulation of the Poisson problem (4.5)
+    aA = inner(grad(logA),grad(vA))*dx 
+    LA = inner(as_vector([dlogA0,dlogA1]),grad(vA))*dx
+
+    logA = Function(Vs1)
+    solve(aA == LA,logA,bclogA)
+    
+    A = Function(Vs1)
+    A.vector()[:] = np.exp(logA.vector())
+    
+    plot_settings4 = {
+        'levels': np.linspace(0.0,5.1,250),
+        'cmap': plt.set_cmap('inferno'),
+    }
+    
+    plot_settings5 = {
+        'levels': np.linspace(0.8,5.1,250),
+        'cmap': plt.set_cmap('inferno'),
+    }
+
+    
+    #plt.savefig('TrueSigma2.pdf',format='pdf')
+    
+    #plt.figure(9)
+    #h = plotVs1(sigt.vector(),**plot_settings5) # dolfinplot
+    #plt.gca().axis('off')
+    #cb=plt.colorbar(h)
+    #cb.ax.tick_params(labelsize=20)
+    #tick_locator = ticker.MaxNLocator(nbins=6)
+    #cb.locator = tick_locator
+    #cb.update_ticks()
+    
+    #for h1 in h.collections:
+    #    h1.set_edgecolor("face")
+    #    
+    #plt.savefig('TrueSigma.pdf',format='pdf')
+    
+    plt.figure(11)
+    h = plotVs1(A.vector(),**plot_settings5) # dolfinplot
+    plt.gca().axis('off')
+    #cb=plt.colorbar(h)
+    #cb.ax.tick_params(labelsize=20)
+    #tick_locator = ticker.MaxNLocator(nbins=6)
+    #cb.locator = tick_locator
+    #cb.update_ticks()
+    
+    for h1 in h.collections:
+        h1.set_edgecolor("face")
+        
+    plt.savefig('AdaptMedLar.pdf',format='pdf')
+    
+    #Computing the relative L2-error
+    print((errornorm(A,sigt,'L2')/norm(sigt,'L2'))*100)
+    
+    
+    #Saving the data to a file to do illustrations in Matlab
+    io.savemat('AdaptMedLar.mat',{'xy2':xy2,
+    'AdaptMedLar':A.vector().get_local(),
+    'AdaptTrue': sigt.vector().get_local()})
+    
+    np.savez('AdaptMedLar.npz',xy2=xy2,A=A.vector().get_local(),sigt=sigt.vector().get_local())
+
+    
+    
+    
+    
+    
+
+    
+    
+