本文整理汇总了C++中MultiBlockLattice3D类的典型用法代码示例。如果您正苦于以下问题:C++ MultiBlockLattice3D类的具体用法?C++ MultiBlockLattice3D怎么用?C++ MultiBlockLattice3D使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了MultiBlockLattice3D类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: writeResults
void writeResults(MultiBlockLattice3D<T,DESCRIPTOR>& lattice, MultiScalarField3D<T>& volumeFraction, plint iT)
{
static const plint nx = lattice.getNx();
static const plint ny = lattice.getNy();
static const plint nz = lattice.getNz();
Box3D slice(0, nx-1, ny/2, ny/2, 0, nz-1);
ImageWriter<T> imageWriter("leeloo");
imageWriter.writeScaledPpm(createFileName("u", iT, 6),
*computeVelocityNorm(lattice, slice));
imageWriter.writeScaledPpm(createFileName("rho", iT, 6),
*computeDensity(lattice, slice));
imageWriter.writeScaledPpm(createFileName("volumeFraction", iT, 6), *extractSubDomain(volumeFraction, slice));
// Use a marching-cube algorithm to reconstruct the free surface and write an STL file.
std::vector<T> isoLevels;
isoLevels.push_back((T) 0.5);
typedef TriangleSet<T>::Triangle Triangle;
std::vector<Triangle> triangles;
isoSurfaceMarchingCube(triangles, volumeFraction, isoLevels, volumeFraction.getBoundingBox());
TriangleSet<T>(triangles).writeBinarySTL(createFileName(outDir+"/interface", iT, 6)+".stl");
VtkImageOutput3D<T> vtkOut(createFileName("volumeFraction", iT, 6), 1.);
vtkOut.writeData<float>(volumeFraction, "vf", 1.);
}
示例2: cavitySetup
void cavitySetup( MultiBlockLattice3D<T,DESCRIPTOR>& lattice,
IncomprFlowParam<T> const& parameters,
OnLatticeBoundaryCondition3D<T,DESCRIPTOR>& boundaryCondition )
{
const plint nx = parameters.getNx();
const plint ny = parameters.getNy();
const plint nz = parameters.getNz();
Box3D topLid = Box3D(0, nx-1, ny-1, ny-1, 0, nz-1);
Box3D bottomLid = Box3D(0, nx-1, 0, 0, 0, nz-1);
Box3D everythingButTopLid = Box3D(0, nx-1, 0, ny-2, 0, nz-1);
/*
instantiateOuterNLDboundary(lattice, lattice.getBoundingBox());
setOuterNLDboundaryDynamics(lattice, lattice.getBackgroundDynamics().clone(),
lattice.getBoundingBox(), boundary::dirichlet);
setOuterNLDboundaryDynamics(lattice, lattice.getBackgroundDynamics().clone(), bottomLid, boundary::neumann);
defineDynamics(lattice, bottomLid, lattice.getBackgroundDynamics().clone());
*/
boundaryCondition.setVelocityConditionOnBlockBoundaries(lattice, lattice.getBoundingBox(), boundary::dirichlet);
T u = sqrt((T)2)/(T)2 * parameters.getLatticeU();
initializeAtEquilibrium(lattice, everythingButTopLid, (T) 1., Array<T,3>(0.,0.,0.) );
initializeAtEquilibrium(lattice, topLid, (T) 1., Array<T,3>(u,0.,u) );
setBoundaryVelocity(lattice, topLid, Array<T,3>(u,0.,u) );
lattice.initialize();
}
示例3: iniLattice
void iniLattice( MultiBlockLattice3D<T,DESCRIPTOR>& lattice,
VoxelizedDomain3D<T>& voxelizedDomain )
{
// Switch all remaining outer cells to no-dynamics, except the outer
// boundary layer, and keep the rest as BGKdynamics.
defineDynamics(lattice, voxelizedDomain.getVoxelMatrix(), lattice.getBoundingBox(),
new NoDynamics<T,DESCRIPTOR>, voxelFlag::outside);
initializeAtEquilibrium(lattice, lattice.getBoundingBox(), (T) 1., Array<T,3>((T)0.,(T)0.,(T)0.));
lattice.initialize();
}
示例4: writeGifs
void writeGifs(MultiBlockLattice3D<T,DESCRIPTOR>& lattice, plint iter)
{
const plint imSize = 600;
const plint nx = lattice.getNx();
const plint ny = lattice.getNy();
const plint nz = lattice.getNz();
Box3D slice(0, nx-1, 0, ny-1, nz/2, nz/2);
ImageWriter<T> imageWriter("leeloo");
imageWriter.writeScaledGif(createFileName("u", iter, 6),
*computeVelocityNorm(lattice, slice),
imSize, imSize );
}
示例5: channelSetup
void channelSetup( MultiBlockLattice3D<T,DESCRIPTOR>& lattice,
IncomprFlowParam<T> const& parameters,
OnLatticeBoundaryCondition3D<T,DESCRIPTOR>& boundaryCondition )
{
// Create Velocity boundary conditions
boundaryCondition.setVelocityConditionOnBlockBoundaries(lattice);
setBoundaryVelocity (
lattice, lattice.getBoundingBox(),
PoiseuilleVelocity<T>(parameters) );
lattice.initialize();
}
示例6: writeGifs
void writeGifs(MultiBlockLattice3D<T,DESCRIPTOR>& lattice, plint iter){
const plint nx = lattice.getNx();
const plint ny = lattice.getNy();
const plint nz = lattice.getNz();
const plint imSize = 600;
ImageWriter<T> imageWriter("leeloo");
Box3D slice(0, nx-1, 0, ny-1, nz/2, nz/2);
//imageWriter.writeGif(createFileName("u", iT, 6),
//*computeDensity(lattice), );
imageWriter.writeGif( createFileName("rho", iter, 6),
*computeDensity(lattice, slice),
(T) rho0 - drho/1000000, (T) rho0 + drho/1000000, imSize, imSize);
}
示例7: writeVTK
void writeVTK(MultiBlockLattice3D<T,DESCRIPTOR>& lattice,
IncomprFlowParam<T> const& parameters,
PhysUnits3D<T> const& units, plint iter)
{
T p_fact = units.getPhysForce(1)/pow(units.getPhysLength(1),2)/3.;
std::string fname(createFileName("vtk", iter, 6));
VtkImageOutput3D<T> vtkOut(fname, units.getPhysLength(1));
vtkOut.writeData<3,float>(*computeVelocity(lattice), "velocity", units.getPhysVel(1));
vtkOut.writeData<float>(*computeDensity(lattice), "density",units.getPhysDensity(1));
MultiScalarField3D<T> p(*computeDensity(lattice));
subtractInPlace(p,1.);
vtkOut.writeData<float>(p,"pressure",p_fact );
IBscalarQuantity sf = SolidFraction;
applyProcessingFunctional(new GetScalarQuantityFromDynamicsFunctional<T,DESCRIPTOR,T>(sf),
lattice.getBoundingBox(),lattice,p);
vtkOut.writeData<float>(p,"solidfraction",1. );
pcout << "wrote " << fname << std::endl;
}
示例8: main
int main(int argc, char* argv[]) {
plbInit(&argc, &argv);
global::directories().setOutputDir("./tmp/");
// Use the class IncomprFlowParam to convert from
// dimensionless variables to lattice units, in the
// context of incompressible flows.
IncomprFlowParam<T> parameters(
(T) 1e-2, // Reference velocity (the maximum velocity
// in the Poiseuille profile) in lattice units.
(T) 100., // Reynolds number
30, // Resolution of the reference length (channel height).
3., // Channel length in dimensionless variables
1., // Channel height in dimensionless variables
1. // Channel depth in dimensionless variables
);
const T imSave = (T)0.02; // Time intervals at which to save GIF
// images, in dimensionless time units.
const T maxT = (T)2.5; // Total simulation time, in dimensionless
// time units.
writeLogFile(parameters, "3D Poiseuille flow");
MultiBlockLattice3D<T, DESCRIPTOR> lattice (
parameters.getNx(), parameters.getNy(), parameters.getNz(),
new BGKdynamics<T,DESCRIPTOR>(parameters.getOmega()) );
OnLatticeBoundaryCondition3D<T,DESCRIPTOR>*
//boundaryCondition = createInterpBoundaryCondition3D<T,DESCRIPTOR>();
boundaryCondition = createLocalBoundaryCondition3D<T,DESCRIPTOR>();
channelSetup(lattice, parameters, *boundaryCondition);
// Main loop over time iterations.
for (plint iT=0; iT*parameters.getDeltaT()<maxT; ++iT) {
if (iT%parameters.nStep(imSave)==0) {
pcout << "Saving Gif at time step " << iT << endl;
writeGifs(lattice, iT);
}
// Execute lattice Boltzmann iteration.
lattice.collideAndStream();
}
delete boundaryCondition;
}
示例9: cavitySetup
void cavitySetup( MultiBlockLattice3D<T,DESCRIPTOR>& lattice,
IncomprFlowParam<T> const& parameters,
OnLatticeBoundaryCondition3D<T,DESCRIPTOR>& boundaryCondition )
{
const plint nx = parameters.getNx();
const plint ny = parameters.getNy();
const plint nz = parameters.getNz();
Box3D topLid = Box3D(0, nx-1, ny-1, ny-1, 0, nz-1);
Box3D everythingButTopLid = Box3D(0, nx-1, 0, ny-2, 0, nz-1);
boundaryCondition.setVelocityConditionOnBlockBoundaries(lattice);
T u = std::sqrt((T)2)/(T)2 * parameters.getLatticeU();
initializeAtEquilibrium(lattice, everythingButTopLid, (T)1., Array<T,3>((T)0.,(T)0.,(T)0.) );
initializeAtEquilibrium(lattice, topLid, (T)1., Array<T,3>(u,(T)0.,u) );
setBoundaryVelocity(lattice, topLid, Array<T,3>(u,(T)0.,u) );
lattice.initialize();
}
示例10: main
int main(int argc, char* argv[]) {
plbInit(&argc, &argv);
global::directories().setOutputDir("./tmp/");
IncomprFlowParam<T> parameters(
(T) 1e-2, // uMax
(T) 100., // Re
100, // N
1., // lx
1., // ly
1. // lz
);
const plint logIter = 10;
const plint imageIter = 60;
const plint checkPointIter = 200;
plint iniT, endT;
if (argc != 3) {
pcout << "Error; the syntax is \"" << argv[0] << " start-iter end-iter\"," << endl;
return -1;
}
stringstream iniTstr, endTstr;
iniTstr << argv[1]; iniTstr >> iniT;
endTstr << argv[2]; endTstr >> endT;
writeLogFile(parameters, "3D diagonal cavity");
MultiBlockLattice3D<T, DESCRIPTOR> lattice (
parameters.getNx(), parameters.getNy(), parameters.getNz(),
new BGKdynamics<T,DESCRIPTOR>(parameters.getOmega()) );
OnLatticeBoundaryCondition3D<T,DESCRIPTOR>* boundaryCondition
//= createInterpBoundaryCondition3D<T,DESCRIPTOR>();
= createLocalBoundaryCondition3D<T,DESCRIPTOR>();
cavitySetup(lattice, parameters, *boundaryCondition);
delete boundaryCondition;
// Load saved data from a previous simulation, if the initial time step
// is larger than zero.
if (iniT>0) {
//loadRawMultiBlock(lattice, "checkpoint.dat");
loadBinaryBlock(lattice, "checkpoint.dat");
}
// Main loop over time iterations.
for (plint iT=iniT; iT<endT; ++iT) {
if (iT%imageIter==0) {
pcout << "Writing Gif ..." << endl;
writeGifs(lattice, parameters, iT);
}
if (iT%checkPointIter==0 && iT>iniT) {
pcout << "Saving the state of the simulation ..." << endl;
//saveRawMultiBlock(lattice, "checkpoint.dat");
saveBinaryBlock(lattice, "checkpoint.dat");
}
// Lattice Boltzmann iteration step.
lattice.collideAndStream();
if (iT%logIter==0) {
pcout << "step " << iT
<< "; t=" << iT*parameters.getDeltaT()
<< "; av energy="
<< setprecision(10) << getStoredAverageEnergy<T>(lattice)
<< "; av rho="
<< setprecision(10) << getStoredAverageDensity<T>(lattice) << endl;
}
}
}
示例11: main
int main(int argc, char* argv[]) {
plbInit(&argc, &argv);
//defaultMultiBlockPolicy3D().toggleBlockingCommunication(true);
plint N;
try {
global::argv(1).read(N);
}
catch(...)
{
pcout << "Wrong parameters. The syntax is " << std::endl;
pcout << argv[0] << " N" << std::endl;
pcout << "where N is the resolution. The benchmark cases published " << std::endl;
pcout << "on the Palabos Wiki use N=100, N=400, N=1000, or N=4000." << std::endl;
exit(1);
}
pcout << "Starting benchmark with " << N+1 << "x" << N+1 << "x" << N+1 << " grid points "
<< "(approx. 2 minutes on modern processors)." << std::endl;
IncomprFlowParam<T> parameters(
(T) 1e-2, // uMax
(T) 1., // Re
N, // N
1., // lx
1., // ly
1. // lz
);
MultiBlockLattice3D<T, DESCRIPTOR> lattice (
parameters.getNx(), parameters.getNy(), parameters.getNz(),
new BGKdynamics<T,DESCRIPTOR>(parameters.getOmega()) );
plint numCores = global::mpi().getSize();
pcout << "Number of MPI threads: " << numCores << std::endl;
// Current cores run approximately at 5 Mega Sus.
T estimateSus= 5.e6*numCores;
// The benchmark should run for approximately two minutes
// (2*60 seconds).
T wishNumSeconds = 60.;
plint numCells = lattice.getBoundingBox().nCells();
// Run at least three iterations.
plint numIter = std::max( (plint)3,
(plint)(estimateSus*wishNumSeconds/numCells+0.5));
OnLatticeBoundaryCondition3D<T,DESCRIPTOR>* boundaryCondition
= createLocalBoundaryCondition3D<T,DESCRIPTOR>();
cavitySetup(lattice, parameters, *boundaryCondition);
// Run the benchmark once "to warm up the machine".
for (plint iT=0; iT<numIter; ++iT) {
lattice.collideAndStream();
}
// Run the benchmark for good.
global::timer("benchmark").start();
global::profiler().turnOn();
for (plint iT=0; iT<numIter; ++iT) {
lattice.collideAndStream();
}
pcout << "After " << numIter << " iterations: "
<< (T) (numCells*numIter) /
global::timer("benchmark").getTime() / 1.e6
<< " Mega site updates per second." << std::endl << std::endl;
global::profiler().writeReport();
delete boundaryCondition;
}
示例12: main
int main(int argc, char* argv[]) {
plbInit(&argc, &argv);
global::directories().setOutputDir("./tmp/");
IncomprFlowParam<T> parameters(
(T) 1e-2, // uMax
(T) 10., // Re
30, // N
1., // lx
1., // ly
1. // lz
);
const T logT = (T)1/(T)100;
const T imSave = (T)1/(T)10;
const T vtkSave = (T)1;
const T maxT = (T)10.1;
pcout << "omega= " << parameters.getOmega() << std::endl;
writeLogFile(parameters, "3D diagonal cavity");
T omega = parameters.getOmega();
#ifdef USE_MRT
plint mrtId = 0;
mrtParam<T,DESCRIPTOR>().set(mrtId,MRTparam<T,DESCRIPTOR>(omega));
#endif
MultiBlockLattice3D<T, DESCRIPTOR> lattice (
parameters.getNx(), parameters.getNy(), parameters.getNz(), DYNAMICS );
#ifdef USE_ASINARI
integrateProcessingFunctional(new AsinariPostCollide3D<T,DESCRIPTOR>, lattice.getBoundingBox(), lattice, 0);
#endif
OnLatticeBoundaryCondition3D<T,DESCRIPTOR>* boundaryCondition
//= createInterpBoundaryCondition3D<T,DESCRIPTOR>();
= createLocalBoundaryCondition3D<T,DESCRIPTOR>();
cavitySetup(lattice, parameters, *boundaryCondition);
T previousIterationTime = T();
// Loop over main time iteration.
for (plint iT=0; iT<parameters.nStep(maxT); ++iT) {
global::timer("mainLoop").restart();
if (iT%parameters.nStep(imSave)==0) {
pcout << "Writing Gif ..." << endl;
writeGifs(lattice, parameters, iT);
}
if (iT%parameters.nStep(vtkSave)==0 && iT>0) {
pcout << "Saving VTK file ..." << endl;
writeVTK(lattice, parameters, iT);
}
if (iT%parameters.nStep(logT)==0) {
pcout << "step " << iT
<< "; t=" << iT*parameters.getDeltaT();
}
// Execute a time iteration.
lattice.collideAndStream();
// Access averages from internal statistics ( their value is defined
// only after the call to lattice.collideAndStream() )
if (iT%parameters.nStep(logT)==0) {
pcout << "; av energy="
<< setprecision(10) << getStoredAverageEnergy<T>(lattice)
<< "; av rho="
<< setprecision(10) << getStoredAverageDensity<T>(lattice) << endl;
pcout << "Time spent during previous iteration: "
<< previousIterationTime << endl;
}
previousIterationTime = global::timer("mainLoop").stop();
}
delete boundaryCondition;
}
示例13: main
int main(int argc, char* argv[]) {
/// === 1st Step: Initialization ===
olbInit(&argc, &argv);
singleton::directories().setOutputDir("./tmp/");
OstreamManager clout(std::cout,"main");
LBconverter<T> converter(
(int) 3, // dim
(T) 1./20., // latticeL_
(T) 4e-2, // latticeU_
(T) 1./100., // charNu_
(T) 1. // charL_ = 1,
);
writeLogFile(converter, "backwardFacingStep2d");
/// === 3rd Step: Prepare Lattice ===
//const T maxT = (T)100.1;
const T maxT = (T)0.21;
writeLogFile(converter, "3D backward facing step");
#ifndef PARALLEL_MODE_MPI // sequential program execution
BlockLattice3D<T, DESCRIPTOR> lattice(
converter.numNodes(18), converter.numNodes(1.5), converter.numNodes(1.5) );
#else // parallel program execution
MultiBlockLattice3D<T, DESCRIPTOR> lattice ( createRegularDataDistribution(
//converter.numNodes(18), converter.numNodes(1.5), converter.numNodes(1.5) ) );//401*31*31
converter.numNodes(36), converter.numNodes(12), converter.numNodes(12) ) );
#endif
ConstRhoBGKdynamics<T, DESCRIPTOR> bulkDynamics (
converter.getOmega(),
instances::getBulkMomenta<T,DESCRIPTOR>()
);
// choose between local and non-local boundary condition
OnLatticeBoundaryCondition3D<T,DESCRIPTOR>*
//boundaryCondition = createInterpBoundaryCondition3D(lattice);
boundaryCondition = createLocalBoundaryCondition3D(lattice);
prepareLattice(converter, lattice, bulkDynamics, *boundaryCondition);
/// === 4th Step: Main Loop with Timer ===
T st, et;
int iT=0;
st=time_sec();
// setBoundaryValues(converter, lattice, iT);
et=time_sec();
cout << "set boundary: " << et - st << endl;
st=time_sec();
lattice.collideAndStream();
getResults(lattice, converter, iT, maxT);
//for (iT=0; iT < converter.numTimeSteps(maxT); ++iT) {
//for (iT=1; iT < converter.numTimeSteps(maxT); ++iT) {
for (iT=1; iT < 100; ++iT) {
/// === 5th Step: Definition of Initial and Boundary Conditions ===
setBoundaryValues(converter, lattice, iT);
/// === 6th Step: Collide and Stream Execution ===
lattice.collideAndStream();
/// === 7th Step: Computation and Output of the Results ===
getResults(lattice, converter, iT, maxT);
}
et=time_sec();
cout << "steps:"<<converter.numTimeSteps(maxT)<<"kernel time: " << et - st << endl;
std::cout<<"nx:"<<converter.numNodes(36)<<"ny:"<<converter.numNodes(12)<<"nz:"<<converter.numNodes(12)<<std::endl;
delete boundaryCondition;
}
示例14: writeVTK
void writeVTK(MultiBlockLattice3D<T,DESCRIPTOR>& lattice, plint iter){
VtkImageOutput3D<T> vtkOut(createFileName("vtk", iter, 6), 1.);
vtkOut.writeData<float>(*computeDensity(lattice), "density", 1.);
std::auto_ptr<MultiScalarField3D<T> > velocity(plb::computeVelocityComponent(lattice, lattice.getBoundingBox(), 2));
vtkOut.writeData<T>(*velocity, "velocity", 1.);
}
示例15: main
int main(int argc, char* argv[]) {
plbInit(&argc, &argv);
T uMax;
plint N;
T nu_f,d_part,v_frac, v_inf;
std::string outDir;
try {
global::argv(1).read(d_part);
global::argv(2).read(N);
global::argv(3).read(v_frac);
global::argv(4).read(nu_f);
global::argv(5).read(v_inf);
global::argv(6).read(uMax);
global::argv(7).read(outDir);
} catch(PlbIOException& exception) {
pcout << exception.what() << endl;
pcout << "Command line arguments:\n";
pcout << "1 : d_part\n";
pcout << "2 : N per particle diameter\n";
pcout << "3 : particle volume fraction\n";
pcout << "4 : nu_fluid\n";
pcout << "5 : estimated v_inf\n";
pcout << "6 : uMax\n";
pcout << "7 : outDir\n";
exit(1);
}
std::string lbOutDir(outDir), demOutDir(outDir);
lbOutDir.append("tmp/");
demOutDir.append("post/");
global::directories().setOutputDir(lbOutDir);
const T rho_f = 1000;
LiggghtsCouplingWrapper wrapper(argv,global::mpi().getGlobalCommunicator());
// particle size and volume fraction are handed over to LIGGGHTS
// as variables (see LIGGGHTS docu for details)
wrapper.setVariable("r_part",d_part/2);
wrapper.setVariable("v_frac",v_frac);
wrapper.execFile("in.lbdem");
T g = 9.81;
const T lx = 1., ly = 1., lz = 2.;
T r_ = d_part/2.;
T rho_s = 1100.;
T m = r_*r_*r_*4./3.*3.14*rho_s;
PhysUnits3D<T> units(2.*r_,v_inf,nu_f,lx,ly,lz,N,uMax,rho_f);
IncomprFlowParam<T> parameters(units.getLbParam());
plint nx = parameters.getNx(), ny = parameters.getNy(), nz = parameters.getNz();
// get lattice decomposition from LIGGGHTS and create lattice according to parallelization
// given in the LIGGGHTS input script
LatticeDecomposition lDec(parameters.getNx(),parameters.getNy(),parameters.getNz(),
wrapper.lmp);
SparseBlockStructure3D blockStructure = lDec.getBlockDistribution();
ExplicitThreadAttribution* threadAttribution = lDec.getThreadAttribution();
plint envelopeWidth = 1;
MultiBlockLattice3D<T, DESCRIPTOR>
lattice (MultiBlockManagement3D (blockStructure, threadAttribution, envelopeWidth ),
defaultMultiBlockPolicy3D().getBlockCommunicator(),
defaultMultiBlockPolicy3D().getCombinedStatistics(),
defaultMultiBlockPolicy3D().getMultiCellAccess<T,DESCRIPTOR>(),
new DYNAMICS );
defineDynamics(lattice,lattice.getBoundingBox(),new DYNAMICS);
const T maxT = ceil(3.*lz/v_inf);
const T vtkT = 0.1;
const T logT = 0.0000001;
const plint maxSteps = units.getLbSteps(maxT);
const plint vtkSteps = max<plint>(units.getLbSteps(vtkT),1);
const plint logSteps = max<plint>(units.getLbSteps(logT),1);
writeLogFile(parameters, "sedimenting spheres benchmark");
lattice.initialize();
T dt_phys = units.getPhysTime(1);
plint demSubsteps = 10;
T dt_dem = dt_phys/(T)demSubsteps;
//.........这里部分代码省略.........