Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
Change log for muTopOpt
=======================

v1.0.0 (16Sep26)
----------------

First release. muTopOpt does FFT-accelerated finite-element topology
optimization of periodic metamaterials: it designs a unit cell whose
homogenized stiffness (or conductivity) matches a prescribed target, by the
method of Jödicke et al., *Topology optimization of metamaterials with
FFT-accelerated micromechanical solvers*.

What it does

- Stress-matching objective against a target effective stiffness, given either
as bulk and shear moduli or as Young's modulus and Poisson's ratio, with
phase-field regularization and no explicit volume constraint. A conductivity
analogue (`FluxTargetProblem`) shares the same machinery
- Exact sensitivities by the discrete adjoint method. The finite-difference
gradient check in `test/test_gradient.py` is the correctness gate for the
whole pipeline and runs serially and under MPI
- Dimension-agnostic: the same code paths run 2D (3 load cases) and 3D (6)
- Two density discretizations: element-wise (per-pixel, FD-Laplacian penalty)
and nodal finite-element (element-consistent H¹ seminorm), the latter acting
as an implicit sensitivity filter so the optimizer can merge or dissolve
features instead of locking in the initial topology
- Two outer optimizers, both MPI-distributed through NuMPI: a bound-constrained
L-BFGS and a trust-region Newton-CG with exact Hessian-vector products from
the second-order adjoint. The trust region is the default where available,
since its acceptance test compares against a computable predicted reduction
and so cannot drown in inner-solve noise the way a line search does
- Adaptive inner CG tolerance coupled to the outer optimizer, and
precision-aware tolerance defaults
- Restart from a previous run's output, Fourier-resampled if the grids differ
- NetCDF output, flushed per frame, carrying the full invocation and the
versions that produced it

Scale

No stiffness tensor and no strain or stress field is ever stored: the operator,
the preconditioner and the sensitivity are all matrix-free and fused, and all
fields share one ghosted, MPI-decomposed, optionally device-resident layout.
A 512³ design in single precision fits on a single 128 GB unified-memory
accelerator -- measured above 60 GiB resident during the first L-BFGS
iterations of an MI300A run -- and runs entirely on device.

Requirements

`muGrid` provides the FFT engine, the domain decomposition, the fused operators
and the preconditioners. This release needs a muGrid that provides
`NodalMomentOperator` (see the pin in `pyproject.toml`).
2 changes: 1 addition & 1 deletion muTopOpt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
rho, info = optimize_bounded_lbfgs(problem, initial_density(homog.nb_pixels))
"""

__version__ = "0.0.1"
__version__ = "1.0.0"

from .conduction import HomogenizationConductivity, SimpConductivity
from .conduction_problem import FluxLoadCase, FluxTargetProblem
Expand Down
5 changes: 5 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ dependencies = [
"numpy",
# >= 0.112.0 for the dtype-threaded preconditioner factories, which let a
# float32 Homogenization run the whole solve in single precision.
#
# NOTE: the consistent nodal double well (muTopOpt.nodal.ConsistentDoubleWell)
# calls muGrid's NodalMomentOperator, which is newer than this pin. Raise the
# pin to the first muGrid release that ships it before tagging v1.0.0 --
# muGrid 1.2.0 does not have it.
"muGrid>=0.112.0",
"NuMPI",
]
Expand Down