# Renormalize vector ideomatically

**URL:** <https://fenicsproject.discourse.group/t/renormalize-vector-ideomatically/7068>\
**Category:** dolfinx\
**Created:** [November 12, 2021, 6:09pm UTC](https://fenicsproject.discourse.group/t/renormalize-vector-ideomatically/7068 "2021-11-12T18:09:51Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![MatsievskiySV](https://avatars.discourse-cdn.com/v4/letter/m/439d5e/32.png) [@MatsievskiySV](https://fenicsproject.discourse.group/u/MatsievskiySV)\
**Post date:** [November 12, 2021, 6:09pm UTC](https://fenicsproject.discourse.group/t/renormalize-vector-ideomatically/7068/1 "2021-11-12T18:09:51Z")

</div>

I’m solving a linear system A\hat{x}=b with normalized function \hat{x} = ax. Normalization coefficient a is an expression of some `dolfinx.Constant` objects (not a `dolfinx.Form`).  
What is the idiomatic way of renormalizing solution vector x=\hat{x}/a in dolfinx?

---

<div class="post-metadata">

**Author:** ![dokken](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/dokken/32/1560_2.png) [@dokken](https://fenicsproject.discourse.group/u/dokken)\
**Post date:** [November 12, 2021, 8:16pm UTC](https://fenicsproject.discourse.group/t/renormalize-vector-ideomatically/7068/2 "2021-11-12T20:16:23Z")

</div>

How about

```python
u.x.array[:] /= constant.value[0]

```

---

<div class="post-metadata">

**Author:** ![MatsievskiySV](https://avatars.discourse-cdn.com/v4/letter/m/439d5e/32.png) [@MatsievskiySV](https://fenicsproject.discourse.group/u/MatsievskiySV)\
**Post date:** [November 12, 2021, 8:31pm UTC](https://fenicsproject.discourse.group/t/renormalize-vector-ideomatically/7068/3 "2021-11-12T20:31:11Z")

</div>

Then I would need to write down the normalization equation two times in the source code, which is error prone. I was hoping for some kind of `assemble_vector` magic…

---

<div class="post-metadata">

**Author:** ![dokken](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/dokken/32/1560_2.png) [@dokken](https://fenicsproject.discourse.group/u/dokken)\
**Post date:** [November 12, 2021, 8:44pm UTC](https://fenicsproject.discourse.group/t/renormalize-vector-ideomatically/7068/4 "2021-11-12T20:44:44Z")

</div>

Assemble vector would be alot more expensive (computationally) compared to applying it directly to a vector.

Why cant you make a convenience function:

```auto
def scale(u, alpha):
    u.vector.array/alpha.value[0]

```

And use this function twice ?

---

<div class="post-metadata">

**Author:** ![MatsievskiySV](https://avatars.discourse-cdn.com/v4/letter/m/439d5e/32.png) [@MatsievskiySV](https://fenicsproject.discourse.group/u/MatsievskiySV)\
**Post date:** [November 13, 2021, 7:15am UTC](https://fenicsproject.discourse.group/t/renormalize-vector-ideomatically/7068/5 "2021-11-13T07:15:28Z")

</div>

I think, it worked.

```python
import dolfinx
from mpi4py import MPI
import ufl
from petsc4py import PETSc

mesh = dolfinx.UnitSquareMesh(MPI.COMM_WORLD, 10, 10)
V = dolfinx.FunctionSpace(mesh, ("CG", 1))

c1 = dolfinx.Constant(V, 1)
c2 = dolfinx.Constant(V, 2)
c3 = dolfinx.Constant(V, 3)

expr = c1*c2+c3**2

def simplify(expr):
    if issubclass(type(expr), ufl.core.operator.Operator):
        return PETSc.ScalarType(expr. __class__ (*[simplify(e) for e in expr.ufl_operands]))
    elif issubclass(type(expr), dolfinx.Constant):
        return PETSc.ScalarType(expr.value)
    elif issubclass(type(expr), ufl.constantvalue.ConstantValue):
        return PETSc.ScalarType(expr)
    else:
        raise TypeError(f"Unsupported type {type(expr)}")

print(expr)
print(simplify(expr))
c3.value = -2
print(simplify(expr))

```

Now I can use `expr` in the forms and obtain its value calling `simplify(expr)`.
