Skip to content

Commit 2daa99a

Browse files
authored
Merge pull request #3247 from OpenFAST/rc-4.2.1
Release 4.2.1
2 parents 3a9d3f2 + 5ca09e9 commit 2daa99a

29 files changed

Lines changed: 751 additions & 134 deletions

docs/changelogs/v4.2.1.md

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
**Feature or improvement description**
2+
Pull request to merge `dev` into `main` for release version 4.2.1
3+
4+
See the milestone and project pages for additional information
5+
6+
https://github.com/OpenFAST/openfast/milestone/27
7+
8+
No test results change
9+
10+
### Release checklist:
11+
- [ ] Update the documentation version in docs/conf.py
12+
- [ ] Update the versions in docs/source/user/api\_change.rst
13+
- [ ] Update version info in openfast\_io/pyproject.toml (`openfast_io` package)
14+
- [ ] Update version info in glue-codes/python/pyproject.toml (`pyOpenFAST` package for testing)
15+
- [ ] Verify readthedocs builds correctly
16+
- [ ] Create an annotated tag in OpenFAST during merge (mark as most recent if necessary)
17+
- [ ] Create a merge commit in r-test and add a corresponding annotated tag
18+
- [ ] Upload Docker image
19+
- [ ] Compile executables for Windows builds
20+
- [ ] `AeroDisk_Driver_x64.exe`
21+
- [ ] `AeroDyn_Driver_x64.exe`
22+
- [ ] `AeroDyn_Driver_x64_OpenMP.exe`
23+
- [ ] `AeroDyn_Inflow_c_binding_x64.dll`
24+
- [ ] `AeroDyn_Inflow_c_binding_x64_OpenMP.dll`
25+
- [ ] `BeamDyn_Driver_x64.exe`
26+
- [ ] `DISCON.dll (x64)`
27+
- [ ] `DISCON_ITIBarge.dll (x64)`
28+
- [ ] `DISCON_OC3Hywind.dll (x64)`
29+
- [ ] `FAST.Farm_x64.exe`
30+
- [ ] `FAST.Farm_x64_OMP.exe`
31+
- [ ] `FAST_SFunc.mexw64`
32+
- [ ] `HydroDynDriver_x64.exe`
33+
- [ ] `HydroDyn_C_Binding_x64.dll`
34+
- [ ] `IinflowWind_c_binding_x64.dll`
35+
- [ ] `InflowWind_Driver_x64.exe`
36+
- [ ] `InflowWind_Driver_x64_OpenMP.exe`
37+
- [ ] `MoorDyn_Driver_x64.exe`
38+
- [ ] `MoorDyn_c_binding_x64.dll`
39+
- [ ] `OpenFAST-Simulink_x64.dll`
40+
- [ ] `openfast_x64.exe`
41+
- [ ] `SeaStateDriver_x64.exe`
42+
- [ ] `SeaState_c_binding_x64.dll`
43+
- [ ] `SimpleElastoDyn_x64.exe`
44+
- [ ] `SubDyn_x64.exe`
45+
- [ ] `Turbsim_x64.exe`
46+
- [ ] `UnsteadyAero_x64.exe`
47+
48+
49+
50+
# Release Overview
51+
------------------
52+
53+
54+
55+
### Contribution Acknowledgements
56+
57+
We are grateful for a first time code contributions from @IrisMeasure.
58+
59+
60+
61+
# Changelog (from 4.2.1)
62+
------------------------
63+
64+
65+
## Solvers
66+
67+
### FAST.Farm
68+
69+
#3243 Add high res windslice at `T=t_low - DT_high` (Fix for FAST.Farm issue #3183) (@andrew-platt)
70+
71+
72+
73+
## Modules
74+
75+
## AeroDyn
76+
77+
#### AeroDyn Driver / AeroDyn\_Inflow\_C\_Bindings interface
78+
79+
#3214 [BugFix] ADI c-bind: comment out code that causes segfaults with interface debugging (@andrew-platt)
80+
81+
#3227 [BugFix] AD: DTAero from input file was ignored (@andrew-platt)
82+
83+
#3230 [BugFix] AD driver: hub acceleration value incorrect in RotMotionType==1 (@andrew-platt)
84+
85+
86+
### NWTC-Library
87+
88+
#3123 Switch from xPPTRF to xPOTRF to improve TurbSim speed on macOS (@IrisMeasure)
89+
90+
#3229 Re-add the xPPTRF routines (rename xPOTRF routines from #3123) (@andrew-platt)
91+
92+
93+
### SeaState
94+
95+
#3235 backport of #3231 - SS WaveTp logic (@andrew-platt, @RBergua)
96+
97+
#3236 Add SeaSt\_C\_GetFluidDynP routine to SeaState\_C\_Binding interface (@andrew-platt)
98+
99+
100+
### TurbSim
101+
102+
#3224 Fix TurbSim compile with OpenMP and IFX compiler (@deslaughter)
103+
104+
105+
106+
## Testing and input file processing
107+
108+
### Regression and Unit testing
109+
110+
#3228 regtest: check if destination dirs exist before copyTree call (@andrew-platt)
111+
112+
113+
114+
## Input file changes
115+
116+
No input file changes since v4.2.0
117+
118+
119+
## Known issues
120+
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:
121+
122+
- No visualization of rectangular members from _HydroDyn_ or _SubDyn_ through the VTK output options
123+
- Missing and broken features from several c-binding library interfaces:
124+
- the _AeroDyn\_Inflow\_c-binding_ library interface does not allow for coupling to the tower. This will require an interface update.
125+
- the _HydroDyn\_c-binding_ library interface does not currently support vizualization. This will require an interface update.
126+
- 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)
127+
- the _MoorDyn\_c-binding_ library interface does not currently support vizualization. This will require an interface update.
128+
- 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.
129+
- Documentation is incomplete for _HydroDyn_, _SubDyn_, and a few other modules.
130+
131+
132+
# Precompiled Windows Binaries
133+
The binary files in this release were built with the Visual Studio solution files distributed with OpenFAST (not using cmake), using
134+
135+
- Intel Fortran Essentials 2025.3.0.333
136+
- Microsoft Visual Studio 2022 Version 17.14.23.
137+
- MATLAB 2025.2.999 (R2025b)
138+
- Executables with `_OpenMP` or `_OMP` in the name are built with OpenMP libraries and linked with dynamic libraries.
139+
- 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).
140+
141+
**The other OpenFAST executables DO NOT require these redistributable libraries to be installed. Instead, they were built with static libraries.**

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut):
139139
# The short X.Y version.
140140
version = f'4.2'
141141
# The full version, including alpha/beta/rc tags.
142-
release = f'v4.2.0'
142+
release = f'v4.2.1'
143143

144144
# The language for content autogenerated by Sphinx. Refer to documentation
145145
# for a list of supported languages.

docs/source/user/api_change.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ The line number corresponds to the resulting line number after all changes are i
1010
Thus, be sure to implement each in order so that subsequent line numbers are correct.
1111

1212

13+
OpenFAST v4.2.0 to OpenFAST v4.2.1
14+
----------------------------------
15+
16+
No input file changes were made.
17+
18+
19+
1320
OpenFAST v4.1.x to OpenFAST v4.2.0
1421
----------------------------------
1522

glue-codes/fast-farm/src/FASTWrapper.f90

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ MODULE FASTWrapper
4444

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

5050

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

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

397397
! 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)
398398
do n_ss = 1, p%n_FAST_low
@@ -434,7 +434,7 @@ SUBROUTINE FWrap_t0( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg )
434434
ErrMsg = ''
435435

436436
! set the inputs needed for FAST:
437-
call FWrap_SetInputs(u, m, 0.0_DbKi)
437+
call FWrap_SetWindTStart(u, m, 0.0_DbKi)
438438

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

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

694694
! 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):
695-
m%Turbine%IfW%p%FlowField%Grid4D%TimeStart = t
695+
! 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`
696+
! timestep, this can be changed
697+
m%Turbine%IfW%p%FlowField%Grid4D%TimeStart = t - m%Turbine%IfW%p%FlowField%Grid4D%delta(4)
696698

697-
END SUBROUTINE FWrap_SetInputs
699+
END SUBROUTINE FWrap_SetWindTStart
698700
!----------------------------------------------------------------------------------------------------------------------------------
699701
END MODULE FASTWrapper
700702
!**********************************************************************************************************************************

glue-codes/fast-farm/src/FAST_Farm_Subs.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1204,7 +1204,7 @@ subroutine FARM_UpdateStates(t, n, farm, ErrStat, ErrMsg)
12041204

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

12101210

glue-codes/python/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "pyOpenFAST"
7-
version = "4.2.0"
7+
version = "4.2.1"
88
description = "Python interface to OpenFAST FAST Library and physics modules."
99
readme = "README.md"
1010
requires-python = ">=3.9"

modules/aerodyn/src/AeroDyn.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut
370370
if (Failed()) return;
371371
! -----------------------------------------------------------------
372372
! Read the AeroDyn blade files, or copy from passed input
373-
call ReadInputFiles( InitInp%InputFile, InputFileData, interval, p%RootName, NumBlades, AeroProjMod, UnEcho, calcCrvAngle, ErrStat2, ErrMsg2 )
373+
call ReadInputFiles( InitInp%InputFile, InputFileData, p%RootName, NumBlades, AeroProjMod, UnEcho, calcCrvAngle, ErrStat2, ErrMsg2 )
374374
if (Failed()) return;
375375

376376
! override some parameters to simplify for aero maps

modules/aerodyn/src/AeroDyn_Driver_Subs.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ subroutine Set_Mesh_Motion(nt, dvr, ADI, FED, errStat, errMsg)
820820
call interpTimeValue(wt%hub%motion, time, wt%hub%iMotion, hubMotion)
821821
!print*,hubMotion
822822
wt%hub%rotSpeed = hubMotion(2)
823-
wt%hub%rotAcc = hubMotion(2)
823+
wt%hub%rotAcc = hubMotion(3)
824824
wt%hub%azimuth = MODULO(hubMotion(1)*R2D, 360.0_ReKi )
825825
else if (wt%hub%motionType == idHubMotionUserFunction) then
826826
! We call a user-defined function to determined the azimuth, speed (and potentially acceleration...)

modules/aerodyn/src/AeroDyn_IO.f90

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -588,14 +588,12 @@ end subroutine Calc_WriteOutput_FVW
588588

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

596596
! Passed variables
597-
REAL(DbKi), INTENT(IN) :: Default_DT ! The default DT (from glue code)
598-
599597
CHARACTER(*), INTENT(IN) :: InputFileName ! Name of the input file
600598
CHARACTER(*), INTENT(IN) :: OutFileRoot ! The rootname of all the output files written by this routine.
601599

@@ -624,7 +622,6 @@ SUBROUTINE ReadInputFiles( InputFileName, InputFileData, Default_DT, OutFileRoot
624622
ErrStat = ErrID_None
625623
ErrMsg = ''
626624

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

630627
! get the blade input-file data

modules/aerodyn/src/AeroDyn_Inflow_C_Binding.f90

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -935,18 +935,20 @@ subroutine ShowPassedData()
935935
call WrScr(" ADinputFilePassed_C "//TmpFlag )
936936
call WrScr(" ADinputFileString_C (ptr addr) "//trim(Num2LStr(LOC(ADinputFileString_C))) )
937937
call WrScr(" ADinputFileStringLength_C "//trim(Num2LStr( ADinputFileStringLength_C )) )
938-
if (ADinputFilePassed==0_c_int) then
939-
i = index(ADinputFileString, char(0)) ! skip anything after c_null_char
940-
call WrScr(" ADinputFileString_C "//ADinputFileString(1:i))
941-
endif
938+
!FIXME: This causes a seg fault
939+
! if (ADinputFilePassed==0_c_int) then
940+
! i = index(ADinputFileString, char(0)) ! skip anything after c_null_char
941+
! call WrScr(" ADinputFileString_C "//ADinputFileString(1:i))
942+
! endif
942943
TmpFlag="F"; if (IfWinputFilePassed==1_c_int) TmpFlag="T"
943944
call WrScr(" IfWinputFilePassed_C "//TmpFlag )
944945
call WrScr(" IfWinputFileString_C (ptr addr)"//trim(Num2LStr(LOC(IfWinputFileString_C))) )
945946
call WrScr(" IfWinputFileStringLength_C "//trim(Num2LStr( IfWinputFileStringLength_C )) )
946-
if (IfWinputFilePassed==0_c_int) then
947-
i = index(IfWinputFileString, char(0)) ! skip anything after c_null_char
948-
call WrScr(" IfWinputFileString_C "//trim(IfWinputFileString(1:i)))
949-
endif
947+
!FIXME: This causes a seg fault
948+
! if (IfWinputFilePassed==0_c_int) then
949+
! i = index(IfWinputFileString, char(0)) ! skip anything after c_null_char
950+
! call WrScr(" IfWinputFileString_C "//trim(IfWinputFileString(1:i)))
951+
! endif
950952
call WrScr(" OutRootName "//trim(OutRootName) )
951953
call WrScr(" Interpolation")
952954
call WrScr(" InterpOrder_C "//trim(Num2LStr( InterpOrder_C )) )

0 commit comments

Comments
 (0)