@@ -40,12 +40,14 @@ module FAST_Funcs
4040use BeamDyn, only: BD_JacobianPInput, &
4141 BD_JacobianPContState, &
4242 BD_CalcContStateDeriv, &
43+ BD_UpdateStates, &
4344 BD_CalcOutput, &
4445 BD_End
4546
4647use ElastoDyn, only: ED_JacobianPInput, &
4748 ED_JacobianPContState, &
4849 ED_CalcContStateDeriv, &
50+ ED_UpdateStates, &
4951 ED_CalcOutput, &
5052 ED_End, &
5153 ED_PackExtInputAry
@@ -131,6 +133,7 @@ module FAST_Funcs
131133use SubDyn, only: SD_JacobianPInput, &
132134 SD_JacobianPContState, &
133135 SD_CalcContStateDeriv, &
136+ SD_UpdateStates, &
134137 SD_CalcOutput, &
135138 SD_End
136139
@@ -435,6 +438,9 @@ subroutine FAST_UpdateStates(ModData, t_initial, n_t_global, T, ErrStat, ErrMsg)
435438 ErrStat = ErrID_None
436439 ErrMsg = ' '
437440
441+ ! Skip modules in the tight coupling category because the solver handles state updates
442+ if (iand (ModData% Category, MC_Tight) /= 0 ) return
443+
438444 ! Select based on module ID
439445 select case (ModData% ID)
440446
@@ -472,10 +478,32 @@ subroutine FAST_UpdateStates(ModData, t_initial, n_t_global, T, ErrStat, ErrMsg)
472478 end do
473479
474480 case (Module_BD)
475- ! State update is handled by tight coupling solver
481+ call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2)
482+ if (Failed()) return
483+
484+ do j_ss = 1 , ModData% SubSteps
485+ n_t_module = n_t_global* ModData% SubSteps + j_ss - 1
486+ t_module = n_t_module* ModData% DT + t_initial
487+ call BD_UpdateStates(t_module, n_t_module, T% BD% Input(1 :,ModData% Ins), T% BD% InputTimes(:,ModData% Ins), T% BD% p(ModData% Ins), &
488+ T% BD% x(ModData% Ins, STATE_PRED), T% BD% xd(ModData% Ins, STATE_PRED), &
489+ T% BD% z(ModData% Ins, STATE_PRED), T% BD% OtherSt(ModData% Ins, STATE_PRED), &
490+ T% BD% m(ModData% Ins), ErrStat2, ErrMsg2)
491+ if (Failed()) return
492+ end do
476493
477494 case (Module_ED)
478- ! State update is handled by tight coupling solver
495+ call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2)
496+ if (Failed()) return
497+
498+ do j_ss = 1 , ModData% SubSteps
499+ n_t_module = n_t_global* ModData% SubSteps + j_ss - 1
500+ t_module = n_t_module* ModData% DT + t_initial
501+ call ED_UpdateStates(t_module, n_t_module, T% ED% Input(1 :,ModData% Ins), T% ED% InputTimes(:,ModData% Ins), T% ED% p(ModData% Ins), &
502+ T% ED% x(ModData% Ins, STATE_PRED), T% ED% xd(ModData% Ins, STATE_PRED), &
503+ T% ED% z(ModData% Ins, STATE_PRED), T% ED% OtherSt(ModData% Ins, STATE_PRED), &
504+ T% ED% m(ModData% Ins), ErrStat2, ErrMsg2)
505+ if (Failed()) return
506+ end do
479507
480508 case (Module_SED)
481509 call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2)
@@ -599,8 +627,6 @@ subroutine FAST_UpdateStates(ModData, t_initial, n_t_global, T, ErrStat, ErrMsg)
599627 if (Failed()) return
600628 end do
601629
602- ! case (Module_OpFM)
603-
604630 case (Module_Orca)
605631 call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2)
606632 if (Failed()) return
@@ -616,7 +642,18 @@ subroutine FAST_UpdateStates(ModData, t_initial, n_t_global, T, ErrStat, ErrMsg)
616642 end do
617643
618644 case (Module_SD)
619- ! State update is handled by tight coupling solver
645+ call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2)
646+ if (Failed()) return
647+
648+ do j_ss = 1 , ModData% SubSteps
649+ n_t_module = n_t_global* ModData% SubSteps + j_ss - 1
650+ t_module = n_t_module* ModData% DT + t_initial
651+ call SD_UpdateStates(t_module, n_t_module, T% SD% Input(1 :), T% SD% InputTimes, T% SD% p, &
652+ T% SD% x(STATE_PRED), T% SD% xd(STATE_PRED), &
653+ T% SD% z(STATE_PRED), T% SD% OtherSt(STATE_PRED), &
654+ T% SD% m, ErrStat2, ErrMsg2)
655+ if (Failed()) return
656+ end do
620657
621658 case (Module_SeaSt)
622659 call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2)
0 commit comments