int main(int argc, char *argv[]) { plbInit(&argc, &argv); if (argc != 2) { pcout << "Error : Wrong parameters specified." << endl; pcout << "1 : N." << endl; exit(1); } const plint N = atoi(argv[1]); const T Re = 1.0; const T alpha = 1.0; // womersley number const plint Nref = 10; const T uMaxRef = 0.01; const T uMax = uMaxRef /(T)N * (T)Nref; // needed to avoid compressibility errors. const T lx = 100.0; const T ly = 1.0; pcout << "uMaxRef=" << uMaxRef << std::endl; pcout << "uMax=" << uMax << std::endl; global::directories().setOutputDir("./tmp/"); IncomprFlowParam<T> parameters(uMax, Re, N, lx, ly); // The frequency of the force (lattice units) T frequency = (T)4*alpha*alpha*parameters.getLatticeNu() / (T)(parameters.getResolution()*parameters.getResolution()); // The amplitude of the forcing term (lattice units) T amplitude = 8. * parameters.getLatticeNu() * parameters.getLatticeU() / ( (T)(parameters.getResolution()*parameters.getResolution()) ); // Period of the force (lattice units) plint tPeriod = (plint)((T)2*pi/frequency + 0.5); writeLogFile(parameters,"palabos.log"); plint nx = parameters.getNx(); plint ny = parameters.getNy(); T omega = parameters.getOmega(); MultiBlockLattice2D<T, NSDESCRIPTOR> lattice ( nx,ny,new DYNAMICS ); OnLatticeBoundaryCondition2D<T,NSDESCRIPTOR>* boundaryCondition = createLocalBoundaryCondition2D<T,NSDESCRIPTOR>(); lattice.periodicity().toggle(0,true); channelSetup( lattice, parameters, *boundaryCondition, alpha, frequency, amplitude); pcout << "Starting simulation" << endl; const plint maxIter = tPeriod * 100; //const plint tSave = tPeriod / 24; T error = T(); lattice.getTimeCounter().resetTime(1); pcout << "Omega = " << omega << ", it period = " << tPeriod << endl; util::ValueTracer<T> converge(uMax,N,1.0e-3); plint iT = 0; for (iT = 0; iT < maxIter; ++iT) { // Updating the force in the whole domain Array<T,NSDESCRIPTOR<T>::d> force(womersleyForce((T)iT, amplitude, frequency, parameters),0.); setExternalVector(lattice,lattice.getBoundingBox(), NSDESCRIPTOR<T>::ExternalField::forceBeginsAt,force); T errorTemp = computeRMSerror( lattice,parameters,alpha,iT); error += errorTemp; //if (iT % tSave == 0) { // pcout << "Writing Gif at time : " << iT << std::endl; // writeGif(lattice,iT); //} if (iT % tPeriod == 0) { // The error is averaged over one period error /= (T)(tPeriod); pcout << "For N = " << N << ", Error = " << error << endl; converge.takeValue(error,true); if (converge.hasConverged()) { cout << "Simulation converged!\n"; break; } error = T(); } lattice.collideAndStream(); } pcout << "For N = " << N << ", Error = " << computeRMSerror ( lattice,parameters,alpha,iT, true) << endl; }
int main(int argc, char* argv[]) { plbInit(&argc, &argv); global::directories().setOutputDir("./tmp/"); IncomprFlowParam<T> parameters( (T) 1e-2, // uMax (T) 300., // Re 100, // N 5., // lx 1. // ly ); const T logT = (T)0.02; const T imSave = (T)0.1; const T vtkSave = (T)3.; const T maxT = (T)10.1; writeLogFile(parameters, "Poiseuille flow"); MultiBlockLattice2D<T, DESCRIPTOR> lattice ( parameters.getNx(), parameters.getNy(), new BGKdynamics<T,DESCRIPTOR>(parameters.getOmega()) ); lattice.periodicity().toggle(0, false); OnLatticeBoundaryCondition2D<T,DESCRIPTOR>* //boundaryCondition = createInterpBoundaryCondition2D<T,DESCRIPTOR>(); boundaryCondition = createLocalBoundaryCondition2D<T,DESCRIPTOR>(); defineCylinderGeometry(lattice, parameters); setupInletAndBulk(lattice, parameters, *boundaryCondition); //copyUnknownOnOutlet(lattice, parameters, *boundaryCondition); velocityNeumannOutlet(lattice, parameters, *boundaryCondition); lattice.initialize(); // Main loop over time iterations. for (plint iT=0; iT*parameters.getDeltaT()<maxT; ++iT) { if ((iT+1)%parameters.nStep(logT)==0) { pcout << computeAverageDensity(lattice) << endl; pcout << computeAverageEnergy(lattice) << endl; } if (iT%parameters.nStep(logT)==0) { pcout << "step " << iT << "; lattice time=" << lattice.getTimeCounter().getTime() << "; t=" << iT*parameters.getDeltaT() << "; av energy=" << setprecision(10) << getStoredAverageEnergy<T>(lattice) << "; av rho=" << getStoredAverageDensity<T>(lattice) << endl; } if (iT%parameters.nStep(imSave)==0) { pcout << "Saving Gif ..." << endl; writeGifs(lattice, iT); } if (iT%parameters.nStep(vtkSave)==0 && iT>0) { pcout << "Saving VTK file ..." << endl; writeVTK(lattice, parameters, iT); } // Lattice Boltzmann iteration step. lattice.collideAndStream(); } delete boundaryCondition; }
int main(int argc, char* argv[]) { plbInit(&argc, &argv); global::directories().setOutputDir("./tmp/"); T Re; // Reynolds number. plint N; // Resolution. //getParametersFromCommandLine(argc, argv, Re, N); getParametersFromParamFile(Re, N); IncomprFlowParam<T> parameters( (T) 1e-2, // uMax (T) 100., // Re 128, // N 1., // lx 1. // ly ); const T logT = (T)0.1; const T imSave = (T)0.2; const T maxT = (T)10.1; writeLogFile(parameters, "2D cavity"); MultiBlockLattice2D<T, DESCRIPTOR> lattice ( parameters.getNx(), parameters.getNy(), new BGKdynamics<T,DESCRIPTOR>(parameters.getOmega()) ); OnLatticeBoundaryCondition2D<T,DESCRIPTOR>* //boundaryCondition = createInterpBoundaryCondition2D<T,DESCRIPTOR>(); boundaryCondition = createLocalBoundaryCondition2D<T,DESCRIPTOR>(); cavitySetup(lattice, parameters, *boundaryCondition); // Main loop over time iterations. for (plint iT=0; iT*parameters.getDeltaT()<maxT; ++iT) { if ((iT+1)%parameters.nStep(logT)==0) { pcout << computeAverageDensity(lattice) << endl; pcout << computeAverageEnergy(lattice) << endl; } if (iT%parameters.nStep(logT)==0) { pcout << "step " << iT << "; lattice time=" << lattice.getTimeCounter().getTime() << "; t=" << iT*parameters.getDeltaT() << "; av energy=" << setprecision(10) << getStoredAverageEnergy<T>(lattice) << "; av rho=" << getStoredAverageDensity<T>(lattice) << endl; } if (iT%parameters.nStep(imSave)==0 && iT>0) { pcout << "Saving Gif ..." << endl; writeGifs(lattice, iT); pcout << endl; } // Lattice Boltzmann iteration step. lattice.collideAndStream(); } delete boundaryCondition; }