/* This file is part of the OpenLB library * * Copyright (C) 2014 Albert Mink, Mathias J. Krause * E-mail contact: info@openlb.net * The most recent release of OpenLB can be downloaded at * * * 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. */ #ifndef SUPER_LATTICE_LOCAL_F_2D_HH #define SUPER_LATTICE_LOCAL_F_2D_HH #include // for generic i/o #include // for lpnorm #include #include "superLatticeLocalF2D.h" #include "blockLatticeLocalF2D.h" #include "dynamics/lbHelpers.h" // for computation of lattice rho and velocity #include "geometry/superGeometry2D.h" #include "indicator/superIndicatorF2D.h" namespace olb { template SuperLatticeDissipation2D::SuperLatticeDissipation2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticeF2D(sLattice, 1), _converter(converter) { this->getName() = "dissipation"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticeDissipation2D(this->_sLattice.getBlockLattice(iC),this->_converter)); } } template bool SuperLatticeDissipation2D::operator()(T output[], const int input[]) { // int globIC = input[0]; // int locix= input[1]; // int lociy= input[2]; //// int lociz= input[3]; // if ( this->sLattice.getLoadBalancer().rank(globIC) == singleton::mpi().getRank() ) { // // local coords are given, fetch local cell and compute value(s) // T rho, uTemp[DESCRIPTOR::d], pi[util::TensorVal::n]; // int overlap = this->sLattice.getOverlap(); // this->sLattice.getExtendedBlockLattice(this->sLattice.getLoadBalancer().loc(globIC)).get(locix+overlap, lociy+overlap/*, lociz+overlap*/).computeAllMomenta(rho, uTemp, pi); // T PiNeqNormSqr = pi[0]*pi[0] + 2.*pi[1]*pi[1] + pi[2]*pi[2]; // if (util::TensorVal::n == 6) // PiNeqNormSqr += pi[2]*pi[2] + pi[3]*pi[3] + 2.*pi[4]*pi[4] +pi[5]*pi[5]; // T nuLattice = converter.getLatticeNu(); // T omega = converter.getOmega(); // T finalResult = PiNeqNormSqr*nuLattice*pow(omega*descriptors::invCs2(),2)/rho/2.; // return std::vector(1,finalResult); // } else { // return std::vector(); // empty vector // } return false; } template SuperLatticePhysDissipation2D::SuperLatticePhysDissipation2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 1) { this->getName() = "physDissipation"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticePhysDissipation2D(this->_sLattice.getBlockLattice(iC),this->_converter)); } } template bool SuperLatticePhysDissipation2D::operator()( T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticeDensity2D::SuperLatticeDensity2D( SuperLattice2D& sLattice) : SuperLatticeF2D(sLattice, 1) { this->getName() = "density"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticeDensity2D(this->_sLattice.getBlockLattice(iC)) ); } } template bool SuperLatticeDensity2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticeVelocity2D::SuperLatticeVelocity2D( SuperLattice2D& sLattice) : SuperLatticeF2D(sLattice, 2) { this->getName() = "velocity"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticeVelocity2D(this->_sLattice.getBlockLattice(iC))); } } template bool SuperLatticeVelocity2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticePhysStrainRate2D::SuperLatticePhysStrainRate2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 4) { this->getName() = "physStrainRate"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticePhysStrainRate2D(this->_sLattice.getBlockLattice(iC),this->_converter)); } } template bool SuperLatticePhysStrainRate2D::operator()( T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticePhysWallShearStress2D::SuperLatticePhysWallShearStress2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, const int material, const UnitConverter& converter, IndicatorF2D& indicator) : SuperLatticePhysF2D(sLattice, converter, 1), _superGeometry(superGeometry), _material(material) { this->getName() = "physWallShearStress"; const int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticePhysWallShearStress2D( this->_sLattice.getExtendedBlockLattice(iC), _superGeometry.getExtendedBlockGeometry(iC), this->_sLattice.getOverlap(), _material, this->_converter, indicator) ); } } template bool SuperLatticePhysWallShearStress2D::operator() (T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticeGeometry2D::SuperLatticeGeometry2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, const int material) : SuperLatticeF2D(sLattice, 1), _superGeometry(superGeometry), _material(material) { this->getName() = "geometry"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticeGeometry2D( this->_sLattice.getBlockLattice(iC), this->_superGeometry.getBlockGeometry(iC), _material) ); } } template bool SuperLatticeGeometry2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticeRank2D::SuperLatticeRank2D( SuperLattice2D& sLattice) : SuperLatticeF2D(sLattice, 1) { this->getName() = "rank"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticeRank2D(this->_sLattice.getBlockLattice(iC)) ); } } template bool SuperLatticeRank2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { this->getBlockF( this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); return true; } else { return false; } } template SuperLatticeCuboid2D::SuperLatticeCuboid2D( SuperLattice2D& sLattice) : SuperLatticeF2D(sLattice, 1) { this->getName() = "cuboid"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticeCuboid2D(this->_sLattice.getBlockLattice(iC), this->_sLattice.getLoadBalancer().glob(iC)) ); } } template bool SuperLatticeCuboid2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { this->getBlockF( this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); return true; } else { return false; } } template SuperLatticePhysPressure2D::SuperLatticePhysPressure2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 1) { this->getName() = "physPressure"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticePhysPressure2D(this->_sLattice.getBlockLattice(iC), this->_converter)); } } template bool SuperLatticePhysPressure2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF( this->_sLattice.getLoadBalancer().loc(input[0]) )(output, &input[1]); } else { return false; } } template SuperLatticePhysVelocity2D::SuperLatticePhysVelocity2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 2) { this->getName() = "physVelocity"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticePhysVelocity2D(this->_sLattice.getBlockLattice(iC), this->_converter)); } } template bool SuperLatticePhysVelocity2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticeField2D::SuperLatticeField2D( SuperLattice2D& sLattice) : SuperLatticeF2D(sLattice, DESCRIPTOR::template size()) { this->getName() = "ExtField"; for (int iC = 0; iC < this->_sLattice.getLoadBalancer().size(); iC++ ) { this->_blockF.emplace_back( new BlockLatticeField2D(this->_sLattice.getBlockLattice(iC))); } } template bool SuperLatticeField2D::operator()( T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().isLocal(input[0])) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]))(output,&input[1]); } else { return false; } } template SuperLatticePhysExternalPorosity2D::SuperLatticePhysExternalPorosity2D (SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 1) { this->getName() = "ExtPorosityField"; const int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticePhysExternalPorosity2D( this->_sLattice.getExtendedBlockLattice(iC), this->_sLattice.getOverlap(), this->_converter) ); } } template bool SuperLatticePhysExternalPorosity2D::operator()( T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { const int loc = this->_sLattice.getLoadBalancer().loc(input[0]); return this->getBlockF(loc)(output, &input[1]); } else { return false; } } template SuperLatticeVolumeFractionApproximation2D::SuperLatticeVolumeFractionApproximation2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, IndicatorF2D& indicator, int refinementLevel, const UnitConverter& converter, bool insideOut) : SuperLatticeF2D(sLattice, 1) { this->getName() = "volumeFractionApproximation"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticeVolumeFractionApproximation2D(this->_sLattice.getBlockLattice(iC), superGeometry.getBlockGeometry(iC), indicator, refinementLevel, converter, insideOut)); } } template bool SuperLatticeVolumeFractionApproximation2D::operator()( T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticeVolumeFractionPolygonApproximation2D::SuperLatticeVolumeFractionPolygonApproximation2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, IndicatorF2D& indicator, const UnitConverter& converter, bool insideOut) : SuperLatticeF2D(sLattice, 1) { this->getName() = "volumeFractionPolygonApproximation"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticeVolumeFractionPolygonApproximation2D(this->_sLattice.getBlockLattice(iC), superGeometry.getBlockGeometry(iC), indicator, converter, insideOut)); } } template bool SuperLatticeVolumeFractionPolygonApproximation2D::operator()( T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticePhysExternalVelocity2D::SuperLatticePhysExternalVelocity2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 2) { this->getName() = "ExtVelocityField"; const int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticePhysExternalVelocity2D( this->_sLattice.getExtendedBlockLattice(iC), this->_sLattice.getOverlap(), this->_converter) ); } } template bool SuperLatticePhysExternalVelocity2D::operator()( T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { const int loc = this->_sLattice.getLoadBalancer().loc(input[0]); return this->getBlockF(loc)(output, &input[1]); } else { return false; } } template SuperLatticePhysExternalParticleVelocity2D::SuperLatticePhysExternalParticleVelocity2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 2) { this->getName() = "ExtPartVelField"; for (int iC = 0; iC < sLattice.getLoadBalancer().size(); ++iC) { this->_blockF.emplace_back( new BlockLatticePhysExternalParticleVelocity2D( sLattice.getExtendedBlockLattice(iC), converter) ); } } template bool SuperLatticePhysExternalParticleVelocity2D::operator()( T output[], const int input[]) { auto& load = this->_sLattice.getLoadBalancer(); const int& globIC = input[0]; if (load.rank(globIC) == singleton::mpi().getRank()) { const int overlap = this->_sLattice.getOverlap(); int inputLocal[2] = { }; inputLocal[0] = input[1] + overlap; inputLocal[1] = input[2] + overlap; return this->getBlockF(load.loc(globIC))(output, inputLocal); } else { return false; } } template SuperLatticePhysBoundaryForce2D::SuperLatticePhysBoundaryForce2D( SuperLattice2D& sLattice, FunctorPtr>&& indicatorF, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 2), _indicatorF(std::move(indicatorF)) { this->getName() = "physBoundaryForce"; for (int iC = 0; iC < this->_sLattice.getLoadBalancer().size(); ++iC) { this->_blockF.emplace_back( new BlockLatticePhysBoundaryForce2D( this->_sLattice.getBlockLattice(iC), _indicatorF->getBlockIndicatorF(iC), this->_converter)); } } template SuperLatticePhysBoundaryForce2D::SuperLatticePhysBoundaryForce2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, const int material, const UnitConverter& converter) : SuperLatticePhysBoundaryForce2D(sLattice, superGeometry.getMaterialIndicator(material), converter) { } template bool SuperLatticePhysBoundaryForce2D::operator() (T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]))(output, &input[1]); } else { return false; } } template SuperLatticePSMPhysForce2D::SuperLatticePSMPhysForce2D( SuperLattice2D& sLattice, const UnitConverter& converter, int mode_) : SuperLatticePhysF2D(sLattice, converter, 2) { this->getName() = "PSMPhysForce"; for (int iC = 0; iC < this->_sLattice.getLoadBalancer().size(); ++iC) { this->_blockF.emplace_back( new BlockLatticePSMPhysForce2D( this->_sLattice.getBlockLattice(iC), this->_converter, mode_)); } } template bool SuperLatticePSMPhysForce2D::operator() (T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]))(output, &input[1]); } else { return false; } } /*****************************NEW*****************************/ template SuperLatticePhysCorrBoundaryForce2D::SuperLatticePhysCorrBoundaryForce2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, const int material, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 2), _superGeometry(superGeometry), _material(material) { this->getName() = "physCorrBoundaryForce"; } template bool SuperLatticePhysCorrBoundaryForce2D::operator()( T output[], const int input[]) { // int globIC = input[0]; // int locix= input[1]; // int lociy= input[2]; // int lociz= input[3]; // std::vector force(3, T()); // if ( this->sLattice.getLoadBalancer().rank(globIC) == singleton::mpi().getRank() ) { // int globX = (int)this->sLattice.getCuboidGeometry().get(globIC).get_globPosX() + locix; // int globY = (int)this->sLattice.getCuboidGeometry().get(globIC).get_globPosY() + lociy; // int globZ = (int)this->sLattice.getCuboidGeometry().get(globIC).get_globPosZ() + lociz; // if(superGeometry.getMaterial(globX, globY, globZ) == material) { // for (int iPop = 1; iPop < DESCRIPTOR::q ; ++iPop) { // // Get direction // const int* c = DESCRIPTOR::c[iPop]; // // Get next cell located in the current direction // // Check if the next cell is a fluid node // if (superGeometry.getMaterial(globX + c[0], globY + c[1], globZ + c[2]) == 1) { // int overlap = this->sLattice.getOverlap(); // // Get f_q of next fluid cell where l = opposite(q) // T f = this->sLattice.getExtendedBlockLattice(this->sLattice.getLoadBalancer().loc(globIC)).get(locix+overlap + c[0], lociy+overlap + c[1], lociz+overlap + c[2])[iPop]; // // Get f_l of the boundary cell // // Add f_q and f_opp // f += this->sLattice.getExtendedBlockLattice(this->sLattice.getLoadBalancer().loc(globIC)).get(locix+overlap, lociy+overlap, lociz+overlap)[util::opposite(iPop)]; // // Update force // force[0] -= c[0]*(f-2.*descriptors::t(iPop)); // force[1] -= c[1]*(f-2.*descriptors::t(iPop)); // force[2] -= c[2]*(f-2.*descriptors::t(iPop)); // } // } // force[0]=this->converter.physForce(force[0]); // force[1]=this->converter.physForce(force[1]); // force[2]=this->converter.physForce(force[2]); // return force; // } // else { // return force; // } // } // else { // return force; // } return false; } template SuperLatticePorosity2D::SuperLatticePorosity2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, const int material, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 1), _superGeometry(superGeometry), _material(material) { this->getName() = "porosity"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticePorosity2D( this->_sLattice.getBlockLattice(iC), this->_superGeometry.getBlockGeometry(iC), _material, converter)); } } template bool SuperLatticePorosity2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticePhysPermeability2D::SuperLatticePhysPermeability2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, const int material, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 1), _superGeometry(superGeometry), _material(material) { this->getName() = "permeability"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticePhysPermeability2D( this->_sLattice.getBlockLattice(iC), this->_superGeometry.getBlockGeometry(iC), _material, this->getConverter() ) ); } } template bool SuperLatticePhysPermeability2D::operator()( T output[], const int input[]) { // int globIC = input[0]; // int locix= input[1]; // int lociy= input[2]; //// int lociz= input[3]; // T* value = new T[1]; // int overlap = this->sLattice.getOverlap(); // this->sLattice.getExtendedBlockLattice(this->sLattice.getLoadBalancer().loc(globIC)).get(locix+overlap, lociy+overlap/*, lociz+overlap*/).computeField(0,1,value); // std::vector result(1,this->converter.physPermeability(value[0])); // delete value; // if (!(result[0]<42)&&!(result[0]>42)&&!(result[0]==42)) result[0] = 999999; // if (isinf(result[0])) result[0] = 1e6; // return result; return false; } template SuperLatticePhysDarcyForce2D::SuperLatticePhysDarcyForce2D( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, const int material, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 2), _superGeometry(superGeometry), _material(material) { this->getName() = "alphaU"; } template bool SuperLatticePhysDarcyForce2D::operator()( T output[], const int input[]) { // SuperLatticePhysPermeability2D permeability(this->sLattice,this->superGeometry,this->material,this->converter); // SuperLatticeVelocity2D velocity(this->sLattice); // T nu = this->converter.getCharNu(); // T K = permeability(input)[0]; // std::vector u = velocity(input); // std::vector result(2,T()); // result[0] = -nu/K*u[0]; // result[1] = -nu/K*u[1]; //// result[2] = -nu/K*u[2]; // return result; return false; } template SuperEuklidNorm2D::SuperEuklidNorm2D( SuperLatticeF2D& f) : SuperLatticeF2D(f.getSuperLattice(), 1), _f(f) { this->getName() = "l2(" + _f.getName() + ")"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockEuklidNorm2D(f.getBlockF(iC))); } } template bool SuperEuklidNorm2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticePhysTemperature2D::SuperLatticePhysTemperature2D( SuperLattice2D& sLattice, ThermalUnitConverter const& converter) : SuperLatticeThermalPhysF2D(sLattice, converter, 1) { this->getName() = "physTemperature"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticePhysTemperature2D(this->_sLattice.getBlockLattice(iC), this->_converter)); } } template bool SuperLatticePhysTemperature2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF( this->_sLattice.getLoadBalancer().loc(input[0]) )(output, &input[1]); } else { return false; } } template SuperLatticePhysHeatFlux2D::SuperLatticePhysHeatFlux2D( SuperLattice2D& sLattice, const ThermalUnitConverter& converter) : SuperLatticeThermalPhysF2D(sLattice, converter, 2) { this->getName() = "physHeatFlux"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticePhysHeatFlux2D(this->_sLattice.getBlockLattice(iC), this->_converter)); } } template bool SuperLatticePhysHeatFlux2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF(this->_sLattice.getLoadBalancer().loc(input[0]) )(output,&input[1]); } else { return false; } } template SuperLatticePorousMomentumLossForce2D::SuperLatticePorousMomentumLossForce2D (SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, std::vector* >& indicator, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice,converter,4*indicator.size()) { this->getName() = "physPorousMomentumLossForce"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticePorousMomentumLossForce2D(this->_sLattice.getBlockLattice(iC), superGeometry.getBlockGeometry(iC), indicator, converter)); } } template bool SuperLatticePorousMomentumLossForce2D::operator() (T output[], const int input[]) { for (int i=0; igetTargetDim(); i++) { output[i] = 0.; } for (int iC = 0; iC < this->_sLattice.getLoadBalancer().size(); ++iC) { int globiC = this->_sLattice.getLoadBalancer().glob(iC); if ( this->_sLattice.getLoadBalancer().rank(globiC) == singleton::mpi().getRank() ) { this->getBlockF(iC)(output,&input[1]); } } #ifdef PARALLEL_MODE_MPI for (int i = 0; i < this->getTargetDim(); ++i) { singleton::mpi().reduceAndBcast(output[i], MPI_SUM); } #endif return true; } template SuperLatticeIndicatorSmoothIndicatorIntersection2D::SuperLatticeIndicatorSmoothIndicatorIntersection2D ( SuperLattice2D& sLattice, SuperGeometry2D& superGeometry, IndicatorF2D& normalInd, SmoothIndicatorF2D& smoothInd ) : SuperLatticeF2D(sLattice, 1) { this->getName() = "Indicator-SmoothIndicator Intersection"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back( new BlockLatticeIndicatorSmoothIndicatorIntersection2D(this->_sLattice.getExtendedBlockLattice(iC), superGeometry.getBlockGeometry(iC), normalInd, smoothInd)); } } template bool SuperLatticeIndicatorSmoothIndicatorIntersection2D::operator() (T output[], const int input[]) { output[0] = 0.; for (int iC = 0; iC < this->_sLattice.getLoadBalancer().size(); ++iC) { int globiC = this->_sLattice.getLoadBalancer().glob(iC); if ( this->_sLattice.getLoadBalancer().rank(globiC) == singleton::mpi().getRank() ) { this->getBlockF(iC)(output,&input[1]); } } #ifdef PARALLEL_MODE_MPI singleton::mpi().reduceAndBcast(output[0], MPI_MAX); #endif return true; } /////////// SuperLatticeGuoZhaoEpsilon2D ///////////////////////////////////////////// template SuperLatticeGuoZhaoEpsilon2D::SuperLatticeGuoZhaoEpsilon2D( SuperLattice2D& sLattice) : SuperLatticeF2D(sLattice, 1) { this->getName() = "epsilon"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticeGuoZhaoEpsilon2D(this->_sLattice.getBlockLattice(iC))); } } template bool SuperLatticeGuoZhaoEpsilon2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF( this->_sLattice.getLoadBalancer().loc(input[0]) )(output, &input[1]); } else { return false; } } /////////// SuperLatticeGuoZhaoPhysK2D ///////////////////////////////////////////// template SuperLatticeGuoZhaoPhysK2D::SuperLatticeGuoZhaoPhysK2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 1) { this->getName() = "physK"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticeGuoZhaoPhysK2D(this->_sLattice.getBlockLattice(iC), this->_converter)); } } template bool SuperLatticeGuoZhaoPhysK2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF( this->_sLattice.getLoadBalancer().loc(input[0]) )(output, &input[1]); } else { return false; } } /////////// SuperLatticeGuoZhaoPhysBodyForce2D ///////////////////////////////////////////// template SuperLatticeGuoZhaoPhysBodyForce2D::SuperLatticeGuoZhaoPhysBodyForce2D( SuperLattice2D& sLattice, const UnitConverter& converter) : SuperLatticePhysF2D(sLattice, converter, 2) { this->getName() = "physBodyForce"; int maxC = this->_sLattice.getLoadBalancer().size(); this->_blockF.reserve(maxC); for (int iC = 0; iC < maxC; iC++) { this->_blockF.emplace_back(new BlockLatticeGuoZhaoPhysBodyForce2D(this->_sLattice.getBlockLattice(iC), this->_converter)); } } template bool SuperLatticeGuoZhaoPhysBodyForce2D::operator()(T output[], const int input[]) { if (this->_sLattice.getLoadBalancer().rank(input[0]) == singleton::mpi().getRank()) { return this->getBlockF( this->_sLattice.getLoadBalancer().loc(input[0]) )(output, &input[1]); } else { return false; } } } // end namespace olb #endif