diff --git a/Solver/dgConservationLaw.cpp b/Solver/dgConservationLaw.cpp index f979df2e5826d0756e801527321050de0f2d078c..f7f3c9d07e33e79d13f622b2ac900029d092b65f 100644 --- a/Solver/dgConservationLaw.cpp +++ b/Solver/dgConservationLaw.cpp @@ -1,17 +1,20 @@ #include "dgConservationLaw.h" #include "function.h" -class dgBoundaryCondition0Out : public dgBoundaryCondition { +class dgBoundaryConditionOutsideValue : public dgBoundaryCondition { dgConservationLaw &_claw; + std::string _outsideValueFunctionName; class term : public dataCacheDouble { dataCacheMap cacheMapRight; // new cacheMap to pass to the Riemann solver dataCacheDouble &solutionRight; dataCacheDouble &solutionLeft; + dataCacheDouble &outsideValue; dataCacheDouble *riemannSolver; dgConservationLaw &_claw; public: - term(dgConservationLaw &claw, dataCacheMap &cacheMapLeft): + term(dgConservationLaw &claw, dataCacheMap &cacheMapLeft,const std::string outsideValueFunctionName): solutionRight(cacheMapRight.provideData("Solution")), solutionLeft(cacheMapLeft.get("Solution",this)), + outsideValue(cacheMapLeft.get(outsideValueFunctionName,this)), _claw(claw) { riemannSolver=_claw.newRiemannSolver(cacheMapLeft,cacheMapRight); @@ -20,18 +23,20 @@ class dgBoundaryCondition0Out : public dgBoundaryCondition { void _eval() { if(_value.size1()!=solutionLeft().size1()){ //adjust sizes - solutionRight.set(fullMatrix<double>(solutionLeft().size1(),_claw.nbFields())); _value = fullMatrix<double>(solutionLeft().size1(),_claw.nbFields()); } + solutionRight.set(outsideValue()); for(int i=0;i<_value.size1(); i++) for(int j=0;j<_value.size2(); j++) _value(i,j) = (*riemannSolver)(i,j*2); } }; public: - dgBoundaryCondition0Out(dgConservationLaw &claw): _claw(claw) {} + dgBoundaryConditionOutsideValue(dgConservationLaw &claw,const std::string outsideValueFunctionName): _claw(claw), + _outsideValueFunctionName(outsideValueFunctionName) + { } dataCacheDouble *newBoundaryTerm(dataCacheMap &cacheMapLeft) const { - return new term(_claw,cacheMapLeft); + return new term(_claw,cacheMapLeft,_outsideValueFunctionName); } }; @@ -56,8 +61,8 @@ class dgBoundaryCondition0Flux : public dgBoundaryCondition { } }; -dgBoundaryCondition *dgBoundaryCondition::new0OutCondition(dgConservationLaw &claw) { - return new dgBoundaryCondition0Out(claw); +dgBoundaryCondition *dgBoundaryCondition::newOutsideValueCondition(dgConservationLaw &claw,const std::string outsideValueFunctionName) { + return new dgBoundaryConditionOutsideValue(claw,outsideValueFunctionName); } dgBoundaryCondition *dgBoundaryCondition::new0FluxCondition(dgConservationLaw &claw) { return new dgBoundaryCondition0Flux(claw); diff --git a/Solver/dgConservationLaw.h b/Solver/dgConservationLaw.h index 9e72ab9a3745e85d501afb94d67b92df1c131655..f1b666a2809b9c160f668546a816ea72ed820095 100644 --- a/Solver/dgConservationLaw.h +++ b/Solver/dgConservationLaw.h @@ -17,7 +17,7 @@ class dgBoundaryCondition { virtual ~dgBoundaryCondition () {} virtual dataCacheDouble *newBoundaryTerm(dataCacheMap &cacheMapLeft) const = 0; //a generic boundary condition using the Riemann solver of the conservation Law - static dgBoundaryCondition *new0OutCondition(dgConservationLaw &claw); + static dgBoundaryCondition *newOutsideValueCondition(dgConservationLaw &claw,const std::string outsideValueFunctionName); static dgBoundaryCondition *new0FluxCondition(dgConservationLaw &claw); }; diff --git a/Solver/dgMainTest.cpp b/Solver/dgMainTest.cpp index 8d085e0e6dc502a75b20fdda42437e8c8f28b183..40e33204e4e3f78a352805447a98e9dffaff1a1d 100644 --- a/Solver/dgMainTest.cpp +++ b/Solver/dgMainTest.cpp @@ -59,17 +59,21 @@ int main(int argc, char **argv){ } print("init.pos",*elementGroups[0],&sol(0,0)); - //advection + fullMatrix<double> advectionSpeed(3,1); advectionSpeed(0,0)=0.15; advectionSpeed(1,0)=0.05; advectionSpeed(2,0)=0.; - function::add("advectionSpeed",function::newFunctionConstant(advectionSpeed)); dgConservationLaw *law = dgNewConservationLawAdvection("advectionSpeed"); - law->addBoundaryCondition("Left",dgBoundaryCondition::new0OutCondition(*law)); - law->addBoundaryCondition("Right",dgBoundaryCondition::new0OutCondition(*law)); + + fullMatrix<double> outsideValue(1,1); + outsideValue(0,0)=0; + function::add("outsideValue",function::newFunctionConstant(outsideValue)); + law->addBoundaryCondition("Left",dgBoundaryCondition::newOutsideValueCondition(*law,"outsideValue")); + law->addBoundaryCondition("Right",dgBoundaryCondition::newOutsideValueCondition(*law,"outsideValue")); + law->addBoundaryCondition("Top",dgBoundaryCondition::new0FluxCondition(*law)); law->addBoundaryCondition("Bottom",dgBoundaryCondition::new0FluxCondition(*law));