LBPM/tests/test_dcel_minkowski.cpp

103 lines
2.8 KiB
C++
Raw Normal View History

2013-11-25 15:08:49 -06:00
#include <iostream>
#include <math.h>
2018-09-09 22:54:45 -05:00
#include "analysis/Minkowski.h"
#include "common/Domain.h"
2018-05-16 09:16:11 -05:00
#include "common/SpherePack.h"
2013-11-25 15:08:49 -06:00
#include "ProfilerApp.h"
2013-11-25 15:08:49 -06:00
/*
* Compare the measured and analytical curvature for a sphere
*
*/
2018-09-10 22:56:22 -05:00
std::shared_ptr<Database> loadInputs( )
2018-09-10 22:08:49 -05:00
{
//auto db = std::make_shared<Database>( "Domain.in" );
auto db = std::make_shared<Database>();
db->putScalar<int>( "BC", 0 );
db->putVector<int>( "nproc", { 1, 1, 1 } );
2018-09-14 15:04:35 -05:00
db->putVector<int>( "n", { 32, 32, 32 } );
2018-09-10 22:08:49 -05:00
db->putScalar<int>( "nspheres", 1 );
db->putVector<double>( "L", { 1, 1, 1 } );
return db;
}
2013-11-25 15:08:49 -06:00
int main(int argc, char **argv)
{
2021-01-04 18:33:27 -06:00
Utilities::startup( argc, argv );
2020-01-28 07:51:32 -06:00
Utilities::MPI comm( MPI_COMM_WORLD );
2018-09-10 22:08:49 -05:00
int toReturn = 0;
{
int i,j,k;
2013-11-25 15:08:49 -06:00
2018-09-10 22:08:49 -05:00
// Load inputs
2018-09-10 22:56:22 -05:00
auto db = loadInputs( );
2018-09-10 22:08:49 -05:00
int Nx = db->getVector<int>( "n" )[0];
int Ny = db->getVector<int>( "n" )[1];
int Nz = db->getVector<int>( "n" )[2];
auto Dm = std::make_shared<Domain>( db, comm );
Nx+=2; Ny+=2; Nz+=2;
2018-09-10 22:08:49 -05:00
DoubleArray Phase(Nx,Ny,Nz);
2018-09-14 15:04:35 -05:00
2018-09-13 12:20:57 -05:00
Minkowski plane(Dm);
2018-09-10 22:08:49 -05:00
2018-09-14 15:04:35 -05:00
printf("Set distance map for plane \n");
2018-09-10 22:08:49 -05:00
for (k=0; k<Nz; k++){
for (j=0; j<Ny; j++){
for (i=0; i<Nx; i++){
2018-09-13 12:20:57 -05:00
Phase(i,j,k) = k-0.5*double(Nz+1);
2018-09-10 16:29:48 -05:00
}
2018-09-09 20:16:12 -05:00
}
}
2013-11-25 15:08:49 -06:00
2018-09-14 15:04:35 -05:00
printf(" Construct local isosurface \n");
2018-09-13 12:20:57 -05:00
plane.ComputeScalar(Phase,0.f);
2018-09-10 22:08:49 -05:00
2018-09-14 15:04:35 -05:00
printf(" Surface area = %f (analytical = %f) \n", plane.Ai,double((Nx-2)*(Ny-2)));
printf(" Mean curvature = %f (analytical =0) \n", plane.Ji);
printf(" Euler characteristic = %f (analytical = 0) \n",plane.Xi);
2018-09-13 12:07:59 -05:00
2018-09-13 21:31:19 -05:00
Minkowski cylinder(Dm);
2018-09-14 15:04:35 -05:00
printf("Set distance map for cylinder \n");
2018-09-13 21:31:19 -05:00
for (k=0; k<Nz; k++){
for (j=0; j<Ny; j++){
for (i=0; i<Nx; i++){
2018-09-14 15:04:35 -05:00
Phase(i,j,k) = sqrt((1.0*i-0.5*Nx)*(1.0*i-0.5*Nx)+(1.0*k-0.5*Nz)*(1.0*k-0.5*Nz))-0.4*Nx;
2018-09-13 21:31:19 -05:00
}
}
}
2018-09-14 15:04:35 -05:00
printf(" Construct local isosurface \n");
2018-09-13 21:31:19 -05:00
cylinder.ComputeScalar(Phase,0.f);
2018-09-14 15:04:35 -05:00
printf(" Surface area = %f (analytical = %f) \n", cylinder.Ai,2*3.14159*0.4*double((Nx-2)*Nx));
printf(" Mean curvature = %f (analytical = %f) \n", cylinder.Ji,2*3.14159*double((Nx-2)));
printf(" Euler characteristic = %f (analytical = 0) \n",cylinder.Xi);
2018-09-13 12:20:57 -05:00
Minkowski sphere(Dm);
2018-09-13 12:07:59 -05:00
2018-09-14 15:04:35 -05:00
printf("Set distance map for a sphere \n");
2018-09-13 12:07:59 -05:00
for (k=0; k<Nz; k++){
for (j=0; j<Ny; j++){
for (i=0; i<Nx; i++){
2018-09-14 15:04:35 -05:00
Phase(i,j,k) = sqrt((1.0*i-0.5*Nx)*(1.0*i-0.5*Nx)+(1.0*j-0.5*Ny)*(1.0*j-0.5*Ny)+(1.0*k-0.5*Nz)*(1.0*k-0.5*Nz))-0.4*Nx;
}
2018-09-13 12:07:59 -05:00
}
}
2018-09-14 15:04:35 -05:00
printf(" Construct local isosurface \n");
2018-09-13 12:20:57 -05:00
sphere.ComputeScalar(Phase,0.f);
2014-06-06 07:30:12 -05:00
2018-09-14 15:04:35 -05:00
printf(" Surface area = %f (analytical = %f) \n", sphere.Ai,4*3.14159*0.16*double(Nx*Nx));
printf(" Mean curvature = %f (analytical = %f) \n", sphere.Ji,8*3.14159*0.4*double(Nx));
printf(" Euler characteristic = %f (analytical = 2.0) \n",sphere.Xi);
2014-06-06 07:30:12 -05:00
}
PROFILE_SAVE("test_dcel_minkowski");
2020-10-08 10:03:42 -05:00
Utilities::shutdown();
2021-01-04 18:33:27 -06:00
return toReturn;
2013-11-25 15:08:49 -06:00
}