6import scipy.sparse.linalg
7from scipy.sparse
import lil_matrix
10import dune.grid
as grid
11import dune.functions
as functions
19def localAssembler(localView, volumeTerm):
25 element = localView.element()
28 localBasis = localView.tree().finiteElement().localBasis
31 localA = np.zeros((n,n))
35 quadRule = dune.geometry.quadratureRule(element.type, order=4)
39 integrationElement = element.geometry.integrationElement(pt.position)
42 values = localBasis.evaluateFunction(pt.position)
45 referenceJacobians = localBasis.evaluateJacobian(pt.position)
48 geometryJacobianInverse = element.geometry.jacobianInverse(pt.position)
49 jacobians = [ np.dot(np.array(g)[0], geometryJacobianInverse)
for g
in referenceJacobians ]
51 quadPosGlobal = element.geometry.toGlobal(pt.position)
55 localA[i,j] += pt.weight * integrationElement * np.dot(jacobians[i], jacobians[j])
57 localB[i] += pt.weight * integrationElement * values[i] * volumeTerm(quadPosGlobal)
65def assembleLaplaceMatrix(basis, volumeTerm):
77 localView = basis.localView()
81 for element
in grid.elements:
84 localView.bind(element)
87 localN = len(localView)
90 localA, localb = localAssembler(localView, volumeTerm)
93 for i
in range(localN):
95 gi = localView.index(i)[0]
99 for j
in range(localN):
100 gj = localView.index(j)[0]
101 A[gi, gj] += localA[i, j]
115grid = grid.structuredGrid([0,0],[1,1],[gridSize,gridSize])
120basis = functions.defaultGlobalBasis(grid, functions.Lagrange(order=2))
128A,b = assembleLaplaceMatrix(basis, f)
133isDirichlet = np.zeros(len(basis))
135def markDOF(boundaryDOFNumber):
136 isDirichlet[boundaryDOFNumber] =
True
138functions.boundarydofs.forEachBoundaryDOF(basis,markDOF)
143dirichletValueFunction =
lambda x : np.sin(2*np.pi*x[0])
146dirichletValues = np.zeros(len(basis))
147basis.interpolate(dirichletValues, dirichletValueFunction)
152rows, cols = A.nonzero()
154for i,j
in zip(rows, cols):
160 b[i] = dirichletValues[i]
165x = scipy.sparse.linalg.spsolve(A, b)
170uh = basis.asFunction(x)
172vtkWriter = grid.vtkWriter(subsampling=2)
173uh.addToVTKWriter(
"u", vtkWriter, dune.grid.DataType.PointData)
174vtkWriter.write(
"poisson-pq2-result")