Merge branch 'dfh' of github.com:JamesEMcClure/LBPM-WIA into dfh
This commit is contained in:
commit
9c7eee30f7
@ -70,7 +70,7 @@ TwoPhase::TwoPhase(Domain &dm):
|
|||||||
As_global(0), wwndnw_global(0), wwnsdnwn_global(0), Jwnwwndnw_global(0), dEs(0), dAwn(0), dAns(0)
|
As_global(0), wwndnw_global(0), wwnsdnwn_global(0), Jwnwwndnw_global(0), dEs(0), dAwn(0), dAns(0)
|
||||||
{
|
{
|
||||||
Nx=dm.Nx; Ny=dm.Ny; Nz=dm.Nz;
|
Nx=dm.Nx; Ny=dm.Ny; Nz=dm.Nz;
|
||||||
Volume=(Nx-2)*(Ny-2)*(Nz-2)*Dm.nprocx*Dm.nprocy*Dm.nprocz*1.0;
|
Volume=(Nx-2)*(Ny-2)*(Nz-2)*Dm.nprocx()*Dm.nprocy()*Dm.nprocz()*1.0;
|
||||||
|
|
||||||
TempID = new char[Nx*Ny*Nz];
|
TempID = new char[Nx*Ny*Nz];
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ TwoPhase::TwoPhase(Domain &dm):
|
|||||||
Gns_global.resize(6);
|
Gns_global.resize(6);
|
||||||
Gws_global.resize(6);
|
Gws_global.resize(6);
|
||||||
//.........................................
|
//.........................................
|
||||||
if (Dm.rank==0){
|
if (Dm.rank()==0){
|
||||||
TIMELOG = fopen("timelog.tcat","a+");
|
TIMELOG = fopen("timelog.tcat","a+");
|
||||||
if (fseek(TIMELOG,0,SEEK_SET) == fseek(TIMELOG,0,SEEK_CUR))
|
if (fseek(TIMELOG,0,SEEK_SET) == fseek(TIMELOG,0,SEEK_CUR))
|
||||||
{
|
{
|
||||||
@ -165,7 +165,7 @@ TwoPhase::TwoPhase(Domain &dm):
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
char LocalRankString[8];
|
char LocalRankString[8];
|
||||||
sprintf(LocalRankString,"%05d",Dm.rank);
|
sprintf(LocalRankString,"%05d",Dm.rank());
|
||||||
char LocalRankFilename[40];
|
char LocalRankFilename[40];
|
||||||
sprintf(LocalRankFilename,"%s%s","timelog.tcat.",LocalRankString);
|
sprintf(LocalRankFilename,"%s%s","timelog.tcat.",LocalRankString);
|
||||||
TIMELOG = fopen(LocalRankFilename,"a+");
|
TIMELOG = fopen(LocalRankFilename,"a+");
|
||||||
@ -418,8 +418,8 @@ void TwoPhase::ComputeLocal()
|
|||||||
|
|
||||||
// If external boundary conditions are set, do not average over the inlet
|
// If external boundary conditions are set, do not average over the inlet
|
||||||
kmin=1; kmax=Nz-1;
|
kmin=1; kmax=Nz-1;
|
||||||
if (Dm.BoundaryCondition > 0 && Dm.kproc == 0) kmin=4;
|
if (Dm.BoundaryCondition > 0 && Dm.kproc() == 0) kmin=4;
|
||||||
if (Dm.BoundaryCondition > 0 && Dm.kproc == Dm.nprocz-1) kmax=Nz-4;
|
if (Dm.BoundaryCondition > 0 && Dm.kproc() == Dm.nprocz()-1) kmax=Nz-4;
|
||||||
|
|
||||||
for (k=kmin; k<kmax; k++){
|
for (k=kmin; k<kmax; k++){
|
||||||
for (j=1; j<Ny-1; j++){
|
for (j=1; j<Ny-1; j++){
|
||||||
@ -585,15 +585,15 @@ void TwoPhase::ComponentAverages()
|
|||||||
ComponentAverages_WP.fill(0.0);
|
ComponentAverages_WP.fill(0.0);
|
||||||
ComponentAverages_NWP.fill(0.0);
|
ComponentAverages_NWP.fill(0.0);
|
||||||
|
|
||||||
if (Dm.rank==0){
|
if (Dm.rank()==0){
|
||||||
printf("Number of wetting phase components is %i \n",NumberComponents_WP);
|
printf("Number of wetting phase components is %i \n",NumberComponents_WP);
|
||||||
printf("Number of non-wetting phase components is %i \n",NumberComponents_NWP);
|
printf("Number of non-wetting phase components is %i \n",NumberComponents_NWP);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If external boundary conditions are set, do not average over the inlet
|
// If external boundary conditions are set, do not average over the inlet
|
||||||
kmin=1; kmax=Nz-1;
|
kmin=1; kmax=Nz-1;
|
||||||
if (Dm.BoundaryCondition > 0 && Dm.kproc == 0) kmin=4;
|
if (Dm.BoundaryCondition > 0 && Dm.kproc() == 0) kmin=4;
|
||||||
if (Dm.BoundaryCondition > 0 && Dm.kproc == Dm.nprocz-1) kmax=Nz-4;
|
if (Dm.BoundaryCondition > 0 && Dm.kproc() == Dm.nprocz()-1) kmax=Nz-4;
|
||||||
|
|
||||||
for (k=kmin; k<kmax; k++){
|
for (k=kmin; k<kmax; k++){
|
||||||
for (j=1; j<Ny-1; j++){
|
for (j=1; j<Ny-1; j++){
|
||||||
@ -636,9 +636,9 @@ void TwoPhase::ComponentAverages()
|
|||||||
ComponentAverages_NWP(VY,LabelNWP) += 0.125*Vel_y(n);
|
ComponentAverages_NWP(VY,LabelNWP) += 0.125*Vel_y(n);
|
||||||
ComponentAverages_NWP(VZ,LabelNWP) += 0.125*Vel_z(n);
|
ComponentAverages_NWP(VZ,LabelNWP) += 0.125*Vel_z(n);
|
||||||
// center of mass
|
// center of mass
|
||||||
ComponentAverages_NWP(CMX,LabelNWP) += 0.125*(i+cube[p][0]+Dm.iproc*Nx);
|
ComponentAverages_NWP(CMX,LabelNWP) += 0.125*(i+cube[p][0]+Dm.iproc()*Nx);
|
||||||
ComponentAverages_NWP(CMY,LabelNWP) += 0.125*(j+cube[p][1]+Dm.jproc*Ny);
|
ComponentAverages_NWP(CMY,LabelNWP) += 0.125*(j+cube[p][1]+Dm.jproc()*Ny);
|
||||||
ComponentAverages_NWP(CMZ,LabelNWP) += 0.125*(k+cube[p][2]+Dm.kproc*Nz);
|
ComponentAverages_NWP(CMZ,LabelNWP) += 0.125*(k+cube[p][2]+Dm.kproc()*Nz);
|
||||||
|
|
||||||
// twice the kinetic energy
|
// twice the kinetic energy
|
||||||
ComponentAverages_NWP(VSQ,LabelNWP) += 0.125*(Vel_x(n)*Vel_x(n)+Vel_y(n)*Vel_y(n)+Vel_z(n)*Vel_z(n));
|
ComponentAverages_NWP(VSQ,LabelNWP) += 0.125*(Vel_x(n)*Vel_x(n)+Vel_y(n)*Vel_y(n)+Vel_z(n)*Vel_z(n));
|
||||||
@ -656,9 +656,9 @@ void TwoPhase::ComponentAverages()
|
|||||||
ComponentAverages_WP(VY,LabelWP)+= 0.125*Vel_y(n);
|
ComponentAverages_WP(VY,LabelWP)+= 0.125*Vel_y(n);
|
||||||
ComponentAverages_WP(VZ,LabelWP) += 0.125*Vel_z(n);
|
ComponentAverages_WP(VZ,LabelWP) += 0.125*Vel_z(n);
|
||||||
// Center of mass
|
// Center of mass
|
||||||
ComponentAverages_WP(CMX,LabelWP) += 0.125*(i+cube[p][0]+Dm.iproc*Nx);
|
ComponentAverages_WP(CMX,LabelWP) += 0.125*(i+cube[p][0]+Dm.iproc()*Nx);
|
||||||
ComponentAverages_WP(CMY,LabelWP) += 0.125*(j+cube[p][1]+Dm.jproc*Ny);
|
ComponentAverages_WP(CMY,LabelWP) += 0.125*(j+cube[p][1]+Dm.jproc()*Ny);
|
||||||
ComponentAverages_WP(CMZ,LabelWP) += 0.125*(k+cube[p][2]+Dm.kproc*Nz);
|
ComponentAverages_WP(CMZ,LabelWP) += 0.125*(k+cube[p][2]+Dm.kproc()*Nz);
|
||||||
// twice the kinetic energy
|
// twice the kinetic energy
|
||||||
ComponentAverages_WP(VSQ,LabelWP) += 0.125*(Vel_x(n)*Vel_x(n)+Vel_y(n)*Vel_y(n)+Vel_z(n)*Vel_z(n));
|
ComponentAverages_WP(VSQ,LabelWP) += 0.125*(Vel_x(n)*Vel_x(n)+Vel_y(n)*Vel_y(n)+Vel_z(n)*Vel_z(n));
|
||||||
|
|
||||||
@ -803,7 +803,7 @@ void TwoPhase::ComponentAverages()
|
|||||||
}
|
}
|
||||||
|
|
||||||
MPI_Barrier(Dm.Comm);
|
MPI_Barrier(Dm.Comm);
|
||||||
if (Dm.rank==0){
|
if (Dm.rank()==0){
|
||||||
printf("Component averages computed locally -- reducing result... \n");
|
printf("Component averages computed locally -- reducing result... \n");
|
||||||
}
|
}
|
||||||
// Globally reduce the non-wetting phase averages
|
// Globally reduce the non-wetting phase averages
|
||||||
@ -819,7 +819,7 @@ void TwoPhase::ComponentAverages()
|
|||||||
MPI_Allreduce(ComponentAverages_NWP.data(),RecvBuffer.data(),BLOB_AVG_COUNT*NumberComponents_NWP, MPI_DOUBLE,MPI_SUM,Dm.Comm);
|
MPI_Allreduce(ComponentAverages_NWP.data(),RecvBuffer.data(),BLOB_AVG_COUNT*NumberComponents_NWP, MPI_DOUBLE,MPI_SUM,Dm.Comm);
|
||||||
// MPI_Reduce(ComponentAverages_NWP.data(),RecvBuffer.data(),BLOB_AVG_COUNT,MPI_DOUBLE,MPI_SUM,0,Dm.Comm);
|
// MPI_Reduce(ComponentAverages_NWP.data(),RecvBuffer.data(),BLOB_AVG_COUNT,MPI_DOUBLE,MPI_SUM,0,Dm.Comm);
|
||||||
|
|
||||||
if (Dm.rank==0){
|
if (Dm.rank()==0){
|
||||||
printf("rescaling... \n");
|
printf("rescaling... \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -907,7 +907,7 @@ void TwoPhase::ComponentAverages()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dm.rank==0){
|
if (Dm.rank()==0){
|
||||||
printf("reduce WP averages... \n");
|
printf("reduce WP averages... \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1052,15 +1052,15 @@ void TwoPhase::WriteSurfaces(int logcount)
|
|||||||
C = P;
|
C = P;
|
||||||
}
|
}
|
||||||
// Remap the points
|
// Remap the points
|
||||||
A.x += 1.0*Dm.iproc*(Nx-2);
|
A.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
A.y += 1.0*Dm.jproc*(Nx-2);
|
A.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
A.z += 1.0*Dm.kproc*(Nx-2);
|
A.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
B.x += 1.0*Dm.iproc*(Nx-2);
|
B.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
B.y += 1.0*Dm.jproc*(Nx-2);
|
B.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
B.z += 1.0*Dm.kproc*(Nx-2);
|
B.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
C.x += 1.0*Dm.iproc*(Nx-2);
|
C.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
C.y += 1.0*Dm.jproc*(Nx-2);
|
C.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
C.z += 1.0*Dm.kproc*(Nx-2);
|
C.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
wn_mesh->A.push_back(A);
|
wn_mesh->A.push_back(A);
|
||||||
wn_mesh->B.push_back(B);
|
wn_mesh->B.push_back(B);
|
||||||
wn_mesh->C.push_back(C);
|
wn_mesh->C.push_back(C);
|
||||||
@ -1070,15 +1070,15 @@ void TwoPhase::WriteSurfaces(int logcount)
|
|||||||
B = ws_pts(ws_tris(1,r));
|
B = ws_pts(ws_tris(1,r));
|
||||||
C = ws_pts(ws_tris(2,r));
|
C = ws_pts(ws_tris(2,r));
|
||||||
// Remap the points
|
// Remap the points
|
||||||
A.x += 1.0*Dm.iproc*(Nx-2);
|
A.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
A.y += 1.0*Dm.jproc*(Nx-2);
|
A.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
A.z += 1.0*Dm.kproc*(Nx-2);
|
A.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
B.x += 1.0*Dm.iproc*(Nx-2);
|
B.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
B.y += 1.0*Dm.jproc*(Nx-2);
|
B.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
B.z += 1.0*Dm.kproc*(Nx-2);
|
B.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
C.x += 1.0*Dm.iproc*(Nx-2);
|
C.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
C.y += 1.0*Dm.jproc*(Nx-2);
|
C.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
C.z += 1.0*Dm.kproc*(Nx-2);
|
C.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
ws_mesh->A.push_back(A);
|
ws_mesh->A.push_back(A);
|
||||||
ws_mesh->B.push_back(B);
|
ws_mesh->B.push_back(B);
|
||||||
ws_mesh->C.push_back(C);
|
ws_mesh->C.push_back(C);
|
||||||
@ -1088,15 +1088,15 @@ void TwoPhase::WriteSurfaces(int logcount)
|
|||||||
B = ns_pts(ns_tris(1,r));
|
B = ns_pts(ns_tris(1,r));
|
||||||
C = ns_pts(ns_tris(2,r));
|
C = ns_pts(ns_tris(2,r));
|
||||||
// Remap the points
|
// Remap the points
|
||||||
A.x += 1.0*Dm.iproc*(Nx-2);
|
A.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
A.y += 1.0*Dm.jproc*(Nx-2);
|
A.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
A.z += 1.0*Dm.kproc*(Nx-2);
|
A.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
B.x += 1.0*Dm.iproc*(Nx-2);
|
B.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
B.y += 1.0*Dm.jproc*(Nx-2);
|
B.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
B.z += 1.0*Dm.kproc*(Nx-2);
|
B.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
C.x += 1.0*Dm.iproc*(Nx-2);
|
C.x += 1.0*Dm.iproc()*(Nx-2);
|
||||||
C.y += 1.0*Dm.jproc*(Nx-2);
|
C.y += 1.0*Dm.jproc()*(Nx-2);
|
||||||
C.z += 1.0*Dm.kproc*(Nx-2);
|
C.z += 1.0*Dm.kproc()*(Nx-2);
|
||||||
ns_mesh->A.push_back(A);
|
ns_mesh->A.push_back(A);
|
||||||
ns_mesh->B.push_back(B);
|
ns_mesh->B.push_back(B);
|
||||||
ns_mesh->C.push_back(C);
|
ns_mesh->C.push_back(C);
|
||||||
@ -1224,7 +1224,7 @@ void TwoPhase::NonDimensionalize(double D, double viscosity, double IFT)
|
|||||||
|
|
||||||
void TwoPhase::PrintAll(int timestep)
|
void TwoPhase::PrintAll(int timestep)
|
||||||
{
|
{
|
||||||
if (Dm.rank==0){
|
if (Dm.rank()==0){
|
||||||
fprintf(TIMELOG,"%i %.5g ",timestep,dEs); // change in surface energy
|
fprintf(TIMELOG,"%i %.5g ",timestep,dEs); // change in surface energy
|
||||||
fprintf(TIMELOG,"%.5g %.5g %.5g ",sat_w,paw_global,pan_global); // saturation and pressure
|
fprintf(TIMELOG,"%.5g %.5g %.5g ",sat_w,paw_global,pan_global); // saturation and pressure
|
||||||
fprintf(TIMELOG,"%.5g %.5g %.5g ",awn_global,ans_global,aws_global); // interfacial areas
|
fprintf(TIMELOG,"%.5g %.5g %.5g ",awn_global,ans_global,aws_global); // interfacial areas
|
||||||
@ -1277,7 +1277,7 @@ void TwoPhase::PrintAll(int timestep)
|
|||||||
|
|
||||||
void TwoPhase::PrintComponents(int timestep)
|
void TwoPhase::PrintComponents(int timestep)
|
||||||
{
|
{
|
||||||
if (Dm.rank==0){
|
if (Dm.rank()==0){
|
||||||
printf("PRINT %i COMPONENT AVEREAGES: time = %i \n",(int)ComponentAverages_NWP.size(1),timestep);
|
printf("PRINT %i COMPONENT AVEREAGES: time = %i \n",(int)ComponentAverages_NWP.size(1),timestep);
|
||||||
for (int b=0; b<NumberComponents_NWP; b++){
|
for (int b=0; b<NumberComponents_NWP; b++){
|
||||||
//if (ComponentAverages_NWP(TRIMVOL,b) > 0.0){
|
//if (ComponentAverages_NWP(TRIMVOL,b) > 0.0){
|
||||||
|
@ -27,199 +27,55 @@ static inline double minmod(double &a, double &b){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TYPE>
|
||||||
|
static inline MPI_Datatype getType( );
|
||||||
|
template<> inline MPI_Datatype getType<float>() { return MPI_FLOAT; }
|
||||||
|
template<> inline MPI_Datatype getType<double>() { return MPI_DOUBLE; }
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* Solve the eikonal equation *
|
* Solve the eikonal equation *
|
||||||
******************************************************************/
|
******************************************************************/
|
||||||
double Eikonal(DoubleArray &Distance, const char *ID, const Domain &Dm, int timesteps)
|
template<class TYPE>
|
||||||
|
TYPE Eikonal( Array<TYPE> &Distance, const Array<char> &ID, const Domain &Dm, const int timesteps)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
|
||||||
* This routine converts the data in the Distance array to a signed distance
|
|
||||||
* by solving the equation df/dt = sign(1-|grad f|), where Distance provides
|
|
||||||
* the values of f on the mesh associated with domain Dm
|
|
||||||
* It has been tested with segmented data initialized to values [-1,1]
|
|
||||||
* and will converge toward the signed distance to the surface bounding the associated phases
|
|
||||||
*
|
|
||||||
* Reference:
|
|
||||||
* Min C (2010) On reinitializing level set functions, Journal of Computational Physics 229
|
|
||||||
*/
|
|
||||||
|
|
||||||
int i,j,k;
|
|
||||||
double dt=0.1;
|
|
||||||
double Dx,Dy,Dz;
|
|
||||||
double Dxp,Dxm,Dyp,Dym,Dzp,Dzm;
|
|
||||||
double Dxxp,Dxxm,Dyyp,Dyym,Dzzp,Dzzm;
|
|
||||||
double sign,norm;
|
|
||||||
double LocalVar,GlobalVar,LocalMax,GlobalMax;
|
|
||||||
|
|
||||||
int xdim,ydim,zdim;
|
|
||||||
xdim=Dm.Nx-2;
|
|
||||||
ydim=Dm.Ny-2;
|
|
||||||
zdim=Dm.Nz-2;
|
|
||||||
fillHalo<double> fillData(Dm.Comm, Dm.rank_info,xdim,ydim,zdim,1,1,1,0,1);
|
|
||||||
|
|
||||||
// Arrays to store the second derivatives
|
|
||||||
DoubleArray Dxx(Dm.Nx,Dm.Ny,Dm.Nz);
|
|
||||||
DoubleArray Dyy(Dm.Nx,Dm.Ny,Dm.Nz);
|
|
||||||
DoubleArray Dzz(Dm.Nx,Dm.Ny,Dm.Nz);
|
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
while (count < timesteps){
|
|
||||||
|
|
||||||
// Communicate the halo of values
|
|
||||||
fillData.fill(Distance);
|
|
||||||
|
|
||||||
// Compute second order derivatives
|
|
||||||
for (k=1;k<Dm.Nz-1;k++){
|
|
||||||
for (j=1;j<Dm.Ny-1;j++){
|
|
||||||
for (i=1;i<Dm.Nx-1;i++){
|
|
||||||
Dxx(i,j,k) = Distance(i+1,j,k) + Distance(i-1,j,k) - 2*Distance(i,j,k);
|
|
||||||
Dyy(i,j,k) = Distance(i,j+1,k) + Distance(i,j-1,k) - 2*Distance(i,j,k);
|
|
||||||
Dzz(i,j,k) = Distance(i,j,k+1) + Distance(i,j,k-1) - 2*Distance(i,j,k);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fillData.fill(Dxx);
|
|
||||||
fillData.fill(Dyy);
|
|
||||||
fillData.fill(Dzz);
|
|
||||||
|
|
||||||
LocalMax=LocalVar=0.0;
|
|
||||||
// Execute the next timestep
|
|
||||||
for (k=1;k<Dm.Nz-1;k++){
|
|
||||||
for (j=1;j<Dm.Ny-1;j++){
|
|
||||||
for (i=1;i<Dm.Nx-1;i++){
|
|
||||||
|
|
||||||
int n = k*Dm.Nx*Dm.Ny + j*Dm.Nx + i;
|
|
||||||
|
|
||||||
sign = 1;
|
|
||||||
if (ID[n] == 0) sign = -1;
|
|
||||||
|
|
||||||
// local second derivative terms
|
|
||||||
Dxxp = minmod(Dxx(i,j,k),Dxx(i+1,j,k));
|
|
||||||
Dyyp = minmod(Dyy(i,j,k),Dyy(i,j+1,k));
|
|
||||||
Dzzp = minmod(Dzz(i,j,k),Dzz(i,j,k+1));
|
|
||||||
Dxxm = minmod(Dxx(i,j,k),Dxx(i-1,j,k));
|
|
||||||
Dyym = minmod(Dyy(i,j,k),Dyy(i,j-1,k));
|
|
||||||
Dzzm = minmod(Dzz(i,j,k),Dzz(i,j,k-1));
|
|
||||||
|
|
||||||
/* //............Compute upwind derivatives ...................
|
|
||||||
Dxp = Distance(i+1,j,k) - Distance(i,j,k) + 0.5*Dxxp;
|
|
||||||
Dyp = Distance(i,j+1,k) - Distance(i,j,k) + 0.5*Dyyp;
|
|
||||||
Dzp = Distance(i,j,k+1) - Distance(i,j,k) + 0.5*Dzzp;
|
|
||||||
Dxm = Distance(i,j,k) - Distance(i-1,j,k) + 0.5*Dxxm;
|
|
||||||
Dym = Distance(i,j,k) - Distance(i,j-1,k) + 0.5*Dyym;
|
|
||||||
Dzm = Distance(i,j,k) - Distance(i,j,k-1) + 0.5*Dzzm;
|
|
||||||
*/
|
|
||||||
Dxp = Distance(i+1,j,k)- Distance(i,j,k) - 0.5*Dxxp;
|
|
||||||
Dyp = Distance(i,j+1,k)- Distance(i,j,k) - 0.5*Dyyp;
|
|
||||||
Dzp = Distance(i,j,k+1)- Distance(i,j,k) - 0.5*Dzzp;
|
|
||||||
|
|
||||||
Dxm = Distance(i,j,k) - Distance(i-1,j,k) + 0.5*Dxxm;
|
|
||||||
Dym = Distance(i,j,k) - Distance(i,j-1,k) + 0.5*Dyym;
|
|
||||||
Dzm = Distance(i,j,k) - Distance(i,j,k-1) + 0.5*Dzzm;
|
|
||||||
|
|
||||||
// Compute upwind derivatives for Godunov Hamiltonian
|
|
||||||
if (sign < 0.0){
|
|
||||||
if (Dxp + Dxm > 0.f) Dx = Dxp*Dxp;
|
|
||||||
else Dx = Dxm*Dxm;
|
|
||||||
|
|
||||||
if (Dyp + Dym > 0.f) Dy = Dyp*Dyp;
|
|
||||||
else Dy = Dym*Dym;
|
|
||||||
|
|
||||||
if (Dzp + Dzm > 0.f) Dz = Dzp*Dzp;
|
|
||||||
else Dz = Dzm*Dzm;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
|
|
||||||
if (Dxp + Dxm < 0.f) Dx = Dxp*Dxp;
|
|
||||||
else Dx = Dxm*Dxm;
|
|
||||||
|
|
||||||
if (Dyp + Dym < 0.f) Dy = Dyp*Dyp;
|
|
||||||
else Dy = Dym*Dym;
|
|
||||||
|
|
||||||
if (Dzp + Dzm < 0.f) Dz = Dzp*Dzp;
|
|
||||||
else Dz = Dzm*Dzm;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Dx = max(Dxp*Dxp,Dxm*Dxm);
|
|
||||||
//Dy = max(Dyp*Dyp,Dym*Dym);
|
|
||||||
//Dz = max(Dzp*Dzp,Dzm*Dzm);
|
|
||||||
|
|
||||||
norm=sqrt(Dx + Dy + Dz);
|
|
||||||
if (norm > 1.0) norm=1.0;
|
|
||||||
|
|
||||||
Distance(i,j,k) += dt*sign*(1.0 - norm);
|
|
||||||
LocalVar += dt*sign*(1.0 - norm);
|
|
||||||
|
|
||||||
if (fabs(dt*sign*(1.0 - norm)) > LocalMax)
|
|
||||||
LocalMax = fabs(dt*sign*(1.0 - norm));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MPI_Allreduce(&LocalVar,&GlobalVar,1,MPI_DOUBLE,MPI_SUM,Dm.Comm);
|
|
||||||
MPI_Allreduce(&LocalMax,&GlobalMax,1,MPI_DOUBLE,MPI_MAX,Dm.Comm);
|
|
||||||
GlobalVar /= (Dm.Nx-2)*(Dm.Ny-2)*(Dm.Nz-2)*Dm.nprocx*Dm.nprocy*Dm.nprocz;
|
|
||||||
count++;
|
|
||||||
|
|
||||||
|
|
||||||
if (count%50 == 0 && Dm.rank==0 ){
|
|
||||||
printf("Time=%i, Max variation=%f, Global variation=%f \n",count,GlobalMax,GlobalVar);
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabs(GlobalMax) < 1e-5){
|
|
||||||
if (Dm.rank==0) printf("Exiting with max tolerance of 1e-5 \n");
|
|
||||||
count=timesteps;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return GlobalVar;
|
|
||||||
}
|
|
||||||
|
|
||||||
float Eikonal3D( Array<float> &Distance, const Array<char> &ID, const Domain &Dm, const int timesteps)
|
|
||||||
{
|
|
||||||
PROFILE_START("Eikonal3D");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine converts the data in the Distance array to a signed distance
|
* This routine converts the data in the Distance array to a signed distance
|
||||||
* by solving the equation df/dt = sign*(1-|grad f|), where Distance provides
|
* by solving the equation df/dt = sign(1-|grad f|), where Distance provides
|
||||||
* the values of f on the mesh associated with domain Dm
|
* the values of f on the mesh associated with domain Dm
|
||||||
* It has been tested with segmented data initialized to values [-1,1]
|
* It has been tested with segmented data initialized to values [-1,1]
|
||||||
* and will converge toward the signed distance to the surface bounding the associated phases
|
* and will converge toward the signed distance to the surface bounding the associated phases
|
||||||
*
|
*
|
||||||
* Reference:
|
* Reference:
|
||||||
* Min C (2010) On reinitializing level set functions, Journal of Computational Physics 229
|
* Min C (2010) On reinitializing level set functions, Journal of Computational Physics 229
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int i,j,k;
|
int xdim = Dm.Nx-2;
|
||||||
float dt=0.1;
|
int ydim = Dm.Ny-2;
|
||||||
float Dx,Dy,Dz;
|
int zdim = Dm.Nz-2;
|
||||||
float Dxp,Dxm,Dyp,Dym,Dzp,Dzm;
|
fillHalo<TYPE> fillData(Dm.Comm, Dm.rank_info,xdim,ydim,zdim,1,1,1,0,1);
|
||||||
float Dxxp,Dxxm,Dyyp,Dyym,Dzzp,Dzzm;
|
|
||||||
float sign,norm;
|
|
||||||
float LocalVar,GlobalVar,LocalMax,GlobalMax;
|
|
||||||
|
|
||||||
int xdim,ydim,zdim;
|
|
||||||
xdim=Dm.Nx-2;
|
|
||||||
ydim=Dm.Ny-2;
|
|
||||||
zdim=Dm.Nz-2;
|
|
||||||
fillHalo<float> fillData(Dm.Comm, Dm.rank_info,xdim,ydim,zdim,1,1,1,0,1);
|
|
||||||
|
|
||||||
// Arrays to store the second derivatives
|
// Arrays to store the second derivatives
|
||||||
Array<float> Dxx(Dm.Nx,Dm.Ny,Dm.Nz);
|
Array<TYPE> Dxx(Dm.Nx,Dm.Ny,Dm.Nz);
|
||||||
Array<float> Dyy(Dm.Nx,Dm.Ny,Dm.Nz);
|
Array<TYPE> Dyy(Dm.Nx,Dm.Ny,Dm.Nz);
|
||||||
Array<float> Dzz(Dm.Nx,Dm.Ny,Dm.Nz);
|
Array<TYPE> Dzz(Dm.Nx,Dm.Ny,Dm.Nz);
|
||||||
|
Array<int8_t> sign(ID.size());
|
||||||
|
for (size_t i=0; i<sign.length(); i++)
|
||||||
|
sign(i) = ID(i) == 0 ? -1:1;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
double dt = 0.1;
|
||||||
|
double GlobalVar = 0.0;
|
||||||
while (count < timesteps){
|
while (count < timesteps){
|
||||||
|
|
||||||
// Communicate the halo of values
|
// Communicate the halo of values
|
||||||
fillData.fill(Distance);
|
fillData.fill(Distance);
|
||||||
|
|
||||||
// Compute second order derivatives
|
// Compute second order derivatives
|
||||||
for (k=1;k<Dm.Nz-1;k++){
|
for (int k=1;k<Dm.Nz-1;k++){
|
||||||
for (j=1;j<Dm.Ny-1;j++){
|
for (int j=1;j<Dm.Ny-1;j++){
|
||||||
for (i=1;i<Dm.Nx-1;i++){
|
for (int i=1;i<Dm.Nx-1;i++){
|
||||||
Dxx(i,j,k) = Distance(i+1,j,k) + Distance(i-1,j,k) - 2*Distance(i,j,k);
|
Dxx(i,j,k) = Distance(i+1,j,k) + Distance(i-1,j,k) - 2*Distance(i,j,k);
|
||||||
Dyy(i,j,k) = Distance(i,j+1,k) + Distance(i,j-1,k) - 2*Distance(i,j,k);
|
Dyy(i,j,k) = Distance(i,j+1,k) + Distance(i,j-1,k) - 2*Distance(i,j,k);
|
||||||
Dzz(i,j,k) = Distance(i,j,k+1) + Distance(i,j,k-1) - 2*Distance(i,j,k);
|
Dzz(i,j,k) = Distance(i,j,k+1) + Distance(i,j,k-1) - 2*Distance(i,j,k);
|
||||||
@ -230,100 +86,112 @@ float Eikonal3D( Array<float> &Distance, const Array<char> &ID, const Domain &Dm
|
|||||||
fillData.fill(Dyy);
|
fillData.fill(Dyy);
|
||||||
fillData.fill(Dzz);
|
fillData.fill(Dzz);
|
||||||
|
|
||||||
LocalMax=LocalVar=0.0;
|
double LocalMax = 0.0;
|
||||||
|
double LocalVar = 0.0;
|
||||||
// Execute the next timestep
|
// Execute the next timestep
|
||||||
// f(n+1) = f(n) + dt*sign(1-|grad f|)
|
for (int k=1;k<Dm.Nz-1;k++){
|
||||||
for (k=1;k<Dm.Nz-1;k++){
|
for (int j=1;j<Dm.Ny-1;j++){
|
||||||
for (j=1;j<Dm.Ny-1;j++){
|
for (int i=1;i<Dm.Nx-1;i++){
|
||||||
for (i=1;i<Dm.Nx-1;i++){
|
double s = sign(i,j,k);
|
||||||
|
|
||||||
int n = k*Dm.Nx*Dm.Ny + j*Dm.Nx + i;
|
|
||||||
|
|
||||||
sign = -1;
|
|
||||||
if (ID(i,j,k) == 1) sign = 1;
|
|
||||||
|
|
||||||
// local second derivative terms
|
// local second derivative terms
|
||||||
Dxxp = minmod(Dxx(i,j,k),Dxx(i+1,j,k));
|
double Dxxp = minmod(Dxx(i,j,k),Dxx(i+1,j,k));
|
||||||
Dyyp = minmod(Dyy(i,j,k),Dyy(i,j+1,k));
|
double Dyyp = minmod(Dyy(i,j,k),Dyy(i,j+1,k));
|
||||||
Dzzp = minmod(Dzz(i,j,k),Dzz(i,j,k+1));
|
double Dzzp = minmod(Dzz(i,j,k),Dzz(i,j,k+1));
|
||||||
Dxxm = minmod(Dxx(i,j,k),Dxx(i-1,j,k));
|
double Dxxm = minmod(Dxx(i,j,k),Dxx(i-1,j,k));
|
||||||
Dyym = minmod(Dyy(i,j,k),Dyy(i,j-1,k));
|
double Dyym = minmod(Dyy(i,j,k),Dyy(i,j-1,k));
|
||||||
Dzzm = minmod(Dzz(i,j,k),Dzz(i,j,k-1));
|
double Dzzm = minmod(Dzz(i,j,k),Dzz(i,j,k-1));
|
||||||
|
|
||||||
/* //............Compute upwind derivatives ...................
|
/* //............Compute upwind derivatives ...................
|
||||||
Dxp = Distance(i+1,j,k) - Distance(i,j,k) + 0.5*Dxxp;
|
Dxp = Distance(i+1,j,k) - Distance(i,j,k) + 0.5*Dxxp;
|
||||||
Dyp = Distance(i,j+1,k) - Distance(i,j,k) + 0.5*Dyyp;
|
Dyp = Distance(i,j+1,k) - Distance(i,j,k) + 0.5*Dyyp;
|
||||||
Dzp = Distance(i,j,k+1) - Distance(i,j,k) + 0.5*Dzzp;
|
Dzp = Distance(i,j,k+1) - Distance(i,j,k) + 0.5*Dzzp;
|
||||||
|
|
||||||
Dxm = Distance(i,j,k) - Distance(i-1,j,k) + 0.5*Dxxm;
|
Dxm = Distance(i,j,k) - Distance(i-1,j,k) + 0.5*Dxxm;
|
||||||
Dym = Distance(i,j,k) - Distance(i,j-1,k) + 0.5*Dyym;
|
Dym = Distance(i,j,k) - Distance(i,j-1,k) + 0.5*Dyym;
|
||||||
Dzm = Distance(i,j,k) - Distance(i,j,k-1) + 0.5*Dzzm;
|
Dzm = Distance(i,j,k) - Distance(i,j,k-1) + 0.5*Dzzm;
|
||||||
*/
|
*/
|
||||||
Dxp = Distance(i+1,j,k);
|
double Dxp = Distance(i+1,j,k)- Distance(i,j,k) - 0.5*Dxxp;
|
||||||
Dyp = Distance(i,j+1,k);
|
double Dyp = Distance(i,j+1,k)- Distance(i,j,k) - 0.5*Dyyp;
|
||||||
Dzp = Distance(i,j,k+1);
|
double Dzp = Distance(i,j,k+1)- Distance(i,j,k) - 0.5*Dzzp;
|
||||||
|
double Dxm = Distance(i,j,k) - Distance(i-1,j,k) + 0.5*Dxxm;
|
||||||
Dxm = Distance(i-1,j,k);
|
double Dym = Distance(i,j,k) - Distance(i,j-1,k) + 0.5*Dyym;
|
||||||
Dym = Distance(i,j-1,k);
|
double Dzm = Distance(i,j,k) - Distance(i,j,k-1) + 0.5*Dzzm;
|
||||||
Dzm = Distance(i,j,k-1);
|
|
||||||
|
|
||||||
// Compute upwind derivatives for Godunov Hamiltonian
|
// Compute upwind derivatives for Godunov Hamiltonian
|
||||||
if (sign < 0.0){
|
double Dx, Dy, Dz;
|
||||||
if (Dxp > Dxm) Dx = Dxp - Distance(i,j,k) + 0.5*Dxxp;
|
if ( s < 0.0){
|
||||||
else Dx = Distance(i,j,k) - Dxm + 0.5*Dxxm;
|
if (Dxp + Dxm > 0.f)
|
||||||
|
Dx = Dxp*Dxp;
|
||||||
if (Dyp > Dym) Dy = Dyp - Distance(i,j,k) + 0.5*Dyyp;
|
else
|
||||||
else Dy = Distance(i,j,k) - Dym + 0.5*Dyym;
|
Dx = Dxm*Dxm;
|
||||||
|
if (Dyp + Dym > 0.f)
|
||||||
if (Dzp > Dzm) Dz = Dzp - Distance(i,j,k) + 0.5*Dzzp;
|
Dy = Dyp*Dyp;
|
||||||
else Dz = Distance(i,j,k) - Dzm + 0.5*Dzzm;
|
else
|
||||||
|
Dy = Dym*Dym;
|
||||||
|
if (Dzp + Dzm > 0.f)
|
||||||
|
Dz = Dzp*Dzp;
|
||||||
|
else
|
||||||
|
Dz = Dzm*Dzm;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (Dxp < Dxm) Dx = Dxp - Distance(i,j,k) + 0.5*Dxxp;
|
if (Dxp + Dxm < 0.f)
|
||||||
else Dx = Distance(i,j,k) - Dxm + 0.5*Dxxm;
|
Dx = Dxp*Dxp;
|
||||||
|
else
|
||||||
if (Dyp < Dym) Dy = Dyp - Distance(i,j,k) + 0.5*Dyyp;
|
Dx = Dxm*Dxm;
|
||||||
else Dy = Distance(i,j,k) - Dym + 0.5*Dyym;
|
if (Dyp + Dym < 0.f)
|
||||||
|
Dy = Dyp*Dyp;
|
||||||
if (Dzp < Dzm) Dz = Dzp - Distance(i,j,k) + 0.5*Dzzp;
|
else
|
||||||
else Dz = Distance(i,j,k) - Dzm + 0.5*Dzzm;
|
Dy = Dym*Dym;
|
||||||
|
if (Dzp + Dzm < 0.f)
|
||||||
|
Dz = Dzp*Dzp;
|
||||||
|
else
|
||||||
|
Dz = Dzm*Dzm;
|
||||||
}
|
}
|
||||||
|
|
||||||
norm=sqrt(Dx*Dx+Dy*Dy+Dz*Dz);
|
//Dx = max(Dxp*Dxp,Dxm*Dxm);
|
||||||
if (norm > 1.0) norm=1.0;
|
//Dy = max(Dyp*Dyp,Dym*Dym);
|
||||||
|
//Dz = max(Dzp*Dzp,Dzm*Dzm);
|
||||||
|
|
||||||
Distance(i,j,k) += dt*sign*(1.0 - norm);
|
double norm = sqrt(Dx + Dy + Dz);
|
||||||
LocalVar += dt*sign*(1.0 - norm);
|
if (norm > 1.0)
|
||||||
|
norm = 1.0;
|
||||||
|
|
||||||
if (fabs(dt*sign*(1.0 - norm)) > LocalMax)
|
Distance(i,j,k) += dt*s*(1.0 - norm);
|
||||||
LocalMax = fabs(dt*sign*(1.0 - norm));
|
LocalVar += dt*s*(1.0 - norm);
|
||||||
|
|
||||||
|
if (fabs(dt*s*(1.0 - norm)) > LocalMax)
|
||||||
|
LocalMax = fabs(dt*s*(1.0 - norm));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MPI_Allreduce(&LocalVar,&GlobalVar,1,MPI_FLOAT,MPI_SUM,Dm.Comm);
|
double GlobalMax;
|
||||||
MPI_Allreduce(&LocalMax,&GlobalMax,1,MPI_FLOAT,MPI_MAX,Dm.Comm);
|
MPI_Allreduce(&LocalVar,&GlobalVar,1,MPI_DOUBLE,MPI_SUM,Dm.Comm);
|
||||||
GlobalVar /= (Dm.Nx-2)*(Dm.Ny-2)*(Dm.Nz-2)*Dm.nprocx*Dm.nprocy*Dm.nprocz;
|
MPI_Allreduce(&LocalMax,&GlobalMax,1,MPI_DOUBLE,MPI_MAX,Dm.Comm);
|
||||||
|
GlobalVar /= (Dm.Nx-2)*(Dm.Ny-2)*(Dm.Nz-2)*Dm.nprocx()*Dm.nprocy()*Dm.nprocz();
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
if (count%50 == 0 && Dm.rank==0 )
|
|
||||||
printf(" Time=%i, Max variation=%f, Global variation=%f \n",count,GlobalMax,GlobalVar);
|
if (count%50 == 0 && Dm.rank()==0 ){
|
||||||
|
printf("Time=%i, Max variation=%f, Global variation=%f \n",count,GlobalMax,GlobalVar);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
if (fabs(GlobalMax) < 1e-5){
|
if (fabs(GlobalMax) < 1e-5){
|
||||||
if (Dm.rank==0) printf(" Exiting with max tolerance of 1e-5 \n");
|
if (Dm.rank()==0)
|
||||||
|
printf("Exiting with max tolerance of 1e-5 \n");
|
||||||
count=timesteps;
|
count=timesteps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PROFILE_STOP("Eikonal3D");
|
|
||||||
return GlobalVar;
|
return GlobalVar;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
template float Eikonal<float>( Array<float>&, const Array<char>&, const Domain&, int );
|
||||||
|
template double Eikonal<double>( Array<double>&, const Array<char>&, const Domain&, int );
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* A fast distance calculation *
|
* A fast distance calculation *
|
||||||
******************************************************************/
|
******************************************************************/
|
||||||
bool CalcDist3DIteration( Array<float> &Distance, const Domain &Dm )
|
bool CalcDist3DIteration( Array<float> &Distance, const Domain & )
|
||||||
{
|
{
|
||||||
const float sq2 = sqrt(2.0f);
|
const float sq2 = sqrt(2.0f);
|
||||||
const float sq3 = sqrt(3.0f);
|
const float sq3 = sqrt(3.0f);
|
||||||
|
@ -15,23 +15,20 @@
|
|||||||
* Reference:
|
* Reference:
|
||||||
* Min C (2010) On reinitializing level set functions, Journal of Computational Physics 229
|
* Min C (2010) On reinitializing level set functions, Journal of Computational Physics 229
|
||||||
*
|
*
|
||||||
* @return Returns the number of cubes in the blob
|
|
||||||
* @param[in/out] Distance Distance function
|
* @param[in/out] Distance Distance function
|
||||||
* @param[in] ID Segmentation id
|
* @param[in] ID Segmentation id
|
||||||
* @param[in] DM Domain information
|
* @param[in] DM Domain information
|
||||||
* @param[in] timesteps Maximum number of timesteps to process
|
* @param[in] timesteps Maximum number of timesteps to process
|
||||||
* @return Returns the global variation
|
* @return Returns the global variation
|
||||||
*/
|
*/
|
||||||
double Eikonal(DoubleArray &Distance, const char *ID, const Domain &Dm, int timesteps);
|
template<class TYPE>
|
||||||
|
TYPE Eikonal( Array<TYPE> &Distance, const Array<char> &ID, const Domain &Dm, int timesteps);
|
||||||
float Eikonal3D( Array<float> &Distance, const Array<char> &ID, const Domain &Dm, const int timesteps);
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief Calculate the distance using a simple method
|
* @brief Calculate the distance using a simple method
|
||||||
* @details This routine calculates the distance using a very simple method working off the segmentation id.
|
* @details This routine calculates the distance using a very simple method working off the segmentation id.
|
||||||
*
|
*
|
||||||
* @return Returns the number of cubes in the blob
|
|
||||||
* @param[in/out] Distance Distance function
|
* @param[in/out] Distance Distance function
|
||||||
* @param[in] ID Segmentation id
|
* @param[in] ID Segmentation id
|
||||||
* @param[in] DM Domain information
|
* @param[in] DM Domain information
|
||||||
|
@ -294,7 +294,7 @@ runAnalysis::runAnalysis( std::shared_ptr<Database> db,
|
|||||||
NULL_USE( pBC );
|
NULL_USE( pBC );
|
||||||
INSIST( db, "Input database is empty" );
|
INSIST( db, "Input database is empty" );
|
||||||
char rankString[20];
|
char rankString[20];
|
||||||
sprintf(rankString,"%05d",Dm.rank);
|
sprintf(rankString,"%05d",Dm.rank());
|
||||||
d_N[0] = Dm.Nx;
|
d_N[0] = Dm.Nx;
|
||||||
d_N[1] = Dm.Ny;
|
d_N[1] = Dm.Ny;
|
||||||
d_N[2] = Dm.Nz;
|
d_N[2] = Dm.Nz;
|
||||||
|
@ -149,7 +149,7 @@ void solve( const Array<float>& VOL, Array<float>& Mean, Array<char>& ID,
|
|||||||
fillFloat.fill( Mean );
|
fillFloat.fill( Mean );
|
||||||
segment( Mean, ID, 0.01 );
|
segment( Mean, ID, 0.01 );
|
||||||
// Compute the distance using the segmented volume
|
// Compute the distance using the segmented volume
|
||||||
Eikonal3D( Dist, ID, Dm, ID.size(0)*nprocx );
|
Eikonal( Dist, ID, Dm, ID.size(0)*nprocx );
|
||||||
fillFloat.fill(Dist);
|
fillFloat.fill(Dist);
|
||||||
smooth( VOL, Dist, 2.0, MultiScaleSmooth, fillFloat );
|
smooth( VOL, Dist, 2.0, MultiScaleSmooth, fillFloat );
|
||||||
// Compute non-local mean
|
// Compute non-local mean
|
||||||
|
@ -28,7 +28,7 @@ static inline void fgetl( char * str, int num, FILE * stream )
|
|||||||
Domain::Domain( int nx, int ny, int nz, int rnk, int npx, int npy, int npz,
|
Domain::Domain( int nx, int ny, int nz, int rnk, int npx, int npy, int npz,
|
||||||
double lx, double ly, double lz, int BC):
|
double lx, double ly, double lz, int BC):
|
||||||
Nx(0), Ny(0), Nz(0),
|
Nx(0), Ny(0), Nz(0),
|
||||||
Lx(0), Ly(0), Lz(0), Volume(0), rank(0), BoundaryCondition(0),
|
Lx(0), Ly(0), Lz(0), Volume(0), BoundaryCondition(0),
|
||||||
Comm(MPI_COMM_NULL),
|
Comm(MPI_COMM_NULL),
|
||||||
sendCount_x(0), sendCount_y(0), sendCount_z(0), sendCount_X(0), sendCount_Y(0), sendCount_Z(0),
|
sendCount_x(0), sendCount_y(0), sendCount_z(0), sendCount_X(0), sendCount_Y(0), sendCount_Z(0),
|
||||||
sendCount_xy(0), sendCount_yz(0), sendCount_xz(0), sendCount_Xy(0), sendCount_Yz(0), sendCount_xZ(0),
|
sendCount_xy(0), sendCount_yz(0), sendCount_xz(0), sendCount_Xy(0), sendCount_Yz(0), sendCount_xZ(0),
|
||||||
@ -65,8 +65,8 @@ Domain::Domain( int nx, int ny, int nz, int rnk, int npx, int npy, int npz,
|
|||||||
initialize( db );
|
initialize( db );
|
||||||
}
|
}
|
||||||
Domain::Domain( std::shared_ptr<Database> db ):
|
Domain::Domain( std::shared_ptr<Database> db ):
|
||||||
Nx(0), Ny(0), Nz(0), iproc(0), jproc(0),
|
Nx(0), Ny(0), Nz(0),
|
||||||
Lx(0), Ly(0), Lz(0), Volume(0), rank(0), BoundaryCondition(0),
|
Lx(0), Ly(0), Lz(0), Volume(0), BoundaryCondition(0),
|
||||||
Comm(MPI_COMM_NULL),
|
Comm(MPI_COMM_NULL),
|
||||||
sendCount_x(0), sendCount_y(0), sendCount_z(0), sendCount_X(0), sendCount_Y(0), sendCount_Z(0),
|
sendCount_x(0), sendCount_y(0), sendCount_z(0), sendCount_X(0), sendCount_Y(0), sendCount_Z(0),
|
||||||
sendCount_xy(0), sendCount_yz(0), sendCount_xz(0), sendCount_Xy(0), sendCount_Yz(0), sendCount_xZ(0),
|
sendCount_xy(0), sendCount_yz(0), sendCount_xz(0), sendCount_Xy(0), sendCount_Yz(0), sendCount_xZ(0),
|
||||||
@ -121,13 +121,13 @@ void Domain::initialize( std::shared_ptr<Database> db )
|
|||||||
rank_info = RankInfoStruct(myrank,nproc[0],nproc[1],nproc[2]);
|
rank_info = RankInfoStruct(myrank,nproc[0],nproc[1],nproc[2]);
|
||||||
// Fill remaining variables
|
// Fill remaining variables
|
||||||
N = Nx*Ny*Nz;
|
N = Nx*Ny*Nz;
|
||||||
Volume = nx*ny*nx*nprocx*nprocy*nprocz*1.0;
|
Volume = nx*ny*nx*nproc[0]*nproc[1]*nproc[2]*1.0;
|
||||||
id = new char[N];
|
id = new char[N];
|
||||||
memset(id,0,N);
|
memset(id,0,N);
|
||||||
BoundaryCondition = d_db->getScalar<int>("BC");
|
BoundaryCondition = d_db->getScalar<int>("BC");
|
||||||
int nprocs;
|
int nprocs;
|
||||||
MPI_Comm_size( MPI_COMM_WORLD, &nprocs );
|
MPI_Comm_size( MPI_COMM_WORLD, &nprocs );
|
||||||
INSIST(nprocs == nprocx*nprocy*nprocz,"Fatal error in processor count!");
|
INSIST(nprocs == nproc[0]*nproc[1]*nproc[2],"Fatal error in processor count!");
|
||||||
}
|
}
|
||||||
Domain::~Domain()
|
Domain::~Domain()
|
||||||
{
|
{
|
||||||
@ -194,7 +194,9 @@ void Domain::CommInit(MPI_Comm Communicator)
|
|||||||
MPI_Comm_dup(Communicator,&Comm);
|
MPI_Comm_dup(Communicator,&Comm);
|
||||||
|
|
||||||
// set up the neighbor ranks
|
// set up the neighbor ranks
|
||||||
rank_info = RankInfoStruct( rank, nprocx, nprocy, nprocz );
|
int myrank;
|
||||||
|
MPI_Comm_rank( Comm, &myrank );
|
||||||
|
rank_info = RankInfoStruct( myrank, rank_info.nx, rank_info.ny, rank_info.nz );
|
||||||
|
|
||||||
MPI_Barrier(Communicator);
|
MPI_Barrier(Communicator);
|
||||||
|
|
||||||
@ -314,42 +316,42 @@ void Domain::CommInit(MPI_Comm Communicator)
|
|||||||
sendBuf_YZ = new int [sendCount_YZ];
|
sendBuf_YZ = new int [sendCount_YZ];
|
||||||
sendBuf_XZ = new int [sendCount_XZ];
|
sendBuf_XZ = new int [sendCount_XZ];
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
MPI_Isend(&sendCount_x, 1,MPI_INT,rank_x,sendtag+0,Communicator,&req1[0]);
|
MPI_Isend(&sendCount_x, 1,MPI_INT,rank_x(),sendtag+0,Communicator,&req1[0]);
|
||||||
MPI_Irecv(&recvCount_X, 1,MPI_INT,rank_X,recvtag+0,Communicator,&req2[0]);
|
MPI_Irecv(&recvCount_X, 1,MPI_INT,rank_X(),recvtag+0,Communicator,&req2[0]);
|
||||||
MPI_Isend(&sendCount_X, 1,MPI_INT,rank_X,sendtag+1,Communicator,&req1[1]);
|
MPI_Isend(&sendCount_X, 1,MPI_INT,rank_X(),sendtag+1,Communicator,&req1[1]);
|
||||||
MPI_Irecv(&recvCount_x, 1,MPI_INT,rank_x,recvtag+1,Communicator,&req2[1]);
|
MPI_Irecv(&recvCount_x, 1,MPI_INT,rank_x(),recvtag+1,Communicator,&req2[1]);
|
||||||
MPI_Isend(&sendCount_y, 1,MPI_INT,rank_y,sendtag+2,Communicator,&req1[2]);
|
MPI_Isend(&sendCount_y, 1,MPI_INT,rank_y(),sendtag+2,Communicator,&req1[2]);
|
||||||
MPI_Irecv(&recvCount_Y, 1,MPI_INT,rank_Y,recvtag+2,Communicator,&req2[2]);
|
MPI_Irecv(&recvCount_Y, 1,MPI_INT,rank_Y(),recvtag+2,Communicator,&req2[2]);
|
||||||
MPI_Isend(&sendCount_Y, 1,MPI_INT,rank_Y,sendtag+3,Communicator,&req1[3]);
|
MPI_Isend(&sendCount_Y, 1,MPI_INT,rank_Y(),sendtag+3,Communicator,&req1[3]);
|
||||||
MPI_Irecv(&recvCount_y, 1,MPI_INT,rank_y,recvtag+3,Communicator,&req2[3]);
|
MPI_Irecv(&recvCount_y, 1,MPI_INT,rank_y(),recvtag+3,Communicator,&req2[3]);
|
||||||
MPI_Isend(&sendCount_z, 1,MPI_INT,rank_z,sendtag+4,Communicator,&req1[4]);
|
MPI_Isend(&sendCount_z, 1,MPI_INT,rank_z(),sendtag+4,Communicator,&req1[4]);
|
||||||
MPI_Irecv(&recvCount_Z, 1,MPI_INT,rank_Z,recvtag+4,Communicator,&req2[4]);
|
MPI_Irecv(&recvCount_Z, 1,MPI_INT,rank_Z(),recvtag+4,Communicator,&req2[4]);
|
||||||
MPI_Isend(&sendCount_Z, 1,MPI_INT,rank_Z,sendtag+5,Communicator,&req1[5]);
|
MPI_Isend(&sendCount_Z, 1,MPI_INT,rank_Z(),sendtag+5,Communicator,&req1[5]);
|
||||||
MPI_Irecv(&recvCount_z, 1,MPI_INT,rank_z,recvtag+5,Communicator,&req2[5]);
|
MPI_Irecv(&recvCount_z, 1,MPI_INT,rank_z(),recvtag+5,Communicator,&req2[5]);
|
||||||
MPI_Isend(&sendCount_xy, 1,MPI_INT,rank_xy,sendtag+6,Communicator,&req1[6]);
|
MPI_Isend(&sendCount_xy, 1,MPI_INT,rank_xy(),sendtag+6,Communicator,&req1[6]);
|
||||||
MPI_Irecv(&recvCount_XY, 1,MPI_INT,rank_XY,recvtag+6,Communicator,&req2[6]);
|
MPI_Irecv(&recvCount_XY, 1,MPI_INT,rank_XY(),recvtag+6,Communicator,&req2[6]);
|
||||||
MPI_Isend(&sendCount_XY, 1,MPI_INT,rank_XY,sendtag+7,Communicator,&req1[7]);
|
MPI_Isend(&sendCount_XY, 1,MPI_INT,rank_XY(),sendtag+7,Communicator,&req1[7]);
|
||||||
MPI_Irecv(&recvCount_xy, 1,MPI_INT,rank_xy,recvtag+7,Communicator,&req2[7]);
|
MPI_Irecv(&recvCount_xy, 1,MPI_INT,rank_xy(),recvtag+7,Communicator,&req2[7]);
|
||||||
MPI_Isend(&sendCount_Xy, 1,MPI_INT,rank_Xy,sendtag+8,Communicator,&req1[8]);
|
MPI_Isend(&sendCount_Xy, 1,MPI_INT,rank_Xy(),sendtag+8,Communicator,&req1[8]);
|
||||||
MPI_Irecv(&recvCount_xY, 1,MPI_INT,rank_xY,recvtag+8,Communicator,&req2[8]);
|
MPI_Irecv(&recvCount_xY, 1,MPI_INT,rank_xY(),recvtag+8,Communicator,&req2[8]);
|
||||||
MPI_Isend(&sendCount_xY, 1,MPI_INT,rank_xY,sendtag+9,Communicator,&req1[9]);
|
MPI_Isend(&sendCount_xY, 1,MPI_INT,rank_xY(),sendtag+9,Communicator,&req1[9]);
|
||||||
MPI_Irecv(&recvCount_Xy, 1,MPI_INT,rank_Xy,recvtag+9,Communicator,&req2[9]);
|
MPI_Irecv(&recvCount_Xy, 1,MPI_INT,rank_Xy(),recvtag+9,Communicator,&req2[9]);
|
||||||
MPI_Isend(&sendCount_xz, 1,MPI_INT,rank_xz,sendtag+10,Communicator,&req1[10]);
|
MPI_Isend(&sendCount_xz, 1,MPI_INT,rank_xz(),sendtag+10,Communicator,&req1[10]);
|
||||||
MPI_Irecv(&recvCount_XZ, 1,MPI_INT,rank_XZ,recvtag+10,Communicator,&req2[10]);
|
MPI_Irecv(&recvCount_XZ, 1,MPI_INT,rank_XZ(),recvtag+10,Communicator,&req2[10]);
|
||||||
MPI_Isend(&sendCount_XZ, 1,MPI_INT,rank_XZ,sendtag+11,Communicator,&req1[11]);
|
MPI_Isend(&sendCount_XZ, 1,MPI_INT,rank_XZ(),sendtag+11,Communicator,&req1[11]);
|
||||||
MPI_Irecv(&recvCount_xz, 1,MPI_INT,rank_xz,recvtag+11,Communicator,&req2[11]);
|
MPI_Irecv(&recvCount_xz, 1,MPI_INT,rank_xz(),recvtag+11,Communicator,&req2[11]);
|
||||||
MPI_Isend(&sendCount_Xz, 1,MPI_INT,rank_Xz,sendtag+12,Communicator,&req1[12]);
|
MPI_Isend(&sendCount_Xz, 1,MPI_INT,rank_Xz(),sendtag+12,Communicator,&req1[12]);
|
||||||
MPI_Irecv(&recvCount_xZ, 1,MPI_INT,rank_xZ,recvtag+12,Communicator,&req2[12]);
|
MPI_Irecv(&recvCount_xZ, 1,MPI_INT,rank_xZ(),recvtag+12,Communicator,&req2[12]);
|
||||||
MPI_Isend(&sendCount_xZ, 1,MPI_INT,rank_xZ,sendtag+13,Communicator,&req1[13]);
|
MPI_Isend(&sendCount_xZ, 1,MPI_INT,rank_xZ(),sendtag+13,Communicator,&req1[13]);
|
||||||
MPI_Irecv(&recvCount_Xz, 1,MPI_INT,rank_Xz,recvtag+13,Communicator,&req2[13]);
|
MPI_Irecv(&recvCount_Xz, 1,MPI_INT,rank_Xz(),recvtag+13,Communicator,&req2[13]);
|
||||||
MPI_Isend(&sendCount_yz, 1,MPI_INT,rank_yz,sendtag+14,Communicator,&req1[14]);
|
MPI_Isend(&sendCount_yz, 1,MPI_INT,rank_yz(),sendtag+14,Communicator,&req1[14]);
|
||||||
MPI_Irecv(&recvCount_YZ, 1,MPI_INT,rank_YZ,recvtag+14,Communicator,&req2[14]);
|
MPI_Irecv(&recvCount_YZ, 1,MPI_INT,rank_YZ(),recvtag+14,Communicator,&req2[14]);
|
||||||
MPI_Isend(&sendCount_YZ, 1,MPI_INT,rank_YZ,sendtag+15,Communicator,&req1[15]);
|
MPI_Isend(&sendCount_YZ, 1,MPI_INT,rank_YZ(),sendtag+15,Communicator,&req1[15]);
|
||||||
MPI_Irecv(&recvCount_yz, 1,MPI_INT,rank_yz,recvtag+15,Communicator,&req2[15]);
|
MPI_Irecv(&recvCount_yz, 1,MPI_INT,rank_yz(),recvtag+15,Communicator,&req2[15]);
|
||||||
MPI_Isend(&sendCount_Yz, 1,MPI_INT,rank_Yz,sendtag+16,Communicator,&req1[16]);
|
MPI_Isend(&sendCount_Yz, 1,MPI_INT,rank_Yz(),sendtag+16,Communicator,&req1[16]);
|
||||||
MPI_Irecv(&recvCount_yZ, 1,MPI_INT,rank_yZ,recvtag+16,Communicator,&req2[16]);
|
MPI_Irecv(&recvCount_yZ, 1,MPI_INT,rank_yZ(),recvtag+16,Communicator,&req2[16]);
|
||||||
MPI_Isend(&sendCount_yZ, 1,MPI_INT,rank_yZ,sendtag+17,Communicator,&req1[17]);
|
MPI_Isend(&sendCount_yZ, 1,MPI_INT,rank_yZ(),sendtag+17,Communicator,&req1[17]);
|
||||||
MPI_Irecv(&recvCount_Yz, 1,MPI_INT,rank_Yz,recvtag+17,Communicator,&req2[17]);
|
MPI_Irecv(&recvCount_Yz, 1,MPI_INT,rank_Yz(),recvtag+17,Communicator,&req2[17]);
|
||||||
MPI_Waitall(18,req1,stat1);
|
MPI_Waitall(18,req1,stat1);
|
||||||
MPI_Waitall(18,req2,stat2);
|
MPI_Waitall(18,req2,stat2);
|
||||||
MPI_Barrier(Communicator);
|
MPI_Barrier(Communicator);
|
||||||
@ -374,42 +376,42 @@ void Domain::CommInit(MPI_Comm Communicator)
|
|||||||
recvList_YZ = new int [recvCount_YZ];
|
recvList_YZ = new int [recvCount_YZ];
|
||||||
recvList_XZ = new int [recvCount_XZ];
|
recvList_XZ = new int [recvCount_XZ];
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
MPI_Isend(sendList_x, sendCount_x,MPI_INT,rank_x,sendtag,Communicator,&req1[0]);
|
MPI_Isend(sendList_x, sendCount_x,MPI_INT,rank_x(),sendtag,Communicator,&req1[0]);
|
||||||
MPI_Irecv(recvList_X, recvCount_X,MPI_INT,rank_X,recvtag,Communicator,&req2[0]);
|
MPI_Irecv(recvList_X, recvCount_X,MPI_INT,rank_X(),recvtag,Communicator,&req2[0]);
|
||||||
MPI_Isend(sendList_X, sendCount_X,MPI_INT,rank_X,sendtag,Communicator,&req1[1]);
|
MPI_Isend(sendList_X, sendCount_X,MPI_INT,rank_X(),sendtag,Communicator,&req1[1]);
|
||||||
MPI_Irecv(recvList_x, recvCount_x,MPI_INT,rank_x,recvtag,Communicator,&req2[1]);
|
MPI_Irecv(recvList_x, recvCount_x,MPI_INT,rank_x(),recvtag,Communicator,&req2[1]);
|
||||||
MPI_Isend(sendList_y, sendCount_y,MPI_INT,rank_y,sendtag,Communicator,&req1[2]);
|
MPI_Isend(sendList_y, sendCount_y,MPI_INT,rank_y(),sendtag,Communicator,&req1[2]);
|
||||||
MPI_Irecv(recvList_Y, recvCount_Y,MPI_INT,rank_Y,recvtag,Communicator,&req2[2]);
|
MPI_Irecv(recvList_Y, recvCount_Y,MPI_INT,rank_Y(),recvtag,Communicator,&req2[2]);
|
||||||
MPI_Isend(sendList_Y, sendCount_Y,MPI_INT,rank_Y,sendtag,Communicator,&req1[3]);
|
MPI_Isend(sendList_Y, sendCount_Y,MPI_INT,rank_Y(),sendtag,Communicator,&req1[3]);
|
||||||
MPI_Irecv(recvList_y, recvCount_y,MPI_INT,rank_y,recvtag,Communicator,&req2[3]);
|
MPI_Irecv(recvList_y, recvCount_y,MPI_INT,rank_y(),recvtag,Communicator,&req2[3]);
|
||||||
MPI_Isend(sendList_z, sendCount_z,MPI_INT,rank_z,sendtag,Communicator,&req1[4]);
|
MPI_Isend(sendList_z, sendCount_z,MPI_INT,rank_z(),sendtag,Communicator,&req1[4]);
|
||||||
MPI_Irecv(recvList_Z, recvCount_Z,MPI_INT,rank_Z,recvtag,Communicator,&req2[4]);
|
MPI_Irecv(recvList_Z, recvCount_Z,MPI_INT,rank_Z(),recvtag,Communicator,&req2[4]);
|
||||||
MPI_Isend(sendList_Z, sendCount_Z,MPI_INT,rank_Z,sendtag,Communicator,&req1[5]);
|
MPI_Isend(sendList_Z, sendCount_Z,MPI_INT,rank_Z(),sendtag,Communicator,&req1[5]);
|
||||||
MPI_Irecv(recvList_z, recvCount_z,MPI_INT,rank_z,recvtag,Communicator,&req2[5]);
|
MPI_Irecv(recvList_z, recvCount_z,MPI_INT,rank_z(),recvtag,Communicator,&req2[5]);
|
||||||
MPI_Isend(sendList_xy, sendCount_xy,MPI_INT,rank_xy,sendtag,Communicator,&req1[6]);
|
MPI_Isend(sendList_xy, sendCount_xy,MPI_INT,rank_xy(),sendtag,Communicator,&req1[6]);
|
||||||
MPI_Irecv(recvList_XY, recvCount_XY,MPI_INT,rank_XY,recvtag,Communicator,&req2[6]);
|
MPI_Irecv(recvList_XY, recvCount_XY,MPI_INT,rank_XY(),recvtag,Communicator,&req2[6]);
|
||||||
MPI_Isend(sendList_XY, sendCount_XY,MPI_INT,rank_XY,sendtag,Communicator,&req1[7]);
|
MPI_Isend(sendList_XY, sendCount_XY,MPI_INT,rank_XY(),sendtag,Communicator,&req1[7]);
|
||||||
MPI_Irecv(recvList_xy, recvCount_xy,MPI_INT,rank_xy,recvtag,Communicator,&req2[7]);
|
MPI_Irecv(recvList_xy, recvCount_xy,MPI_INT,rank_xy(),recvtag,Communicator,&req2[7]);
|
||||||
MPI_Isend(sendList_Xy, sendCount_Xy,MPI_INT,rank_Xy,sendtag,Communicator,&req1[8]);
|
MPI_Isend(sendList_Xy, sendCount_Xy,MPI_INT,rank_Xy(),sendtag,Communicator,&req1[8]);
|
||||||
MPI_Irecv(recvList_xY, recvCount_xY,MPI_INT,rank_xY,recvtag,Communicator,&req2[8]);
|
MPI_Irecv(recvList_xY, recvCount_xY,MPI_INT,rank_xY(),recvtag,Communicator,&req2[8]);
|
||||||
MPI_Isend(sendList_xY, sendCount_xY,MPI_INT,rank_xY,sendtag,Communicator,&req1[9]);
|
MPI_Isend(sendList_xY, sendCount_xY,MPI_INT,rank_xY(),sendtag,Communicator,&req1[9]);
|
||||||
MPI_Irecv(recvList_Xy, recvCount_Xy,MPI_INT,rank_Xy,recvtag,Communicator,&req2[9]);
|
MPI_Irecv(recvList_Xy, recvCount_Xy,MPI_INT,rank_Xy(),recvtag,Communicator,&req2[9]);
|
||||||
MPI_Isend(sendList_xz, sendCount_xz,MPI_INT,rank_xz,sendtag,Communicator,&req1[10]);
|
MPI_Isend(sendList_xz, sendCount_xz,MPI_INT,rank_xz(),sendtag,Communicator,&req1[10]);
|
||||||
MPI_Irecv(recvList_XZ, recvCount_XZ,MPI_INT,rank_XZ,recvtag,Communicator,&req2[10]);
|
MPI_Irecv(recvList_XZ, recvCount_XZ,MPI_INT,rank_XZ(),recvtag,Communicator,&req2[10]);
|
||||||
MPI_Isend(sendList_XZ, sendCount_XZ,MPI_INT,rank_XZ,sendtag,Communicator,&req1[11]);
|
MPI_Isend(sendList_XZ, sendCount_XZ,MPI_INT,rank_XZ(),sendtag,Communicator,&req1[11]);
|
||||||
MPI_Irecv(recvList_xz, recvCount_xz,MPI_INT,rank_xz,recvtag,Communicator,&req2[11]);
|
MPI_Irecv(recvList_xz, recvCount_xz,MPI_INT,rank_xz(),recvtag,Communicator,&req2[11]);
|
||||||
MPI_Isend(sendList_Xz, sendCount_Xz,MPI_INT,rank_Xz,sendtag,Communicator,&req1[12]);
|
MPI_Isend(sendList_Xz, sendCount_Xz,MPI_INT,rank_Xz(),sendtag,Communicator,&req1[12]);
|
||||||
MPI_Irecv(recvList_xZ, recvCount_xZ,MPI_INT,rank_xZ,recvtag,Communicator,&req2[12]);
|
MPI_Irecv(recvList_xZ, recvCount_xZ,MPI_INT,rank_xZ(),recvtag,Communicator,&req2[12]);
|
||||||
MPI_Isend(sendList_xZ, sendCount_xZ,MPI_INT,rank_xZ,sendtag,Communicator,&req1[13]);
|
MPI_Isend(sendList_xZ, sendCount_xZ,MPI_INT,rank_xZ(),sendtag,Communicator,&req1[13]);
|
||||||
MPI_Irecv(recvList_Xz, recvCount_Xz,MPI_INT,rank_Xz,recvtag,Communicator,&req2[13]);
|
MPI_Irecv(recvList_Xz, recvCount_Xz,MPI_INT,rank_Xz(),recvtag,Communicator,&req2[13]);
|
||||||
MPI_Isend(sendList_yz, sendCount_yz,MPI_INT,rank_yz,sendtag,Communicator,&req1[14]);
|
MPI_Isend(sendList_yz, sendCount_yz,MPI_INT,rank_yz(),sendtag,Communicator,&req1[14]);
|
||||||
MPI_Irecv(recvList_YZ, recvCount_YZ,MPI_INT,rank_YZ,recvtag,Communicator,&req2[14]);
|
MPI_Irecv(recvList_YZ, recvCount_YZ,MPI_INT,rank_YZ(),recvtag,Communicator,&req2[14]);
|
||||||
MPI_Isend(sendList_YZ, sendCount_YZ,MPI_INT,rank_YZ,sendtag,Communicator,&req1[15]);
|
MPI_Isend(sendList_YZ, sendCount_YZ,MPI_INT,rank_YZ(),sendtag,Communicator,&req1[15]);
|
||||||
MPI_Irecv(recvList_yz, recvCount_yz,MPI_INT,rank_yz,recvtag,Communicator,&req2[15]);
|
MPI_Irecv(recvList_yz, recvCount_yz,MPI_INT,rank_yz(),recvtag,Communicator,&req2[15]);
|
||||||
MPI_Isend(sendList_Yz, sendCount_Yz,MPI_INT,rank_Yz,sendtag,Communicator,&req1[16]);
|
MPI_Isend(sendList_Yz, sendCount_Yz,MPI_INT,rank_Yz(),sendtag,Communicator,&req1[16]);
|
||||||
MPI_Irecv(recvList_yZ, recvCount_yZ,MPI_INT,rank_yZ,recvtag,Communicator,&req2[16]);
|
MPI_Irecv(recvList_yZ, recvCount_yZ,MPI_INT,rank_yZ(),recvtag,Communicator,&req2[16]);
|
||||||
MPI_Isend(sendList_yZ, sendCount_yZ,MPI_INT,rank_yZ,sendtag,Communicator,&req1[17]);
|
MPI_Isend(sendList_yZ, sendCount_yZ,MPI_INT,rank_yZ(),sendtag,Communicator,&req1[17]);
|
||||||
MPI_Irecv(recvList_Yz, recvCount_Yz,MPI_INT,rank_Yz,recvtag,Communicator,&req2[17]);
|
MPI_Irecv(recvList_Yz, recvCount_Yz,MPI_INT,rank_Yz(),recvtag,Communicator,&req2[17]);
|
||||||
MPI_Waitall(18,req1,stat1);
|
MPI_Waitall(18,req1,stat1);
|
||||||
MPI_Waitall(18,req2,stat2);
|
MPI_Waitall(18,req2,stat2);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
@ -508,7 +510,7 @@ void Domain::AssignComponentLabels(double *phase)
|
|||||||
vector <char> Label;
|
vector <char> Label;
|
||||||
vector <double> Affinity;
|
vector <double> Affinity;
|
||||||
// Read the labels
|
// Read the labels
|
||||||
if (rank==0){
|
if (rank()==0){
|
||||||
printf("Component labels:\n");
|
printf("Component labels:\n");
|
||||||
ifstream iFILE("ComponentLabels.csv");
|
ifstream iFILE("ComponentLabels.csv");
|
||||||
if (iFILE.good()){
|
if (iFILE.good()){
|
||||||
@ -544,7 +546,7 @@ void Domain::AssignComponentLabels(double *phase)
|
|||||||
|
|
||||||
// Broadcast the list
|
// Broadcast the list
|
||||||
MPI_Bcast(&NLABELS,1,MPI_INT,0,Comm);
|
MPI_Bcast(&NLABELS,1,MPI_INT,0,Comm);
|
||||||
//printf("rank=%i, NLABELS=%i \n ",rank,NLABELS);
|
//printf("rank=%i, NLABELS=%i \n ",rank(),NLABELS);
|
||||||
|
|
||||||
// Copy into contiguous buffers
|
// Copy into contiguous buffers
|
||||||
char *LabelList;
|
char *LabelList;
|
||||||
@ -552,11 +554,11 @@ void Domain::AssignComponentLabels(double *phase)
|
|||||||
LabelList=new char[NLABELS];
|
LabelList=new char[NLABELS];
|
||||||
AffinityList=new double[NLABELS];
|
AffinityList=new double[NLABELS];
|
||||||
|
|
||||||
if (rank==0){
|
if (rank()==0){
|
||||||
for (int idx=0; idx < NLABELS; idx++){
|
for (int idx=0; idx < NLABELS; idx++){
|
||||||
VALUE=Label[idx];
|
VALUE=Label[idx];
|
||||||
AFFINITY=Affinity[idx];
|
AFFINITY=Affinity[idx];
|
||||||
printf("rank=%i, idx=%i, value=%d, affinity=%f \n",rank,idx,VALUE,AFFINITY);
|
printf("rank=%i, idx=%i, value=%d, affinity=%f \n",rank(),idx,VALUE,AFFINITY);
|
||||||
LabelList[idx]=VALUE;
|
LabelList[idx]=VALUE;
|
||||||
AffinityList[idx]=AFFINITY;
|
AffinityList[idx]=AFFINITY;
|
||||||
}
|
}
|
||||||
@ -574,7 +576,7 @@ void Domain::AssignComponentLabels(double *phase)
|
|||||||
VALUE=id[n];
|
VALUE=id[n];
|
||||||
// Assign the affinity from the paired list
|
// Assign the affinity from the paired list
|
||||||
for (int idx=0; idx < NLABELS; idx++){
|
for (int idx=0; idx < NLABELS; idx++){
|
||||||
//printf("rank=%i, idx=%i, value=%i, %i, \n",rank,idx, VALUE,LabelList[idx]);
|
//printf("rank=%i, idx=%i, value=%i, %i, \n",rank(),idx, VALUE,LabelList[idx]);
|
||||||
if (VALUE == LabelList[idx]){
|
if (VALUE == LabelList[idx]){
|
||||||
AFFINITY=AffinityList[idx];
|
AFFINITY=AffinityList[idx];
|
||||||
idx = NLABELS;
|
idx = NLABELS;
|
||||||
@ -612,42 +614,42 @@ void Domain::CommunicateMeshHalo(DoubleArray &Mesh)
|
|||||||
PackMeshData(sendList_yZ, sendCount_yZ ,sendData_yZ, MeshData);
|
PackMeshData(sendList_yZ, sendCount_yZ ,sendData_yZ, MeshData);
|
||||||
PackMeshData(sendList_YZ, sendCount_YZ ,sendData_YZ, MeshData);
|
PackMeshData(sendList_YZ, sendCount_YZ ,sendData_YZ, MeshData);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
MPI_Sendrecv(sendData_x,sendCount_x,MPI_DOUBLE,rank_x,sendtag,
|
MPI_Sendrecv(sendData_x,sendCount_x,MPI_DOUBLE,rank_x(),sendtag,
|
||||||
recvData_X,recvCount_X,MPI_DOUBLE,rank_X,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_X,recvCount_X,MPI_DOUBLE,rank_X(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_X,sendCount_X,MPI_DOUBLE,rank_X,sendtag,
|
MPI_Sendrecv(sendData_X,sendCount_X,MPI_DOUBLE,rank_X(),sendtag,
|
||||||
recvData_x,recvCount_x,MPI_DOUBLE,rank_x,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_x,recvCount_x,MPI_DOUBLE,rank_x(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_y,sendCount_y,MPI_DOUBLE,rank_y,sendtag,
|
MPI_Sendrecv(sendData_y,sendCount_y,MPI_DOUBLE,rank_y(),sendtag,
|
||||||
recvData_Y,recvCount_Y,MPI_DOUBLE,rank_Y,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_Y,recvCount_Y,MPI_DOUBLE,rank_Y(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_Y,sendCount_Y,MPI_DOUBLE,rank_Y,sendtag,
|
MPI_Sendrecv(sendData_Y,sendCount_Y,MPI_DOUBLE,rank_Y(),sendtag,
|
||||||
recvData_y,recvCount_y,MPI_DOUBLE,rank_y,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_y,recvCount_y,MPI_DOUBLE,rank_y(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_z,sendCount_z,MPI_DOUBLE,rank_z,sendtag,
|
MPI_Sendrecv(sendData_z,sendCount_z,MPI_DOUBLE,rank_z(),sendtag,
|
||||||
recvData_Z,recvCount_Z,MPI_DOUBLE,rank_Z,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_Z,recvCount_Z,MPI_DOUBLE,rank_Z(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_Z,sendCount_Z,MPI_DOUBLE,rank_Z,sendtag,
|
MPI_Sendrecv(sendData_Z,sendCount_Z,MPI_DOUBLE,rank_Z(),sendtag,
|
||||||
recvData_z,recvCount_z,MPI_DOUBLE,rank_z,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_z,recvCount_z,MPI_DOUBLE,rank_z(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_xy,sendCount_xy,MPI_DOUBLE,rank_xy,sendtag,
|
MPI_Sendrecv(sendData_xy,sendCount_xy,MPI_DOUBLE,rank_xy(),sendtag,
|
||||||
recvData_XY,recvCount_XY,MPI_DOUBLE,rank_XY,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_XY,recvCount_XY,MPI_DOUBLE,rank_XY(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_XY,sendCount_XY,MPI_DOUBLE,rank_XY,sendtag,
|
MPI_Sendrecv(sendData_XY,sendCount_XY,MPI_DOUBLE,rank_XY(),sendtag,
|
||||||
recvData_xy,recvCount_xy,MPI_DOUBLE,rank_xy,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_xy,recvCount_xy,MPI_DOUBLE,rank_xy(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_Xy,sendCount_Xy,MPI_DOUBLE,rank_Xy,sendtag,
|
MPI_Sendrecv(sendData_Xy,sendCount_Xy,MPI_DOUBLE,rank_Xy(),sendtag,
|
||||||
recvData_xY,recvCount_xY,MPI_DOUBLE,rank_xY,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_xY,recvCount_xY,MPI_DOUBLE,rank_xY(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_xY,sendCount_xY,MPI_DOUBLE,rank_xY,sendtag,
|
MPI_Sendrecv(sendData_xY,sendCount_xY,MPI_DOUBLE,rank_xY(),sendtag,
|
||||||
recvData_Xy,recvCount_Xy,MPI_DOUBLE,rank_Xy,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_Xy,recvCount_Xy,MPI_DOUBLE,rank_Xy(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_xz,sendCount_xz,MPI_DOUBLE,rank_xz,sendtag,
|
MPI_Sendrecv(sendData_xz,sendCount_xz,MPI_DOUBLE,rank_xz(),sendtag,
|
||||||
recvData_XZ,recvCount_XZ,MPI_DOUBLE,rank_XZ,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_XZ,recvCount_XZ,MPI_DOUBLE,rank_XZ(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_XZ,sendCount_XZ,MPI_DOUBLE,rank_XZ,sendtag,
|
MPI_Sendrecv(sendData_XZ,sendCount_XZ,MPI_DOUBLE,rank_XZ(),sendtag,
|
||||||
recvData_xz,recvCount_xz,MPI_DOUBLE,rank_xz,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_xz,recvCount_xz,MPI_DOUBLE,rank_xz(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_Xz,sendCount_Xz,MPI_DOUBLE,rank_Xz,sendtag,
|
MPI_Sendrecv(sendData_Xz,sendCount_Xz,MPI_DOUBLE,rank_Xz(),sendtag,
|
||||||
recvData_xZ,recvCount_xZ,MPI_DOUBLE,rank_xZ,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_xZ,recvCount_xZ,MPI_DOUBLE,rank_xZ(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_xZ,sendCount_xZ,MPI_DOUBLE,rank_xZ,sendtag,
|
MPI_Sendrecv(sendData_xZ,sendCount_xZ,MPI_DOUBLE,rank_xZ(),sendtag,
|
||||||
recvData_Xz,recvCount_Xz,MPI_DOUBLE,rank_Xz,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_Xz,recvCount_Xz,MPI_DOUBLE,rank_Xz(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_yz,sendCount_yz,MPI_DOUBLE,rank_yz,sendtag,
|
MPI_Sendrecv(sendData_yz,sendCount_yz,MPI_DOUBLE,rank_yz(),sendtag,
|
||||||
recvData_YZ,recvCount_YZ,MPI_DOUBLE,rank_YZ,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_YZ,recvCount_YZ,MPI_DOUBLE,rank_YZ(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_YZ,sendCount_YZ,MPI_DOUBLE,rank_YZ,sendtag,
|
MPI_Sendrecv(sendData_YZ,sendCount_YZ,MPI_DOUBLE,rank_YZ(),sendtag,
|
||||||
recvData_yz,recvCount_yz,MPI_DOUBLE,rank_yz,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_yz,recvCount_yz,MPI_DOUBLE,rank_yz(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_Yz,sendCount_Yz,MPI_DOUBLE,rank_Yz,sendtag,
|
MPI_Sendrecv(sendData_Yz,sendCount_Yz,MPI_DOUBLE,rank_Yz(),sendtag,
|
||||||
recvData_yZ,recvCount_yZ,MPI_DOUBLE,rank_yZ,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_yZ,recvCount_yZ,MPI_DOUBLE,rank_yZ(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendData_yZ,sendCount_yZ,MPI_DOUBLE,rank_yZ,sendtag,
|
MPI_Sendrecv(sendData_yZ,sendCount_yZ,MPI_DOUBLE,rank_yZ(),sendtag,
|
||||||
recvData_Yz,recvCount_Yz,MPI_DOUBLE,rank_Yz,recvtag,Comm,MPI_STATUS_IGNORE);
|
recvData_Yz,recvCount_Yz,MPI_DOUBLE,rank_Yz(),recvtag,Comm,MPI_STATUS_IGNORE);
|
||||||
//........................................................................................
|
//........................................................................................
|
||||||
UnpackMeshData(recvList_x, recvCount_x ,recvData_x, MeshData);
|
UnpackMeshData(recvList_x, recvCount_x ,recvData_x, MeshData);
|
||||||
UnpackMeshData(recvList_X, recvCount_X ,recvData_X, MeshData);
|
UnpackMeshData(recvList_X, recvCount_X ,recvData_X, MeshData);
|
||||||
|
152
common/Domain.h
152
common/Domain.h
@ -64,7 +64,7 @@ private:
|
|||||||
class Domain{
|
class Domain{
|
||||||
public:
|
public:
|
||||||
//! Default constructor
|
//! Default constructor
|
||||||
Domain( std::shared_ptr<Database> db );
|
Domain( std::shared_ptr<Database> db );
|
||||||
|
|
||||||
//! Obsolete constructor
|
//! Obsolete constructor
|
||||||
Domain( int nx, int ny, int nz, int rnk, int npx, int npy, int npz,
|
Domain( int nx, int ny, int nz, int rnk, int npx, int npy, int npz,
|
||||||
@ -80,7 +80,7 @@ public:
|
|||||||
Domain& operator=( const Domain& ) = delete;
|
Domain& operator=( const Domain& ) = delete;
|
||||||
|
|
||||||
//! Destructor
|
//! Destructor
|
||||||
~Domain();
|
~Domain();
|
||||||
|
|
||||||
//! Get the database
|
//! Get the database
|
||||||
inline std::shared_ptr<const Database> getDatabase() const { return d_db; }
|
inline std::shared_ptr<const Database> getDatabase() const { return d_db; }
|
||||||
@ -108,91 +108,91 @@ private:
|
|||||||
public: // Public variables (need to create accessors instead)
|
public: // Public variables (need to create accessors instead)
|
||||||
|
|
||||||
double Lx,Ly,Lz,Volume;
|
double Lx,Ly,Lz,Volume;
|
||||||
int Nx,Ny,Nz,N;
|
int Nx,Ny,Nz,N;
|
||||||
RankInfoStruct rank_info;
|
RankInfoStruct rank_info;
|
||||||
|
|
||||||
MPI_Comm Comm; // MPI Communicator for this domain
|
MPI_Comm Comm; // MPI Communicator for this domain
|
||||||
|
|
||||||
int BoundaryCondition;
|
int BoundaryCondition;
|
||||||
|
|
||||||
MPI_Group Group; // Group of processors associated with this domain
|
MPI_Group Group; // Group of processors associated with this domain
|
||||||
|
|
||||||
//**********************************
|
//**********************************
|
||||||
// MPI ranks for all 18 neighbors
|
// MPI ranks for all 18 neighbors
|
||||||
//**********************************
|
//**********************************
|
||||||
const int& iproc = rank_info.ix;
|
inline int iproc() const { return rank_info.ix; }
|
||||||
const int& jproc = rank_info.jy;
|
inline int jproc() const { return rank_info.jy; }
|
||||||
const int& kproc = rank_info.kz;
|
inline int kproc() const { return rank_info.kz; }
|
||||||
const int& nprocx = rank_info.nx;
|
inline int nprocx() const { return rank_info.nx; }
|
||||||
const int& nprocy = rank_info.ny;
|
inline int nprocy() const { return rank_info.ny; }
|
||||||
const int& nprocz = rank_info.nz;
|
inline int nprocz() const { return rank_info.nz; }
|
||||||
const int& rank = rank_info.rank[1][1][1];
|
inline int rank() const { return rank_info.rank[1][1][1]; }
|
||||||
const int& rank_X = rank_info.rank[2][1][1];
|
inline int rank_X() const { return rank_info.rank[2][1][1]; }
|
||||||
const int& rank_x = rank_info.rank[0][1][1];
|
inline int rank_x() const { return rank_info.rank[0][1][1]; }
|
||||||
const int& rank_Y = rank_info.rank[1][2][1];
|
inline int rank_Y() const { return rank_info.rank[1][2][1]; }
|
||||||
const int& rank_y = rank_info.rank[1][0][1];
|
inline int rank_y() const { return rank_info.rank[1][0][1]; }
|
||||||
const int& rank_Z = rank_info.rank[1][1][2];
|
inline int rank_Z() const { return rank_info.rank[1][1][2]; }
|
||||||
const int& rank_z = rank_info.rank[1][1][0];
|
inline int rank_z() const { return rank_info.rank[1][1][0]; }
|
||||||
const int& rank_XY = rank_info.rank[2][2][1];
|
inline int rank_XY() const { return rank_info.rank[2][2][1]; }
|
||||||
const int& rank_xy = rank_info.rank[0][0][1];
|
inline int rank_xy() const { return rank_info.rank[0][0][1]; }
|
||||||
const int& rank_Xy = rank_info.rank[2][0][1];
|
inline int rank_Xy() const { return rank_info.rank[2][0][1]; }
|
||||||
const int& rank_xY = rank_info.rank[0][2][1];
|
inline int rank_xY() const { return rank_info.rank[0][2][1]; }
|
||||||
const int& rank_XZ = rank_info.rank[2][1][2];
|
inline int rank_XZ() const { return rank_info.rank[2][1][2]; }
|
||||||
const int& rank_xz = rank_info.rank[0][1][0];
|
inline int rank_xz() const { return rank_info.rank[0][1][0]; }
|
||||||
const int& rank_Xz = rank_info.rank[2][1][0];
|
inline int rank_Xz() const { return rank_info.rank[2][1][0]; }
|
||||||
const int& rank_xZ = rank_info.rank[0][1][2];
|
inline int rank_xZ() const { return rank_info.rank[0][1][2]; }
|
||||||
const int& rank_YZ = rank_info.rank[1][2][2];
|
inline int rank_YZ() const { return rank_info.rank[1][2][2]; }
|
||||||
const int& rank_yz = rank_info.rank[1][0][0];
|
inline int rank_yz() const { return rank_info.rank[1][0][0]; }
|
||||||
const int& rank_Yz = rank_info.rank[1][2][0];
|
inline int rank_Yz() const { return rank_info.rank[1][2][0]; }
|
||||||
const int& rank_yZ = rank_info.rank[1][0][2];
|
inline int rank_yZ() const { return rank_info.rank[1][0][2]; }
|
||||||
|
|
||||||
//**********************************
|
//**********************************
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
// Get the actual D3Q19 communication counts (based on location of solid phase)
|
// Get the actual D3Q19 communication counts (based on location of solid phase)
|
||||||
// Discrete velocity set symmetry implies the sendcount = recvcount
|
// Discrete velocity set symmetry implies the sendcount = recvcount
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
int sendCount_x, sendCount_y, sendCount_z, sendCount_X, sendCount_Y, sendCount_Z;
|
int sendCount_x, sendCount_y, sendCount_z, sendCount_X, sendCount_Y, sendCount_Z;
|
||||||
int sendCount_xy, sendCount_yz, sendCount_xz, sendCount_Xy, sendCount_Yz, sendCount_xZ;
|
int sendCount_xy, sendCount_yz, sendCount_xz, sendCount_Xy, sendCount_Yz, sendCount_xZ;
|
||||||
int sendCount_xY, sendCount_yZ, sendCount_Xz, sendCount_XY, sendCount_YZ, sendCount_XZ;
|
int sendCount_xY, sendCount_yZ, sendCount_Xz, sendCount_XY, sendCount_YZ, sendCount_XZ;
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
int *sendList_x, *sendList_y, *sendList_z, *sendList_X, *sendList_Y, *sendList_Z;
|
int *sendList_x, *sendList_y, *sendList_z, *sendList_X, *sendList_Y, *sendList_Z;
|
||||||
int *sendList_xy, *sendList_yz, *sendList_xz, *sendList_Xy, *sendList_Yz, *sendList_xZ;
|
int *sendList_xy, *sendList_yz, *sendList_xz, *sendList_Xy, *sendList_Yz, *sendList_xZ;
|
||||||
int *sendList_xY, *sendList_yZ, *sendList_Xz, *sendList_XY, *sendList_YZ, *sendList_XZ;
|
int *sendList_xY, *sendList_yZ, *sendList_Xz, *sendList_XY, *sendList_YZ, *sendList_XZ;
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
int recvCount_x, recvCount_y, recvCount_z, recvCount_X, recvCount_Y, recvCount_Z;
|
int recvCount_x, recvCount_y, recvCount_z, recvCount_X, recvCount_Y, recvCount_Z;
|
||||||
int recvCount_xy, recvCount_yz, recvCount_xz, recvCount_Xy, recvCount_Yz, recvCount_xZ;
|
int recvCount_xy, recvCount_yz, recvCount_xz, recvCount_Xy, recvCount_Yz, recvCount_xZ;
|
||||||
int recvCount_xY, recvCount_yZ, recvCount_Xz, recvCount_XY, recvCount_YZ, recvCount_XZ;
|
int recvCount_xY, recvCount_yZ, recvCount_Xz, recvCount_XY, recvCount_YZ, recvCount_XZ;
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
int *recvList_x, *recvList_y, *recvList_z, *recvList_X, *recvList_Y, *recvList_Z;
|
int *recvList_x, *recvList_y, *recvList_z, *recvList_X, *recvList_Y, *recvList_Z;
|
||||||
int *recvList_xy, *recvList_yz, *recvList_xz, *recvList_Xy, *recvList_Yz, *recvList_xZ;
|
int *recvList_xy, *recvList_yz, *recvList_xz, *recvList_Xy, *recvList_Yz, *recvList_xZ;
|
||||||
int *recvList_xY, *recvList_yZ, *recvList_Xz, *recvList_XY, *recvList_YZ, *recvList_XZ;
|
int *recvList_xY, *recvList_yZ, *recvList_Xz, *recvList_XY, *recvList_YZ, *recvList_XZ;
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
// Solid indicator function
|
// Solid indicator function
|
||||||
char *id;
|
char *id;
|
||||||
|
|
||||||
void CommunicateMeshHalo(DoubleArray &Mesh);
|
void CommunicateMeshHalo(DoubleArray &Mesh);
|
||||||
void AssignComponentLabels(double *phase);
|
void AssignComponentLabels(double *phase);
|
||||||
void CommInit(MPI_Comm comm);
|
void CommInit(MPI_Comm comm);
|
||||||
void TestCommInit(MPI_Comm comm);
|
void TestCommInit(MPI_Comm comm);
|
||||||
|
|
||||||
//void MemoryOptimizedLayout(IntArray &Map, int *neighborList, int Np);
|
//void MemoryOptimizedLayout(IntArray &Map, int *neighborList, int Np);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int *sendBuf_x, *sendBuf_y, *sendBuf_z, *sendBuf_X, *sendBuf_Y, *sendBuf_Z;
|
int *sendBuf_x, *sendBuf_y, *sendBuf_z, *sendBuf_X, *sendBuf_Y, *sendBuf_Z;
|
||||||
int *sendBuf_xy, *sendBuf_yz, *sendBuf_xz, *sendBuf_Xy, *sendBuf_Yz, *sendBuf_xZ;
|
int *sendBuf_xy, *sendBuf_yz, *sendBuf_xz, *sendBuf_Xy, *sendBuf_Yz, *sendBuf_xZ;
|
||||||
int *sendBuf_xY, *sendBuf_yZ, *sendBuf_Xz, *sendBuf_XY, *sendBuf_YZ, *sendBuf_XZ;
|
int *sendBuf_xY, *sendBuf_yZ, *sendBuf_Xz, *sendBuf_XY, *sendBuf_YZ, *sendBuf_XZ;
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
int *recvBuf_x, *recvBuf_y, *recvBuf_z, *recvBuf_X, *recvBuf_Y, *recvBuf_Z;
|
int *recvBuf_x, *recvBuf_y, *recvBuf_z, *recvBuf_X, *recvBuf_Y, *recvBuf_Z;
|
||||||
int *recvBuf_xy, *recvBuf_yz, *recvBuf_xz, *recvBuf_Xy, *recvBuf_Yz, *recvBuf_xZ;
|
int *recvBuf_xy, *recvBuf_yz, *recvBuf_xz, *recvBuf_Xy, *recvBuf_Yz, *recvBuf_xZ;
|
||||||
int *recvBuf_xY, *recvBuf_yZ, *recvBuf_Xz, *recvBuf_XY, *recvBuf_YZ, *recvBuf_XZ;
|
int *recvBuf_xY, *recvBuf_yZ, *recvBuf_Xz, *recvBuf_XY, *recvBuf_YZ, *recvBuf_XZ;
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
double *sendData_x, *sendData_y, *sendData_z, *sendData_X, *sendData_Y, *sendData_Z;
|
double *sendData_x, *sendData_y, *sendData_z, *sendData_X, *sendData_Y, *sendData_Z;
|
||||||
double *sendData_xy, *sendData_yz, *sendData_xz, *sendData_Xy, *sendData_Yz, *sendData_xZ;
|
double *sendData_xy, *sendData_yz, *sendData_xz, *sendData_Xy, *sendData_Yz, *sendData_xZ;
|
||||||
double *sendData_xY, *sendData_yZ, *sendData_Xz, *sendData_XY, *sendData_YZ, *sendData_XZ;
|
double *sendData_xY, *sendData_yZ, *sendData_Xz, *sendData_XY, *sendData_YZ, *sendData_XZ;
|
||||||
double *recvData_x, *recvData_y, *recvData_z, *recvData_X, *recvData_Y, *recvData_Z;
|
double *recvData_x, *recvData_y, *recvData_z, *recvData_X, *recvData_Y, *recvData_Z;
|
||||||
double *recvData_xy, *recvData_yz, *recvData_xz, *recvData_Xy, *recvData_Yz, *recvData_xZ;
|
double *recvData_xy, *recvData_yz, *recvData_xz, *recvData_Xy, *recvData_Yz, *recvData_xZ;
|
||||||
double *recvData_xY, *recvData_yZ, *recvData_Xz, *recvData_XY, *recvData_YZ, *recvData_XZ;
|
double *recvData_xY, *recvData_yZ, *recvData_Xz, *recvData_XY, *recvData_YZ, *recvData_XZ;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,25 +15,25 @@ ScaLBL_Communicator::ScaLBL_Communicator(Domain &Dm){
|
|||||||
Nz = Dm.Nz;
|
Nz = Dm.Nz;
|
||||||
N = Nx*Ny*Nz;
|
N = Nx*Ny*Nz;
|
||||||
next=0;
|
next=0;
|
||||||
rank=Dm.rank;
|
rank=Dm.rank();
|
||||||
rank_x=Dm.rank_x;
|
rank_x=Dm.rank_x();
|
||||||
rank_y=Dm.rank_y;
|
rank_y=Dm.rank_y();
|
||||||
rank_z=Dm.rank_z;
|
rank_z=Dm.rank_z();
|
||||||
rank_X=Dm.rank_X;
|
rank_X=Dm.rank_X();
|
||||||
rank_Y=Dm.rank_Y;
|
rank_Y=Dm.rank_Y();
|
||||||
rank_Z=Dm.rank_Z;
|
rank_Z=Dm.rank_Z();
|
||||||
rank_xy=Dm.rank_xy;
|
rank_xy=Dm.rank_xy();
|
||||||
rank_XY=Dm.rank_XY;
|
rank_XY=Dm.rank_XY();
|
||||||
rank_xY=Dm.rank_xY;
|
rank_xY=Dm.rank_xY();
|
||||||
rank_Xy=Dm.rank_Xy;
|
rank_Xy=Dm.rank_Xy();
|
||||||
rank_xz=Dm.rank_xz;
|
rank_xz=Dm.rank_xz();
|
||||||
rank_XZ=Dm.rank_XZ;
|
rank_XZ=Dm.rank_XZ();
|
||||||
rank_xZ=Dm.rank_xZ;
|
rank_xZ=Dm.rank_xZ();
|
||||||
rank_Xz=Dm.rank_Xz;
|
rank_Xz=Dm.rank_Xz();
|
||||||
rank_yz=Dm.rank_yz;
|
rank_yz=Dm.rank_yz();
|
||||||
rank_YZ=Dm.rank_YZ;
|
rank_YZ=Dm.rank_YZ();
|
||||||
rank_yZ=Dm.rank_yZ;
|
rank_yZ=Dm.rank_yZ();
|
||||||
rank_Yz=Dm.rank_Yz;
|
rank_Yz=Dm.rank_Yz();
|
||||||
sendCount_x=Dm.sendCount_x;
|
sendCount_x=Dm.sendCount_x;
|
||||||
sendCount_y=Dm.sendCount_y;
|
sendCount_y=Dm.sendCount_y;
|
||||||
sendCount_z=Dm.sendCount_z;
|
sendCount_z=Dm.sendCount_z;
|
||||||
@ -71,12 +71,12 @@ ScaLBL_Communicator::ScaLBL_Communicator(Domain &Dm){
|
|||||||
recvCount_YZ=Dm.recvCount_YZ;
|
recvCount_YZ=Dm.recvCount_YZ;
|
||||||
recvCount_XZ=Dm.recvCount_XZ;
|
recvCount_XZ=Dm.recvCount_XZ;
|
||||||
|
|
||||||
iproc = Dm.iproc;
|
iproc = Dm.iproc();
|
||||||
jproc = Dm.jproc;
|
jproc = Dm.jproc();
|
||||||
kproc = Dm.kproc;
|
kproc = Dm.kproc();
|
||||||
nprocx = Dm.nprocx;
|
nprocx = Dm.nprocx();
|
||||||
nprocy = Dm.nprocy;
|
nprocy = Dm.nprocy();
|
||||||
nprocz = Dm.nprocz;
|
nprocz = Dm.nprocz();
|
||||||
BoundaryCondition = Dm.BoundaryCondition;
|
BoundaryCondition = Dm.BoundaryCondition;
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
|
|
||||||
|
@ -46,17 +46,14 @@ inline void UnpackID(int *list, int count, char *recvbuf, char *ID){
|
|||||||
|
|
||||||
inline void MorphOpen(DoubleArray SignDist, char *id, Domain &Dm, int nx, int ny, int nz, int rank, double SW){
|
inline void MorphOpen(DoubleArray SignDist, char *id, Domain &Dm, int nx, int ny, int nz, int rank, double SW){
|
||||||
|
|
||||||
int iproc = Dm.iproc;
|
|
||||||
int jproc = Dm.jproc;
|
|
||||||
int kproc = Dm.kproc;
|
|
||||||
int i,j,k,n;
|
int i,j,k,n;
|
||||||
int nprocx=Dm.nprocx;
|
|
||||||
int nprocy=Dm.nprocy;
|
|
||||||
int nprocz=Dm.nprocz;
|
|
||||||
double count,countGlobal,totalGlobal;
|
double count,countGlobal,totalGlobal;
|
||||||
count = 0.f;
|
count = 0.f;
|
||||||
double maxdist=0.f;
|
double maxdist=0.f;
|
||||||
double maxdistGlobal;
|
double maxdistGlobal;
|
||||||
|
int nprocx=Dm.nprocx();
|
||||||
|
int nprocy=Dm.nprocy();
|
||||||
|
int nprocz=Dm.nprocz();
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
@ -136,7 +133,6 @@ inline void MorphOpen(DoubleArray SignDist, char *id, Domain &Dm, int nx, int ny
|
|||||||
int sendtag,recvtag;
|
int sendtag,recvtag;
|
||||||
sendtag = recvtag = 7;
|
sendtag = recvtag = 7;
|
||||||
|
|
||||||
int x,y,z;
|
|
||||||
int ii,jj,kk;
|
int ii,jj,kk;
|
||||||
int Nx = nx;
|
int Nx = nx;
|
||||||
int Ny = ny;
|
int Ny = ny;
|
||||||
@ -218,42 +214,42 @@ inline void MorphOpen(DoubleArray SignDist, char *id, Domain &Dm, int nx, int ny
|
|||||||
PackID(Dm.sendList_yZ, Dm.sendCount_yZ ,sendID_yZ, id);
|
PackID(Dm.sendList_yZ, Dm.sendCount_yZ ,sendID_yZ, id);
|
||||||
PackID(Dm.sendList_YZ, Dm.sendCount_YZ ,sendID_YZ, id);
|
PackID(Dm.sendList_YZ, Dm.sendCount_YZ ,sendID_YZ, id);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
MPI_Sendrecv(sendID_x,Dm.sendCount_x,MPI_CHAR,Dm.rank_x,sendtag,
|
MPI_Sendrecv(sendID_x,Dm.sendCount_x,MPI_CHAR,Dm.rank_x(),sendtag,
|
||||||
recvID_X,Dm.recvCount_X,MPI_CHAR,Dm.rank_X,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_X,Dm.recvCount_X,MPI_CHAR,Dm.rank_X(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_X,Dm.sendCount_X,MPI_CHAR,Dm.rank_X,sendtag,
|
MPI_Sendrecv(sendID_X,Dm.sendCount_X,MPI_CHAR,Dm.rank_X(),sendtag,
|
||||||
recvID_x,Dm.recvCount_x,MPI_CHAR,Dm.rank_x,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_x,Dm.recvCount_x,MPI_CHAR,Dm.rank_x(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_y,Dm.sendCount_y,MPI_CHAR,Dm.rank_y,sendtag,
|
MPI_Sendrecv(sendID_y,Dm.sendCount_y,MPI_CHAR,Dm.rank_y(),sendtag,
|
||||||
recvID_Y,Dm.recvCount_Y,MPI_CHAR,Dm.rank_Y,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_Y,Dm.recvCount_Y,MPI_CHAR,Dm.rank_Y(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Y,Dm.sendCount_Y,MPI_CHAR,Dm.rank_Y,sendtag,
|
MPI_Sendrecv(sendID_Y,Dm.sendCount_Y,MPI_CHAR,Dm.rank_Y(),sendtag,
|
||||||
recvID_y,Dm.recvCount_y,MPI_CHAR,Dm.rank_y,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_y,Dm.recvCount_y,MPI_CHAR,Dm.rank_y(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_z,Dm.sendCount_z,MPI_CHAR,Dm.rank_z,sendtag,
|
MPI_Sendrecv(sendID_z,Dm.sendCount_z,MPI_CHAR,Dm.rank_z(),sendtag,
|
||||||
recvID_Z,Dm.recvCount_Z,MPI_CHAR,Dm.rank_Z,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_Z,Dm.recvCount_Z,MPI_CHAR,Dm.rank_Z(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Z,Dm.sendCount_Z,MPI_CHAR,Dm.rank_Z,sendtag,
|
MPI_Sendrecv(sendID_Z,Dm.sendCount_Z,MPI_CHAR,Dm.rank_Z(),sendtag,
|
||||||
recvID_z,Dm.recvCount_z,MPI_CHAR,Dm.rank_z,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_z,Dm.recvCount_z,MPI_CHAR,Dm.rank_z(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xy,Dm.sendCount_xy,MPI_CHAR,Dm.rank_xy,sendtag,
|
MPI_Sendrecv(sendID_xy,Dm.sendCount_xy,MPI_CHAR,Dm.rank_xy(),sendtag,
|
||||||
recvID_XY,Dm.recvCount_XY,MPI_CHAR,Dm.rank_XY,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_XY,Dm.recvCount_XY,MPI_CHAR,Dm.rank_XY(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_XY,Dm.sendCount_XY,MPI_CHAR,Dm.rank_XY,sendtag,
|
MPI_Sendrecv(sendID_XY,Dm.sendCount_XY,MPI_CHAR,Dm.rank_XY(),sendtag,
|
||||||
recvID_xy,Dm.recvCount_xy,MPI_CHAR,Dm.rank_xy,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_xy,Dm.recvCount_xy,MPI_CHAR,Dm.rank_xy(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Xy,Dm.sendCount_Xy,MPI_CHAR,Dm.rank_Xy,sendtag,
|
MPI_Sendrecv(sendID_Xy,Dm.sendCount_Xy,MPI_CHAR,Dm.rank_Xy(),sendtag,
|
||||||
recvID_xY,Dm.recvCount_xY,MPI_CHAR,Dm.rank_xY,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_xY,Dm.recvCount_xY,MPI_CHAR,Dm.rank_xY(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xY,Dm.sendCount_xY,MPI_CHAR,Dm.rank_xY,sendtag,
|
MPI_Sendrecv(sendID_xY,Dm.sendCount_xY,MPI_CHAR,Dm.rank_xY(),sendtag,
|
||||||
recvID_Xy,Dm.recvCount_Xy,MPI_CHAR,Dm.rank_Xy,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_Xy,Dm.recvCount_Xy,MPI_CHAR,Dm.rank_Xy(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xz,Dm.sendCount_xz,MPI_CHAR,Dm.rank_xz,sendtag,
|
MPI_Sendrecv(sendID_xz,Dm.sendCount_xz,MPI_CHAR,Dm.rank_xz(),sendtag,
|
||||||
recvID_XZ,Dm.recvCount_XZ,MPI_CHAR,Dm.rank_XZ,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_XZ,Dm.recvCount_XZ,MPI_CHAR,Dm.rank_XZ(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_XZ,Dm.sendCount_XZ,MPI_CHAR,Dm.rank_XZ,sendtag,
|
MPI_Sendrecv(sendID_XZ,Dm.sendCount_XZ,MPI_CHAR,Dm.rank_XZ(),sendtag,
|
||||||
recvID_xz,Dm.recvCount_xz,MPI_CHAR,Dm.rank_xz,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_xz,Dm.recvCount_xz,MPI_CHAR,Dm.rank_xz(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Xz,Dm.sendCount_Xz,MPI_CHAR,Dm.rank_Xz,sendtag,
|
MPI_Sendrecv(sendID_Xz,Dm.sendCount_Xz,MPI_CHAR,Dm.rank_Xz(),sendtag,
|
||||||
recvID_xZ,Dm.recvCount_xZ,MPI_CHAR,Dm.rank_xZ,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_xZ,Dm.recvCount_xZ,MPI_CHAR,Dm.rank_xZ(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xZ,Dm.sendCount_xZ,MPI_CHAR,Dm.rank_xZ,sendtag,
|
MPI_Sendrecv(sendID_xZ,Dm.sendCount_xZ,MPI_CHAR,Dm.rank_xZ(),sendtag,
|
||||||
recvID_Xz,Dm.recvCount_Xz,MPI_CHAR,Dm.rank_Xz,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_Xz,Dm.recvCount_Xz,MPI_CHAR,Dm.rank_Xz(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_yz,Dm.sendCount_yz,MPI_CHAR,Dm.rank_yz,sendtag,
|
MPI_Sendrecv(sendID_yz,Dm.sendCount_yz,MPI_CHAR,Dm.rank_yz(),sendtag,
|
||||||
recvID_YZ,Dm.recvCount_YZ,MPI_CHAR,Dm.rank_YZ,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_YZ,Dm.recvCount_YZ,MPI_CHAR,Dm.rank_YZ(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_YZ,Dm.sendCount_YZ,MPI_CHAR,Dm.rank_YZ,sendtag,
|
MPI_Sendrecv(sendID_YZ,Dm.sendCount_YZ,MPI_CHAR,Dm.rank_YZ(),sendtag,
|
||||||
recvID_yz,Dm.recvCount_yz,MPI_CHAR,Dm.rank_yz,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_yz,Dm.recvCount_yz,MPI_CHAR,Dm.rank_yz(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Yz,Dm.sendCount_Yz,MPI_CHAR,Dm.rank_Yz,sendtag,
|
MPI_Sendrecv(sendID_Yz,Dm.sendCount_Yz,MPI_CHAR,Dm.rank_Yz(),sendtag,
|
||||||
recvID_yZ,Dm.recvCount_yZ,MPI_CHAR,Dm.rank_yZ,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_yZ,Dm.recvCount_yZ,MPI_CHAR,Dm.rank_yZ(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_yZ,Dm.sendCount_yZ,MPI_CHAR,Dm.rank_yZ,sendtag,
|
MPI_Sendrecv(sendID_yZ,Dm.sendCount_yZ,MPI_CHAR,Dm.rank_yZ(),sendtag,
|
||||||
recvID_Yz,Dm.recvCount_Yz,MPI_CHAR,Dm.rank_Yz,recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
recvID_Yz,Dm.recvCount_Yz,MPI_CHAR,Dm.rank_Yz(),recvtag,Dm.Comm,MPI_STATUS_IGNORE);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
UnpackID(Dm.recvList_x, Dm.recvCount_x ,recvID_x, id);
|
UnpackID(Dm.recvList_x, Dm.recvCount_x ,recvID_x, id);
|
||||||
UnpackID(Dm.recvList_X, Dm.recvCount_X ,recvID_X, id);
|
UnpackID(Dm.recvList_X, Dm.recvCount_X ,recvID_X, id);
|
||||||
@ -331,7 +327,6 @@ int main(int argc, char **argv)
|
|||||||
// parallel domain size (# of sub-domains)
|
// parallel domain size (# of sub-domains)
|
||||||
int nprocx,nprocy,nprocz;
|
int nprocx,nprocy,nprocz;
|
||||||
int iproc,jproc,kproc;
|
int iproc,jproc,kproc;
|
||||||
int sendtag,recvtag;
|
|
||||||
//*****************************************
|
//*****************************************
|
||||||
// MPI ranks for all 18 neighbors
|
// MPI ranks for all 18 neighbors
|
||||||
//**********************************
|
//**********************************
|
||||||
@ -340,8 +335,6 @@ int main(int argc, char **argv)
|
|||||||
int rank_xz,rank_XZ,rank_xZ,rank_Xz;
|
int rank_xz,rank_XZ,rank_xZ,rank_Xz;
|
||||||
int rank_yz,rank_YZ,rank_yZ,rank_Yz;
|
int rank_yz,rank_YZ,rank_yZ,rank_Yz;
|
||||||
//**********************************
|
//**********************************
|
||||||
MPI_Request req1[18],req2[18];
|
|
||||||
MPI_Status stat1[18],stat2[18];
|
|
||||||
|
|
||||||
if (rank == 0){
|
if (rank == 0){
|
||||||
printf("********************************************************\n");
|
printf("********************************************************\n");
|
||||||
@ -351,7 +344,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// Variables that specify the computational domain
|
// Variables that specify the computational domain
|
||||||
string FILENAME;
|
string FILENAME;
|
||||||
unsigned int nBlocks, nthreads;
|
|
||||||
int Nx,Ny,Nz; // local sub-domain size
|
int Nx,Ny,Nz; // local sub-domain size
|
||||||
int nspheres; // number of spheres in the packing
|
int nspheres; // number of spheres in the packing
|
||||||
double Lx,Ly,Lz; // Domain length
|
double Lx,Ly,Lz; // Domain length
|
||||||
|
@ -219,7 +219,7 @@ int main(int argc, char **argv)
|
|||||||
Domain Dm(nx,ny,nz,rank,nprocx,nprocy,nprocz,Lx,Ly,Lz,BC);
|
Domain Dm(nx,ny,nz,rank,nprocx,nprocy,nprocz,Lx,Ly,Lz,BC);
|
||||||
// const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz);
|
// const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz);
|
||||||
TwoPhase Averages(Dm);
|
TwoPhase Averages(Dm);
|
||||||
int N = (nx+2)*(ny+2)*(nz+2);
|
|
||||||
Nx = nx+2;
|
Nx = nx+2;
|
||||||
Ny = ny+2;
|
Ny = ny+2;
|
||||||
Nz = nz+2;
|
Nz = nz+2;
|
||||||
@ -264,7 +264,7 @@ int main(int argc, char **argv)
|
|||||||
MPI_Barrier(comm);
|
MPI_Barrier(comm);
|
||||||
//.......................................................................
|
//.......................................................................
|
||||||
SignedDistance(Averages.Phase.data(),nspheres,cx,cy,cz,rad,Lx,Ly,Lz,Nx,Ny,Nz,
|
SignedDistance(Averages.Phase.data(),nspheres,cx,cy,cz,rad,Lx,Ly,Lz,Nx,Ny,Nz,
|
||||||
Dm.iproc,Dm.jproc,Dm.kproc,Dm.nprocx,Dm.nprocy,Dm.nprocz);
|
Dm.iproc(),Dm.jproc(),Dm.kproc(),Dm.nprocx(),Dm.nprocy(),Dm.nprocz());
|
||||||
//.......................................................................
|
//.......................................................................
|
||||||
// Assign the phase ID field based on the signed distance
|
// Assign the phase ID field based on the signed distance
|
||||||
//.......................................................................
|
//.......................................................................
|
||||||
@ -294,8 +294,6 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double beta = 0.95;
|
|
||||||
if (rank==0) printf("initializing the system \n");
|
if (rank==0) printf("initializing the system \n");
|
||||||
|
|
||||||
Averages.UpdateSolid();
|
Averages.UpdateSolid();
|
||||||
|
@ -317,9 +317,9 @@ int main(int argc, char **argv)
|
|||||||
for (j=0;j<Ny;j++){
|
for (j=0;j<Ny;j++){
|
||||||
for (i=0;i<Nx;i++){
|
for (i=0;i<Nx;i++){
|
||||||
n = k*Nx*Ny + j*Nz + i;
|
n = k*Nx*Ny + j*Nz + i;
|
||||||
int iglobal= i+(Nx-2)*Dm.iproc;
|
int iglobal= i+(Nx-2)*Dm.iproc();
|
||||||
int jglobal= j+(Ny-2)*Dm.jproc;
|
int jglobal= j+(Ny-2)*Dm.jproc();
|
||||||
int kglobal= k+(Nz-2)*Dm.kproc;
|
int kglobal= k+(Nz-2)*Dm.kproc();
|
||||||
// Initialize phase position field for parallel bubble test
|
// Initialize phase position field for parallel bubble test
|
||||||
if ((iglobal-0.5*(Nx-2)*nprocx)*(iglobal-0.5*(Nx-2)*nprocx)
|
if ((iglobal-0.5*(Nx-2)*nprocx)*(iglobal-0.5*(Nx-2)*nprocx)
|
||||||
+(jglobal-0.5*(Ny-2)*nprocy)*(jglobal-0.5*(Ny-2)*nprocy)
|
+(jglobal-0.5*(Ny-2)*nprocy)*(jglobal-0.5*(Ny-2)*nprocy)
|
||||||
|
@ -257,7 +257,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("rank=%i, %i,%i,%i \n",rank,Dm.iproc,Dm.jproc,Dm.jproc);
|
printf("rank=%i, %i,%i,%i \n",rank,Dm.iproc(),Dm.jproc(),Dm.jproc());
|
||||||
// Initialize a bubble
|
// Initialize a bubble
|
||||||
int BubbleRadius=Nx/3;
|
int BubbleRadius=Nx/3;
|
||||||
int center_x = (Nx-2)*nprocx/2;
|
int center_x = (Nx-2)*nprocx/2;
|
||||||
@ -268,9 +268,9 @@ int main(int argc, char **argv)
|
|||||||
for (j=1;j<Ny-1;j++){
|
for (j=1;j<Ny-1;j++){
|
||||||
for (i=1;i<Nx-1;i++){
|
for (i=1;i<Nx-1;i++){
|
||||||
n = k*Nx*Ny + j*Nx + i;
|
n = k*Nx*Ny + j*Nx + i;
|
||||||
int iglobal= i+(Nx-2)*Dm.iproc;
|
int iglobal= i+(Nx-2)*Dm.iproc();
|
||||||
int jglobal= j+(Ny-2)*Dm.jproc;
|
int jglobal= j+(Ny-2)*Dm.jproc();
|
||||||
int kglobal= k+(Nz-2)*Dm.kproc;
|
int kglobal= k+(Nz-2)*Dm.kproc();
|
||||||
|
|
||||||
// Initialize phase position field for parallel bubble test
|
// Initialize phase position field for parallel bubble test
|
||||||
if ((iglobal-center_x)*(iglobal-center_x)
|
if ((iglobal-center_x)*(iglobal-center_x)
|
||||||
|
@ -277,12 +277,12 @@ int main(int argc, char **argv)
|
|||||||
if (rank==0) printf ("Initializing distributions \n");
|
if (rank==0) printf ("Initializing distributions \n");
|
||||||
// Initialize the phase field and variables
|
// Initialize the phase field and variables
|
||||||
ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm.last_interior, Np);
|
ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm.last_interior, Np);
|
||||||
if (Dm.kproc==0){
|
if (Dm.kproc()==0){
|
||||||
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0);
|
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0);
|
||||||
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1);
|
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1);
|
||||||
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,2);
|
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,2);
|
||||||
}
|
}
|
||||||
if (Dm.kproc == nprocz-1){
|
if (Dm.kproc() == nprocz-1){
|
||||||
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-1);
|
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-1);
|
||||||
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-2);
|
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-2);
|
||||||
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-3);
|
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-3);
|
||||||
|
@ -47,14 +47,11 @@ int main(int argc, char **argv)
|
|||||||
double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA);
|
double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA);
|
||||||
Fx = 0; Fy = 0;
|
Fx = 0; Fy = 0;
|
||||||
Fz = 1e-3; //1.f; // 1e-3;
|
Fz = 1e-3; //1.f; // 1e-3;
|
||||||
|
// Load inputs
|
||||||
|
if (rank==0) printf("Loading input database \n");
|
||||||
auto FILENAME = argv[1];
|
auto FILENAME = argv[1];
|
||||||
auto db = std::make_shared<Database>( FILENAME );
|
auto db = std::make_shared<Database>( FILENAME );
|
||||||
auto domain_db = db->getDatabase( "Domain" );
|
auto domain_db = db->getDatabase( "Domain" );
|
||||||
// Load inputs
|
|
||||||
if (rank==0) printf("Loading input database \n");
|
|
||||||
auto db = std::make_shared<Database>(FILENAME);
|
|
||||||
auto domain_db= db-> getDatabase("Domain");
|
|
||||||
int Nx = domain_db->getVector<int>( "n" )[0];
|
int Nx = domain_db->getVector<int>( "n" )[0];
|
||||||
int Ny = domain_db->getVector<int>( "n" )[1];
|
int Ny = domain_db->getVector<int>( "n" )[1];
|
||||||
int Nz = domain_db->getVector<int>( "n" )[2];
|
int Nz = domain_db->getVector<int>( "n" )[2];
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "common/Array.h"
|
#include "common/Array.h"
|
||||||
#include "common/Domain.h"
|
#include "common/Domain.h"
|
||||||
#include "analysis/eikonal.h"
|
#include "analysis/eikonal.h"
|
||||||
|
#include "IO/Writer.h"
|
||||||
|
|
||||||
|
|
||||||
std::shared_ptr<Database> loadInputs( int nprocs )
|
std::shared_ptr<Database> loadInputs( int nprocs )
|
||||||
@ -37,9 +38,6 @@ int main(int argc, char **argv)
|
|||||||
MPI_Comm_rank(comm,&rank);
|
MPI_Comm_rank(comm,&rank);
|
||||||
MPI_Comm_size(comm,&nprocs);
|
MPI_Comm_size(comm,&nprocs);
|
||||||
{
|
{
|
||||||
int i,j,k,n,nn;
|
|
||||||
int iproc,jproc,kproc;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Load inputs
|
// Load inputs
|
||||||
@ -47,17 +45,14 @@ int main(int argc, char **argv)
|
|||||||
int Nx = db->getVector<int>( "n" )[0];
|
int Nx = db->getVector<int>( "n" )[0];
|
||||||
int Ny = db->getVector<int>( "n" )[1];
|
int Ny = db->getVector<int>( "n" )[1];
|
||||||
int Nz = db->getVector<int>( "n" )[2];
|
int Nz = db->getVector<int>( "n" )[2];
|
||||||
int nprocx = db->getVector<int>( "nproc" )[0];
|
|
||||||
int nprocy = db->getVector<int>( "nproc" )[1];
|
|
||||||
int nprocz = db->getVector<int>( "nproc" )[2];
|
|
||||||
|
|
||||||
|
|
||||||
// Get the rank info
|
// Get the rank info
|
||||||
Domain Dm(db);
|
Domain Dm(db);
|
||||||
for (k=0;k<Nz;k++){
|
for (int k=0;k<Nz;k++){
|
||||||
for (j=0;j<Ny;j++){
|
for (int j=0;j<Ny;j++){
|
||||||
for (i=0;i<Nx;i++){
|
for (int i=0;i<Nx;i++){
|
||||||
n = k*Nx*Ny+j*Nx+i;
|
int n = k*Nx*Ny+j*Nx+i;
|
||||||
Dm.id[n] = 1;
|
Dm.id[n] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,40 +62,34 @@ int main(int argc, char **argv)
|
|||||||
int nx = Nx+2;
|
int nx = Nx+2;
|
||||||
int ny = Ny+2;
|
int ny = Ny+2;
|
||||||
int nz = Nz+2;
|
int nz = Nz+2;
|
||||||
int N = nx*ny*nz;
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
char *id;
|
|
||||||
id = new char [N];
|
|
||||||
double BubbleRadius = 25;
|
double BubbleRadius = 25;
|
||||||
// Initialize the bubble
|
|
||||||
double x,y,z , Cx,Cy,Cz;
|
|
||||||
|
|
||||||
Cx = 1.0*nx;
|
// Initialize the bubble
|
||||||
Cy = 1.0*ny;
|
double Cx = 1.0*nx;
|
||||||
Cz = 1.0*nz;
|
double Cy = 1.0*ny;
|
||||||
|
double Cz = 1.0*nz;
|
||||||
|
|
||||||
DoubleArray Distance(nx,ny,nz);
|
DoubleArray Distance(nx,ny,nz);
|
||||||
DoubleArray TrueDist(nx,ny,nz);
|
DoubleArray TrueDist(nx,ny,nz);
|
||||||
|
Array<char> id(nx,ny,nz);
|
||||||
|
id.fill(0);
|
||||||
|
|
||||||
for (k=1;k<nz-1;k++){
|
for (int k=1;k<nz-1;k++){
|
||||||
for (j=1;j<ny-1;j++){
|
for (int j=1;j<ny-1;j++){
|
||||||
for (i=1;i<nx-1;i++){
|
for (int i=1;i<nx-1;i++){
|
||||||
|
|
||||||
// True signed distance
|
// True signed distance
|
||||||
x = (nx-2)*Dm.iproc+i-1;
|
double x = (nx-2)*Dm.iproc()+i-1;
|
||||||
y = (ny-2)*Dm.jproc+j-1;
|
double y = (ny-2)*Dm.jproc()+j-1;
|
||||||
z = (nz-2)*Dm.kproc+k-1;
|
double z = (nz-2)*Dm.kproc()+k-1;
|
||||||
TrueDist(i,j,k) = sqrt((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)+(z-Cz)*(z-Cz)) - BubbleRadius;
|
TrueDist(i,j,k) = sqrt((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)+(z-Cz)*(z-Cz)) - BubbleRadius;
|
||||||
|
|
||||||
n = k*nx*ny+j*nx+i;
|
|
||||||
|
|
||||||
// Initialize phase positions
|
// Initialize phase positions
|
||||||
if (TrueDist(i,j,k) < 0.0){
|
if (TrueDist(i,j,k) < 0.0){
|
||||||
id[n] = 0;
|
id(i,j,k) = 0;
|
||||||
}
|
} else{
|
||||||
else{
|
id(i,j,k)=1;
|
||||||
id[n]=1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -109,12 +98,11 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the signed distance function
|
// Initialize the signed distance function
|
||||||
for (k=0;k<nz;k++){
|
for (int k=0;k<nz;k++){
|
||||||
for (j=0;j<ny;j++){
|
for (int j=0;j<ny;j++){
|
||||||
for (i=0;i<nx;i++){
|
for (int i=0;i<nx;i++){
|
||||||
n=k*nx*ny+j*nx+i;
|
|
||||||
// Initialize distance to +/- 1
|
// Initialize distance to +/- 1
|
||||||
Distance(i,j,k) = 1.0*id[n]-0.5;
|
Distance(i,j,k) = 2.0*id(i,j,k)-1.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -128,31 +116,55 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
double starttime,stoptime,cputime;
|
double starttime,stoptime,cputime;
|
||||||
starttime = MPI_Wtime();
|
starttime = MPI_Wtime();
|
||||||
Eikonal(Distance,id,Dm,10);
|
double err1 = Eikonal(Distance,id,Dm,1000);
|
||||||
stoptime = MPI_Wtime();
|
stoptime = MPI_Wtime();
|
||||||
cputime = (stoptime - starttime);
|
cputime = (stoptime - starttime);
|
||||||
|
|
||||||
if (rank==0) printf("Total time: %f seconds \n",cputime);
|
if (rank==0) printf("Total time: %f seconds \n",cputime);
|
||||||
|
|
||||||
|
|
||||||
double Error=0.0;
|
double localError=0.0;
|
||||||
int Count = 0;
|
int localCount = 0;
|
||||||
for (k=0;k<nz;k++){
|
for (int k=0;k<nz;k++){
|
||||||
for (j=0;j<ny;j++){
|
for (int j=0;j<ny;j++){
|
||||||
for (i=0;i<nx;i++){
|
for (int i=0;i<nx;i++){
|
||||||
if (fabs(TrueDist(i,j,k)) < 3.0){
|
if (fabs(TrueDist(i,j,k)) < 3.0){
|
||||||
Error += (Distance(i,j,k)-TrueDist(i,j,k))*(Distance(i,j,k)-TrueDist(i,j,k));
|
localError += (Distance(i,j,k)-TrueDist(i,j,k))*(Distance(i,j,k)-TrueDist(i,j,k));
|
||||||
Count += 1;
|
localCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Error = sqrt(Error)/(double (Count));
|
double globalError;
|
||||||
if (rank==0) printf("Mean error %f \n", Error);
|
int globalCount;
|
||||||
|
MPI_Allreduce(&localError,&globalError,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
|
||||||
|
MPI_Allreduce(&localCount,&globalCount,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
|
||||||
|
double err2 = sqrt(globalError)/(double (globalCount));
|
||||||
|
if (rank==0) printf("global variation %f \n", err1);
|
||||||
|
if (rank==0) printf("Mean error %f \n", err2);
|
||||||
|
|
||||||
|
// Write the results to visit
|
||||||
|
Array<int> ID0(id.size());
|
||||||
|
ID0.copy( id );
|
||||||
|
Array<double> ID(Nx,Ny,Nz);
|
||||||
|
Array<double> dist1(Nx,Ny,Nz);
|
||||||
|
Array<double> dist2(Nx,Ny,Nz);
|
||||||
|
fillHalo<double> fillData(Dm.Comm, Dm.rank_info,Nx,Ny,Nz,1,1,1,0,1);
|
||||||
|
fillData.copy( ID0, ID );
|
||||||
|
fillData.copy( Distance, dist1 );
|
||||||
|
fillData.copy( TrueDist, dist2 );
|
||||||
|
std::vector<IO::MeshDataStruct> data(1);
|
||||||
|
data[0].meshName = "mesh";
|
||||||
|
data[0].mesh.reset( new IO::DomainMesh( Dm.rank_info, Nx, Ny, Nz, Dm.Lx, Dm.Ly, Dm.Lz ) );
|
||||||
|
data[0].vars.emplace_back( new IO::Variable( 1, IO::VariableType::VolumeVariable, "ID", ID ) );
|
||||||
|
data[0].vars.emplace_back( new IO::Variable( 1, IO::VariableType::VolumeVariable, "Distance", dist1 ) );
|
||||||
|
data[0].vars.emplace_back( new IO::Variable( 1, IO::VariableType::VolumeVariable, "TrueDist", dist2 ) );
|
||||||
|
data[0].vars.emplace_back( new IO::Variable( 1, IO::VariableType::VolumeVariable, "error", dist1-dist2 ) );
|
||||||
|
IO::initialize( "", "silo", false );
|
||||||
|
IO::writeData( "testSegDist", data, MPI_COMM_WORLD );
|
||||||
|
|
||||||
MPI_Barrier(comm);
|
|
||||||
}
|
}
|
||||||
|
MPI_Barrier(comm);
|
||||||
MPI_Finalize();
|
MPI_Finalize();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -103,9 +103,9 @@ int main(int argc, char **argv)
|
|||||||
n = k*Nx*Ny+j*Nx+i;
|
n = k*Nx*Ny+j*Nx+i;
|
||||||
|
|
||||||
// global position relative to center
|
// global position relative to center
|
||||||
x = Dm.iproc*Nx+i - CX;
|
x = Dm.iproc()*Nx+i - CX;
|
||||||
y = Dm.jproc*Ny+j - CY;
|
y = Dm.jproc()*Ny+j - CY;
|
||||||
z = Dm.kproc*Nz+k - CZ;
|
z = Dm.kproc()*Nz+k - CZ;
|
||||||
|
|
||||||
// Shrink the sphere sizes by two voxels to make sure they don't touch
|
// Shrink the sphere sizes by two voxels to make sure they don't touch
|
||||||
Averages.SDs(i,j,k) = 100.0;
|
Averages.SDs(i,j,k) = 100.0;
|
||||||
@ -113,12 +113,12 @@ int main(int argc, char **argv)
|
|||||||
// Single torus
|
// Single torus
|
||||||
Averages.Phase(i,j,k) = sqrt((sqrt(x*x+y*y) - R1)*(sqrt(x*x+y*y) - R1) + z*z) - R2;
|
Averages.Phase(i,j,k) = sqrt((sqrt(x*x+y*y) - R1)*(sqrt(x*x+y*y) - R1) + z*z) - R2;
|
||||||
// Double torus
|
// Double torus
|
||||||
/* y = Dm.jproc*Ny+j - CY1;
|
/* y = Dm.jproc()*Ny+j - CY1;
|
||||||
//z = Dm.kproc*Nz+k - CZ +R1;
|
//z = Dm.kproc()*Nz+k - CZ +R1;
|
||||||
Averages.Phase(i,j,k) = sqrt((sqrt(x*x+y*y) - R1)*(sqrt(x*x+y*y) - R1) + z*z) - R2;
|
Averages.Phase(i,j,k) = sqrt((sqrt(x*x+y*y) - R1)*(sqrt(x*x+y*y) - R1) + z*z) - R2;
|
||||||
|
|
||||||
y = Dm.jproc*Ny+j - CY2;
|
y = Dm.jproc()*Ny+j - CY2;
|
||||||
//z = Dm.kproc*Nz+k - CZ-R1;
|
//z = Dm.kproc()*Nz+k - CZ-R1;
|
||||||
Averages.Phase(i,j,k) = min(Averages.Phase(i,j,k),
|
Averages.Phase(i,j,k) = min(Averages.Phase(i,j,k),
|
||||||
sqrt((sqrt(x*x+y*y) - R1)*(sqrt(x*x+y*y) - R1) + z*z) - R2);
|
sqrt((sqrt(x*x+y*y) - R1)*(sqrt(x*x+y*y) - R1) + z*z) - R2);
|
||||||
*///..............................................................................
|
*///..............................................................................
|
||||||
|
@ -140,11 +140,11 @@ int main(int argc, char **argv)
|
|||||||
if (Averages.SDs(i,j,k) < 0.0){
|
if (Averages.SDs(i,j,k) < 0.0){
|
||||||
id[n] = 0;
|
id[n] = 0;
|
||||||
}
|
}
|
||||||
else if (Dm.kproc*Nz+k<BubbleBottom){
|
else if (Dm.kproc()*Nz+k<BubbleBottom){
|
||||||
id[n] = 2;
|
id[n] = 2;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
else if (Dm.kproc*Nz+k<BubbleTop){
|
else if (Dm.kproc()*Nz+k<BubbleTop){
|
||||||
id[n] = 1;
|
id[n] = 1;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
|
@ -367,7 +367,7 @@ int main(int argc, char **argv)
|
|||||||
if (rank==0) printf("Media porosity = %f \n",porosity);
|
if (rank==0) printf("Media porosity = %f \n",porosity);
|
||||||
//.........................................................
|
//.........................................................
|
||||||
// If external boundary conditions are applied remove solid
|
// If external boundary conditions are applied remove solid
|
||||||
if (BoundaryCondition > 0 && Dm.kproc == 0){
|
if (BoundaryCondition > 0 && Dm.kproc() == 0){
|
||||||
for (k=0; k<3; k++){
|
for (k=0; k<3; k++){
|
||||||
for (j=0;j<Ny;j++){
|
for (j=0;j<Ny;j++){
|
||||||
for (i=0;i<Nx;i++){
|
for (i=0;i<Nx;i++){
|
||||||
@ -378,7 +378,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (BoundaryCondition > 0 && Dm.kproc == nprocz-1){
|
if (BoundaryCondition > 0 && Dm.kproc() == nprocz-1){
|
||||||
for (k=Nz-3; k<Nz; k++){
|
for (k=Nz-3; k<Nz; k++){
|
||||||
for (j=0;j<Ny;j++){
|
for (j=0;j<Ny;j++){
|
||||||
for (i=0;i<Nx;i++){
|
for (i=0;i<Nx;i++){
|
||||||
@ -488,12 +488,12 @@ int main(int argc, char **argv)
|
|||||||
ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm.first_interior, ScaLBL_Comm.last_interior, Np);
|
ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm.first_interior, ScaLBL_Comm.last_interior, Np);
|
||||||
|
|
||||||
if (BoundaryCondition >0 ){
|
if (BoundaryCondition >0 ){
|
||||||
if (Dm.kproc==0){
|
if (Dm.kproc()==0){
|
||||||
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0);
|
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0);
|
||||||
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1);
|
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1);
|
||||||
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,2);
|
ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,2);
|
||||||
}
|
}
|
||||||
if (Dm.kproc == nprocz-1){
|
if (Dm.kproc() == nprocz-1){
|
||||||
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-1);
|
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-1);
|
||||||
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-2);
|
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-2);
|
||||||
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-3);
|
ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-3);
|
||||||
|
@ -286,7 +286,7 @@ int main(int argc, char **argv)
|
|||||||
if (rank==0) printf("Media porosity = %f \n",porosity);
|
if (rank==0) printf("Media porosity = %f \n",porosity);
|
||||||
//.........................................................
|
//.........................................................
|
||||||
// If external boundary conditions are applied remove solid
|
// If external boundary conditions are applied remove solid
|
||||||
if (BoundaryCondition > 0 && Dm.kproc == 0){
|
if (BoundaryCondition > 0 && Dm.kproc() == 0){
|
||||||
for (int k=0; k<3; k++){
|
for (int k=0; k<3; k++){
|
||||||
for (int j=0;j<Ny;j++){
|
for (int j=0;j<Ny;j++){
|
||||||
for (int i=0;i<Nx;i++){
|
for (int i=0;i<Nx;i++){
|
||||||
@ -297,7 +297,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (BoundaryCondition > 0 && Dm.kproc == nprocz-1){
|
if (BoundaryCondition > 0 && Dm.kproc() == nprocz-1){
|
||||||
for (int k=Nz-3; k<Nz; k++){
|
for (int k=Nz-3; k<Nz; k++){
|
||||||
for (int j=0;j<Ny;j++){
|
for (int j=0;j<Ny;j++){
|
||||||
for (int i=0;i<Nx;i++){
|
for (int i=0;i<Nx;i++){
|
||||||
|
@ -177,11 +177,11 @@ int main(int argc, char **argv)
|
|||||||
if (Averages.SDs(i,j,k) < 0.0){
|
if (Averages.SDs(i,j,k) < 0.0){
|
||||||
id[n] = 0;
|
id[n] = 0;
|
||||||
}
|
}
|
||||||
else if (Dm.kproc*Nz+k<BubbleBottom){
|
else if (Dm.kproc()*Nz+k<BubbleBottom){
|
||||||
id[n] = 2;
|
id[n] = 2;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
else if (Dm.kproc*Nz+k<BubbleTop){
|
else if (Dm.kproc()*Nz+k<BubbleTop){
|
||||||
id[n] = 1;
|
id[n] = 1;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
|
@ -168,9 +168,9 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
Dm.CommInit(comm);
|
Dm.CommInit(comm);
|
||||||
int iproc = Dm.iproc;
|
int iproc = Dm.iproc();
|
||||||
int jproc = Dm.jproc;
|
int jproc = Dm.jproc();
|
||||||
int kproc = Dm.kproc;
|
int kproc = Dm.kproc();
|
||||||
|
|
||||||
// Generate the NWP configuration
|
// Generate the NWP configuration
|
||||||
//if (rank==0) printf("Performing morphological drainage with critical radius %f \n", Rcrit);
|
//if (rank==0) printf("Performing morphological drainage with critical radius %f \n", Rcrit);
|
||||||
|
@ -178,9 +178,9 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
Dm.CommInit(comm);
|
Dm.CommInit(comm);
|
||||||
int iproc = Dm.iproc;
|
int iproc = Dm.iproc();
|
||||||
int jproc = Dm.jproc;
|
int jproc = Dm.jproc();
|
||||||
int kproc = Dm.kproc;
|
int kproc = Dm.kproc();
|
||||||
|
|
||||||
// Generate the NWP configuration
|
// Generate the NWP configuration
|
||||||
//if (rank==0) printf("Performing morphological drainage with critical radius %f \n", Rcrit);
|
//if (rank==0) printf("Performing morphological drainage with critical radius %f \n", Rcrit);
|
||||||
@ -360,42 +360,42 @@ int main(int argc, char **argv)
|
|||||||
PackID(Dm.sendList_yZ, Dm.sendCount_yZ ,sendID_yZ, id);
|
PackID(Dm.sendList_yZ, Dm.sendCount_yZ ,sendID_yZ, id);
|
||||||
PackID(Dm.sendList_YZ, Dm.sendCount_YZ ,sendID_YZ, id);
|
PackID(Dm.sendList_YZ, Dm.sendCount_YZ ,sendID_YZ, id);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
MPI_Sendrecv(sendID_x,Dm.sendCount_x,MPI_CHAR,Dm.rank_x,sendtag,
|
MPI_Sendrecv(sendID_x,Dm.sendCount_x,MPI_CHAR,Dm.rank_x(),sendtag,
|
||||||
recvID_X,Dm.recvCount_X,MPI_CHAR,Dm.rank_X,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_X,Dm.recvCount_X,MPI_CHAR,Dm.rank_X(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_X,Dm.sendCount_X,MPI_CHAR,Dm.rank_X,sendtag,
|
MPI_Sendrecv(sendID_X,Dm.sendCount_X,MPI_CHAR,Dm.rank_X(),sendtag,
|
||||||
recvID_x,Dm.recvCount_x,MPI_CHAR,Dm.rank_x,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_x,Dm.recvCount_x,MPI_CHAR,Dm.rank_x(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_y,Dm.sendCount_y,MPI_CHAR,Dm.rank_y,sendtag,
|
MPI_Sendrecv(sendID_y,Dm.sendCount_y,MPI_CHAR,Dm.rank_y(),sendtag,
|
||||||
recvID_Y,Dm.recvCount_Y,MPI_CHAR,Dm.rank_Y,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Y,Dm.recvCount_Y,MPI_CHAR,Dm.rank_Y(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Y,Dm.sendCount_Y,MPI_CHAR,Dm.rank_Y,sendtag,
|
MPI_Sendrecv(sendID_Y,Dm.sendCount_Y,MPI_CHAR,Dm.rank_Y(),sendtag,
|
||||||
recvID_y,Dm.recvCount_y,MPI_CHAR,Dm.rank_y,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_y,Dm.recvCount_y,MPI_CHAR,Dm.rank_y(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_z,Dm.sendCount_z,MPI_CHAR,Dm.rank_z,sendtag,
|
MPI_Sendrecv(sendID_z,Dm.sendCount_z,MPI_CHAR,Dm.rank_z(),sendtag,
|
||||||
recvID_Z,Dm.recvCount_Z,MPI_CHAR,Dm.rank_Z,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Z,Dm.recvCount_Z,MPI_CHAR,Dm.rank_Z(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Z,Dm.sendCount_Z,MPI_CHAR,Dm.rank_Z,sendtag,
|
MPI_Sendrecv(sendID_Z,Dm.sendCount_Z,MPI_CHAR,Dm.rank_Z(),sendtag,
|
||||||
recvID_z,Dm.recvCount_z,MPI_CHAR,Dm.rank_z,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_z,Dm.recvCount_z,MPI_CHAR,Dm.rank_z(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xy,Dm.sendCount_xy,MPI_CHAR,Dm.rank_xy,sendtag,
|
MPI_Sendrecv(sendID_xy,Dm.sendCount_xy,MPI_CHAR,Dm.rank_xy(),sendtag,
|
||||||
recvID_XY,Dm.recvCount_XY,MPI_CHAR,Dm.rank_XY,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_XY,Dm.recvCount_XY,MPI_CHAR,Dm.rank_XY(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_XY,Dm.sendCount_XY,MPI_CHAR,Dm.rank_XY,sendtag,
|
MPI_Sendrecv(sendID_XY,Dm.sendCount_XY,MPI_CHAR,Dm.rank_XY(),sendtag,
|
||||||
recvID_xy,Dm.recvCount_xy,MPI_CHAR,Dm.rank_xy,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xy,Dm.recvCount_xy,MPI_CHAR,Dm.rank_xy(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Xy,Dm.sendCount_Xy,MPI_CHAR,Dm.rank_Xy,sendtag,
|
MPI_Sendrecv(sendID_Xy,Dm.sendCount_Xy,MPI_CHAR,Dm.rank_Xy(),sendtag,
|
||||||
recvID_xY,Dm.recvCount_xY,MPI_CHAR,Dm.rank_xY,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xY,Dm.recvCount_xY,MPI_CHAR,Dm.rank_xY(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xY,Dm.sendCount_xY,MPI_CHAR,Dm.rank_xY,sendtag,
|
MPI_Sendrecv(sendID_xY,Dm.sendCount_xY,MPI_CHAR,Dm.rank_xY(),sendtag,
|
||||||
recvID_Xy,Dm.recvCount_Xy,MPI_CHAR,Dm.rank_Xy,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Xy,Dm.recvCount_Xy,MPI_CHAR,Dm.rank_Xy(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xz,Dm.sendCount_xz,MPI_CHAR,Dm.rank_xz,sendtag,
|
MPI_Sendrecv(sendID_xz,Dm.sendCount_xz,MPI_CHAR,Dm.rank_xz(),sendtag,
|
||||||
recvID_XZ,Dm.recvCount_XZ,MPI_CHAR,Dm.rank_XZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_XZ,Dm.recvCount_XZ,MPI_CHAR,Dm.rank_XZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_XZ,Dm.sendCount_XZ,MPI_CHAR,Dm.rank_XZ,sendtag,
|
MPI_Sendrecv(sendID_XZ,Dm.sendCount_XZ,MPI_CHAR,Dm.rank_XZ(),sendtag,
|
||||||
recvID_xz,Dm.recvCount_xz,MPI_CHAR,Dm.rank_xz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xz,Dm.recvCount_xz,MPI_CHAR,Dm.rank_xz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Xz,Dm.sendCount_Xz,MPI_CHAR,Dm.rank_Xz,sendtag,
|
MPI_Sendrecv(sendID_Xz,Dm.sendCount_Xz,MPI_CHAR,Dm.rank_Xz(),sendtag,
|
||||||
recvID_xZ,Dm.recvCount_xZ,MPI_CHAR,Dm.rank_xZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xZ,Dm.recvCount_xZ,MPI_CHAR,Dm.rank_xZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xZ,Dm.sendCount_xZ,MPI_CHAR,Dm.rank_xZ,sendtag,
|
MPI_Sendrecv(sendID_xZ,Dm.sendCount_xZ,MPI_CHAR,Dm.rank_xZ(),sendtag,
|
||||||
recvID_Xz,Dm.recvCount_Xz,MPI_CHAR,Dm.rank_Xz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Xz,Dm.recvCount_Xz,MPI_CHAR,Dm.rank_Xz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_yz,Dm.sendCount_yz,MPI_CHAR,Dm.rank_yz,sendtag,
|
MPI_Sendrecv(sendID_yz,Dm.sendCount_yz,MPI_CHAR,Dm.rank_yz(),sendtag,
|
||||||
recvID_YZ,Dm.recvCount_YZ,MPI_CHAR,Dm.rank_YZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_YZ,Dm.recvCount_YZ,MPI_CHAR,Dm.rank_YZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_YZ,Dm.sendCount_YZ,MPI_CHAR,Dm.rank_YZ,sendtag,
|
MPI_Sendrecv(sendID_YZ,Dm.sendCount_YZ,MPI_CHAR,Dm.rank_YZ(),sendtag,
|
||||||
recvID_yz,Dm.recvCount_yz,MPI_CHAR,Dm.rank_yz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_yz,Dm.recvCount_yz,MPI_CHAR,Dm.rank_yz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Yz,Dm.sendCount_Yz,MPI_CHAR,Dm.rank_Yz,sendtag,
|
MPI_Sendrecv(sendID_Yz,Dm.sendCount_Yz,MPI_CHAR,Dm.rank_Yz(),sendtag,
|
||||||
recvID_yZ,Dm.recvCount_yZ,MPI_CHAR,Dm.rank_yZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_yZ,Dm.recvCount_yZ,MPI_CHAR,Dm.rank_yZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_yZ,Dm.sendCount_yZ,MPI_CHAR,Dm.rank_yZ,sendtag,
|
MPI_Sendrecv(sendID_yZ,Dm.sendCount_yZ,MPI_CHAR,Dm.rank_yZ(),sendtag,
|
||||||
recvID_Yz,Dm.recvCount_Yz,MPI_CHAR,Dm.rank_Yz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Yz,Dm.recvCount_Yz,MPI_CHAR,Dm.rank_Yz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
|
|
||||||
UnpackID(Dm.recvList_x, Dm.recvCount_x ,recvID_x, id);
|
UnpackID(Dm.recvList_x, Dm.recvCount_x ,recvID_x, id);
|
||||||
UnpackID(Dm.recvList_X, Dm.recvCount_X ,recvID_X, id);
|
UnpackID(Dm.recvList_X, Dm.recvCount_X ,recvID_X, id);
|
||||||
|
@ -271,9 +271,9 @@ int main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Dm.CommInit(comm);
|
Dm.CommInit(comm);
|
||||||
int iproc = Dm.iproc;
|
int iproc = Dm.iproc();
|
||||||
int jproc = Dm.jproc;
|
int jproc = Dm.jproc();
|
||||||
int kproc = Dm.kproc;
|
int kproc = Dm.kproc();
|
||||||
|
|
||||||
// Generate the NWP configuration
|
// Generate the NWP configuration
|
||||||
//if (rank==0) printf("Initializing morphological distribution with critical radius %f \n", Rcrit);
|
//if (rank==0) printf("Initializing morphological distribution with critical radius %f \n", Rcrit);
|
||||||
@ -415,42 +415,42 @@ int main(int argc, char **argv)
|
|||||||
PackID(Dm.sendList_yZ, Dm.sendCount_yZ ,sendID_yZ, id);
|
PackID(Dm.sendList_yZ, Dm.sendCount_yZ ,sendID_yZ, id);
|
||||||
PackID(Dm.sendList_YZ, Dm.sendCount_YZ ,sendID_YZ, id);
|
PackID(Dm.sendList_YZ, Dm.sendCount_YZ ,sendID_YZ, id);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
MPI_Sendrecv(sendID_x,Dm.sendCount_x,MPI_CHAR,Dm.rank_x,sendtag,
|
MPI_Sendrecv(sendID_x,Dm.sendCount_x,MPI_CHAR,Dm.rank_x(),sendtag,
|
||||||
recvID_X,Dm.recvCount_X,MPI_CHAR,Dm.rank_X,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_X,Dm.recvCount_X,MPI_CHAR,Dm.rank_X(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_X,Dm.sendCount_X,MPI_CHAR,Dm.rank_X,sendtag,
|
MPI_Sendrecv(sendID_X,Dm.sendCount_X,MPI_CHAR,Dm.rank_X(),sendtag,
|
||||||
recvID_x,Dm.recvCount_x,MPI_CHAR,Dm.rank_x,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_x,Dm.recvCount_x,MPI_CHAR,Dm.rank_x(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_y,Dm.sendCount_y,MPI_CHAR,Dm.rank_y,sendtag,
|
MPI_Sendrecv(sendID_y,Dm.sendCount_y,MPI_CHAR,Dm.rank_y(),sendtag,
|
||||||
recvID_Y,Dm.recvCount_Y,MPI_CHAR,Dm.rank_Y,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Y,Dm.recvCount_Y,MPI_CHAR,Dm.rank_Y(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Y,Dm.sendCount_Y,MPI_CHAR,Dm.rank_Y,sendtag,
|
MPI_Sendrecv(sendID_Y,Dm.sendCount_Y,MPI_CHAR,Dm.rank_Y(),sendtag,
|
||||||
recvID_y,Dm.recvCount_y,MPI_CHAR,Dm.rank_y,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_y,Dm.recvCount_y,MPI_CHAR,Dm.rank_y(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_z,Dm.sendCount_z,MPI_CHAR,Dm.rank_z,sendtag,
|
MPI_Sendrecv(sendID_z,Dm.sendCount_z,MPI_CHAR,Dm.rank_z(),sendtag,
|
||||||
recvID_Z,Dm.recvCount_Z,MPI_CHAR,Dm.rank_Z,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Z,Dm.recvCount_Z,MPI_CHAR,Dm.rank_Z(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Z,Dm.sendCount_Z,MPI_CHAR,Dm.rank_Z,sendtag,
|
MPI_Sendrecv(sendID_Z,Dm.sendCount_Z,MPI_CHAR,Dm.rank_Z(),sendtag,
|
||||||
recvID_z,Dm.recvCount_z,MPI_CHAR,Dm.rank_z,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_z,Dm.recvCount_z,MPI_CHAR,Dm.rank_z(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xy,Dm.sendCount_xy,MPI_CHAR,Dm.rank_xy,sendtag,
|
MPI_Sendrecv(sendID_xy,Dm.sendCount_xy,MPI_CHAR,Dm.rank_xy(),sendtag,
|
||||||
recvID_XY,Dm.recvCount_XY,MPI_CHAR,Dm.rank_XY,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_XY,Dm.recvCount_XY,MPI_CHAR,Dm.rank_XY(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_XY,Dm.sendCount_XY,MPI_CHAR,Dm.rank_XY,sendtag,
|
MPI_Sendrecv(sendID_XY,Dm.sendCount_XY,MPI_CHAR,Dm.rank_XY(),sendtag,
|
||||||
recvID_xy,Dm.recvCount_xy,MPI_CHAR,Dm.rank_xy,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xy,Dm.recvCount_xy,MPI_CHAR,Dm.rank_xy(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Xy,Dm.sendCount_Xy,MPI_CHAR,Dm.rank_Xy,sendtag,
|
MPI_Sendrecv(sendID_Xy,Dm.sendCount_Xy,MPI_CHAR,Dm.rank_Xy(),sendtag,
|
||||||
recvID_xY,Dm.recvCount_xY,MPI_CHAR,Dm.rank_xY,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xY,Dm.recvCount_xY,MPI_CHAR,Dm.rank_xY(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xY,Dm.sendCount_xY,MPI_CHAR,Dm.rank_xY,sendtag,
|
MPI_Sendrecv(sendID_xY,Dm.sendCount_xY,MPI_CHAR,Dm.rank_xY(),sendtag,
|
||||||
recvID_Xy,Dm.recvCount_Xy,MPI_CHAR,Dm.rank_Xy,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Xy,Dm.recvCount_Xy,MPI_CHAR,Dm.rank_Xy(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xz,Dm.sendCount_xz,MPI_CHAR,Dm.rank_xz,sendtag,
|
MPI_Sendrecv(sendID_xz,Dm.sendCount_xz,MPI_CHAR,Dm.rank_xz(),sendtag,
|
||||||
recvID_XZ,Dm.recvCount_XZ,MPI_CHAR,Dm.rank_XZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_XZ,Dm.recvCount_XZ,MPI_CHAR,Dm.rank_XZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_XZ,Dm.sendCount_XZ,MPI_CHAR,Dm.rank_XZ,sendtag,
|
MPI_Sendrecv(sendID_XZ,Dm.sendCount_XZ,MPI_CHAR,Dm.rank_XZ(),sendtag,
|
||||||
recvID_xz,Dm.recvCount_xz,MPI_CHAR,Dm.rank_xz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xz,Dm.recvCount_xz,MPI_CHAR,Dm.rank_xz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Xz,Dm.sendCount_Xz,MPI_CHAR,Dm.rank_Xz,sendtag,
|
MPI_Sendrecv(sendID_Xz,Dm.sendCount_Xz,MPI_CHAR,Dm.rank_Xz(),sendtag,
|
||||||
recvID_xZ,Dm.recvCount_xZ,MPI_CHAR,Dm.rank_xZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xZ,Dm.recvCount_xZ,MPI_CHAR,Dm.rank_xZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xZ,Dm.sendCount_xZ,MPI_CHAR,Dm.rank_xZ,sendtag,
|
MPI_Sendrecv(sendID_xZ,Dm.sendCount_xZ,MPI_CHAR,Dm.rank_xZ(),sendtag,
|
||||||
recvID_Xz,Dm.recvCount_Xz,MPI_CHAR,Dm.rank_Xz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Xz,Dm.recvCount_Xz,MPI_CHAR,Dm.rank_Xz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_yz,Dm.sendCount_yz,MPI_CHAR,Dm.rank_yz,sendtag,
|
MPI_Sendrecv(sendID_yz,Dm.sendCount_yz,MPI_CHAR,Dm.rank_yz(),sendtag,
|
||||||
recvID_YZ,Dm.recvCount_YZ,MPI_CHAR,Dm.rank_YZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_YZ,Dm.recvCount_YZ,MPI_CHAR,Dm.rank_YZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_YZ,Dm.sendCount_YZ,MPI_CHAR,Dm.rank_YZ,sendtag,
|
MPI_Sendrecv(sendID_YZ,Dm.sendCount_YZ,MPI_CHAR,Dm.rank_YZ(),sendtag,
|
||||||
recvID_yz,Dm.recvCount_yz,MPI_CHAR,Dm.rank_yz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_yz,Dm.recvCount_yz,MPI_CHAR,Dm.rank_yz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Yz,Dm.sendCount_Yz,MPI_CHAR,Dm.rank_Yz,sendtag,
|
MPI_Sendrecv(sendID_Yz,Dm.sendCount_Yz,MPI_CHAR,Dm.rank_Yz(),sendtag,
|
||||||
recvID_yZ,Dm.recvCount_yZ,MPI_CHAR,Dm.rank_yZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_yZ,Dm.recvCount_yZ,MPI_CHAR,Dm.rank_yZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_yZ,Dm.sendCount_yZ,MPI_CHAR,Dm.rank_yZ,sendtag,
|
MPI_Sendrecv(sendID_yZ,Dm.sendCount_yZ,MPI_CHAR,Dm.rank_yZ(),sendtag,
|
||||||
recvID_Yz,Dm.recvCount_Yz,MPI_CHAR,Dm.rank_Yz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Yz,Dm.recvCount_Yz,MPI_CHAR,Dm.rank_Yz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
UnpackID(Dm.recvList_x, Dm.recvCount_x ,recvID_x, id);
|
UnpackID(Dm.recvList_x, Dm.recvCount_x ,recvID_x, id);
|
||||||
UnpackID(Dm.recvList_X, Dm.recvCount_X ,recvID_X, id);
|
UnpackID(Dm.recvList_X, Dm.recvCount_X ,recvID_X, id);
|
||||||
|
@ -172,9 +172,9 @@ int main(int argc, char **argv)
|
|||||||
if (rank==0) printf("Media Porosity: %f \n",porosity);
|
if (rank==0) printf("Media Porosity: %f \n",porosity);
|
||||||
|
|
||||||
Dm.CommInit(comm);
|
Dm.CommInit(comm);
|
||||||
int iproc = Dm.iproc;
|
int iproc = Dm.iproc();
|
||||||
int jproc = Dm.jproc;
|
int jproc = Dm.jproc();
|
||||||
int kproc = Dm.kproc;
|
int kproc = Dm.kproc();
|
||||||
|
|
||||||
int bin, binCount;
|
int bin, binCount;
|
||||||
ifstream Dist("BlobSize.in");
|
ifstream Dist("BlobSize.in");
|
||||||
@ -346,42 +346,42 @@ int main(int argc, char **argv)
|
|||||||
PackID(Dm.sendList_yZ, Dm.sendCount_yZ ,sendID_yZ, id);
|
PackID(Dm.sendList_yZ, Dm.sendCount_yZ ,sendID_yZ, id);
|
||||||
PackID(Dm.sendList_YZ, Dm.sendCount_YZ ,sendID_YZ, id);
|
PackID(Dm.sendList_YZ, Dm.sendCount_YZ ,sendID_YZ, id);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
MPI_Sendrecv(sendID_x,Dm.sendCount_x,MPI_CHAR,Dm.rank_x,sendtag,
|
MPI_Sendrecv(sendID_x,Dm.sendCount_x,MPI_CHAR,Dm.rank_x(),sendtag,
|
||||||
recvID_X,Dm.recvCount_X,MPI_CHAR,Dm.rank_X,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_X,Dm.recvCount_X,MPI_CHAR,Dm.rank_X(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_X,Dm.sendCount_X,MPI_CHAR,Dm.rank_X,sendtag,
|
MPI_Sendrecv(sendID_X,Dm.sendCount_X,MPI_CHAR,Dm.rank_X(),sendtag,
|
||||||
recvID_x,Dm.recvCount_x,MPI_CHAR,Dm.rank_x,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_x,Dm.recvCount_x,MPI_CHAR,Dm.rank_x(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_y,Dm.sendCount_y,MPI_CHAR,Dm.rank_y,sendtag,
|
MPI_Sendrecv(sendID_y,Dm.sendCount_y,MPI_CHAR,Dm.rank_y(),sendtag,
|
||||||
recvID_Y,Dm.recvCount_Y,MPI_CHAR,Dm.rank_Y,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Y,Dm.recvCount_Y,MPI_CHAR,Dm.rank_Y(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Y,Dm.sendCount_Y,MPI_CHAR,Dm.rank_Y,sendtag,
|
MPI_Sendrecv(sendID_Y,Dm.sendCount_Y,MPI_CHAR,Dm.rank_Y(),sendtag,
|
||||||
recvID_y,Dm.recvCount_y,MPI_CHAR,Dm.rank_y,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_y,Dm.recvCount_y,MPI_CHAR,Dm.rank_y(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_z,Dm.sendCount_z,MPI_CHAR,Dm.rank_z,sendtag,
|
MPI_Sendrecv(sendID_z,Dm.sendCount_z,MPI_CHAR,Dm.rank_z(),sendtag,
|
||||||
recvID_Z,Dm.recvCount_Z,MPI_CHAR,Dm.rank_Z,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Z,Dm.recvCount_Z,MPI_CHAR,Dm.rank_Z(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Z,Dm.sendCount_Z,MPI_CHAR,Dm.rank_Z,sendtag,
|
MPI_Sendrecv(sendID_Z,Dm.sendCount_Z,MPI_CHAR,Dm.rank_Z(),sendtag,
|
||||||
recvID_z,Dm.recvCount_z,MPI_CHAR,Dm.rank_z,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_z,Dm.recvCount_z,MPI_CHAR,Dm.rank_z(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xy,Dm.sendCount_xy,MPI_CHAR,Dm.rank_xy,sendtag,
|
MPI_Sendrecv(sendID_xy,Dm.sendCount_xy,MPI_CHAR,Dm.rank_xy(),sendtag,
|
||||||
recvID_XY,Dm.recvCount_XY,MPI_CHAR,Dm.rank_XY,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_XY,Dm.recvCount_XY,MPI_CHAR,Dm.rank_XY(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_XY,Dm.sendCount_XY,MPI_CHAR,Dm.rank_XY,sendtag,
|
MPI_Sendrecv(sendID_XY,Dm.sendCount_XY,MPI_CHAR,Dm.rank_XY(),sendtag,
|
||||||
recvID_xy,Dm.recvCount_xy,MPI_CHAR,Dm.rank_xy,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xy,Dm.recvCount_xy,MPI_CHAR,Dm.rank_xy(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Xy,Dm.sendCount_Xy,MPI_CHAR,Dm.rank_Xy,sendtag,
|
MPI_Sendrecv(sendID_Xy,Dm.sendCount_Xy,MPI_CHAR,Dm.rank_Xy(),sendtag,
|
||||||
recvID_xY,Dm.recvCount_xY,MPI_CHAR,Dm.rank_xY,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xY,Dm.recvCount_xY,MPI_CHAR,Dm.rank_xY(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xY,Dm.sendCount_xY,MPI_CHAR,Dm.rank_xY,sendtag,
|
MPI_Sendrecv(sendID_xY,Dm.sendCount_xY,MPI_CHAR,Dm.rank_xY(),sendtag,
|
||||||
recvID_Xy,Dm.recvCount_Xy,MPI_CHAR,Dm.rank_Xy,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Xy,Dm.recvCount_Xy,MPI_CHAR,Dm.rank_Xy(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xz,Dm.sendCount_xz,MPI_CHAR,Dm.rank_xz,sendtag,
|
MPI_Sendrecv(sendID_xz,Dm.sendCount_xz,MPI_CHAR,Dm.rank_xz(),sendtag,
|
||||||
recvID_XZ,Dm.recvCount_XZ,MPI_CHAR,Dm.rank_XZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_XZ,Dm.recvCount_XZ,MPI_CHAR,Dm.rank_XZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_XZ,Dm.sendCount_XZ,MPI_CHAR,Dm.rank_XZ,sendtag,
|
MPI_Sendrecv(sendID_XZ,Dm.sendCount_XZ,MPI_CHAR,Dm.rank_XZ(),sendtag,
|
||||||
recvID_xz,Dm.recvCount_xz,MPI_CHAR,Dm.rank_xz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xz,Dm.recvCount_xz,MPI_CHAR,Dm.rank_xz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Xz,Dm.sendCount_Xz,MPI_CHAR,Dm.rank_Xz,sendtag,
|
MPI_Sendrecv(sendID_Xz,Dm.sendCount_Xz,MPI_CHAR,Dm.rank_Xz(),sendtag,
|
||||||
recvID_xZ,Dm.recvCount_xZ,MPI_CHAR,Dm.rank_xZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_xZ,Dm.recvCount_xZ,MPI_CHAR,Dm.rank_xZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_xZ,Dm.sendCount_xZ,MPI_CHAR,Dm.rank_xZ,sendtag,
|
MPI_Sendrecv(sendID_xZ,Dm.sendCount_xZ,MPI_CHAR,Dm.rank_xZ(),sendtag,
|
||||||
recvID_Xz,Dm.recvCount_Xz,MPI_CHAR,Dm.rank_Xz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Xz,Dm.recvCount_Xz,MPI_CHAR,Dm.rank_Xz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_yz,Dm.sendCount_yz,MPI_CHAR,Dm.rank_yz,sendtag,
|
MPI_Sendrecv(sendID_yz,Dm.sendCount_yz,MPI_CHAR,Dm.rank_yz(),sendtag,
|
||||||
recvID_YZ,Dm.recvCount_YZ,MPI_CHAR,Dm.rank_YZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_YZ,Dm.recvCount_YZ,MPI_CHAR,Dm.rank_YZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_YZ,Dm.sendCount_YZ,MPI_CHAR,Dm.rank_YZ,sendtag,
|
MPI_Sendrecv(sendID_YZ,Dm.sendCount_YZ,MPI_CHAR,Dm.rank_YZ(),sendtag,
|
||||||
recvID_yz,Dm.recvCount_yz,MPI_CHAR,Dm.rank_yz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_yz,Dm.recvCount_yz,MPI_CHAR,Dm.rank_yz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_Yz,Dm.sendCount_Yz,MPI_CHAR,Dm.rank_Yz,sendtag,
|
MPI_Sendrecv(sendID_Yz,Dm.sendCount_Yz,MPI_CHAR,Dm.rank_Yz(),sendtag,
|
||||||
recvID_yZ,Dm.recvCount_yZ,MPI_CHAR,Dm.rank_yZ,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_yZ,Dm.recvCount_yZ,MPI_CHAR,Dm.rank_yZ(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
MPI_Sendrecv(sendID_yZ,Dm.sendCount_yZ,MPI_CHAR,Dm.rank_yZ,sendtag,
|
MPI_Sendrecv(sendID_yZ,Dm.sendCount_yZ,MPI_CHAR,Dm.rank_yZ(),sendtag,
|
||||||
recvID_Yz,Dm.recvCount_Yz,MPI_CHAR,Dm.rank_Yz,recvtag,comm,MPI_STATUS_IGNORE);
|
recvID_Yz,Dm.recvCount_Yz,MPI_CHAR,Dm.rank_Yz(),recvtag,comm,MPI_STATUS_IGNORE);
|
||||||
//......................................................................................
|
//......................................................................................
|
||||||
UnpackID(Dm.recvList_x, Dm.recvCount_x ,recvID_x, id);
|
UnpackID(Dm.recvList_x, Dm.recvCount_x ,recvID_x, id);
|
||||||
UnpackID(Dm.recvList_X, Dm.recvCount_X ,recvID_X, id);
|
UnpackID(Dm.recvList_X, Dm.recvCount_X ,recvID_X, id);
|
||||||
|
@ -170,7 +170,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// Write output blocks with the same sub-domain size as origina
|
// Write output blocks with the same sub-domain size as origina
|
||||||
// refinement increases the size of the process grid
|
// refinement increases the size of the process grid
|
||||||
writerank = 8*Dm.kproc*nprocx*nprocy + 4*Dm.jproc*nprocx + 2*Dm.iproc;
|
writerank = 8*Dm.kproc()*nprocx*nprocy + 4*Dm.jproc()*nprocx + 2*Dm.iproc();
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
@ -198,7 +198,7 @@ int main(int argc, char **argv)
|
|||||||
fwrite(id,1,nx*ny*nz,WRITEID);
|
fwrite(id,1,nx*ny*nz,WRITEID);
|
||||||
fclose(WRITEID);
|
fclose(WRITEID);
|
||||||
|
|
||||||
writerank = 8*Dm.kproc*nprocx*nprocy + 4*Dm.jproc*nprocx + 2*Dm.iproc+1;
|
writerank = 8*Dm.kproc()*nprocx*nprocy + 4*Dm.jproc()*nprocx + 2*Dm.iproc()+1;
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
@ -227,7 +227,7 @@ int main(int argc, char **argv)
|
|||||||
fclose(WRITEID);
|
fclose(WRITEID);
|
||||||
|
|
||||||
|
|
||||||
writerank = (2*Dm.kproc)*4*nprocx*nprocy + (2*Dm.jproc+1)*2*nprocx + 2*Dm.iproc+1;
|
writerank = (2*Dm.kproc())*4*nprocx*nprocy + (2*Dm.jproc()+1)*2*nprocx + 2*Dm.iproc()+1;
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
@ -255,7 +255,7 @@ int main(int argc, char **argv)
|
|||||||
fwrite(id,1,nx*ny*nz,WRITEID);
|
fwrite(id,1,nx*ny*nz,WRITEID);
|
||||||
fclose(WRITEID);
|
fclose(WRITEID);
|
||||||
|
|
||||||
writerank = (2*Dm.kproc)*4*nprocx*nprocy + (2*Dm.jproc+1)*2*nprocx + 2*Dm.iproc;
|
writerank = (2*Dm.kproc())*4*nprocx*nprocy + (2*Dm.jproc()+1)*2*nprocx + 2*Dm.iproc();
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
@ -283,8 +283,7 @@ int main(int argc, char **argv)
|
|||||||
fwrite(id,1,nx*ny*nz,WRITEID);
|
fwrite(id,1,nx*ny*nz,WRITEID);
|
||||||
fclose(WRITEID);
|
fclose(WRITEID);
|
||||||
|
|
||||||
|
writerank = (2*Dm.kproc()+1)*4*nprocx*nprocy + (2*Dm.jproc())*2*nprocx + 2*Dm.iproc();
|
||||||
writerank = (2*Dm.kproc+1)*4*nprocx*nprocy + (2*Dm.jproc)*2*nprocx + 2*Dm.iproc;
|
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
@ -312,7 +311,7 @@ int main(int argc, char **argv)
|
|||||||
fwrite(id,1,nx*ny*nz,WRITEID);
|
fwrite(id,1,nx*ny*nz,WRITEID);
|
||||||
fclose(WRITEID);
|
fclose(WRITEID);
|
||||||
|
|
||||||
writerank = (2*Dm.kproc+1)*4*nprocx*nprocy + (2*Dm.jproc)*2*nprocx + 2*Dm.iproc+1;
|
writerank = (2*Dm.kproc()+1)*4*nprocx*nprocy + (2*Dm.jproc())*2*nprocx + 2*Dm.iproc()+1;
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
@ -340,7 +339,7 @@ int main(int argc, char **argv)
|
|||||||
fwrite(id,1,nx*ny*nz,WRITEID);
|
fwrite(id,1,nx*ny*nz,WRITEID);
|
||||||
fclose(WRITEID);
|
fclose(WRITEID);
|
||||||
|
|
||||||
writerank = (2*Dm.kproc+1)*4*nprocx*nprocy + (2*Dm.jproc+1)*2*nprocx + 2*Dm.iproc;
|
writerank = (2*Dm.kproc()+1)*4*nprocx*nprocy + (2*Dm.jproc()+1)*2*nprocx + 2*Dm.iproc();
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
@ -368,7 +367,7 @@ int main(int argc, char **argv)
|
|||||||
fwrite(id,1,nx*ny*nz,WRITEID);
|
fwrite(id,1,nx*ny*nz,WRITEID);
|
||||||
fclose(WRITEID);
|
fclose(WRITEID);
|
||||||
|
|
||||||
writerank = (2*Dm.kproc+1)*4*nprocx*nprocy + (2*Dm.jproc+1)*2*nprocx + 2*Dm.iproc+1;
|
writerank = (2*Dm.kproc()+1)*4*nprocx*nprocy + (2*Dm.jproc()+1)*2*nprocx + 2*Dm.iproc()+1;
|
||||||
for (int k=0; k<nz; k++){
|
for (int k=0; k<nz; k++){
|
||||||
for (int j=0; j<ny; j++){
|
for (int j=0; j<ny; j++){
|
||||||
for (int i=0; i<nx; i++){
|
for (int i=0; i<nx; i++){
|
||||||
|
@ -151,7 +151,7 @@ int main(int argc, char **argv)
|
|||||||
// Set up the sub-domains
|
// Set up the sub-domains
|
||||||
if (rank==0){
|
if (rank==0){
|
||||||
printf("Distributing subdomains across %i processors \n",nprocs);
|
printf("Distributing subdomains across %i processors \n",nprocs);
|
||||||
printf("Process grid: %i x %i x %i \n",Dm.nprocx,Dm.nprocy,Dm.nprocz);
|
printf("Process grid: %i x %i x %i \n",Dm.nprocx(),Dm.nprocy(),Dm.nprocz());
|
||||||
printf("Subdomain size: %i \n",N);
|
printf("Subdomain size: %i \n",N);
|
||||||
printf("Size of transition region: %i \n", z_transition_size);
|
printf("Size of transition region: %i \n", z_transition_size);
|
||||||
char *tmp;
|
char *tmp;
|
||||||
@ -160,7 +160,7 @@ int main(int argc, char **argv)
|
|||||||
for (int jp=0; jp<nprocy; jp++){
|
for (int jp=0; jp<nprocy; jp++){
|
||||||
for (int ip=0; ip<nprocx; ip++){
|
for (int ip=0; ip<nprocx; ip++){
|
||||||
// rank of the process that gets this subdomain
|
// rank of the process that gets this subdomain
|
||||||
int rnk = kp*Dm.nprocx*Dm.nprocy + jp*Dm.nprocx + ip;
|
int rnk = kp*Dm.nprocx()*Dm.nprocy() + jp*Dm.nprocx() + ip;
|
||||||
// Pack and send the subdomain for rnk
|
// Pack and send the subdomain for rnk
|
||||||
for (k=0;k<nz+2;k++){
|
for (k=0;k<nz+2;k++){
|
||||||
for (j=0;j<ny+2;j++){
|
for (j=0;j<ny+2;j++){
|
||||||
@ -342,8 +342,8 @@ int main(int argc, char **argv)
|
|||||||
if (rank==0) printf("Writing symmetric domain reflection\n");
|
if (rank==0) printf("Writing symmetric domain reflection\n");
|
||||||
MPI_Barrier(comm);
|
MPI_Barrier(comm);
|
||||||
int symrank,sympz;
|
int symrank,sympz;
|
||||||
sympz = 2*nprocz - Dm.kproc -1;
|
sympz = 2*nprocz - Dm.kproc() -1;
|
||||||
symrank = sympz*nprocx*nprocy + Dm.jproc*nprocx + Dm.iproc;
|
symrank = sympz*nprocx*nprocy + Dm.jproc()*nprocx + Dm.iproc();
|
||||||
|
|
||||||
// DoubleArray SymDist(nx,ny,nz);
|
// DoubleArray SymDist(nx,ny,nz);
|
||||||
char *symid;
|
char *symid;
|
||||||
|
@ -208,7 +208,7 @@ int main(int argc, char **argv)
|
|||||||
// Read from the large block and write the local ID file
|
// Read from the large block and write the local ID file
|
||||||
if (rank==0) printf("Reading ID file from blocks \n");
|
if (rank==0) printf("Reading ID file from blocks \n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
porosity = ReadFromBlock(Dm.id,Dm.iproc,Dm.jproc,Dm.kproc,nx,ny,nz);
|
porosity = ReadFromBlock(Dm.id,Dm.iproc(),Dm.jproc(),Dm.kproc(),nx,ny,nz);
|
||||||
|
|
||||||
MPI_Barrier(MPI_COMM_WORLD);
|
MPI_Barrier(MPI_COMM_WORLD);
|
||||||
if (rank==0) printf("Writing local ID files (poros=%f) \n",porosity);
|
if (rank==0) printf("Writing local ID files (poros=%f) \n",porosity);
|
||||||
@ -222,8 +222,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the domain and communication
|
// Initialize the domain and communication
|
||||||
char *id;
|
Array<char> id(nx,ny,nz);
|
||||||
id = new char [N];
|
|
||||||
TwoPhase Averages(Dm);
|
TwoPhase Averages(Dm);
|
||||||
// DoubleArray Distance(nx,ny,nz);
|
// DoubleArray Distance(nx,ny,nz);
|
||||||
// DoubleArray Phase(nx,ny,nz);
|
// DoubleArray Phase(nx,ny,nz);
|
||||||
@ -235,8 +234,8 @@ int main(int argc, char **argv)
|
|||||||
for (i=0;i<nx;i++){
|
for (i=0;i<nx;i++){
|
||||||
n = k*nx*ny+j*nx+i;
|
n = k*nx*ny+j*nx+i;
|
||||||
// Initialize the solid phase
|
// Initialize the solid phase
|
||||||
if (Dm.id[n] == 0) id[n] = 0;
|
if (Dm.id[n] == 0) id(i,j,k) = 0;
|
||||||
else id[n] = 1;
|
else id(i,j,k) = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -246,7 +245,7 @@ int main(int argc, char **argv)
|
|||||||
for (i=0;i<nx;i++){
|
for (i=0;i<nx;i++){
|
||||||
n=k*nx*ny+j*nx+i;
|
n=k*nx*ny+j*nx+i;
|
||||||
// Initialize distance to +/- 1
|
// Initialize distance to +/- 1
|
||||||
Averages.SDs(i,j,k) = 2.0*double(id[n])-1.0;
|
Averages.SDs(i,j,k) = 2.0*double(id(i,j,k))-1.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -254,7 +253,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
double LocalVar, TotalVar;
|
double LocalVar, TotalVar;
|
||||||
if (rank==0) printf("Initialized solid phase -- Converting to Signed Distance function \n");
|
if (rank==0) printf("Initialized solid phase -- Converting to Signed Distance function \n");
|
||||||
int Maxtime=10*max(max(Dm.Nx*Dm.nprocx,Dm.Ny*Dm.nprocy),Dm.Nz*Dm.nprocz);
|
int Maxtime=10*max(max(Dm.Nx*Dm.nprocx(),Dm.Ny*Dm.nprocy()),Dm.Nz*Dm.nprocz());
|
||||||
Maxtime=min(Maxtime,MAXTIME);
|
Maxtime=min(Maxtime,MAXTIME);
|
||||||
LocalVar = Eikonal(Averages.SDs,id,Dm,Maxtime);
|
LocalVar = Eikonal(Averages.SDs,id,Dm,Maxtime);
|
||||||
|
|
||||||
|
@ -169,11 +169,11 @@ int main(int argc, char **argv)
|
|||||||
if (Averages.SDs(i,j,k) < 0.0){
|
if (Averages.SDs(i,j,k) < 0.0){
|
||||||
id[n] = 0;
|
id[n] = 0;
|
||||||
}
|
}
|
||||||
else if (Dm.iproc*Nx+k<BubbleBottom){
|
else if (Dm.iproc()*Nx+k<BubbleBottom){
|
||||||
id[n] = 2;
|
id[n] = 2;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
else if (Dm.iproc*Nx+k<BubbleTop){
|
else if (Dm.iproc()*Nx+k<BubbleTop){
|
||||||
id[n] = 1;
|
id[n] = 1;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
@ -190,11 +190,11 @@ int main(int argc, char **argv)
|
|||||||
if (Averages.SDs(i,j,k) < 0.0){
|
if (Averages.SDs(i,j,k) < 0.0){
|
||||||
id[n] = 0;
|
id[n] = 0;
|
||||||
}
|
}
|
||||||
else if (Dm.jproc*Ny+k<BubbleBottom){
|
else if (Dm.jproc()*Ny+k<BubbleBottom){
|
||||||
id[n] = 2;
|
id[n] = 2;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
else if (Dm.jproc*Ny+k<BubbleTop){
|
else if (Dm.jproc()*Ny+k<BubbleTop){
|
||||||
id[n] = 1;
|
id[n] = 1;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
@ -211,11 +211,11 @@ int main(int argc, char **argv)
|
|||||||
if (Averages.SDs(i,j,k) < 0.0){
|
if (Averages.SDs(i,j,k) < 0.0){
|
||||||
id[n] = 0;
|
id[n] = 0;
|
||||||
}
|
}
|
||||||
else if (Dm.kproc*Nz+k<BubbleBottom){
|
else if (Dm.kproc()*Nz+k<BubbleBottom){
|
||||||
id[n] = 2;
|
id[n] = 2;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
else if (Dm.kproc*Nz+k<BubbleTop){
|
else if (Dm.kproc()*Nz+k<BubbleTop){
|
||||||
id[n] = 1;
|
id[n] = 1;
|
||||||
sum++;
|
sum++;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user