From 0edc923b7dcbec432c95a43583a13ea579584a90 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 30 Jun 2025 14:00:07 -0600 Subject: [PATCH 1/2] r-test: update pointer for cbind lib locations --- reg_tests/r-test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reg_tests/r-test b/reg_tests/r-test index 12d32990a6..7b2c193a46 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 12d32990a625b1c27d6c4166e438777fe0023da4 +Subproject commit 7b2c193a46578cb72c51031a50ea05f37eb847c4 From 8ed273b4e59d9e2192145020107b7076f0e544cc Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 30 Jun 2025 14:16:17 -0600 Subject: [PATCH 2/2] [BugFix] hd-cbind: segfault if no output channels from SS or HD --- modules/hydrodyn/src/HydroDyn_C_Binding.f90 | 73 +++++++++++++-------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/modules/hydrodyn/src/HydroDyn_C_Binding.f90 b/modules/hydrodyn/src/HydroDyn_C_Binding.f90 index 083ed430f3..4c7c5bc4dd 100644 --- a/modules/hydrodyn/src/HydroDyn_C_Binding.f90 +++ b/modules/hydrodyn/src/HydroDyn_C_Binding.f90 @@ -261,6 +261,7 @@ SUBROUTINE HydroDyn_C_Init( integer(IntKi) :: ErrStat2 !< temporary error status from a call character(ErrMsgLen) :: ErrMsg2 !< temporary error message from a call integer(IntKi) :: i,j,k !< generic counters + integer(IntKi) :: NChanSS, NChanHD !< number of output channels in SeaSt and HD character(*), parameter :: RoutineName = 'HydroDyn_C_Init' !< for error handling ! Initialize error handling @@ -506,26 +507,32 @@ SUBROUTINE HydroDyn_C_Init( !------------------------------------------------------------- ! Set output channel information for driver code ! Number of channels - NumChannels_C = size(SeaSt%InitOutData%WriteOutputHdr) + size(HD%InitOutData%WriteOutputHdr) + if (allocated(SeaSt%InitOutData%WriteOutputHdr)) NChanSS = size(SeaSt%InitOutData%WriteOutputHdr) + if (allocated(HD%InitOutData%WriteOutputHdr)) NChanHD = size(HD%InitOutData%WriteOutputHdr) + NumChannels_C = NChanSS + NChanHD ! transfer the output channel names and units to c_char arrays for returning ! Upgrade idea: use C_NULL_CHAR as delimiters. Requires rework of Python ! side of code. k=1 - do i=1,size(SeaSt%InitOutData%WriteOutputHdr) - do j=1,ChanLen ! max length of channel name. Same for units - OutputChannelNames_C(k)=SeaSt%InitOutData%WriteOutputHdr(i)(j:j) - OutputChannelUnits_C(k)=SeaSt%InitOutData%WriteOutputUnt(i)(j:j) - k=k+1 + if (allocated(SeaSt%InitOutData%WriteOutputHdr)) then + do i=1,size(SeaSt%InitOutData%WriteOutputHdr) + do j=1,ChanLen ! max length of channel name. Same for units + OutputChannelNames_C(k)=SeaSt%InitOutData%WriteOutputHdr(i)(j:j) + OutputChannelUnits_C(k)=SeaSt%InitOutData%WriteOutputUnt(i)(j:j) + k=k+1 + enddo enddo - enddo - do i=1,size(HD%InitOutData%WriteOutputHdr) - do j=1,ChanLen ! max length of channel name. Same for units - OutputChannelNames_C(k)=HD%InitOutData%WriteOutputHdr(i)(j:j) - OutputChannelUnits_C(k)=HD%InitOutData%WriteOutputUnt(i)(j:j) - k=k+1 + endif + if (allocated(HD%InitOutData%WriteOutputHdr)) then + do i=1,size(HD%InitOutData%WriteOutputHdr) + do j=1,ChanLen ! max length of channel name. Same for units + OutputChannelNames_C(k)=HD%InitOutData%WriteOutputHdr(i)(j:j) + OutputChannelUnits_C(k)=HD%InitOutData%WriteOutputUnt(i)(j:j) + k=k+1 + enddo enddo - enddo + endif ! null terminate the string OutputChannelNames_C(k) = C_NULL_CHAR @@ -811,14 +818,18 @@ SUBROUTINE HydroDyn_C_CalcOutput(Time_C, NumNodePts_C, NodePos_C, NodeVel_C, Nod ! Get the output channel info out of y k=1 - do i=1,size(SeaSt%y%WriteOutput) - OutputChannelValues_C(k) = REAL(SeaSt%y%WriteOutput(i), C_FLOAT) - k=k+1 - enddo - do i=1,size(HD%y%WriteOutput) - OutputChannelValues_C(k) = REAL(HD%y%WriteOutput(i), C_FLOAT) - k=k+1 - enddo + if (allocated(SeaSt%y%WriteOutput)) then + do i=1,size(SeaSt%y%WriteOutput) + OutputChannelValues_C(k) = REAL(SeaSt%y%WriteOutput(i), C_FLOAT) + k=k+1 + enddo + endif + if (allocated(HD%y%WriteOutput)) then + do i=1,size(HD%y%WriteOutput) + OutputChannelValues_C(k) = REAL(HD%y%WriteOutput(i), C_FLOAT) + k=k+1 + enddo + endif ! Set error status call SetErr(ErrStat,ErrMsg,ErrStat_C,ErrMsg_C) @@ -1011,14 +1022,18 @@ SUBROUTINE HydroDyn_C_CalcOutput_and_AddedMass(Time_C, NumNodePts_C, NodePos_C, ! Get the output channel info out of y k=1 - do i=1,size(SeaSt%y%WriteOutput) - OutputChannelValues_C(k) = REAL(SeaSt%y%WriteOutput(i), C_FLOAT) - k=k+1 - enddo - do i=1,size(HD%y%WriteOutput) - OutputChannelValues_C(k) = REAL(HD%y%WriteOutput(i), C_FLOAT) - k=k+1 - enddo + if (allocated(SeaSt%y%WriteOutput)) then + do i=1,size(SeaSt%y%WriteOutput) + OutputChannelValues_C(k) = REAL(SeaSt%y%WriteOutput(i), C_FLOAT) + k=k+1 + enddo + endif + if (allocated(HD%y%WriteOutput)) then + do i=1,size(HD%y%WriteOutput) + OutputChannelValues_C(k) = REAL(HD%y%WriteOutput(i), C_FLOAT) + k=k+1 + enddo + endif ! Set error status call SetErr(ErrStat,ErrMsg,ErrStat_C,ErrMsg_C)