Skip to content

Commit 6bdeca2

Browse files
authored
Merge pull request OpenFAST#17 from ashesh2512/f/br_fsi_2
Adding accessor functions for blade pitch and blade root deformations
2 parents 7b7d1b0 + 4391819 commit 6bdeca2

File tree

9 files changed

+174
-5
lines changed

9 files changed

+174
-5
lines changed

glue-codes/openfast-cpp/src/OpenFAST.H

+18-1
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,10 @@ struct turbBRfsiDataType {
180180
std::vector<double> nac_def;
181181
//! Nacelle velocity
182182
std::vector<double> nac_vel;
183+
//! Blade root deformation
184+
std::vector<double> bld_root_def;
185+
//! Blade pitch
186+
std::vector<double> bld_pitch;
183187

184188
//! Tower loads
185189
std::vector<double> twr_ld;
@@ -481,7 +485,11 @@ class OpenFAST {
481485
//! Get the blade reference positions array 'bldRefPos' of turbine number 'iTurbGlob'
482486
void getBladeRefPositions(double* bldRefPos, int iTurbGlob, int nSize=6);
483487
//! Get the blade deflections array 'bldDefl' of turbine number 'iTurbGlob' at time step 't'
484-
void getBladeDisplacements(double* bldDefl, double* bldVel, int iTurbGlob, fast::timeStep t = fast::STATE_NP1, int nSize=6);
488+
void getBladeDisplacements(double* bldDefl, double* bldVel, int iTurbGlob, fast::timeStep t = fast::STATE_NP1, int nSize=6);
489+
//! Get the blade root deflections array 'bldRootDefl' of turbine number 'iTurbGlob' at time step 't'
490+
void getBladeRootDisplacements(double* bldRootDefl, int iTurbGlob, fast::timeStep t = fast::STATE_NP1, int nSize=6);
491+
//! Get the blade pitch 'bldPitch' of turbine number 'iTurbGlob'
492+
void getBladePitch(double* bldPitch, int iTurbGlob, int nSize);
485493
//! Get the tower reference positions array 'twrRefPos' of turbine number 'iTurbGlob'
486494
void getTowerRefPositions(double* twrRefPos, int iTurbGlob, int nSize=6);
487495
//! Get the tower deflections array 'twrDefl' of turbine number 'iTurbGlob' at time step 't'
@@ -605,6 +613,15 @@ class OpenFAST {
605613
{
606614
getBladeDisplacements(bldDefl.data(), bldVel.data(), iTurbGlob, t, bldDefl.size());
607615
}
616+
void getBladeRootDisplacements(std::vector<double> & bldRootDefl, int iTurbGlob, fast::timeStep t = fast::STATE_NP1)
617+
{
618+
getBladeRootDisplacements(bldRootDefl.data(), iTurbGlob, t, bldRootDefl.size());
619+
}
620+
inline
621+
void getBladePitch(std::vector<double> & bldPitch, int iTurbGlob)
622+
{
623+
getBladePitch(bldPitch.data(), iTurbGlob, bldPitch.size());
624+
}
608625
inline
609626
void getTowerRefPositions(std::vector<double> & twrRefPos, int iTurbGlob)
610627
{

glue-codes/openfast-cpp/src/OpenFAST.cpp

+47-1
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,12 @@ void fast::OpenFAST::set_state_from_state(fast::timeStep fromState, fast::timeSt
891891
brFSIData[iTurb][toState].nac_ref_pos[j] = brFSIData[iTurb][fromState].nac_ref_pos[j];
892892
brFSIData[iTurb][toState].nac_def[j] = brFSIData[iTurb][fromState].nac_def[j];
893893
brFSIData[iTurb][toState].nac_vel[j] = brFSIData[iTurb][fromState].nac_vel[j];
894-
894+
}
895+
for (int j=0; j < numBlades; j++) {
896+
for (int k=0; k < 6; k++) {
897+
brFSIData[iTurb][toState].bld_root_def[j] = brFSIData[iTurb][fromState].bld_root_def[j];
898+
}
899+
brFSIData[iTurb][toState].bld_pitch[j] = brFSIData[iTurb][fromState].bld_pitch[j];
895900
}
896901
}
897902
}
@@ -1003,6 +1008,15 @@ void fast::OpenFAST::predict_states() {
10031008
}
10041009
}
10051010

1011+
int nTotBlades = turbineData[iTurb].numBlades;
1012+
for (int j=0; j < nTotBlades; j++) {
1013+
brFSIData[iTurb][fast::STATE_NP1].bld_pitch[j] = brFSIData[iTurb][fast::STATE_NM2].bld_pitch[j] + 3.0*(brFSIData[iTurb][fast::STATE_N].bld_pitch[j] - brFSIData[iTurb][fast::STATE_NM1].bld_pitch[j]);
1014+
extrapRotation(&brFSIData[iTurb][fast::STATE_NM2].bld_root_def[j*6+3], &brFSIData[iTurb][fast::STATE_NM1].bld_root_def[j*6+3], &brFSIData[iTurb][fast::STATE_N].bld_root_def[j*6+3], &brFSIData[iTurb][fast::STATE_NP1].bld_root_def[j*6+3]);
1015+
for (int k=0; k < 3; k++) {
1016+
brFSIData[iTurb][fast::STATE_NP1].bld_root_def[j*6+k] = brFSIData[iTurb][fast::STATE_NM2].bld_root_def[j*6+k] + 3.0*(brFSIData[iTurb][fast::STATE_N].bld_root_def[j*6+k] - brFSIData[iTurb][fast::STATE_NM1].bld_root_def[j*6+k]);
1017+
}
1018+
}
1019+
10061020
int nPtsTwr = turbineData[iTurb].nBRfsiPtsTwr;
10071021
for (int j=0; j < nPtsTwr; j++) {
10081022
extrapRotation(&brFSIData[iTurb][fast::STATE_NM2].twr_def[j*6+3],&brFSIData[iTurb][fast::STATE_NM1].twr_def[j*6+3],&brFSIData[iTurb][fast::STATE_N].twr_def[j*6+3], &brFSIData[iTurb][fast::STATE_NP1].twr_def[j*6+3]);
@@ -2004,6 +2018,9 @@ void fast::OpenFAST::allocateMemory_postInit(int iTurbLoc) {
20042018
brFSIData[iTurbLoc][k].nac_ref_pos.resize(6);
20052019
brFSIData[iTurbLoc][k].nac_def.resize(6);
20062020
brFSIData[iTurbLoc][k].nac_vel.resize(6);
2021+
brFSIData[iTurbLoc][k].hub_ref_pos.resize(6);
2022+
brFSIData[iTurbLoc][k].bld_pitch.resize(turbineData[iTurbLoc].numBlades);
2023+
brFSIData[iTurbLoc][k].bld_root_def.resize(6*turbineData[iTurbLoc].numBlades);
20072024
}
20082025
}
20092026

@@ -2268,6 +2285,11 @@ void fast::OpenFAST::get_data_from_openfast(timeStep t) {
22682285
}
22692286
iRunTot++;
22702287
}
2288+
for (int k=0; k < 3; k++) {
2289+
brFSIData[iTurb][t].bld_root_def[i*6+k] = extld_i_f_FAST[iTurb].bldRootDef[i*12+k];
2290+
brFSIData[iTurb][t].bld_root_def[i*6+3+k] = extld_i_f_FAST[iTurb].bldRootDef[i*12+6+k];
2291+
}
2292+
brFSIData[iTurb][t].bld_pitch[i] = extld_i_f_FAST[iTurb].bldPitch[i];
22712293
}
22722294

22732295
int nPtsTwr = turbineData[iTurb].nBRfsiPtsTwr;
@@ -2868,6 +2890,30 @@ void fast::OpenFAST::getBladeDisplacements(double* bldDefl, double* bldVel, int
28682890

28692891
}
28702892

2893+
void fast::OpenFAST::getBladeRootDisplacements(double* bldRootDefl, int iTurbGlob, fast::timeStep t, int nSize) {
2894+
2895+
int iTurbLoc = get_localTurbNo(iTurbGlob);
2896+
int nBlades = get_numBladesLoc(iTurbLoc);
2897+
assert(nSize == 6*nBlades);
2898+
2899+
int iRunTot = 0;
2900+
for (int i=0; i < nBlades; i++) {
2901+
for (int k=0; k < 6; k++) {
2902+
bldRootDefl[iRunTot] = brFSIData[iTurbLoc][t].bld_root_def[iRunTot];
2903+
iRunTot++;
2904+
}
2905+
}
2906+
}
2907+
2908+
void fast::OpenFAST::getBladePitch(double* bldPitch, int iTurbGlob, int nSize) {
2909+
2910+
assert(nSize==3);
2911+
int iTurbLoc = get_localTurbNo(iTurbGlob);
2912+
for (int j=0; j < nSize; j++)
2913+
bldPitch[j] = brFSIData[iTurbLoc][fast::STATE_NP1].bld_pitch[j] * 180/M_PI;
2914+
2915+
}
2916+
28712917
void fast::OpenFAST::getTowerRefPositions(double* twrRefPos, int iTurbGlob, int nSize) {
28722918

28732919
assert(nSize==6);

modules/extloads/src/ExtLoads.f90

+4-2
Original file line numberDiff line numberDiff line change
@@ -461,9 +461,8 @@ subroutine Init_u( u, p, InitInp, errStat, errMsg )
461461
call SetErrStat( ErrID_Fatal, 'Error allocating u%BladeMotion array.', ErrStat, ErrMsg, RoutineName )
462462
return
463463
end if
464-
465-
do k=1,p%NumBlds
466464

465+
do k=1,p%NumBlds
467466

468467
call MeshCreate ( BlankMesh = u%BladeRootMotion(k) &
469468
,IOS = COMPONENT_INPUT &
@@ -626,11 +625,14 @@ subroutine Init_u( u, p, InitInp, errStat, errMsg )
626625
CALL AllocPAry( u%DX_u%bldRloc, p%nTotBldNds, 'bldRloc', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
627626
CALL AllocPAry( u%DX_u%twrdia, p%NumTwrNds, 'twrDia', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
628627
CALL AllocPAry( u%DX_u%twrHloc, p%NumTwrNds, 'twrHloc', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
628+
CALL AllocPAry( u%DX_u%bldPitch, p%NumBlds, 'bldPitch', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
629+
629630
! make sure the C versions are synced with these arrays
630631
u%DX_u%c_obj%bldChord_Len = p%nTotBldNds; u%DX_u%c_obj%bldChord = C_LOC( u%DX_u%bldChord(1) )
631632
u%DX_u%c_obj%bldRloc_Len = p%nTotBldNds; u%DX_u%c_obj%bldRloc = C_LOC( u%DX_u%bldRloc(1) )
632633
u%DX_u%c_obj%twrDia_Len = p%NumTwrNds; u%DX_u%c_obj%twrDia = C_LOC( u%DX_u%twrDia(1) )
633634
u%DX_u%c_obj%twrHloc_Len = p%NumTwrNds; u%DX_u%c_obj%twrHloc = C_LOC( u%DX_u%twrHloc(1) )
635+
u%DX_u%c_obj%bldPitch_Len = p%NumBlds; u%DX_u%c_obj%bldPitch = C_LOC( u%DX_u%bldPitch(1) )
634636

635637
jTot = 1
636638
do k=1,p%NumBlds

modules/extloads/src/ExtLoadsDX_Registry.txt

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ typedef ^ InputType R8Ki bldChord {:} - -
3535
typedef ^ InputType R8Ki bldRloc {:} - - "Radial location along the blade" m
3636
typedef ^ InputType R8Ki twrDia {:} - - "Tower diameter" m
3737
typedef ^ InputType R8Ki twrHloc {:} - - "Height location along the tower" m
38+
typedef ^ InputType R8Ki bldPitch {:} - - "Pitch angle of blade"
3839

3940

4041
# ..... Outputs ...................................................................................................................

modules/extloads/src/ExtLoadsDX_Types.f90

+99
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ MODULE ExtLoadsDX_Types
7171
INTEGER(C_int) :: twrDia_Len = 0
7272
TYPE(C_ptr) :: twrHloc = C_NULL_PTR
7373
INTEGER(C_int) :: twrHloc_Len = 0
74+
TYPE(C_ptr) :: bldPitch = C_NULL_PTR
75+
INTEGER(C_int) :: bldPitch_Len = 0
7476
END TYPE ExtLdDX_InputType_C
7577
TYPE, PUBLIC :: ExtLdDX_InputType
7678
TYPE( ExtLdDX_InputType_C ) :: C_obj
@@ -91,6 +93,7 @@ MODULE ExtLoadsDX_Types
9193
REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldRloc => NULL() !< Radial location along the blade [m]
9294
REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: twrDia => NULL() !< Tower diameter [m]
9395
REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: twrHloc => NULL() !< Height location along the tower [m]
96+
REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldPitch => NULL() !< Pitch angle of blade [-]
9497
END TYPE ExtLdDX_InputType
9598
! =======================
9699
! ========= ExtLdDX_OutputType_C =======
@@ -377,6 +380,21 @@ SUBROUTINE ExtLdDX_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, Err
377380
DstInputData%c_obj%twrHloc = C_LOC( DstInputData%twrHloc(i1_l) )
378381
END IF
379382
DstInputData%twrHloc = SrcInputData%twrHloc
383+
ENDIF
384+
IF (ASSOCIATED(SrcInputData%bldPitch)) THEN
385+
i1_l = LBOUND(SrcInputData%bldPitch,1)
386+
i1_u = UBOUND(SrcInputData%bldPitch,1)
387+
IF (.NOT. ASSOCIATED(DstInputData%bldPitch)) THEN
388+
ALLOCATE(DstInputData%bldPitch(i1_l:i1_u),STAT=ErrStat2)
389+
IF (ErrStat2 /= 0) THEN
390+
CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%bldPitch.', ErrStat, ErrMsg,RoutineName)
391+
RETURN
392+
END IF
393+
DstInputData%c_obj%bldPitch_Len = SIZE(DstInputData%bldPitch)
394+
IF (DstInputData%c_obj%bldPitch_Len > 0) &
395+
DstInputData%c_obj%bldPitch = C_LOC( DstInputData%bldPitch(i1_l) )
396+
END IF
397+
DstInputData%bldPitch = SrcInputData%bldPitch
380398
ENDIF
381399
END SUBROUTINE ExtLdDX_CopyInput
382400

@@ -490,6 +508,12 @@ SUBROUTINE ExtLdDX_DestroyInput( InputData, ErrStat, ErrMsg )
490508
InputData%twrHloc => NULL()
491509
InputData%C_obj%twrHloc = C_NULL_PTR
492510
InputData%C_obj%twrHloc_Len = 0
511+
ENDIF
512+
IF (ASSOCIATED(InputData%bldPitch)) THEN
513+
DEALLOCATE(InputData%bldPitch)
514+
InputData%bldPitch => NULL()
515+
InputData%C_obj%bldPitch = C_NULL_PTR
516+
InputData%C_obj%bldPitch_Len = 0
493517
ENDIF
494518
END SUBROUTINE ExtLdDX_DestroyInput
495519

@@ -613,6 +637,11 @@ SUBROUTINE ExtLdDX_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs
613637
Int_BufSz = Int_BufSz + 2*1 ! twrHloc upper/lower bounds for each dimension
614638
Db_BufSz = Db_BufSz + SIZE(InData%twrHloc) ! twrHloc
615639
END IF
640+
Int_BufSz = Int_BufSz + 1 ! bldPitch allocated yes/no
641+
IF ( ASSOCIATED(InData%bldPitch) ) THEN
642+
Int_BufSz = Int_BufSz + 2*1 ! bldPitch upper/lower bounds for each dimension
643+
Db_BufSz = Db_BufSz + SIZE(InData%bldPitch) ! bldPitch
644+
END IF
616645
IF ( Re_BufSz .GT. 0 ) THEN
617646
ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 )
618647
IF (ErrStat2 /= 0) THEN
@@ -897,6 +926,21 @@ SUBROUTINE ExtLdDX_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs
897926
Db_Xferred = Db_Xferred + 1
898927
END DO
899928
END IF
929+
IF ( .NOT. ASSOCIATED(InData%bldPitch) ) THEN
930+
IntKiBuf( Int_Xferred ) = 0
931+
Int_Xferred = Int_Xferred + 1
932+
ELSE
933+
IntKiBuf( Int_Xferred ) = 1
934+
Int_Xferred = Int_Xferred + 1
935+
IntKiBuf( Int_Xferred ) = LBOUND(InData%bldPitch,1)
936+
IntKiBuf( Int_Xferred + 1) = UBOUND(InData%bldPitch,1)
937+
Int_Xferred = Int_Xferred + 2
938+
939+
DO i1 = LBOUND(InData%bldPitch,1), UBOUND(InData%bldPitch,1)
940+
DbKiBuf(Db_Xferred) = InData%bldPitch(i1)
941+
Db_Xferred = Db_Xferred + 1
942+
END DO
943+
END IF
900944
END SUBROUTINE ExtLdDX_PackInput
901945

902946
SUBROUTINE ExtLdDX_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg )
@@ -1283,6 +1327,27 @@ SUBROUTINE ExtLdDX_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er
12831327
Db_Xferred = Db_Xferred + 1
12841328
END DO
12851329
END IF
1330+
IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldPitch not allocated
1331+
Int_Xferred = Int_Xferred + 1
1332+
ELSE
1333+
Int_Xferred = Int_Xferred + 1
1334+
i1_l = IntKiBuf( Int_Xferred )
1335+
i1_u = IntKiBuf( Int_Xferred + 1)
1336+
Int_Xferred = Int_Xferred + 2
1337+
IF (ASSOCIATED(OutData%bldPitch)) DEALLOCATE(OutData%bldPitch)
1338+
ALLOCATE(OutData%bldPitch(i1_l:i1_u),STAT=ErrStat2)
1339+
IF (ErrStat2 /= 0) THEN
1340+
CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldPitch.', ErrStat, ErrMsg,RoutineName)
1341+
RETURN
1342+
END IF
1343+
OutData%c_obj%bldPitch_Len = SIZE(OutData%bldPitch)
1344+
IF (OutData%c_obj%bldPitch_Len > 0) &
1345+
OutData%c_obj%bldPitch = C_LOC( OutData%bldPitch(i1_l) )
1346+
DO i1 = LBOUND(OutData%bldPitch,1), UBOUND(OutData%bldPitch,1)
1347+
OutData%bldPitch(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE)
1348+
Db_Xferred = Db_Xferred + 1
1349+
END DO
1350+
END IF
12861351
END SUBROUTINE ExtLdDX_UnPackInput
12871352

12881353
SUBROUTINE ExtLdDX_C2Fary_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers )
@@ -1453,6 +1518,15 @@ SUBROUTINE ExtLdDX_C2Fary_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers )
14531518
CALL C_F_POINTER(InputData%C_obj%twrHloc, InputData%twrHloc, (/InputData%C_obj%twrHloc_Len/))
14541519
END IF
14551520
END IF
1521+
1522+
! -- bldPitch Input Data fields
1523+
IF ( .NOT. SkipPointers_local ) THEN
1524+
IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldPitch ) ) THEN
1525+
NULLIFY( InputData%bldPitch )
1526+
ELSE
1527+
CALL C_F_POINTER(InputData%C_obj%bldPitch, InputData%bldPitch, (/InputData%C_obj%bldPitch_Len/))
1528+
END IF
1529+
END IF
14561530
END SUBROUTINE ExtLdDX_C2Fary_CopyInput
14571531

14581532
SUBROUTINE ExtLdDX_F2C_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers )
@@ -1674,6 +1748,18 @@ SUBROUTINE ExtLdDX_F2C_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers )
16741748
InputData%c_obj%twrHloc = C_LOC( InputData%twrHloc( LBOUND(InputData%twrHloc,1) ) )
16751749
END IF
16761750
END IF
1751+
1752+
! -- bldPitch Input Data fields
1753+
IF ( .NOT. SkipPointers_local ) THEN
1754+
IF ( .NOT. ASSOCIATED(InputData%bldPitch)) THEN
1755+
InputData%c_obj%bldPitch_Len = 0
1756+
InputData%c_obj%bldPitch = C_NULL_PTR
1757+
ELSE
1758+
InputData%c_obj%bldPitch_Len = SIZE(InputData%bldPitch)
1759+
IF (InputData%c_obj%bldPitch_Len > 0) &
1760+
InputData%c_obj%bldPitch = C_LOC( InputData%bldPitch( LBOUND(InputData%bldPitch,1) ) )
1761+
END IF
1762+
END IF
16771763
END SUBROUTINE ExtLdDX_F2C_CopyInput
16781764

16791765
SUBROUTINE ExtLdDX_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg )
@@ -2183,6 +2269,12 @@ SUBROUTINE ExtLdDX_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, Err
21832269
b = -(u1%twrHloc(i1) - u2%twrHloc(i1))
21842270
u_out%twrHloc(i1) = u1%twrHloc(i1) + b * ScaleFactor
21852271
END DO
2272+
END IF ! check if allocated
2273+
IF (ASSOCIATED(u_out%bldPitch) .AND. ASSOCIATED(u1%bldPitch)) THEN
2274+
DO i1 = LBOUND(u_out%bldPitch,1),UBOUND(u_out%bldPitch,1)
2275+
b = -(u1%bldPitch(i1) - u2%bldPitch(i1))
2276+
u_out%bldPitch(i1) = u1%bldPitch(i1) + b * ScaleFactor
2277+
END DO
21862278
END IF ! check if allocated
21872279
END SUBROUTINE ExtLdDX_Input_ExtrapInterp1
21882280

@@ -2344,6 +2436,13 @@ SUBROUTINE ExtLdDX_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat,
23442436
c = ( (t(2)-t(3))*u1%twrHloc(i1) + t(3)*u2%twrHloc(i1) - t(2)*u3%twrHloc(i1) ) * scaleFactor
23452437
u_out%twrHloc(i1) = u1%twrHloc(i1) + b + c * t_out
23462438
END DO
2439+
END IF ! check if allocated
2440+
IF (ASSOCIATED(u_out%bldPitch) .AND. ASSOCIATED(u1%bldPitch)) THEN
2441+
DO i1 = LBOUND(u_out%bldPitch,1),UBOUND(u_out%bldPitch,1)
2442+
b = (t(3)**2*(u1%bldPitch(i1) - u2%bldPitch(i1)) + t(2)**2*(-u1%bldPitch(i1) + u3%bldPitch(i1)))* scaleFactor
2443+
c = ( (t(2)-t(3))*u1%bldPitch(i1) + t(3)*u2%bldPitch(i1) - t(2)*u3%bldPitch(i1) ) * scaleFactor
2444+
u_out%bldPitch(i1) = u1%bldPitch(i1) + b + c * t_out
2445+
END DO
23472446
END IF ! check if allocated
23482447
END SUBROUTINE ExtLdDX_Input_ExtrapInterp2
23492448

modules/extloads/src/ExtLoadsDX_Types.h

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
double * bldRloc ; int bldRloc_Len ;
4040
double * twrDia ; int twrDia_Len ;
4141
double * twrHloc ; int twrHloc_Len ;
42+
double * bldPitch ; int bldPitch_Len ;
4243
} ExtLdDX_InputType_t ;
4344
typedef struct ExtLdDX_OutputType {
4445
void * object ;

modules/extloads/src/ExtLoads_Registry.txt

-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ typedef ^ InitInputType ReKi BldChord {:}{:}
4343
typedef ^ InitInputType ReKi BldRloc {:}{:} - - "Radial location of each node along the blade" m
4444
typedef ^ InitInputType ReKi TwrDia {:} - - "Tower diameter (NumTwrNodes)" m
4545
typedef ^ InitInputType ReKi TwrHloc {:} - - "Height location of each node along the tower" m
46-
4746

4847
# Define outputs from the initialization routine here:
4948
typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" -

modules/openfast-library/src/FAST_Library.f90

+3
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,7 @@ subroutine SetExtLoads_pointers(iTurb, ExtLd_iFromOF, ExtLd_oToOF)
934934
TYPE(ExtLdDX_InputType_C), INTENT(INOUT) :: ExtLd_iFromOF
935935
TYPE(ExtLdDX_OutputType_C),INTENT(INOUT) :: ExtLd_oToOF
936936

937+
ExtLd_iFromOF%bldPitch_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldPitch_Len; ExtLd_iFromOF%bldPitch = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldPitch
937938
ExtLd_iFromOF%twrHloc_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrHloc_Len; ExtLd_iFromOF%twrHloc = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrHloc
938939
ExtLd_iFromOF%twrDia_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrDia_Len; ExtLd_iFromOF%twrDia = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrDia
939940
ExtLd_iFromOF%twrRefPos_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrRefPos_Len; ExtLd_iFromOF%twrRefPos = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrRefPos
@@ -946,6 +947,8 @@ subroutine SetExtLoads_pointers(iTurb, ExtLd_iFromOF, ExtLd_oToOF)
946947
ExtLd_iFromOF%nBladeNodes_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nBladeNodes_Len; ExtLd_iFromOF%nBladeNodes = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nBladeNodes
947948
ExtLd_iFromOF%nTowerNodes_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nTowerNodes_Len; ExtLd_iFromOF%nTowerNodes = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nTowerNodes
948949

950+
ExtLd_iFromOF%bldRootDef_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldRootDef_Len; ExtLd_iFromOF%bldRootDef = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldRootDef
951+
949952
ExtLd_iFromOF%hubRefPos_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%hubRefPos_Len; ExtLd_iFromOF%hubRefPos = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%hubRefPos
950953
ExtLd_iFromOF%hubDef_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%hubDef_Len; ExtLd_iFromOF%hubDef = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%hubDef
951954

modules/openfast-library/src/FAST_Solver.f90

+1
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,7 @@ SUBROUTINE ExtLd_InputSolve_NoIfW( p_FAST, u_ExtLd, p_ExtLd, y_ED, BD, MeshMapDa
11081108
END IF
11091109

11101110
u_ExtLd%az = y_ED%LSSTipPxa
1111+
u_ExtLd%DX_u%bldPitch(:) = y_ED%BlPitch
11111112

11121113
call ExtLd_ConvertInpDataForExtProg(u_ExtLd, p_ExtLd, ErrStat2, ErrMsg2 )
11131114
CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)

0 commit comments

Comments
 (0)