rayleigh_benard2d.cpp

来自「open lattice boltzmann project www.open」· C++ 代码 · 共 293 行

CPP
293
字号
/*  This file is part of the OpenLB library * *  Copyright (C) 2008 Orestis Malaspinas *  Address: EPFL-STI-LIN Station 9, 1015 Lausanne, Switzerland *  E-mail: orestis.malaspinas@epfl.ch * *  This program is free software; you can redistribute it and/or *  modify it under the terms of the GNU General Public License *  as published by the Free Software Foundation; either version 2 *  of the License, or (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public  *  License along with this program; if not, write to the Free *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *  Boston, MA  02110-1301, USA.*/#include "olb2D.h"#include "olb2D.hh"#include <vector>#include <cmath>#include <iostream>#include <iomanip>#include <fstream>using namespace olb;using namespace olb::descriptors;using namespace olb::graphics;using namespace std;typedef double T;#define NSDESCRIPTOR ForcedD2Q9Descriptor#define TDESCRIPTOR AdvectionDiffusionD2Q5Descriptorconst int maxIter  = 1000000000;const int saveIter = 2500;void iniGeometry( BlockStructure2D<T, NSDESCRIPTOR>& NSlattice,                  BlockStructure2D<T, TDESCRIPTOR>& ADlattice,                  ForcedBGKdynamics<T, NSDESCRIPTOR> &bulkDynamics,                  Dynamics<T, TDESCRIPTOR>& advectionDiffusionBulkDynamics,                  OnLatticeBoundaryCondition2D<T,NSDESCRIPTOR>& NSboundaryCondition,                  OnLatticeAdvectionDiffusionBoundaryCondition2D<T,TDESCRIPTOR>& TboundaryCondition,                  AdvectionDiffusionUnitLB<T,NSDESCRIPTOR,TDESCRIPTOR> &converter                ){	typedef advectionDiffusionLbHelpers<T,TDESCRIPTOR> TlbH;    int nx = ADlattice.getNx();    int ny = ADlattice.getNy();        double Tomega  = converter.getOmegaT();	double NSomega = converter.getOmegaNS();    cout << "defining dynamics" << endl;    ADlattice.defineDynamics(0,nx-1, 0,ny-1, &advectionDiffusionBulkDynamics);    NSlattice.defineDynamics(0,nx-1, 0,ny-1, &bulkDynamics);        NSboundaryCondition.addVelocityBoundary1P(0,nx-1,ny-1,ny-1, NSomega);    NSboundaryCondition.addVelocityBoundary1N(0,nx-1,   0,   0, NSomega);        TboundaryCondition.addTemperatureBoundary1P(0,nx-1,ny-1,ny-1, Tomega);    TboundaryCondition.addTemperatureBoundary1N(0,nx-1,   0,   0, Tomega);        for (int iX=0; iX<nx; ++iX) {        for (int iY=0; iY<ny; ++iY) {            T u[2] = {0.,0.};            T rho = (T)1;            NSlattice.get(iX,iY).defineRhoU(rho, u);            NSlattice.get(iX,iY).iniEquilibrium(rho, u);            T force[2] = {T(), T()};            NSlattice.get(iX,iY).defineExternalField (                    NSDESCRIPTOR<T>::ExternalField::forceBeginsAt,                    NSDESCRIPTOR<T>::ExternalField::sizeOfForce,                    force );        }    }        T Tcold = converter.getTcold();    T Thot  = converter.getThot();        for (int iX=0; iX<nx; ++iX) {        for (int iY=0; iY<ny; ++iY) {            T u[2] = {0.,0.};            T temperature =Tcold;            if (iY==0)            	temperature = Thot;                        ADlattice.get(iX,iY).defineRho(temperature);            T tEq[TDESCRIPTOR<T>::q];            for (int iPop = 0; iPop < TDESCRIPTOR<T>::q; ++iPop) {                tEq[iPop] = TlbH::equilibrium(iPop,temperature,u);            }            ADlattice.get(iX,iY).definePopulations(tEq);            ADlattice.get(iX,iY).defineExternalField (                    TDESCRIPTOR<T>::ExternalField::velocityBeginsAt,                    TDESCRIPTOR<T>::ExternalField::sizeOfVelocity,                    u );        }    }        ADlattice.get(nx/2,1).defineRho(Thot+Thot/(T)5);        NSlattice.initialize();    ADlattice.initialize();}void couplingBetweenNavierStokesAndAdvectionDiffusion(        BlockStructure2D<T, TDESCRIPTOR>& ADlattice,        BlockStructure2D<T,NSDESCRIPTOR>& NSlattice,        AdvectionDiffusionUnitLB<T,NSDESCRIPTOR,TDESCRIPTOR> &converter){        int nx = NSlattice.getNx();    int ny = NSlattice.getNy();        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//    // This coupling must be necessarily be put on the Navier-Stokes lattice!!    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//	    std::vector<SpatiallyExtendedObject2D* > partnerForNavierStokes;        partnerForNavierStokes.push_back(&ADlattice);    partnerForNavierStokes.push_back(&NSlattice);        std::vector<T> dir;    dir.push_back(T());    dir.push_back((T)1);        NavierStokesAdvectionDiffusionCouplingGenerator2D<T,NSDESCRIPTOR>             coupling(0,nx-1,0,ny-1, converter.getGravity(),                       converter.getT0(), converter.getDeltaTemperature(), dir);        NSlattice.addLatticeCoupling(coupling,partnerForNavierStokes);}void plotStatistics(BlockStructure2D<T, NSDESCRIPTOR>&    NSlattice,                    BlockStructure2D<T, TDESCRIPTOR>&    ADlattice, int iT){	cout << "Writing Gif\n";    ImageWriter<T> imageCreator("leeloo.map");    imageCreator.writeScaledGif(createFileName("t", iT, 7),                                ADlattice.getDataAnalysis().getPressure(),                                600,300);    imageCreator.writeScaledGif(createFileName("uy", iT, 6),                                NSlattice.getDataAnalysis().getVelocityNorm(),                                600,300);}T computeNusselt(BlockStructure2D<T, NSDESCRIPTOR>& NSlattice,                  BlockStructure2D<T,TDESCRIPTOR> &ADlattice,                 AdvectionDiffusionUnitLB<T,NSDESCRIPTOR,TDESCRIPTOR> &converter){    int nx = NSlattice.getNx();    int ny = NSlattice.getNy();        T u_T = T();    for (int iX = 0; iX < nx; ++iX)    {        for (int iY = 0; iY < ny; ++iY)        {            const T uy =                    NSlattice.getDataAnalysis().getVelocity().extractComponent(1).get(iX,iY);            u_T += uy * ADlattice.get(iX,iY).computeRho();        }    }    T nusselt = (T)1 + u_T*converter.getDeltaX() /            (converter.getKappa() *            (converter.getThot()-converter.getTcold()));        return nusselt;}int main(int argc, char *argv[]){    olbInit(&argc, &argv);    singleton::directories().setOutputDir("./tmp/");        if (argc != 5)    {        cout << "Error : Wrong parameters specified." << endl;        cout << "1 : Rayleigh." << endl;        cout << "2 : Prandtl." << endl;        cout << "3 : N." << endl;        cout << "4 : Delta t." << endl;        exit(1);    }	const double Ra    = atof(argv[1]);    const double Pr    = atof(argv[2]);    const int N        = atoi(argv[3]);    const double dt = atof(argv[4]);        AdvectionDiffusionUnitLB<T,NSDESCRIPTOR,TDESCRIPTOR> converter(                                      Ra,   // Ra                                      Pr,   // Pr                                      0.0,  // Tcold                                      1.0,  // Thot                                      N,    // N                                      dt,   // dt                                      2.0,  // lx                                      1.0   // ly                                      );	writeLogFile<T,NSDESCRIPTOR,TDESCRIPTOR>(converter,"2D rayleigh-benard");        const double Raprova = converter.getN() * converter.getN() *             converter.getN() * converter.getDeltaTemperature() *             converter.getGravity() / (converter.getNu()*converter.getKappa());    const double Prprova = converter.getNu() / converter.getKappa();    cout << Raprova << " " << Prprova << endl;    cout << converter.getOmegaNS() << " " << converter.getOmegaT() << endl;    int nx = converter.getNx();    int ny = converter.getNy();    #ifndef PARALLEL_MODE_MPI  // sequential program execution    MultiDataDistribution2D distribution = createRegularDataDistribution( nx, ny, 1, 1, 1 );#else                      // parallel program execution    MultiDataDistribution2D distribution = createRegularDataDistribution( nx, ny );#endif     MultiBlockLattice2D<T, TDESCRIPTOR> ADlattice(distribution);     MultiBlockLattice2D<T, NSDESCRIPTOR> NSlattice(distribution);    OnLatticeBoundaryCondition2D<T,NSDESCRIPTOR>* NSboundaryCondition =        createLocalBoundaryCondition2D(NSlattice);                OnLatticeAdvectionDiffusionBoundaryCondition2D<T,TDESCRIPTOR>* TboundaryCondition =        createAdvectionDiffusionBoundaryCondition2D(ADlattice);            ForcedBGKdynamics<T, NSDESCRIPTOR> NSbulkDynamics(            converter.getOmegaNS(),            instances::getBulkMomenta<T,NSDESCRIPTOR>());        AdvectionDiffusionRLBdynamics<T, TDESCRIPTOR> TbulkDynamics (                      converter.getOmegaT(),                      instances::getAdvectionDiffusionBulkMomenta<T,TDESCRIPTOR>()    );                couplingBetweenNavierStokesAndAdvectionDiffusion(ADlattice, NSlattice, converter);    iniGeometry(NSlattice, ADlattice,                 NSbulkDynamics, TbulkDynamics,                 *NSboundaryCondition, *TboundaryCondition,                converter );	util::ValueTracer<T> converge(0.01,(T)ny,1.0e-5);    int iT = 0;    cout << "starting simulation" << endl;    for (iT=0; iT<maxIter; ++iT)    {                if (converge.hasConverged())        {            cout << "FINAL CONVERGENCE!!! " << endl;            break;        }                if (iT%saveIter==0)        {             cout << "Writing stats at time " << iT << ".\n";             cout << ADlattice.getStatistics().getAverageEnergy() << endl;             plotStatistics(NSlattice, ADlattice, iT );        }                ADlattice.collideAndStream(true);        NSlattice.collideAndStream(true);                converge.takeValue(ADlattice.getStatistics().getAverageEnergy(),true);                NSlattice.executeCoupling();        ADlattice.executeCoupling();    }    cout << "Time " << iT << ".\n";    cout << "Nusselt = " << computeNusselt(NSlattice, ADlattice, converter) << endl;    delete NSboundaryCondition;    delete TboundaryCondition;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?