From a97df3a00d592c21893f6c072c9767238c554c53 Mon Sep 17 00:00:00 2001 From: Jonathan Lambrechts <jonathan.lambrechts@uclouvain.be> Date: Thu, 4 Feb 2010 09:10:44 +0000 Subject: [PATCH] dg:non linear shallow water equations --- Solver/TESTCASES/Stommel.lua | 8 +- Solver/dgConservationLawShallowWater2d.cpp | 85 +++++++++++++++------- Solver/dgGroupOfElements.cpp | 2 +- Solver/dgSlopeLimiter.cpp | 1 + Solver/dgSystemOfEquations.cpp | 2 +- 5 files changed, 65 insertions(+), 33 deletions(-) diff --git a/Solver/TESTCASES/Stommel.lua b/Solver/TESTCASES/Stommel.lua index b7b1ef93c7..4342a7e812 100644 --- a/Solver/TESTCASES/Stommel.lua +++ b/Solver/TESTCASES/Stommel.lua @@ -1,7 +1,7 @@ model = GModel() model:load ('stommel_square.msh') dg = dgSystemOfEquations (model) -order=1 +order=3 dg:setOrder (order) claw = dgConservationLawShallowWater2d() claw:addBoundaryCondition('Wall',claw:newBoundaryWall()) @@ -10,12 +10,12 @@ dg:setup() dg:exportSolution('output/init') -for i=1,10000 do - norm = dg:RK44(80*(3/(2.*order+1))) +for i=1,100000 do + norm = dg:RK44(150*(3/(2.*order+1))) if ( i%100 ==0 ) then print ('iter ', i, norm) end if ( i%100 ==0 ) then - dg:exportSolution(string.format('output/solution-%05d',i)) + dg:exportSolution(string.format('output/solution-%06d',i)) end end diff --git a/Solver/dgConservationLawShallowWater2d.cpp b/Solver/dgConservationLawShallowWater2d.cpp index 0671ba0217..4873c3b9d0 100644 --- a/Solver/dgConservationLawShallowWater2d.cpp +++ b/Solver/dgConservationLawShallowWater2d.cpp @@ -1,31 +1,30 @@ #include "dgConservationLawShallowWater2d.h" #include "function.h" static double g = 9.81; -static double h = 1000; +static double h = 1000.; +static double linearDissipation = 2e-7; class dgConservationLawShallowWater2d::advection: public dataCacheDouble { dataCacheDouble / public: advection(dataCacheMap &cacheMap): - dataCacheDouble(cacheMap), + dataCacheDouble(cacheMap,cacheMap.getNbEvaluationPoints(),9), sol(cacheMap.get("Solution",this)) {}; void _eval () { int nQP = sol().size1(); - if(_value.size1() != nQP) - _value=fullMatrix<double>(nQP,9); for(int i=0; i< nQP; i++) { double eta = sol(i,0); double u = sol(i,1); double v = sol(i,2); // flux_x - _value(i,0) = h*u; - _value(i,1) = g*eta; - _value(i,2) = 0; + _value(i,0) = (h+eta)*u; + _value(i,1) = g*eta+u*u; + _value(i,2) = u*v; // flux_y - _value(i,3) = h*v; - _value(i,4) = 0; - _value(i,5) = g*eta; + _value(i,3) = (h+eta)*v; + _value(i,4) = v*u; + _value(i,5) = g*eta+v*v; // flux_z _value(i,6) = 0; _value(i,7) = 0; @@ -35,27 +34,29 @@ class dgConservationLawShallowWater2d::advection: public dataCacheDouble { }; class dgConservationLawShallowWater2d::source: public dataCacheDouble { - dataCacheDouble &xyz, &solution; + dataCacheDouble &xyz, &solution,&solutionGradient; public : source(dataCacheMap &cacheMap) : - dataCacheDouble(cacheMap), + dataCacheDouble(cacheMap,cacheMap.getNbEvaluationPoints(),3), xyz(cacheMap.get("XYZ",this)), - solution(cacheMap.get("Solution",this)) + solution(cacheMap.get("Solution",this)), + solutionGradient(cacheMap.get("SolutionGradient",this)) {} void _eval () { - int nQP = xyz().size1(); - if(_value.size1() != nQP) - _value = fullMatrix<double>(nQP,3); + int nQP =_value.size1(); for (int i=0; i<nQP; i++) { double eta = solution(i,0); double u = solution(i,1); double v = solution(i,2); + double dudx = solutionGradient(i*3,1); + double dvdx = solutionGradient(i*3,2); + double dudy = solutionGradient(i*3+1,1); + double dvdy = solutionGradient(i*3+1,2); double wind = 0.1*sin(xyz(i,1)/1e6*M_PI)/1000/h; double f = 1e-4+xyz(i,1)*2e-11; - double gamma = 1e-6; _value (i,0) = 0; - _value (i,1) = f*v + - gamma*u + wind; - _value (i,2) = -f*u - gamma*v ; + _value (i,1) = f*v + - linearDissipation*u + wind + u*(dudx+dvdy); + _value (i,2) = -f*u - linearDissipation*v + v*(dudx+dvdy); } } }; @@ -63,33 +64,63 @@ class dgConservationLawShallowWater2d::riemann:public dataCacheDouble { dataCacheDouble &normals, &solL, &solR; public: riemann(dataCacheMap &cacheMapLeft, dataCacheMap &cacheMapRight): - dataCacheDouble(cacheMapLeft), + dataCacheDouble(cacheMapLeft,cacheMapLeft.getNbEvaluationPoints(),6), normals(cacheMapLeft.get("Normals", this)), solL(cacheMapLeft.get("Solution", this)), solR(cacheMapRight.get("Solution", this)) {}; void _eval () { int nQP = solL().size1(); - if(_value.size1() != nQP) - _value = fullMatrix<double>(nQP,6); for(int i=0; i< nQP; i++) { double nx = normals(0,i); double ny = normals(1,i); + double HR = solR(i,0) + h, HL = solL(i,0) + h; + double uL = nx*solL(i,1) + ny*solL(i,2), uR = nx*solR(i,1) + ny*solR(i,2); + double vL = -ny*solL(i,1) + nx*solL(i,2), vR = - ny*solR(i,1) + nx*solR(i,2); + double HuL = uL*HL, HuR = uR*HR; + double HvL = vL*HL, HvR = vR*HR; + double HM = (HL+HR)/2, HJ = (HL-HR)/2; + double HuM = (HuL+HuR)/2, HuJ = (HuL-HuR)/2; + double HvM = (HvL+HvR)/2, HvJ = (HvL-HvR)/2; + double sqHL = sqrt(HL), sqHR = sqrt(HR); + double u_roe = (sqHL*uL + sqHR*uR) / (sqHL + sqHR); + double v_roe = (sqHL*vL + sqHR*vR) / (sqHL + sqHR); + double c_roe = sqrt(g*HM); + double H = HM + (HuJ - u_roe *HJ) / c_roe; + double Hu = HuM + (c_roe - u_roe*u_roe/c_roe) *HJ + u_roe/c_roe *HuJ; + double Hv = -v_roe*u_roe/c_roe*HJ + v_roe/c_roe*HuJ + (u_roe>0 ? -v_roe*HJ+HvL : v_roe*HJ+HvR); + double u = Hu / H; + double v = Hv / H; + double eta = H-h; + + /*double u = (uL+uR)/2; // + double v = (vL+vR)/2; + double eta = (HL+HR)/2-h; + double c = hypot(u,v)+sqrt(g*(h+eta)); + double Fun = -g*eta - u*u - (uL-uR)/2 * c; + double Fut = -u*( u>0 ? vL:vR); + double Feta = -(h+eta)*u - (HL-HR)/2 * c;*/ + + double Fun = -g*eta - u*u; + double Fut = -u*v; + double Feta = -(h+eta)*u; + + /* //linear equations double unL = nx*solL(i,1) + ny*solL(i,2); double unR = nx*solR(i,1) + ny*solR(i,2); - double utL = ny*solL(i,1) - nx*solL(i,2); - double utR = ny*solR(i,1) - nx*solR(i,2); double etaR = solR(i,0); double etaL = solL(i,0); double sq_g_h = sqrt(g/h); double etaRiemann = (etaL+etaR + (unL-unR)/sq_g_h)/2; double unRiemann = (unL+unR + (etaL-etaR)*sq_g_h)/2; double Fun = -g*etaRiemann; + double Fut = 0; double Feta = -h*unRiemann; - _value(i,0) = Feta; - _value(i,1) = Fun*nx; - _value(i,2) = Fun*ny; + */ + _value(i,0) = Feta; + _value(i,1) = Fun*nx - Fut*ny; + _value(i,2) = Fun*ny + Fut*nx; _value(i,3) = -_value(i,0); _value(i,4) = -_value(i,1); _value(i,5) = -_value(i,2); diff --git a/Solver/dgGroupOfElements.cpp b/Solver/dgGroupOfElements.cpp index c897f27887..96ada631f2 100644 --- a/Solver/dgGroupOfElements.cpp +++ b/Solver/dgGroupOfElements.cpp @@ -940,7 +940,7 @@ void dgGroupCollection::buildGroups(GModel *model, int dim, int order,std::strin Msg::Info("%d groups of elements",localElements.size()); for (int n=0; n<localElements.size(); n++) { - printf("\n **** Group %d: %d elements **** \n", n,localElements[n].size()); + printf("\n **** Group %i: %lu elements **** \n", n,localElements[n].size()); } // do a group of elements for every element type in the mesh for (std::map<int, std::vector<MElement *> >::iterator it = localElements.begin(); it !=localElements.end() ; ++it){ diff --git a/Solver/dgSlopeLimiter.cpp b/Solver/dgSlopeLimiter.cpp index 6f1009f33b..f7c0ae70d1 100644 --- a/Solver/dgSlopeLimiter.cpp +++ b/Solver/dgSlopeLimiter.cpp @@ -6,6 +6,7 @@ //---------------------------------------------------------------------------------- bool dgSlopeLimiter::apply ( dgDofContainer &solution, dgGroupCollection &groups) { + printf("limit \n"); solution.scatter(); int nbFields =_claw->nbFields(); diff --git a/Solver/dgSystemOfEquations.cpp b/Solver/dgSystemOfEquations.cpp index 29af76404b..89189337d9 100644 --- a/Solver/dgSystemOfEquations.cpp +++ b/Solver/dgSystemOfEquations.cpp @@ -215,7 +215,7 @@ void dgSystemOfEquations::export_solution_as_is (const std::string &name){ fullMatrix<double> sol = getSolutionProxy (i, iElement); fprintf(f,"%d %d",num,sol.size1()); for (int k=0;k<sol.size1();++k) { - fprintf(f," %12.5E ",sol(k,ICOMP)); + fprintf(f," %.16E ",sol(k,ICOMP)); } fprintf(f,"\n"); } -- GitLab