[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