diff --git a/RR-2-patch-test.py b/RR-2-patch-test.py
index 60cbdf8ee4bfb11caaf784878684c34a3dff314b..509d1a29f54e55a81a47a26d0d401875bbf49c2c 100755
--- a/RR-2-patch-test.py
+++ b/RR-2-patch-test.py
@@ -6,6 +6,7 @@ import sympy as sym
 import typing as tp
 import domainPatch as dp
 import LDDsimulation as ldd
+import functools as ft
 #import ufl as ufl
 
 ##### Domain and Interface ####
@@ -29,22 +30,83 @@ sub_domain2_vertices = [df.Point(0.0,0.0),
                         interface12_vertices[0] ]
 # list of subdomains given by the boundary polygon vertices.
 # Subdomains are given as a list of dolfin points forming
-# a closed polygon, such that mshr.Polygon(subdomain_vertices[i]) can be used
-# to create the subdomain. subdomain_vertices[0] contains the
-# vertices of the global simulation domain and subdomain_vertices[i] contains the
+# a closed polygon, such that mshr.Polygon(subdomain_def_points[i]) can be used
+# to create the subdomain. subdomain_def_points[0] contains the
+# vertices of the global simulation domain and subdomain_def_points[i] contains the
 # vertices of the subdomain i.
-subdomain_vertices = [sub_domain0_vertices,#
+subdomain_def_points = [sub_domain0_vertices,#
                       sub_domain1_vertices,#
                       sub_domain2_vertices]
 # in the below list, index 0 corresponds to the 12 interface which has index 1
-interface_vertices = [interface12_vertices]
+interface_def_points = [interface12_vertices]
 # adjacent_subdomains[i] contains the indices of the subdomains sharing the
-# interface i (i.e. given by interface_vertices[i]).
+# interface i (i.e. given by interface_def_points[i]).
 adjacent_subdomains = [[1,2]]
+is_Richards = [True, True]
+viscosity = {#
+# subdom_num : viscosity
+    1 : [1], #
+    2 : [1]
+}
+
+porosity = {#
+# subdom_num : porosity
+    1 : 1,#
+    2 : 1
+}
+
+L = {#
+# subdom_num : subdomain L for L-scheme
+    1 : [0.25],#
+    2 : [0.25]
+}
+
+lambda_param = {#
+# subdom_num : lambda parameter for the L-scheme
+    1 : [4],#
+    2 : [4]
+}
+
+def rel_perm1(s):
+    # relative permeabilty on subdomain1
+    return s**2
+
+_rel_perm1 = ft.partial(rel_perm1)
+
+def rel_perm2(s):
+    # relative permeabilty on subdomain2
+    return s**3
+_rel_perm2 = ft.partial(rel_perm2)
+
+relative_permeability = {#
+    1: _rel_perm1,
+    2: _rel_perm2,
+}
+
+
+# def saturation(pressure, subdomain_index):
+#     # inverse capillary pressure-saturation-relationship
+#     return df.conditional(pressure < 0, 1/((1 - pressure)**(1/(subdomain_index + 1))), 1)
+#
+# sa
+
 
 # initialise LDD simulation class
 simulation = ldd.LDDsimulation()
-simulation.init_meshes_and_markers(subdomain_vertices, mesh_resolution=2)
+simulation.set_parameters(output_dir = "",#
+    subdomain_def_points = subdomain_def_points,#
+    is_Richards = is_Richards,#
+    interface_def_points = interface_def_points,#
+    adjacent_subdomains = adjacent_subdomains,#
+    mesh_resolution = 2,#
+    viscosity = viscosity,#
+    porosity = porosity,#
+    L = L,#
+    lambda_param = lambda_param,#
+    relative_permeability = relative_permeability)
+
+simulation.initialise()
+# simulation._init_meshes_and_markers(subdomain_def_points, mesh_resolution=2)
 # subdomain marker functions
 domain_marker = simulation.domain_marker
 mesh_subdomain = simulation.mesh_subdomain
@@ -52,232 +114,232 @@ mesh_subdomain = simulation.mesh_subdomain
 # mesh = mesh_subdomain[0]
 # interface_marker = df.MeshFunction('size_t', mesh, mesh.topology().dim()-1)
 # interface_marker.set_all(0)
-# interface = dp.Interface(vertices=interface_vertices[0], #
+# interface = dp.Interface(vertices=interface_def_points[0], #
 #                                     tol=mesh.hmin()/100,#
 #                                     internal=True,#
 #                                     adjacent_subdomains = adjacent_subdomains[0])
 # print("interface vertices are: \n", interface.vertices)
 # interface.mark(interface_marker, 1)
-simulation.init_interfaces(interface_vertices, adjacent_subdomains)
+# simulation._init_interfaces(interface_def_points, adjacent_subdomains)
 
 interface = simulation.interface
 interface_marker = simulation.interface_marker
-#
-# subdomain_boundary_marker1 = df.MeshFunction('size_t', mesh_subdomain[1], mesh_subdomain[1].topology().dim()-1)
-# subdomain_boundary_marker2 = df.MeshFunction('size_t', mesh_subdomain[2], mesh_subdomain[2].topology().dim()-1)
-# subdomain_boundary_marker1.set_all(0)
-# subdomain_boundary_marker2.set_all(0)
-# # print(dir(subdomain_boundary_marker1))
-#
-# interface[0].mark(subdomain_boundary_marker1, 1)
-# interface[0].mark(subdomain_boundary_marker2, 1)
-#
-#
-# # domain measures
-# dx1 = df.Measure('dx', domain = mesh_subdomain[1], subdomain_data = subdomain_boundary_marker1)
-# dx2 = df.Measure('dx', domain = mesh_subdomain[2], subdomain_data = subdomain_boundary_marker2)
-#
-# # boundary measures
-# ds1 = df.Measure('ds', domain = mesh_subdomain[1], subdomain_data = subdomain_boundary_marker1)
-# ds2 = df.Measure('ds', domain = mesh_subdomain[2], subdomain_data = subdomain_boundary_marker2)
-#
-# V1 = df.FunctionSpace(mesh_subdomain[1], 'P', 1)
-# p1_exact = df.Expression('1.0 - (1.0 + t*t)*(1.0 + x[0]*x[0] + x[1]*x[1])', domain = mesh_subdomain[1], degree = 2, t = 0)
-#
-# coordinates = mesh_subdomain[0].coordinates()
-# print("global mesh coordinates of domain: \n", coordinates)
-# coordinates1 = mesh_subdomain[1].coordinates()
+
+subdomain_boundary_marker1 = df.MeshFunction('size_t', mesh_subdomain[1], mesh_subdomain[1].topology().dim()-1)
+subdomain_boundary_marker2 = df.MeshFunction('size_t', mesh_subdomain[2], mesh_subdomain[2].topology().dim()-1)
+subdomain_boundary_marker1.set_all(0)
+subdomain_boundary_marker2.set_all(0)
+# print(dir(subdomain_boundary_marker1))
+
+interface[0].mark(subdomain_boundary_marker1, 1)
+interface[0].mark(subdomain_boundary_marker2, 1)
+
+
+# domain measures
+dx1 = df.Measure('dx', domain = mesh_subdomain[1], subdomain_data = subdomain_boundary_marker1)
+dx2 = df.Measure('dx', domain = mesh_subdomain[2], subdomain_data = subdomain_boundary_marker2)
+
+# boundary measures
+ds1 = df.Measure('ds', domain = mesh_subdomain[1], subdomain_data = subdomain_boundary_marker1)
+ds2 = df.Measure('ds', domain = mesh_subdomain[2], subdomain_data = subdomain_boundary_marker2)
+
+V1 = df.FunctionSpace(mesh_subdomain[1], 'P', 1)
+p1_exact = df.Expression('1.0 - (1.0 + t*t)*(1.0 + x[0]*x[0] + x[1]*x[1])', domain = mesh_subdomain[1], degree = 2, t = 0)
+
+coordinates = mesh_subdomain[0].coordinates()
+print("global mesh coordinates of domain: \n", coordinates)
+coordinates1 = mesh_subdomain[1].coordinates()
+
+coordinates2 = mesh_subdomain[2].coordinates()
+submesh1_data = mesh_subdomain[1].data()
+dom1_parent_vertex_indices = submesh1_data.array('parent_vertex_indices',0)
+print("map of dom1 vertices to parent vertices on global domain:\n", dom1_parent_vertex_indices)
 #
 # coordinates2 = mesh_subdomain[2].coordinates()
-# submesh1_data = mesh_subdomain[1].data()
-# dom1_parent_vertex_indices = submesh1_data.array('parent_vertex_indices',0)
-# print("map of dom1 vertices to parent vertices on global domain:\n", dom1_parent_vertex_indices)
-# #
-# # coordinates2 = mesh_subdomain[2].coordinates()
-# # print("\nvertices of subdomain2: \n", coordinates2)
-# submesh2_data = mesh_subdomain[2].data()
-# dom2_parent_vertex_indices = submesh2_data.array('parent_vertex_indices',0)
-# # print("'parent_vertex_indices',1 \n")
-# #
-# #
-# # print("on domain: \n")
-# # interface_coordinates = interface[0].coordinates(interface_marker, 1, print_coordinates = True)
-# # interface_coordinates = interface[0]._vertex_indices(interface_marker, 1, print_vertex_indices = True)
-# print("\non subdomain2: \n")
-# # dom2_interface_coordinates = interface[0].coordinates(subdomain_boundary_marker2, 1, print_coordinates = True)
-# dom2_interface_vertices = interface[0]._vertex_indices(subdomain_boundary_marker2, 1, print_vertex_indices = True)
-#
-#
-# dofs_on_interface1 = interface[0].dofs_on_interface(V1, subdomain_boundary_marker1, 1)
-# print("Dofs on Interface dom1", dofs_on_interface1)
-#
-# V2 = df.FunctionSpace(mesh_subdomain[2], 'P', 1)
-# dofs_on_interface2 = interface[0].dofs_on_interface(V2, subdomain_boundary_marker2, 1)
-# print("Dofs on Interface dom1", dofs_on_interface2)
-#
-# # markermesh = subdomain_boundary_marker2.mesh()
-# # functionSpaceMesh = V2.mesh()
-# # print("Domain 2 mesh extracted from markerfunction:\n", markermesh.coordinates())
-# # print("Domain 2 mesh extracted from Function Space V2:\n", functionSpaceMesh.coordinates())
-#
-# dom1_d2v = df.dof_to_vertex_map(V1)
-# dom1_v2d = df.vertex_to_dof_map(V1)
-# print("dof to vertex map for V1:\n", dom1_d2v)
-# print("vertex to dof map for V1:\n", dom1_v2d)
-# dom2_d2v = df.dof_to_vertex_map(V2)
-# dom2_v2d = df.vertex_to_dof_map(V2)
-# print("dof to vertex map for V2:\n", dom2_d2v)
-# print("vertex to dof map for V2:\n", dom2_v2d)
-#
-# testf1 = df.Constant(41)
-# f1test = df.interpolate(testf1, V1)
-# testf2 = df.Constant(42)
-# f2test = df.interpolate(testf2, V2)
-#
-# f1vec = f1test.compute_vertex_values()
-# for i in range(len(f1vec)):
-#     f1vec[i] = i
-#
-# # f1test.vector()[:] = f1vec
-# f1nodal = f1test.vector().get_local()
-# # for i in range(len(f1nodal)):
-# #     f1nodal[i] = i
-#
-# print("nodal values of f1nodal\n", f1nodal)
-#
-# #
-# # print('dofs on interface \n', f1vec[dofs_on_interface])
-# # f1test.vector()[:] = f1vec
-# # print("f1test.vector()[:]\n", f1test.vector()[:])
-# # print("f1test.vector()[dofs_on_interface]\n", f1test.vector()[dofs_on_interface])
-#
-# print("constant function on dom1\n", f1vec)
-#
-# for i in dofs_on_interface1:
-#     print("local dof ind %i, parent = %i", i,dom1_parent_vertex_indices[dom1_d2v[i]])
-#     # f1test.vector() is enumerated by dof not by vertex
-#     f1test.vector()[i] = i
-# # this enumerates according to the dof numbering
-# print("testfunction f1test with set interface values\n", f1test.vector()[:])
-# print("testfunction f1test with get_local\n", f1test.vector().get_local())
-# # f1test.vector()[dom1_v2d[dom1_d2v[dofs_on_interface]]] = f1vec[dofs_on_interface]
-# # .vector()[:] and .vector().get_local() order values according to the vertex numbering
-# print("testfunction f1test with compute_vertex_values\n", f1test.compute_vertex_values())
-# print("testfunction f1test with compute_vertex_values mit d2vmap\n", f1test.compute_vertex_values()[dom1_d2v[:]])
-# i=0
-# for x in coordinates1:
-#      print(f"vertex {i}: f1test[{dom1_v2d[i]}] = {f1test.vector()[dom1_v2d[i]]}\tu({x}) = {f1test(x)}")
-#      i += 1
-# print("\non subdomain1: \n")
-# print("vertices of subdomain1: \n", coordinates1)
-# # dom1_interface_coordinates = interface[0].coordinates(subdomain_boundary_marker1, 1, print_coordinates = True)
-# dom1_interface_vertices = interface[0]._vertex_indices(subdomain_boundary_marker1, 1, print_vertex_indices = True)
-#
-# interface[0].write_dofs(fem_function = f1test, #
-#                         interface_dofs = dofs_on_interface1,#
-#                         dof_to_vert_map = dom1_d2v,#
-#                         local_to_parent_vertex_map = dom1_parent_vertex_indices)
-#
-# interface[0].read_dofs(fem_function = f2test, #
-#                         interface_dofs = dofs_on_interface2,#
-#                         dof_to_vert_map = dom2_d2v,#
-#                         local_to_parent_vertex_map = dom2_parent_vertex_indices)
-#
-# i=0
-# for x in coordinates2:
-#      print(f"vertex {i}: f2test[{dom2_v2d[i]}] = {f2test.vector()[dom2_v2d[i]]}\tu({x}) = {f2test(x)}")
-#      i += 1
-# print("\non subdomain2: \n")
-# print("vertices of subdomain2: \n", coordinates2)
-#
-# # dom2_interface_coordinates = interface[0].coordinates(subdomain_boundary_marker2, 1, print_coordinates = True)
-# dom2_interface_vertices = interface[0]._vertex_indices(subdomain_boundary_marker2, 1, print_vertex_indices = True)
-# print("Parent indices", dom2_parent_vertex_indices)
-#
-#
-# u1 = df.TrialFunction(V1)
-# v1 = df.TestFunction(V1)
-#
-# u2 = df.TrialFunction(V2)
-# v2 = df.TestFunction(V2)
-#
-# def relative_permeability(s, subdomain_index):
-#     if subdomain_index == 1:
-#         # relative permeabilty on subdomain1
-#         return s**2
-#     else:
-#         # relative permeabilty on subdomain2
-#         return s**3
-#
-# def saturation(pressure, subdomain_index):
-#     # inverse capillary pressure-saturation-relationship
-#     return df.conditional(pressure < 0, 1/((1 - pressure)**(1/(subdomain_index + 1))), 1)
-#
-#
-# # exact solution
-# # cell = df.Cell("triangle", 2)
-# # x1 = df.SpatialCoordinate(mesh_subdomain[1])
-# # x2 = df.SpatialCoordinate(mesh_subdomain[2])
-#
-# p2_exact = df.Expression('1.0 - (1.0 + t*t)*(1.0 + x[1]*x[1])', domain = mesh_subdomain[2], degree = 2, t = 0)
-# p1_e = df.interpolate(p1_exact, V1)
-# p2_e = df.interpolate(p2_exact, V2)
-# #
-# # initial conditions
-# p1_initial = df.Expression('-(x[0]*x[0] + x[1]*x[1])', domain = mesh_subdomain[1], degree = 2)
-# p2_initial = df.Expression('-x[1]*x[1]', domain = mesh_subdomain[2], degree = 2)
-# p1_0 = df.interpolate(p1_initial, V1)
-# p2_0 = df.interpolate(p2_initial, V2)
-#
-# # Initial boundary value for the pressure on interface
-# p_gamma1 = df.DirichletBC(V1, df.Constant(0.5), subdomain_boundary_marker1, 1)
-# p_gamma2 = df.DirichletBC(V2, df.Constant(0.1), subdomain_boundary_marker2, 1)
-#
-# outerBC1 = df.DirichletBC(V1, p1_exact, subdomain_boundary_marker1, 0)
-# outerBC2 = df.DirichletBC(V2, p2_exact, subdomain_boundary_marker2, 0)
-#
-#
-# ### source terms
-# source1 = df.Expression('4.0/pow(1 + x[0]*x[0] + x[1]*x[1], 2) - t/sqrt( pow(1 + t*t, 3)*(1 + x[0]*x[0] + x[1]*x[1]) )', domain = mesh_subdomain[1], degree = 2, t = 0)
-# source2 = df.Expression('2.0*(1-x[1]*x[1])/pow(1 + x[1]*x[1], 2) - 2*t/(3*pow( pow(1 + t*t, 4)*(1 + x[1]*x[1]), 1/3))', domain = mesh_subdomain[2], degree = 2, t = 0)
-# source1h = df.interpolate(source1, V1)
-# source2h = df.interpolate(source2, V2)
-#
-# L1 = 0.25
-# L2 = L1
-# timestep = 0.1
-# lambda1 = 4
-# lambda2 = lambda1
-# # initial iteartion
-# p1_i = p1_0
-# p2_i = p2_0
-# # initial g_i
-# g1_i = -lambda1*p1_i
-# g2_i = -lambda1*p2_i
+# print("\nvertices of subdomain2: \n", coordinates2)
+submesh2_data = mesh_subdomain[2].data()
+dom2_parent_vertex_indices = submesh2_data.array('parent_vertex_indices',0)
+# print("'parent_vertex_indices',1 \n")
+#
+#
+# print("on domain: \n")
+# interface_coordinates = interface[0].coordinates(interface_marker, 1, print_coordinates = True)
+# interface_coordinates = interface[0]._vertex_indices(interface_marker, 1, print_vertex_indices = True)
+print("\non subdomain2: \n")
+# dom2_interface_coordinates = interface[0].coordinates(subdomain_boundary_marker2, 1, print_coordinates = True)
+dom2_interface_def_points = interface[0]._vertex_indices(subdomain_boundary_marker2, 1, print_vertex_indices = True)
+
+
+dofs_on_interface1 = interface[0].dofs_on_interface(V1, subdomain_boundary_marker1, 1)
+print("Dofs on Interface dom1", dofs_on_interface1)
+
+V2 = df.FunctionSpace(mesh_subdomain[2], 'P', 1)
+dofs_on_interface2 = interface[0].dofs_on_interface(V2, subdomain_boundary_marker2, 1)
+print("Dofs on Interface dom1", dofs_on_interface2)
+
+# markermesh = subdomain_boundary_marker2.mesh()
+# functionSpaceMesh = V2.mesh()
+# print("Domain 2 mesh extracted from markerfunction:\n", markermesh.coordinates())
+# print("Domain 2 mesh extracted from Function Space V2:\n", functionSpaceMesh.coordinates())
+
+dom1_d2v = df.dof_to_vertex_map(V1)
+dom1_v2d = df.vertex_to_dof_map(V1)
+print("dof to vertex map for V1:\n", dom1_d2v)
+print("vertex to dof map for V1:\n", dom1_v2d)
+dom2_d2v = df.dof_to_vertex_map(V2)
+dom2_v2d = df.vertex_to_dof_map(V2)
+print("dof to vertex map for V2:\n", dom2_d2v)
+print("vertex to dof map for V2:\n", dom2_v2d)
+
+testf1 = df.Constant(41)
+f1test = df.interpolate(testf1, V1)
+testf2 = df.Constant(42)
+f2test = df.interpolate(testf2, V2)
+
+f1vec = f1test.compute_vertex_values()
+for i in range(len(f1vec)):
+    f1vec[i] = i
+
+# f1test.vector()[:] = f1vec
+f1nodal = f1test.vector().get_local()
+# for i in range(len(f1nodal)):
+#     f1nodal[i] = i
+
+print("nodal values of f1nodal\n", f1nodal)
+
 #
-# for iterations in range(1):
-#     a1 = (L1*u1*v1)*dx1 + (timestep*df.dot(relative_permeability(saturation(p1_i, 1), 1)*df.grad(u1), df.grad(v1)))*dx1 + (timestep*lambda1*u1*v1)*ds1
-#     rhs1 = (L1*p1_i*v1)*dx1 - ((saturation(p1_i, 1) - saturation(p1_0, 1))*v1)*dx1 + (timestep*(source1 - g1_i)*v1)*ds1
-#     A1 = df.assemble(a1)
-#     b1 = df.assemble(rhs1)
-#     p_gamma1.apply(A1,b1)
-#     outerBC1.apply(A1,b1)
-#     u  = df.Function(V1)
-#     U1 = u.vector()
-#     df.solve(A1,U1,b1)
-#     print('solution:\n', U1)
-#     p1_i.vector()[:] = U1
-#     interface[0].write_dofs(fem_function = p1_i, #
-#                             interface_dofs = dofs_on_interface1,#
-#                             dof_to_vert_map = dom1_d2v,#
-#                             local_to_parent_vertex_map = dom1_parent_vertex_indices)
-# #
-# # Save mesh to file
+# print('dofs on interface \n', f1vec[dofs_on_interface])
+# f1test.vector()[:] = f1vec
+# print("f1test.vector()[:]\n", f1test.vector()[:])
+# print("f1test.vector()[dofs_on_interface]\n", f1test.vector()[dofs_on_interface])
+
+print("constant function on dom1\n", f1vec)
+
+for i in dofs_on_interface1:
+    print("local dof ind %i, parent = %i", i,dom1_parent_vertex_indices[dom1_d2v[i]])
+    # f1test.vector() is enumerated by dof not by vertex
+    f1test.vector()[i] = i
+# this enumerates according to the dof numbering
+print("testfunction f1test with set interface values\n", f1test.vector()[:])
+print("testfunction f1test with get_local\n", f1test.vector().get_local())
+# f1test.vector()[dom1_v2d[dom1_d2v[dofs_on_interface]]] = f1vec[dofs_on_interface]
+# .vector()[:] and .vector().get_local() order values according to the vertex numbering
+print("testfunction f1test with compute_vertex_values\n", f1test.compute_vertex_values())
+print("testfunction f1test with compute_vertex_values mit d2vmap\n", f1test.compute_vertex_values()[dom1_d2v[:]])
+i=0
+for x in coordinates1:
+     print(f"vertex {i}: f1test[{dom1_v2d[i]}] = {f1test.vector()[dom1_v2d[i]]}\tu({x}) = {f1test(x)}")
+     i += 1
+print("\non subdomain1: \n")
+print("vertices of subdomain1: \n", coordinates1)
+# dom1_interface_coordinates = interface[0].coordinates(subdomain_boundary_marker1, 1, print_coordinates = True)
+dom1_interface_def_points = interface[0]._vertex_indices(subdomain_boundary_marker1, 1, print_vertex_indices = True)
+
+interface[0].write_dofs(fem_function = f1test, #
+                        interface_dofs = dofs_on_interface1,#
+                        dof_to_vert_map = dom1_d2v,#
+                        local_to_parent_vertex_map = dom1_parent_vertex_indices)
+
+interface[0].read_dofs(fem_function = f2test, #
+                        interface_dofs = dofs_on_interface2,#
+                        dof_to_vert_map = dom2_d2v,#
+                        local_to_parent_vertex_map = dom2_parent_vertex_indices)
+
+i=0
+for x in coordinates2:
+     print(f"vertex {i}: f2test[{dom2_v2d[i]}] = {f2test.vector()[dom2_v2d[i]]}\tu({x}) = {f2test(x)}")
+     i += 1
+print("\non subdomain2: \n")
+print("vertices of subdomain2: \n", coordinates2)
+
+# dom2_interface_coordinates = interface[0].coordinates(subdomain_boundary_marker2, 1, print_coordinates = True)
+dom2_interface_def_points = interface[0]._vertex_indices(subdomain_boundary_marker2, 1, print_vertex_indices = True)
+print("Parent indices", dom2_parent_vertex_indices)
+
+
+u1 = df.TrialFunction(V1)
+v1 = df.TestFunction(V1)
+
+u2 = df.TrialFunction(V2)
+v2 = df.TestFunction(V2)
+
+def relative_permeability(s, subdomain_index):
+    if subdomain_index == 1:
+        # relative permeabilty on subdomain1
+        return s**2
+    else:
+        # relative permeabilty on subdomain2
+        return s**3
+
+def saturation(pressure, subdomain_index):
+    # inverse capillary pressure-saturation-relationship
+    return df.conditional(pressure < 0, 1/((1 - pressure)**(1/(subdomain_index + 1))), 1)
+
+
+# exact solution
+# cell = df.Cell("triangle", 2)
+# x1 = df.SpatialCoordinate(mesh_subdomain[1])
+# x2 = df.SpatialCoordinate(mesh_subdomain[2])
+
+p2_exact = df.Expression('1.0 - (1.0 + t*t)*(1.0 + x[1]*x[1])', domain = mesh_subdomain[2], degree = 2, t = 0)
+p1_e = df.interpolate(p1_exact, V1)
+p2_e = df.interpolate(p2_exact, V2)
+#
+# initial conditions
+p1_initial = df.Expression('-(x[0]*x[0] + x[1]*x[1])', domain = mesh_subdomain[1], degree = 2)
+p2_initial = df.Expression('-x[1]*x[1]', domain = mesh_subdomain[2], degree = 2)
+p1_0 = df.interpolate(p1_initial, V1)
+p2_0 = df.interpolate(p2_initial, V2)
+
+# Initial boundary value for the pressure on interface
+p_gamma1 = df.DirichletBC(V1, df.Constant(0.5), subdomain_boundary_marker1, 1)
+p_gamma2 = df.DirichletBC(V2, df.Constant(0.1), subdomain_boundary_marker2, 1)
+
+outerBC1 = df.DirichletBC(V1, p1_exact, subdomain_boundary_marker1, 0)
+outerBC2 = df.DirichletBC(V2, p2_exact, subdomain_boundary_marker2, 0)
+
+
+### source terms
+source1 = df.Expression('4.0/pow(1 + x[0]*x[0] + x[1]*x[1], 2) - t/sqrt( pow(1 + t*t, 3)*(1 + x[0]*x[0] + x[1]*x[1]) )', domain = mesh_subdomain[1], degree = 2, t = 0)
+source2 = df.Expression('2.0*(1-x[1]*x[1])/pow(1 + x[1]*x[1], 2) - 2*t/(3*pow( pow(1 + t*t, 4)*(1 + x[1]*x[1]), 1/3))', domain = mesh_subdomain[2], degree = 2, t = 0)
+source1h = df.interpolate(source1, V1)
+source2h = df.interpolate(source2, V2)
+
+L1 = 0.25
+L2 = L1
+timestep = 0.1
+lambda1 = 4
+lambda2 = lambda1
+# initial iteartion
+p1_i = p1_0
+p2_i = p2_0
+# initial g_i
+g1_i = -lambda1*p1_i
+g2_i = -lambda1*p2_i
+
+for iterations in range(1):
+    a1 = (L1*u1*v1)*dx1 + (timestep*df.dot(relative_permeability(saturation(p1_i, 1), 1)*df.grad(u1), df.grad(v1)))*dx1 + (timestep*lambda1*u1*v1)*ds1
+    rhs1 = (L1*p1_i*v1)*dx1 - ((saturation(p1_i, 1) - saturation(p1_0, 1))*v1)*dx1 + (timestep*(source1 - g1_i)*v1)*ds1
+    A1 = df.assemble(a1)
+    b1 = df.assemble(rhs1)
+    p_gamma1.apply(A1,b1)
+    outerBC1.apply(A1,b1)
+    u  = df.Function(V1)
+    U1 = u.vector()
+    df.solve(A1,U1,b1)
+    print('solution:\n', U1)
+    p1_i.vector()[:] = U1
+    interface[0].write_dofs(fem_function = p1_i, #
+                            interface_dofs = dofs_on_interface1,#
+                            dof_to_vert_map = dom1_d2v,#
+                            local_to_parent_vertex_map = dom1_parent_vertex_indices)
+#
+# Save mesh to file
 df.File('./test_domain_layered_soil.xml.gz') << mesh_subdomain[0]
 df.File('./test_global_interface_marker.pvd') << interface_marker
-# df.File('./test_subdomain1.xml.gz') << mesh_subdomain[1]
-# df.File('./test_subdomain2.xml.gz') << mesh_subdomain[2]
-# df.File('./test_domain_marker.pvd') << domain_marker
-# df.File('./test_domain_layered_soil_solution.pvd') << u
-# df.File('./test_subdomain1_boundary_marker.pvd') << subdomain_boundary_marker1
-# df.File('./test_subdomain2_boundary_marker.pvd') << subdomain_boundary_marker2
+df.File('./test_subdomain1.xml.gz') << mesh_subdomain[1]
+df.File('./test_subdomain2.xml.gz') << mesh_subdomain[2]
+df.File('./test_domain_marker.pvd') << domain_marker
+df.File('./test_domain_layered_soil_solution.pvd') << u
+df.File('./test_subdomain1_boundary_marker.pvd') << subdomain_boundary_marker1
+df.File('./test_subdomain2_boundary_marker.pvd') << subdomain_boundary_marker2