Skip to content

Commit cf54ad1

Browse files
authored
Merge pull request #26 from pymor/fix_vecarray_bindings
Update VectorArray bindings
2 parents 7bab74b + 80492d4 commit cf54ad1

File tree

6 files changed

+39
-62
lines changed

6 files changed

+39
-62
lines changed

.ci/job-template.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ jobs:
99

1010
strategy:
1111
matrix:
12-
9.3_3.7:
13-
containerImage: pymor/dealii_py3.7:47f2bf40dd49a64292e482b59fe6631101fdcc2b
1412
9.3_3.8:
1513
containerImage: pymor/dealii_py3.8:47f2bf40dd49a64292e482b59fe6631101fdcc2b
1614
9.3_3.9:

.github/workflows/checks.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ jobs:
1414
source:
1515
runs-on: ubuntu-latest
1616
steps:
17-
- uses: actions/checkout@v2
17+
- uses: actions/checkout@v3
1818
- name: markdown-link-check
19-
uses: gaurav-nelson/github-action-markdown-link-check@1.0.13
19+
uses: renefritze/github-action-markdown-link-check@master
2020
with:
2121
use-verbose-mode: 'yes'
2222
check-modified-files-only: 'yes'

.pre-commit-config.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22
# See https://pre-commit.com/hooks.html for more hooks
33
repos:
44
- repo: https://github.com/pre-commit/pre-commit-hooks
5-
rev: v3.2.0
5+
rev: v4.3.0
66
hooks:
77
- id: trailing-whitespace
88
- id: check-yaml
99
- id: check-added-large-files
1010
- id: debug-statements
1111
- repo: https://github.com/psf/black
12-
rev: 21.11b0
12+
rev: 22.6.0
1313
hooks:
1414
- id: black
1515
- repo: https://github.com/pycqa/flake8
16-
rev: 3.9.2
16+
rev: 4.0.1
1717
hooks:
1818
- id: flake8
1919
exclude: "^(versioneer.py|src/pymor_dealii/version.py)"
2020
- repo: https://github.com/pre-commit/mirrors-clang-format
21-
rev: 'v13.0.0'
21+
rev: 'v14.0.6'
2222
hooks:
2323
- id: clang-format
2424
exclude: "^lib/pybind11"

src/pymor_dealii/pymor/gui.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ def __init__(self, impl):
1313
def visualize(
1414
self,
1515
U,
16-
discretization,
1716
title=None,
1817
legend=None,
1918
separate_colorbars=True,
@@ -36,4 +35,7 @@ def visualize(
3635
filenames = ["_".join((base_name, l)) for l in legend]
3736

3837
for u, n in zip(U, filenames):
39-
self.impl.visualize(u._list[0].impl, n + ".vtk")
38+
uu = u.vectors[0]
39+
if uu.imag_part is not None:
40+
self.logger.warning("Imaginary part ignored.")
41+
self.impl.visualize(uu.real_part.impl, n + ".vtk")

src/pymor_dealii/pymor/operator.py

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,38 @@
22
# Copyright 2013-2018 pyMOR developers and contributors. All rights reserved.
33
# License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
44

5-
from pymor.operators.interface import Operator
5+
from pymor.operators.list import LinearComplexifiedListVectorArrayOperatorBase
66

77
from pymor_dealii.pymor.vectorarray import DealIIVectorSpace
88
import pymor_dealii_bindings as pd2
99

1010

11-
class DealIIMatrixOperator(Operator):
11+
class DealIIMatrixOperator(LinearComplexifiedListVectorArrayOperatorBase):
1212
"""Wraps a dealII matrix as an |Operator|."""
1313

14-
linear = True
15-
1614
def __init__(self, matrix, name=None):
1715
self.source = DealIIVectorSpace(matrix.m())
1816
self.range = DealIIVectorSpace(matrix.n())
1917
self.__auto_init(locals())
2018

21-
def apply(self, U, mu=None):
22-
assert U in self.source
23-
R = self.range.zeros(len(U))
24-
for u, r in zip(U._list, R._list):
25-
self.matrix.vmult(r.impl, u.impl)
26-
return R
27-
28-
def apply_transpose(self, V, mu=None):
29-
assert V in self.range
30-
U = self.source.zeros(len(V))
31-
for u, r in zip(V._list, U._list):
32-
self.matrix.Tvmult(r.impl, u.impl)
33-
return U
34-
35-
def apply_inverse(self, V, mu=None, initial_guess=None, least_squares=False):
36-
assert V in self.range
19+
def _real_apply_one_vector(self, u, mu=None, prepare_data=None):
20+
r = self.range.real_zero_vector()
21+
self.matrix.vmult(r.impl, u.impl)
22+
return r
23+
24+
def _real_apply_inverse_one_vector(
25+
self, v, mu=None, initial_guess=None, least_squares=False, prepare_data=None
26+
):
3727
if least_squares:
3828
raise NotImplementedError
39-
R = self.source.zeros(len(V))
40-
for r, v in zip(R._list, V._list):
41-
self.matrix.cg_solve(r.impl, v.impl)
42-
return R
29+
r = self.source.real_zero_vector()
30+
self.matrix.cg_solve(r.impl, v.impl)
31+
return r
32+
33+
def _real_apply_adjoint_one_vector(self, v, mu=None, prepare_data=None):
34+
r = self.source.real_zero_vector()
35+
self.matrix.Tvmult(r.impl, v.impl)
36+
return r
4337

4438
def _assemble_lincomb(
4539
self,

src/pymor_dealii/pymor/vectorarray.py

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import numpy as np
1313

14-
from pymor.vectorarrays.list import ListVectorSpace, CopyOnWriteVector
14+
from pymor.vectorarrays.list import ComplexifiedListVectorSpace, CopyOnWriteVector
1515

1616

1717
class DealIIVector(CopyOnWriteVector):
@@ -48,6 +48,10 @@ def _axpy(self, alpha, x):
4848
return
4949
if x is self:
5050
self.impl *= 1.0 + alpha
51+
elif x == 1:
52+
self.impl += x.impl
53+
elif x == -1:
54+
self.impl -= x.impl
5155
else:
5256
self.impl.axpy(alpha, x.impl)
5357

@@ -79,32 +83,11 @@ def amax(self):
7983
max_ind = np.argmax(A)
8084
return max_ind, A[max_ind]
8185

82-
def __add__(self, other):
83-
return DealIIVector(self.impl + other.impl)
8486

85-
def __iadd__(self, other):
86-
self._copy_data_if_needed()
87-
self.impl += other.impl
88-
return self
87+
class DealIIVectorSpace(ComplexifiedListVectorSpace):
8988

90-
__radd__ = __add__
89+
real_vector_type = DealIIVector
9190

92-
def __sub__(self, other):
93-
return DealIIVector(self.impl - other.impl)
94-
95-
def __isub__(self, other):
96-
self._copy_data_if_needed()
97-
self.impl -= other.impl
98-
return self
99-
100-
def __mul__(self, other):
101-
return DealIIVector(self.impl * other)
102-
103-
def __neg__(self):
104-
return DealIIVector(-self.impl)
105-
106-
107-
class DealIIVectorSpace(ListVectorSpace):
10891
def __init__(self, dim, id=None):
10992
self.__auto_init(locals())
11093

@@ -123,13 +106,13 @@ def space_from_vector_obj(cls, vec, id):
123106
def space_from_dim(cls, dim, id):
124107
return cls(dim, id)
125108

126-
def zero_vector(self):
109+
def real_zero_vector(self):
127110
return DealIIVector(pd2.Vector(self.dim))
128111

129-
def make_vector(self, obj):
112+
def real_make_vector(self, obj):
130113
return DealIIVector(obj)
131114

132-
def vector_from_numpy(self, data, ensure_copy=False):
133-
v = self.zero_vector()
115+
def real_vector_from_numpy(self, data, ensure_copy=False):
116+
v = self.real_zero_vector()
134117
v.to_numpy()[:] = data
135118
return v

0 commit comments

Comments
 (0)