tensormesh.optimizer¶
OC Optimizer¶
- class OCOptimizer(params: Tensor | List[Tensor], vf: float, move_limit: float = 0.2, rho_min: float = 1e-3, rho_max: float = 1.0, eta: float = 0.5, bisection_tol: float = 1e-4, bisection_max_iter: int = 50)[source]¶
Bases:
objectOptimality Criteria (OC) optimizer for topology optimization.
Similar interface to
torch.optim.Optimizer, but specifically designed for density-based topology optimization with volume constraints.The OC update rule is:
\[\rho_{\text{new}} = \rho \cdot B_e^{\eta}\]where:
\[B_e = \sqrt{\frac{-\frac{\partial C}{\partial \rho}}{\lambda \cdot \frac{\partial V}{\partial \rho}}}\]\(\lambda\): Lagrange multiplier (found by bisection to satisfy volume constraint)
\(\eta = 0.5\): damping exponent
- Parameters:
params (Tensor or List[Tensor]) – Tensor or list of tensors (design variables)
vf (float) – Target volume fraction
move_limit (float, optional) – Maximum density change per iteration default:
0.2rho_min (float, optional) – Minimum density default:
1e-3rho_max (float, optional) – Maximum density default:
1.0eta (float, optional) – Damping exponent default:
0.5bisection_tol (float, optional) – Tolerance for bisection default:
1e-4bisection_max_iter (int, optional) – Maximum bisection iterations default:
50
Examples
optimizer = OCOptimizer(rho, vf=0.5, move_limit=0.2) for epoch in range(max_iter): # Forward pass and compute compliance compliance = compute_compliance(rho) # Backward pass compliance.backward() # OC update optimizer.step(rho.grad) optimizer.zero_grad()
- __init__(params: Tensor | List[Tensor], vf: float, move_limit: float = 0.2, rho_min: float = 1e-3, rho_max: float = 1.0, eta: float = 0.5, bisection_tol: float = 1e-4, bisection_max_iter: int = 50)[source]¶