From bcceb6b6dc48729145769d250ee940685e0b656a Mon Sep 17 00:00:00 2001 From: Roger Bergua Date: Mon, 22 Jul 2024 10:27:38 -0600 Subject: [PATCH 1/5] Linear damping for rod elements Transverse linear damping per unit of length [N/(m/s)/m] is added to the rod element --- modules/moordyn/src/MoorDyn.f90 | 25 +++++++++++++++++++++-- modules/moordyn/src/MoorDyn_Rod.f90 | 29 +++++++++++++++++++-------- modules/moordyn/src/MoorDyn_Types.f90 | 8 ++++++-- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/modules/moordyn/src/MoorDyn.f90 b/modules/moordyn/src/MoorDyn.f90 index ae907fe3e..a5b681577 100644 --- a/modules/moordyn/src/MoorDyn.f90 +++ b/modules/moordyn/src/MoorDyn.f90 @@ -127,6 +127,8 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er CHARACTER(40) :: TempString5 ! CHARACTER(40) :: TempStrings(6) ! Array of 6 strings used when parsing comma-separated items ! CHARACTER(1024) :: FileName ! + CHARACTER(20) :: TempString6 ! Linear damping (transverse direction) for rod element + REAL(DbKi) :: depth ! local water depth interpolated from bathymetry grid [m] Real(DbKi) :: nvec(3) ! local seabed surface normal vector (positive out) @@ -724,13 +726,32 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er RETURN END IF - ! parse out entries: Name Diam MassDen Cd Ca CdEnd CaEnd + ! parse out entries: Name Diam MassDen Cd Ca CdEnd CaEnd LinDamp IF (ErrStat2 == 0) THEN READ(Line,*,IOSTAT=ErrStat2) m%RodTypeList(l)%name, m%RodTypeList(l)%d, m%RodTypeList(l)%w, & - m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd + m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd,& + tempString6 ! Linear damping coefficient + read(tempString6, '(F)') tempString6 + + if (ErrStat2 .ne. 0) then + READ(Line,*,IOSTAT=ErrStat2) m%RodTypeList(l)%name, m%RodTypeList(l)%d, m%RodTypeList(l)%w, & + m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd + + tempString6 = '' + end if + m%RodTypeList(l)%Cdt = 0.0_DbKi ! not used m%RodTypeList(l)%Cat = 0.0_DbKi ! not used + + if (len(trim(tempString6)) .gt. 0) then + read(tempString6, *) m%RodTypeList(l)%LinDamp + m%RodTypeList(l)%isLinDamp = .TRUE. + else + m%RodTypeList(l)%LinDamp = 0.0 + m%RodTypeList(l)%isLinDamp = .FALSE. + end if + END IF ! specify IdNum of rod type for error checking diff --git a/modules/moordyn/src/MoorDyn_Rod.f90 b/modules/moordyn/src/MoorDyn_Rod.f90 index 3bf1e41a4..7a9fdfb46 100644 --- a/modules/moordyn/src/MoorDyn_Rod.f90 +++ b/modules/moordyn/src/MoorDyn_Rod.f90 @@ -81,8 +81,9 @@ SUBROUTINE Rod_Setup(Rod, RodProp, endCoords, p, ErrStat, ErrMsg) Rod%Cdn = RodProp%Cdn Rod%Cdt = RodProp%Cdt Rod%CaEnd = RodProp%CaEnd - Rod%CdEnd = RodProp%CdEnd - + Rod%CdEnd = RodProp%CdEnd + Rod%linDamp = RodProp%linDamp + Rod%islinDamp = RodProp%islinDamp ! allocate node positions and velocities (NOTE: these arrays start at ZERO) ALLOCATE(Rod%r(3, 0:N), Rod%rd(3, 0:N), STAT=ErrStat2); if(AllocateFailed("")) return @@ -566,7 +567,11 @@ SUBROUTINE Rod_DoRHS(Rod, m, p) Real(DbKi) :: ap(3), aq(3) ! transverse and axial components of water acceleration at a given node Real(DbKi) :: Fnet_i(3) ! force from an attached line Real(DbKi) :: Mnet_i(3) ! moment from an attached line - Real(DbKi) :: Mass_i(3,3) ! mass from an attached line + Real(DbKi) :: Mass_i(3,3) ! mass from an attached line + + ! Linear damping, Front Energies, July 2024 + Real(DbKi) :: Vi_lin(3) ! velocity induced by Rod Motion + Real(DbKi) :: Vp_lin(3), Vq_lin(3) ! transverse and axial components of Rod motion at a given node ! used in lumped 6DOF calculations: Real(DbKi) :: rRel( 3) ! relative position of each node i from rRef @@ -737,7 +742,8 @@ SUBROUTINE Rod_DoRHS(Rod, m, p) !relative flow velocities DO J = 1, 3 - Vi(J) = Rod%U(J,I) - Rod%rd(J,I) ! relative flow velocity over node -- this is where wave velicites would be added + Vi(J) = Rod%U(J,I) - Rod%rd(J,I) ! relative flow velocity over node -- this is where wave velicites would be added + Vi_lin(J) = Rod%rd(J,I) ! linear damping END DO ! decomponse relative flow into components @@ -747,14 +753,21 @@ SUBROUTINE Rod_DoRHS(Rod, m, p) Vq(J) = DOT_PRODUCT( Vi , Rod%q ) * Rod%q(J); ! tangential relative flow component Vp(J) = Vi(J) - Vq(J) ! transverse relative flow component SumSqVq = SumSqVq + Vq(J)*Vq(J) - SumSqVp = SumSqVp + Vp(J)*Vp(J) + SumSqVp = SumSqVp + Vp(J)*Vp(J) + + ! linear damping + Vq_lin(J) = DOT_PRODUCT( Vi_lin , Rod%q ) * Rod%q(J) ! tangential relative Rod velocity component + Vp_lin(J) = Vi_lin(J) - Vq_lin(J) ! transverse relative Rod velocity component + END DO MagVp = sqrt(SumSqVp) ! get magnitudes of flow components MagVq = sqrt(SumSqVq) - + ! transverse and tangenential drag - Rod%Dp(:,I) = VOF * 0.5*p%rhoW*Rod%Cdn* Rod%d* dL * MagVp * Vp - Rod%Dq(:,I) = 0.0_DbKi ! 0.25*p%rhoW*Rod%Cdt* Pi*Rod%d* dL * MagVq * Vq <<< should these axial side loads be included? + Rod%Dp(:,I) = VOF * 0.5*p%rhoW*Rod%Cdn* Rod%d* dL * MagVp * Vp - Rod%linDamp * Vp_lin * dL ! linear damping added + Rod%Dq(:,I) = 0.0_DbKi ! 0.25*p%rhoW*Rod%Cdt* Pi*Rod%d* dL * MagVq * Vq <<< should these axial side loads be included? + + ! fluid acceleration components for current node aq = DOT_PRODUCT(Rod%Ud(:,I), Rod%q) * Rod%q ! tangential component of fluid acceleration diff --git a/modules/moordyn/src/MoorDyn_Types.f90 b/modules/moordyn/src/MoorDyn_Types.f90 index 74c4cf748..0b618ce94 100644 --- a/modules/moordyn/src/MoorDyn_Types.f90 +++ b/modules/moordyn/src/MoorDyn_Types.f90 @@ -98,7 +98,9 @@ MODULE MoorDyn_Types REAL(DbKi) :: Cdn = 0.0_R8Ki !< transverse drag coefficient [-] REAL(DbKi) :: Cdt = 0.0_R8Ki !< tangential drag coefficient [-] REAL(DbKi) :: CdEnd = 0.0_R8Ki !< drag coefficient for rod end [[-]] - REAL(DbKi) :: CaEnd = 0.0_R8Ki !< added mass coefficient for rod end [[-]] + REAL(DbKi) :: CaEnd = 0.0_R8Ki !< added mass coefficient for rod end [[-]] + REAL(DbKi) :: LinDamp !< Linear damping [[N/(m/s)/m]], transverse damping for rod element + logical :: isLinDamp !< Linear damping [[N/(m/s)/m]], transverse damping for rod element END TYPE MD_RodProp ! ======================= ! ========= MD_Body ======= @@ -183,7 +185,9 @@ MODULE MoorDyn_Types REAL(DbKi) :: Cdn = 0.0_R8Ki !< [[-]] REAL(DbKi) :: Cdt = 0.0_R8Ki !< [[-]] REAL(DbKi) :: CdEnd = 0.0_R8Ki !< drag coefficient for rod end [[-]] - REAL(DbKi) :: CaEnd = 0.0_R8Ki !< added mass coefficient for rod end [[-]] + REAL(DbKi) :: CaEnd = 0.0_R8Ki !< added mass coefficient for rod end [[-]] + REAL(DbKi) :: linDamp ! linear damping + logical :: isLinDamp !< Linear damping [[N/(m/s)/m]], transverse damping for rod element REAL(DbKi) :: time = 0.0_R8Ki !< current time [[s]] REAL(DbKi) :: roll = 0.0_R8Ki !< roll relative to vertical [[rad]] REAL(DbKi) :: pitch = 0.0_R8Ki !< pitch relative to vertical [[rad]] From d7cf1a18ec14d5d188edb54b14354fbd2cbe2b8d Mon Sep 17 00:00:00 2001 From: Roger Bergua Date: Mon, 22 Jul 2024 13:24:10 -0600 Subject: [PATCH 2/5] Removed tabs --- modules/moordyn/src/MoorDyn.f90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/moordyn/src/MoorDyn.f90 b/modules/moordyn/src/MoorDyn.f90 index a5b681577..9cc7e7eb7 100644 --- a/modules/moordyn/src/MoorDyn.f90 +++ b/modules/moordyn/src/MoorDyn.f90 @@ -726,21 +726,21 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er RETURN END IF - ! parse out entries: Name Diam MassDen Cd Ca CdEnd CaEnd LinDamp + ! parse out entries: Name Diam MassDen Cd Ca CdEnd CaEnd LinDamp IF (ErrStat2 == 0) THEN READ(Line,*,IOSTAT=ErrStat2) m%RodTypeList(l)%name, m%RodTypeList(l)%d, m%RodTypeList(l)%w, & m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd,& tempString6 ! Linear damping coefficient read(tempString6, '(F)') tempString6 - if (ErrStat2 .ne. 0) then + if (ErrStat2 .ne. 0) then READ(Line,*,IOSTAT=ErrStat2) m%RodTypeList(l)%name, m%RodTypeList(l)%d, m%RodTypeList(l)%w, & m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd tempString6 = '' - end if - - + end if + + m%RodTypeList(l)%Cdt = 0.0_DbKi ! not used m%RodTypeList(l)%Cat = 0.0_DbKi ! not used From de3aac8a148d1ef34bafc7a82ebbedffcc654a38 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 22 Jul 2024 11:38:47 -0600 Subject: [PATCH 3/5] MD: update MD registry and types file with new additions --- modules/moordyn/src/MoorDyn_Registry.txt | 8 +++++-- modules/moordyn/src/MoorDyn_Types.f90 | 28 +++++++++++++++++------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/modules/moordyn/src/MoorDyn_Registry.txt b/modules/moordyn/src/MoorDyn_Registry.txt index 3455023df..c8a00de07 100644 --- a/modules/moordyn/src/MoorDyn_Registry.txt +++ b/modules/moordyn/src/MoorDyn_Registry.txt @@ -68,7 +68,7 @@ typedef ^ ^ DbKi stiffXs {30} typedef ^ ^ DbKi stiffYs {30} - - "y array for stress-strain lookup table" typedef ^ ^ IntKi nBApoints - 0 - "number of values in stress-strainrate lookup table (0 means using constant c)" typedef ^ ^ DbKi dampXs {30} - - "x array for stress-strainrate lookup table (up to nCoef)" -typedef ^ ^ DbKi dampYs {30} - - "y array for stress-strainrate lookup table " +typedef ^ ^ DbKi dampYs {30} - - "y array for stress-strainrate lookup table" typedef ^ ^ IntKi nEIpoints - 0 - "number of values in bending stress-strain lookup table (0 means using constant E)" typedef ^ ^ DbKi bstiffXs {30} - - "x array for stress-strain lookup table (up to nCoef)" typedef ^ ^ DbKi bstiffYs {30} - - "y array for stress-strain lookup table" @@ -84,6 +84,8 @@ typedef ^ ^ DbKi Cdn - typedef ^ ^ DbKi Cdt - - - "tangential drag coefficient" typedef ^ ^ DbKi CdEnd - - - "drag coefficient for rod end" "[-]" typedef ^ ^ DbKi CaEnd - - - "added mass coefficient for rod end" "[-]" +typedef ^ ^ DbKi LinDamp - - - "Linear damping, transverse damping for body element" "[N/(m/s)/m]" +typedef ^ ^ LOGICAL isLinDamp - - - "Linear damping, transverse damping for body element is used" "-" # this is the Body type, which holds data for each body object typedef ^ MD_Body IntKi IdNum - - - "integer identifier of this Point" @@ -163,6 +165,8 @@ typedef ^ ^ DbKi Cdn - typedef ^ ^ DbKi Cdt - - - "" "[-]" typedef ^ ^ DbKi CdEnd - - - "drag coefficient for rod end" "[-]" typedef ^ ^ DbKi CaEnd - - - "added mass coefficient for rod end" "[-]" +typedef ^ ^ DbKi LinDamp - - - "Linear damping, transverse damping for rod element" "[N/(m/s)/m]" +typedef ^ ^ LOGICAL isLinDamp - - - "Linear damping, transverse damping for rod element is used" "-" typedef ^ ^ DbKi time - - - "current time" "[s]" typedef ^ ^ DbKi roll - - - "roll relative to vertical" "[rad]" typedef ^ ^ DbKi pitch - - - "pitch relative to vertical" "[rad]" @@ -228,7 +232,7 @@ typedef ^ ^ DbKi stiffXs {30} typedef ^ ^ DbKi stiffYs {30} - - "y array for stress-strain lookup table" typedef ^ ^ IntKi nBApoints - 0 - "number of values in stress-strainrate lookup table (0 means using constant c)" typedef ^ ^ DbKi dampXs {30} - - "x array for stress-strainrate lookup table (up to nCoef)" -typedef ^ ^ DbKi dampYs {30} - - "y array for stress-strainrate lookup table " +typedef ^ ^ DbKi dampYs {30} - - "y array for stress-strainrate lookup table" typedef ^ ^ IntKi nEIpoints - 0 - "number of values in bending stress-strain lookup table (0 means using constant E)" typedef ^ ^ DbKi bstiffXs {30} - - "x array for stress-strain lookup table (up to nCoef)" typedef ^ ^ DbKi bstiffYs {30} - - "y array for stress-strain lookup table" diff --git a/modules/moordyn/src/MoorDyn_Types.f90 b/modules/moordyn/src/MoorDyn_Types.f90 index 0b618ce94..5ed121a89 100644 --- a/modules/moordyn/src/MoorDyn_Types.f90 +++ b/modules/moordyn/src/MoorDyn_Types.f90 @@ -81,7 +81,7 @@ MODULE MoorDyn_Types REAL(DbKi) , DIMENSION(1:30) :: stiffYs = 0.0_R8Ki !< y array for stress-strain lookup table [-] INTEGER(IntKi) :: nBApoints = 0 !< number of values in stress-strainrate lookup table (0 means using constant c) [-] REAL(DbKi) , DIMENSION(1:30) :: dampXs = 0.0_R8Ki !< x array for stress-strainrate lookup table (up to nCoef) [-] - REAL(DbKi) , DIMENSION(1:30) :: dampYs = 0.0_R8Ki !< y array for stress-strainrate lookup table [-] + REAL(DbKi) , DIMENSION(1:30) :: dampYs = 0.0_R8Ki !< y array for stress-strainrate lookup table [-] INTEGER(IntKi) :: nEIpoints = 0 !< number of values in bending stress-strain lookup table (0 means using constant E) [-] REAL(DbKi) , DIMENSION(1:30) :: bstiffXs = 0.0_R8Ki !< x array for stress-strain lookup table (up to nCoef) [-] REAL(DbKi) , DIMENSION(1:30) :: bstiffYs = 0.0_R8Ki !< y array for stress-strain lookup table [-] @@ -98,9 +98,9 @@ MODULE MoorDyn_Types REAL(DbKi) :: Cdn = 0.0_R8Ki !< transverse drag coefficient [-] REAL(DbKi) :: Cdt = 0.0_R8Ki !< tangential drag coefficient [-] REAL(DbKi) :: CdEnd = 0.0_R8Ki !< drag coefficient for rod end [[-]] - REAL(DbKi) :: CaEnd = 0.0_R8Ki !< added mass coefficient for rod end [[-]] - REAL(DbKi) :: LinDamp !< Linear damping [[N/(m/s)/m]], transverse damping for rod element - logical :: isLinDamp !< Linear damping [[N/(m/s)/m]], transverse damping for rod element + REAL(DbKi) :: CaEnd = 0.0_R8Ki !< added mass coefficient for rod end [[-]] + REAL(DbKi) :: LinDamp = 0.0_R8Ki !< Linear damping, transverse damping for body element [[N/(m/s)/m]] + LOGICAL :: isLinDamp = .false. !< Linear damping, transverse damping for body element is used [-] END TYPE MD_RodProp ! ======================= ! ========= MD_Body ======= @@ -185,9 +185,9 @@ MODULE MoorDyn_Types REAL(DbKi) :: Cdn = 0.0_R8Ki !< [[-]] REAL(DbKi) :: Cdt = 0.0_R8Ki !< [[-]] REAL(DbKi) :: CdEnd = 0.0_R8Ki !< drag coefficient for rod end [[-]] - REAL(DbKi) :: CaEnd = 0.0_R8Ki !< added mass coefficient for rod end [[-]] - REAL(DbKi) :: linDamp ! linear damping - logical :: isLinDamp !< Linear damping [[N/(m/s)/m]], transverse damping for rod element + REAL(DbKi) :: CaEnd = 0.0_R8Ki !< added mass coefficient for rod end [[-]] + REAL(DbKi) :: LinDamp = 0.0_R8Ki !< Linear damping, transverse damping for rod element [[N/(m/s)/m]] + LOGICAL :: isLinDamp = .false. !< Linear damping, transverse damping for rod element is used [-] REAL(DbKi) :: time = 0.0_R8Ki !< current time [[s]] REAL(DbKi) :: roll = 0.0_R8Ki !< roll relative to vertical [[rad]] REAL(DbKi) :: pitch = 0.0_R8Ki !< pitch relative to vertical [[rad]] @@ -253,7 +253,7 @@ MODULE MoorDyn_Types REAL(DbKi) , DIMENSION(1:30) :: stiffYs = 0.0_R8Ki !< y array for stress-strain lookup table [-] INTEGER(IntKi) :: nBApoints = 0 !< number of values in stress-strainrate lookup table (0 means using constant c) [-] REAL(DbKi) , DIMENSION(1:30) :: dampXs = 0.0_R8Ki !< x array for stress-strainrate lookup table (up to nCoef) [-] - REAL(DbKi) , DIMENSION(1:30) :: dampYs = 0.0_R8Ki !< y array for stress-strainrate lookup table [-] + REAL(DbKi) , DIMENSION(1:30) :: dampYs = 0.0_R8Ki !< y array for stress-strainrate lookup table [-] INTEGER(IntKi) :: nEIpoints = 0 !< number of values in bending stress-strain lookup table (0 means using constant E) [-] REAL(DbKi) , DIMENSION(1:30) :: bstiffXs = 0.0_R8Ki !< x array for stress-strain lookup table (up to nCoef) [-] REAL(DbKi) , DIMENSION(1:30) :: bstiffYs = 0.0_R8Ki !< y array for stress-strain lookup table [-] @@ -794,6 +794,8 @@ subroutine MD_CopyRodProp(SrcRodPropData, DstRodPropData, CtrlCode, ErrStat, Err DstRodPropData%Cdt = SrcRodPropData%Cdt DstRodPropData%CdEnd = SrcRodPropData%CdEnd DstRodPropData%CaEnd = SrcRodPropData%CaEnd + DstRodPropData%LinDamp = SrcRodPropData%LinDamp + DstRodPropData%isLinDamp = SrcRodPropData%isLinDamp end subroutine subroutine MD_DestroyRodProp(RodPropData, ErrStat, ErrMsg) @@ -820,6 +822,8 @@ subroutine MD_PackRodProp(RF, Indata) call RegPack(RF, InData%Cdt) call RegPack(RF, InData%CdEnd) call RegPack(RF, InData%CaEnd) + call RegPack(RF, InData%LinDamp) + call RegPack(RF, InData%isLinDamp) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -838,6 +842,8 @@ subroutine MD_UnPackRodProp(RF, OutData) call RegUnpack(RF, OutData%Cdt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CdEnd); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CaEnd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LinDamp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%isLinDamp); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine MD_CopyBody(SrcBodyData, DstBodyData, CtrlCode, ErrStat, ErrMsg) @@ -1111,6 +1117,8 @@ subroutine MD_CopyRod(SrcRodData, DstRodData, CtrlCode, ErrStat, ErrMsg) DstRodData%Cdt = SrcRodData%Cdt DstRodData%CdEnd = SrcRodData%CdEnd DstRodData%CaEnd = SrcRodData%CaEnd + DstRodData%LinDamp = SrcRodData%LinDamp + DstRodData%isLinDamp = SrcRodData%isLinDamp DstRodData%time = SrcRodData%time DstRodData%roll = SrcRodData%roll DstRodData%pitch = SrcRodData%pitch @@ -1451,6 +1459,8 @@ subroutine MD_PackRod(RF, Indata) call RegPack(RF, InData%Cdt) call RegPack(RF, InData%CdEnd) call RegPack(RF, InData%CaEnd) + call RegPack(RF, InData%LinDamp) + call RegPack(RF, InData%isLinDamp) call RegPack(RF, InData%time) call RegPack(RF, InData%roll) call RegPack(RF, InData%pitch) @@ -1520,6 +1530,8 @@ subroutine MD_UnPackRod(RF, OutData) call RegUnpack(RF, OutData%Cdt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CdEnd); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CaEnd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LinDamp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%isLinDamp); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%time); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%roll); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%pitch); if (RegCheckErr(RF, RoutineName)) return From eba7719edb4616a8a5619c4fe69eadea3da58af1 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 22 Jul 2024 15:00:14 -0600 Subject: [PATCH 4/5] MD: minor cleanup - remove non-standard format identifier `(F)` on internal read, and add comment on what it does - a few more tab characters - a couple stray dos line returns --- modules/moordyn/src/MoorDyn.f90 | 10 ++++---- modules/moordyn/src/MoorDyn_Rod.f90 | 36 ++++++++++++++--------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/modules/moordyn/src/MoorDyn.f90 b/modules/moordyn/src/MoorDyn.f90 index 9cc7e7eb7..c5e331d55 100644 --- a/modules/moordyn/src/MoorDyn.f90 +++ b/modules/moordyn/src/MoorDyn.f90 @@ -127,7 +127,7 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er CHARACTER(40) :: TempString5 ! CHARACTER(40) :: TempStrings(6) ! Array of 6 strings used when parsing comma-separated items ! CHARACTER(1024) :: FileName ! - CHARACTER(20) :: TempString6 ! Linear damping (transverse direction) for rod element + CHARACTER(20) :: TempString6 ! Linear damping (transverse direction) for rod element REAL(DbKi) :: depth ! local water depth interpolated from bathymetry grid [m] @@ -731,12 +731,12 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er READ(Line,*,IOSTAT=ErrStat2) m%RodTypeList(l)%name, m%RodTypeList(l)%d, m%RodTypeList(l)%w, & m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd,& tempString6 ! Linear damping coefficient - read(tempString6, '(F)') tempString6 - + read(tempString6,*) tempString6 ! remove trailing comments, if any + if (ErrStat2 .ne. 0) then READ(Line,*,IOSTAT=ErrStat2) m%RodTypeList(l)%name, m%RodTypeList(l)%d, m%RodTypeList(l)%w, & m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd - + tempString6 = '' end if @@ -745,7 +745,7 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er m%RodTypeList(l)%Cat = 0.0_DbKi ! not used if (len(trim(tempString6)) .gt. 0) then - read(tempString6, *) m%RodTypeList(l)%LinDamp + read(tempString6, *) m%RodTypeList(l)%LinDamp m%RodTypeList(l)%isLinDamp = .TRUE. else m%RodTypeList(l)%LinDamp = 0.0 diff --git a/modules/moordyn/src/MoorDyn_Rod.f90 b/modules/moordyn/src/MoorDyn_Rod.f90 index 7a9fdfb46..7958e18cc 100644 --- a/modules/moordyn/src/MoorDyn_Rod.f90 +++ b/modules/moordyn/src/MoorDyn_Rod.f90 @@ -81,8 +81,8 @@ SUBROUTINE Rod_Setup(Rod, RodProp, endCoords, p, ErrStat, ErrMsg) Rod%Cdn = RodProp%Cdn Rod%Cdt = RodProp%Cdt Rod%CaEnd = RodProp%CaEnd - Rod%CdEnd = RodProp%CdEnd - Rod%linDamp = RodProp%linDamp + Rod%CdEnd = RodProp%CdEnd + Rod%linDamp = RodProp%linDamp Rod%islinDamp = RodProp%islinDamp ! allocate node positions and velocities (NOTE: these arrays start at ZERO) @@ -567,11 +567,11 @@ SUBROUTINE Rod_DoRHS(Rod, m, p) Real(DbKi) :: ap(3), aq(3) ! transverse and axial components of water acceleration at a given node Real(DbKi) :: Fnet_i(3) ! force from an attached line Real(DbKi) :: Mnet_i(3) ! moment from an attached line - Real(DbKi) :: Mass_i(3,3) ! mass from an attached line - - ! Linear damping, Front Energies, July 2024 - Real(DbKi) :: Vi_lin(3) ! velocity induced by Rod Motion - Real(DbKi) :: Vp_lin(3), Vq_lin(3) ! transverse and axial components of Rod motion at a given node + Real(DbKi) :: Mass_i(3,3) ! mass from an attached line + + ! Linear damping, Front Energies, July 2024 + Real(DbKi) :: Vi_lin(3) ! velocity induced by Rod Motion + Real(DbKi) :: Vp_lin(3), Vq_lin(3) ! transverse and axial components of Rod motion at a given node ! used in lumped 6DOF calculations: Real(DbKi) :: rRel( 3) ! relative position of each node i from rRef @@ -742,7 +742,7 @@ SUBROUTINE Rod_DoRHS(Rod, m, p) !relative flow velocities DO J = 1, 3 - Vi(J) = Rod%U(J,I) - Rod%rd(J,I) ! relative flow velocity over node -- this is where wave velicites would be added + Vi(J) = Rod%U(J,I) - Rod%rd(J,I) ! relative flow velocity over node -- this is where wave velicites would be added Vi_lin(J) = Rod%rd(J,I) ! linear damping END DO @@ -753,21 +753,21 @@ SUBROUTINE Rod_DoRHS(Rod, m, p) Vq(J) = DOT_PRODUCT( Vi , Rod%q ) * Rod%q(J); ! tangential relative flow component Vp(J) = Vi(J) - Vq(J) ! transverse relative flow component SumSqVq = SumSqVq + Vq(J)*Vq(J) - SumSqVp = SumSqVp + Vp(J)*Vp(J) - - ! linear damping - Vq_lin(J) = DOT_PRODUCT( Vi_lin , Rod%q ) * Rod%q(J) ! tangential relative Rod velocity component - Vp_lin(J) = Vi_lin(J) - Vq_lin(J) ! transverse relative Rod velocity component - + SumSqVp = SumSqVp + Vp(J)*Vp(J) + + ! linear damping + Vq_lin(J) = DOT_PRODUCT( Vi_lin , Rod%q ) * Rod%q(J) ! tangential relative Rod velocity component + Vp_lin(J) = Vi_lin(J) - Vq_lin(J) ! transverse relative Rod velocity component + END DO MagVp = sqrt(SumSqVp) ! get magnitudes of flow components MagVq = sqrt(SumSqVq) - + ! transverse and tangenential drag Rod%Dp(:,I) = VOF * 0.5*p%rhoW*Rod%Cdn* Rod%d* dL * MagVp * Vp - Rod%linDamp * Vp_lin * dL ! linear damping added - Rod%Dq(:,I) = 0.0_DbKi ! 0.25*p%rhoW*Rod%Cdt* Pi*Rod%d* dL * MagVq * Vq <<< should these axial side loads be included? - - + Rod%Dq(:,I) = 0.0_DbKi ! 0.25*p%rhoW*Rod%Cdt* Pi*Rod%d* dL * MagVq * Vq <<< should these axial side loads be included? + + ! fluid acceleration components for current node aq = DOT_PRODUCT(Rod%Ud(:,I), Rod%q) * Rod%q ! tangential component of fluid acceleration From e69fda3422c0eabbe281af347cafb6beff438605 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 23 Jul 2024 11:08:04 -0600 Subject: [PATCH 5/5] MD: remove extra internal read for linear damping on rods --- modules/moordyn/src/MoorDyn.f90 | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/modules/moordyn/src/MoorDyn.f90 b/modules/moordyn/src/MoorDyn.f90 index c5e331d55..fffcd3d13 100644 --- a/modules/moordyn/src/MoorDyn.f90 +++ b/modules/moordyn/src/MoorDyn.f90 @@ -127,7 +127,6 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er CHARACTER(40) :: TempString5 ! CHARACTER(40) :: TempStrings(6) ! Array of 6 strings used when parsing comma-separated items ! CHARACTER(1024) :: FileName ! - CHARACTER(20) :: TempString6 ! Linear damping (transverse direction) for rod element REAL(DbKi) :: depth ! local water depth interpolated from bathymetry grid [m] @@ -730,28 +729,22 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er IF (ErrStat2 == 0) THEN READ(Line,*,IOSTAT=ErrStat2) m%RodTypeList(l)%name, m%RodTypeList(l)%d, m%RodTypeList(l)%w, & m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd,& - tempString6 ! Linear damping coefficient - read(tempString6,*) tempString6 ! remove trailing comments, if any + m%RodTypeList(l)%LinDamp ! Linear damping coefficient - if (ErrStat2 .ne. 0) then + if (ErrStat2 == 0) then + m%RodTypeList(l)%isLinDamp = .TRUE. ! linear damping was read + else ! Linear damping not present, so reread the line without it READ(Line,*,IOSTAT=ErrStat2) m%RodTypeList(l)%name, m%RodTypeList(l)%d, m%RodTypeList(l)%w, & m%RodTypeList(l)%Cdn, m%RodTypeList(l)%Can, m%RodTypeList(l)%CdEnd, m%RodTypeList(l)%CaEnd - tempString6 = '' + m%RodTypeList(l)%LinDamp = 0.0 + m%RodTypeList(l)%isLinDamp = .FALSE. end if m%RodTypeList(l)%Cdt = 0.0_DbKi ! not used m%RodTypeList(l)%Cat = 0.0_DbKi ! not used - if (len(trim(tempString6)) .gt. 0) then - read(tempString6, *) m%RodTypeList(l)%LinDamp - m%RodTypeList(l)%isLinDamp = .TRUE. - else - m%RodTypeList(l)%LinDamp = 0.0 - m%RodTypeList(l)%isLinDamp = .FALSE. - end if - END IF ! specify IdNum of rod type for error checking