src/dolfinx_access.rs

Tue, 06 Oct 2026 01:11:33 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 06 Oct 2026 01:11:33 -0500
changeset 16
841a0d255db3
parent 12
a0d61ac3719e
permissions
-rw-r--r--

Add n_spikes to summary

3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
1 /*!
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
2 Utility functions accessing C++ side Dolfinx.
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
3 */
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 use alg_tools::error::DynResult;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 use alg_tools::fe_model::{
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 base::RealLocalModel,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 p2_local_model::{P2LocalModel, Simplex},
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 };
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 use alg_tools::loc::Loc;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 use anyhow::bail;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 use pyo3::ffi::PyImport_AppendInittab;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 use std::ffi::CString;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
14 /// Import helper required for the linking to the sys crates to actually happen.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 #[allow(unused_imports)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 mod dummy_import {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 use dolfinx_sys;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 use nanobind_sys;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 mod function;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 pub use function::DolfinxPyFunction_f64;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
24 /// C++ side routines
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 #[allow(dead_code)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 #[cxx::bridge(namespace = "dolfinx_access")]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 pub mod ffi {
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
28 /// Structure for coordinte-value pairs
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 #[derive(Copy, Clone, Debug)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 struct CoordValuePair {
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
31 /// 2D coordinate
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 x: [f64; 2],
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
33 /// Value
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 v: f64,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
37 /// Structure for information about a dolfinx `Function`
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 #[derive(Copy, Clone, Debug)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 struct FunctionInfo {
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
40 /// Domain dimension
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 domain_dim: u32,
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
42 /// Codomain dimension
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 codomain_dim: u32,
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
44 /// Element order
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 order: u32,
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
46 /// Whether the mesh is triangular
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 triangular_mesh: bool,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 unsafe extern "C++" {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 include!("pointsource_pde/include/dolfinx_access/nanobind_helpers.h");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 include!("pointsource_pde/include/dolfinx_access/function.h");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 include!("pointsource_pde/include/dolfinx_access/minmax_p2.h");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
55 /// C++ side Dolfinx `Function<double>`
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 type Function_f64;
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
57 /// C-side python object.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 type PyObject;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 /// Find the cell containing `x` (in 1D, 2D, or 3D, following Fenics weirdness
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 /// of hard-coding vectors to 3D).
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 pub unsafe fn cell_Function_f64(f: *const Function_f64, x: &[f64; 3]) -> i32;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 /// Evaluate `f` at `x`.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 pub unsafe fn eval_Function_f64(f: *const Function_f64, x: &[f64; 3]) -> f64;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 /// Evaluates `f` at `x` (in 1D, 2D, or 3D, following Fenics weirdness
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 /// of hard-coding vectors to 3D), assuming `x` to belong to `cell`.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 pub unsafe fn eval_Function_f64_cell(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 f: *const Function_f64,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 x: &[f64; 3],
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 cell: i32,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 ) -> f64;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 /// Evaluate the function at 6 coordinates known to belong to given cell
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 pub unsafe fn eval_Function_f64_cell_6(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 f: *const Function_f64,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 all_coords: &[f64; 18], // 6*3
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 cell: i32,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 ) -> [f64; 6];
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
82 /// Get information about a dolfinx `Function_f64`.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 pub unsafe fn info_Function_f64(f: *const Function_f64) -> FunctionInfo;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
85 /// Returns the minimum value of the Dolfinx `Function`,
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
86 /// if supported (P2 elements on triangular mesh)
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 pub unsafe fn min_Function_f64_p2(f: *const Function_f64) -> Result<CoordValuePair>;
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
88
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
89 /// Returns the maximum value of the Dolfinx `Function`,
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
90 /// if supported (P2 elements on triangular mesh)
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 pub unsafe fn max_Function_f64_p2(f: *const Function_f64) -> Result<CoordValuePair>;
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
92
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
93 /// Returns the minimum or maximum value of the Dolfinx `Function`,
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
94 /// if supported (P2 elements on triangular mesh)
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 pub unsafe fn minmax_Function_f64_p2(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 f: *const Function_f64,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 max: bool,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 ) -> Result<CoordValuePair>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
100 pub unsafe fn cell_dofs_Function_f64_p2(f: *const Function_f64, cell:i32, coords: &mut [f64; 18], vals: &mut [f64; 6]);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
101
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
102 /// Checks if a Dolfinx `Function` is supported (P2 elements on triangular mesh)
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 pub unsafe fn check_Function_f64(o: *const PyObject) -> bool;
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
104
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
105 /// Casts a Python object into a Dolfinx `Function` wrapper.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 pub unsafe fn cast_Function_f64(o: *const PyObject) -> Result<*const Function_f64>;
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
107
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
108 /// Casts a Python object into a mutable Dolfinx `Function` wrapper.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 pub unsafe fn cast_mut_Function_f64(o: *mut PyObject) -> Result<*mut Function_f64>;
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
110
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
111 /// Gets the 3D coordinates of the nodes of a triangular cell
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 pub unsafe fn cell_coords_Function_f64_triangle(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 f: *const Function_f64,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 cell: i32,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 ) -> [f64; 9];
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 /// Returns the local weights
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 pub unsafe fn data_Function_f64<'a>(f: *const Function_f64) -> &'a [f64];
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 /// Returns the local mutable weights
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 pub unsafe fn data_mut_Function_f64<'a>(f: *mut Function_f64) -> &'a mut [f64];
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 /// Check the compatibility of function spaces of two functions.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 pub unsafe fn check_compat_Function_f64(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 f: *const Function_f64,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 g: *const Function_f64,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 ) -> Result<()>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
129 /// Create a new similar Dolfinx `Function`
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 pub unsafe fn similar_Function_f64(f: *const Function_f64) -> *mut Function_f64;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
132 /// Clone the Dolfinx `Function`
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 pub unsafe fn clone_Function_f64(f: *const Function_f64) -> *mut Function_f64;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
135 /// Wraps a Dolfinx `Function` into a Python object
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 pub unsafe fn wrap_Function_f64(f: *mut Function_f64) -> *mut PyObject;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
138 /// Drop helper
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 pub unsafe fn drop_Function_f64(f: *mut Function_f64);
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
140
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
141 /// Scatter helper. Not truly supported.
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
142 pub unsafe fn scatter_fwd_Function_f64(f: *mut Function_f64);
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 extern "Rust" {
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
146 /// Rust-side helper for minimising P2 elements. This bypasses poorly documented basix,
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
147 /// and does things at a low level directly.
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
148 /// `f` is the function, `simplex_coords` the coorindates of the triangle
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
149 /// see [`cell_coords_Function_f64_triangle`], `cell` is the cell number,
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
150 /// and `max` indicates whether to maximise or minimise.
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
151 unsafe fn minmax_dolfinx_p2(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
152 simplex_coords: [f64; 18],
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
153 vals: [f64; 6],
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 max: bool,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 ) -> CoordValuePair;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 use ffi::CoordValuePair;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 /// Given a dolphinx `Function` `f`, as well as 6 coordinates on a simplex in its mesh
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 /// (the corners and midpoints), construct a new internal P2 model on `cell`.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 /// If `max` is true, the model is negated compared to `f`.
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
164 #[inline]
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 unsafe fn model_dolfinx_p2_cell(
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
166 [p0x, p0y, _, p1x, p1y, _, p2x, p2y, _, p12x, p12y, _, p20x, p20y, _, p01x, p01y, _]: [f64; 18],
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
167 [v0, v1, v2, v12, v20, v01]: [f64; 6],
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 max: bool,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 ) -> (P2LocalModel<f64, 2, 3>, Simplex<f64, 2, 3>) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 // Form simplex
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
171 let coords = [Loc([p0x, p0y]), Loc([p1x, p1y]), Loc([p2x, p2y])];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
172 let simplex = Simplex(coords);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
173 let values = if max {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
174 [-v0, -v1, -v2, -v01, -v12, -v20]
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
175 } else {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
176 [v0, v1, v2, v01, v12, v20]
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
177 };
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 // Form local model
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
179 let nodes = [Loc([p0x, p0y]), Loc([p1x, p1y]), Loc([p2x, p2y]), Loc([p01x, p01y]), Loc([p12x, p12y]), Loc([p20x, p20y])];
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 let model = P2LocalModel::<f64, 2, 3>::new(&nodes, &values);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 return (model, simplex);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185 /// This is a helper routine for `minmax_dolfinx_p2`. It reconstructs a P2
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 /// model on the cell by evaluating f at 6 points (the simplex corners given
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
187 /// in `simplex_doords`, as well as edge midpoints). Then it minimises this
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
188 /// model. The result should be accurate, given that `f` is assumed to have a
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189 /// P2 model on the simplex.
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
190 pub unsafe fn minmax_dolfinx_p2(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
191 simplex_coords: [f64; 18],
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
192 vals: [f64; 6],
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 max: bool,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 ) -> ffi::CoordValuePair {
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
195 let (model, simplex) = model_dolfinx_p2_cell(simplex_coords, vals, max);
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196 let (x, v) = model.minimise(&simplex);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197 CoordValuePair { x: x.into(), v }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
198 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200 pub const NAME: &str = "dolfinx_access";
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
201
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
202 unsafe extern "C" {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203 pub fn PyInit__dolfinx_access() -> *mut pyo3::ffi::PyObject;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
204 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
205
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206 /// Register the module in Python
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
207 pub fn register_python_ffi() -> DynResult<()> {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
208 let cname = CString::new(NAME).unwrap();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
209 // We need to use into_raw() to transfer ownership; otherwise this stops working.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
210 if unsafe { PyImport_AppendInittab(cname.into_raw(), Some(PyInit__dolfinx_access)) } != 0 {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
211 bail!("Failed to add embedded nanobind dolfinx_access module");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
212 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
213 Ok(())
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
214 }

mercurial