Skip to content

OLAF: add optional zero-net-source constraint - #3499

Open
dkim9239 wants to merge 1 commit into
OpenFAST:devfrom
dkim9239:pr-olaf-zero-net-source
Open

dkim9239 wants to merge 1 commit into
OpenFAST:devfrom
dkim9239:pr-olaf-zero-net-source

Conversation

@dkim9239

Copy link
Copy Markdown

Feature or improvement description

This pull request adds an optional zero-net-source constraint to the existing OLAF source-panel flow confinement model.

The new advanced input option, SrcPnlZeroNetSource, uses a Lagrange-multiplier formulation to enforce zero area-integrated source strength across all source panels. It defaults to False, retaining the original unconstrained source-panel solve.

The changes also:

  • Keep the auxiliary multiplier separate from panel source strengths and induced-velocity calculations.
  • Preserve allocated source-panel strengths during constraint-state initialization.
  • Recalculate derived source-panel fields from the stored source strengths before final VTK output.
  • Add input validation and update the OLAF documentation and example input file.

Related issue, if one exists

No linked issue.

Impacted areas of the software

  • AeroDyn/OLAF source-panel initialization, solution, and output routines.
  • OLAF input parsing, Registry definitions, and corresponding generated types.
  • OLAF input documentation and example file.

Additional supporting information

This change was motivated by applying the existing flow confinement model to the MHKF1 water-tunnel case. Without the additional constraint, the wall-panel solution produced strong source-induced deceleration near the rotor. Together with the underprediction of power and torque over much of the evaluated TSR range, this behavior suggested that the model was underrepresenting the confinement effect on rotor power and torque.

To address this behavior within the existing panel-method framework, zero area-integrated source strength was investigated as an additional global modeling condition for the finite tunnel-wall representation. This condition removes the net source/sink component of the panel distribution while allowing individual panels to retain positive or negative source strengths. It is imposed through an augmented linear system with an auxiliary Lagrange multiplier, retaining the existing source-panel representation and its coupling to the rotor and wake.

In the water-tunnel comparisons performed during development, the constraint redistributed the source strengths and reduced source-induced deceleration upstream of the rotor. Across the simulated TSR range, it increased the predicted power, thrust, and torque coefficients relative to the unconstrained source-panel solution. The power and torque coefficient curves showed improved overall agreement with the uncorrected in-tunnel experimental measurements, while thrust agreement did not improve uniformly. These results support providing the constraint as an optional modeling condition for evaluating confinement effects.

When enabled, the augmented formulation permits a nonzero residual in the wall no-penetration condition. Further assessment of this residual and the predicted flow field is needed to establish applicability across other operating conditions and tunnel geometries.

Generative AI usage

ChatGPT assisted with commit analysis, and preparation of the PR summary. The changes were reviewed, compiled, and tested locally.

Assisted by: OpenAI ChatGPT <[email protected]>

Test results, if applicable

After integrating the changes with the dev branch:

  • Successfully built openfast and aerodyn_driver using GCC/GFortran 11.4.0 with double precision and OpenMP enabled.
  • Completed an AeroDyn driver simulation of the MHKF1 water-tunnel case at an inflow speed of 5 m/s and TSR = 4.0, with SrcPnlZeroNetSource=True, using 12 OpenMP threads.
  • Confirmed normal termination after 4.41 s of simulated time and successful final VTK output.
  • Checked the final source-panel VTK output: the area-integrated source strength was approximately 1.7e-8 m^3/s.

The automated unit and regression test suites were not run.

  • r-test branch merging required

@andrew-platt andrew-platt self-assigned this Oct 27, 2026
@andrew-platt
andrew-platt requested review from ebranlard and hkross and a balanced review from Copilot October 27, 2026 18:45
@andrew-platt andrew-platt added this to the v5.1.0 milestone Oct 27, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The enabled solver path needs automated regression coverage for conservation, residual behavior, and multiplier exclusion.

1 open issue
What changed in this PR

Adds an optional zero-net-source constraint to OLAF’s source-panel confinement model, preserving the unconstrained solve by default.

Changes:

  • Augments the solver with an auxiliary multiplier kept separate from physical source strengths and induced velocities.
  • Preserves source strengths during initialization and refreshes derived fields before final VTK output.
  • Adds input parsing, validation, serialized parameter support, and documentation.
File Description
modules/​aerodyn/​src/​FVW.f90 Preserves panel strengths and refreshes final output fields.
modules/​aerodyn/​src/​FVW_Types.f90 Adds constraint parameter copying and serialization.
modules/​aerodyn/​src/​FVW_Subs.f90 Implements the augmented solve and separates physical strengths from the multiplier.
modules/​aerodyn/​src/​FVW_Registry.txt Defines the default-off constraint parameter.
modules/​aerodyn/​src/​FVW_IO.f90 Parses the option, validates update frequency, and limits output to physical strengths.
docs/​source/​user/​aerodyn-olaf/​InputFiles.rst Documents the constraint equations and modeling limitations.
docs/​source/​user/​aerodyn-olaf/​ExampleFiles/​ExampleFile--OLAF.dat Adds example advanced options with default values.

Review effort: Balanced

Comment on lines +2086 to +2089
if (Panl%EnforceZeroNetSource) then
! Row N+1: Sum(Sigma * Area) = 0 Constraint
do ip = 1, Panl%n
AI(Panl%n+1, ip) = Panl%Area(ip)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants