diff --git a/Solver/TESTCASES/Diffusion3D.lua b/Solver/TESTCASES/Diffusion3D.lua new file mode 100644 index 0000000000000000000000000000000000000000..d53fb73abb9eaa8d11dcdb90d5d421209706f8a3 --- /dev/null +++ b/Solver/TESTCASES/Diffusion3D.lua @@ -0,0 +1,96 @@ +model = GModel() +-- model:load('tetrahedra.geo') +-- model:load('tetrahedra.msh') +-- model:load('prisms.geo') +-- model:load('prisms.msh') +model:load('mixed.geo') +model:load('mixed.msh') +dg = dgSystemOfEquations(model) +dg:setOrder(1) + +-- initial condition +function initial_condition( xyz , f ) + for i=0,xyz:size1()-1 do + x = xyz:get(i,0) + y = xyz:get(i,1) + z = xyz:get(i,2) + f:set (i, 0, math.exp(-50*((x-0.4)^2+(y-0.3)^2))) +-- f:set (i, 0, math.exp(-50*((x-0.4)^2+(z+0.3)^2))) + end +end + +-- conservation law +-- advection speed +v=fullMatrix(3,1); +v:set(0,0,0) +v:set(1,0,0) +v:set(2,0,0) + +nu=fullMatrix(1,1); +nu:set(0,0,0.01) + +-- diffusion function + +law = dgConservationLawAdvectionDiffusion(functionConstant(v):getName(),functionConstant(nu):getName()) +dg:setConservationLaw(law) + +-- boundary condition +outside=fullMatrix(1,1) +outside:set(0,0,0.15) +-- freestream=law:newOutsideValueBoundary(functionLua(1,'initial_condition',{'XYZ'}):getName()) + +-- law:addBoundaryCondition('wall',law:new0FluxBoundary()) +-- law:addBoundaryCondition('inlet',freestream) +-- law:addBoundaryCondition('outlet',law:newSymmetryBoundary()) +-- law:addBoundaryCondition('symmetry',law:newSymmetryBoundary()) + +-- law:addBoundaryCondition('wall',law:new0FluxBoundary()) +-- law:addBoundaryCondition('inlet',law:new0FluxBoundary()) +-- law:addBoundaryCondition('outlet',law:new0FluxBoundary()) +-- law:addBoundaryCondition('symmetry',law:new0FluxBoundary()) + +law:addBoundaryCondition('side1',law:new0FluxBoundary()) +law:addBoundaryCondition('side2',law:new0FluxBoundary()) +law:addBoundaryCondition('side3',law:new0FluxBoundary()) +law:addBoundaryCondition('side4',law:new0FluxBoundary()) +law:addBoundaryCondition('top',law:newSymmetryBoundary()) +law:addBoundaryCondition('bottom',law:newSymmetryBoundary()) + +dg:setup() + +dg:L2Projection(functionLua(1,'initial_condition',{'XYZ'}):getName()) + +dt = 0.4 +--CFL = 20 -- good for lc=0.1 mesh +CFL = 10 +dt = CFL*dg:computeInvSpectralRadius() +-- export_interval = 5*dt +export_interval = 0.05 +end_time = 3 +output_dir = 'output' +output_prefix = 'diff3d' +output_pattern = output_dir .. '/' .. output_prefix .. '-' + + +-- main loop +next_export_time = export_interval +export_count = 0 +io.write(string.format('Export: %d iter: %4d t: %.6f n: %.8f dt:%.8f\n',export_count,0,0,0,dt)) +dg:exportSolution(output_pattern .. string.format("%05d",export_count)) +for i=1,10000 do + dt = CFL*dg:computeInvSpectralRadius() + norm = dg:RK44(dt) + time = i*dt + io.write('.') + io.flush() + if (time >= next_export_time) then + export_count = export_count +1 + io.write('\n') + io.write(string.format('Export: %d iter: %4d t: %.6f n: %.8f dt:%.8f\n',export_count,i,time,norm,dt)) + dg:exportSolution(output_pattern .. string.format("%05d",export_count)) + next_export_time = next_export_time + export_interval + end + if time >= end_time then + break + end +end diff --git a/Solver/TESTCASES/mixed.geo b/Solver/TESTCASES/mixed.geo new file mode 100644 index 0000000000000000000000000000000000000000..f5c0427dafde4a5fe05d50351c11e34f20b99c17 --- /dev/null +++ b/Solver/TESTCASES/mixed.geo @@ -0,0 +1,41 @@ +//*********** mixed.geo *************// +C = 1; +Lup = 1; +L = 1.; +lc = .3; + +Point(1) = {0.0, 0.0, -Lup, lc}; +Point(2) = {C , 0.0, -Lup, lc}; +Point(3) = {C , C , -Lup, lc}; +Point(4) = {0.0, C , -Lup, lc}; + +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {4,1}; + + +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; + +outtet[] = Extrude {0,0,0.7*L} { Surface{6};}; +// Printf("top surface = %g", outtet[0]); +// Printf("volume = %g", outtet[1]); +// Printf("side surfaces = %g %g %g %g", outtet[2], outtet[3], outtet[4], outtet[5]); + +outpri[]= Extrude {0,0,0.5*L}{ Surface{outtet[0]}; Layers{4};Recombine;}; +// outv[]= Extrude {0,0,0.5*L}{ Surface{7}; Layers{5};Recombine;}; +// Printf("top surface = %g", outpri[0]); +// Printf("volume = %g", outpri[1]); +// Printf("side surfaces = %g %g %g %g", outpri[2], outpri[3], outpri[4], outpri[5]); + +Mesh.Algorithm3D=4; // frontal [lobes] + +Physical Surface("top") = {outpri[0]}; +Physical Surface("bottom") = {5}; +Physical Surface("side1") = {outpri[2],outtet[2]}; +Physical Surface("side2") = {outpri[3],outtet[3]}; +Physical Surface("side3") = {outpri[4],outtet[4]}; +Physical Surface("side4") = {outpri[5],outtet[5]}; +Physical Volume("volume") = {outtet[1],outpri[1]}; +