123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """This demo solves the Stokes equations, using quadratic elements for
- the velocity and first degree elements for the pressure (Taylor-Hood elements)"""
- # Credits:
- # https://github.com/pf4d/fenics_scripts/blob/master/cbc_block/stokes.py
- from dolfin import *
- import numpy as np
- from vedo.dolfin import plot
- from vedo import Latex, dataurl, download
- # Load mesh and subdomains
- fpath = download(dataurl + "dolfin_fine.xml")
- mesh = Mesh(fpath)
- fpath = download(dataurl + "dolfin_fine_subdomains.xml.gz")
- sub_domains = MeshFunction("size_t", mesh, fpath)
- # Define function spaces
- P2 = VectorElement("Lagrange", mesh.ufl_cell(), 2)
- P1 = FiniteElement("Lagrange", mesh.ufl_cell(), 1)
- TH = P2 * P1
- W = FunctionSpace(mesh, TH)
- # No-slip boundary condition for velocity
- noslip = Constant((0, 0))
- bc0 = DirichletBC(W.sub(0), noslip, sub_domains, 0)
- # Inflow boundary condition for velocity
- inflow = Expression(("-sin(x[1]*pi)", "0.0"), degree=2)
- bc1 = DirichletBC(W.sub(0), inflow, sub_domains, 1)
- bcs = [bc0, bc1]
- # Define variational problem
- (u, p) = TrialFunctions(W)
- (v, q) = TestFunctions(W)
- f = Constant((0, 0))
- a = (inner(grad(u), grad(v)) - div(v) * p + q * div(u)) * dx
- L = inner(f, v) * dx
- w = Function(W)
- solve(a == L, w, bcs)
- # Split the mixed solution using a shallow copy
- (u, p) = w.split()
- ##################################################################### vedo
- f = r"-\nabla \cdot(\nabla u+p I)=f ~\mathrm{in}~\Omega"
- formula = Latex(f, pos=(0.55, 0.45, -0.05), s=0.1)
- plot(
- u,
- N=2,
- mode="mesh and arrows",
- scale=0.03,
- wireframe=True,
- scalarbar=False,
- style=1,
- ).close()
- plot(p, text="pressure", cmap="rainbow").close()
|