Closed ConnorMallon closed 1 year ago
Hi @ConnorMallon can you try with larger values of the integration degree degree
?
Hey @fverdugo! The problem still remains after increasing degree
.
Hey @oriolcg , have you ever had a problem similar to this when solving for flow problems in a channel ? If I solve the Stokes problem in a channel I get the same solution blowup on the Neumann boundary when using a fine mesh:
module StokesChannel
using Test
using Gridap
import Gridap: ∇
u_in((x,y)) = VectorValue(y*(1-y),0)
u_s(x) = VectorValue(0,0)
hN(x) = VectorValue(0,0)
domain = (0,4,0,1)
partition = (400,100)
model = CartesianDiscreteModel(domain,partition)
labels = get_face_labeling(model)
add_tag_from_tags!(labels,"inlet",[1,3,7])
add_tag_from_tags!(labels,"no_slip",[2,4,5,6,])
add_tag_from_tags!(labels,"outlet",[8])
order = 2
reffe_u = ReferenceFE(lagrangian,VectorValue{2,Float64},order)
reffe_p = ReferenceFE(lagrangian,Float64,order-1)
V = TestFESpace(model,reffe_u,labels=labels,dirichlet_tags=["inlet","no_slip"],conformity=:H1)
Q = TestFESpace(model,reffe_p,labels=labels,conformity=:H1)
U = TrialFESpace(V,[u_in,u_s])
P = TrialFESpace(Q)
Y = MultiFieldFESpace([V,Q])
X = MultiFieldFESpace([U,P])
Ω = Triangulation(model)
Γ = BoundaryTriangulation(model,labels,tags="outlet")
n_Γ = get_normal_vector(Γ)
degree = order
dΩ = Measure(Ω,degree)
dΓ = Measure(Γ,degree)
a((u,p),(v,q)) = ∫( ∇(v)⊙∇(u) - (∇⋅v)*p + q*(∇⋅u) )*dΩ
l((v,q)) = ∫( v⋅hN )*dΓ
op = AffineFEOperator(a,l,X,Y)
uh, ph = solve(op)
writevtk(Ω,"stokes_sol",cellfields=["uh"=>uh,"ph"=>ph])
end # module
Not that the blowup doesn't occur for courser meshes. The problem goes away with P0 elements for the pressure.
problem is related to the linear solver. change the ls or add terms in the bottom right block to avoid the issue (e.g. h^2 (∇p ⋅ ∇q)
)
Refining the mesh in
test/GridapTests/StokesTaylorHoodTests.jl
( to e.g.partition = (200,200)
) results in some unexpected behaviour. The solution blows up at some locations on the boundary:The driver reproducing the results: