dataanalysis3d.hh

来自「open lattice boltzmann project www.open」· HH 代码 · 共 950 行 · 第 1/3 页

HH
950
字号
        }    }    flags.velFieldComputed = true;}template<typename T, template<typename U> class Lattice>void DataAnalysis3D<T,Lattice>::computeMomentumField() const {    if (flags.momentumFieldComputed) return;    fields.momentumField.construct();    for (int iX=0; iX<fields.momentumField.getNx(); ++iX) {        for (int iY=0; iY<fields.momentumField.getNy(); ++iY) {            for (int iZ=0; iZ<fields.momentumField.getNz(); ++iZ) {                T rho;                block.get(iX,iY,iZ).computeRhoU (                        rho, fields.momentumField.get(iX,iY,iZ) );                for (int iD=0; iD<Lattice<T>::d; ++iD) {                    fields.momentumField.get(iX,iY,iZ)[iD] *= rho;                }            }        }    }    flags.momentumFieldComputed = true;}template<typename T, template<typename U> class Lattice>void DataAnalysis3D<T,Lattice>::computePressureField() const {    if (flags.pressureFieldComputed) return;    fields.pressureField.construct();    for (int iX=0; iX<fields.pressureField.getNx(); ++iX) {        for (int iY=0; iY<fields.pressureField.getNy(); ++iY) {            for (int iZ=0; iZ<fields.pressureField.getNz(); ++iZ) {                fields.pressureField.get(iX,iY,iZ) =                    block.get(iX,iY,iZ).computeRho();                fields.pressureField.get(iX,iY,iZ) -= (T)1;                fields.pressureField.get(iX,iY,iZ) /= Lattice<T>::invCs2;            }        }    }    flags.pressureFieldComputed = true;}template<typename T, template<typename U> class Lattice>void DataAnalysis3D<T,Lattice>::computeVelocityNormField() const {    if (flags.velNormFieldComputed) return;    fields.velNormField.construct();    computeVelocityField();    for (size_t iEl=0; iEl<fields.velNormField.getSize(); ++iEl) {        fields.velNormField[iEl] = sqrt(util::normSqr<T,3>(fields.velField[iEl]));    }    flags.velNormFieldComputed = true;}template<typename T, template<typename U> class Lattice>void DataAnalysis3D<T,Lattice>::computeVorticityNormField() const {    if (flags.vortNormFieldComputed) return;    fields.vortNormField.construct();    computeVorticityField();    for (size_t iEl=0; iEl<fields.vortNormField.getSize(); ++iEl) {        fields.vortNormField[iEl] = sqrt(util::normSqr<T,3>(fields.vortField[iEl]));    }    flags.vortNormFieldComputed = true;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkVorticityX(int iX, int iY, int iZ) const {    OLB_PRECONDITION(flags.velFieldComputed);    OLB_PRECONDITION(iX>=1 && iX<=fields.vortField.getNx()-2);    OLB_PRECONDITION(iY>=1 && iY<=fields.vortField.getNy()-2);    OLB_PRECONDITION(iZ>=1 && iZ<=fields.vortField.getNz()-2);    T dyuz = bulkYderiv(iX,iY,iZ, 2, fields.velField);    T dzuy = bulkZderiv(iX,iY,iZ, 1, fields.velField);    return dyuz - dzuy;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkVorticityY(int iX, int iY, int iZ) const {    OLB_PRECONDITION(flags.velFieldComputed);    OLB_PRECONDITION(iX>=1 && iX<=fields.vortField.getNx()-2);    OLB_PRECONDITION(iY>=1 && iY<=fields.vortField.getNy()-2);    OLB_PRECONDITION(iZ>=1 && iZ<=fields.vortField.getNz()-2);    T dzux = bulkZderiv(iX,iY,iZ, 0, fields.velField);    T dxuz = bulkXderiv(iX,iY,iZ, 2, fields.velField);    return dzux - dxuz;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkVorticityZ(int iX, int iY, int iZ) const {    OLB_PRECONDITION(iX>=1 && iX<=fields.vortField.getNx()-2);    OLB_PRECONDITION(iY>=1 && iY<=fields.vortField.getNy()-2);    OLB_PRECONDITION(iZ>=1 && iZ<=fields.vortField.getNz()-2);    T dxuy = bulkXderiv(iX,iY,iZ, 1, fields.velField);    T dyux = bulkYderiv(iX,iY,iZ, 0, fields.velField);    return dxuy - dyux;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkXderiv (        int iX, int iY, int iZ, int iD,        TensorField3D<T,3> const& field) const{    OLB_PRECONDITION(iX>=1 && iX<=field.getNx()-2);    OLB_PRECONDITION(iY>=1 && iY<=field.getNy()-2);    OLB_PRECONDITION(iZ>=1 && iZ<=field.getNz()-2);    T dxu = fd::centralGradient(field.get(iX+1,iY,iZ)[iD],                                field.get(iX-1,iY,iZ)[iD]);    return dxu;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkYderiv (        int iX, int iY, int iZ, int iD,        TensorField3D<T,3> const& field) const{    OLB_PRECONDITION(iX>=1 && iX<=field.getNx()-2);    OLB_PRECONDITION(iY>=1 && iY<=field.getNy()-2);    OLB_PRECONDITION(iZ>=1 && iZ<=field.getNz()-2);    T dyu = fd::centralGradient(field.get(iX,iY+1,iZ)[iD],                                field.get(iX,iY-1,iZ)[iD]);    return dyu;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkZderiv (        int iX, int iY, int iZ, int iD,        TensorField3D<T,3> const& field) const{    OLB_PRECONDITION(iX>=1 && iX<=field.getNx()-2);    OLB_PRECONDITION(iY>=1 && iY<=field.getNy()-2);    OLB_PRECONDITION(iZ>=1 && iZ<=field.getNz()-2);    T dzu = fd::centralGradient(field.get(iX,iY,iZ+1)[iD],                                field.get(iX,iY,iZ-1)[iD]);    return dzu;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkDeriv (        int iX, int iY, int iZ, int iAlpha, int iBeta,        TensorField3D<T,3> const& field) const{    switch(iAlpha) {        case 0:            return bulkXderiv(iX,iY,iZ, iBeta, field);        case 1:            return bulkYderiv(iX,iY,iZ, iBeta, field);        case 2:            return bulkZderiv(iX,iY,iZ, iBeta, field);        default:            OLB_ASSERT( false, "iAlpha>2!");            return T();    }}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkStrain (    int iX, int iY, int iZ, int iAlpha, int iBeta) const{    OLB_PRECONDITION( flags.momentumFieldComputed );    return ( bulkDeriv(iX,iY,iZ, iAlpha,iBeta, fields.momentumField) +             bulkDeriv(iX,iY,iZ, iBeta,iAlpha, fields.momentumField) ) / (T)2;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkDivRhoU(int iX, int iY, int iZ) const {    OLB_PRECONDITION( flags.momentumFieldComputed );    return bulkDeriv(iX,iY,iZ, 0,0, fields.momentumField) +           bulkDeriv(iX,iY,iZ, 1,1, fields.momentumField) +           bulkDeriv(iX,iY,iZ, 2,2, fields.momentumField);}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::bulkPoisson(int iX, int iY, int iZ) const {    OLB_PRECONDITION( flags.velFieldComputed );    T dxux = bulkDeriv(iX,iY,iZ, 0,0, fields.velField);    T dxuy = bulkDeriv(iX,iY,iZ, 0,1, fields.velField);    T dxuz = bulkDeriv(iX,iY,iZ, 0,2, fields.velField);    T dyux = bulkDeriv(iX,iY,iZ, 1,0, fields.velField);    T dyuy = bulkDeriv(iX,iY,iZ, 1,1, fields.velField);    T dyuz = bulkDeriv(iX,iY,iZ, 1,2, fields.velField);    T dzux = bulkDeriv(iX,iY,iZ, 2,0, fields.velField);    T dzuy = bulkDeriv(iX,iY,iZ, 2,1, fields.velField);    T dzuz = bulkDeriv(iX,iY,iZ, 2,2, fields.velField);    return dxux*dxux + dyuy*dyuy + dzuz*dzuz +           (T)2*( dxuy*dyux + dxuz*dzux + dyuz*dzuy );}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::boundaryXderiv (        int iX, int iY, int iZ, int iD,        TensorField3D<T,3> const& field) const{    OLB_PRECONDITION(iX>=0 && iX<=field.getNx()-1);    OLB_PRECONDITION(iY>=0 && iY<=field.getNy()-1);    OLB_PRECONDITION(iZ>=0 && iZ<=field.getNz()-1);    T dxu;        if (iX==0) {        dxu = fd::boundaryGradient(field.get(iX,iY,iZ)[iD],                                   field.get(iX+1,iY,iZ)[iD],                                   field.get(iX+2,iY,iZ)[iD]);    }    else if (iX==field.getNx()-1) {        dxu = -fd::boundaryGradient(field.get(iX,iY,iZ)[iD],                                    field.get(iX-1,iY,iZ)[iD],                                    field.get(iX-2,iY,iZ)[iD]);    }    else {        dxu = fd::centralGradient(field.get(iX+1,iY,iZ)[iD],                                  field.get(iX-1,iY,iZ)[iD]);    }    return dxu;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::boundaryYderiv (        int iX, int iY, int iZ, int iD,        TensorField3D<T,3> const& field) const{    OLB_PRECONDITION(iX>=0 && iX<=field.getNx()-1);    OLB_PRECONDITION(iY>=0 && iY<=field.getNy()-1);    OLB_PRECONDITION(iZ>=0 && iZ<=field.getNz()-1);    T dyu;    if (iY==0) {        dyu = fd::boundaryGradient(field.get(iX,iY,iZ)[iD],                                   field.get(iX,iY+1,iZ)[iD],                                   field.get(iX,iY+2,iZ)[iD]);    }    else if (iY==field.getNy()-1) {        dyu = -fd::boundaryGradient(field.get(iX,iY,iZ)[iD],                                    field.get(iX,iY-1,iZ)[iD],                                    field.get(iX,iY-2,iZ)[iD]);    }    else {        dyu = fd::centralGradient(field.get(iX,iY+1,iZ)[iD],                                  field.get(iX,iY-1,iZ)[iD]);    }       return dyu;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::boundaryZderiv (        int iX, int iY, int iZ, int iD,        TensorField3D<T,3> const& field) const{    OLB_PRECONDITION(iX>=0 && iX<=field.getNx()-1);    OLB_PRECONDITION(iY>=0 && iY<=field.getNy()-1);    OLB_PRECONDITION(iZ>=0 && iZ<=field.getNz()-1);    T dzu;    if (iZ==0) {        dzu = fd::boundaryGradient(field.get(iX,iY,iZ)[iD],                                   field.get(iX,iY,iZ+1)[iD],                                   field.get(iX,iY,iZ+2)[iD]);    }    else if (iZ==field.getNz()-1) {        dzu = -fd::boundaryGradient(field.get(iX,iY,iZ)[iD],                                    field.get(iX,iY,iZ-1)[iD],                                    field.get(iX,iY,iZ-2)[iD]);    }    else {        dzu = fd::centralGradient(field.get(iX,iY,iZ+1)[iD],                                  field.get(iX,iY,iZ-1)[iD]);    }       return dzu;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::boundaryDeriv (    int iX, int iY, int iZ, int iAlpha, int iBeta,    TensorField3D<T,3> const& field) const{    switch(iAlpha) {        case 0:            return boundaryXderiv(iX,iY,iZ, iBeta, field);        case 1:            return boundaryYderiv(iX,iY,iZ, iBeta, field);        case 2:            return boundaryZderiv(iX,iY,iZ, iBeta, field);        default:            OLB_ASSERT( false, "iAlpha>2!");            return T();    }}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::boundaryStrain (    int iX, int iY, int iZ, int iAlpha, int iBeta) const{    OLB_PRECONDITION( flags.momentumFieldComputed );    return ( boundaryDeriv(iX,iY,iZ,iAlpha,iBeta, fields.momentumField) +             boundaryDeriv(iX,iY,iZ,iBeta,iAlpha, fields.momentumField) ) / (T)2;}template<typename T, template<typename U> class Lattice>T DataAnalysis3D<T,Lattice>::boundaryDivRhoU (        int iX, int iY, int iZ) const{

⌨️ 快捷键说明

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