File: test_mesh.py

package info (click to toggle)
io4dolfinx 1.1.2-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 832 kB
  • sloc: python: 8,419; sh: 29; makefile: 3
file content (56 lines) | stat: -rw-r--r-- 1,937 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from mpi4py import MPI

import dolfinx
import numpy as np
import pytest
import ufl

from io4dolfinx import reconstruct_mesh


@pytest.mark.parametrize("dtype", [np.float32, np.float64])
@pytest.mark.parametrize("degree", [2, 3])
@pytest.mark.parametrize("R", [0.1, 1, 10])
def test_curve_mesh(degree, dtype, R):
    N = 8
    mesh = dolfinx.mesh.create_rectangle(
        MPI.COMM_WORLD,
        [[-1, -1], [1, 1]],
        [N, N],
        diagonal=dolfinx.mesh.DiagonalType.crossed,
        dtype=dtype,
    )
    org_area = dolfinx.fem.form(1 * ufl.dx(domain=mesh), dtype=dtype)

    curved_mesh = reconstruct_mesh(mesh, degree)

    def transform(x):
        u = R * x[0] * np.sqrt(1 - (x[1] ** 2 / (2)))
        v = R * x[1] * np.sqrt(1 - (x[0] ** 2 / (2)))
        return np.asarray([u, v])

    curved_mesh.geometry.x[:, : curved_mesh.geometry.dim] = transform(curved_mesh.geometry.x.T).T

    area = dolfinx.fem.form(1 * ufl.dx(domain=curved_mesh), dtype=dtype)
    circumference = dolfinx.fem.form(1 * ufl.ds(domain=curved_mesh), dtype=dtype)

    computed_area = curved_mesh.comm.allreduce(dolfinx.fem.assemble_scalar(area), op=MPI.SUM)
    computed_circumference = curved_mesh.comm.allreduce(
        dolfinx.fem.assemble_scalar(circumference), op=MPI.SUM
    )

    tol = 10 * np.finfo(dtype).eps
    assert np.isclose(computed_area, np.pi * R**2, atol=tol)
    assert np.isclose(computed_circumference, 2 * np.pi * R, atol=tol)

    linear_mesh = reconstruct_mesh(curved_mesh, 1)
    linear_area = dolfinx.fem.form(1 * ufl.dx(domain=linear_mesh), dtype=dtype)

    recovered_area = linear_mesh.comm.allreduce(
        dolfinx.fem.assemble_scalar(linear_area), op=MPI.SUM
    )

    # Curve original mesh
    mesh.geometry.x[:, : mesh.geometry.dim] = transform(mesh.geometry.x.T).T
    ref_area = mesh.comm.allreduce(dolfinx.fem.assemble_scalar(org_area), op=MPI.SUM)
    assert np.isclose(recovered_area, ref_area, atol=tol)