Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
poisson-pq2.py

Commented version of this example This example on gitlab

1# SPDX-FileCopyrightText: Copyright © DUNE-FUFEM Project contributors, see file AUTHORS.md
2# SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
3
4import numpy as np
5import scipy.sparse.linalg
6
7import dune.common
8import dune.geometry
9import dune.grid
10import dune.functions
11
12from dune.grid import DataType
13from dune.functions import defaultGlobalBasis, Power, Composite, Lagrange
14
15from fufemforms import *
16from utilities import *
17
18
19
20# Scalar right hand side
21rhs = lambda x: 10
22
23# Dirichlet boundary values
24dirichletValues = lambda x : np.sin(2*np.pi*x[0])
25
26def isNear(a,b):
27 return np.abs(a-b) <= 1e-10
28
29# Indicator function of Dirichlet boundary
30isDirichlet = lambda x : isNear(x[0], 0) or isNear(x[0], 1) or isNear(x[1], 0) or isNear(x[1], 1)
31
32
33
34# Number of grid elements (in one direction)
35gridSize = 32
36
37# Create a grid of the unit square
38grid = dune.grid.structuredGrid([0,0],[1,1],[gridSize,gridSize])
39
40
41
42# Create a nodal Lagrange FE basis
43basis = defaultGlobalBasis(grid, Lagrange(order=2))
44
45print("Dimension of FE space is "+str(len(basis)))
46
47
48
49# Define Dirichlet constraints
50N = len(basis)
51
52# Mark all Dirichlet DOFs
53isConstrained = np.zeros( N, dtype=bool )
54basis.interpolate(isConstrained,isDirichlet)
55
56# Interpolate the boundary values
57constraintDOFValues = np.zeros( N )
58basis.interpolate(constraintDOFValues, dirichletValues)
59
60
61
62# Trial and test functions for variational problem
63u = trialFunction(basis)
64v = testFunction(basis)
65
66# Scalar rhs coefficient function
67f = Coefficient(rhs, basis.gridView)
68
69# Bilinear form and rhs functional
70a = integrate(dot(grad(u),grad(v)))
71l = integrate(f*v)
72
73
74
75# Assemble into matrix and vector
76assembler = GlobalAssembler(basis)
77A = assembler.assembleOperator(a)
78b = assembler.assembleFunctional(l)
79
80# Build constraints into matrix
81incorporateEssentialConstraints(A, b, isConstrained, constraintDOFValues)
82
83
84
85# Solve linear system!
86x = scipy.sparse.linalg.spsolve(A, b)
87
88
89u = basis.asFunction(x)
90
91vtk = grid.vtkWriter(2)
92u.addToVTKWriter("sol", vtk, DataType.PointData)
93vtk.write("poisson-pq2-py")
94
95
field_type dot(const type &newv) const
void print() const