diff --git a/glue-codes/openfast-cpp/src/OpenFAST.H b/glue-codes/openfast-cpp/src/OpenFAST.H index 8635f373dc..9915d7bbb3 100644 --- a/glue-codes/openfast-cpp/src/OpenFAST.H +++ b/glue-codes/openfast-cpp/src/OpenFAST.H @@ -333,6 +333,8 @@ class OpenFAST { //! Data structure to get deflections from ExternalLoads module in OpenFAST std::vector extld_i_f_FAST; // Input from OpenFAST + //! Data structure to get deflections from ExternalLoads module in OpenFAST + std::vector extld_p_f_FAST; // Parameter from OpenFAST //! Data structure to send force information to ExternalLoads module in OpenFAST std::vector extld_o_t_FAST; // Output to OpenFAST diff --git a/glue-codes/openfast-cpp/src/OpenFAST.cpp b/glue-codes/openfast-cpp/src/OpenFAST.cpp index 58e2549a54..6049368eb0 100644 --- a/glue-codes/openfast-cpp/src/OpenFAST.cpp +++ b/glue-codes/openfast-cpp/src/OpenFAST.cpp @@ -674,6 +674,7 @@ void fast::OpenFAST::init() { &turbineData[iTurb].numBlades, &ntStart, &extld_i_f_FAST[iTurb], + &extld_p_f_FAST[iTurb], &extld_o_t_FAST[iTurb], &sc->ip_from_FAST[iTurb], &sc->op_to_FAST[iTurb], @@ -778,6 +779,7 @@ void fast::OpenFAST::init() { &turbineData[iTurb].zRef, &turbineData[iTurb].shearExp, &extld_i_f_FAST[iTurb], + &extld_p_f_FAST[iTurb], &extld_o_t_FAST[iTurb], &sc->ip_from_FAST[iTurb], &sc->op_to_FAST[iTurb], @@ -2090,8 +2092,9 @@ void fast::OpenFAST::allocateMemory_preInit() { extinfw_i_f_FAST.resize(nTurbinesProc) ; extinfw_o_t_FAST.resize(nTurbinesProc) ; - // Allocate memory for ExtLd Input types in FAST + // Allocate memory for ExtLd Input/Parameter/Output types in FAST extld_i_f_FAST.resize(nTurbinesProc) ; + extld_p_f_FAST.resize(nTurbinesProc) ; extld_o_t_FAST.resize(nTurbinesProc) ; if(scStatus) { @@ -2150,11 +2153,11 @@ void fast::OpenFAST::allocateMemory_postInit(int iTurbLoc) { turbineData[iTurbLoc].nBRfsiPtsBlade.resize(turbineData[iTurbLoc].numBlades); int nTotBldNds = 0; for(int i=0; i < turbineData[iTurbLoc].numBlades; i++) { - nTotBldNds += extld_i_f_FAST[iTurbLoc].nBladeNodes[i]; - turbineData[iTurbLoc].nBRfsiPtsBlade[i] = extld_i_f_FAST[iTurbLoc].nBladeNodes[i]; + nTotBldNds += extld_p_f_FAST[iTurbLoc].nBladeNodes[i]; + turbineData[iTurbLoc].nBRfsiPtsBlade[i] = extld_p_f_FAST[iTurbLoc].nBladeNodes[i]; turbineData[iTurbLoc].nTotBRfsiPtsBlade += turbineData[iTurbLoc].nBRfsiPtsBlade[i]; } - turbineData[iTurbLoc].nBRfsiPtsTwr = extld_i_f_FAST[iTurbLoc].nTowerNodes[0]; + turbineData[iTurbLoc].nBRfsiPtsTwr = extld_p_f_FAST[iTurbLoc].nTowerNodes[0]; // Allocate memory for reference position only for 1 time step - np1 for(int k=0; k<4; k++) { @@ -2981,10 +2984,10 @@ void fast::OpenFAST::get_ref_positions_from_openfast(int iTurb) { if(turbineData[iTurb].sType == EXTLOADS) { for (int i=0; i < 3; i++) { - brFSIData[iTurb][fast::STATE_NP1].hub_ref_pos[i] = extld_i_f_FAST[iTurb].hubRefPos[i] + turbineData[iTurb].TurbineBasePos[i]; - brFSIData[iTurb][fast::STATE_NP1].nac_ref_pos[i] = extld_i_f_FAST[iTurb].nacRefPos[i] + turbineData[iTurb].TurbineBasePos[i]; - brFSIData[iTurb][fast::STATE_NP1].hub_ref_pos[i+3] = extld_i_f_FAST[iTurb].hubRefPos[i+3]; - brFSIData[iTurb][fast::STATE_NP1].nac_ref_pos[i+3] = extld_i_f_FAST[iTurb].nacRefPos[i+3]; + brFSIData[iTurb][fast::STATE_NP1].hub_ref_pos[i] = extld_p_f_FAST[iTurb].hubRefPos[i] + turbineData[iTurb].TurbineBasePos[i]; + brFSIData[iTurb][fast::STATE_NP1].nac_ref_pos[i] = extld_p_f_FAST[iTurb].nacRefPos[i] + turbineData[iTurb].TurbineBasePos[i]; + brFSIData[iTurb][fast::STATE_NP1].hub_ref_pos[i+3] = extld_p_f_FAST[iTurb].hubRefPos[i+3]; + brFSIData[iTurb][fast::STATE_NP1].nac_ref_pos[i+3] = extld_p_f_FAST[iTurb].nacRefPos[i+3]; } int nBlades = turbineData[iTurb].numBlades; @@ -2993,17 +2996,17 @@ void fast::OpenFAST::get_ref_positions_from_openfast(int iTurb) { int nPtsBlade = turbineData[iTurb].nBRfsiPtsBlade[i]; for (int j=0; j < nPtsBlade; j++) { for (int k=0; k < 3; k++) { - brFSIData[iTurb][fast::STATE_NP1].bld_ref_pos[iRunTot*6+k] = extld_i_f_FAST[iTurb].bldRefPos[iRunTot*6+k] + turbineData[iTurb].TurbineBasePos[k]; - brFSIData[iTurb][fast::STATE_NP1].bld_ref_pos[iRunTot*6+k+3] = extld_i_f_FAST[iTurb].bldRefPos[iRunTot*6+k+3]; + brFSIData[iTurb][fast::STATE_NP1].bld_ref_pos[iRunTot*6+k] = extld_p_f_FAST[iTurb].bldRefPos[iRunTot*6+k] + turbineData[iTurb].TurbineBasePos[k]; + brFSIData[iTurb][fast::STATE_NP1].bld_ref_pos[iRunTot*6+k+3] = extld_p_f_FAST[iTurb].bldRefPos[iRunTot*6+k+3]; } - brFSIData[iTurb][fast::STATE_NP1].bld_chord[iRunTot] = extld_i_f_FAST[iTurb].bldChord[iRunTot]; - brFSIData[iTurb][fast::STATE_NP1].bld_rloc[iRunTot] = extld_i_f_FAST[iTurb].bldRloc[iRunTot]; + brFSIData[iTurb][fast::STATE_NP1].bld_chord[iRunTot] = extld_p_f_FAST[iTurb].bldChord[iRunTot]; + brFSIData[iTurb][fast::STATE_NP1].bld_rloc[iRunTot] = extld_p_f_FAST[iTurb].bldRloc[iRunTot]; iRunTot++; } for (int k=0; k < 3; k++) { - brFSIData[iTurb][fast::STATE_NP1].bld_root_ref_pos[i*6+k] = extld_i_f_FAST[iTurb].bldRootRefPos[i*6+k] + turbineData[iTurb].TurbineBasePos[k]; - brFSIData[iTurb][fast::STATE_NP1].bld_root_ref_pos[i*6+k+3] = extld_i_f_FAST[iTurb].bldRootRefPos[i*6+k+3]; + brFSIData[iTurb][fast::STATE_NP1].bld_root_ref_pos[i*6+k] = extld_p_f_FAST[iTurb].bldRootRefPos[i*6+k] + turbineData[iTurb].TurbineBasePos[k]; + brFSIData[iTurb][fast::STATE_NP1].bld_root_ref_pos[i*6+k+3] = extld_p_f_FAST[iTurb].bldRootRefPos[i*6+k+3]; } } @@ -3011,8 +3014,8 @@ void fast::OpenFAST::get_ref_positions_from_openfast(int iTurb) { int nPtsTwr = turbineData[iTurb].nBRfsiPtsTwr; for (int i=0; i < nPtsTwr; i++) { for (int j = 0; j < 3; j++) { - brFSIData[iTurb][fast::STATE_NP1].twr_ref_pos[i*6+j] = extld_i_f_FAST[iTurb].twrRefPos[i*6+j] + turbineData[iTurb].TurbineBasePos[j]; - brFSIData[iTurb][fast::STATE_NP1].twr_ref_pos[i*6+j+3] = extld_i_f_FAST[iTurb].twrRefPos[i*6+j+3]; + brFSIData[iTurb][fast::STATE_NP1].twr_ref_pos[i*6+j] = extld_p_f_FAST[iTurb].twrRefPos[i*6+j] + turbineData[iTurb].TurbineBasePos[j]; + brFSIData[iTurb][fast::STATE_NP1].twr_ref_pos[i*6+j+3] = extld_p_f_FAST[iTurb].twrRefPos[i*6+j+3]; } } diff --git a/modules/extloads/src/ExtLoads.f90 b/modules/extloads/src/ExtLoads.f90 index 84f034f13b..86ae0c85d3 100644 --- a/modules/extloads/src/ExtLoads.f90 +++ b/modules/extloads/src/ExtLoads.f90 @@ -299,7 +299,7 @@ subroutine Init_u( u, p, InitInp, errStat, errMsg ) USE BeamDyn_IO, ONLY: BD_CrvExtractCrv type(ExtLd_InputType), intent( out) :: u !< Input data - type(ExtLd_ParameterType), intent(in ) :: p !< Parameters + type(ExtLd_ParameterType), intent(inout) :: p !< Parameters (inout so can update DX_p) type(ExtLd_InitInputType), intent(in ) :: InitInp !< Input data for ExtLd initialization routine integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if ErrStat /= ErrID_None @@ -542,37 +542,37 @@ subroutine Init_u( u, p, InitInp, errStat, errMsg ) end do !k=numBlades ! Set the parameters first - CALL AllocPAry( u%DX_u%nTowerNodes, 1, 'nTowerNodes', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u%DX_u%c_obj%nTowerNodes_Len = 1; u%DX_u%c_obj%nTowerNodes = C_LOC( u%DX_u%nTowerNodes(1) ) - u%DX_u%nTowerNodes(1) = p%NumTwrNds - CALL AllocPAry( u%DX_u%nBlades, 1, 'nBlades', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u%DX_u%c_obj%nBlades_Len = 1; u%DX_u%c_obj%nBlades = C_LOC( u%DX_u%nBlades(1) ) - u%DX_u%nBlades(1) = p%NumBlds - CALL AllocPAry( u%DX_u%nBladeNodes, p%NumBlds, 'nBladeNodes', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u%DX_u%c_obj%nBladeNodes_Len = p%NumBlds; u%DX_u%c_obj%nBladeNodes = C_LOC( u%DX_u%nBladeNodes(1) ) - u%DX_u%nBladeNodes(:) = p%NumBldNds(:) + CALL AllocPAry( p%DX_p%nTowerNodes, 1, 'nTowerNodes', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + p%DX_p%c_obj%nTowerNodes_Len = 1; p%DX_p%c_obj%nTowerNodes = C_LOC( p%DX_p%nTowerNodes(1) ) + p%DX_p%nTowerNodes(1) = p%NumTwrNds + CALL AllocPAry( p%DX_p%nBlades, 1, 'nBlades', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + p%DX_p%c_obj%nBlades_Len = 1; p%DX_p%c_obj%nBlades = C_LOC( p%DX_p%nBlades(1) ) + p%DX_p%nBlades(1) = p%NumBlds + CALL AllocPAry( p%DX_p%nBladeNodes, p%NumBlds, 'nBladeNodes', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + p%DX_p%c_obj%nBladeNodes_Len = p%NumBlds; p%DX_p%c_obj%nBladeNodes = C_LOC( p%DX_p%nBladeNodes(1) ) + p%DX_p%nBladeNodes(:) = p%NumBldNds(:) ! Set the reference positions next - CALL AllocPAry( u%DX_u%twrRefPos, p%NumTwrNds*6, 'twrRefPos', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocPAry( u%DX_u%bldRefPos, p%nTotBldNds*6, 'bldRefPos', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocPAry( u%DX_u%hubRefPos, 6, 'hubRefPos', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocPAry( u%DX_u%nacRefPos, 6, 'nacRefPos', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocPAry (u%DX_u%bldRootRefPos, p%NumBlds*6, 'bldRootRefPos', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry( p%DX_p%twrRefPos, p%NumTwrNds*6, 'twrRefPos', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry( p%DX_p%bldRefPos, p%nTotBldNds*6, 'bldRefPos', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry( p%DX_p%hubRefPos, 6, 'hubRefPos', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry( p%DX_p%nacRefPos, 6, 'nacRefPos', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry (p%DX_p%bldRootRefPos, p%NumBlds*6, 'bldRootRefPos', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! make sure the C versions are synced with these arrays - u%DX_u%c_obj%twrRefPos_Len = p%NumTwrNds*6; u%DX_u%c_obj%twrRefPos = C_LOC( u%DX_u%twrRefPos(1) ) - u%DX_u%c_obj%bldRefPos_Len = p%nTotBldNds*6; u%DX_u%c_obj%bldRefPos = C_LOC( u%DX_u%bldRefPos(1) ) - u%DX_u%c_obj%hubRefPos_Len = 6; u%DX_u%c_obj%hubRefPos = C_LOC( u%DX_u%hubRefPos(1) ) - u%DX_u%c_obj%nacRefPos_Len = 6; u%DX_u%c_obj%nacRefPos = C_LOC( u%DX_u%nacRefPos(1) ) - u%DX_u%c_obj%bldRootRefPos_Len = p%NumBlds*6; u%DX_u%c_obj%bldRootRefPos = C_LOC( u%DX_u%bldRootRefPos(1) ) + p%DX_p%c_obj%twrRefPos_Len = p%NumTwrNds*6; p%DX_p%c_obj%twrRefPos = C_LOC( p%DX_p%twrRefPos(1) ) + p%DX_p%c_obj%bldRefPos_Len = p%nTotBldNds*6; p%DX_p%c_obj%bldRefPos = C_LOC( p%DX_p%bldRefPos(1) ) + p%DX_p%c_obj%hubRefPos_Len = 6; p%DX_p%c_obj%hubRefPos = C_LOC( p%DX_p%hubRefPos(1) ) + p%DX_p%c_obj%nacRefPos_Len = 6; p%DX_p%c_obj%nacRefPos = C_LOC( p%DX_p%nacRefPos(1) ) + p%DX_p%c_obj%bldRootRefPos_Len = p%NumBlds*6; p%DX_p%c_obj%bldRootRefPos = C_LOC( p%DX_p%bldRootRefPos(1) ) if (p%TwrAero) then do j=1,p%NumTwrNds call BD_CrvExtractCrv(u%TowerMotion%RefOrientation(:,:,j), wm_crv, ErrStat2, ErrMsg2) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - u%DX_u%twrRefPos((j-1)*6+1:(j-1)*6+3) = u%TowerMotion%Position(:,j) - u%DX_u%twrRefPos((j-1)*6+4:(j-1)*6+6) = wm_crv + p%DX_p%twrRefPos((j-1)*6+1:(j-1)*6+3) = u%TowerMotion%Position(:,j) + p%DX_p%twrRefPos((j-1)*6+4:(j-1)*6+6) = wm_crv end do end if @@ -581,27 +581,27 @@ subroutine Init_u( u, p, InitInp, errStat, errMsg ) do j=1,p%NumBldNds(k) call BD_CrvExtractCrv(u%BladeMotion(k)%RefOrientation(:,:,j), wm_crv, ErrStat2, ErrMsg2) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - u%DX_u%bldRefPos((jTot-1)*6+1:(jTot-1)*6+3) = u%BladeMotion(k)%Position(:,j) - u%DX_u%bldRefPos((jTot-1)*6+4:(jTot-1)*6+6) = wm_crv + p%DX_p%bldRefPos((jTot-1)*6+1:(jTot-1)*6+3) = u%BladeMotion(k)%Position(:,j) + p%DX_p%bldRefPos((jTot-1)*6+4:(jTot-1)*6+6) = wm_crv jTot = jTot+1 end do end do call BD_CrvExtractCrv(u%HubMotion%RefOrientation(:,:,1), wm_crv, ErrStat2, ErrMsg2) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - u%DX_u%hubRefPos(1:3) = u%HubMotion%Position(:,1) - u%DX_u%hubRefPos(4:6) = wm_crv + p%DX_p%hubRefPos(1:3) = u%HubMotion%Position(:,1) + p%DX_p%hubRefPos(4:6) = wm_crv call BD_CrvExtractCrv(u%NacelleMotion%RefOrientation(:,:,1), wm_crv, ErrStat2, ErrMsg2) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - u%DX_u%nacRefPos(1:3) = u%NacelleMotion%Position(:,1) - u%DX_u%nacRefPos(4:6) = wm_crv + p%DX_p%nacRefPos(1:3) = u%NacelleMotion%Position(:,1) + p%DX_p%nacRefPos(4:6) = wm_crv do k=1,p%NumBlds call BD_CrvExtractCrv(u%BladeRootMotion(k)%RefOrientation(:,:,1), wm_crv, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - u%DX_u%bldRootRefPos((k-1)*6+1:(k-1)*6+3) = u%BladeRootMotion(k)%Position(:,1) - u%DX_u%bldRootRefPos((k-1)*6+4:(k-1)*6+6) = wm_crv + p%DX_p%bldRootRefPos((k-1)*6+1:(k-1)*6+3) = u%BladeRootMotion(k)%Position(:,1) + p%DX_p%bldRootRefPos((k-1)*6+4:(k-1)*6+6) = wm_crv end do @@ -621,31 +621,31 @@ subroutine Init_u( u, p, InitInp, errStat, errMsg ) call ExtLd_ConvertInpDataForExtProg(u, p, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocPAry( u%DX_u%bldChord, p%nTotBldNds, 'bldChord', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocPAry( u%DX_u%bldRloc, p%nTotBldNds, 'bldRloc', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocPAry( u%DX_u%twrdia, p%NumTwrNds, 'twrDia', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocPAry( u%DX_u%twrHloc, p%NumTwrNds, 'twrHloc', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry( p%DX_p%bldChord, p%nTotBldNds, 'bldChord', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry( p%DX_p%bldRloc, p%nTotBldNds, 'bldRloc', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry( p%DX_p%twrdia, p%NumTwrNds, 'twrDia', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocPAry( p%DX_p%twrHloc, p%NumTwrNds, 'twrHloc', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL AllocPAry( u%DX_u%bldPitch, p%NumBlds, 'bldPitch', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! make sure the C versions are synced with these arrays - u%DX_u%c_obj%bldChord_Len = p%nTotBldNds; u%DX_u%c_obj%bldChord = C_LOC( u%DX_u%bldChord(1) ) - u%DX_u%c_obj%bldRloc_Len = p%nTotBldNds; u%DX_u%c_obj%bldRloc = C_LOC( u%DX_u%bldRloc(1) ) - u%DX_u%c_obj%twrDia_Len = p%NumTwrNds; u%DX_u%c_obj%twrDia = C_LOC( u%DX_u%twrDia(1) ) - u%DX_u%c_obj%twrHloc_Len = p%NumTwrNds; u%DX_u%c_obj%twrHloc = C_LOC( u%DX_u%twrHloc(1) ) + p%DX_p%c_obj%bldChord_Len = p%nTotBldNds; p%DX_p%c_obj%bldChord = C_LOC( p%DX_p%bldChord(1) ) + p%DX_p%c_obj%bldRloc_Len = p%nTotBldNds; p%DX_p%c_obj%bldRloc = C_LOC( p%DX_p%bldRloc(1) ) + p%DX_p%c_obj%twrDia_Len = p%NumTwrNds; p%DX_p%c_obj%twrDia = C_LOC( p%DX_p%twrDia(1) ) + p%DX_p%c_obj%twrHloc_Len = p%NumTwrNds; p%DX_p%c_obj%twrHloc = C_LOC( p%DX_p%twrHloc(1) ) u%DX_u%c_obj%bldPitch_Len = p%NumBlds; u%DX_u%c_obj%bldPitch = C_LOC( u%DX_u%bldPitch(1) ) jTot = 1 do k=1,p%NumBlds do j=1,p%NumBldNds(k) - u%DX_u%bldChord(jTot) = InitInp%bldChord(j,k) - u%DX_u%bldRloc(jTot) = InitInp%bldRloc(j,k) + p%DX_p%bldChord(jTot) = InitInp%bldChord(j,k) + p%DX_p%bldRloc(jTot) = InitInp%bldRloc(j,k) jTot = jTot+1 end do end do do j=1,p%NumTwrNds - u%DX_u%twrDia(j) = InitInp%twrDia(j) - u%DX_u%twrHloc(j) = InitInp%twrHloc(j) + p%DX_p%twrDia(j) = InitInp%twrDia(j) + p%DX_p%twrHloc(j) = InitInp%twrHloc(j) end do end subroutine Init_u diff --git a/modules/extloads/src/ExtLoadsDX_Registry.txt b/modules/extloads/src/ExtLoadsDX_Registry.txt index 7f09fae1ca..f7b87c44eb 100644 --- a/modules/extloads/src/ExtLoadsDX_Registry.txt +++ b/modules/extloads/src/ExtLoadsDX_Registry.txt @@ -23,20 +23,21 @@ typedef ^ InputType R8Ki bldDef {:} - - typedef ^ InputType R8Ki hubDef {:} - - "Deformations on the hub - to send to external driver" typedef ^ InputType R8Ki nacDef {:} - - "Deformations the nacelle - to send to external driver" typedef ^ InputType R8Ki bldRootDef {:} - - "Deformations of the blade root nodes - to send to external driver" -typedef ^ InputType R8Ki twrRefPos {:} - - "Reference position of the tower nodes - to send to external driver" -typedef ^ InputType R8Ki bldRefPos {:} - - "Reference position of the all blade nodes - to send to external driver" -typedef ^ InputType R8Ki hubRefPos {:} - - "Reference position of the tower nodes - to send to external driver" -typedef ^ InputType R8Ki nacRefPos {:} - - "Reference position of the all blade nodes - to send to external driver" -typedef ^ InputType R8Ki bldRootRefPos {:} - - "Reference position of the blade root nodes - to send to external driver" -typedef ^ InputType IntKi nBlades {:} - - "Number of blades" -typedef ^ InputType IntKi nBladeNodes {:} - - "Number of blade nodes for each blade" - -typedef ^ InputType IntKi nTowerNodes {:} - - "Number of tower nodes for each blade" - -typedef ^ InputType R8Ki bldChord {:} - - "Blade chord" m -typedef ^ InputType R8Ki bldRloc {:} - - "Radial location along the blade" m -typedef ^ InputType R8Ki twrDia {:} - - "Tower diameter" m -typedef ^ InputType R8Ki twrHloc {:} - - "Height location along the tower" m typedef ^ InputType R8Ki bldPitch {:} - - "Pitch angle of blade" +# ..... Parameters ................................................................................................................ +typedef ^ ParameterType IntKi nBlades {:} - - "Number of blades" +typedef ^ ParameterType IntKi nBladeNodes {:} - - "Number of blade nodes for each blade" - +typedef ^ ParameterType IntKi nTowerNodes {:} - - "Number of tower nodes for each blade" - +typedef ^ ParameterType R8Ki twrRefPos {:} - - "Reference position of the tower nodes - to send to external driver" +typedef ^ ParameterType R8Ki bldRefPos {:} - - "Reference position of the all blade nodes - to send to external driver" +typedef ^ ParameterType R8Ki hubRefPos {:} - - "Reference position of the tower nodes - to send to external driver" +typedef ^ ParameterType R8Ki nacRefPos {:} - - "Reference position of the all blade nodes - to send to external driver" +typedef ^ ParameterType R8Ki bldRootRefPos {:} - - "Reference position of the blade root nodes - to send to external driver" +typedef ^ ParameterType R8Ki bldChord {:} - - "Blade chord" m +typedef ^ ParameterType R8Ki bldRloc {:} - - "Radial location along the blade" m +typedef ^ ParameterType R8Ki twrDia {:} - - "Tower diameter" m +typedef ^ ParameterType R8Ki twrHloc {:} - - "Height location along the tower" m # ..... Outputs ................................................................................................................... # Define outputs that are contained on the mesh here: diff --git a/modules/extloads/src/ExtLoadsDX_Types.f90 b/modules/extloads/src/ExtLoadsDX_Types.f90 index 6fd8494e49..ba13696190 100644 --- a/modules/extloads/src/ExtLoadsDX_Types.f90 +++ b/modules/extloads/src/ExtLoadsDX_Types.f90 @@ -47,6 +47,28 @@ MODULE ExtLoadsDX_Types INTEGER(C_int) :: nacDef_Len = 0 TYPE(C_ptr) :: bldRootDef = C_NULL_PTR INTEGER(C_int) :: bldRootDef_Len = 0 + TYPE(C_ptr) :: bldPitch = C_NULL_PTR + INTEGER(C_int) :: bldPitch_Len = 0 + END TYPE ExtLdDX_InputType_C + TYPE, PUBLIC :: ExtLdDX_InputType + TYPE( ExtLdDX_InputType_C ) :: C_obj + REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: twrDef => NULL() !< Deformations on the tower - to send to external driver [-] + REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldDef => NULL() !< Deformations on all blades - to send to external driver [-] + REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: hubDef => NULL() !< Deformations on the hub - to send to external driver [-] + REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: nacDef => NULL() !< Deformations the nacelle - to send to external driver [-] + REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldRootDef => NULL() !< Deformations of the blade root nodes - to send to external driver [-] + REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldPitch => NULL() !< Pitch angle of blade [-] + END TYPE ExtLdDX_InputType +! ======================= +! ========= ExtLdDX_ParameterType_C ======= + TYPE, BIND(C) :: ExtLdDX_ParameterType_C + TYPE(C_PTR) :: object = C_NULL_PTR + TYPE(C_ptr) :: nBlades = C_NULL_PTR + INTEGER(C_int) :: nBlades_Len = 0 + TYPE(C_ptr) :: nBladeNodes = C_NULL_PTR + INTEGER(C_int) :: nBladeNodes_Len = 0 + TYPE(C_ptr) :: nTowerNodes = C_NULL_PTR + INTEGER(C_int) :: nTowerNodes_Len = 0 TYPE(C_ptr) :: twrRefPos = C_NULL_PTR INTEGER(C_int) :: twrRefPos_Len = 0 TYPE(C_ptr) :: bldRefPos = C_NULL_PTR @@ -57,12 +79,6 @@ MODULE ExtLoadsDX_Types INTEGER(C_int) :: nacRefPos_Len = 0 TYPE(C_ptr) :: bldRootRefPos = C_NULL_PTR INTEGER(C_int) :: bldRootRefPos_Len = 0 - TYPE(C_ptr) :: nBlades = C_NULL_PTR - INTEGER(C_int) :: nBlades_Len = 0 - TYPE(C_ptr) :: nBladeNodes = C_NULL_PTR - INTEGER(C_int) :: nBladeNodes_Len = 0 - TYPE(C_ptr) :: nTowerNodes = C_NULL_PTR - INTEGER(C_int) :: nTowerNodes_Len = 0 TYPE(C_ptr) :: bldChord = C_NULL_PTR INTEGER(C_int) :: bldChord_Len = 0 TYPE(C_ptr) :: bldRloc = C_NULL_PTR @@ -71,30 +87,22 @@ MODULE ExtLoadsDX_Types INTEGER(C_int) :: twrDia_Len = 0 TYPE(C_ptr) :: twrHloc = C_NULL_PTR INTEGER(C_int) :: twrHloc_Len = 0 - TYPE(C_ptr) :: bldPitch = C_NULL_PTR - INTEGER(C_int) :: bldPitch_Len = 0 - END TYPE ExtLdDX_InputType_C - TYPE, PUBLIC :: ExtLdDX_InputType - TYPE( ExtLdDX_InputType_C ) :: C_obj - REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: twrDef => NULL() !< Deformations on the tower - to send to external driver [-] - REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldDef => NULL() !< Deformations on all blades - to send to external driver [-] - REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: hubDef => NULL() !< Deformations on the hub - to send to external driver [-] - REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: nacDef => NULL() !< Deformations the nacelle - to send to external driver [-] - REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldRootDef => NULL() !< Deformations of the blade root nodes - to send to external driver [-] + END TYPE ExtLdDX_ParameterType_C + TYPE, PUBLIC :: ExtLdDX_ParameterType + TYPE( ExtLdDX_ParameterType_C ) :: C_obj + INTEGER(KIND=C_INT) , DIMENSION(:), POINTER :: nBlades => NULL() !< Number of blades [-] + INTEGER(KIND=C_INT) , DIMENSION(:), POINTER :: nBladeNodes => NULL() !< Number of blade nodes for each blade [-] + INTEGER(KIND=C_INT) , DIMENSION(:), POINTER :: nTowerNodes => NULL() !< Number of tower nodes for each blade [-] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: twrRefPos => NULL() !< Reference position of the tower nodes - to send to external driver [-] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldRefPos => NULL() !< Reference position of the all blade nodes - to send to external driver [-] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: hubRefPos => NULL() !< Reference position of the tower nodes - to send to external driver [-] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: nacRefPos => NULL() !< Reference position of the all blade nodes - to send to external driver [-] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldRootRefPos => NULL() !< Reference position of the blade root nodes - to send to external driver [-] - INTEGER(KIND=C_INT) , DIMENSION(:), POINTER :: nBlades => NULL() !< Number of blades [-] - INTEGER(KIND=C_INT) , DIMENSION(:), POINTER :: nBladeNodes => NULL() !< Number of blade nodes for each blade [-] - INTEGER(KIND=C_INT) , DIMENSION(:), POINTER :: nTowerNodes => NULL() !< Number of tower nodes for each blade [-] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldChord => NULL() !< Blade chord [m] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldRloc => NULL() !< Radial location along the blade [m] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: twrDia => NULL() !< Tower diameter [m] REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: twrHloc => NULL() !< Height location along the tower [m] - REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldPitch => NULL() !< Pitch angle of blade [-] - END TYPE ExtLdDX_InputType + END TYPE ExtLdDX_ParameterType ! ======================= ! ========= ExtLdDX_OutputType_C ======= TYPE, BIND(C) :: ExtLdDX_OutputType_C @@ -201,186 +209,6 @@ SUBROUTINE ExtLdDX_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, Err END IF DstInputData%bldRootDef = SrcInputData%bldRootDef ENDIF -IF (ASSOCIATED(SrcInputData%twrRefPos)) THEN - i1_l = LBOUND(SrcInputData%twrRefPos,1) - i1_u = UBOUND(SrcInputData%twrRefPos,1) - IF (.NOT. ASSOCIATED(DstInputData%twrRefPos)) THEN - ALLOCATE(DstInputData%twrRefPos(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%twrRefPos.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%twrRefPos_Len = SIZE(DstInputData%twrRefPos) - IF (DstInputData%c_obj%twrRefPos_Len > 0) & - DstInputData%c_obj%twrRefPos = C_LOC( DstInputData%twrRefPos( i1_l ) ) - END IF - DstInputData%twrRefPos = SrcInputData%twrRefPos -ENDIF -IF (ASSOCIATED(SrcInputData%bldRefPos)) THEN - i1_l = LBOUND(SrcInputData%bldRefPos,1) - i1_u = UBOUND(SrcInputData%bldRefPos,1) - IF (.NOT. ASSOCIATED(DstInputData%bldRefPos)) THEN - ALLOCATE(DstInputData%bldRefPos(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%bldRefPos.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%bldRefPos_Len = SIZE(DstInputData%bldRefPos) - IF (DstInputData%c_obj%bldRefPos_Len > 0) & - DstInputData%c_obj%bldRefPos = C_LOC( DstInputData%bldRefPos( i1_l ) ) - END IF - DstInputData%bldRefPos = SrcInputData%bldRefPos -ENDIF -IF (ASSOCIATED(SrcInputData%hubRefPos)) THEN - i1_l = LBOUND(SrcInputData%hubRefPos,1) - i1_u = UBOUND(SrcInputData%hubRefPos,1) - IF (.NOT. ASSOCIATED(DstInputData%hubRefPos)) THEN - ALLOCATE(DstInputData%hubRefPos(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%hubRefPos.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%hubRefPos_Len = SIZE(DstInputData%hubRefPos) - IF (DstInputData%c_obj%hubRefPos_Len > 0) & - DstInputData%c_obj%hubRefPos = C_LOC( DstInputData%hubRefPos( i1_l ) ) - END IF - DstInputData%hubRefPos = SrcInputData%hubRefPos -ENDIF -IF (ASSOCIATED(SrcInputData%nacRefPos)) THEN - i1_l = LBOUND(SrcInputData%nacRefPos,1) - i1_u = UBOUND(SrcInputData%nacRefPos,1) - IF (.NOT. ASSOCIATED(DstInputData%nacRefPos)) THEN - ALLOCATE(DstInputData%nacRefPos(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%nacRefPos.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%nacRefPos_Len = SIZE(DstInputData%nacRefPos) - IF (DstInputData%c_obj%nacRefPos_Len > 0) & - DstInputData%c_obj%nacRefPos = C_LOC( DstInputData%nacRefPos( i1_l ) ) - END IF - DstInputData%nacRefPos = SrcInputData%nacRefPos -ENDIF -IF (ASSOCIATED(SrcInputData%bldRootRefPos)) THEN - i1_l = LBOUND(SrcInputData%bldRootRefPos,1) - i1_u = UBOUND(SrcInputData%bldRootRefPos,1) - IF (.NOT. ASSOCIATED(DstInputData%bldRootRefPos)) THEN - ALLOCATE(DstInputData%bldRootRefPos(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%bldRootRefPos.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%bldRootRefPos_Len = SIZE(DstInputData%bldRootRefPos) - IF (DstInputData%c_obj%bldRootRefPos_Len > 0) & - DstInputData%c_obj%bldRootRefPos = C_LOC( DstInputData%bldRootRefPos( i1_l ) ) - END IF - DstInputData%bldRootRefPos = SrcInputData%bldRootRefPos -ENDIF -IF (ASSOCIATED(SrcInputData%nBlades)) THEN - i1_l = LBOUND(SrcInputData%nBlades,1) - i1_u = UBOUND(SrcInputData%nBlades,1) - IF (.NOT. ASSOCIATED(DstInputData%nBlades)) THEN - ALLOCATE(DstInputData%nBlades(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%nBlades.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%nBlades_Len = SIZE(DstInputData%nBlades) - IF (DstInputData%c_obj%nBlades_Len > 0) & - DstInputData%c_obj%nBlades = C_LOC( DstInputData%nBlades( i1_l ) ) - END IF - DstInputData%nBlades = SrcInputData%nBlades -ENDIF -IF (ASSOCIATED(SrcInputData%nBladeNodes)) THEN - i1_l = LBOUND(SrcInputData%nBladeNodes,1) - i1_u = UBOUND(SrcInputData%nBladeNodes,1) - IF (.NOT. ASSOCIATED(DstInputData%nBladeNodes)) THEN - ALLOCATE(DstInputData%nBladeNodes(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%nBladeNodes.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%nBladeNodes_Len = SIZE(DstInputData%nBladeNodes) - IF (DstInputData%c_obj%nBladeNodes_Len > 0) & - DstInputData%c_obj%nBladeNodes = C_LOC( DstInputData%nBladeNodes( i1_l ) ) - END IF - DstInputData%nBladeNodes = SrcInputData%nBladeNodes -ENDIF -IF (ASSOCIATED(SrcInputData%nTowerNodes)) THEN - i1_l = LBOUND(SrcInputData%nTowerNodes,1) - i1_u = UBOUND(SrcInputData%nTowerNodes,1) - IF (.NOT. ASSOCIATED(DstInputData%nTowerNodes)) THEN - ALLOCATE(DstInputData%nTowerNodes(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%nTowerNodes.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%nTowerNodes_Len = SIZE(DstInputData%nTowerNodes) - IF (DstInputData%c_obj%nTowerNodes_Len > 0) & - DstInputData%c_obj%nTowerNodes = C_LOC( DstInputData%nTowerNodes( i1_l ) ) - END IF - DstInputData%nTowerNodes = SrcInputData%nTowerNodes -ENDIF -IF (ASSOCIATED(SrcInputData%bldChord)) THEN - i1_l = LBOUND(SrcInputData%bldChord,1) - i1_u = UBOUND(SrcInputData%bldChord,1) - IF (.NOT. ASSOCIATED(DstInputData%bldChord)) THEN - ALLOCATE(DstInputData%bldChord(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%bldChord.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%bldChord_Len = SIZE(DstInputData%bldChord) - IF (DstInputData%c_obj%bldChord_Len > 0) & - DstInputData%c_obj%bldChord = C_LOC( DstInputData%bldChord( i1_l ) ) - END IF - DstInputData%bldChord = SrcInputData%bldChord -ENDIF -IF (ASSOCIATED(SrcInputData%bldRloc)) THEN - i1_l = LBOUND(SrcInputData%bldRloc,1) - i1_u = UBOUND(SrcInputData%bldRloc,1) - IF (.NOT. ASSOCIATED(DstInputData%bldRloc)) THEN - ALLOCATE(DstInputData%bldRloc(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%bldRloc.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%bldRloc_Len = SIZE(DstInputData%bldRloc) - IF (DstInputData%c_obj%bldRloc_Len > 0) & - DstInputData%c_obj%bldRloc = C_LOC( DstInputData%bldRloc( i1_l ) ) - END IF - DstInputData%bldRloc = SrcInputData%bldRloc -ENDIF -IF (ASSOCIATED(SrcInputData%twrDia)) THEN - i1_l = LBOUND(SrcInputData%twrDia,1) - i1_u = UBOUND(SrcInputData%twrDia,1) - IF (.NOT. ASSOCIATED(DstInputData%twrDia)) THEN - ALLOCATE(DstInputData%twrDia(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%twrDia.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%twrDia_Len = SIZE(DstInputData%twrDia) - IF (DstInputData%c_obj%twrDia_Len > 0) & - DstInputData%c_obj%twrDia = C_LOC( DstInputData%twrDia( i1_l ) ) - END IF - DstInputData%twrDia = SrcInputData%twrDia -ENDIF -IF (ASSOCIATED(SrcInputData%twrHloc)) THEN - i1_l = LBOUND(SrcInputData%twrHloc,1) - i1_u = UBOUND(SrcInputData%twrHloc,1) - IF (.NOT. ASSOCIATED(DstInputData%twrHloc)) THEN - ALLOCATE(DstInputData%twrHloc(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%twrHloc.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DstInputData%c_obj%twrHloc_Len = SIZE(DstInputData%twrHloc) - IF (DstInputData%c_obj%twrHloc_Len > 0) & - DstInputData%c_obj%twrHloc = C_LOC( DstInputData%twrHloc( i1_l ) ) - END IF - DstInputData%twrHloc = SrcInputData%twrHloc -ENDIF IF (ASSOCIATED(SrcInputData%bldPitch)) THEN i1_l = LBOUND(SrcInputData%bldPitch,1) i1_u = UBOUND(SrcInputData%bldPitch,1) @@ -454,90 +282,6 @@ SUBROUTINE ExtLdDX_DestroyInput( InputData, ErrStat, ErrMsg, DEALLOCATEpointers InputData%C_obj%bldRootDef = C_NULL_PTR InputData%C_obj%bldRootDef_Len = 0 ENDIF -IF (ASSOCIATED(InputData%twrRefPos)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%twrRefPos) - InputData%twrRefPos => NULL() - InputData%C_obj%twrRefPos = C_NULL_PTR - InputData%C_obj%twrRefPos_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%bldRefPos)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%bldRefPos) - InputData%bldRefPos => NULL() - InputData%C_obj%bldRefPos = C_NULL_PTR - InputData%C_obj%bldRefPos_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%hubRefPos)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%hubRefPos) - InputData%hubRefPos => NULL() - InputData%C_obj%hubRefPos = C_NULL_PTR - InputData%C_obj%hubRefPos_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%nacRefPos)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%nacRefPos) - InputData%nacRefPos => NULL() - InputData%C_obj%nacRefPos = C_NULL_PTR - InputData%C_obj%nacRefPos_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%bldRootRefPos)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%bldRootRefPos) - InputData%bldRootRefPos => NULL() - InputData%C_obj%bldRootRefPos = C_NULL_PTR - InputData%C_obj%bldRootRefPos_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%nBlades)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%nBlades) - InputData%nBlades => NULL() - InputData%C_obj%nBlades = C_NULL_PTR - InputData%C_obj%nBlades_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%nBladeNodes)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%nBladeNodes) - InputData%nBladeNodes => NULL() - InputData%C_obj%nBladeNodes = C_NULL_PTR - InputData%C_obj%nBladeNodes_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%nTowerNodes)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%nTowerNodes) - InputData%nTowerNodes => NULL() - InputData%C_obj%nTowerNodes = C_NULL_PTR - InputData%C_obj%nTowerNodes_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%bldChord)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%bldChord) - InputData%bldChord => NULL() - InputData%C_obj%bldChord = C_NULL_PTR - InputData%C_obj%bldChord_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%bldRloc)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%bldRloc) - InputData%bldRloc => NULL() - InputData%C_obj%bldRloc = C_NULL_PTR - InputData%C_obj%bldRloc_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%twrDia)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%twrDia) - InputData%twrDia => NULL() - InputData%C_obj%twrDia = C_NULL_PTR - InputData%C_obj%twrDia_Len = 0 -ENDIF -IF (ASSOCIATED(InputData%twrHloc)) THEN - IF (DEALLOCATEpointers_local) & - DEALLOCATE(InputData%twrHloc) - InputData%twrHloc => NULL() - InputData%C_obj%twrHloc = C_NULL_PTR - InputData%C_obj%twrHloc_Len = 0 -ENDIF IF (ASSOCIATED(InputData%bldPitch)) THEN IF (DEALLOCATEpointers_local) & DEALLOCATE(InputData%bldPitch) @@ -607,66 +351,6 @@ SUBROUTINE ExtLdDX_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 2*1 ! bldRootDef upper/lower bounds for each dimension Db_BufSz = Db_BufSz + SIZE(InData%bldRootDef) ! bldRootDef END IF - Int_BufSz = Int_BufSz + 1 ! twrRefPos allocated yes/no - IF ( ASSOCIATED(InData%twrRefPos) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! twrRefPos upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%twrRefPos) ! twrRefPos - END IF - Int_BufSz = Int_BufSz + 1 ! bldRefPos allocated yes/no - IF ( ASSOCIATED(InData%bldRefPos) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! bldRefPos upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%bldRefPos) ! bldRefPos - END IF - Int_BufSz = Int_BufSz + 1 ! hubRefPos allocated yes/no - IF ( ASSOCIATED(InData%hubRefPos) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! hubRefPos upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%hubRefPos) ! hubRefPos - END IF - Int_BufSz = Int_BufSz + 1 ! nacRefPos allocated yes/no - IF ( ASSOCIATED(InData%nacRefPos) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! nacRefPos upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%nacRefPos) ! nacRefPos - END IF - Int_BufSz = Int_BufSz + 1 ! bldRootRefPos allocated yes/no - IF ( ASSOCIATED(InData%bldRootRefPos) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! bldRootRefPos upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%bldRootRefPos) ! bldRootRefPos - END IF - Int_BufSz = Int_BufSz + 1 ! nBlades allocated yes/no - IF ( ASSOCIATED(InData%nBlades) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! nBlades upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%nBlades) ! nBlades - END IF - Int_BufSz = Int_BufSz + 1 ! nBladeNodes allocated yes/no - IF ( ASSOCIATED(InData%nBladeNodes) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! nBladeNodes upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%nBladeNodes) ! nBladeNodes - END IF - Int_BufSz = Int_BufSz + 1 ! nTowerNodes allocated yes/no - IF ( ASSOCIATED(InData%nTowerNodes) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! nTowerNodes upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%nTowerNodes) ! nTowerNodes - END IF - Int_BufSz = Int_BufSz + 1 ! bldChord allocated yes/no - IF ( ASSOCIATED(InData%bldChord) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! bldChord upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%bldChord) ! bldChord - END IF - Int_BufSz = Int_BufSz + 1 ! bldRloc allocated yes/no - IF ( ASSOCIATED(InData%bldRloc) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! bldRloc upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%bldRloc) ! bldRloc - END IF - Int_BufSz = Int_BufSz + 1 ! twrDia allocated yes/no - IF ( ASSOCIATED(InData%twrDia) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! twrDia upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%twrDia) ! twrDia - END IF - Int_BufSz = Int_BufSz + 1 ! twrHloc allocated yes/no - IF ( ASSOCIATED(InData%twrHloc) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! twrHloc upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%twrHloc) ! twrHloc - END IF Int_BufSz = Int_BufSz + 1 ! bldPitch allocated yes/no IF ( ASSOCIATED(InData%bldPitch) ) THEN Int_BufSz = Int_BufSz + 2*1 ! bldPitch upper/lower bounds for each dimension @@ -776,124 +460,884 @@ SUBROUTINE ExtLdDX_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%twrRefPos) ) THEN + IF ( .NOT. ASSOCIATED(InData%bldPitch) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%twrRefPos,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%twrRefPos,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%bldPitch,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%bldPitch,1) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%twrRefPos,1), UBOUND(InData%twrRefPos,1) - DbKiBuf(Db_Xferred) = InData%twrRefPos(i1) + DO i1 = LBOUND(InData%bldPitch,1), UBOUND(InData%bldPitch,1) + DbKiBuf(Db_Xferred) = InData%bldPitch(i1) Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%bldRefPos) ) THEN - IntKiBuf( Int_Xferred ) = 0 + END SUBROUTINE ExtLdDX_PackInput + + SUBROUTINE ExtLdDX_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: ReKiBuf(:) + REAL(DbKi), ALLOCATABLE, INTENT(IN ) :: DbKiBuf(:) + INTEGER(IntKi), ALLOCATABLE, INTENT(IN ) :: IntKiBuf(:) + TYPE(ExtLdDX_InputType), INTENT(INOUT) :: OutData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + ! Local variables + INTEGER(IntKi) :: Buf_size + INTEGER(IntKi) :: Re_Xferred + INTEGER(IntKi) :: Db_Xferred + INTEGER(IntKi) :: Int_Xferred + INTEGER(IntKi) :: i + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'ExtLdDX_UnPackInput' + ! buffers to store meshes, if any + REAL(ReKi), ALLOCATABLE :: Re_Buf(:) + REAL(DbKi), ALLOCATABLE :: Db_Buf(:) + INTEGER(IntKi), ALLOCATABLE :: Int_Buf(:) + ! + ErrStat = ErrID_None + ErrMsg = "" + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! twrDef not allocated Int_Xferred = Int_Xferred + 1 ELSE - IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%bldRefPos,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%bldRefPos,1) + i1_l = IntKiBuf( Int_Xferred ) + i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%bldRefPos,1), UBOUND(InData%bldRefPos,1) - DbKiBuf(Db_Xferred) = InData%bldRefPos(i1) + IF (ASSOCIATED(OutData%twrDef)) DEALLOCATE(OutData%twrDef) + ALLOCATE(OutData%twrDef(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%twrDef.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + OutData%c_obj%twrDef_Len = SIZE(OutData%twrDef) + IF (OutData%c_obj%twrDef_Len > 0) & + OutData%c_obj%twrDef = C_LOC( OutData%twrDef( i1_l ) ) + DO i1 = LBOUND(OutData%twrDef,1), UBOUND(OutData%twrDef,1) + OutData%twrDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%hubRefPos) ) THEN - IntKiBuf( Int_Xferred ) = 0 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldDef not allocated Int_Xferred = Int_Xferred + 1 ELSE - IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%hubRefPos,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%hubRefPos,1) - Int_Xferred = Int_Xferred + 2 + i1_l = IntKiBuf( Int_Xferred ) + i1_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%bldDef)) DEALLOCATE(OutData%bldDef) + ALLOCATE(OutData%bldDef(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldDef.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + OutData%c_obj%bldDef_Len = SIZE(OutData%bldDef) + IF (OutData%c_obj%bldDef_Len > 0) & + OutData%c_obj%bldDef = C_LOC( OutData%bldDef( i1_l ) ) + DO i1 = LBOUND(OutData%bldDef,1), UBOUND(OutData%bldDef,1) + OutData%bldDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) + Db_Xferred = Db_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! hubDef not allocated + Int_Xferred = Int_Xferred + 1 + ELSE + Int_Xferred = Int_Xferred + 1 + i1_l = IntKiBuf( Int_Xferred ) + i1_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%hubDef)) DEALLOCATE(OutData%hubDef) + ALLOCATE(OutData%hubDef(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%hubDef.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + OutData%c_obj%hubDef_Len = SIZE(OutData%hubDef) + IF (OutData%c_obj%hubDef_Len > 0) & + OutData%c_obj%hubDef = C_LOC( OutData%hubDef( i1_l ) ) + DO i1 = LBOUND(OutData%hubDef,1), UBOUND(OutData%hubDef,1) + OutData%hubDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) + Db_Xferred = Db_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nacDef not allocated + Int_Xferred = Int_Xferred + 1 + ELSE + Int_Xferred = Int_Xferred + 1 + i1_l = IntKiBuf( Int_Xferred ) + i1_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%nacDef)) DEALLOCATE(OutData%nacDef) + ALLOCATE(OutData%nacDef(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nacDef.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + OutData%c_obj%nacDef_Len = SIZE(OutData%nacDef) + IF (OutData%c_obj%nacDef_Len > 0) & + OutData%c_obj%nacDef = C_LOC( OutData%nacDef( i1_l ) ) + DO i1 = LBOUND(OutData%nacDef,1), UBOUND(OutData%nacDef,1) + OutData%nacDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) + Db_Xferred = Db_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldRootDef not allocated + Int_Xferred = Int_Xferred + 1 + ELSE + Int_Xferred = Int_Xferred + 1 + i1_l = IntKiBuf( Int_Xferred ) + i1_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%bldRootDef)) DEALLOCATE(OutData%bldRootDef) + ALLOCATE(OutData%bldRootDef(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldRootDef.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + OutData%c_obj%bldRootDef_Len = SIZE(OutData%bldRootDef) + IF (OutData%c_obj%bldRootDef_Len > 0) & + OutData%c_obj%bldRootDef = C_LOC( OutData%bldRootDef( i1_l ) ) + DO i1 = LBOUND(OutData%bldRootDef,1), UBOUND(OutData%bldRootDef,1) + OutData%bldRootDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) + Db_Xferred = Db_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldPitch not allocated + Int_Xferred = Int_Xferred + 1 + ELSE + Int_Xferred = Int_Xferred + 1 + i1_l = IntKiBuf( Int_Xferred ) + i1_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%bldPitch)) DEALLOCATE(OutData%bldPitch) + ALLOCATE(OutData%bldPitch(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldPitch.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + OutData%c_obj%bldPitch_Len = SIZE(OutData%bldPitch) + IF (OutData%c_obj%bldPitch_Len > 0) & + OutData%c_obj%bldPitch = C_LOC( OutData%bldPitch( i1_l ) ) + DO i1 = LBOUND(OutData%bldPitch,1), UBOUND(OutData%bldPitch,1) + OutData%bldPitch(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) + Db_Xferred = Db_Xferred + 1 + END DO + END IF + END SUBROUTINE ExtLdDX_UnPackInput + + SUBROUTINE ExtLdDX_C2Fary_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers ) + TYPE(ExtLdDX_InputType), INTENT(INOUT) :: InputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + LOGICAL,OPTIONAL,INTENT(IN ) :: SkipPointers + ! + LOGICAL :: SkipPointers_local + ErrStat = ErrID_None + ErrMsg = "" + + IF (PRESENT(SkipPointers)) THEN + SkipPointers_local = SkipPointers + ELSE + SkipPointers_local = .false. + END IF + + ! -- twrDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. C_ASSOCIATED( InputData%C_obj%twrDef ) ) THEN + NULLIFY( InputData%twrDef ) + ELSE + CALL C_F_POINTER(InputData%C_obj%twrDef, InputData%twrDef, (/InputData%C_obj%twrDef_Len/)) + END IF + END IF + + ! -- bldDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldDef ) ) THEN + NULLIFY( InputData%bldDef ) + ELSE + CALL C_F_POINTER(InputData%C_obj%bldDef, InputData%bldDef, (/InputData%C_obj%bldDef_Len/)) + END IF + END IF + + ! -- hubDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. C_ASSOCIATED( InputData%C_obj%hubDef ) ) THEN + NULLIFY( InputData%hubDef ) + ELSE + CALL C_F_POINTER(InputData%C_obj%hubDef, InputData%hubDef, (/InputData%C_obj%hubDef_Len/)) + END IF + END IF + + ! -- nacDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. C_ASSOCIATED( InputData%C_obj%nacDef ) ) THEN + NULLIFY( InputData%nacDef ) + ELSE + CALL C_F_POINTER(InputData%C_obj%nacDef, InputData%nacDef, (/InputData%C_obj%nacDef_Len/)) + END IF + END IF + + ! -- bldRootDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldRootDef ) ) THEN + NULLIFY( InputData%bldRootDef ) + ELSE + CALL C_F_POINTER(InputData%C_obj%bldRootDef, InputData%bldRootDef, (/InputData%C_obj%bldRootDef_Len/)) + END IF + END IF + + ! -- bldPitch Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldPitch ) ) THEN + NULLIFY( InputData%bldPitch ) + ELSE + CALL C_F_POINTER(InputData%C_obj%bldPitch, InputData%bldPitch, (/InputData%C_obj%bldPitch_Len/)) + END IF + END IF + END SUBROUTINE ExtLdDX_C2Fary_CopyInput + + SUBROUTINE ExtLdDX_F2C_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers ) + TYPE(ExtLdDX_InputType), INTENT(INOUT) :: InputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + LOGICAL,OPTIONAL,INTENT(IN ) :: SkipPointers + ! + LOGICAL :: SkipPointers_local + ErrStat = ErrID_None + ErrMsg = "" + + IF (PRESENT(SkipPointers)) THEN + SkipPointers_local = SkipPointers + ELSE + SkipPointers_local = .false. + END IF + + ! -- twrDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. ASSOCIATED(InputData%twrDef)) THEN + InputData%c_obj%twrDef_Len = 0 + InputData%c_obj%twrDef = C_NULL_PTR + ELSE + InputData%c_obj%twrDef_Len = SIZE(InputData%twrDef) + IF (InputData%c_obj%twrDef_Len > 0) & + InputData%c_obj%twrDef = C_LOC( InputData%twrDef( LBOUND(InputData%twrDef,1) ) ) + END IF + END IF + + ! -- bldDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. ASSOCIATED(InputData%bldDef)) THEN + InputData%c_obj%bldDef_Len = 0 + InputData%c_obj%bldDef = C_NULL_PTR + ELSE + InputData%c_obj%bldDef_Len = SIZE(InputData%bldDef) + IF (InputData%c_obj%bldDef_Len > 0) & + InputData%c_obj%bldDef = C_LOC( InputData%bldDef( LBOUND(InputData%bldDef,1) ) ) + END IF + END IF + + ! -- hubDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. ASSOCIATED(InputData%hubDef)) THEN + InputData%c_obj%hubDef_Len = 0 + InputData%c_obj%hubDef = C_NULL_PTR + ELSE + InputData%c_obj%hubDef_Len = SIZE(InputData%hubDef) + IF (InputData%c_obj%hubDef_Len > 0) & + InputData%c_obj%hubDef = C_LOC( InputData%hubDef( LBOUND(InputData%hubDef,1) ) ) + END IF + END IF + + ! -- nacDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. ASSOCIATED(InputData%nacDef)) THEN + InputData%c_obj%nacDef_Len = 0 + InputData%c_obj%nacDef = C_NULL_PTR + ELSE + InputData%c_obj%nacDef_Len = SIZE(InputData%nacDef) + IF (InputData%c_obj%nacDef_Len > 0) & + InputData%c_obj%nacDef = C_LOC( InputData%nacDef( LBOUND(InputData%nacDef,1) ) ) + END IF + END IF + + ! -- bldRootDef Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. ASSOCIATED(InputData%bldRootDef)) THEN + InputData%c_obj%bldRootDef_Len = 0 + InputData%c_obj%bldRootDef = C_NULL_PTR + ELSE + InputData%c_obj%bldRootDef_Len = SIZE(InputData%bldRootDef) + IF (InputData%c_obj%bldRootDef_Len > 0) & + InputData%c_obj%bldRootDef = C_LOC( InputData%bldRootDef( LBOUND(InputData%bldRootDef,1) ) ) + END IF + END IF + + ! -- bldPitch Input Data fields + IF ( .NOT. SkipPointers_local ) THEN + IF ( .NOT. ASSOCIATED(InputData%bldPitch)) THEN + InputData%c_obj%bldPitch_Len = 0 + InputData%c_obj%bldPitch = C_NULL_PTR + ELSE + InputData%c_obj%bldPitch_Len = SIZE(InputData%bldPitch) + IF (InputData%c_obj%bldPitch_Len > 0) & + InputData%c_obj%bldPitch = C_LOC( InputData%bldPitch( LBOUND(InputData%bldPitch,1) ) ) + END IF + END IF + END SUBROUTINE ExtLdDX_F2C_CopyInput + + SUBROUTINE ExtLdDX_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) + TYPE(ExtLdDX_ParameterType), INTENT(IN) :: SrcParamData + TYPE(ExtLdDX_ParameterType), INTENT(INOUT) :: DstParamData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'ExtLdDX_CopyParam' +! + ErrStat = ErrID_None + ErrMsg = "" +IF (ASSOCIATED(SrcParamData%nBlades)) THEN + i1_l = LBOUND(SrcParamData%nBlades,1) + i1_u = UBOUND(SrcParamData%nBlades,1) + IF (.NOT. ASSOCIATED(DstParamData%nBlades)) THEN + ALLOCATE(DstParamData%nBlades(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nBlades.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%nBlades_Len = SIZE(DstParamData%nBlades) + IF (DstParamData%c_obj%nBlades_Len > 0) & + DstParamData%c_obj%nBlades = C_LOC( DstParamData%nBlades( i1_l ) ) + END IF + DstParamData%nBlades = SrcParamData%nBlades +ENDIF +IF (ASSOCIATED(SrcParamData%nBladeNodes)) THEN + i1_l = LBOUND(SrcParamData%nBladeNodes,1) + i1_u = UBOUND(SrcParamData%nBladeNodes,1) + IF (.NOT. ASSOCIATED(DstParamData%nBladeNodes)) THEN + ALLOCATE(DstParamData%nBladeNodes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nBladeNodes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%nBladeNodes_Len = SIZE(DstParamData%nBladeNodes) + IF (DstParamData%c_obj%nBladeNodes_Len > 0) & + DstParamData%c_obj%nBladeNodes = C_LOC( DstParamData%nBladeNodes( i1_l ) ) + END IF + DstParamData%nBladeNodes = SrcParamData%nBladeNodes +ENDIF +IF (ASSOCIATED(SrcParamData%nTowerNodes)) THEN + i1_l = LBOUND(SrcParamData%nTowerNodes,1) + i1_u = UBOUND(SrcParamData%nTowerNodes,1) + IF (.NOT. ASSOCIATED(DstParamData%nTowerNodes)) THEN + ALLOCATE(DstParamData%nTowerNodes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nTowerNodes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%nTowerNodes_Len = SIZE(DstParamData%nTowerNodes) + IF (DstParamData%c_obj%nTowerNodes_Len > 0) & + DstParamData%c_obj%nTowerNodes = C_LOC( DstParamData%nTowerNodes( i1_l ) ) + END IF + DstParamData%nTowerNodes = SrcParamData%nTowerNodes +ENDIF +IF (ASSOCIATED(SrcParamData%twrRefPos)) THEN + i1_l = LBOUND(SrcParamData%twrRefPos,1) + i1_u = UBOUND(SrcParamData%twrRefPos,1) + IF (.NOT. ASSOCIATED(DstParamData%twrRefPos)) THEN + ALLOCATE(DstParamData%twrRefPos(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%twrRefPos.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%twrRefPos_Len = SIZE(DstParamData%twrRefPos) + IF (DstParamData%c_obj%twrRefPos_Len > 0) & + DstParamData%c_obj%twrRefPos = C_LOC( DstParamData%twrRefPos( i1_l ) ) + END IF + DstParamData%twrRefPos = SrcParamData%twrRefPos +ENDIF +IF (ASSOCIATED(SrcParamData%bldRefPos)) THEN + i1_l = LBOUND(SrcParamData%bldRefPos,1) + i1_u = UBOUND(SrcParamData%bldRefPos,1) + IF (.NOT. ASSOCIATED(DstParamData%bldRefPos)) THEN + ALLOCATE(DstParamData%bldRefPos(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%bldRefPos.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%bldRefPos_Len = SIZE(DstParamData%bldRefPos) + IF (DstParamData%c_obj%bldRefPos_Len > 0) & + DstParamData%c_obj%bldRefPos = C_LOC( DstParamData%bldRefPos( i1_l ) ) + END IF + DstParamData%bldRefPos = SrcParamData%bldRefPos +ENDIF +IF (ASSOCIATED(SrcParamData%hubRefPos)) THEN + i1_l = LBOUND(SrcParamData%hubRefPos,1) + i1_u = UBOUND(SrcParamData%hubRefPos,1) + IF (.NOT. ASSOCIATED(DstParamData%hubRefPos)) THEN + ALLOCATE(DstParamData%hubRefPos(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%hubRefPos.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%hubRefPos_Len = SIZE(DstParamData%hubRefPos) + IF (DstParamData%c_obj%hubRefPos_Len > 0) & + DstParamData%c_obj%hubRefPos = C_LOC( DstParamData%hubRefPos( i1_l ) ) + END IF + DstParamData%hubRefPos = SrcParamData%hubRefPos +ENDIF +IF (ASSOCIATED(SrcParamData%nacRefPos)) THEN + i1_l = LBOUND(SrcParamData%nacRefPos,1) + i1_u = UBOUND(SrcParamData%nacRefPos,1) + IF (.NOT. ASSOCIATED(DstParamData%nacRefPos)) THEN + ALLOCATE(DstParamData%nacRefPos(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nacRefPos.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%nacRefPos_Len = SIZE(DstParamData%nacRefPos) + IF (DstParamData%c_obj%nacRefPos_Len > 0) & + DstParamData%c_obj%nacRefPos = C_LOC( DstParamData%nacRefPos( i1_l ) ) + END IF + DstParamData%nacRefPos = SrcParamData%nacRefPos +ENDIF +IF (ASSOCIATED(SrcParamData%bldRootRefPos)) THEN + i1_l = LBOUND(SrcParamData%bldRootRefPos,1) + i1_u = UBOUND(SrcParamData%bldRootRefPos,1) + IF (.NOT. ASSOCIATED(DstParamData%bldRootRefPos)) THEN + ALLOCATE(DstParamData%bldRootRefPos(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%bldRootRefPos.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%bldRootRefPos_Len = SIZE(DstParamData%bldRootRefPos) + IF (DstParamData%c_obj%bldRootRefPos_Len > 0) & + DstParamData%c_obj%bldRootRefPos = C_LOC( DstParamData%bldRootRefPos( i1_l ) ) + END IF + DstParamData%bldRootRefPos = SrcParamData%bldRootRefPos +ENDIF +IF (ASSOCIATED(SrcParamData%bldChord)) THEN + i1_l = LBOUND(SrcParamData%bldChord,1) + i1_u = UBOUND(SrcParamData%bldChord,1) + IF (.NOT. ASSOCIATED(DstParamData%bldChord)) THEN + ALLOCATE(DstParamData%bldChord(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%bldChord.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%bldChord_Len = SIZE(DstParamData%bldChord) + IF (DstParamData%c_obj%bldChord_Len > 0) & + DstParamData%c_obj%bldChord = C_LOC( DstParamData%bldChord( i1_l ) ) + END IF + DstParamData%bldChord = SrcParamData%bldChord +ENDIF +IF (ASSOCIATED(SrcParamData%bldRloc)) THEN + i1_l = LBOUND(SrcParamData%bldRloc,1) + i1_u = UBOUND(SrcParamData%bldRloc,1) + IF (.NOT. ASSOCIATED(DstParamData%bldRloc)) THEN + ALLOCATE(DstParamData%bldRloc(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%bldRloc.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%bldRloc_Len = SIZE(DstParamData%bldRloc) + IF (DstParamData%c_obj%bldRloc_Len > 0) & + DstParamData%c_obj%bldRloc = C_LOC( DstParamData%bldRloc( i1_l ) ) + END IF + DstParamData%bldRloc = SrcParamData%bldRloc +ENDIF +IF (ASSOCIATED(SrcParamData%twrDia)) THEN + i1_l = LBOUND(SrcParamData%twrDia,1) + i1_u = UBOUND(SrcParamData%twrDia,1) + IF (.NOT. ASSOCIATED(DstParamData%twrDia)) THEN + ALLOCATE(DstParamData%twrDia(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%twrDia.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%twrDia_Len = SIZE(DstParamData%twrDia) + IF (DstParamData%c_obj%twrDia_Len > 0) & + DstParamData%c_obj%twrDia = C_LOC( DstParamData%twrDia( i1_l ) ) + END IF + DstParamData%twrDia = SrcParamData%twrDia +ENDIF +IF (ASSOCIATED(SrcParamData%twrHloc)) THEN + i1_l = LBOUND(SrcParamData%twrHloc,1) + i1_u = UBOUND(SrcParamData%twrHloc,1) + IF (.NOT. ASSOCIATED(DstParamData%twrHloc)) THEN + ALLOCATE(DstParamData%twrHloc(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%twrHloc.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DstParamData%c_obj%twrHloc_Len = SIZE(DstParamData%twrHloc) + IF (DstParamData%c_obj%twrHloc_Len > 0) & + DstParamData%c_obj%twrHloc = C_LOC( DstParamData%twrHloc( i1_l ) ) + END IF + DstParamData%twrHloc = SrcParamData%twrHloc +ENDIF + END SUBROUTINE ExtLdDX_CopyParam + + SUBROUTINE ExtLdDX_DestroyParam( ParamData, ErrStat, ErrMsg, DEALLOCATEpointers ) + TYPE(ExtLdDX_ParameterType), INTENT(INOUT) :: ParamData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + LOGICAL,OPTIONAL,INTENT(IN ) :: DEALLOCATEpointers + + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 + LOGICAL :: DEALLOCATEpointers_local + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'ExtLdDX_DestroyParam' + + ErrStat = ErrID_None + ErrMsg = "" + + IF (PRESENT(DEALLOCATEpointers)) THEN + DEALLOCATEpointers_local = DEALLOCATEpointers + ELSE + DEALLOCATEpointers_local = .true. + END IF + +IF (ASSOCIATED(ParamData%nBlades)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%nBlades) + ParamData%nBlades => NULL() + ParamData%C_obj%nBlades = C_NULL_PTR + ParamData%C_obj%nBlades_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%nBladeNodes)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%nBladeNodes) + ParamData%nBladeNodes => NULL() + ParamData%C_obj%nBladeNodes = C_NULL_PTR + ParamData%C_obj%nBladeNodes_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%nTowerNodes)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%nTowerNodes) + ParamData%nTowerNodes => NULL() + ParamData%C_obj%nTowerNodes = C_NULL_PTR + ParamData%C_obj%nTowerNodes_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%twrRefPos)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%twrRefPos) + ParamData%twrRefPos => NULL() + ParamData%C_obj%twrRefPos = C_NULL_PTR + ParamData%C_obj%twrRefPos_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%bldRefPos)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%bldRefPos) + ParamData%bldRefPos => NULL() + ParamData%C_obj%bldRefPos = C_NULL_PTR + ParamData%C_obj%bldRefPos_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%hubRefPos)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%hubRefPos) + ParamData%hubRefPos => NULL() + ParamData%C_obj%hubRefPos = C_NULL_PTR + ParamData%C_obj%hubRefPos_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%nacRefPos)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%nacRefPos) + ParamData%nacRefPos => NULL() + ParamData%C_obj%nacRefPos = C_NULL_PTR + ParamData%C_obj%nacRefPos_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%bldRootRefPos)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%bldRootRefPos) + ParamData%bldRootRefPos => NULL() + ParamData%C_obj%bldRootRefPos = C_NULL_PTR + ParamData%C_obj%bldRootRefPos_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%bldChord)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%bldChord) + ParamData%bldChord => NULL() + ParamData%C_obj%bldChord = C_NULL_PTR + ParamData%C_obj%bldChord_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%bldRloc)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%bldRloc) + ParamData%bldRloc => NULL() + ParamData%C_obj%bldRloc = C_NULL_PTR + ParamData%C_obj%bldRloc_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%twrDia)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%twrDia) + ParamData%twrDia => NULL() + ParamData%C_obj%twrDia = C_NULL_PTR + ParamData%C_obj%twrDia_Len = 0 +ENDIF +IF (ASSOCIATED(ParamData%twrHloc)) THEN + IF (DEALLOCATEpointers_local) & + DEALLOCATE(ParamData%twrHloc) + ParamData%twrHloc => NULL() + ParamData%C_obj%twrHloc = C_NULL_PTR + ParamData%C_obj%twrHloc_Len = 0 +ENDIF + END SUBROUTINE ExtLdDX_DestroyParam + + SUBROUTINE ExtLdDX_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: ReKiBuf(:) + REAL(DbKi), ALLOCATABLE, INTENT( OUT) :: DbKiBuf(:) + INTEGER(IntKi), ALLOCATABLE, INTENT( OUT) :: IntKiBuf(:) + TYPE(ExtLdDX_ParameterType), INTENT(IN) :: InData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly + ! Local variables + INTEGER(IntKi) :: Re_BufSz + INTEGER(IntKi) :: Re_Xferred + INTEGER(IntKi) :: Db_BufSz + INTEGER(IntKi) :: Db_Xferred + INTEGER(IntKi) :: Int_BufSz + INTEGER(IntKi) :: Int_Xferred + INTEGER(IntKi) :: i,i1,i2,i3,i4,i5 + LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'ExtLdDX_PackParam' + ! buffers to store subtypes, if any + REAL(ReKi), ALLOCATABLE :: Re_Buf(:) + REAL(DbKi), ALLOCATABLE :: Db_Buf(:) + INTEGER(IntKi), ALLOCATABLE :: Int_Buf(:) + + OnlySize = .FALSE. + IF ( PRESENT(SizeOnly) ) THEN + OnlySize = SizeOnly + ENDIF + ! + ErrStat = ErrID_None + ErrMsg = "" + Re_BufSz = 0 + Db_BufSz = 0 + Int_BufSz = 0 + Int_BufSz = Int_BufSz + 1 ! nBlades allocated yes/no + IF ( ASSOCIATED(InData%nBlades) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! nBlades upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%nBlades) ! nBlades + END IF + Int_BufSz = Int_BufSz + 1 ! nBladeNodes allocated yes/no + IF ( ASSOCIATED(InData%nBladeNodes) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! nBladeNodes upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%nBladeNodes) ! nBladeNodes + END IF + Int_BufSz = Int_BufSz + 1 ! nTowerNodes allocated yes/no + IF ( ASSOCIATED(InData%nTowerNodes) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! nTowerNodes upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%nTowerNodes) ! nTowerNodes + END IF + Int_BufSz = Int_BufSz + 1 ! twrRefPos allocated yes/no + IF ( ASSOCIATED(InData%twrRefPos) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! twrRefPos upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%twrRefPos) ! twrRefPos + END IF + Int_BufSz = Int_BufSz + 1 ! bldRefPos allocated yes/no + IF ( ASSOCIATED(InData%bldRefPos) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! bldRefPos upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%bldRefPos) ! bldRefPos + END IF + Int_BufSz = Int_BufSz + 1 ! hubRefPos allocated yes/no + IF ( ASSOCIATED(InData%hubRefPos) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! hubRefPos upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%hubRefPos) ! hubRefPos + END IF + Int_BufSz = Int_BufSz + 1 ! nacRefPos allocated yes/no + IF ( ASSOCIATED(InData%nacRefPos) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! nacRefPos upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%nacRefPos) ! nacRefPos + END IF + Int_BufSz = Int_BufSz + 1 ! bldRootRefPos allocated yes/no + IF ( ASSOCIATED(InData%bldRootRefPos) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! bldRootRefPos upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%bldRootRefPos) ! bldRootRefPos + END IF + Int_BufSz = Int_BufSz + 1 ! bldChord allocated yes/no + IF ( ASSOCIATED(InData%bldChord) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! bldChord upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%bldChord) ! bldChord + END IF + Int_BufSz = Int_BufSz + 1 ! bldRloc allocated yes/no + IF ( ASSOCIATED(InData%bldRloc) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! bldRloc upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%bldRloc) ! bldRloc + END IF + Int_BufSz = Int_BufSz + 1 ! twrDia allocated yes/no + IF ( ASSOCIATED(InData%twrDia) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! twrDia upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%twrDia) ! twrDia + END IF + Int_BufSz = Int_BufSz + 1 ! twrHloc allocated yes/no + IF ( ASSOCIATED(InData%twrHloc) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! twrHloc upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%twrHloc) ! twrHloc + END IF + IF ( Re_BufSz .GT. 0 ) THEN + ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating ReKiBuf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + IF ( Db_BufSz .GT. 0 ) THEN + ALLOCATE( DbKiBuf( Db_BufSz ), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DbKiBuf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + IF ( Int_BufSz .GT. 0 ) THEN + ALLOCATE( IntKiBuf( Int_BufSz ), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating IntKiBuf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + IF(OnlySize) RETURN ! return early if only trying to allocate buffers (not pack them) + + IF (C_ASSOCIATED(InData%C_obj%object)) CALL SetErrStat(ErrID_Severe,'C_obj%object cannot be packed.',ErrStat,ErrMsg,RoutineName) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + IF ( .NOT. ASSOCIATED(InData%nBlades) ) THEN + IntKiBuf( Int_Xferred ) = 0 + Int_Xferred = Int_Xferred + 1 + ELSE + IntKiBuf( Int_Xferred ) = 1 + Int_Xferred = Int_Xferred + 1 + IntKiBuf( Int_Xferred ) = LBOUND(InData%nBlades,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%nBlades,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%nBlades,1), UBOUND(InData%nBlades,1) + IntKiBuf(Int_Xferred) = InData%nBlades(i1) + Int_Xferred = Int_Xferred + 1 + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%nBladeNodes) ) THEN + IntKiBuf( Int_Xferred ) = 0 + Int_Xferred = Int_Xferred + 1 + ELSE + IntKiBuf( Int_Xferred ) = 1 + Int_Xferred = Int_Xferred + 1 + IntKiBuf( Int_Xferred ) = LBOUND(InData%nBladeNodes,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%nBladeNodes,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%nBladeNodes,1), UBOUND(InData%nBladeNodes,1) + IntKiBuf(Int_Xferred) = InData%nBladeNodes(i1) + Int_Xferred = Int_Xferred + 1 + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%nTowerNodes) ) THEN + IntKiBuf( Int_Xferred ) = 0 + Int_Xferred = Int_Xferred + 1 + ELSE + IntKiBuf( Int_Xferred ) = 1 + Int_Xferred = Int_Xferred + 1 + IntKiBuf( Int_Xferred ) = LBOUND(InData%nTowerNodes,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%nTowerNodes,1) + Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%hubRefPos,1), UBOUND(InData%hubRefPos,1) - DbKiBuf(Db_Xferred) = InData%hubRefPos(i1) - Db_Xferred = Db_Xferred + 1 + DO i1 = LBOUND(InData%nTowerNodes,1), UBOUND(InData%nTowerNodes,1) + IntKiBuf(Int_Xferred) = InData%nTowerNodes(i1) + Int_Xferred = Int_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%nacRefPos) ) THEN + IF ( .NOT. ASSOCIATED(InData%twrRefPos) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%nacRefPos,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%nacRefPos,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%twrRefPos,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%twrRefPos,1) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%nacRefPos,1), UBOUND(InData%nacRefPos,1) - DbKiBuf(Db_Xferred) = InData%nacRefPos(i1) + DO i1 = LBOUND(InData%twrRefPos,1), UBOUND(InData%twrRefPos,1) + DbKiBuf(Db_Xferred) = InData%twrRefPos(i1) Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%bldRootRefPos) ) THEN + IF ( .NOT. ASSOCIATED(InData%bldRefPos) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%bldRootRefPos,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%bldRootRefPos,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%bldRefPos,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%bldRefPos,1) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%bldRootRefPos,1), UBOUND(InData%bldRootRefPos,1) - DbKiBuf(Db_Xferred) = InData%bldRootRefPos(i1) + DO i1 = LBOUND(InData%bldRefPos,1), UBOUND(InData%bldRefPos,1) + DbKiBuf(Db_Xferred) = InData%bldRefPos(i1) Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%nBlades) ) THEN + IF ( .NOT. ASSOCIATED(InData%hubRefPos) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%nBlades,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%nBlades,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%hubRefPos,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%hubRefPos,1) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%nBlades,1), UBOUND(InData%nBlades,1) - IntKiBuf(Int_Xferred) = InData%nBlades(i1) - Int_Xferred = Int_Xferred + 1 + DO i1 = LBOUND(InData%hubRefPos,1), UBOUND(InData%hubRefPos,1) + DbKiBuf(Db_Xferred) = InData%hubRefPos(i1) + Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%nBladeNodes) ) THEN + IF ( .NOT. ASSOCIATED(InData%nacRefPos) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%nBladeNodes,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%nBladeNodes,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%nacRefPos,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%nacRefPos,1) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%nBladeNodes,1), UBOUND(InData%nBladeNodes,1) - IntKiBuf(Int_Xferred) = InData%nBladeNodes(i1) - Int_Xferred = Int_Xferred + 1 + DO i1 = LBOUND(InData%nacRefPos,1), UBOUND(InData%nacRefPos,1) + DbKiBuf(Db_Xferred) = InData%nacRefPos(i1) + Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%nTowerNodes) ) THEN + IF ( .NOT. ASSOCIATED(InData%bldRootRefPos) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%nTowerNodes,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%nTowerNodes,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%bldRootRefPos,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%bldRootRefPos,1) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%nTowerNodes,1), UBOUND(InData%nTowerNodes,1) - IntKiBuf(Int_Xferred) = InData%nTowerNodes(i1) - Int_Xferred = Int_Xferred + 1 + DO i1 = LBOUND(InData%bldRootRefPos,1), UBOUND(InData%bldRootRefPos,1) + DbKiBuf(Db_Xferred) = InData%bldRootRefPos(i1) + Db_Xferred = Db_Xferred + 1 END DO END IF IF ( .NOT. ASSOCIATED(InData%bldChord) ) THEN @@ -956,28 +1400,13 @@ SUBROUTINE ExtLdDX_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( .NOT. ASSOCIATED(InData%bldPitch) ) THEN - IntKiBuf( Int_Xferred ) = 0 - Int_Xferred = Int_Xferred + 1 - ELSE - IntKiBuf( Int_Xferred ) = 1 - Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%bldPitch,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%bldPitch,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%bldPitch,1), UBOUND(InData%bldPitch,1) - DbKiBuf(Db_Xferred) = InData%bldPitch(i1) - Db_Xferred = Db_Xferred + 1 - END DO - END IF - END SUBROUTINE ExtLdDX_PackInput + END SUBROUTINE ExtLdDX_PackParam - SUBROUTINE ExtLdDX_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE ExtLdDX_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: ReKiBuf(:) REAL(DbKi), ALLOCATABLE, INTENT(IN ) :: DbKiBuf(:) INTEGER(IntKi), ALLOCATABLE, INTENT(IN ) :: IntKiBuf(:) - TYPE(ExtLdDX_InputType), INTENT(INOUT) :: OutData + TYPE(ExtLdDX_ParameterType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -989,7 +1418,7 @@ SUBROUTINE ExtLdDX_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ExtLdDX_UnPackInput' + CHARACTER(*), PARAMETER :: RoutineName = 'ExtLdDX_UnPackParam' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1000,109 +1429,67 @@ SUBROUTINE ExtLdDX_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! twrDef not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%twrDef)) DEALLOCATE(OutData%twrDef) - ALLOCATE(OutData%twrDef(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%twrDef.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - OutData%c_obj%twrDef_Len = SIZE(OutData%twrDef) - IF (OutData%c_obj%twrDef_Len > 0) & - OutData%c_obj%twrDef = C_LOC( OutData%twrDef( i1_l ) ) - DO i1 = LBOUND(OutData%twrDef,1), UBOUND(OutData%twrDef,1) - OutData%twrDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldDef not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%bldDef)) DEALLOCATE(OutData%bldDef) - ALLOCATE(OutData%bldDef(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldDef.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - OutData%c_obj%bldDef_Len = SIZE(OutData%bldDef) - IF (OutData%c_obj%bldDef_Len > 0) & - OutData%c_obj%bldDef = C_LOC( OutData%bldDef( i1_l ) ) - DO i1 = LBOUND(OutData%bldDef,1), UBOUND(OutData%bldDef,1) - OutData%bldDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! hubDef not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nBlades not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%hubDef)) DEALLOCATE(OutData%hubDef) - ALLOCATE(OutData%hubDef(i1_l:i1_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%nBlades)) DEALLOCATE(OutData%nBlades) + ALLOCATE(OutData%nBlades(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%hubDef.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nBlades.', ErrStat, ErrMsg,RoutineName) RETURN END IF - OutData%c_obj%hubDef_Len = SIZE(OutData%hubDef) - IF (OutData%c_obj%hubDef_Len > 0) & - OutData%c_obj%hubDef = C_LOC( OutData%hubDef( i1_l ) ) - DO i1 = LBOUND(OutData%hubDef,1), UBOUND(OutData%hubDef,1) - OutData%hubDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 + OutData%c_obj%nBlades_Len = SIZE(OutData%nBlades) + IF (OutData%c_obj%nBlades_Len > 0) & + OutData%c_obj%nBlades = C_LOC( OutData%nBlades( i1_l ) ) + DO i1 = LBOUND(OutData%nBlades,1), UBOUND(OutData%nBlades,1) + OutData%nBlades(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nacDef not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nBladeNodes not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%nacDef)) DEALLOCATE(OutData%nacDef) - ALLOCATE(OutData%nacDef(i1_l:i1_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%nBladeNodes)) DEALLOCATE(OutData%nBladeNodes) + ALLOCATE(OutData%nBladeNodes(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nacDef.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nBladeNodes.', ErrStat, ErrMsg,RoutineName) RETURN END IF - OutData%c_obj%nacDef_Len = SIZE(OutData%nacDef) - IF (OutData%c_obj%nacDef_Len > 0) & - OutData%c_obj%nacDef = C_LOC( OutData%nacDef( i1_l ) ) - DO i1 = LBOUND(OutData%nacDef,1), UBOUND(OutData%nacDef,1) - OutData%nacDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 + OutData%c_obj%nBladeNodes_Len = SIZE(OutData%nBladeNodes) + IF (OutData%c_obj%nBladeNodes_Len > 0) & + OutData%c_obj%nBladeNodes = C_LOC( OutData%nBladeNodes( i1_l ) ) + DO i1 = LBOUND(OutData%nBladeNodes,1), UBOUND(OutData%nBladeNodes,1) + OutData%nBladeNodes(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldRootDef not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nTowerNodes not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%bldRootDef)) DEALLOCATE(OutData%bldRootDef) - ALLOCATE(OutData%bldRootDef(i1_l:i1_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%nTowerNodes)) DEALLOCATE(OutData%nTowerNodes) + ALLOCATE(OutData%nTowerNodes(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldRootDef.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nTowerNodes.', ErrStat, ErrMsg,RoutineName) RETURN END IF - OutData%c_obj%bldRootDef_Len = SIZE(OutData%bldRootDef) - IF (OutData%c_obj%bldRootDef_Len > 0) & - OutData%c_obj%bldRootDef = C_LOC( OutData%bldRootDef( i1_l ) ) - DO i1 = LBOUND(OutData%bldRootDef,1), UBOUND(OutData%bldRootDef,1) - OutData%bldRootDef(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 + OutData%c_obj%nTowerNodes_Len = SIZE(OutData%nTowerNodes) + IF (OutData%c_obj%nTowerNodes_Len > 0) & + OutData%c_obj%nTowerNodes = C_LOC( OutData%nTowerNodes( i1_l ) ) + DO i1 = LBOUND(OutData%nTowerNodes,1), UBOUND(OutData%nTowerNodes,1) + OutData%nTowerNodes(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 END DO END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! twrRefPos not allocated @@ -1147,130 +1534,67 @@ SUBROUTINE ExtLdDX_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! hubRefPos not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%hubRefPos)) DEALLOCATE(OutData%hubRefPos) - ALLOCATE(OutData%hubRefPos(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%hubRefPos.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - OutData%c_obj%hubRefPos_Len = SIZE(OutData%hubRefPos) - IF (OutData%c_obj%hubRefPos_Len > 0) & - OutData%c_obj%hubRefPos = C_LOC( OutData%hubRefPos( i1_l ) ) - DO i1 = LBOUND(OutData%hubRefPos,1), UBOUND(OutData%hubRefPos,1) - OutData%hubRefPos(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nacRefPos not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%nacRefPos)) DEALLOCATE(OutData%nacRefPos) - ALLOCATE(OutData%nacRefPos(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nacRefPos.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - OutData%c_obj%nacRefPos_Len = SIZE(OutData%nacRefPos) - IF (OutData%c_obj%nacRefPos_Len > 0) & - OutData%c_obj%nacRefPos = C_LOC( OutData%nacRefPos( i1_l ) ) - DO i1 = LBOUND(OutData%nacRefPos,1), UBOUND(OutData%nacRefPos,1) - OutData%nacRefPos(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldRootRefPos not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%bldRootRefPos)) DEALLOCATE(OutData%bldRootRefPos) - ALLOCATE(OutData%bldRootRefPos(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldRootRefPos.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - OutData%c_obj%bldRootRefPos_Len = SIZE(OutData%bldRootRefPos) - IF (OutData%c_obj%bldRootRefPos_Len > 0) & - OutData%c_obj%bldRootRefPos = C_LOC( OutData%bldRootRefPos( i1_l ) ) - DO i1 = LBOUND(OutData%bldRootRefPos,1), UBOUND(OutData%bldRootRefPos,1) - OutData%bldRootRefPos(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nBlades not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! hubRefPos not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%nBlades)) DEALLOCATE(OutData%nBlades) - ALLOCATE(OutData%nBlades(i1_l:i1_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%hubRefPos)) DEALLOCATE(OutData%hubRefPos) + ALLOCATE(OutData%hubRefPos(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nBlades.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%hubRefPos.', ErrStat, ErrMsg,RoutineName) RETURN END IF - OutData%c_obj%nBlades_Len = SIZE(OutData%nBlades) - IF (OutData%c_obj%nBlades_Len > 0) & - OutData%c_obj%nBlades = C_LOC( OutData%nBlades( i1_l ) ) - DO i1 = LBOUND(OutData%nBlades,1), UBOUND(OutData%nBlades,1) - OutData%nBlades(i1) = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 + OutData%c_obj%hubRefPos_Len = SIZE(OutData%hubRefPos) + IF (OutData%c_obj%hubRefPos_Len > 0) & + OutData%c_obj%hubRefPos = C_LOC( OutData%hubRefPos( i1_l ) ) + DO i1 = LBOUND(OutData%hubRefPos,1), UBOUND(OutData%hubRefPos,1) + OutData%hubRefPos(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) + Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nBladeNodes not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nacRefPos not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%nBladeNodes)) DEALLOCATE(OutData%nBladeNodes) - ALLOCATE(OutData%nBladeNodes(i1_l:i1_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%nacRefPos)) DEALLOCATE(OutData%nacRefPos) + ALLOCATE(OutData%nacRefPos(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nBladeNodes.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nacRefPos.', ErrStat, ErrMsg,RoutineName) RETURN END IF - OutData%c_obj%nBladeNodes_Len = SIZE(OutData%nBladeNodes) - IF (OutData%c_obj%nBladeNodes_Len > 0) & - OutData%c_obj%nBladeNodes = C_LOC( OutData%nBladeNodes( i1_l ) ) - DO i1 = LBOUND(OutData%nBladeNodes,1), UBOUND(OutData%nBladeNodes,1) - OutData%nBladeNodes(i1) = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 + OutData%c_obj%nacRefPos_Len = SIZE(OutData%nacRefPos) + IF (OutData%c_obj%nacRefPos_Len > 0) & + OutData%c_obj%nacRefPos = C_LOC( OutData%nacRefPos( i1_l ) ) + DO i1 = LBOUND(OutData%nacRefPos,1), UBOUND(OutData%nacRefPos,1) + OutData%nacRefPos(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) + Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! nTowerNodes not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldRootRefPos not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%nTowerNodes)) DEALLOCATE(OutData%nTowerNodes) - ALLOCATE(OutData%nTowerNodes(i1_l:i1_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%bldRootRefPos)) DEALLOCATE(OutData%bldRootRefPos) + ALLOCATE(OutData%bldRootRefPos(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%nTowerNodes.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldRootRefPos.', ErrStat, ErrMsg,RoutineName) RETURN END IF - OutData%c_obj%nTowerNodes_Len = SIZE(OutData%nTowerNodes) - IF (OutData%c_obj%nTowerNodes_Len > 0) & - OutData%c_obj%nTowerNodes = C_LOC( OutData%nTowerNodes( i1_l ) ) - DO i1 = LBOUND(OutData%nTowerNodes,1), UBOUND(OutData%nTowerNodes,1) - OutData%nTowerNodes(i1) = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 + OutData%c_obj%bldRootRefPos_Len = SIZE(OutData%bldRootRefPos) + IF (OutData%c_obj%bldRootRefPos_Len > 0) & + OutData%c_obj%bldRootRefPos = C_LOC( OutData%bldRootRefPos( i1_l ) ) + DO i1 = LBOUND(OutData%bldRootRefPos,1), UBOUND(OutData%bldRootRefPos,1) + OutData%bldRootRefPos(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) + Db_Xferred = Db_Xferred + 1 END DO END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldChord not allocated @@ -1357,31 +1681,10 @@ SUBROUTINE ExtLdDX_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Db_Xferred = Db_Xferred + 1 END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! bldPitch not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%bldPitch)) DEALLOCATE(OutData%bldPitch) - ALLOCATE(OutData%bldPitch(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%bldPitch.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - OutData%c_obj%bldPitch_Len = SIZE(OutData%bldPitch) - IF (OutData%c_obj%bldPitch_Len > 0) & - OutData%c_obj%bldPitch = C_LOC( OutData%bldPitch( i1_l ) ) - DO i1 = LBOUND(OutData%bldPitch,1), UBOUND(OutData%bldPitch,1) - OutData%bldPitch(i1) = REAL(DbKiBuf(Db_Xferred), C_DOUBLE) - Db_Xferred = Db_Xferred + 1 - END DO - END IF - END SUBROUTINE ExtLdDX_UnPackInput + END SUBROUTINE ExtLdDX_UnPackParam - SUBROUTINE ExtLdDX_C2Fary_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers ) - TYPE(ExtLdDX_InputType), INTENT(INOUT) :: InputData + SUBROUTINE ExtLdDX_C2Fary_CopyParam( ParamData, ErrStat, ErrMsg, SkipPointers ) + TYPE(ExtLdDX_ParameterType), INTENT(INOUT) :: ParamData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL,INTENT(IN ) :: SkipPointers @@ -1396,171 +1699,117 @@ SUBROUTINE ExtLdDX_C2Fary_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers ) SkipPointers_local = .false. END IF - ! -- twrDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%twrDef ) ) THEN - NULLIFY( InputData%twrDef ) - ELSE - CALL C_F_POINTER(InputData%C_obj%twrDef, InputData%twrDef, (/InputData%C_obj%twrDef_Len/)) - END IF - END IF - - ! -- bldDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldDef ) ) THEN - NULLIFY( InputData%bldDef ) - ELSE - CALL C_F_POINTER(InputData%C_obj%bldDef, InputData%bldDef, (/InputData%C_obj%bldDef_Len/)) - END IF - END IF - - ! -- hubDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%hubDef ) ) THEN - NULLIFY( InputData%hubDef ) - ELSE - CALL C_F_POINTER(InputData%C_obj%hubDef, InputData%hubDef, (/InputData%C_obj%hubDef_Len/)) - END IF - END IF - - ! -- nacDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%nacDef ) ) THEN - NULLIFY( InputData%nacDef ) - ELSE - CALL C_F_POINTER(InputData%C_obj%nacDef, InputData%nacDef, (/InputData%C_obj%nacDef_Len/)) - END IF - END IF - - ! -- bldRootDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldRootDef ) ) THEN - NULLIFY( InputData%bldRootDef ) - ELSE - CALL C_F_POINTER(InputData%C_obj%bldRootDef, InputData%bldRootDef, (/InputData%C_obj%bldRootDef_Len/)) - END IF - END IF - - ! -- twrRefPos Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%twrRefPos ) ) THEN - NULLIFY( InputData%twrRefPos ) - ELSE - CALL C_F_POINTER(InputData%C_obj%twrRefPos, InputData%twrRefPos, (/InputData%C_obj%twrRefPos_Len/)) - END IF - END IF - - ! -- bldRefPos Input Data fields + ! -- nBlades Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldRefPos ) ) THEN - NULLIFY( InputData%bldRefPos ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%nBlades ) ) THEN + NULLIFY( ParamData%nBlades ) ELSE - CALL C_F_POINTER(InputData%C_obj%bldRefPos, InputData%bldRefPos, (/InputData%C_obj%bldRefPos_Len/)) + CALL C_F_POINTER(ParamData%C_obj%nBlades, ParamData%nBlades, (/ParamData%C_obj%nBlades_Len/)) END IF END IF - ! -- hubRefPos Input Data fields + ! -- nBladeNodes Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%hubRefPos ) ) THEN - NULLIFY( InputData%hubRefPos ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%nBladeNodes ) ) THEN + NULLIFY( ParamData%nBladeNodes ) ELSE - CALL C_F_POINTER(InputData%C_obj%hubRefPos, InputData%hubRefPos, (/InputData%C_obj%hubRefPos_Len/)) + CALL C_F_POINTER(ParamData%C_obj%nBladeNodes, ParamData%nBladeNodes, (/ParamData%C_obj%nBladeNodes_Len/)) END IF END IF - ! -- nacRefPos Input Data fields + ! -- nTowerNodes Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%nacRefPos ) ) THEN - NULLIFY( InputData%nacRefPos ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%nTowerNodes ) ) THEN + NULLIFY( ParamData%nTowerNodes ) ELSE - CALL C_F_POINTER(InputData%C_obj%nacRefPos, InputData%nacRefPos, (/InputData%C_obj%nacRefPos_Len/)) + CALL C_F_POINTER(ParamData%C_obj%nTowerNodes, ParamData%nTowerNodes, (/ParamData%C_obj%nTowerNodes_Len/)) END IF END IF - ! -- bldRootRefPos Input Data fields + ! -- twrRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldRootRefPos ) ) THEN - NULLIFY( InputData%bldRootRefPos ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%twrRefPos ) ) THEN + NULLIFY( ParamData%twrRefPos ) ELSE - CALL C_F_POINTER(InputData%C_obj%bldRootRefPos, InputData%bldRootRefPos, (/InputData%C_obj%bldRootRefPos_Len/)) + CALL C_F_POINTER(ParamData%C_obj%twrRefPos, ParamData%twrRefPos, (/ParamData%C_obj%twrRefPos_Len/)) END IF END IF - ! -- nBlades Input Data fields + ! -- bldRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%nBlades ) ) THEN - NULLIFY( InputData%nBlades ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%bldRefPos ) ) THEN + NULLIFY( ParamData%bldRefPos ) ELSE - CALL C_F_POINTER(InputData%C_obj%nBlades, InputData%nBlades, (/InputData%C_obj%nBlades_Len/)) + CALL C_F_POINTER(ParamData%C_obj%bldRefPos, ParamData%bldRefPos, (/ParamData%C_obj%bldRefPos_Len/)) END IF END IF - ! -- nBladeNodes Input Data fields + ! -- hubRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%nBladeNodes ) ) THEN - NULLIFY( InputData%nBladeNodes ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%hubRefPos ) ) THEN + NULLIFY( ParamData%hubRefPos ) ELSE - CALL C_F_POINTER(InputData%C_obj%nBladeNodes, InputData%nBladeNodes, (/InputData%C_obj%nBladeNodes_Len/)) + CALL C_F_POINTER(ParamData%C_obj%hubRefPos, ParamData%hubRefPos, (/ParamData%C_obj%hubRefPos_Len/)) END IF END IF - ! -- nTowerNodes Input Data fields + ! -- nacRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%nTowerNodes ) ) THEN - NULLIFY( InputData%nTowerNodes ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%nacRefPos ) ) THEN + NULLIFY( ParamData%nacRefPos ) ELSE - CALL C_F_POINTER(InputData%C_obj%nTowerNodes, InputData%nTowerNodes, (/InputData%C_obj%nTowerNodes_Len/)) + CALL C_F_POINTER(ParamData%C_obj%nacRefPos, ParamData%nacRefPos, (/ParamData%C_obj%nacRefPos_Len/)) END IF END IF - ! -- bldChord Input Data fields + ! -- bldRootRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldChord ) ) THEN - NULLIFY( InputData%bldChord ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%bldRootRefPos ) ) THEN + NULLIFY( ParamData%bldRootRefPos ) ELSE - CALL C_F_POINTER(InputData%C_obj%bldChord, InputData%bldChord, (/InputData%C_obj%bldChord_Len/)) + CALL C_F_POINTER(ParamData%C_obj%bldRootRefPos, ParamData%bldRootRefPos, (/ParamData%C_obj%bldRootRefPos_Len/)) END IF END IF - ! -- bldRloc Input Data fields + ! -- bldChord Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldRloc ) ) THEN - NULLIFY( InputData%bldRloc ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%bldChord ) ) THEN + NULLIFY( ParamData%bldChord ) ELSE - CALL C_F_POINTER(InputData%C_obj%bldRloc, InputData%bldRloc, (/InputData%C_obj%bldRloc_Len/)) + CALL C_F_POINTER(ParamData%C_obj%bldChord, ParamData%bldChord, (/ParamData%C_obj%bldChord_Len/)) END IF END IF - ! -- twrDia Input Data fields + ! -- bldRloc Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%twrDia ) ) THEN - NULLIFY( InputData%twrDia ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%bldRloc ) ) THEN + NULLIFY( ParamData%bldRloc ) ELSE - CALL C_F_POINTER(InputData%C_obj%twrDia, InputData%twrDia, (/InputData%C_obj%twrDia_Len/)) + CALL C_F_POINTER(ParamData%C_obj%bldRloc, ParamData%bldRloc, (/ParamData%C_obj%bldRloc_Len/)) END IF END IF - ! -- twrHloc Input Data fields + ! -- twrDia Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%twrHloc ) ) THEN - NULLIFY( InputData%twrHloc ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%twrDia ) ) THEN + NULLIFY( ParamData%twrDia ) ELSE - CALL C_F_POINTER(InputData%C_obj%twrHloc, InputData%twrHloc, (/InputData%C_obj%twrHloc_Len/)) + CALL C_F_POINTER(ParamData%C_obj%twrDia, ParamData%twrDia, (/ParamData%C_obj%twrDia_Len/)) END IF END IF - ! -- bldPitch Input Data fields + ! -- twrHloc Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. C_ASSOCIATED( InputData%C_obj%bldPitch ) ) THEN - NULLIFY( InputData%bldPitch ) + IF ( .NOT. C_ASSOCIATED( ParamData%C_obj%twrHloc ) ) THEN + NULLIFY( ParamData%twrHloc ) ELSE - CALL C_F_POINTER(InputData%C_obj%bldPitch, InputData%bldPitch, (/InputData%C_obj%bldPitch_Len/)) + CALL C_F_POINTER(ParamData%C_obj%twrHloc, ParamData%twrHloc, (/ParamData%C_obj%twrHloc_Len/)) END IF END IF - END SUBROUTINE ExtLdDX_C2Fary_CopyInput + END SUBROUTINE ExtLdDX_C2Fary_CopyParam - SUBROUTINE ExtLdDX_F2C_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers ) - TYPE(ExtLdDX_InputType), INTENT(INOUT) :: InputData + SUBROUTINE ExtLdDX_F2C_CopyParam( ParamData, ErrStat, ErrMsg, SkipPointers ) + TYPE(ExtLdDX_ParameterType), INTENT(INOUT) :: ParamData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL,INTENT(IN ) :: SkipPointers @@ -1575,222 +1824,150 @@ SUBROUTINE ExtLdDX_F2C_CopyInput( InputData, ErrStat, ErrMsg, SkipPointers ) SkipPointers_local = .false. END IF - ! -- twrDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%twrDef)) THEN - InputData%c_obj%twrDef_Len = 0 - InputData%c_obj%twrDef = C_NULL_PTR - ELSE - InputData%c_obj%twrDef_Len = SIZE(InputData%twrDef) - IF (InputData%c_obj%twrDef_Len > 0) & - InputData%c_obj%twrDef = C_LOC( InputData%twrDef( LBOUND(InputData%twrDef,1) ) ) - END IF - END IF - - ! -- bldDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%bldDef)) THEN - InputData%c_obj%bldDef_Len = 0 - InputData%c_obj%bldDef = C_NULL_PTR - ELSE - InputData%c_obj%bldDef_Len = SIZE(InputData%bldDef) - IF (InputData%c_obj%bldDef_Len > 0) & - InputData%c_obj%bldDef = C_LOC( InputData%bldDef( LBOUND(InputData%bldDef,1) ) ) - END IF - END IF - - ! -- hubDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%hubDef)) THEN - InputData%c_obj%hubDef_Len = 0 - InputData%c_obj%hubDef = C_NULL_PTR - ELSE - InputData%c_obj%hubDef_Len = SIZE(InputData%hubDef) - IF (InputData%c_obj%hubDef_Len > 0) & - InputData%c_obj%hubDef = C_LOC( InputData%hubDef( LBOUND(InputData%hubDef,1) ) ) - END IF - END IF - - ! -- nacDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%nacDef)) THEN - InputData%c_obj%nacDef_Len = 0 - InputData%c_obj%nacDef = C_NULL_PTR - ELSE - InputData%c_obj%nacDef_Len = SIZE(InputData%nacDef) - IF (InputData%c_obj%nacDef_Len > 0) & - InputData%c_obj%nacDef = C_LOC( InputData%nacDef( LBOUND(InputData%nacDef,1) ) ) - END IF - END IF - - ! -- bldRootDef Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%bldRootDef)) THEN - InputData%c_obj%bldRootDef_Len = 0 - InputData%c_obj%bldRootDef = C_NULL_PTR - ELSE - InputData%c_obj%bldRootDef_Len = SIZE(InputData%bldRootDef) - IF (InputData%c_obj%bldRootDef_Len > 0) & - InputData%c_obj%bldRootDef = C_LOC( InputData%bldRootDef( LBOUND(InputData%bldRootDef,1) ) ) - END IF - END IF - - ! -- twrRefPos Input Data fields - IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%twrRefPos)) THEN - InputData%c_obj%twrRefPos_Len = 0 - InputData%c_obj%twrRefPos = C_NULL_PTR - ELSE - InputData%c_obj%twrRefPos_Len = SIZE(InputData%twrRefPos) - IF (InputData%c_obj%twrRefPos_Len > 0) & - InputData%c_obj%twrRefPos = C_LOC( InputData%twrRefPos( LBOUND(InputData%twrRefPos,1) ) ) - END IF - END IF - - ! -- bldRefPos Input Data fields + ! -- nBlades Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%bldRefPos)) THEN - InputData%c_obj%bldRefPos_Len = 0 - InputData%c_obj%bldRefPos = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%nBlades)) THEN + ParamData%c_obj%nBlades_Len = 0 + ParamData%c_obj%nBlades = C_NULL_PTR ELSE - InputData%c_obj%bldRefPos_Len = SIZE(InputData%bldRefPos) - IF (InputData%c_obj%bldRefPos_Len > 0) & - InputData%c_obj%bldRefPos = C_LOC( InputData%bldRefPos( LBOUND(InputData%bldRefPos,1) ) ) + ParamData%c_obj%nBlades_Len = SIZE(ParamData%nBlades) + IF (ParamData%c_obj%nBlades_Len > 0) & + ParamData%c_obj%nBlades = C_LOC( ParamData%nBlades( LBOUND(ParamData%nBlades,1) ) ) END IF END IF - ! -- hubRefPos Input Data fields + ! -- nBladeNodes Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%hubRefPos)) THEN - InputData%c_obj%hubRefPos_Len = 0 - InputData%c_obj%hubRefPos = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%nBladeNodes)) THEN + ParamData%c_obj%nBladeNodes_Len = 0 + ParamData%c_obj%nBladeNodes = C_NULL_PTR ELSE - InputData%c_obj%hubRefPos_Len = SIZE(InputData%hubRefPos) - IF (InputData%c_obj%hubRefPos_Len > 0) & - InputData%c_obj%hubRefPos = C_LOC( InputData%hubRefPos( LBOUND(InputData%hubRefPos,1) ) ) + ParamData%c_obj%nBladeNodes_Len = SIZE(ParamData%nBladeNodes) + IF (ParamData%c_obj%nBladeNodes_Len > 0) & + ParamData%c_obj%nBladeNodes = C_LOC( ParamData%nBladeNodes( LBOUND(ParamData%nBladeNodes,1) ) ) END IF END IF - ! -- nacRefPos Input Data fields + ! -- nTowerNodes Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%nacRefPos)) THEN - InputData%c_obj%nacRefPos_Len = 0 - InputData%c_obj%nacRefPos = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%nTowerNodes)) THEN + ParamData%c_obj%nTowerNodes_Len = 0 + ParamData%c_obj%nTowerNodes = C_NULL_PTR ELSE - InputData%c_obj%nacRefPos_Len = SIZE(InputData%nacRefPos) - IF (InputData%c_obj%nacRefPos_Len > 0) & - InputData%c_obj%nacRefPos = C_LOC( InputData%nacRefPos( LBOUND(InputData%nacRefPos,1) ) ) + ParamData%c_obj%nTowerNodes_Len = SIZE(ParamData%nTowerNodes) + IF (ParamData%c_obj%nTowerNodes_Len > 0) & + ParamData%c_obj%nTowerNodes = C_LOC( ParamData%nTowerNodes( LBOUND(ParamData%nTowerNodes,1) ) ) END IF END IF - ! -- bldRootRefPos Input Data fields + ! -- twrRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%bldRootRefPos)) THEN - InputData%c_obj%bldRootRefPos_Len = 0 - InputData%c_obj%bldRootRefPos = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%twrRefPos)) THEN + ParamData%c_obj%twrRefPos_Len = 0 + ParamData%c_obj%twrRefPos = C_NULL_PTR ELSE - InputData%c_obj%bldRootRefPos_Len = SIZE(InputData%bldRootRefPos) - IF (InputData%c_obj%bldRootRefPos_Len > 0) & - InputData%c_obj%bldRootRefPos = C_LOC( InputData%bldRootRefPos( LBOUND(InputData%bldRootRefPos,1) ) ) + ParamData%c_obj%twrRefPos_Len = SIZE(ParamData%twrRefPos) + IF (ParamData%c_obj%twrRefPos_Len > 0) & + ParamData%c_obj%twrRefPos = C_LOC( ParamData%twrRefPos( LBOUND(ParamData%twrRefPos,1) ) ) END IF END IF - ! -- nBlades Input Data fields + ! -- bldRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%nBlades)) THEN - InputData%c_obj%nBlades_Len = 0 - InputData%c_obj%nBlades = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%bldRefPos)) THEN + ParamData%c_obj%bldRefPos_Len = 0 + ParamData%c_obj%bldRefPos = C_NULL_PTR ELSE - InputData%c_obj%nBlades_Len = SIZE(InputData%nBlades) - IF (InputData%c_obj%nBlades_Len > 0) & - InputData%c_obj%nBlades = C_LOC( InputData%nBlades( LBOUND(InputData%nBlades,1) ) ) + ParamData%c_obj%bldRefPos_Len = SIZE(ParamData%bldRefPos) + IF (ParamData%c_obj%bldRefPos_Len > 0) & + ParamData%c_obj%bldRefPos = C_LOC( ParamData%bldRefPos( LBOUND(ParamData%bldRefPos,1) ) ) END IF END IF - ! -- nBladeNodes Input Data fields + ! -- hubRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%nBladeNodes)) THEN - InputData%c_obj%nBladeNodes_Len = 0 - InputData%c_obj%nBladeNodes = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%hubRefPos)) THEN + ParamData%c_obj%hubRefPos_Len = 0 + ParamData%c_obj%hubRefPos = C_NULL_PTR ELSE - InputData%c_obj%nBladeNodes_Len = SIZE(InputData%nBladeNodes) - IF (InputData%c_obj%nBladeNodes_Len > 0) & - InputData%c_obj%nBladeNodes = C_LOC( InputData%nBladeNodes( LBOUND(InputData%nBladeNodes,1) ) ) + ParamData%c_obj%hubRefPos_Len = SIZE(ParamData%hubRefPos) + IF (ParamData%c_obj%hubRefPos_Len > 0) & + ParamData%c_obj%hubRefPos = C_LOC( ParamData%hubRefPos( LBOUND(ParamData%hubRefPos,1) ) ) END IF END IF - ! -- nTowerNodes Input Data fields + ! -- nacRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%nTowerNodes)) THEN - InputData%c_obj%nTowerNodes_Len = 0 - InputData%c_obj%nTowerNodes = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%nacRefPos)) THEN + ParamData%c_obj%nacRefPos_Len = 0 + ParamData%c_obj%nacRefPos = C_NULL_PTR ELSE - InputData%c_obj%nTowerNodes_Len = SIZE(InputData%nTowerNodes) - IF (InputData%c_obj%nTowerNodes_Len > 0) & - InputData%c_obj%nTowerNodes = C_LOC( InputData%nTowerNodes( LBOUND(InputData%nTowerNodes,1) ) ) + ParamData%c_obj%nacRefPos_Len = SIZE(ParamData%nacRefPos) + IF (ParamData%c_obj%nacRefPos_Len > 0) & + ParamData%c_obj%nacRefPos = C_LOC( ParamData%nacRefPos( LBOUND(ParamData%nacRefPos,1) ) ) END IF END IF - ! -- bldChord Input Data fields + ! -- bldRootRefPos Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%bldChord)) THEN - InputData%c_obj%bldChord_Len = 0 - InputData%c_obj%bldChord = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%bldRootRefPos)) THEN + ParamData%c_obj%bldRootRefPos_Len = 0 + ParamData%c_obj%bldRootRefPos = C_NULL_PTR ELSE - InputData%c_obj%bldChord_Len = SIZE(InputData%bldChord) - IF (InputData%c_obj%bldChord_Len > 0) & - InputData%c_obj%bldChord = C_LOC( InputData%bldChord( LBOUND(InputData%bldChord,1) ) ) + ParamData%c_obj%bldRootRefPos_Len = SIZE(ParamData%bldRootRefPos) + IF (ParamData%c_obj%bldRootRefPos_Len > 0) & + ParamData%c_obj%bldRootRefPos = C_LOC( ParamData%bldRootRefPos( LBOUND(ParamData%bldRootRefPos,1) ) ) END IF END IF - ! -- bldRloc Input Data fields + ! -- bldChord Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%bldRloc)) THEN - InputData%c_obj%bldRloc_Len = 0 - InputData%c_obj%bldRloc = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%bldChord)) THEN + ParamData%c_obj%bldChord_Len = 0 + ParamData%c_obj%bldChord = C_NULL_PTR ELSE - InputData%c_obj%bldRloc_Len = SIZE(InputData%bldRloc) - IF (InputData%c_obj%bldRloc_Len > 0) & - InputData%c_obj%bldRloc = C_LOC( InputData%bldRloc( LBOUND(InputData%bldRloc,1) ) ) + ParamData%c_obj%bldChord_Len = SIZE(ParamData%bldChord) + IF (ParamData%c_obj%bldChord_Len > 0) & + ParamData%c_obj%bldChord = C_LOC( ParamData%bldChord( LBOUND(ParamData%bldChord,1) ) ) END IF END IF - ! -- twrDia Input Data fields + ! -- bldRloc Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%twrDia)) THEN - InputData%c_obj%twrDia_Len = 0 - InputData%c_obj%twrDia = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%bldRloc)) THEN + ParamData%c_obj%bldRloc_Len = 0 + ParamData%c_obj%bldRloc = C_NULL_PTR ELSE - InputData%c_obj%twrDia_Len = SIZE(InputData%twrDia) - IF (InputData%c_obj%twrDia_Len > 0) & - InputData%c_obj%twrDia = C_LOC( InputData%twrDia( LBOUND(InputData%twrDia,1) ) ) + ParamData%c_obj%bldRloc_Len = SIZE(ParamData%bldRloc) + IF (ParamData%c_obj%bldRloc_Len > 0) & + ParamData%c_obj%bldRloc = C_LOC( ParamData%bldRloc( LBOUND(ParamData%bldRloc,1) ) ) END IF END IF - ! -- twrHloc Input Data fields + ! -- twrDia Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%twrHloc)) THEN - InputData%c_obj%twrHloc_Len = 0 - InputData%c_obj%twrHloc = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%twrDia)) THEN + ParamData%c_obj%twrDia_Len = 0 + ParamData%c_obj%twrDia = C_NULL_PTR ELSE - InputData%c_obj%twrHloc_Len = SIZE(InputData%twrHloc) - IF (InputData%c_obj%twrHloc_Len > 0) & - InputData%c_obj%twrHloc = C_LOC( InputData%twrHloc( LBOUND(InputData%twrHloc,1) ) ) + ParamData%c_obj%twrDia_Len = SIZE(ParamData%twrDia) + IF (ParamData%c_obj%twrDia_Len > 0) & + ParamData%c_obj%twrDia = C_LOC( ParamData%twrDia( LBOUND(ParamData%twrDia,1) ) ) END IF END IF - ! -- bldPitch Input Data fields + ! -- twrHloc Param Data fields IF ( .NOT. SkipPointers_local ) THEN - IF ( .NOT. ASSOCIATED(InputData%bldPitch)) THEN - InputData%c_obj%bldPitch_Len = 0 - InputData%c_obj%bldPitch = C_NULL_PTR + IF ( .NOT. ASSOCIATED(ParamData%twrHloc)) THEN + ParamData%c_obj%twrHloc_Len = 0 + ParamData%c_obj%twrHloc = C_NULL_PTR ELSE - InputData%c_obj%bldPitch_Len = SIZE(InputData%bldPitch) - IF (InputData%c_obj%bldPitch_Len > 0) & - InputData%c_obj%bldPitch = C_LOC( InputData%bldPitch( LBOUND(InputData%bldPitch,1) ) ) + ParamData%c_obj%twrHloc_Len = SIZE(ParamData%twrHloc) + IF (ParamData%c_obj%twrHloc_Len > 0) & + ParamData%c_obj%twrHloc = C_LOC( ParamData%twrHloc( LBOUND(ParamData%twrHloc,1) ) ) END IF END IF - END SUBROUTINE ExtLdDX_F2C_CopyInput + END SUBROUTINE ExtLdDX_F2C_CopyParam SUBROUTINE ExtLdDX_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) TYPE(ExtLdDX_OutputType), INTENT(IN) :: SrcOutputData @@ -2254,66 +2431,6 @@ SUBROUTINE ExtLdDX_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, Err u_out%bldRootDef(i1) = u1%bldRootDef(i1) + b * ScaleFactor END DO END IF ! check if allocated -IF (ASSOCIATED(u_out%twrRefPos) .AND. ASSOCIATED(u1%twrRefPos)) THEN - DO i1 = LBOUND(u_out%twrRefPos,1),UBOUND(u_out%twrRefPos,1) - b = -(u1%twrRefPos(i1) - u2%twrRefPos(i1)) - u_out%twrRefPos(i1) = u1%twrRefPos(i1) + b * ScaleFactor - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%bldRefPos) .AND. ASSOCIATED(u1%bldRefPos)) THEN - DO i1 = LBOUND(u_out%bldRefPos,1),UBOUND(u_out%bldRefPos,1) - b = -(u1%bldRefPos(i1) - u2%bldRefPos(i1)) - u_out%bldRefPos(i1) = u1%bldRefPos(i1) + b * ScaleFactor - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%hubRefPos) .AND. ASSOCIATED(u1%hubRefPos)) THEN - DO i1 = LBOUND(u_out%hubRefPos,1),UBOUND(u_out%hubRefPos,1) - b = -(u1%hubRefPos(i1) - u2%hubRefPos(i1)) - u_out%hubRefPos(i1) = u1%hubRefPos(i1) + b * ScaleFactor - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%nacRefPos) .AND. ASSOCIATED(u1%nacRefPos)) THEN - DO i1 = LBOUND(u_out%nacRefPos,1),UBOUND(u_out%nacRefPos,1) - b = -(u1%nacRefPos(i1) - u2%nacRefPos(i1)) - u_out%nacRefPos(i1) = u1%nacRefPos(i1) + b * ScaleFactor - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%bldRootRefPos) .AND. ASSOCIATED(u1%bldRootRefPos)) THEN - DO i1 = LBOUND(u_out%bldRootRefPos,1),UBOUND(u_out%bldRootRefPos,1) - b = -(u1%bldRootRefPos(i1) - u2%bldRootRefPos(i1)) - u_out%bldRootRefPos(i1) = u1%bldRootRefPos(i1) + b * ScaleFactor - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%nBlades) .AND. ASSOCIATED(u1%nBlades)) THEN -END IF ! check if allocated -IF (ASSOCIATED(u_out%nBladeNodes) .AND. ASSOCIATED(u1%nBladeNodes)) THEN -END IF ! check if allocated -IF (ASSOCIATED(u_out%nTowerNodes) .AND. ASSOCIATED(u1%nTowerNodes)) THEN -END IF ! check if allocated -IF (ASSOCIATED(u_out%bldChord) .AND. ASSOCIATED(u1%bldChord)) THEN - DO i1 = LBOUND(u_out%bldChord,1),UBOUND(u_out%bldChord,1) - b = -(u1%bldChord(i1) - u2%bldChord(i1)) - u_out%bldChord(i1) = u1%bldChord(i1) + b * ScaleFactor - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%bldRloc) .AND. ASSOCIATED(u1%bldRloc)) THEN - DO i1 = LBOUND(u_out%bldRloc,1),UBOUND(u_out%bldRloc,1) - b = -(u1%bldRloc(i1) - u2%bldRloc(i1)) - u_out%bldRloc(i1) = u1%bldRloc(i1) + b * ScaleFactor - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%twrDia) .AND. ASSOCIATED(u1%twrDia)) THEN - DO i1 = LBOUND(u_out%twrDia,1),UBOUND(u_out%twrDia,1) - b = -(u1%twrDia(i1) - u2%twrDia(i1)) - u_out%twrDia(i1) = u1%twrDia(i1) + b * ScaleFactor - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%twrHloc) .AND. ASSOCIATED(u1%twrHloc)) THEN - DO i1 = LBOUND(u_out%twrHloc,1),UBOUND(u_out%twrHloc,1) - b = -(u1%twrHloc(i1) - u2%twrHloc(i1)) - u_out%twrHloc(i1) = u1%twrHloc(i1) + b * ScaleFactor - END DO -END IF ! check if allocated IF (ASSOCIATED(u_out%bldPitch) .AND. ASSOCIATED(u1%bldPitch)) THEN DO i1 = LBOUND(u_out%bldPitch,1),UBOUND(u_out%bldPitch,1) b = -(u1%bldPitch(i1) - u2%bldPitch(i1)) @@ -2412,75 +2529,6 @@ SUBROUTINE ExtLdDX_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, u_out%bldRootDef(i1) = u1%bldRootDef(i1) + b + c * t_out END DO END IF ! check if allocated -IF (ASSOCIATED(u_out%twrRefPos) .AND. ASSOCIATED(u1%twrRefPos)) THEN - DO i1 = LBOUND(u_out%twrRefPos,1),UBOUND(u_out%twrRefPos,1) - b = (t(3)**2*(u1%twrRefPos(i1) - u2%twrRefPos(i1)) + t(2)**2*(-u1%twrRefPos(i1) + u3%twrRefPos(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%twrRefPos(i1) + t(3)*u2%twrRefPos(i1) - t(2)*u3%twrRefPos(i1) ) * scaleFactor - u_out%twrRefPos(i1) = u1%twrRefPos(i1) + b + c * t_out - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%bldRefPos) .AND. ASSOCIATED(u1%bldRefPos)) THEN - DO i1 = LBOUND(u_out%bldRefPos,1),UBOUND(u_out%bldRefPos,1) - b = (t(3)**2*(u1%bldRefPos(i1) - u2%bldRefPos(i1)) + t(2)**2*(-u1%bldRefPos(i1) + u3%bldRefPos(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%bldRefPos(i1) + t(3)*u2%bldRefPos(i1) - t(2)*u3%bldRefPos(i1) ) * scaleFactor - u_out%bldRefPos(i1) = u1%bldRefPos(i1) + b + c * t_out - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%hubRefPos) .AND. ASSOCIATED(u1%hubRefPos)) THEN - DO i1 = LBOUND(u_out%hubRefPos,1),UBOUND(u_out%hubRefPos,1) - b = (t(3)**2*(u1%hubRefPos(i1) - u2%hubRefPos(i1)) + t(2)**2*(-u1%hubRefPos(i1) + u3%hubRefPos(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%hubRefPos(i1) + t(3)*u2%hubRefPos(i1) - t(2)*u3%hubRefPos(i1) ) * scaleFactor - u_out%hubRefPos(i1) = u1%hubRefPos(i1) + b + c * t_out - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%nacRefPos) .AND. ASSOCIATED(u1%nacRefPos)) THEN - DO i1 = LBOUND(u_out%nacRefPos,1),UBOUND(u_out%nacRefPos,1) - b = (t(3)**2*(u1%nacRefPos(i1) - u2%nacRefPos(i1)) + t(2)**2*(-u1%nacRefPos(i1) + u3%nacRefPos(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%nacRefPos(i1) + t(3)*u2%nacRefPos(i1) - t(2)*u3%nacRefPos(i1) ) * scaleFactor - u_out%nacRefPos(i1) = u1%nacRefPos(i1) + b + c * t_out - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%bldRootRefPos) .AND. ASSOCIATED(u1%bldRootRefPos)) THEN - DO i1 = LBOUND(u_out%bldRootRefPos,1),UBOUND(u_out%bldRootRefPos,1) - b = (t(3)**2*(u1%bldRootRefPos(i1) - u2%bldRootRefPos(i1)) + t(2)**2*(-u1%bldRootRefPos(i1) + u3%bldRootRefPos(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%bldRootRefPos(i1) + t(3)*u2%bldRootRefPos(i1) - t(2)*u3%bldRootRefPos(i1) ) * scaleFactor - u_out%bldRootRefPos(i1) = u1%bldRootRefPos(i1) + b + c * t_out - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%nBlades) .AND. ASSOCIATED(u1%nBlades)) THEN -END IF ! check if allocated -IF (ASSOCIATED(u_out%nBladeNodes) .AND. ASSOCIATED(u1%nBladeNodes)) THEN -END IF ! check if allocated -IF (ASSOCIATED(u_out%nTowerNodes) .AND. ASSOCIATED(u1%nTowerNodes)) THEN -END IF ! check if allocated -IF (ASSOCIATED(u_out%bldChord) .AND. ASSOCIATED(u1%bldChord)) THEN - DO i1 = LBOUND(u_out%bldChord,1),UBOUND(u_out%bldChord,1) - b = (t(3)**2*(u1%bldChord(i1) - u2%bldChord(i1)) + t(2)**2*(-u1%bldChord(i1) + u3%bldChord(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%bldChord(i1) + t(3)*u2%bldChord(i1) - t(2)*u3%bldChord(i1) ) * scaleFactor - u_out%bldChord(i1) = u1%bldChord(i1) + b + c * t_out - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%bldRloc) .AND. ASSOCIATED(u1%bldRloc)) THEN - DO i1 = LBOUND(u_out%bldRloc,1),UBOUND(u_out%bldRloc,1) - b = (t(3)**2*(u1%bldRloc(i1) - u2%bldRloc(i1)) + t(2)**2*(-u1%bldRloc(i1) + u3%bldRloc(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%bldRloc(i1) + t(3)*u2%bldRloc(i1) - t(2)*u3%bldRloc(i1) ) * scaleFactor - u_out%bldRloc(i1) = u1%bldRloc(i1) + b + c * t_out - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%twrDia) .AND. ASSOCIATED(u1%twrDia)) THEN - DO i1 = LBOUND(u_out%twrDia,1),UBOUND(u_out%twrDia,1) - b = (t(3)**2*(u1%twrDia(i1) - u2%twrDia(i1)) + t(2)**2*(-u1%twrDia(i1) + u3%twrDia(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%twrDia(i1) + t(3)*u2%twrDia(i1) - t(2)*u3%twrDia(i1) ) * scaleFactor - u_out%twrDia(i1) = u1%twrDia(i1) + b + c * t_out - END DO -END IF ! check if allocated -IF (ASSOCIATED(u_out%twrHloc) .AND. ASSOCIATED(u1%twrHloc)) THEN - DO i1 = LBOUND(u_out%twrHloc,1),UBOUND(u_out%twrHloc,1) - b = (t(3)**2*(u1%twrHloc(i1) - u2%twrHloc(i1)) + t(2)**2*(-u1%twrHloc(i1) + u3%twrHloc(i1)))* scaleFactor - c = ( (t(2)-t(3))*u1%twrHloc(i1) + t(3)*u2%twrHloc(i1) - t(2)*u3%twrHloc(i1) ) * scaleFactor - u_out%twrHloc(i1) = u1%twrHloc(i1) + b + c * t_out - END DO -END IF ! check if allocated IF (ASSOCIATED(u_out%bldPitch) .AND. ASSOCIATED(u1%bldPitch)) THEN DO i1 = LBOUND(u_out%bldPitch,1),UBOUND(u_out%bldPitch,1) b = (t(3)**2*(u1%bldPitch(i1) - u2%bldPitch(i1)) + t(2)**2*(-u1%bldPitch(i1) + u3%bldPitch(i1)))* scaleFactor diff --git a/modules/extloads/src/ExtLoadsDX_Types.h b/modules/extloads/src/ExtLoadsDX_Types.h index 23d47a3a35..da9ebc41b7 100644 --- a/modules/extloads/src/ExtLoadsDX_Types.h +++ b/modules/extloads/src/ExtLoadsDX_Types.h @@ -27,20 +27,23 @@ double * hubDef ; int hubDef_Len ; double * nacDef ; int nacDef_Len ; double * bldRootDef ; int bldRootDef_Len ; + double * bldPitch ; int bldPitch_Len ; + } ExtLdDX_InputType_t ; + typedef struct ExtLdDX_ParameterType { + void * object ; + int * nBlades ; int nBlades_Len ; + int * nBladeNodes ; int nBladeNodes_Len ; + int * nTowerNodes ; int nTowerNodes_Len ; double * twrRefPos ; int twrRefPos_Len ; double * bldRefPos ; int bldRefPos_Len ; double * hubRefPos ; int hubRefPos_Len ; double * nacRefPos ; int nacRefPos_Len ; double * bldRootRefPos ; int bldRootRefPos_Len ; - int * nBlades ; int nBlades_Len ; - int * nBladeNodes ; int nBladeNodes_Len ; - int * nTowerNodes ; int nTowerNodes_Len ; double * bldChord ; int bldChord_Len ; double * bldRloc ; int bldRloc_Len ; double * twrDia ; int twrDia_Len ; double * twrHloc ; int twrHloc_Len ; - double * bldPitch ; int bldPitch_Len ; - } ExtLdDX_InputType_t ; + } ExtLdDX_ParameterType_t ; typedef struct ExtLdDX_OutputType { void * object ; double * twrLd ; int twrLd_Len ; @@ -48,6 +51,7 @@ } ExtLdDX_OutputType_t ; typedef struct ExtLdDX_UserData { ExtLdDX_InputType_t ExtLdDX_Input ; + ExtLdDX_ParameterType_t ExtLdDX_Param ; ExtLdDX_OutputType_t ExtLdDX_Output ; } ExtLdDX_t ; diff --git a/modules/extloads/src/ExtLoads_Registry.txt b/modules/extloads/src/ExtLoads_Registry.txt index 66f457ee8a..d70ba74433 100644 --- a/modules/extloads/src/ExtLoads_Registry.txt +++ b/modules/extloads/src/ExtLoads_Registry.txt @@ -72,6 +72,7 @@ typedef ^ OtherStateType ReKi blah - - - "Som # ..... Parameters ................................................................................................................ # Define parameters here: +typedef ^ ParameterType ExtLdDX_ParameterType DX_p - - - "Data to send to external driver" typedef ^ ParameterType IntKi NumBlds - - - "Number of blades on the turbine" - typedef ^ ParameterType IntKi NumBldNds {:} - - "Number of blade nodes for each blade" - typedef ^ ParameterType IntKi nTotBldNds - - - "Total number of blade nodes" - diff --git a/modules/extloads/src/ExtLoads_Types.f90 b/modules/extloads/src/ExtLoads_Types.f90 index 8b6debb03f..c093db875d 100644 --- a/modules/extloads/src/ExtLoads_Types.f90 +++ b/modules/extloads/src/ExtLoads_Types.f90 @@ -98,6 +98,7 @@ MODULE ExtLoads_Types ! ======================= ! ========= ExtLd_ParameterType ======= TYPE, PUBLIC :: ExtLd_ParameterType + TYPE(ExtLdDX_ParameterType) :: DX_p !< Data to send to external driver [-] INTEGER(IntKi) :: NumBlds !< Number of blades on the turbine [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: NumBldNds !< Number of blade nodes for each blade [-] INTEGER(IntKi) :: nTotBldNds !< Total number of blade nodes [-] @@ -2174,6 +2175,9 @@ SUBROUTINE ExtLd_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs ! ErrStat = ErrID_None ErrMsg = "" + CALL ExtLdDX_CopyParam( SrcParamData%DX_p, DstParamData%DX_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN DstParamData%NumBlds = SrcParamData%NumBlds IF (ALLOCATED(SrcParamData%NumBldNds)) THEN i1_l = LBOUND(SrcParamData%NumBldNds,1) @@ -2219,6 +2223,8 @@ SUBROUTINE ExtLd_DestroyParam( ParamData, ErrStat, ErrMsg, DEALLOCATEpointers ) DEALLOCATEpointers_local = .true. END IF + CALL ExtLdDX_DestroyParam( ParamData%DX_p, ErrStat2, ErrMsg2, DEALLOCATEpointers_local ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ALLOCATED(ParamData%NumBldNds)) THEN DEALLOCATE(ParamData%NumBldNds) ENDIF @@ -2259,6 +2265,24 @@ SUBROUTINE ExtLd_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! DX_p: size of buffers for each call to pack subtype + CALL ExtLdDX_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%DX_p, ErrStat2, ErrMsg2, .TRUE. ) ! DX_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! DX_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! DX_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! DX_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF Int_BufSz = Int_BufSz + 1 ! NumBlds Int_BufSz = Int_BufSz + 1 ! NumBldNds allocated yes/no IF ( ALLOCATED(InData%NumBldNds) ) THEN @@ -2301,6 +2325,34 @@ SUBROUTINE ExtLd_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Db_Xferred = 1 Int_Xferred = 1 + CALL ExtLdDX_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%DX_p, ErrStat2, ErrMsg2, OnlySize ) ! DX_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN + IntKiBuf( Int_Xferred ) = SIZE(Re_Buf); Int_Xferred = Int_Xferred + 1 + IF (SIZE(Re_Buf) > 0) ReKiBuf( Re_Xferred:Re_Xferred+SIZE(Re_Buf)-1 ) = Re_Buf + Re_Xferred = Re_Xferred + SIZE(Re_Buf) + DEALLOCATE(Re_Buf) + ELSE + IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 + ENDIF + IF(ALLOCATED(Db_Buf)) THEN + IntKiBuf( Int_Xferred ) = SIZE(Db_Buf); Int_Xferred = Int_Xferred + 1 + IF (SIZE(Db_Buf) > 0) DbKiBuf( Db_Xferred:Db_Xferred+SIZE(Db_Buf)-1 ) = Db_Buf + Db_Xferred = Db_Xferred + SIZE(Db_Buf) + DEALLOCATE(Db_Buf) + ELSE + IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 + ENDIF + IF(ALLOCATED(Int_Buf)) THEN + IntKiBuf( Int_Xferred ) = SIZE(Int_Buf); Int_Xferred = Int_Xferred + 1 + IF (SIZE(Int_Buf) > 0) IntKiBuf( Int_Xferred:Int_Xferred+SIZE(Int_Buf)-1 ) = Int_Buf + Int_Xferred = Int_Xferred + SIZE(Int_Buf) + DEALLOCATE(Int_Buf) + ELSE + IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 + ENDIF IntKiBuf(Int_Xferred) = InData%NumBlds Int_Xferred = Int_Xferred + 1 IF ( .NOT. ALLOCATED(InData%NumBldNds) ) THEN @@ -2365,6 +2417,46 @@ SUBROUTINE ExtLd_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 + Buf_size=IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF(Buf_size > 0) THEN + ALLOCATE(Re_Buf(Buf_size),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating Re_Buf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + Re_Buf = ReKiBuf( Re_Xferred:Re_Xferred+Buf_size-1 ) + Re_Xferred = Re_Xferred + Buf_size + END IF + Buf_size=IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF(Buf_size > 0) THEN + ALLOCATE(Db_Buf(Buf_size),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating Db_Buf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + Db_Buf = DbKiBuf( Db_Xferred:Db_Xferred+Buf_size-1 ) + Db_Xferred = Db_Xferred + Buf_size + END IF + Buf_size=IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF(Buf_size > 0) THEN + ALLOCATE(Int_Buf(Buf_size),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating Int_Buf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) + Int_Xferred = Int_Xferred + Buf_size + END IF + CALL ExtLdDX_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%DX_p, ErrStat2, ErrMsg2 ) ! DX_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) + IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) + IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) OutData%NumBlds = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! NumBldNds not allocated diff --git a/modules/openfast-library/src/FAST_Library.f90 b/modules/openfast-library/src/FAST_Library.f90 index 7da7bd732b..82a5d9d96c 100644 --- a/modules/openfast-library/src/FAST_Library.f90 +++ b/modules/openfast-library/src/FAST_Library.f90 @@ -510,7 +510,7 @@ end subroutine FAST_Restart !================================================================================================================================== subroutine FAST_ExtLoads_Init(iTurb, TMax, InputFileName_c, TurbID, OutFileRoot_c, TurbPosn, AbortErrLev_c, dtDriver_c, dt_c, NumBl_c, & az_blend_mean_c, az_blend_delta_c, vel_mean_c, wind_dir_c, z_ref_c, shear_exp_c, & - ExtLd_Input_from_FAST, ExtLd_Output_to_FAST, SC_DX_Input_from_FAST, SC_DX_Output_to_FAST, ErrStat_c, ErrMsg_c) BIND (C, NAME='FAST_ExtLoads_Init') + ExtLd_Input_from_FAST, ExtLd_Parameter_from_FAST, ExtLd_Output_to_FAST, SC_DX_Input_from_FAST, SC_DX_Output_to_FAST, ErrStat_c, ErrMsg_c) BIND (C, NAME='FAST_ExtLoads_Init') !DEC$ ATTRIBUTES DLLEXPORT::FAST_ExtLoads_Init IMPLICIT NONE #ifndef IMPLICIT_DLLEXPORT @@ -533,10 +533,11 @@ subroutine FAST_ExtLoads_Init(iTurb, TMax, InputFileName_c, TurbID, OutFileRoot_ REAL(C_DOUBLE), INTENT( OUT) :: dt_c INTEGER(C_INT), INTENT( OUT) :: AbortErrLev_c INTEGER(C_INT), INTENT( OUT) :: NumBl_c - TYPE(ExtLdDX_InputType_C), INTENT( OUT) :: ExtLd_Input_from_FAST - TYPE(ExtLdDX_OutputType_C),INTENT( OUT) :: ExtLd_Output_to_FAST - TYPE(SC_DX_InputType_C), INTENT(INOUT) :: SC_DX_Input_from_FAST - TYPE(SC_DX_OutputType_C), INTENT(INOUT) :: SC_DX_Output_to_FAST + TYPE(ExtLdDX_InputType_C), INTENT( OUT) :: ExtLd_Input_from_FAST + TYPE(ExtLdDX_ParameterType_C), INTENT( OUT) :: ExtLd_Parameter_from_FAST + TYPE(ExtLdDX_OutputType_C), INTENT( OUT) :: ExtLd_Output_to_FAST + TYPE(SC_DX_InputType_C), INTENT(INOUT) :: SC_DX_Input_from_FAST + TYPE(SC_DX_OutputType_C), INTENT(INOUT) :: SC_DX_Output_to_FAST INTEGER(C_INT), INTENT( OUT) :: ErrStat_c CHARACTER(KIND=C_CHAR), INTENT( OUT) :: ErrMsg_c(IntfStrLen) @@ -597,7 +598,7 @@ subroutine FAST_ExtLoads_Init(iTurb, TMax, InputFileName_c, TurbID, OutFileRoot_ return end if - call SetExtLoads_pointers(iTurb, ExtLd_Input_from_FAST, ExtLd_Output_to_FAST) + call SetExtLoads_pointers(iTurb, ExtLd_Input_from_FAST, ExtLd_Parameter_from_FAST, ExtLd_Output_to_FAST) OutFileRoot_c = TRANSFER( trim(Turbine(iTurb)%p_FAST%OutFileRoot)//C_NULL_CHAR, OutFileRoot_c ) @@ -901,7 +902,7 @@ subroutine FAST_ExtInfw_Restart(iTurb, CheckpointRootName_c, AbortErrLev_c, dt_c end subroutine FAST_ExtInfw_Restart !================================================================================================================================== subroutine FAST_ExtLoads_Restart(iTurb, CheckpointRootName_c, AbortErrLev_c, dt_c, numblades_c, & - n_t_global_c, ExtLd_Input_from_FAST, ExtLd_Output_to_FAST, & + n_t_global_c, ExtLd_Input_from_FAST, ExtLd_Parameter_from_FAST, ExtLd_Output_to_FAST, & SC_DX_Input_from_FAST, SC_DX_Output_to_FAST, ErrStat_c, ErrMsg_c) BIND (C, NAME='FAST_ExtLoads_Restart') !DEC$ ATTRIBUTES DLLEXPORT::FAST_ExtLoads_Restart IMPLICIT NONE @@ -915,10 +916,11 @@ subroutine FAST_ExtLoads_Restart(iTurb, CheckpointRootName_c, AbortErrLev_c, dt_ INTEGER(C_INT), INTENT( OUT) :: numblades_c REAL(C_DOUBLE), INTENT( OUT) :: dt_c INTEGER(C_INT), INTENT( OUT) :: n_t_global_c - TYPE(ExtLdDX_InputType_C), INTENT( OUT) :: ExtLd_Input_from_FAST - TYPE(ExtLdDX_OutputType_C),INTENT( OUT) :: ExtLd_Output_to_FAST - TYPE(SC_DX_InputType_C), INTENT(INOUT) :: SC_DX_Input_from_FAST - TYPE(SC_DX_OutputType_C), INTENT(INOUT) :: SC_DX_Output_to_FAST + TYPE(ExtLdDX_InputType_C), INTENT( OUT) :: ExtLd_Input_from_FAST + TYPE(ExtLdDX_ParameterType_C), INTENT( OUT) :: ExtLd_Parameter_from_FAST + TYPE(ExtLdDX_OutputType_C), INTENT( OUT) :: ExtLd_Output_to_FAST + TYPE(SC_DX_InputType_C), INTENT(INOUT) :: SC_DX_Input_from_FAST + TYPE(SC_DX_OutputType_C), INTENT(INOUT) :: SC_DX_Output_to_FAST INTEGER(C_INT), INTENT( OUT) :: ErrStat_c CHARACTER(KIND=C_CHAR), INTENT( OUT) :: ErrMsg_c(IntfStrLen) @@ -972,44 +974,47 @@ subroutine FAST_ExtLoads_Restart(iTurb, CheckpointRootName_c, AbortErrLev_c, dt_ end if write(*,*) 'Finished restoring OpenFAST from checkpoint' - call SetExtLoads_pointers(iTurb, ExtLd_Input_from_FAST, ExtLd_Output_to_FAST) + call SetExtLoads_pointers(iTurb, ExtLd_Input_from_FAST, ExtLd_Parameter_from_FAST, ExtLd_Output_to_FAST) ErrStat_c = ErrStat ErrMsg_c = TRANSFER( trim(ErrMsg)//C_NULL_CHAR, ErrMsg_c ) end subroutine FAST_ExtLoads_Restart !================================================================================================================================== -subroutine SetExtLoads_pointers(iTurb, ExtLd_iFromOF, ExtLd_oToOF) +subroutine SetExtLoads_pointers(iTurb, ExtLd_iFromOF, ExtLd_pFromOF, ExtLd_oToOF) IMPLICIT NONE - INTEGER(C_INT), INTENT(IN ) :: iTurb ! Turbine number - TYPE(ExtLdDX_InputType_C), INTENT(INOUT) :: ExtLd_iFromOF - TYPE(ExtLdDX_OutputType_C),INTENT(INOUT) :: ExtLd_oToOF - - 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 - 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 - 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 - 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 - ExtLd_iFromOF%twrDef_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrDef_Len; ExtLd_iFromOF%twrDef = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrDef - ExtLd_iFromOF%bldRloc_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldRloc_Len; ExtLd_iFromOF%bldRloc = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldRloc - ExtLd_iFromOF%bldChord_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldChord_Len; ExtLd_iFromOF%bldChord = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldChord - ExtLd_iFromOF%bldRefPos_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldRefPos_Len; ExtLd_iFromOF%bldRefPos = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldRefPos - ExtLd_iFromOF%bldRootRefPos_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldRootRefPos_Len; ExtLd_iFromOF%bldRootRefPos = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldRootRefPos - ExtLd_iFromOF%bldDef_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldDef_Len; ExtLd_iFromOF%bldDef = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldDef - ExtLd_iFromOF%nBlades_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nBlades_Len; ExtLd_iFromOF%nBlades = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nBlades - 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 - 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 - - 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 - - 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 - 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 - - ExtLd_iFromOF%nacRefPos_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nacRefPos_Len; ExtLd_iFromOF%nacRefPos = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nacRefPos - ExtLd_iFromOF%nacDef_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nacDef_Len; ExtLd_iFromOF%nacDef = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nacDef - - ExtLd_oToOF%twrLd_Len = Turbine(iTurb)%ExtLd%y%DX_y%c_obj%twrLd_Len; ExtLd_oToOF%twrLd = Turbine(iTurb)%ExtLd%y%DX_y%c_obj%twrLd - ExtLd_oToOF%bldLd_Len = Turbine(iTurb)%ExtLd%y%DX_y%c_obj%bldLd_Len; ExtLd_oToOF%bldLd = Turbine(iTurb)%ExtLd%y%DX_y%c_obj%bldLd + INTEGER(C_INT), INTENT(IN ) :: iTurb ! Turbine number + TYPE(ExtLdDX_InputType_C), INTENT(INOUT) :: ExtLd_iFromOF + TYPE(ExtLdDX_ParameterType_C), INTENT(INOUT) :: ExtLd_pFromOF + TYPE(ExtLdDX_OutputType_C), INTENT(INOUT) :: ExtLd_oToOF + + ! Inputs + 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 + ExtLd_iFromOF%twrDef_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrDef_Len; ExtLd_iFromOF%twrDef = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%twrDef + ExtLd_iFromOF%bldDef_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldDef_Len; ExtLd_iFromOF%bldDef = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%bldDef + 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 + 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 + ExtLd_iFromOF%nacDef_Len = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nacDef_Len; ExtLd_iFromOF%nacDef = Turbine(iTurb)%ExtLd%u%DX_u%c_obj%nacDef + + ! Parameters + ExtLd_pFromOF%nBlades_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%nBlades_Len; ExtLd_pFromOF%nBlades = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%nBlades + ExtLd_pFromOF%nBladeNodes_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%nBladeNodes_Len; ExtLd_pFromOF%nBladeNodes = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%nBladeNodes + ExtLd_pFromOF%nTowerNodes_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%nTowerNodes_Len; ExtLd_pFromOF%nTowerNodes = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%nTowerNodes + + ExtLd_pFromOF%twrHloc_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%twrHloc_Len; ExtLd_pFromOF%twrHloc = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%twrHloc + ExtLd_pFromOF%twrDia_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%twrDia_Len; ExtLd_pFromOF%twrDia = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%twrDia + ExtLd_pFromOF%twrRefPos_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%twrRefPos_Len; ExtLd_pFromOF%twrRefPos = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%twrRefPos + ExtLd_pFromOF%bldRloc_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%bldRloc_Len; ExtLd_pFromOF%bldRloc = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%bldRloc + ExtLd_pFromOF%bldChord_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%bldChord_Len; ExtLd_pFromOF%bldChord = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%bldChord + ExtLd_pFromOF%bldRefPos_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%bldRefPos_Len; ExtLd_pFromOF%bldRefPos = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%bldRefPos + ExtLd_pFromOF%bldRootRefPos_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%bldRootRefPos_Len; ExtLd_pFromOF%bldRootRefPos = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%bldRootRefPos + ExtLd_pFromOF%hubRefPos_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%hubRefPos_Len; ExtLd_pFromOF%hubRefPos = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%hubRefPos + ExtLd_pFromOF%nacRefPos_Len = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%nacRefPos_Len; ExtLd_pFromOF%nacRefPos = Turbine(iTurb)%ExtLd%p%DX_p%c_obj%nacRefPos + + ! Outputs + ExtLd_oToOF%twrLd_Len = Turbine(iTurb)%ExtLd%y%DX_y%c_obj%twrLd_Len; ExtLd_oToOF%twrLd = Turbine(iTurb)%ExtLd%y%DX_y%c_obj%twrLd + ExtLd_oToOF%bldLd_Len = Turbine(iTurb)%ExtLd%y%DX_y%c_obj%bldLd_Len; ExtLd_oToOF%bldLd = Turbine(iTurb)%ExtLd%y%DX_y%c_obj%bldLd end subroutine SetExtLoads_pointers diff --git a/modules/openfast-library/src/FAST_Library.h b/modules/openfast-library/src/FAST_Library.h index 5427cdbacf..89fbd014d2 100644 --- a/modules/openfast-library/src/FAST_Library.h +++ b/modules/openfast-library/src/FAST_Library.h @@ -27,8 +27,8 @@ EXTERNAL_ROUTINE void FAST_ExtInfw_Init(int * iTurb, double *TMax, const char *I ExtInfw_InputType_t* ExtInfw_Input, ExtInfw_OutputType_t* ExtInfw_Output, SC_DX_InputType_t* SC_DX_Input, SC_DX_OutputType_t* SC_DX_Output, int *ErrStat, char *ErrMsg); -EXTERNAL_ROUTINE void FAST_ExtLoads_Restart(int * iTurb, const char *CheckpointRootName, int *AbortErrLev, double * dt, int * NumBl, int * n_t_global, ExtLdDX_InputType_t* ExtLdDX_Input, ExtLdDX_OutputType_t* ExtLdDX_Output, SC_DX_InputType_t* SC_DX_Input, SC_DX_OutputType_t* SC_DX_Output, int *ErrStat, char *ErrMsg); -EXTERNAL_ROUTINE void FAST_ExtLoads_Init(int * iTurb, double *TMax, const char *InputFileName, int * TurbineID, char *OutFileRoot, float * TurbinePosition, int *AbortErrLev, double * dtDriver, double * dt, int * NumBl, double * az_blend_mean, double * az_blend_delta, double * vel_mean, double * wind_dir, double * z_ref, double * shear_exp, ExtLdDX_InputType_t* ExtLdDX_Input, ExtLdDX_OutputType_t* ExtLdDX_Output, SC_DX_InputType_t* SC_DX_Input, SC_DX_OutputType_t* SC_DX_Output, int *ErrStat, char *ErrMsg); +EXTERNAL_ROUTINE void FAST_ExtLoads_Restart(int * iTurb, const char *CheckpointRootName, int *AbortErrLev, double * dt, int * NumBl, int * n_t_global, ExtLdDX_InputType_t* ExtLdDX_Input, ExtLdDX_ParameterType_t* ExtLdDX_Parameter, ExtLdDX_OutputType_t* ExtLdDX_Output, SC_DX_InputType_t* SC_DX_Input, SC_DX_OutputType_t* SC_DX_Output, int *ErrStat, char *ErrMsg); +EXTERNAL_ROUTINE void FAST_ExtLoads_Init(int * iTurb, double *TMax, const char *InputFileName, int * TurbineID, char *OutFileRoot, float * TurbinePosition, int *AbortErrLev, double * dtDriver, double * dt, int * NumBl, double * az_blend_mean, double * az_blend_delta, double * vel_mean, double * wind_dir, double * z_ref, double * shear_exp, ExtLdDX_InputType_t* ExtLdDX_Input, ExtLdDX_ParameterType_t* ExtLdDX_Parameter, ExtLdDX_OutputType_t* ExtLdDX_Output, SC_DX_InputType_t* SC_DX_Input, SC_DX_OutputType_t* SC_DX_Output, int *ErrStat, char *ErrMsg); EXTERNAL_ROUTINE void FAST_CFD_Solution0(int * iTurb, int *ErrStat, char *ErrMsg); EXTERNAL_ROUTINE void FAST_CFD_InitIOarrays_SubStep(int * iTurb, int *ErrStat, char *ErrMsg); EXTERNAL_ROUTINE void FAST_CFD_Prework(int * iTurb, int *ErrStat, char *ErrMsg);