Commit f746cc20 authored by Philippe Delandmeter's avatar Philippe Delandmeter Committed by Valentin Vallaeys
Browse files

slim3d: u^n+1 computed from u^* and not u^n

parent 0bb0666b
......@@ -11,12 +11,11 @@ class dgConservationLawSW3dMomentum : public dgConservationLawFunction {
void diffusiveFlux(functorCache &cm, fullMatrix<double> &val) const;
void maxConvectiveSpeed(functorCache &cm, fullMatrix<double> &val) const;
void boundarySurface(functorCache &cm, fullMatrix<double> &val, const functor *windF) const;
const functor *_uv2d, *_uv2dGrad, *_eta, *_rGrad, *_w, *_wM, *_dwMdz, *_linearDissipation, *_quadraticDissipation, *_source, *_coriolisFactor, *_bathymetry, *_bathymetryMinCG, *_rhoSurfGrad, *_rhoSurf;
const functor *_uv2d, *_eta, *_rGrad, *_w, *_wM, *_linearDissipation, *_quadraticDissipation, *_source, *_coriolisFactor, *_bathymetry;
const functor *_fzero, *_fzerov;
const functor *_nuH, *_nuV, *_diffusiveFlux, *_ipTerm, *_maxDiffusivity;
const functor *_rhoDevMax;
const functor *_rhoDevInt, *_rhoDevMax;
double _laxFriedrichsFactor;
bool _useConservativeALE;
bool _withoutAdvection;
class boundaryWallArg;
void boundaryWall(functorCache &m, fullMatrix<double> &val, const boundaryWallArg arg) const;
......@@ -29,28 +28,23 @@ class dgConservationLawSW3dMomentum : public dgConservationLawFunction {
* Larger value requires smaller explicit time step : CFL ~= 1/LFF *
* Value LFF=1 corresponds to Aizinger and Dawson CMAME 2007. */
inline void setLaxFriedrichsFactor(double lff){ _laxFriedrichsFactor = lff;};
void setUseConservativeALE(bool b) { _useConservativeALE = b; };
/**set eta function [eta] */
inline void setEta(const functor *eta){ _eta = eta;}
const functor * getEta()const{return _eta;}
/**set function for horizontal gradient of the baroclinic head [drdx drdy] */
inline void setRGrad(const functor *f){ _rGrad = f;}
inline void setRhoSurf(const functor *f){ _rhoSurf = f;}
inline void setRhoSurfGrad(const functor *f){ _rhoSurfGrad = f;}
inline void setRhoDevInt(const functor *f){ _rhoDevInt = f;}
inline void setRhoDevMax(const functor *f){ _rhoDevMax = f;}
/**set depth averaged uv function [uInt, vInt] */
inline void setUV2d(const functor *uv2d){ _uv2d = uv2d;}
const functor *getUV2d()const {return _uv2d;}
/**set depth averaged uvGrad function [dudx, dudy, dudz, dvdx, dvdy, dvdz] */
inline void setUV2dGrad(const functor *uv2dGrad){ _uv2dGrad = uv2dGrad;}
/**set vertical velocity function [w] */
inline void setW(const functor *w){ _w = w;}
inline const functor* getW(){ return _w;}
/**set vertical mesh velocity [wMesh] */
inline void setWMesh(const functor *wM){ _wM = wM;}
inline const functor* getWMesh(){ return _wM;}
/**set derivative of vertical mesh velocity [DwMesh/Dz] */
inline void setWMeshDz(const functor *dwMdz){ _dwMdz = dwMdz;}
/**Set vertical viscosity function (scalar) */
inline void setNuV(const functor *nuV){ _nuV = nuV;}
/**Set horizontal viscosity function (scalar) */
......@@ -69,7 +63,6 @@ class dgConservationLawSW3dMomentum : public dgConservationLawFunction {
inline void setSource(const functor *source){ _source = source;}
/**set the function to evaluate the bathymetry h (H = h+eta) */
inline void setBathymetry(const functor *bathymetry) { _bathymetry = bathymetry;}
inline void setBathymetryMinCG(const functor *bathymetryMinCG) { _bathymetryMinCG = bathymetryMinCG;}
/**set no to use the advection of momentum */
inline void setWithoutAdvection(bool b){ _withoutAdvection = b;}
dgConservationLawSW3dMomentum();
......@@ -124,71 +117,4 @@ class dgConservationLawSW3dMomWx : public dgConservationLawFunction {
inline void setLaxFriedrichsFactor(double lff){ _laxFriedrichsFactor = lff;};
};
/**The non-conservative shallow water conservation law (external mode): elevation (eta) */
class dgConservationLawSW2dEta : public dgConservationLawFunction {
void maxConvectiveSpeed(functorCache &cm, fullMatrix<double> &val) const;
void gradPsiTerm(functorCache &cm, fullMatrix<double> &val) const;
void source(functorCache &cm, fullMatrix<double> &val) const;
void riemann(functorCache &cm, fullMatrix<double> &val) const;
void boundaryWall(functorCache &cm, fullMatrix<double> &val) const;
bool _linear, _depthIntegrated, _laxFriedrichs;
const functor *_bathymetry, *_fzero, *_fzerov, *_UV, *_freshwaterFlux;
public:
void setup();
/**if this flag is true, a linear version of the equations are solved.
* no quadratic dissipation, no advection, no non-linear free surface term in mass concervation */
inline void setIsLinear(bool linear) {_linear = linear;}
/**if this flag is true, the horizontal velocity (u,v) is intepreted as depth integrated rather than depth averaged quantity. Default=false. */
inline void setUsesDepthIntegratedUV(bool depInt) {_depthIntegrated = depInt;}
/**set the function to evaluate the horizontal velocity (u, v) */
inline void setUV(const functor *UV) { _UV = UV;}
/** set if use Lax-Friedrichs or not */
inline void setLaxFriedrichs(bool lf) {_laxFriedrichs = lf; }
/**set the function to evaluate the bathymetry h (H = h+eta) */
inline void setBathymetry(const functor *bathymetry) { _bathymetry = bathymetry;}
inline void setFreshwaterFlux(const functor *freshwaterFlux) {_freshwaterFlux = freshwaterFlux;}
dgConservationLawSW2dEta();
~dgConservationLawSW2dEta();
/**slip wall boundary */
dgBoundaryCondition *newBoundaryWall();
};
/**The non-conservative shallow water conservation law (external mode): momentum (u, v) */
class dgConservationLawSW2dU : public dgConservationLawFunction {
void maxConvectiveSpeed(functorCache &cm, fullMatrix<double> &val) const;
void gradPsiTerm(functorCache &cm, fullMatrix<double> &val) const ;
void source(functorCache &cm, fullMatrix<double> &val) const ;
void riemann(functorCache &cm, fullMatrix<double> &val) const ;
//class boundaryWall;
bool _linear, _laxFriedrichs;
const functor *_source, *_coriolisFactor, *_correction, *_bathymetry, *_fzero, *_fzerov, *_eta, *_rhoSurf, *_atmPress, *_rhoSurfGrad;
void wallExtValue(functorCache &cm, fullMatrix<double> &val) const;
public:
void setup();
/**if this flag is true, a linear version of the equations are solved.
* no non-linear free surface term in mass conservation */
inline void setIsLinear(bool linear) {_linear = linear;}
/**set the function to evaluate the coriolis factor.
* \f{eqnarray*}\frac{du}{dt} &=& -f v \\ \frac{dv}{dt} &=& f u \f} */
inline void setCoriolisFactor(const functor *f){ _coriolisFactor = f;}
/**set the function to evaluate the source term.
* \f{eqnarray*} \frac{du}{dt} &=& s(0)\\ \frac{dv}{dt} &=& s(1)\f} */
inline void setSource(const functor *f){ _source = f;}
/**set the function to evaluate the bathymetry h (H = h+eta) */
inline void setBathymetry(const functor *f) { _bathymetry = f;}
/**set the function to evaluate the free surface elevation (eta) */
inline void setEta(const functor *f) { _eta = f;}
/** set if use Lax-Friedrichs or not */
inline void setLaxFriedrichs(bool lf) {_laxFriedrichs = lf; }
/** set the correction source term*/
inline void setCorrectionSourceTerm(const functor *f ) {_correction = f;}
inline void setRhoSurf(const functor *f) { _rhoSurf = f;}
inline void setRhoSurfGrad(const functor *f) { _rhoSurfGrad = f;}
/**set the function to evaluate the atmospheric pressure */
inline void setAtmPress(const functor *f) { _atmPress = f;}
dgConservationLawSW2dU();
~dgConservationLawSW2dU();
/**slip wall boundary */
dgBoundaryCondition *newBoundaryWall(const functor* rhoSurfExt=NULL);
};
#endif
......@@ -75,7 +75,6 @@ void dgConservationLawSW3dTracer::maxConvectiveSpeed(functorCache &cm, fullMatri
void dgConservationLawSW3dTracer::source(functorCache &cm, fullMatrix<double> &val) const {
const fullMatrix<double> &sol = cm.get(*function::getSolution());
const fullMatrix<double> *dwMdz = _dwMdz ? &cm.get(*_dwMdz) : NULL;
const fullMatrix<double> *sourceFunc = _sourceFunc ? &cm.get(*_sourceFunc) : NULL;
const fullMatrix<double> *ref = _ref ? &cm.get(*_ref) : NULL;
int nQP = cm.nEvaluationPoint();
......@@ -85,8 +84,6 @@ void dgConservationLawSW3dTracer::source(functorCache &cm, fullMatrix<double> &v
val(i,0) += (*sourceFunc)(i,0);
if(ref)
val(i,0) += ((*ref)(i,0)-sol(i,0))*_dt/_T;
if(dwMdz && !this->_useConservativeALE)
val(i,0) += -sol(i,0)*(*dwMdz)(i,0);
}
}
void dgConservationLawSW3dTracer::advection(functorCache &cm, fullMatrix<double> &val) const {
......@@ -404,7 +401,7 @@ void dgConservationLawSW3dTracer::setup () {
_maximumConvectiveSpeed[""] = newFunctorMember(*this, &dgConservationLawSW3dTracer::maxConvectiveSpeed);
_diffusiveFlux = haveDiff ? newFunctorMember(*this, &dgConservationLawSW3dTracer::diffusiveFlux) : NULL;
_ipTerm = haveDiff ? dgNewIpTermAnisotropic (1, _diffusiveFlux, _diffusivity[""]) : NULL;
_volumeTerm0[""] = ( _dwMdz || _sourceFunc || haveCall) ? newFunctorMember(*this, &dgConservationLawSW3dTracer::source) : NULL;
_volumeTerm0[""] = (_sourceFunc || haveCall) ? newFunctorMember(*this, &dgConservationLawSW3dTracer::source) : NULL;
_volumeTerm1[""] = newFunctorMember(*this, &dgConservationLawSW3dTracer::advection);
_interfaceTerm0[""] = newFunctorMember(*this, &dgConservationLawSW3dTracer::interfaceTerm);
}
......@@ -435,7 +432,6 @@ dgConservationLawSW3dTracer::dgConservationLawSW3dTracer(const functor *uv,const
_uv = uv;
_w = w;
_wM = NULL;
_dwMdz = NULL;
_kappaH = NULL;
_kappaV = NULL;
_eta = _fzero;
......@@ -446,7 +442,6 @@ dgConservationLawSW3dTracer::dgConservationLawSW3dTracer(const functor *uv,const
_ipTermIso=NULL;
_diffusiveFlux = NULL;
_ipTerm = NULL;
_useConservativeALE = false;
_uGM=NULL;
}
......@@ -460,7 +455,6 @@ dgConservationLawSW3dTracer::dgConservationLawSW3dTracer() : dgConservationLawFu
_uv = _fzeroVec;
_w = _fzero;
_wM = NULL;
_dwMdz = NULL;
_kappaH = NULL;
_kappaV = NULL;
_eta = _fzero;
......@@ -474,7 +468,6 @@ dgConservationLawSW3dTracer::dgConservationLawSW3dTracer() : dgConservationLawFu
_ref=NULL;
_dt=0;
_T=1;
_useConservativeALE = false;
_uGM=NULL;
}
......
......@@ -7,12 +7,11 @@ class function;
* \f[\frac{dc}{dt} + v. \nabla c - nu \Delta c = 0\f]
*/
class dgConservationLawSW3dTracer : public dgConservationLawFunction {
const functor *_uv, *_w, *_wOld, *_wM, *_eta, *_bathymetry, *_dwMdz, *_kappaH, *_kappaV, *_diffusiveFlux, *_ipTerm, *_slope, *_Kedd, *_isopycnalDiffusion, *_interfaceIso, *_ipTermIso, *_sourceFunc, *_uGM;
const functor *_uv, *_w, *_wOld, *_wM, *_eta, *_bathymetry, *_kappaH, *_kappaV, *_diffusiveFlux, *_ipTerm, *_slope, *_Kedd, *_isopycnalDiffusion, *_interfaceIso, *_ipTermIso, *_sourceFunc, *_uGM;
const functor *_fzero, *_fzeroVec;
double _laxFriedrichsFactor;
int _dt,_T;
const functor *_ref;
bool _useConservativeALE;
void source(functorCache &cm, fullMatrix<double> &val) const ;
void advection(functorCache &cm, fullMatrix<double> &val) const ;
void interfaceTerm(functorCache &cm, fullMatrix<double> &val) const ;
......@@ -36,7 +35,6 @@ class dgConservationLawSW3dTracer : public dgConservationLawFunction {
dgConservationLawSW3dTracer();
/** set factor for scaling Lax-Friedrichs penalty term [default LFF = 0]. */
inline void setLaxFriedrichsFactor(double lff){ _laxFriedrichsFactor = lff;}
inline void setUseConservativeALE(bool b) {_useConservativeALE = b;};
inline void setSource(const functor *f) {_sourceFunc = f;};
inline void setCallRef(int dt, int T, const functor *ref){_dt=dt;_T=T; _ref=ref;};
inline void setUV(const functor *f) {_uv = f;};
......@@ -47,7 +45,6 @@ class dgConservationLawSW3dTracer : public dgConservationLawFunction {
inline void setWMesh(const functor *wM) {_wM = wM;};
inline void setEta(const functor *eta) {_eta = eta;};
inline void setBathymetry(const functor *bath) {_bathymetry = bath;};
inline void setWMeshDz(const functor *dwMdz) {_dwMdz = dwMdz;};
inline void setIsoDiff(const functor *S, const functor *Kedd) {_slope = S; _Kedd = Kedd;};
inline void setGMVel(const functor *uGM) {_uGM = uGM; };
const functor *getUV()const {return _uv;}
......
......@@ -869,27 +869,6 @@ class detadt : public functor {
}
};
class functorPressure : public functor {
const functor *_rhosurf, *_gradeta;
public:
functorPressure(const functor *gradeta, const functor *rhosurf){
_rhosurf = rhosurf;
_gradeta = gradeta;
}
void operator()(functorCache &cm, fullMatrix<double> &val) const{
const fullMatrix<double> &rhosurf = cm.get(*_rhosurf);
const fullMatrix<double> &gradeta = cm.get(*_gradeta);
const double rho0 = slim3dParameters::rho0;
const double g = slim3dParameters::g;
val.resize(cm.nEvaluationPoint(), 2, false);
for (int i = 0; i < cm.nEvaluationPoint();++i) {
const double rho = 1 + rhosurf(i,0)/rho0;
val(i,0) = g*gradeta(i,0) * rho;
val(i,1) = g*gradeta(i,1) * rho;
}
}
};
static void _computeRhoDevMax(const dgExtrusion &extrusion, const dgDofContainer &rhoDof, dgDofContainer &rhoPMaxDof)
{
dgFullMatrix<double> data3d, data2d;
......@@ -959,11 +938,6 @@ void slim3dTimeIntegratorPC::advanceOneTimeStep()
//brol
e.sw2DEq->setIsLinear(false);
e.sw2DEq->setLinearSolverFrom3D(false);
e.horMomEq->setUseConservativeALE(true);
e.SEq->setUseConservativeALE(true);
e.TEq->setUseConservativeALE(true);
e.tkeAdvEq->setUseConservativeALE(true);
e.epsAdvEq->setUseConservativeALE(true);
//d->uvDof : unknown uv3d vector
......@@ -1011,10 +985,15 @@ void slim3dTimeIntegratorPC::advanceOneTimeStep()
if (e.sw2DEq->getIsLinear()) {
e.sw2DEq->setEtaOld(eta.getFunction());
}
if (f.windStressFunc)
e.sw2DEq->setWindStress(f.windStressFunc);
//e.sw2DEq->setRhoSurf(d.rhoSurfDof2d->getFunction());
//e.sw2DEq->setRhoSurfGrad(d.rhoSurfDof2d->getFunctionGradient());
//if (f.windStressFunc)
// e.sw2DEq->setWindStress(f.windStressFunc);
dgDofContainer rhoDof(*s.groups3d, 1);
rhoDof.interpolate(f.rhoFunc);
dgDofContainer rhoSurfDof2d(*s.groups2d, 1);
s.copy2d3d->copyTo2D(&rhoDof, &rhoSurfDof2d,-1);
rhoSurfDof2d.scatter(true);
e.sw2DEq->setRhoSurf(rhoSurfDof2d.getFunction());
e.sw2DEq->setRhoSurfGrad(rhoSurfDof2d.getFunctionGradient());
//e.sw2DEq->setSource(uvCorr->getFunction());
rk->iterate(sol2d, _dt, _time+_dt);
s.copyField2d->copy(&sol2d,&etaStar,0,0);
......@@ -1055,11 +1034,8 @@ void slim3dTimeIntegratorPC::advanceOneTimeStep()
oneOld.multiplyByMassMatrix();
functionPrecomputedExtrusion etaFunc(s.extrusion(), 3);
functionPrecomputedExtrusion etaGradFunc(s.extrusion(), 3);
etaFunc.compute(*etaStar.getFunction(), functorCache::NODE_GROUP_MODE);
etaFunc.compute(*etaStar.getFunction(), functorCache::INTEGRATION_GROUP_MODE);
etaGradFunc.compute(*etaStar.getFunctionGradient(), functorCache::NODE_GROUP_MODE);
etaGradFunc.compute(*etaStar.getFunctionGradient(), functorCache::INTEGRATION_GROUP_MODE);
// move mesh to etaStar
......@@ -1157,36 +1133,28 @@ void slim3dTimeIntegratorPC::advanceOneTimeStep()
}
dgDofContainer rGradDof3d(*s.groups3d, 2);
functionPrecomputedExtrusion rFunc(s.extrusion(), 3);
functionPrecomputedExtrusion rhopMaxFunc(s.extrusion(), 3);
{
dgDofContainer rhoDof(*s.groups3d, 1);
rhoDof.interpolate(f.rhoFunc);
d.tmprhoDof3d->interpolate(f.rhoFunc);
rhoDof.scatter(true);
dgDofContainer rhoSurfDof2d(*s.groups2d, 1);
s.copy2d3d->copyTo2D(&rhoDof, &rhoSurfDof2d,-1);
rhoSurfDof2d.scatter(true);
rhoSurfFunc.compute(*rhoSurfDof2d.getFunction());
dgConservationLawSW3dContinuitySolver newRGradSolver(*s.groups3d, s.extrusion(), INTEGRATE_FROM_TOP);
e.newRGradEq->setRhoFunction(rhoDof.getFunction());
e.newRGradEq->setRhoGradFunction(rhoDof.getFunctionGradient());
e.newRGradEq->setUseRGradByPart(s.getUseRGradByPart()); // should not be here
newRGradSolver.iterate(e.newRGradEq, &rGradDof3d, _time, true);
functorPressure pressure(etaStar.getFunctionGradient(), rhoSurfDof2d.getFunction());
dgDofContainer pressure2d(*s.groups2d, 2);
pressure2d.interpolate(&pressure);
functionPrecomputedExtrusion pressurePrecomp(s.extrusion(), 3);
pressurePrecomp.compute(*pressure2d.getFunction(), functorCache::NODE_GROUP_MODE);
dgDofContainer pressure3d(*s.groups3d,2);
pressure3d.interpolate(&pressurePrecomp);
rGradDof3d.scale(slim3dParameters::g);
rGradDof3d.axpy(pressure3d,1);
dgDofContainer r(*s.groups2d, 1);
s.newDepthIntegrator->integrate(&rhoDof,&r, false, true);
r.scatter();
r.exportMsh("r");
rFunc.compute(*r.getFunction());
dgDofContainer rhopMax(*s.groups2d, 1);
_computeRhoDevMax(s.extrusion(), rhoDof, rhopMax);
rhopMax.scatter();
rhopMaxFunc.compute(*rhopMax.getFunction());
//dgDofContainer rhopMax(*s.groups2d, 1);
//_computeRhoDevMax(s.extrusion(), rhoDof, rhopMax);
//rhopMaxFunc.compute(*rhopMax.getFunction());
}
//uv explicit
......@@ -1212,18 +1180,19 @@ void slim3dTimeIntegratorPC::advanceOneTimeStep()
f.bottomFriction2dPrecompFunc->compute(*f.bottomFrictionFunc);
}
functor::getDT()->set(_dt);
e.horMomEq->setEta(&etaFunc,&etaGradFunc);
e.horMomEq->setEta(&etaFunc);
e.horMomEq->setW(wStar.getFunction());
e.horMomEq->setWMesh(wMeshStar.getFunction());
e.horMomEq->setRGrad(rGradDof3d.getFunction());
e.horMomEq->setRhoSurf(&rhoSurfFunc);
e.horMomEq->setUV2d(&uvMeanStarFunc);
e.horMomEq->setRhoDevMax(&rhopMaxFunc);
//e.horMomEq->setRhoDevMax(&rhopMaxFunc);
e.horMomEq->setRhoDevInt(&rFunc);
e.horMomEq->setLaxFriedrichsFactor(1.);
d.tmpuvGradDof->interpolate(uvStar.getFunctionGradient());
e.horMomEq->computeAllTerms(_time,uvStar,*uvDof_K,false);
//d.uvDof->copy(uvStar);
//d.uvDof->multiplyByMassMatrix();
d.uvDof->copy(MuvOld);
d.uvDof->copy(uvStar);
d.uvDof->multiplyByMassMatrix();
//d.uvDof->copy(MuvOld);
d.uvDof->axpy(*uvDof_K, _dt);
imassnext.mult(*d.uvDof);
d.uvDof->scatter();
......
......@@ -209,7 +209,7 @@ void slim3dDepthIntegrator::_computeNodalHeight()
}
}
void slim3dDepthIntegrator::integrate(const dgDofContainer* dof3d, dgDofContainer* dof2d, bool scatterSolution)
void slim3dDepthIntegrator::integrate(const dgDofContainer* dof3d, dgDofContainer* dof2d, bool scatterSolution, bool absValue)
{
if (dof2d->getGroups() != _groups2d ||
dof3d->getGroups() != _groups3d )
......@@ -236,7 +236,7 @@ void slim3dDepthIntegrator::integrate(const dgDofContainer* dof3d, dgDofContaine
int nbFields = std::min(dof3d->nField(*group3d), dof2d->nField(*_groups2d->getElementGroup(iGroup2d)));
for (int iField = 0; iField < nbFields; iField++) {
int iData2d = dof2d->getDofId(iGroup2d,iElem2d,iField,iNode2d);
double value = elemData(iNode3d,iField);
double value = absValue ? fabs(elemData(iNode3d,iField)) : elemData(iNode3d,iField);
dof2d->getVector()(iData2d) += height*value;
}
}
......@@ -1211,8 +1211,8 @@ void slim3dForceZeroAtBnd::forceZeroAtBnd(dgDofContainer* dof)
//data(cl[iNode], 0) = data(cl[iNode], 0) - normals(iNode, 0) * dataN;
//data(cl[iNode], 1) = data(cl[iNode], 1) - normals(iNode, 1) * dataN;
double dataN = data(cl[iNode], 0) * normals(0, 0) + data(cl[iNode], 1) * normals(0, 1);
data(cl[iNode], 0) = data(cl[iNode], 0) - normals(0, 0) * dataN;
data(cl[iNode], 1) = data(cl[iNode], 1) - normals(0, 1) * dataN;
data(cl[iNode], 0) = 0;//data(cl[iNode], 0) - normals(0, 0) * dataN;
data(cl[iNode], 1) = 0;//data(cl[iNode], 1) - normals(0, 1) * dataN;
}
}
}
......
......@@ -20,7 +20,7 @@ public:
slim3dDepthIntegrator( dgExtrusion* columns );
~slim3dDepthIntegrator();
/** integrates the fields in sourceDof3d over the water depth */
void integrate(const dgDofContainer *sourceDof3d, dgDofContainer *destDof2d, bool scatterSolution=true);
void integrate(const dgDofContainer *sourceDof3d, dgDofContainer *destDof2d, bool scatterSolution=true, bool absValue=false);
/** integrates the fields in sourceDof over the water depth, from the bottom, and put the values in destDof(also 3D) */
void integrate3d3d(const dgDofContainer *sourceDof, dgDofContainer *destDof, bool wVel=false);
void integrateAboveVertBottom(const dgDofContainer* dof3d, dgDofContainer* dof2d, const dgDofContainer* heightAboveVertBottom, bool scatterSolution);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment