diff --git a/include/pmmc.h b/include/pmmc.h index 269561a3..10d9772b 100644 --- a/include/pmmc.h +++ b/include/pmmc.h @@ -3511,7 +3511,7 @@ inline double pmmc_CubeSurfaceInterpValue(DoubleArray &CubeValues, DTMutableList } //-------------------------------------------------------------------------------------------------------- inline double pmmc_CubeCurveInterpValue(DoubleArray &CubeValues, DoubleArray &CurveValues, - DTMutableList &Points, int npts) + DTMutableList &Points, int i, int j, int k, int npts) { int p; Point A,B; @@ -3535,7 +3535,10 @@ inline double pmmc_CubeCurveInterpValue(DoubleArray &CubeValues, DoubleArray &Cu for (p=0; p &Points, IntArray &Triangles, + DoubleArray &SurfaceVector, DoubleArray &VecAvg, int i, int j, int k, int npts, int ntris) +{ + Point A,B,C; + int p; + double vA,vB,vC; + double x,y,z; + double s,s1,s2,s3,temp; + double a,b,c,d,e,f,g,h; + double integral; + + // ................x component ............................. + // Copy the curvature values for the cube + CubeValues(0,0,0) = Vec_x(i,j,k); + CubeValues(1,0,0) = Vec_x(i+1,j,k); + CubeValues(0,1,0) = Vec_x(i,j+1,k); + CubeValues(1,1,0) = Vec_x(i+1,j+1,k); + CubeValues(0,0,1) = Vec_x(i,j,k+1); + CubeValues(1,0,1) = Vec_x(i+1,j,k+1); + CubeValues(0,1,1) = Vec_x(i,j+1,k+1); + CubeValues(1,1,1) = Vec_x(i+1,j+1,k+1); + + // trilinear coefficients: f(x,y,z) = a+bx+cy+dz+exy+fxz+gyz+hxyz + a = CubeValues(0,0,0); + b = CubeValues(1,0,0)-a; + c = CubeValues(0,1,0)-a; + d = CubeValues(0,0,1)-a; + e = CubeValues(1,1,0)-a-b-c; + f = CubeValues(1,0,1)-a-b-d; + g = CubeValues(0,1,1)-a-c-d; + h = CubeValues(1,1,1)-a-b-c-d-e-f-g; + + for (p=0; p 0.0){ + // Increment the averaged values + // x component + vA = SurfaceVector(Triangles(0,r)); + vB = SurfaceVector(Triangles(1,r)); + vC = SurfaceVector(Triangles(2,r)); + VecAvg(0) += sqrt(temp)*0.33333333333333333*(vA+vB+vC); + // y component + vA = SurfaceVector(npts+Triangles(0,r)); + vB = SurfaceVector(npts+Triangles(1,r)); + vC = SurfaceVector(npts+Triangles(2,r)); + VecAvg(1) += sqrt(temp)*0.33333333333333333*(vA+vB+vC); + // z component + vA = SurfaceVector(2*npts+Triangles(0,r)); + vB = SurfaceVector(2*npts+Triangles(1,r)); + vC = SurfaceVector(2*npts+Triangles(2,r)); + VecAvg(2) += sqrt(temp)*0.33333333333333333*(vA+vB+vC); + } + } +} +//-------------------------------------------------------------------------------------------------------- +inline double pmmc_CubeCurveInterpVector(DoubleArray &CubeValues, DoubleArray &CurveValues, + DTMutableList &Points, int i, int j, int k, int npts) +{ + int p; + Point A,B; + double vA,vB; + double x,y,z; + double s,s1,s2,s3,temp; + double a,b,c,d,e,f,g,h; + double integral; + double length; + + // trilinear coefficients: f(x,y,z) = a+bx+cy+dz+exy+fxz+gyz+hxyz + // Evaluate the coefficients + a = CubeValues(0,0,0); + b = CubeValues(1,0,0)-a; + c = CubeValues(0,1,0)-a; + d = CubeValues(0,0,1)-a; + e = CubeValues(1,1,0)-a-b-c; + f = CubeValues(1,0,1)-a-b-d; + g = CubeValues(0,1,1)-a-c-d; + h = CubeValues(1,1,1)-a-b-c-d-e-f-g; + + for (p=0; p +#include +#include "pmmc.h" +//#include "PointList.h" +//#include "Array.h" + +#define RADIUS 15 +#define HEIGHT 15.5 +#define N 60 +#define PI 3.14159 + +int main (int argc, char *argv[]) +{ + + // printf("Radius = %s \n,"RADIUS); + int SIZE = N*N*N; + int Nx,Ny,Nz; + Nx = Ny = Nz = N; + int i,j,k,p,q,r; + +// double *Solid; // cylinder +// double *Phase; // region of the cylinder +// Solid = new double [SIZE]; +// Phase = new double [SIZE]; + DoubleArray SignDist(Nx,Ny,Nz); + DoubleArray Phase(Nx,Ny,Nz); + double fluid_isovalue = 0.0; + double solid_isovalue = 0.0; + + + /* **************************************************************** + VARIABLES FOR THE PMMC ALGORITHM + ****************************************************************** */ + //........................................................................... + // Averaging variables + //........................................................................... + double awn,ans,aws,lwns,nwp_volume; + double As; + double dEs,dAwn,dAns; // Global surface energy (calculated by rank=0) + double awn_global,ans_global,aws_global,lwns_global,nwp_volume_global; + double As_global; + // bool add=1; // Set to false if any corners contain nw-phase ( F > fluid_isovalue) + int cube[8][3] = {{0,0,0},{1,0,0},{0,1,0},{1,1,0},{0,0,1},{1,0,1},{0,1,1},{1,1,1}}; // cube corners + // int count_in=0,count_out=0; + // int nodx,nody,nodz; + // initialize lists for vertices for surfaces, common line + DTMutableList nw_pts(20); + DTMutableList ns_pts(20); + DTMutableList ws_pts(20); + DTMutableList nws_pts(20); + // initialize triangle lists for surfaces + IntArray nw_tris(3,20); + IntArray ns_tris(3,20); + IntArray ws_tris(3,20); + // initialize list for line segments + IntArray nws_seg(2,20); + + DTMutableList tmp(20); + // IntArray store; + + int n_nw_pts=0,n_ns_pts=0,n_ws_pts=0,n_nws_pts=0, map=0; + int n_nw_tris=0, n_ns_tris=0, n_ws_tris=0, n_nws_seg=0; + + double s,s1,s2,s3; // Triangle sides (lengths) + Point A,B,C,P; + // double area; + + // Initialize arrays for local solid surface + DTMutableList local_sol_pts(20); + int n_local_sol_pts = 0; + IntArray local_sol_tris(3,18); + int n_local_sol_tris; + DoubleArray values(20); + DTMutableList local_nws_pts(20); + int n_local_nws_pts; + + int c; + //........................................................................... + int ncubes = (Nx-2)*(Ny-2)*(Nz-2); // Exclude the "upper" halo + IntArray cubeList(3,ncubes); + pmmc_CubeListFromMesh(cubeList, ncubes, Nx, Ny, Nz); + //........................................................................... + double Cx,Cy,Cz; + double dist1,dist2; + Cx = Cy = Cz = N*0.51; + for (k=0; k 0 + && SignDist(i+cube[p][0],j+cube[p][1],k+cube[p][2]) > 0 ){ + nwp_volume += 0.125; + } + } + + // Run PMMC + n_local_sol_tris = 0; + n_local_sol_pts = 0; + n_local_nws_pts = 0; + + n_nw_pts=0,n_ns_pts=0,n_ws_pts=0,n_nws_pts=0, map=0; + n_nw_tris=0, n_ns_tris=0, n_ws_tris=0, n_nws_seg=0; + + // Construct the interfaces and common curve + pmmc_ConstructLocalCube(SignDist, Phase, solid_isovalue, fluid_isovalue, + nw_pts, nw_tris, values, ns_pts, ns_tris, ws_pts, ws_tris, + local_nws_pts, nws_pts, nws_seg, local_sol_pts, local_sol_tris, + n_local_sol_tris, n_local_sol_pts, n_nw_pts, n_nw_tris, + n_ws_pts, n_ws_tris, n_ns_tris, n_ns_pts, n_local_nws_pts, n_nws_pts, n_nws_seg, + i, j, k, Nx, Ny, Nz); + + + //******************************************************************* + // Compute the Interfacial Areas, Common Line length for blob p + // nw surface + double temp; + for (r=0;r 0.0) awn += sqrt(temp); + + } + for (r=0;r 0.0) ans += sqrt(temp); + } + for (r=0;r 0.0) aws += sqrt(temp); + } + for (r=0;r 0.0) As += sqrt(temp); + } + for (p=0; p < n_local_nws_pts-1; p++){ + // Extract the line segment + A = local_nws_pts(p); + B = local_nws_pts(p+1); + // Compute the length of the segment + s = 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)); + // Add the length to the common line + lwns += s; + } + //....................................................................................... + // Write the triangle lists to text file + for (r=0;r +#include +#include "pmmc.h" +#include "Domain.h" + +using namespace std; + +/* + * Compare the measured and analytical curvature for a sphere + * + */ + +int main(int argc, char **argv) +{ + int i,j,k; + int Nx,Ny,Nz,N; + double Lx,Ly,Lz; + double fluid_isovalue=0.0; + double solid_isovalue=0.0; + + Lx = Ly = Lz = 1.0; + Nx = Ny = Nz = 102; + N = Nx*Ny*Nz; + + //........................................................................... + // Set up the cube list + //........................................................................... + int ncubes = (Nx-2)*(Ny-2)*(Nz-2); // Exclude the "upper" halo + IntArray cubeList(3,ncubes); + pmmc_CubeListFromMesh(cubeList, ncubes, Nx, Ny, Nz); + //........................................................................... + + //**************************************************************************************** + // Create the structures needed to carry out the PMMC algorithm + //**************************************************************************************** + DTMutableList nw_pts(20); + DTMutableList ns_pts(20); + DTMutableList ws_pts(20); + DTMutableList nws_pts(20); + // initialize triangle lists for surfaces + IntArray nw_tris(3,20); + IntArray ns_tris(3,20); + IntArray ws_tris(3,20); + // initialize list for line segments + IntArray nws_seg(2,20); + + DTMutableList tmp(20); + + DoubleArray wn_curvature(20); + + int n_nw_pts=0,n_ns_pts=0,n_ws_pts=0,n_nws_pts=0, map=0; + int n_nw_tris=0, n_ns_tris=0, n_ws_tris=0, n_nws_seg=0; + + // Initialize arrays for local solid surface + DTMutableList local_sol_pts(20); + int n_local_sol_pts = 0; + IntArray local_sol_tris(3,18); + int n_local_sol_tris; + DoubleArray values(20); + DTMutableList local_nws_pts(20); + int n_local_nws_pts; + //**************************************************************************************** + + int nspheres=1; + // Set up the signed distance function for a sphere + double *cx,*cy,*cz,*rad; + cx = new double[nspheres]; + cy = new double[nspheres]; + cz = new double[nspheres]; + rad = new double[nspheres]; + + // Sphere in the middle of the domain + cx[0] = cy[0] = cz[0] = 0.5; + rad[0] = 0.3; + + DoubleArray SignDist(Nx,Ny,Nz); + DoubleArray Phase(Nx,Ny,Nz); + DoubleArray Phase_x(Nx,Ny,Nz); + DoubleArray Phase_y(Nx,Ny,Nz); + DoubleArray Phase_z(Nx,Ny,Nz); + DoubleArray CubeValues(2,2,2); + + // Compute the signed distance function + SignedDistance(Phase.data,nspheres,cx,cy,cz,rad,Lx,Ly,Lz,Nx,Ny,Nz,0,0,0,1,1,1); + + for (k=0; k