// Compute the signed distance from a digitized image // Two phases are present // Phase 1 has value -1 // Phase 2 has value 1 // this code uses the segmented image to generate the signed distance #include #include #include #include #include #include "common/Array.h" #include "common/Domain.h" #include "IO/Writer.h" #include "analysis/distance.h" std::shared_ptr loadInputs( int nprocs ) { std::vector nproc; if ( nprocs == 1 ) { nproc = { 1, 1, 1 }; } else if ( nprocs == 8 ) { nproc = { 2, 2, 2 }; } else { ERROR("TestSegDist: Unsupported number of processors"); } auto db = std::make_shared( ); db->putScalar( "BC", 0 ); db->putVector( "nproc", nproc ); db->putVector( "n", { 200, 200, 200 } ); db->putScalar( "nspheres", 0 ); db->putVector( "L", { 1, 1, 1 } ); return db; } //*************************************************************************************** int main(int argc, char **argv) { // Initialize MPI Utilities::startup( argc, argv ); Utilities::MPI comm( MPI_COMM_WORLD ); int rank = comm.getRank(); int nprocs = comm.getSize(); { // Load inputs auto db = loadInputs( nprocs ); int Nx = db->getVector( "n" )[0]; int Ny = db->getVector( "n" )[1]; int Nz = db->getVector( "n" )[2]; // Get the rank info Domain Dm(db,comm); for (int k=0;k id(nx,ny,nz); id.fill(0); for (int k=1; k ID0(id.size()); ID0.copy( id ); Array ID(Nx,Ny,Nz); Array dist1(Nx,Ny,Nz); Array dist2(Nx,Ny,Nz); fillHalo fillData(Dm.Comm, Dm.rank_info,{Nx,Ny,Nz},{1,1,1},0,1); fillData.copy( ID0, ID ); fillData.copy( TrueDist, dist1 ); fillData.copy( Distance, dist2 ); std::vector 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, "TrueDist", dist1 ) ); data[0].vars.emplace_back( new IO::Variable( 1, IO::VariableType::VolumeVariable, "Distance", dist2 ) ); data[0].vars.emplace_back( new IO::Variable( 1, IO::VariableType::VolumeVariable, "error", dist2-dist1 ) ); IO::initialize( "", "silo", false ); IO::writeData( "testSegDist", data, MPI_COMM_WORLD ); } Utilities::shutdown(); return 0; }