/* 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
* <http://www.openlb.net/>
*
* 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<vector> // for generic i/o
#include<cmath> // for lpnorm
#include<limits>
#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<typename T,typename DESCRIPTOR>
SuperLatticeDissipation2D<T,DESCRIPTOR>::SuperLatticeDissipation2D(
SuperLattice2D<T,DESCRIPTOR>& sLattice, const UnitConverter<T,DESCRIPTOR>& converter)
: SuperLatticeF2D<T,DESCRIPTOR>(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<T,DESCRIPTOR>(this->_sLattice.getBlockLattice(iC),this->_converter));
}
}
template<typename T,typename DESCRIPTOR>
bool SuperLatticeDissipation2D<T,DESCRIPTOR>::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<DESCRIPTOR >::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<DESCRIPTOR >::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<T,DESCRIPTOR>(),2)/rho/2.;
// return std::vector<T>(1,finalResult);
// } else {
// return std::vector<T>(); // empty vector
// }
return false;
}
template<typename T,typename DESCRIPTOR>
SuperLatticePhysDissipation2D<T,DESCRIPTOR>::SuperLatticePhysDissipation2D(
SuperLattice2D<T,DESCRIPTOR>& sLattice, const UnitConverter<T,DESCRIPTOR>& converter)
: SuperLatticePhysF2D<T,DESCRIPTOR>(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<T,DESCRIPTOR>(this->_sLattice.getBlockLattice(iC),this->_converter));
}
}
template<typename T,typename DESCRIPTOR>
bool SuperLatticePhysDissipation2D<T,DESCRIPTOR>::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<typename T,typename DESCRIPTOR>
SuperLatticeDensity2D<T,DESCRIPTOR>::SuperLatticeDensity2D(
SuperLattice2D<T,DESCRIPTOR>& sLattice)
: SuperLatticeF2D<T,DESCRIPTOR>(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<T,DESCRIPTOR>(this->_sLattice.getBlockLattice(iC)) );
}
}
template<typename T,typename DESCRIPTOR>
bool SuperLatticeDensity2D<T,DESCRIPTOR>::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