diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..935b26f --- /dev/null +++ b/CHANGELOG.md @@ -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`). diff --git a/muTopOpt/__init__.py b/muTopOpt/__init__.py index 4da0db0..abf45d3 100644 --- a/muTopOpt/__init__.py +++ b/muTopOpt/__init__.py @@ -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 diff --git a/pyproject.toml b/pyproject.toml index 71a2532..c7dd79b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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", ]