Fixed common/pmmc.h: pmmc_CurveCurvature()
This commit is contained in:
parent
9b4ffb5148
commit
76e8112660
@ -4289,7 +4289,7 @@ inline void pmmc_CurveCurvature(DoubleArray &f, DoubleArray &s, DoubleArray &KN,
|
|||||||
sxz = 0.25*(s(i+1,j,k+1) - s(i+1,j,k-1) - s(i-1,j,k+1) + s(i-1,j,k-1));
|
sxz = 0.25*(s(i+1,j,k+1) - s(i+1,j,k-1) - s(i-1,j,k+1) + s(i-1,j,k-1));
|
||||||
syz = 0.25*(s(i,j+1,k+1) - s(i,j+1,k-1) - s(i,j-1,k+1) + s(i,j-1,k-1));
|
syz = 0.25*(s(i,j+1,k+1) - s(i,j+1,k-1) - s(i,j-1,k+1) + s(i,j-1,k-1));
|
||||||
|
|
||||||
// Compute the Jacobean matrix for tangent vector
|
/* // Compute the Jacobean matrix for tangent vector
|
||||||
Axx = sxy*fz + sy*fxz - sxz*fy - sz*fxy;
|
Axx = sxy*fz + sy*fxz - sxz*fy - sz*fxy;
|
||||||
Axy = sxz*fx + sz*fxx - sxx*fz - sx*fxz;
|
Axy = sxz*fx + sz*fxx - sxx*fz - sx*fxz;
|
||||||
Axz = sxx*fy + sx*fxy - sxy*fx - sy*fxx;
|
Axz = sxx*fy + sx*fxy - sxy*fx - sy*fxx;
|
||||||
@ -4299,21 +4299,19 @@ inline void pmmc_CurveCurvature(DoubleArray &f, DoubleArray &s, DoubleArray &KN,
|
|||||||
Azx = syz*fz + sy*fzz - szz*fy - sz*fyz;
|
Azx = syz*fz + sy*fzz - szz*fy - sz*fyz;
|
||||||
Azy = szz*fx + sz*fxz - sxz*fz - sx*fzz;
|
Azy = szz*fx + sz*fxz - sxz*fz - sx*fzz;
|
||||||
Azz = sxz*fy + sx*fyz - syz*fx - sy*fxz;
|
Azz = sxz*fy + sx*fyz - syz*fx - sy*fxz;
|
||||||
|
*/
|
||||||
// Normal to solid surface
|
// Normal to solid surface
|
||||||
Sx.Corners(i-ic,j-jc,k-kc) = sx;
|
Sx.Corners(i-ic,j-jc,k-kc) = sx;
|
||||||
Sy.Corners(i-ic,j-jc,k-kc) = sy;
|
Sy.Corners(i-ic,j-jc,k-kc) = sy;
|
||||||
Sz.Corners(i-ic,j-jc,k-kc) = sz;
|
Sz.Corners(i-ic,j-jc,k-kc) = sz;
|
||||||
|
|
||||||
// Compute the tangent vector
|
// Compute the tangent vector
|
||||||
Tx.Corners(i-ic,j-jc,k-kc) = sy*fz-sz*fy;
|
norm = sqrt((sy*fz-sz*fy)*(sy*fz-sz*fy)+(sz*fx-sx*fz)*(sz*fx-sx*fz)+(sx*fy-sy*fx)*(sx*fy-sy*fx));
|
||||||
Ty.Corners(i-ic,j-jc,k-kc) = sz*fx-sx*fz;
|
if (norm == 0.0) norm=1.0;
|
||||||
Tz.Corners(i-ic,j-jc,k-kc) = sx*fy-sy*fx;
|
Tx.Corners(i-ic,j-jc,k-kc) = (sy*fz-sz*fy)/norm;
|
||||||
|
Ty.Corners(i-ic,j-jc,k-kc) = (sz*fx-sx*fz)/norm;
|
||||||
|
Tz.Corners(i-ic,j-jc,k-kc) = (sx*fy-sy*fx)/norm;
|
||||||
|
|
||||||
// Compute the normal
|
|
||||||
Nx.Corners(i-ic,j-jc,k-kc) = Tx.Corners(i-ic,j-jc,k-kc)*Axx + Ty.Corners(i-ic,j-jc,k-kc)*Ayx + Tz.Corners(i-ic,j-jc,k-kc)*Azx;
|
|
||||||
Ny.Corners(i-ic,j-jc,k-kc) = Tx.Corners(i-ic,j-jc,k-kc)*Axy + Ty.Corners(i-ic,j-jc,k-kc)*Ayy + Tz.Corners(i-ic,j-jc,k-kc)*Azy;
|
|
||||||
Nz.Corners(i-ic,j-jc,k-kc) = Tx.Corners(i-ic,j-jc,k-kc)*Axz + Ty.Corners(i-ic,j-jc,k-kc)*Ayz + Tz.Corners(i-ic,j-jc,k-kc)*Azz;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4329,34 +4327,65 @@ inline void pmmc_CurveCurvature(DoubleArray &f, DoubleArray &s, DoubleArray &KN,
|
|||||||
Ny.assign();
|
Ny.assign();
|
||||||
Nz.assign();
|
Nz.assign();
|
||||||
|
|
||||||
|
double tax,tay,taz,tbx,tby,tbz;
|
||||||
|
|
||||||
for (p=0; p<npts-1; p++){
|
for (p=0; p<npts-1; p++){
|
||||||
// Extract the line segment
|
// Extract the line segment
|
||||||
A = Points(p);
|
A = Points(p);
|
||||||
B = Points(p+1);
|
B = Points(p+1);
|
||||||
P.x = 0.5*(A.x+B.x);
|
P.x = 0.5*(A.x+B.x) - 1.0*i;
|
||||||
P.y = 0.5*(A.y+B.y);
|
P.y = 0.5*(A.y+B.y) - 1.0*j;
|
||||||
P.z = 0.5*(A.z+B.z);
|
P.z = 0.5*(A.z+B.z) - 1.0*k;
|
||||||
|
|
||||||
|
A.x -= 1.0*i;
|
||||||
|
A.y -= 1.0*j;
|
||||||
|
A.z -= 1.0*k;
|
||||||
|
B.x -= 1.0*i;
|
||||||
|
B.y -= 1.0*j;
|
||||||
|
B.z -= 1.0*k;
|
||||||
|
|
||||||
length = sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)+(A.z-B.z)*(A.z-B.z));
|
length = sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)+(A.z-B.z)*(A.z-B.z));
|
||||||
|
|
||||||
// tangent vector
|
// tangent vector
|
||||||
twnsx = B.x - A.x;
|
twnsx = B.x - A.x;
|
||||||
twnsy = B.y - A.y;
|
twnsy = B.y - A.y;
|
||||||
twnsz = B.z - A.z;
|
twnsz = B.z - A.z;
|
||||||
|
norm = sqrt(twnsx*twnsx+twnsy*twnsy+twnsz*twnsz);
|
||||||
|
if (norm == 0.0) norm = 1.0;
|
||||||
|
twnsx /= norm;
|
||||||
|
twnsy /= norm;
|
||||||
|
twnsz /= norm;
|
||||||
|
|
||||||
twnsx = Tx.eval(P);
|
// *****************************************************
|
||||||
twnsy = Ty.eval(P);
|
// Compute tangent vector at A and B and normalize
|
||||||
twnsz = Tz.eval(P);
|
tax = Tx.eval(A);
|
||||||
|
tay = Ty.eval(A);
|
||||||
|
taz = Tz.eval(A);
|
||||||
|
norm = sqrt(tax*tax+tay*tay+taz*taz);
|
||||||
|
tax /= norm;
|
||||||
|
tay /= norm;
|
||||||
|
taz /= norm;
|
||||||
|
|
||||||
// normal vector and curvature to the wns curve
|
tbx = Tx.eval(B);
|
||||||
nwnsx = Nx.eval(P);
|
tby = Ty.eval(B);
|
||||||
nwnsy = Ny.eval(P);
|
tbz = Tz.eval(B);
|
||||||
nwnsx = Nz.eval(P);
|
norm = sqrt(tbx*tbx+tby*tby+tbz*tbz);
|
||||||
|
tbx /= norm;
|
||||||
|
tby /= norm;
|
||||||
|
tbz /= norm;
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
|
// *****************************************************
|
||||||
|
// Compute the divergence of the tangent vector
|
||||||
|
nwnsx = (tax - tbx) / length;
|
||||||
|
nwnsy = (tay - tby) / length;
|
||||||
|
nwnsz = (taz - tbz) / length;
|
||||||
K = sqrt(nwnsx*nwnsx+nwnsy*nwnsy+nwnsz*nwnsz);
|
K = sqrt(nwnsx*nwnsx+nwnsy*nwnsy+nwnsz*nwnsz);
|
||||||
if (K == 0.0) K=1.0;
|
if (K == 0.0) K=1.0;
|
||||||
nwnsx /= K;
|
nwnsx /= K;
|
||||||
nwnsy /= K;
|
nwnsy /= K;
|
||||||
nwnsz /= K;
|
nwnsz /= K;
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
// Normal vector to the solid surface
|
// Normal vector to the solid surface
|
||||||
nsx = Sx.eval(P);
|
nsx = Sx.eval(P);
|
||||||
@ -4378,6 +4407,12 @@ inline void pmmc_CurveCurvature(DoubleArray &f, DoubleArray &s, DoubleArray &KN,
|
|||||||
nwsy /= norm;
|
nwsy /= norm;
|
||||||
nwsz /= norm;
|
nwsz /= norm;
|
||||||
|
|
||||||
|
if (nsx*nwnsx + nsy*nwnsy + nsz*nwnsz < 0.0){
|
||||||
|
nwnsx = -nwnsx;
|
||||||
|
nwnsy = -nwnsy;
|
||||||
|
nwnsz = -nwnsz;
|
||||||
|
}
|
||||||
|
|
||||||
if (length > 0.0){
|
if (length > 0.0){
|
||||||
// normal curvature component in the direction of the solid surface
|
// normal curvature component in the direction of the solid surface
|
||||||
KNavg += K*(nsx*nwnsx + nsy*nwnsy + nsz*nwnsz)*length;
|
KNavg += K*(nsx*nwnsx + nsy*nwnsy + nsz*nwnsz)*length;
|
||||||
|
Loading…
Reference in New Issue
Block a user