#include #include #include "pmmc.h" #include "Domain.h" //#include "PointList.h" //#include "Array.h" using namespace std; int main(int argc, char **argv) { //....................................................................... // printf("Radius = %s \n,"RADIUS); int Nx,Ny,Nz,N; int i,j,k,p,q,r,n; int ReadSize; // Number of entries in the input files that are read int nspheres; double Lx,Ly,Lz; //....................................................................... //....................................................................... string PhiName,PressName,VelName; ifstream readnames("Filenames.in"); readnames >> PhiName; readnames >> PressName; readnames >> VelName; readnames >> ReadSize; //....................................................................... // Reading the domain information file //....................................................................... ifstream domain("Domain.in"); domain >> Nx; domain >> Ny; domain >> Nz; domain >> nspheres; domain >> Lx; domain >> Ly; domain >> Lz; //....................................................................... N = Nx*Ny*Nz; printf("Domain size = %i x %i x %i \n",Nx,Ny,Nz); printf("Domain length = %f x %f x %f \n",Lx,Ly,Lz); cout << "PhiName = " << PressName << endl; cout << "ReadSize = " << ReadSize << endl; //....................................................................... DoubleArray SignDist(Nx,Ny,Nz); DoubleArray SignDistCopy(Nx+2,Ny+2,Nz+2); DoubleArray Phase(Nx,Ny,Nz); DoubleArray Phase_x(Nx,Ny,Nz); DoubleArray Phase_y(Nx,Ny,Nz); DoubleArray Phase_z(Nx,Ny,Nz); DoubleArray Sx(Nx,Ny,Nz); DoubleArray Sy(Nx,Ny,Nz); DoubleArray Sz(Nx,Ny,Nz); DoubleArray Vel_x(Nx,Ny,Nz); DoubleArray Vel_y(Nx,Ny,Nz); DoubleArray Vel_z(Nx,Ny,Nz); DoubleArray Press(Nx,Ny,Nz); DoubleArray GaussCurvature(Nx,Ny,Nz); DoubleArray MeanCurvature(Nx,Ny,Nz); //....................................................................... // Read in sphere pack printf("nspheres =%i \n",nspheres); //....................................................................... double *cx,*cy,*cz,*rad; cx = new double[nspheres]; cy = new double[nspheres]; cz = new double[nspheres]; rad = new double[nspheres]; //....................................................................... int *ReadInfo; double *ReadPhi, *ReadPress, *ReadVel; ReadInfo = new int[3*ReadSize]; ReadPhi = new double[ReadSize]; ReadPress = new double[ReadSize]; ReadVel = new double[3*ReadSize]; //....................................................................... printf("Reading the sphere packing \n"); ReadSpherePacking(nspheres,cx,cy,cz,rad); SignedDistance(SignDistCopy.data,nspheres,cx,cy,cz,rad,Lx,Ly,Lz,Nx+2,Ny+2,Nz+2, 0,0,0,1,1,1); for (k=0; k0){ Phase(i,j,k) = ReadPhi[idx]; Press(i,j,k) = ReadPress[idx]; Vel_x(i,j,k) = ReadVel[3*idx]; Vel_y(i,j,k) = ReadVel[3*idx+1]; Vel_z(i,j,k) = ReadVel[3*idx+2]; } } //....................................................................... //....................................................................... double fluid_isovalue = 0.0; double solid_isovalue = 0.0; //....................................................................... /* //....................................................................... double *cx,*cy,*cz,*rad; cx = new double[nspheres]; cy = new double[nspheres]; cz = new double[nspheres]; rad = new double[nspheres]; //............................... printf("Reading the sphere packing \n"); ReadSpherePacking(nspheres,cx,cy,cz,rad); //....................................................................... //....................................................................... // Compute the signed distance function for the sphere packing SignedDistance(SignDist.data,nspheres,cx,cy,cz,rad,Lx,Ly,Lz,Nx,Ny,Nz,0,0,0,1,1,1); */ //....................................................................... /* **************************************************************** VARIABLES FOR THE PMMC ALGORITHM ****************************************************************** */ //........................................................................... // Averaging variables //........................................................................... double awn,ans,aws,lwns,nwp_volume; double sw,vol_n,vol_w,paw,pan; double efawns,Jwn; 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 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; 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); // 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; DoubleArray CubeValues(2,2,2); DoubleArray ContactAngle(20); DoubleArray Curvature(20); DoubleArray InterfaceSpeed(20); DoubleArray NormalVector(60); DoubleArray van(3); DoubleArray vaw(3); DoubleArray vawn(3); DoubleArray Gwn(6); DoubleArray Gns(6); DoubleArray Gws(6); double iVol = 1.0/Nx/Ny/Nz; 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; // Extra copies of phase indicator needed to compute time derivatives on CPU DoubleArray Phase_tminus(Nx,Ny,Nz); DoubleArray Phase_tplus(Nx,Ny,Nz); DoubleArray dPdt(Nx,Ny,Nz); for (k=0; k 0 ){ total++; // 1-D index for this cube corner n = i + j*Nx + k*Nx*Ny; // Compute the non-wetting phase volume contribution if ( Phase(i,j,k) > 0.0 ) nwp_volume += 1.0; // volume averages over the non-wetting phase if ( Phase(i,j,k) > 0.9999 ){ // volume the excludes the interfacial region vol_n += 1.0; // pressure pan += Press(i,j,k); // velocity van(0) += Vel_x(i,j,k); van(1) += Vel_y(i,j,k); van(2) += Vel_z(i,j,k); } // volume averages over the wetting phase if ( Phase(i,j,k) < -0.9999 ){ // volume the excludes the interfacial region vol_w += 1.0; // pressure paw += Press(i,j,k); // velocity vaw(0) += Vel_x(i,j,k); vaw(1) += Vel_y(i,j,k); vaw(2) += Vel_z(i,j,k); } } } } } // End of the loop to set the values awn = aws = ans = lwns = 0.0; As = 0.0; Gwn(0) = Gwn(1) = Gwn(2) = Gwn(3) = Gwn(4) = Gwn(5) = 0.0; Gws(0) = Gws(1) = Gws(2) = Gws(3) = Gws(4) = Gws(5) = 0.0; Gns(0) = Gns(1) = Gns(2) = Gns(3) = Gns(4) = Gns(5) = 0.0; FILE *WN_TRIS; WN_TRIS = fopen("wn-tris.out","w"); FILE *NS_TRIS; NS_TRIS = fopen("ns-tris.out","w"); FILE *WS_TRIS; WS_TRIS = fopen("ws-tris.out","w"); FILE *WNS_PTS; WNS_PTS = fopen("wns-pts.out","w"); for (c=0;c