#include "analysis/Minkowski.h" #include "analysis/pmmc.h" #include "analysis/analysis.h" #include "common/Domain.h" #include "common/Communication.h" #include "common/Utilities.h" #include "common/MPI_Helpers.h" #include "IO/MeshDatabase.h" #include "IO/Reader.h" #include "IO/Writer.h" #include "ProfilerApp.h" #include #define PI 3.14159265359 // Constructor Minkowski::Minkowski(std::shared_ptr dm): kstart(0), kfinish(0), isovalue(0), Volume(0), LOGFILE(NULL), Dm(dm), Vi(0), Vi_global(0) { Nx=dm->Nx; Ny=dm->Ny; Nz=dm->Nz; Volume=double((Nx-2)*(Ny-2)*(Nz-2))*double(Dm->nprocx()*Dm->nprocy()*Dm->nprocz()); id.resize(Nx,Ny,Nz); id.fill(0); label.resize(Nx,Ny,Nz); label.fill(0); distance.resize(Nx,Ny,Nz); distance.fill(0); if (Dm->rank()==0){ LOGFILE = fopen("minkowski.csv","a+"); if (fseek(LOGFILE,0,SEEK_SET) == fseek(LOGFILE,0,SEEK_CUR)) { // If LOGFILE is empty, write a short header to list the averages //fprintf(LOGFILE,"--------------------------------------------------------------------------------------\n"); fprintf(LOGFILE,"Vn An Jn Xn\n"); //miknowski measures, } } } // Destructor Minkowski::~Minkowski() { if ( LOGFILE!=NULL ) { fclose(LOGFILE); } } void Minkowski::ComputeScalar(const DoubleArray& Field, const double isovalue) { PROFILE_START("ComputeScalar"); Xi = Ji = Ai = 0.0; DECL object; int e1,e2,e3; double s,s1,s2,s3; double a1,a2,a3; //double Vx,Vy,Vz,Wx,Wy,Wz,nx,ny,nz,norm; //int Nx = Field.size(0); //int Ny = Field.size(1); //int Nz = Field.size(2); for (int k=1; k 0) EulerChar = (0.25*nvert - nside_intern - 0.5*nside_extern + nface); */ } } } // Voxel counting for volume fraction Vi = 0.f; for (int k=1; kComm); // Phase averages MPI_Allreduce(&Vi,&Vi_global,1,MPI_DOUBLE,MPI_SUM,Dm->Comm); MPI_Allreduce(&Xi,&Xi_global,1,MPI_DOUBLE,MPI_SUM,Dm->Comm); MPI_Allreduce(&Ai,&Ai_global,1,MPI_DOUBLE,MPI_SUM,Dm->Comm); MPI_Allreduce(&Ji,&Ji_global,1,MPI_DOUBLE,MPI_SUM,Dm->Comm); MPI_Barrier(Dm->Comm); PROFILE_STOP("ComputeScalar"); } void Minkowski::MeasureObject(){ /* * compute the distance to an object * * THIS ALGORITHM ASSUMES THAT id() is populated with phase id to distinguish objects * 0 - labels the object * 1 - labels the rest of the */ //DoubleArray smooth_distance(Nx,Ny,Nz); for (int k=0; k -2.5) { double new_distance = factor*log((1.0+value)/(1.0-value)); if (dist_value*new_distance < 0.0 ) new_distance = (-1.0)*new_distance; distance(i,j,k) = new_distance; } } } } ComputeScalar(distance,0.0); } int Minkowski::MeasureConnectedPathway(){ /* * compute the connected pathway for object with LABEL in id field * compute the labels for connected components * compute the distance to the connected pathway * * THIS ALGORITHM ASSUMES THAT id() is populated with phase id to distinguish objects */ char LABEL = 0; for (int k=0; krank_info,distance,distance,vF,vF,label,Dm->Comm); // int n_connected_components = ComputeGlobalPhaseComponent(Nx-2,Ny-2,Nz-2,Dm->rank_info,const IntArray &PhaseID, int &VALUE, BlobIDArray &GlobalBlobID, Dm->Comm ) MPI_Barrier(Dm->Comm); for (int k=0; krank_info,distance,distance,vF,vF,label,Dm->Comm); // int n_connected_components = ComputeGlobalPhaseComponent(Nx-2,Ny-2,Nz-2,Dm->rank_info,const IntArray &PhaseID, int &VALUE, BlobIDArray &GlobalBlobID, Dm->Comm ) MPI_Barrier(Dm->Comm); for (int k=0; krank()==0){ fprintf(LOGFILE,"%.5g %.5g %.5g %.5g\n",Vi_global, Ai_global, Ji_global, Xi_global); // minkowski measures fflush(LOGFILE); } }