src/dolfinx_access/minmax_p2.cc

Wed, 22 Apr 2026 23:46:40 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Wed, 22 Apr 2026 23:46:40 -0500
changeset 19
62f4f5fac202
parent 12
a0d61ac3719e
permissions
-rw-r--r--

Add packaging script, remove alg_tools, measures, and pointsource_pde installation instruction from README.

1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /// Minimisation code for second-order polynomial models from Fenics.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 #include <array>
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 #include <cmath>
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 #include <basix/finite-element.h>
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 #include <dolfinx/fem/Function.h>
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 #include <dolfinx/mesh/cell_types.h>
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 #include <nanobind/nanobind.h>
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 #include <nanobind/stl/array.h> // needed for array conversions in nanobind bindings.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 #include "dolfinx_access/minmax_p2.h"
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 #include "pointsource_pde/src/dolfinx_access.rs.h"
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 using namespace dolfinx::fem;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 using namespace basix::element;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 using namespace dolfinx_access;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 namespace dolfinx_access {
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 // Since Fenics documentation is poor, and it does not seem to provide an easy way to access
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 // an internal P2 model (that would not involve vomotting your guts out 🤮 dealing with the
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 // putrid horror that C++ has become (and its documentation written by lawyers and bureacrats,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 // which is even worse than that of Fenics), our idea here is to simply assume that f is a
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 // second-order polynomial on each cell, and then evaluate it on that cell at 6 points, to
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 // construct a new model based on our existing P2 model code that is also used for minimising
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 // arbitrary sums.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 inline CoordValuePair minmax_Function_f64_p2(Function<double> const* f, bool max) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 auto v = f->x();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 // Mesh
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 auto fp = f->function_space();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 auto mesh = fp->mesh();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 auto geom = mesh->geometry();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 auto topo = mesh->topology();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 // Check that we're working with P2 elements
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 //
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 // Fenics defaults to GLL warped midpoint placement; see
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 // https://docs.fenicsproject.org/dolfinx/v0.7.0.post0/python/demos/demo_lagrange_variants.html
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 // This is not a problem with our current implementation, which works with an
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 // second-order
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 // polynomials due to duplication of effort (see above, why), but if we would directly
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 // take the cell quadrature matrix from Fenics, we should restrict el.lagrange_variant() =
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 // lagrange_variant::equispaced.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 auto el = fp->element()->basix_element();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 // printf("%d %d %d %d\n", el.degree(), el.cell_type(), el.lagrange_variant(),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 // el.family());
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
47 if (el.degree() != 2 || el.cell_type() != basix::cell::type::triangle ||
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 /*el.lagrange_variant() != lagrange_variant::equispaced ||*/ el.family() !=
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 family::P) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 throw "Only equispaced Lagrange second-order polynomial elements are supported";
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 }
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
52 if (cell_num_entities(dolfinx::mesh::CellType::triangle, 0) != 3) {
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 throw "A triangle should have three vertices";
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 // Check that we are dealing with a scalar function
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
57 if (fp->element()->value_shape().size() != 0) {
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 throw "Only scalar functions are supported, obviously.";
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
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 // Check that we're in two dimensions
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 if (topo->dim() != 2 || geom.dim() != 2) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 throw "Only two-dimensional meshes are supported";
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 // Check that there are no other types of eleemnts
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 auto entity_types = topo->entity_types(2);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 for (auto& t : entity_types) {
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
69 if (t != dolfinx::mesh::CellType::triangle) {
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 throw "Only triangular meshes are supported";
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 auto adj = topo->connectivity(2, 0);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 auto n_cells = adj->num_nodes();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 // assert(n_cells == n_triangles);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 // printf("cell count? %d\n", n_cells);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 // for (auto i = 0; i < n_cells; i++) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 // // assert(adj->num_links(i) == 3); // Should not need this
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 // auto d = fp->dofmap()->cell_dofs(i);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 // printf("%zd\n", d.size());
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 // }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
86 // DOF coordinates and dofmap for the function space itself (not the mesh geometry).
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
87 // For a scalar P2 space this gives us, per cell, the 6 nodal points (3 corners + 3 edge
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
88 // midpoints) directly in basix's local ordering, so we no longer need to reconstruct
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
89 // edge midpoints via f->eval.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 auto fp_dofmap = fp->dofmap();
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
91 // transpose=false gives a flat vector laid out as (num_dofs, 3) row-major, i.e.
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
92 // dof_coords[3*d + component].
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
93 auto dof_coords = fp->tabulate_dof_coordinates(false);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
94 auto v_array = v->array(); // local coefficient vector
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 CoordValuePair res{{{0.0, 0.0}}, INFINITY};
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
98 for (auto i = 0; i < n_cells; i++) {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
99 auto dofs = fp_dofmap->cell_dofs(i);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
100 assert(dofs.size() == 6);
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
102 // Coordinates of all 6 P2 nodes for this cell, in Fenics' hard-coded 3D layout.
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
103 std::array<double, 18> x{};
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
104 // Nodal values of f at those same 6 points.
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
105 std::array<double, 6> vals{};
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
107 for (std::size_t k = 0; k < 6; k++) {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
108 auto d = dofs[k];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
109 vals[k] = v_array[d];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
110 x[3 * k] = dof_coords[3 * d];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
111 x[3 * k + 1] = dof_coords[3 * d + 1];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
112 x[3 * k + 2] = 0.0;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
113 }
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 // Find the solution on the simplex.
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
116 auto newres = minmax_dolfinx_p2(x, vals, max);
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 if (newres.v < res.v) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 res = newres;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 }
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 // Negate result if maximising.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 if (max) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 res.v = -res.v;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 return res;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
130 void cell_dofs_Function_f64_p2(Function<double> const* f, int32_t cell,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
131 std::array<double, 18>& x, std::array<double, 6>& vals) {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
132 auto fp = f->function_space();
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
133 auto fp_dofmap = fp->dofmap();
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
134 auto dofs = fp_dofmap->cell_dofs(cell);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
135 assert(dofs.size() == 6);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
136 auto dof_coords = fp->tabulate_dof_coordinates(false);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
137 auto v = f->x();
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
138 auto v_array = v->array(); // local coefficient vector
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
139
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
140 for (std::size_t k = 0; k < 6; k++) {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
141 auto d = dofs[k];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
142 vals[k] = v_array[d];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
143 x[3 * k] = dof_coords[3 * d];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
144 x[3 * k + 1] = dof_coords[3 * d + 1];
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
145 x[3 * k + 2] = 0.0;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
146 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
147 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
148
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 CoordValuePair min_Function_f64_p2(Function<double> const* f) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 return minmax_Function_f64_p2(f, false);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 CoordValuePair max_Function_f64_p2(Function<double> const* f) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 return minmax_Function_f64_p2(f, true);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 }
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 // Create a Python module as well
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 NB_MODULE(_dolfinx_access, m) {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 m.def("min_Function_f64_p2", &min_Function_f64_p2);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 m.def("max_Function_f64_p2", &max_Function_f64_p2);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 m.def("minmax_Function_f64_p2", &minmax_Function_f64_p2);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 m.def("eval_Function_f64", &eval_Function_f64);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 m.def("cell_Function_f64", &cell_Function_f64);
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
164 m.def("cell_dofs_Function_f64_p2", &cell_dofs_Function_f64_p2);
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 // m.def("cell_Mesh_f64", &cell_Mesh_f64);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 m.def("cell_FunctionSpace_f64", &cell_FunctionSpace_f64);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 nanobind::class_<CoordValuePair>(m, "CoordValuePair")
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 .def_rw("x", &CoordValuePair::x)
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 .def_rw("v", &CoordValuePair::v);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 } // namespace dolfinx_access
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 // Forward declaration for manual registration
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 extern "C" PyObject* PyInit__dolfinx_access();

mercurial