106 lines
3.5 KiB
C++
106 lines
3.5 KiB
C++
#include "duct.h"
|
|
#include "bccell.h"
|
|
#include "laminardrag.h"
|
|
#include "geom.h"
|
|
#include "math_constants.h"
|
|
#include "jacrow.h"
|
|
|
|
namespace duct{
|
|
namespace drag {
|
|
using math_common::sq2;
|
|
using rottfuncs::RottFuncs;
|
|
using tasystem::JacRow;
|
|
using tasystem::JacCol;
|
|
|
|
// Resistance force for laminar flow for the zero-frequency.
|
|
d zerodrag_vert(const Cell& v){
|
|
TRACE(5,"zerodrag_vert");
|
|
return 3*DragResistance::mu0(v)/(DragResistance::rho0(v)*pow(v.rhl,2));
|
|
}
|
|
d zerodrag_circ(const Cell& v){
|
|
TRACE(5,"zerodrag_circ");
|
|
return 2*DragResistance::mu0(v)/(DragResistance::rho0(v)*pow(v.rhl,2));
|
|
}
|
|
d zerodrag_inviscid(const Cell& v){
|
|
TRACE(5,"zerodrag_inviscid");
|
|
return 0;
|
|
}
|
|
|
|
class ZeroFreqDragCoef {
|
|
d (*zerodrag_funptr)(const Cell&);
|
|
public:
|
|
ZeroFreqDragCoef(const Duct& t) {
|
|
TRACE(0,"ZeroFreqDragCoef::ZeroFreqDragCoef()");
|
|
if(t.geom().shape().compare("vert")==0)
|
|
zerodrag_funptr=&zerodrag_vert;
|
|
else if(t.geom().shape().compare("circ")==0){
|
|
TRACE(20,"Circular pore chosen");
|
|
zerodrag_funptr=&zerodrag_circ;
|
|
}
|
|
else if(t.geom().shape().compare("inviscid")==0)
|
|
zerodrag_funptr=&zerodrag_inviscid;
|
|
else {
|
|
WARN("Warning: duct.geom.shape unknown for ZeroFreqDrag. Aborting...");
|
|
abort();
|
|
}
|
|
}
|
|
// We implement a cheap variant of polymorphism
|
|
d operator()(const Cell& v) const {
|
|
return (*zerodrag_funptr)(v);
|
|
}
|
|
};
|
|
|
|
|
|
LaminarDragResistance::LaminarDragResistance(const Duct& t)
|
|
{
|
|
TRACE(10,"LaminarDragResistanc::LaminarDragResistance()");
|
|
TRACE(11,"Entering redefinition of Rottfuncs");
|
|
if(t.geom().isBlApprox())
|
|
rf=RottFuncs("blapprox");
|
|
else
|
|
rf=RottFuncs(t.geom().shape()); // Reinitialize thermoviscous functions with right shape
|
|
TRACE(11,"Exiting redefinition of Rottfuncs");
|
|
zfd=new ZeroFreqDragCoef(t);
|
|
}
|
|
LaminarDragResistance::~LaminarDragResistance(){
|
|
delete zfd;
|
|
}
|
|
vd LaminarDragResistance::drag(const Cell& v) const {
|
|
TRACE(10,"LaminarDragResistance::drag(v)");
|
|
vd drag=dm(v)*v.ml()();
|
|
return drag; // No momentum scale here, since this is already done in dUi!!!!
|
|
}
|
|
JacRow LaminarDragResistance::dDrag(const Cell& v) const {
|
|
TRACE(15,"LaminarDragResistance::dDrag()");
|
|
return JacRow(-1,JacCol(v.ml(),dm(v)));
|
|
}
|
|
dmat LaminarDragResistance::dm(const Cell& v) const { // Derivative of drag resistance to velocity
|
|
TRACE(10,"LaminarDragResistance::dUi()");
|
|
vc CResistance=ComplexResistancecoef(v);
|
|
tasystem::var resistance(*v.gc);
|
|
resistance.setadata(CResistance);
|
|
return resistance.freqMultiplyMat();
|
|
}
|
|
vc LaminarDragResistance::ComplexResistancecoef(const Cell& v) const {
|
|
TRACE(0,"LaminarDragResistance::ComplexResistancecoef()");
|
|
const us& Nf=v.gc->Nf();
|
|
const us& i=v.geti();
|
|
|
|
const d& rh=v.rhl;
|
|
|
|
vc rescoef(Nf+1);
|
|
rescoef(0)=(*zfd)(v); // Zero frequency drag divided by zero-frequency velocity
|
|
if(Nf>0){
|
|
// Divided by sq2, see Eq. 5.23 of my thesis
|
|
const d omg=v.gc->getomg();
|
|
const vd omgvec=omg*linspace(1,Nf,Nf);
|
|
vd rh_over_deltanu=(shearWaveNumber(v).subvec(1,Nf))/sq2;
|
|
vc fnu=rf.fx(rh_over_deltanu); // Viscous rott function
|
|
rescoef.subvec(1,Nf)=I*(omgvec%(fnu/(1.0-fnu)));
|
|
}
|
|
return rescoef;
|
|
}
|
|
} // namespace drag
|
|
} // namespace duct
|
|
|