Source code for pymor.discretizers.builtin.list
# This file is part of the pyMOR project (http://www.pymor.org).
# Copyright 2013-2020 pyMOR developers and contributors. All rights reserved.
# License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
from pymor.algorithms.preassemble import preassemble
from pymor.algorithms.rules import RuleTable, match_class
from pymor.models.interface import Model
from pymor.operators.constructions import (AdjointOperator, AffineOperator, Concatenation,
FixedParameterOperator, LincombOperator,
SelectionOperator, VectorArrayOperator,
VectorFunctional, VectorOperator)
from pymor.operators.list import NumpyListVectorArrayMatrixOperator
from pymor.operators.numpy import NumpyMatrixOperator
from pymor.vectorarrays.list import NumpyListVectorSpace
[docs]def convert_to_numpy_list_vector_array(obj):
"""Use NumpyListVectorArrayMatrixOperator instead of NumpyMatrixOperator.
This simple function recursively converts |NumpyMatrixOperators| to corresponding
:class:`NumpyListVectorArrayMatrixOperators <pymor.operators.list.NumpyListVectorArrayMatrixOperator>`.
Parameters
----------
obj
Either an |Operator|, e.g. |NumpyMatrixOperator| or a |LincombOperator| of
|NumpyMatrixOperators|, or an entire |Model| that is to be converted.
Returns
-------
The converted |Operator| or |Model|.
"""
obj = preassemble(obj)
return ConvertToNumpyListVectorArrayRules().apply(obj)
[docs]class ConvertToNumpyListVectorArrayRules(RuleTable):
def __init__(self):
super().__init__(use_caching=True)
@match_class(AdjointOperator, AffineOperator, Concatenation,
FixedParameterOperator, LincombOperator, SelectionOperator,
Model)
def action_recurse(self, op):
return self.replace_children(op)
@match_class(NumpyMatrixOperator)
def action_NumpyMatrixOperator(self, op):
vector = op.source.dim == 1
functional = op.range.dim == 1
if vector and functional:
raise NotImplementedError
if vector:
space = NumpyListVectorSpace(op.range.dim, op.range.id)
return VectorOperator(space.from_numpy(op.matrix.reshape((1, -1))), op.name)
elif functional:
space = NumpyListVectorSpace(op.source.dim, op.source.id)
return VectorFunctional(space.from_numpy(op.matrix.ravel()), op.name)
else:
return op.with_(new_type=NumpyListVectorArrayMatrixOperator)
@match_class(VectorArrayOperator)
def action_VectorArrayOperator(self, op):
space = NumpyListVectorSpace(op.array.dim, op.array.space.id)
return op.with_(new_type=VectorArrayOperator,
array=space.from_numpy(op.array.to_numpy()))