# NLSolver speed

**URL:** <https://discourse.julialang.org/t/nlsolver-speed/97057>\
**Category:** General Usage\
**Tags:** gridap\
**Created:** [April 4, 2023, 10:20am UTC](https://discourse.julialang.org/t/nlsolver-speed/97057 "2023-04-04T10:20:38Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![larsudb](https://avatars.discourse-cdn.com/v4/letter/l/8edcca/32.png) [@larsudb](https://discourse.julialang.org/u/larsudb)\
**Post date:** [April 4, 2023, 10:20am UTC](https://discourse.julialang.org/t/nlsolver-speed/97057/1 "2023-04-04T10:20:38Z")

</div>

I have written a code for a lid-driven square cavity within gridap and am wondering if the solve time can be decreased easily.

using Gridap  
using LineSearches: BackTracking  
using TickTock  
using WriteVTK

n = 100  
domain = (0,1,0,1)  
partition = (n,n)  
model = CartesianDiscreteModel(domain,partition)  
labels = get\_face\_labeling(model)

add\_tag\_from\_tags!(labels,“sides”,[5,7,8])  
add\_tag\_from\_tags!(labels,“top”,[6])

D = 2  
order = 2  
degree = 2\*order

Ωₕ = Interior(model)  
dΩ = Measure(Ωₕ,degree)  
reffeᵤ = ReferenceFE(lagrangian,VectorValue{D,Float64},order)  
V = TestFESpace(Ωₕ,reffeᵤ,conformity=:H1,dirichlet\_tags=[“top”,“sides”])  
reffeₚ = ReferenceFE(lagrangian,Float64,order-1)  
Q = TestFESpace(Ωₕ,reffeₚ,conformity=:H1,constraint=:zeromean)

u\_wall(x, t) = VectorValue(cos(t),0)  
u\_wall(t::Real) = x → u\_wall(x, t)

u\_top(x, t) = VectorValue(1, 0)  
u\_top(t::Real) = x → u\_top(x, t)

U = TransientTrialFESpace(V,[u\_top,u\_wall])  
P = TransientTrialFESpace(Q)

Y = MultiFieldFESpace([V, Q])  
X = TransientMultiFieldFESpace([U, P])

res(t,(u,p),(v,q)) = ∫( ∂t(u)⋅v + ∇(u)⊙∇(v) - (∇⋅v)\*p + q⋅(∇⋅u))dΩ #- ∫( f(t)⋅v )dΩ - ∫( g(t)\*q )dΩ  
jac(t,(u,p),(du,dp),(v,q)) = ∫( ∇(du)⊙∇(v) - (∇⋅v)\*dp + q⋅(∇⋅du))dΩ  
jac\_t(t,(u,p),(dut,dpt),(v,q)) = ∫(v⋅dut)dΩ

op = TransientFEOperator(res,jac,jac\_t,X,Y)

nls = NLSolver(show\_trace = true,method = :newton,linesearch = BackTracking()) #,iterations=5

dt = 0.1  
θ = 0.5  
ode\_solver = ThetaMethod(nls,dt,θ)

u₀ = interpolate\_everywhere(VectorValue(0,0),U(0.0))  
p₀ = interpolate\_everywhere(0,P)  
x₀ = interpolate\_everywhere([u₀,p₀],X(0.0))

t₀ = 0  
T = 10  
xₕₜ = solve(ode\_solver,op,x₀,t₀,T)

@time createpvd(“transient\_stokes\_solution”) do pvd  
for (xₕ,t) in xₕₜ  
(uₕ,pₕ) = xₕ  
pvd[t] = createvtk(Ωₕ,“transient\_stokes\_solution\_$t”\*“.vtu”,cellfields=[“u”=\>uₕ,“p”=\>pₕ])  
end  
end
