- Dec 18, 2023
-
-
of the objective and constraint gradients in MMA, at a specific optimisation cycle
-
by a small amount, if all of them lay on the lower or upper bounds at the beginning of the optimisation, to avoid singular matrices when computing the update of the design variables.
-
based on phi, instead of U & Sf
-
-
-
-
and the Jacobian of the objective function wrt the turbulence variables is called (rare/unorthodox case). Additionally, objectivePowerDissipation dissipation can now be used in topology optimisation, adding the necessary blockage dependency to it.
-
- Building the iso-surface spliting fluid and solid parts in topology optimisation has been re-worked to obtain an iso-surface with unique point numbering - The mechanism behind marchingCells for dynamicTopODesignVariables has been slightly reworked
-
based on the product of the Reynolds and Darcy numbers
-
-
The derivatives of the objective and constraint functions can optionally be normalised in each optimisation cycle, so that MMA does not put an excesive stress on the constraints, which can negatively affect the course of the optimisation
-
- Minor code style - virtual functions - added some noexcept
-
-
-
-
A 1-Inlet-2-Outlet geometry is showcased for laminar and turbulent flows, set-up with different variants of porosity-based and level-set-based topology optimisation
-
Both porosity-based and level-set-based topO frameworks are included through the topO and levelSet designVariables, respectively. Both frameworks work by manipulating an underlying field of design variables, defined in all cells of the computational domain. That field is then regularised through a Helmholtz-like filter, before being processed in a different way from the two topO frameworks (the porosity-based topO sharpens/projects it while the level-set-based topO computes signed distances around its zero iso-surface). The result of this processing is then fed into functions that define source terms to be added to the mean flow and turbulence model equations, to block off/solidify parts of the mesh that are counterproductive with respect to the objective function. These source terms are added through fvOptions. Since the designed walls are only simulated through source terms, the outcome of topO should be re-analyzed on a body-fitted grid, to quantify the actual gain in the objective function. Both topO frameworks output the designed wall in STL format which can be used, for instance with snappyHexMesh, to construct such a body fitted grid.
-
This provides a list of faces (can be internal ones) to act as additional seeds for the wave algorithm. The default argument provides an empty list, so the behaviour of patchWave should not change. Useful in topology optimisation, for propagating the active design variables from the seed faces to the interior, with a given number of cells at a time.
-
- advectionDiffusion is frequently used within optimisation loops since it is differentiable. In shape optimisation, the re-computation of mesh distances is performed at the very beginning of a new optimisation cycle, due to inheriting from MeshObject. If the mesh quality is poor enough, the advectionDiffusion PDE might diverge and crash the run, before the problematic mesh is written to files for inspection. The default behaviour now is to check the mesh before solving the advectionDiffusion PDE and write the mesh points if some mesh check fails. - fvOptions can now be included in advectionDiffusion (necessary for topology optimisation of turbulent flows for models that include the distance field) - Minor changes in the numerical treatment of the diffusion term, to enhance stability
-
computations necessary in topology optimisation
-
Parts of the adjoint optimisation library were re-designed to generalise the way sensitivity derivatives (SDs) are computed and to allow easier extension to primal problems other than the ones governed by incompressible flows. In specific: - the adjoint solver now holds virtual functions returning the part of SDs that depends only on the primal and the adjoint fields. - a new class named designVariables was introduced which, apart from defining the design variables of the optimisation problem and providing hooks for updating them in an optimisation loop, provides the part of the SDs that affects directly the flow residuals (e.g. geometric variations in shape optimisation, derivatives of source terms in topology optimisation, etc). The final assembly of the SDs happens here, with the updated sensitivity class acting as an intermediate. With the new structure, when the primal problem changes (for instance, passive scalars are included), the same design variables and sensitivity classes can be re-used for all physics, with additional contributions to the SDs being limited (and contained) to the new adjoint solver to be implemented. The old code structure would require new SD classes for each additional primal problem. As a side-effect, setting up a case has arguably become a bit easier and more intuitive. Additional changes include: --------------------------- - Changes in the formulation and computation of shape sensitivity derivatives using the E-SI approach. The latter is now derived directly from the FI approach, with proper discretization for the terms and boundary conditions that emerge from applying the Gauss divergence theorem used to transition from FI to E-SI. When E-SI and FI are based on the same Laplace grid displacement model, they are now numerically equivalent (the previous formulation proved the theoretical equivalence of the two approaches but numerical results could differ, depending on the case). - Sensitivity maps at faces are now computed based (and are deriving from) sensitivity maps at points, with a constistent point-to-face interpolation (requires the differentiation of volPointInterpolation). - The objective class now allocates only the member pointers that correspond to the non-zero derivatives of the objective w.r.t. the flow and geometric quantities, leading to a reduced memory footprint. Additionally, contributions from volume-based objectives to the adjoint equations have been re-worked, removing the need for objectiveManager to be virtual. - In constrained optimisation, an adjoint solver needs to be present for each constraint function. For geometric constraints though, no adjoint equations need to solved. This is now accounted for through the null adjoint solver and the geometric objectives which do not allocate adjoint fields for this kind of constraints, reducing memory requirements and file clutter. - Refactoring of the updateMethod to collaborate with the new designVariables. Additionally, all updateMethods can now read and write restart data in binary, facilitating exact continuation. Furthermore, code shared by various quasi-Newton methods (BFGS, DBFGS, LBFGS, SR1) has been organised in the namesake class. Over and above, an SQP variant capable of tackling inequality constraints has been added (ISQP, with I indicating that the QP problem in the presence of inequality constraints is solved through an interior point method). Inequality constraints can be one-sided (constraint < upper-value) or double-sided (lower-value < constraint < upper-value). - Bounds can now be defined for the design variables. For volumetricBSplines in specific, these can be computed as the mid-points of the control points and their neighbouring ones. This usually leads to better-defined optimisation problems and reduces the chances of an invalid mesh during optimisation. - Convergence criteria can now be defined for the optimisation loop which will stop if the relative objective function reduction over the last objective value is lower than a given threshold and constraints are satisfied within a give tolerance. If no criteria are defined, the optimisation will run for the max. given number of cycles provided in controlDict. - Added a new grid displacement method based on the p-Laplacian equation, which seems to outperform other PDE-based approaches. TUT: updated the shape optimisation tutorials and added a new one showcasing the use of double-sided constraints, ISQP, applying no-overlapping constraints to volumetric B-Splines control points and defining convergence criteria for the optimisation loop.
-
mattijs authored
-
Andrew Heather authored
ENH: fileOperation: fix fileOperation::nProcs to handle multiple candidates See merge request Development/openfoam!653
-
-
Andrew Heather authored
ENH: cyclicAMI: add non-blocking for GAMG See merge request Development/openfoam!651
-
-
Kutalmış Berçin authored
-
- Dec 15, 2023
-
-
Kutalmış Berçin authored
- enhance POSIX compliance - apply distinct colours and dash type for each line - standardize the frame size to 1200x627 - dynamically replace the title with <function-object-name>/<file-name> - address underscore character issues - introduce legend components for tensors - resolve a bug caused by parentheses in tensor files BUG: particleTrackProperties: correct the typo (fixes #3050)
-
Mark OLESEN authored
- on large memory systems (eg, 6TB) the process information exceeds an 'int' range, so adjust parsing of the /proc/.. to use int64 ENH: update/modernize OSspecific system information ENH: minor update of profiling code - std::string, noexcept, lazier evaluations STYLE: use direct call of memInfo
-
Mark OLESEN authored
-
Mark OLESEN authored
- previously read the cloud directly without any of the passiveParticle fields (origProcId, origId), which meant they would not actually be converted.
-
Mark OLESEN authored
- use Foam::zero as a dispatch tag FIX: return moleculeCloud::constProps() List by reference not copy STYLE: range-for when iterating cloud parcels STYLE: more consistent typedefs / declarations for Clouds
-
Mark OLESEN authored
- better code style and seems to avoid triggering a gcc warning about possibly uninitialized values COMP: JSONformatter writeEntry missing a return value STYLE: accept 'json' for checkMesh write format - consistent with caseInfo functionObject
-
Mark OLESEN authored
- for clang-based compilers the default linker may be lld or simply ld. Support '+link-ld' to explicitly select use of the ld linker. - consolidate linker rules into single files STYLE: adjust SPDX Identifier
-
- Dec 13, 2023
-
-
mattijs authored
redistributePar -decompose switches communicator when reading on master. However other processors still get constructed with the worldComm. >v2306 AMI stores the communicator from construction time there was a mismatch
-
Mark OLESEN authored
- regression introduced by commit 0ff86ee2 (only affects recent develop). - now split off first/final iterations into a separate "controls" dictionary (instead of lumping them into "solver") to make them persistent between iterations.
-
- Dec 12, 2023
-
-
Mark OLESEN authored
-
Mark OLESEN authored
- updating the header information (by copying) was closing the stream, removing all watches and doing a checkOut/checkIn, which could lead to dangling references. Now just close the stream and simply copy the IOobject header information directly. STYLE: mark regIOobject assignment operator as possibly deprecated - will revisit to revise or remove in the future
-
Mark OLESEN authored
-
Mark OLESEN authored
- the faMesh/fvMesh copy constructors were using the readOption from the base-mesh schemes/solution instead of copying their contents. This would not really affect fvMesh (since it has its own IOobject for the constructor), but did affect faMesh. However, the problem only shows up with collated + redistribute, since that is where the ranks can be doing uncoordinated IO. Only consider as a bug for recent develop since previous versions had other problems with collated+redistribute with finite-area anyhow.
-