experiments/tests/test_minimisation.py

Sun, 04 Oct 2026 13:02:26 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sun, 04 Oct 2026 13:02:26 -0500
changeset 12
a0d61ac3719e
parent 1
a4137aedcb3a
permissions
-rw-r--r--

Various revisions:
* Proper line integrals,
* Boundary condition implementation fixes
* Higher simulation resolution for experiments
* Related parameter adjustments
* Updates related to updated pointsource_algs

12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
1 import numpy as np
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
2 from dolfinx import fem, mesh
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
3 from mpi4py import MPI
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
4
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 from dolfinx_access import eval_Function_f64, min_Function_f64_p2
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 # A simple test that the finite-dimensional subproblem is solved correctly
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
9 def test_minimisation(domain_dims=[[-5, 5], [-5, 5]], degree=2, nx=256, ny=256, n=512):
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
10 domain = mesh.create_rectangle(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
11 MPI.COMM_SELF,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
12 [
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
13 np.array([domain_dims[0][0], domain_dims[1][0]]),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
14 np.array([domain_dims[0][1], domain_dims[1][1]]),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
15 ],
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
16 [nx, ny],
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
17 mesh.CellType.triangle,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
18 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
19 V = fem.functionspace(domain, ("Lagrange", degree))
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
20 test = fem.Function(V)
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 # Beale function
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 def beale(x):
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 return (
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 (1.5 - x[0] + x[0] * x[1]) ** 2
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 + (2.25 - x[0] + x[0] * (x[1] ** 2)) ** 2
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 + (2.625 - x[0] + x[0] * (x[1] ** 3)) ** 2
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 )
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
30 def quadratic(x):
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 return x[0] ** 2 - 5 * x[1] ** 2 + x[0] * x[1] - x[0] + x[1]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
33 def sphere(x):
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
34 return x[0] ** 2 + x[1] ** 2
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
35
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
36 def booth(x):
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
37 return (x[0] + 2 * x[1] - 7) ** 2 + (2 * x[0] + x[1] - 5) ** 2
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
38
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
39 def himmelblau(x):
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
40 return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
41
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
42 for testf, name in [
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
43 (beale, "Beale"),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
44 (quadratic, "Quadratic"),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
45 (sphere, "Sphere"),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
46 (booth, "Booth"),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
47 (himmelblau, "Himmelblau"),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
48 ]:
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
49 test.interpolate(testf)
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
50 m = min_Function_f64_p2(test._cpp_object)
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
51 print(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
52 name,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
53 "minimizer:",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
54 m.v,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
55 "(verification ",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
56 eval_Function_f64(test._cpp_object, [m.x[0], m.x[1], 0]),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
57 " original ",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
58 testf(m.x),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
59 ") @ ",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
60 m.x,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
61 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
62
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
63 dist = 0.0
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
64 m = float("inf")
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
65 m0 = float("inf")
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
66 mp = None
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
67 for x in np.linspace(domain_dims[0][0], domain_dims[0][1], n):
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
68 for y in np.linspace(domain_dims[1][0], domain_dims[1][1], n):
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
69 p = [x, y, 0.0]
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
70 v = eval_Function_f64(test._cpp_object, p)
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
71 v0 = testf(p)
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
72 if v0 < m0:
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
73 m = v
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
74 m0 = v0
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
75 mp = p
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
76 d = np.linalg.norm(v - v0)
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
77 dist = max(d, dist)
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
78 print(name, "evaluation max discrepancy:", dist)
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
79 print(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
80 name,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
81 "rough scan minimiser ",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
82 m,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
83 "(model",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
84 m0,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
85 ") @ [",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
86 float(mp[0]),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
87 ", ",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
88 float(mp[1]),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
89 "]",
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
90 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
91 print()
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
92
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
93
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
94 test_minimisation()
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
95 exit(0)

mercurial