Commit a5ea9cea authored by Tim Keil's avatar Tim Keil Committed by René Fritze

decompose output functional in discretizer

parent 31d01d9b
...@@ -997,7 +997,7 @@ def discretize_stationary_cg(analytical_problem, diameter=None, domain_discretiz ...@@ -997,7 +997,7 @@ def discretize_stationary_cg(analytical_problem, diameter=None, domain_discretiz
If `True`, preassemble all operators in the resulting |Model|. If `True`, preassemble all operators in the resulting |Model|.
mu_energy_product mu_energy_product
If not `None`, |parameter values| for which to assemble the symmetric part of the |Operator| of the resulting If not `None`, |parameter values| for which to assemble the symmetric part of the |Operator| of the resulting
|Model| `fom` (ignoring the advection part). Thus, assuming no advection and a symmetric diffusion tensor, |Model| `fom` (ignoring the advection part). Thus, assuming no advection and a symmetric diffusion tensor,
`fom.products['energy']` is equal to `fom.operator.assemble(mu)`, except for the fact that the former has `fom.products['energy']` is equal to `fom.operator.assemble(mu)`, except for the fact that the former has
cleared Dirichlet rows and columns, while the latter only has cleared Dirichlet rows). cleared Dirichlet rows and columns, while the latter only has cleared Dirichlet rows).
...@@ -1192,9 +1192,22 @@ def discretize_stationary_cg(analytical_problem, diameter=None, domain_discretiz ...@@ -1192,9 +1192,22 @@ def discretize_stationary_cg(analytical_problem, diameter=None, domain_discretiz
if p.outputs: if p.outputs:
if any(v[0] not in ('l2', 'l2_boundary') for v in p.outputs): if any(v[0] not in ('l2', 'l2_boundary') for v in p.outputs):
raise NotImplementedError raise NotImplementedError
outputs = [L2Functional(grid, v[1], dirichlet_clear_dofs=False).H if v[0] == 'l2' else outputs = []
BoundaryL2Functional(grid, v[1], dirichlet_clear_dofs=False).H for v in p.outputs:
for v in p.outputs] if v[0] == 'l2':
if isinstance(v[1], LincombFunction):
ops = [L2Functional(grid, v_, dirichlet_clear_dofs=False).H
for v_ in v[1].functions]
outputs.append(LincombOperator(ops, v[1].coefficients))
else:
outputs.append(L2Functional(grid, v[1], dirichlet_clear_dofs=False).H)
else:
if isinstance(v[1], LincombFunction):
ops = [BoundaryL2Functional(grid, v_, dirichlet_clear_dofs=False).H
for v_ in v[1].functions]
outputs.append(LincombOperator(ops, v[1].coefficients))
else:
outputs.append(BoundaryL2Functional(grid, v[1], dirichlet_clear_dofs=False).H)
if len(outputs) > 1: if len(outputs) > 1:
from pymor.operators.block import BlockColumnOperator from pymor.operators.block import BlockColumnOperator
output_functional = BlockColumnOperator(outputs) output_functional = BlockColumnOperator(outputs)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment