Hello everyone, I am calculating the lift and drag coefficients in the code for the N-S 2D-2 (Re=100,periodic) equations. But I do not get quantities which are even close to result of benchmark computations ( http://www.mathematik.tu-dortmund.de/lsiii/cms/papers/SchaeferTurek1996.pdf ) (Table 4). My code is based on Solving PDEs in Python - The FEniCS Tutorial Volume I .
I upload only related part of code :
from fenics import *
from mshr import *
import numpy as np
......
n=FacetNormal(mesh)
t=0
drag = []
lift = []
C_d = []
C_l = []
p_diff = []
U_mean = 0.2
L = 0.1
bc = MeshFunction("size_t",mesh,mesh.topology().dim()-1)
ds = ds(domain=mesh,subdomain_data=bc, subdomain_id=4)
for j in range(num_steps):
# Update current time
t += dt
# Step 1: Tentative velocity step
b1 = assemble(L1)
[bc.apply(b1) for bc in bcu]
solve(A1, u_.vector(), b1, 'bicgstab', 'hypre_amg')
# Step 2: Pressure correction step
b2 = assemble(L2)
[bc.apply(b2) for bc in bcp]
solve(A2, p_.vector(), b2, 'bicgstab', 'hypre_amg')
# Step 3: Velocity correction step
b3 = assemble(L3)
solve(A3, u_.vector(), b3, 'cg', 'sor')
# Save solution to file (XDMF/HDF5)
xdmffile_u.write(u_, t)
xdmffile_p.write(p_, t)
# Save nodal values to file
timeseries_u.store(u_.vector(), t)
timeseries_p.store(p_.vector(), t)
# Update previous solution
u_n.assign(u_)
p_n.assign(p_)
set_log_level(LogLevel.PROGRESS)
progress += 1
set_log_level(LogLevel.ERROR)
print('u max:', u_.vector().get_local().max())
print('p max:', p_.vector().get_local().max())
force = -p_*n + nu*dot(sym(grad(u_)),n)
F_D = assemble(-force[0]*ds)
F_L = assemble(-force[1]*ds)
C_D = 2/(U_mean**2*L)*F_D
C_L = 2/(U_mean**2*L)*F_L
Also, I am not sure ds(4) or ds(5)
dokken
November 19, 2021, 7:32pm
2
Please format your code with 3x` encapsulation.
You should Also consider having a look at:
https://jorgensd.github.io/dolfinx-tutorial/chapter2/ns_code2.html
Or
I have already looked at Test problem 2: Flow past a cylinder (DFG 2D-3 benchmark) — FEniCSx tutorial .
But this is for case 2D-3 Benchmark solved by multimesh finite element method.
dokken
November 19, 2021, 7:56pm
4
The key is that the variational forms for a single mesh approach contains all the same terms as the single mesh approach.
Also note that the initial scheme proposed in
Is based on a less accurate splitting scheme than the one in:
Please also consider refining the mesh and spatial discretization.
My point of referring to the multi mesh paper is that you can find the source code at: Source code for: A multimesh finite element method for the Navier-Stokes equations based on projection methods
Source code is really advanced. I need longtime to advance in it.
Do you know if there is any source code for case 2D-2 Benchmark?
I appreciate your help Prof. Dokken
In Case 2D-2, There is not any term U(t)=1.5sin(πt/8)
dokken
November 20, 2021, 8:24am
7
But the whole point of the two other codes I have supplied is that the discretization, and post processing (computing lift and drag) is verified by solving the 2D-3 benchmark. This means that you should be able to use the same code for 2D-2, as the PDEs are the same, only with a different boundary condition.
Be aware of a few things:
when you start your flow from a zero state, with a sudden I let velocity as in 2D-2, you get a pressure wave in the startup phase of the problem, that will reduce convergence orders of the space-time L^2 norm.
1 Like
So I need to install Dolfinx. Is installation as same as Dolfin?
What else do you recommend me to install beside Dolfinx?
dokken
November 20, 2021, 7:25pm
9
As both dolfin and dolfinx uses ufl to create variational forms and functionals you can easily change the implementation to dolfin if you want to ,
as the tutorial of dolfinx Im referring to is based on
I would suggest you read through the introduction to the dolfinx tutorial, or check out GitHub - FEniCS/dolfinx: Next generation FEniCS problem solving environment if you want to install dolfinx.