From 9810f091ea99e7cdf8d4b28a0e6894f88908dd16 Mon Sep 17 00:00:00 2001
From: Boris Martin <boris.martin.be@gmail.com>
Date: Fri, 14 Oct 2022 11:19:57 +0200
Subject: [PATCH] working!

---
 tutorials/poisson_robin_no_overlap/domain.geo | 12 ++---
 tutorials/poisson_robin_no_overlap/main.cpp   | 46 ++++++++-----------
 2 files changed, 24 insertions(+), 34 deletions(-)

diff --git a/tutorials/poisson_robin_no_overlap/domain.geo b/tutorials/poisson_robin_no_overlap/domain.geo
index 805d938e..dbf65fdc 100644
--- a/tutorials/poisson_robin_no_overlap/domain.geo
+++ b/tutorials/poisson_robin_no_overlap/domain.geo
@@ -1,16 +1,16 @@
 // Gmsh project created on Fri Oct  7 15:45:08 2022
 //+
-Point(1) = {0, 0, 0, 0.05};
+Point(1) = {0, 0, 0, 0.02};
 //+
-Point(2) = {1, 0, 0, 0.05};
+Point(2) = {1, 0, 0, 0.02};
 //+
-Point(3) = {2, 0, 0, 0.05};
+Point(3) = {2, 0, 0, 0.02};
 //+
-Point(4) = {2, 1, 0, 0.05};
+Point(4) = {2, 1, 0, 0.02};
 //+
-Point(5) = {1, 1, 0, 0.05};
+Point(5) = {1, 1, 0, 0.02};
 //+
-Point(6) = {0, 1, 0, 0.05};
+Point(6) = {0, 1, 0, 0.02};
 //+
 Line(1) = {1, 2};
 //+
diff --git a/tutorials/poisson_robin_no_overlap/main.cpp b/tutorials/poisson_robin_no_overlap/main.cpp
index 0e369074..77015534 100644
--- a/tutorials/poisson_robin_no_overlap/main.cpp
+++ b/tutorials/poisson_robin_no_overlap/main.cpp
@@ -52,8 +52,8 @@ int main(int argc, char **argv)
 
   Subdomain omega(nDom);
   Interface sigma(nDom);
-  omega(0) = omega0;// | interface;
-  omega(1) = omega1;// | interface;
+  omega(0) = omega0;
+  omega(1) = omega1;
 
   sigma(0, 1) = interface;
   sigma(1, 0) = interface;
@@ -76,35 +76,26 @@ int main(int argc, char **argv)
   InterfaceField< std::complex< double >, Form::Form0 > g("g", sigma, FunctionSpaceTypeForm0::HierarchicalH1, order);
   formulation.addInterfaceField(g);
 
-
-  // First domain
-  // Laplacian(u) = -1 on the domain, and u matches g(1,0) on the interface
-  formulation(0).integral(grad(dof(u(0))), grad(tf(u(0))), omega(0)|interface, gauss);
-  formulation(0).integral(-1.0, tf(u(0)), omega(0)|interface, gauss);
-
-  formulation(0).integral((formulation.artificialSource(-g(1, 0))), tf(u(0)), interface, gauss);
-  //formulation(0).integral(dof(u(0)), tf(u(0)), interface, gauss);
+  double alpha = 1;
 
   // First interface (What 0 sends to 1)
   // Compute g(0,1) such that g(0,1) + g(1,0) = 2 u(0)
-  formulation(0, 1).integral(-dof(g(0, 1)), tf(g(0, 1)), sigma(0, 1), gauss);
-  formulation(0, 1).integral(-formulation.artificialSource(g(1, 0)), tf(g(0, 1)), sigma(0, 1), gauss);
-  formulation(0, 1).integral((2 * u(0)), tf(g(0, 1)), sigma(0, 1), gauss);
-  //formulation(0, 1).integral((2* grad(u(0))) * normal<std::complex<double>>(), tf(g(0, 1)), sigma(0, 1), gauss);
-
 
-  // Second domain
-  formulation(1).integral(grad(dof(u(1))), grad(tf(u(1))), omega(1)|interface, gauss);
-  formulation(1).integral(-1.0, tf(u(1)), omega(1)|interface, gauss);
-
-  formulation(1).integral(formulation.artificialSource(-g(0, 1)), tf(u(1)), interface, gauss);
-  //formulation(1).integral(dof(u(1)), tf(u(1)), interface, gauss);
-
-  // Second interface
-  formulation(1, 0).integral(-dof(g(1, 0)), tf(g(1, 0)), sigma(1, 0), gauss);
-  formulation(1, 0).integral(-formulation.artificialSource(g(0, 1)), tf(g(1, 0)), sigma(1, 0), gauss);
-  formulation(1, 0).integral((2*u(1)), tf(g(1, 0)), sigma(1, 0), gauss);
-  //formulation(1, 0).integral((2* grad(u(1))) * normal<std::complex<double>>(), tf(g(0, 1)), sigma(0, 1), gauss);
+  for (int i = 0; i <= 1; ++i) {
+    std::complex<double> im(0.0, 1.0);
+    auto other = 1-i;
+    // Domain
+    formulation(i).integral(grad(dof(u(i))), grad(tf(u(i))), omega(i), gauss);
+    formulation(i).integral(formulation.physicalSource(-1.0), tf(u(i)), omega(i), gauss);
+    formulation(i).integral(formulation.artificialSource(-g(other, i)), tf(u(i)), interface, gauss);
+    formulation(i).integral(alpha * (dof(u(i))), tf(u(i)), interface, gauss);
+
+    // Interface
+    formulation(i, other).integral(dof(g(i, other)), tf(g(i, other)), sigma(i, other), gauss);
+    formulation(i, other).integral(formulation.artificialSource(g(other, i)), tf(g(i, other)), sigma(i, other), gauss);
+    // It is critical that u(i) be not an artificial source (why ?)
+    formulation(i, other).integral(((-2.0 * alpha) * u(i)), tf(g(i, other)), sigma(i, other), gauss);
+  }
 
 
   formulation.pre();
@@ -117,7 +108,6 @@ int main(int argc, char **argv)
     if(isItMySubdomain(i)) {
       save(u(i), omega(i), "u_" + std::to_string(i));
       save(u(i) - trueSolution, omega(i), "err_" + std::to_string(i));
-      save(g(i, 1-i), sigma(i,1-i), "g");
     }
   }
 
-- 
GitLab