[cig-commits] commit: Fix interpolation of velocity to control points to be second order
Mercurial
hg at geodynamics.org
Wed Feb 29 14:54:23 PST 2012
changeset: 62:c996563dfb3d
tag: tip
user: Walter Landry <wlandry at caltech.edu>
date: Wed Feb 29 14:54:14 2012 -0800
files: compute_v_on_interface.cxx
description:
Fix interpolation of velocity to control points to be second order
diff -r 674bdfcc3cb8 -r c996563dfb3d compute_v_on_interface.cxx
--- a/compute_v_on_interface.cxx Tue Feb 28 13:58:32 2012 -0800
+++ b/compute_v_on_interface.cxx Wed Feb 29 14:54:14 2012 -0800
@@ -78,10 +78,7 @@ double compute_dv_yy(const double z[][ny
const double log_eta[][ny], const double &dx,
const int i, const int j)
{
- double dv_yy_p1=(vel(z,log_eta,i+1,j+1) - 2*vel(z,log_eta,i+1,j)
- + vel(z,log_eta,i+1,j-1))/(h*h);
- double dv_yy_p2=(vel(z,log_eta,i+2,j+1) - 2*vel(z,log_eta,i+2,j)
- + vel(z,log_eta,i+2,j-1))/(h*h);
+ double dv_yy_p1, dv_yy_p2;
if(j==0)
{
dv_yy_p1=(vel(z,log_eta,i+1,j+1) - vel(z,log_eta,i+1,j))/(h*h);
@@ -92,12 +89,16 @@ double compute_dv_yy(const double z[][ny
dv_yy_p1=(-vel(z,log_eta,i+1,j) + vel(z,log_eta,i+1,j-1))/(h*h);
dv_yy_p2=(-vel(z,log_eta,i+2,j) + vel(z,log_eta,i+2,j-1))/(h*h);
}
+ else
+ {
+ dv_yy_p1=(vel(z,log_eta,i+1,j+1) - 2*vel(z,log_eta,i+1,j)
+ + vel(z,log_eta,i+1,j-1))/(h*h);
+ dv_yy_p2=(vel(z,log_eta,i+2,j+1) - 2*vel(z,log_eta,i+2,j)
+ + vel(z,log_eta,i+2,j-1))/(h*h);
+ }
const double dv_yy_p=(1-dx)*dv_yy_p1 + dx*dv_yy_p2;
- double dv_yy_m0=(vel(z,log_eta,i,j+1) - 2*vel(z,log_eta,i,j)
- + vel(z,log_eta,i,j-1))/(h*h);
- double dv_yy_m1=(vel(z,log_eta,i-1,j+1) - 2*vel(z,log_eta,i-1,j)
- + vel(z,log_eta,i-1,j-1))/(h*h);
+ double dv_yy_m0, dv_yy_m1;
if(j==0)
{
dv_yy_m0=(vel(z,log_eta,i,j+1) - vel(z,log_eta,i,j))/(h*h);
@@ -107,6 +108,13 @@ double compute_dv_yy(const double z[][ny
{
dv_yy_m0=(-vel(z,log_eta,i,j) + vel(z,log_eta,i,j-1))/(h*h);
dv_yy_m1=(-vel(z,log_eta,i-1,j) + vel(z,log_eta,i-1,j-1))/(h*h);
+ }
+ else
+ {
+ dv_yy_m0=(vel(z,log_eta,i,j+1) - 2*vel(z,log_eta,i,j)
+ + vel(z,log_eta,i,j-1))/(h*h);
+ dv_yy_m1=(vel(z,log_eta,i-1,j+1) - 2*vel(z,log_eta,i-1,j)
+ + vel(z,log_eta,i-1,j-1))/(h*h);
}
double dv_yy_m=(1-dx)*dv_yy_m1 + dx*dv_yy_m0;
@@ -139,13 +147,21 @@ double compute_v(const double z[][ny],
const double &dx,
const int i, const int j)
{
+ /* v=v0 + dv*x + ddv*h*h/2, where x is centered on v_p2. The
+ distance between points is 1 here, which simplifies the
+ expressions. */
+
double v_p1(vel(z,log_eta,i+1,j)), v_p2(vel(z,log_eta,i+2,j)),
v_p3(vel(z,log_eta,i+3,j));
- double v_p((1-dx)*v_p1 + dx*v_p2), v_pp((1-dx)*v_p2 + dx*v_p3);
+ double vp0(v_p2), dvp((v_p3-v_p1)/2), ddvp(v_p3 - 2*v_p2 + v_p1);
+ double v_p(vp0 - (1-dx)*dvp + (1-dx)*(1-dx)*ddvp/2),
+ v_pp(vp0 + dx*dvp + dx*dx*ddvp/2);
double v_m0(vel(z,log_eta,i,j)), v_m1(vel(z,log_eta,i-1,j)),
v_m2(vel(z,log_eta,i-2,j));
- double v_m((1-dx)*v_m1 + dx*v_m0), v_mm((1-dx)*v_m2 + dx*v_m1);
+ double vm0(v_m1), dvm((v_m0-v_m2)/2), ddvm(v_m2 - 2*v_m1 + v_m0);
+ double v_m(vm0 + dx*dvm + dx*dx*ddvm/2),
+ v_mm(vm0 - (1-dx)*dvm + (1-dx)*(1-dx)*ddvm/2);
return (4*(max_eta*v_p + min_eta*v_m) - (max_eta*v_pp + min_eta*v_mm)
- 2*h*jump)
More information about the CIG-COMMITS
mailing list