[cig-commits] commit: Split out the Interface constructor into a separate file. Interface

Mercurial hg at geodynamics.org
Thu Mar 22 15:17:52 PDT 2012


changeset:   112:f80876a0a634
tag:         tip
user:        Walter Landry <wlandry at caltech.edu>
date:        Thu Mar 22 15:16:26 2012 -0700
files:       Interface.hxx Interface/Interface.cxx wscript
description:
Split out the Interface constructor into a separate file.  Interface
also handles corners, though compute_Cxyz does not yet.


diff -r e23ec71c9981 -r f80876a0a634 Interface.hxx
--- a/Interface.hxx	Thu Mar 22 15:15:13 2012 -0700
+++ b/Interface.hxx	Thu Mar 22 15:16:26 2012 -0700
@@ -1,129 +1,57 @@
 #ifndef GAMR_INTERFACE_HXX
 #define GAMR_INTERFACE_HXX
 
+#include "constants.hxx"
 #include "sign.hxx"
+#include "FTensor.hpp"
 
 class Interface
 {
 public:
-  FTensor::Tensor1<double,2> grid_pos, pos[2];
-  bool intersect_dd[2], intersect_xy[2];
+  FTensor::Tensor1<double,2> grid_pos, pos[2], corner_pos[2][2][2];
+  bool intersect_dd[2], intersect_xy[2], intersect_corner[2][2];
   bool intersect_dp;
 
   Interface(const int &d, const int &i, const int &j,
-            const double distx[Nx+1][Ny], const double disty[Nx][Ny+1])
-  {
-    switch(d)
-    {
-    case 0:
-      grid_pos(0)=i*h;
-      grid_pos(1)=(j+0.5)*h;
-      break;
-    case 1:
-      grid_pos(0)=(i+0.5)*h;
-      grid_pos(1)=j*h;
-      break;
-    default:
-      abort();
-    }
-
-    if(d==0)
-      {
-        intersect_dd[0]=sign(distx[i][j])!=sign(distx[i+1][j])
-          || sign(distx[i][j])!=sign(distx[i-1][j]);
-        intersect_dd[1]=false;
-        if(j!=Ny-1)
-          {
-            intersect_dd[1]=intersect_dd[1]
-              || sign(distx[i][j])!=sign(distx[i][j+1]);
-          }
-        if(j!=0)
-          {
-            intersect_dd[1]=intersect_dd[1]
-              || sign(distx[i][j-1])!=sign(distx[i][j]);
-          }
-
-        intersect_xy[0]=(sign(disty[i][j])!=sign(disty[i-1][j])
-                         && sign(disty[i][j+1])!=sign(disty[i-1][j+1]));
-        intersect_xy[1]=(sign(disty[i][j])!=sign(disty[i][j+1])
-                         && sign(disty[i-1][j])!=sign(disty[i-1][j+1]));
-        intersect_dp=(sign(disty[i][j] + disty[i][j+1])
-                      !=sign(disty[i-1][j] + disty[i-1][j+1]));
-
-        double delta;
-        if(intersect_dd[0])
-          {
-            pos[0](1)=grid_pos(1);
-            if(sign(distx[i][j])!=sign(distx[i+1][j]))
-              delta=distx[i+1][j]-distx[i][j];
-            else
-              delta=distx[i][j]-distx[i-1][j];
-
-            pos[0](0)=grid_pos(0)-distx[i][j]*h/delta;
-          }
-        if(intersect_dd[1])
-          {
-            pos[1](0)=grid_pos(0);
-            if(j!=Ny-1 && sign(distx[i][j])!=sign(distx[i][j+1]))
-              delta=distx[i][j+1]-distx[i][j];
-            else
-              delta=distx[i][j]-distx[i][j-1];
-            pos[1](1)=grid_pos(1)-distx[i][j]*h/delta;
-          }
-      }
-    else
-      {
-        intersect_dd[0]=false;
-        if(i!=Nx-1)
-          {
-            intersect_dd[0]=intersect_dd[0]
-              || sign(disty[i][j])!=sign(disty[i+1][j]);
-          }
-        if(i!=0)
-          {
-            intersect_dd[0]=intersect_dd[0]
-              || sign(disty[i][j])!=sign(disty[i-1][j]);
-          }
-        intersect_dd[1]=sign(disty[i][j])!=sign(disty[i][j+1])
-          || sign(disty[i][j-1])!=sign(disty[i][j]);
-
-        intersect_xy[0]=sign(distx[i][j])!=sign(distx[i+1][j])
-          && sign(distx[i][j-1])!=sign(distx[i+1][j-1]);
-        intersect_xy[1]=sign(distx[i][j])!=sign(distx[i][j-1])
-          && sign(distx[i+1][j])!=sign(distx[i+1][j-1]);
-        intersect_dp=(sign(distx[i][j] + distx[i+1][j])
-                      !=sign(distx[i][j-1] + distx[i+1][j-1]));
-
-
-        double delta;
-        if(intersect_dd[0])
-          {
-            pos[0](1)=grid_pos(1);
-            if(i!=Ny-1 && sign(disty[i][j])!=sign(disty[i+1][j]))
-              delta=disty[i+1][j]-disty[i][j];
-            else
-              delta=disty[i][j]-disty[i-1][j];
-
-            pos[0](0)=grid_pos(0)-disty[i][j]*h/delta;
-          }
-        if(intersect_dd[1])
-          {
-            pos[1](0)=grid_pos(0);
-            if(sign(disty[i][j])!=sign(disty[i][j+1]))
-              delta=disty[i][j+1]-disty[i][j];
-            else
-              delta=disty[i][j]-disty[i][j-1];
-            pos[1](1)=grid_pos(1)-disty[i][j]*h/delta;
-          }
-      }
-  }
+            const double distx[Nx+1][Ny], const double disty[Nx][Ny+1]);
 
   bool intersects() const
   {
     return intersect_dd[0] || intersect_dd[1]
-      || intersect_xy[0] || intersect_xy[1] || intersect_dp;
+      || intersect_xy[0] || intersect_xy[1] || intersect_dp
+      || intersect_corner[0][0] || intersect_corner[0][1]
+      || intersect_corner[1][0] || intersect_corner[1][1];
   }
     
+  template <int ny> void compute_corners(const int &i, const int &j, const double dist[][ny])
+  {
+    intersect_xy[0]=(sign(dist[i][j])!=sign(dist[i+1][j])
+                      && sign(dist[i][j+1])!=sign(dist[i+1][j+1]));
+    intersect_xy[1]=(sign(dist[i][j])!=sign(dist[i][j+1])
+                     && sign(dist[i+1][j])!=sign(dist[i+1][j+1]));
+    for(int n0=0;n0<2;++n0)
+      {
+        for(int n1=0;n1<2;++n1)
+          {
+            intersect_corner[n0][n1]=
+              (sign(dist[i+n0][j+n1])!=sign(dist[i+(n0+1)%2][j+n1])
+               && sign(dist[i+n0][j+n1])!=sign(dist[i][j+(n1+1)%2]));
+
+            if(intersect_corner[n0][n1])
+              {
+                double dh[2]={sign(n0-0.5)*h/2, sign(n1-0.5)*h/2};
+                double delta;
+                delta=dist[i+n0][j+(n1+1)%2]-dist[i+n0][j+n1];
+                corner_pos[n0][n1][0](0)=grid_pos(0)+dh[0]-dist[i+n0][j+n1]*h/delta;
+                corner_pos[n0][n1][0](1)=grid_pos(1)+dh[1];
+
+                delta=dist[i][j+1]-dist[i][j];
+                corner_pos[n0][n1][1](0)=grid_pos(0)+dh[0];
+                corner_pos[n0][n1][1](1)=grid_pos(1)+dh[1]-dist[i+n0][j+n1]*h/delta;
+              }
+          }
+      }
+  }
   
 };
 
diff -r e23ec71c9981 -r f80876a0a634 Interface/Interface.cxx
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Interface/Interface.cxx	Thu Mar 22 15:16:26 2012 -0700
@@ -0,0 +1,105 @@
+#include "../Interface.hxx"
+
+Interface::Interface(const int &d, const int &i, const int &j,
+                     const double distx[Nx+1][Ny], const double disty[Nx][Ny+1])
+{
+  switch(d)
+    {
+    case 0:
+      grid_pos(0)=i*h;
+      grid_pos(1)=(j+0.5)*h;
+      break;
+    case 1:
+      grid_pos(0)=(i+0.5)*h;
+      grid_pos(1)=j*h;
+      break;
+    default:
+      abort();
+    }
+
+  if(d==0)
+    {
+      intersect_dd[0]=sign(distx[i][j])!=sign(distx[i+1][j])
+        || sign(distx[i][j])!=sign(distx[i-1][j]);
+      intersect_dd[1]=false;
+      if(j!=Ny-1)
+        {
+          intersect_dd[1]=intersect_dd[1]
+            || sign(distx[i][j])!=sign(distx[i][j+1]);
+        }
+      if(j!=0)
+        {
+          intersect_dd[1]=intersect_dd[1]
+            || sign(distx[i][j-1])!=sign(distx[i][j]);
+        }
+
+      intersect_dp=(sign(disty[i][j] + disty[i][j+1])
+                    !=sign(disty[i-1][j] + disty[i-1][j+1]));
+
+      double delta;
+      if(intersect_dd[0])
+        {
+          pos[0](1)=grid_pos(1);
+          if(sign(distx[i][j])!=sign(distx[i+1][j]))
+            delta=distx[i+1][j]-distx[i][j];
+          else
+            delta=distx[i][j]-distx[i-1][j];
+
+          pos[0](0)=grid_pos(0)-distx[i][j]*h/delta;
+        }
+      if(intersect_dd[1])
+        {
+          pos[1](0)=grid_pos(0);
+          if(j!=Ny-1 && sign(distx[i][j])!=sign(distx[i][j+1]))
+            delta=distx[i][j+1]-distx[i][j];
+          else
+            delta=distx[i][j]-distx[i][j-1];
+          pos[1](1)=grid_pos(1)-distx[i][j]*h/delta;
+        }
+
+      compute_corners(i-1,j,disty);
+    }
+  else
+    {
+      intersect_dd[0]=false;
+      if(i!=Nx-1)
+        {
+          intersect_dd[0]=intersect_dd[0]
+            || sign(disty[i][j])!=sign(disty[i+1][j]);
+        }
+      if(i!=0)
+        {
+          intersect_dd[0]=intersect_dd[0]
+            || sign(disty[i][j])!=sign(disty[i-1][j]);
+        }
+      intersect_dd[1]=sign(disty[i][j])!=sign(disty[i][j+1])
+        || sign(disty[i][j-1])!=sign(disty[i][j]);
+
+      intersect_dp=(sign(distx[i][j] + distx[i+1][j])
+                    !=sign(distx[i][j-1] + distx[i+1][j-1]));
+
+
+      double delta;
+      if(intersect_dd[0])
+        {
+          pos[0](1)=grid_pos(1);
+          if(i!=Ny-1 && sign(disty[i][j])!=sign(disty[i+1][j]))
+            delta=disty[i+1][j]-disty[i][j];
+          else
+            delta=disty[i][j]-disty[i-1][j];
+
+          pos[0](0)=grid_pos(0)-disty[i][j]*h/delta;
+        }
+      if(intersect_dd[1])
+        {
+          pos[1](0)=grid_pos(0);
+          if(sign(disty[i][j])!=sign(disty[i][j+1]))
+            delta=disty[i][j+1]-disty[i][j];
+          else
+            delta=disty[i][j]-disty[i][j-1];
+          pos[1](1)=grid_pos(1)-disty[i][j]*h/delta;
+        }
+
+      compute_corners(i,j-1,distx);
+    }
+}
diff -r e23ec71c9981 -r f80876a0a634 wscript
--- a/wscript	Thu Mar 22 15:15:13 2012 -0700
+++ b/wscript	Thu Mar 22 15:16:26 2012 -0700
@@ -12,7 +12,8 @@ def build(bld):
                         'compute_v_on_interface/compute_dv_dtt.cxx',
                         'compute_Cxyz.cxx',
                         'compute_Cp.cxx',
-                        'compute_dC_dv.cxx'],
+                        'compute_dC_dv.cxx',
+                        'Interface/Interface.cxx'],
 
         target       = 'Gamr_disc',
         # cxxflags      = ['-std=c++0x','-g','-Wall','-Drestrict='],



More information about the CIG-COMMITS mailing list