Skip to content

compute_extrema function over domain for a UFL expression#187

Merged
jorgensd merged 7 commits intomainfrom
dokken/min-max
Feb 25, 2026
Merged

compute_extrema function over domain for a UFL expression#187
jorgensd merged 7 commits intomainfrom
dokken/min-max

Conversation

@jorgensd
Copy link
Member

Makes it possible to compute the min or max of a scalar valued ufl expression over a domain.

@jorgensd jorgensd requested a review from finsberg February 21, 2026 10:10
@jorgensd
Copy link
Member Author

jorgensd commented Feb 21, 2026

Resolves #186

Comment on lines +160 to +192
def eval_J(x_ref):
if isinstance(u, dolfinx.fem.Function):
_x_p[: mesh.geometry.dim] = mesh.geometry.cmap.push_forward(
x_ref.reshape(-1, mesh.topology.dim), mesh_nodes
)[0]
try:
u_eval = u.eval(_x_p, _cell)[0]
except RuntimeError: # NOTE: Nonlinear pullback might fail on low precision
u_expr = dolfinx.fem.Expression(
u,
x_ref,
comm=MPI.COMM_SELF,
jit_options=jit_options,
dtype=mesh.geometry.x.dtype,
)
u_eval = u_expr.eval(mesh, _cell)[0][0]
else:
u_expr = dolfinx.fem.Expression(
u, x_ref, comm=MPI.COMM_SELF, jit_options=jit_options, dtype=mesh.geometry.x.dtype
)
u_eval = u_expr.eval(mesh, _cell)[0][0]
return np.float64(sign * u_eval) # SLSQP only supports float64

def eval_dJ(x_ref):
u_grad_expr = dolfinx.fem.Expression(
ufl.Jacobian(mesh).T * ufl.grad(u),
x_ref,
comm=MPI.COMM_SELF,
jit_options=jit_options,
dtype=mesh.geometry.x.dtype,
)
u_grad_eval = u_grad_expr.eval(mesh, _cell)[0][0]
return (sign * u_grad_eval).astype(np.float64) # SLSQP only supports float64
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder it is would be more clean to put these to methods as instance methods on a class instead. The class could potentially be useful in other contexts.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure... We can talk about this tomorrow.

@jorgensd jorgensd merged commit d6d66db into main Feb 25, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants