Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
75d4c40
Switch from xPPTRF to xPOTRF to improve TurbSim speed on macOS
IrisMeasure Dec 30, 2025
ab6c179
ADI c-bind: comment out code that causes segfaults
andrew-platt Feb 19, 2026
4b189e4
Merge pull request #3214 from andrew-platt/b/adi_c_bind
deslaughter Feb 26, 2026
3434712
Move !$OMP THREADPRIVATE(TRH) in TSsubs.f90 to after the variable dec…
deslaughter Feb 27, 2026
871ccb2
Merge pull request #3224 from deslaughter/turbsim_omp_threadprivate_fix
deslaughter Feb 27, 2026
458a111
[BugFix] AD: DTAero from input file was ignored
andrew-platt Mar 2, 2026
8acb31d
Merge pull request #3227 from andrew-platt/b/AD_substep
andrew-platt Mar 2, 2026
872c1db
regtest: check if destination dirs exist before copyTree call
andrew-platt Mar 2, 2026
e99a8aa
fix typos in previous commit
andrew-platt Mar 2, 2026
dc6520e
regtest: ad -- remove else from the copyTree wrap
andrew-platt Mar 2, 2026
bed151b
nwtclib: update xPOTRF routines, re-add xPPTRF routines
andrew-platt Mar 2, 2026
1495a52
TurbSim: use xPOTRF instead of xPPTRF
andrew-platt Mar 2, 2026
2e23291
regtest: incorrect path check on py_ad reg testing
andrew-platt Mar 3, 2026
0666232
Merge pull request #3228 from andrew-platt/b/reg_test_CopyTree
andrew-platt Mar 3, 2026
39af771
Merge pull request #3123 from IrisMeasure/dev
andrew-platt Mar 3, 2026
dfa6711
Merge pull request #3229 from andrew-platt/f/xPPTRF_to_xPOTRF
andrew-platt Mar 3, 2026
ef8544b
[BugFix] AD driver: hub acceleration value incorrect in RotMotionType==1
andrew-platt Mar 3, 2026
09fc1be
SeaState WaveTp logic
RBergua Mar 3, 2026
bb92bb5
Small change WaveTp logic
RBergua Mar 4, 2026
3992ef4
Merge pull request #3230 from andrew-platt/b/ad_driver_rotacc
andrew-platt Mar 5, 2026
2941a28
SS c-bind: add SeaSt_C_GetFluidDynP routine to interface
andrew-platt Mar 5, 2026
2e49fd8
Merge pull request #3235 from andrew-platt/b/SeaState_WaveTp_logic_4.…
andrew-platt Mar 5, 2026
4c603ad
SS c-bind: improve debug message on GetDynP
andrew-platt Mar 5, 2026
81c2c9e
Merge pull request #3236 from andrew-platt/f/ss_c-bind_GetDynPressure
andrew-platt Mar 6, 2026
f745420
AWAE: restructure UpdateStates to match 5.0 before introducing change…
andrew-platt Mar 9, 2026
6707322
AWAE.f90: further updatestates changes to more closely match 5.0
andrew-platt Mar 9, 2026
7eaeedd
FF: add extra timestep at T=-DT_high to wind sent to OF instances
andrew-platt Mar 9, 2026
a9fd451
AWAE: add wind timeslice at T=-DT_high to wind sent to OF instances
andrew-platt Mar 9, 2026
bf39a2f
AWAE: typo in loop limits on Mod_AmbWind==3
andrew-platt Mar 9, 2026
0efb781
AWAE: fix bug in calcoutput end time plane check
andrew-platt Mar 10, 2026
756e48c
AWAE: fix index bug in high res output vtk writing
andrew-platt Mar 10, 2026
9845567
AWAE: fix bug in time step indexing (starts n=-1) and WAT time indexing
andrew-platt Mar 10, 2026
0a2ada4
Merge pull request #3243 from andrew-platt/b/FF_AD_bounds
andrew-platt Mar 10, 2026
4ad9c3f
release notes for 4.2.1
andrew-platt Mar 10, 2026
79ce33b
v4.2.1.md -- fix typo
andrew-platt Mar 10, 2026
71654a4
release notes: add missing PR
andrew-platt Mar 10, 2026
f551eb4
Merge pull request #3246 from andrew-platt/r/4.2.1_releaseNotes
andrew-platt Mar 10, 2026
5ca09e9
release notes typo
andrew-platt Mar 10, 2026
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
141 changes: 141 additions & 0 deletions docs/changelogs/v4.2.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
**Feature or improvement description**
Pull request to merge `dev` into `main` for release version 4.2.1

See the milestone and project pages for additional information

https://github.com/OpenFAST/openfast/milestone/27

No test results change

### Release checklist:
- [ ] Update the documentation version in docs/conf.py
- [ ] Update the versions in docs/source/user/api\_change.rst
- [ ] Update version info in openfast\_io/pyproject.toml (`openfast_io` package)
- [ ] Update version info in glue-codes/python/pyproject.toml (`pyOpenFAST` package for testing)
- [ ] Verify readthedocs builds correctly
- [ ] Create an annotated tag in OpenFAST during merge (mark as most recent if necessary)
- [ ] Create a merge commit in r-test and add a corresponding annotated tag
- [ ] Upload Docker image
- [ ] Compile executables for Windows builds
- [ ] `AeroDisk_Driver_x64.exe`
- [ ] `AeroDyn_Driver_x64.exe`
- [ ] `AeroDyn_Driver_x64_OpenMP.exe`
- [ ] `AeroDyn_Inflow_c_binding_x64.dll`
- [ ] `AeroDyn_Inflow_c_binding_x64_OpenMP.dll`
- [ ] `BeamDyn_Driver_x64.exe`
- [ ] `DISCON.dll (x64)`
- [ ] `DISCON_ITIBarge.dll (x64)`
- [ ] `DISCON_OC3Hywind.dll (x64)`
- [ ] `FAST.Farm_x64.exe`
- [ ] `FAST.Farm_x64_OMP.exe`
- [ ] `FAST_SFunc.mexw64`
- [ ] `HydroDynDriver_x64.exe`
- [ ] `HydroDyn_C_Binding_x64.dll`
- [ ] `IinflowWind_c_binding_x64.dll`
- [ ] `InflowWind_Driver_x64.exe`
- [ ] `InflowWind_Driver_x64_OpenMP.exe`
- [ ] `MoorDyn_Driver_x64.exe`
- [ ] `MoorDyn_c_binding_x64.dll`
- [ ] `OpenFAST-Simulink_x64.dll`
- [ ] `openfast_x64.exe`
- [ ] `SeaStateDriver_x64.exe`
- [ ] `SeaState_c_binding_x64.dll`
- [ ] `SimpleElastoDyn_x64.exe`
- [ ] `SubDyn_x64.exe`
- [ ] `Turbsim_x64.exe`
- [ ] `UnsteadyAero_x64.exe`



# Release Overview
------------------



### Contribution Acknowledgements

We are grateful for a first time code contributions from @IrisMeasure.



# Changelog (from 4.2.1)
------------------------


## Solvers

### FAST.Farm

#3243 Add high res windslice at `T=t_low - DT_high` (Fix for FAST.Farm issue #3183) (@andrew-platt)



## Modules

## AeroDyn

#### AeroDyn Driver / AeroDyn\_Inflow\_C\_Bindings interface

#3214 [BugFix] ADI c-bind: comment out code that causes segfaults with interface debugging (@andrew-platt)

#3227 [BugFix] AD: DTAero from input file was ignored (@andrew-platt)

#3230 [BugFix] AD driver: hub acceleration value incorrect in RotMotionType==1 (@andrew-platt)


### NWTC-Library

#3123 Switch from xPPTRF to xPOTRF to improve TurbSim speed on macOS (@IrisMeasure)

#3229 Re-add the xPPTRF routines (rename xPOTRF routines from #3123) (@andrew-platt)


### SeaState

#3235 backport of #3231 - SS WaveTp logic (@andrew-platt, @RBergua)

#3236 Add SeaSt\_C\_GetFluidDynP routine to SeaState\_C\_Binding interface (@andrew-platt)


### TurbSim

#3224 Fix TurbSim compile with OpenMP and IFX compiler (@deslaughter)



## Testing and input file processing

### Regression and Unit testing

#3228 regtest: check if destination dirs exist before copyTree call (@andrew-platt)



## Input file changes

No input file changes since v4.2.0


## Known issues
There are several issues that have not been addressed in this release due to time constraints, but will be addressed in future releases. These include:

- No visualization of rectangular members from _HydroDyn_ or _SubDyn_ through the VTK output options
- Missing and broken features from several c-binding library interfaces:
- the _AeroDyn\_Inflow\_c-binding_ library interface does not allow for coupling to the tower. This will require an interface update.
- the _HydroDyn\_c-binding_ library interface does not currently support vizualization. This will require an interface update.
- the `InitNodePositions` input to _HydroDyn\_c-binding_ library interface does not currently work with any non-zero `x` or `y` coordinates (non-zero `z` is ok)
- the _MoorDyn\_c-binding_ library interface does not currently support vizualization. This will require an interface update.
- Documentation on the new _pyOpenFAST_ module is incomplete. Partial documentation exists on how to use it in regression testing, but no documentation or examples exist on using it to call c-bindings modules from Python.
- Documentation is incomplete for _HydroDyn_, _SubDyn_, and a few other modules.


# Precompiled Windows Binaries
The binary files in this release were built with the Visual Studio solution files distributed with OpenFAST (not using cmake), using

- Intel Fortran Essentials 2025.3.0.333
- Microsoft Visual Studio 2022 Version 17.14.23.
- MATLAB 2025.2.999 (R2025b)
- Executables with `_OpenMP` or `_OMP` in the name are built with OpenMP libraries and linked with dynamic libraries.
- You will need [this Intel Fortran redistributable package](https://registrationcenter-download.intel.com/akdlm/IRC_NAS/0dc56e76-d2c0-4bb8-9c83-c2ee3952b855/w_ifx_runtime_p_2025.2.1.1001.exe) installed to use these executables if you do not already have Intel Fortran OneAPI 2024 installed. See the installation instructions [here](https://software.intel.com/content/www/us/en/develop/articles/redistributable-libraries-for-intel-c-and-fortran-2022-compilers-for-windows.html).

**The other OpenFAST executables DO NOT require these redistributable libraries to be installed. Instead, they were built with static libraries.**
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut):
# The short X.Y version.
version = f'4.2'
# The full version, including alpha/beta/rc tags.
release = f'v4.2.0'
release = f'v4.2.1'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
Expand Down
7 changes: 7 additions & 0 deletions docs/source/user/api_change.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ The line number corresponds to the resulting line number after all changes are i
Thus, be sure to implement each in order so that subsequent line numbers are correct.


OpenFAST v4.2.0 to OpenFAST v4.2.1
----------------------------------

No input file changes were made.



OpenFAST v4.1.x to OpenFAST v4.2.0
----------------------------------

Expand Down
16 changes: 9 additions & 7 deletions glue-codes/fast-farm/src/FASTWrapper.f90
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ MODULE FASTWrapper

PUBLIC :: FWrap_t0 ! call to compute outputs at t0 [and initialize some more variables]
PUBLIC :: FWrap_Increment ! call to update states to n+1 and compute outputs at n+1
PUBLIC :: FWrap_SetInputs
PUBLIC :: FWrap_SetWindTStart
PUBLIC :: FWrap_CalcOutput


Expand Down Expand Up @@ -119,7 +119,7 @@ SUBROUTINE FWrap_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init
ExternInitData%windGrid_n(1) = InitInp%nX_high
ExternInitData%windGrid_n(2) = InitInp%nY_high
ExternInitData%windGrid_n(3) = InitInp%nZ_high
ExternInitData%windGrid_n(4) = InitInp%n_high_low
ExternInitData%windGrid_n(4) = InitInp%n_high_low+1 ! include a step at t-dt_high

ExternInitData%windGrid_delta(1) = InitInp%dX_high
ExternInitData%windGrid_delta(2) = InitInp%dY_high
Expand Down Expand Up @@ -392,7 +392,7 @@ SUBROUTINE FWrap_Increment( t, n, u, p, x, xd, z, OtherState, y, m, ErrStat, Err
!ELSE
!
! set the inputs needed for FAST
!call FWrap_SetInputs(u, m, t) <<< moved up into FAST.Farm FARM_UpdateStates
!call FWrap_SetWindTStart(u, m, t) <<< moved up into FAST.Farm FARM_UpdateStates

! call FAST p%n_FAST_low times (p%n_FAST_low is simply the number of steps to make per wrapper call. It is affected by MooringMod)
do n_ss = 1, p%n_FAST_low
Expand Down Expand Up @@ -434,7 +434,7 @@ SUBROUTINE FWrap_t0( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg )
ErrMsg = ''

! set the inputs needed for FAST:
call FWrap_SetInputs(u, m, 0.0_DbKi)
call FWrap_SetWindTStart(u, m, 0.0_DbKi)

! compute the FAST t0 solution:
call FAST_Solution0_T(m%Turbine, ErrStat2, ErrMsg2 )
Expand Down Expand Up @@ -685,16 +685,18 @@ SUBROUTINE FWrap_CalcOutput(p, u, y, m, ErrStat, ErrMsg)
END SUBROUTINE FWrap_CalcOutput
!----------------------------------------------------------------------------------------------------------------------------------
!> This subroutine sets the inputs needed before calling an instance of FAST
SUBROUTINE FWrap_SetInputs(u, m, t)
SUBROUTINE FWrap_SetWindTStart(u, m, t)

TYPE(FWrap_InputType), INTENT(INOUT) :: u !< Inputs at t
TYPE(FWrap_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code)
REAL(DbKi), INTENT(IN ) :: t !< current simulation time

! set the 4d-wind-inflow input array (a bit of a hack [simplification] so that we don't have large amounts of data copied in multiple data structures):
m%Turbine%IfW%p%FlowField%Grid4D%TimeStart = t
! NOTE: the wind data starts at `t - DT_high` as one extra slice of wind data is added at start. If AeroDyn is updated to not require the `t-DT_high`
! timestep, this can be changed
m%Turbine%IfW%p%FlowField%Grid4D%TimeStart = t - m%Turbine%IfW%p%FlowField%Grid4D%delta(4)

END SUBROUTINE FWrap_SetInputs
END SUBROUTINE FWrap_SetWindTStart
!----------------------------------------------------------------------------------------------------------------------------------
END MODULE FASTWrapper
!**********************************************************************************************************************************
2 changes: 1 addition & 1 deletion glue-codes/fast-farm/src/FAST_Farm_Subs.f90
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,7 @@ subroutine FARM_UpdateStates(t, n, farm, ErrStat, ErrMsg)

! set the inputs needed for FAST (these are slow-varying so can just be done once per farm time step)
do nt = 1,farm%p%NumTurbines
call FWrap_SetInputs(farm%FWrap(nt)%u, farm%FWrap(nt)%m, t)
call FWrap_SetWindTStart(farm%FWrap(nt)%u, farm%FWrap(nt)%m, t)
end do


Expand Down
2 changes: 1 addition & 1 deletion glue-codes/python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "pyOpenFAST"
version = "4.2.0"
version = "4.2.1"
description = "Python interface to OpenFAST FAST Library and physics modules."
readme = "README.md"
requires-python = ">=3.9"
Expand Down
2 changes: 1 addition & 1 deletion modules/aerodyn/src/AeroDyn.f90
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut
if (Failed()) return;
! -----------------------------------------------------------------
! Read the AeroDyn blade files, or copy from passed input
call ReadInputFiles( InitInp%InputFile, InputFileData, interval, p%RootName, NumBlades, AeroProjMod, UnEcho, calcCrvAngle, ErrStat2, ErrMsg2 )
call ReadInputFiles( InitInp%InputFile, InputFileData, p%RootName, NumBlades, AeroProjMod, UnEcho, calcCrvAngle, ErrStat2, ErrMsg2 )
if (Failed()) return;

! override some parameters to simplify for aero maps
Expand Down
2 changes: 1 addition & 1 deletion modules/aerodyn/src/AeroDyn_Driver_Subs.f90
Original file line number Diff line number Diff line change
Expand Up @@ -820,7 +820,7 @@ subroutine Set_Mesh_Motion(nt, dvr, ADI, FED, errStat, errMsg)
call interpTimeValue(wt%hub%motion, time, wt%hub%iMotion, hubMotion)
!print*,hubMotion
wt%hub%rotSpeed = hubMotion(2)
wt%hub%rotAcc = hubMotion(2)
wt%hub%rotAcc = hubMotion(3)
wt%hub%azimuth = MODULO(hubMotion(1)*R2D, 360.0_ReKi )
else if (wt%hub%motionType == idHubMotionUserFunction) then
! We call a user-defined function to determined the azimuth, speed (and potentially acceleration...)
Expand Down
5 changes: 1 addition & 4 deletions modules/aerodyn/src/AeroDyn_IO.f90
Original file line number Diff line number Diff line change
Expand Up @@ -588,14 +588,12 @@ end subroutine Calc_WriteOutput_FVW

END SUBROUTINE Calc_WriteOutput
!----------------------------------------------------------------------------------------------------------------------------------
SUBROUTINE ReadInputFiles( InputFileName, InputFileData, Default_DT, OutFileRoot, NumBlades, AeroProjMod, UnEcho, calcCrvAngle, ErrStat, ErrMsg )
SUBROUTINE ReadInputFiles( InputFileName, InputFileData, OutFileRoot, NumBlades, AeroProjMod, UnEcho, calcCrvAngle, ErrStat, ErrMsg )
! This subroutine reads the input file and stores all the data in the AD_InputFile structure.
! It does not perform data validation.
!..................................................................................................................................

! Passed variables
REAL(DbKi), INTENT(IN) :: Default_DT ! The default DT (from glue code)

CHARACTER(*), INTENT(IN) :: InputFileName ! Name of the input file
CHARACTER(*), INTENT(IN) :: OutFileRoot ! The rootname of all the output files written by this routine.

Expand Down Expand Up @@ -624,7 +622,6 @@ SUBROUTINE ReadInputFiles( InputFileName, InputFileData, Default_DT, OutFileRoot
ErrStat = ErrID_None
ErrMsg = ''

InputFileData%DTAero = Default_DT ! the glue code's suggested DT for the module (may be overwritten in ReadPrimaryFile())
calcCrvAngle = .false. ! initialize in case of early return

! get the blade input-file data
Expand Down
18 changes: 10 additions & 8 deletions modules/aerodyn/src/AeroDyn_Inflow_C_Binding.f90
Original file line number Diff line number Diff line change
Expand Up @@ -935,18 +935,20 @@ subroutine ShowPassedData()
call WrScr(" ADinputFilePassed_C "//TmpFlag )
call WrScr(" ADinputFileString_C (ptr addr) "//trim(Num2LStr(LOC(ADinputFileString_C))) )
call WrScr(" ADinputFileStringLength_C "//trim(Num2LStr( ADinputFileStringLength_C )) )
if (ADinputFilePassed==0_c_int) then
i = index(ADinputFileString, char(0)) ! skip anything after c_null_char
call WrScr(" ADinputFileString_C "//ADinputFileString(1:i))
endif
!FIXME: This causes a seg fault
! if (ADinputFilePassed==0_c_int) then
! i = index(ADinputFileString, char(0)) ! skip anything after c_null_char
! call WrScr(" ADinputFileString_C "//ADinputFileString(1:i))
! endif
TmpFlag="F"; if (IfWinputFilePassed==1_c_int) TmpFlag="T"
call WrScr(" IfWinputFilePassed_C "//TmpFlag )
call WrScr(" IfWinputFileString_C (ptr addr)"//trim(Num2LStr(LOC(IfWinputFileString_C))) )
call WrScr(" IfWinputFileStringLength_C "//trim(Num2LStr( IfWinputFileStringLength_C )) )
if (IfWinputFilePassed==0_c_int) then
i = index(IfWinputFileString, char(0)) ! skip anything after c_null_char
call WrScr(" IfWinputFileString_C "//trim(IfWinputFileString(1:i)))
endif
!FIXME: This causes a seg fault
! if (IfWinputFilePassed==0_c_int) then
! i = index(IfWinputFileString, char(0)) ! skip anything after c_null_char
! call WrScr(" IfWinputFileString_C "//trim(IfWinputFileString(1:i)))
! endif
call WrScr(" OutRootName "//trim(OutRootName) )
call WrScr(" Interpolation")
call WrScr(" InterpOrder_C "//trim(Num2LStr( InterpOrder_C )) )
Expand Down
Loading
Loading